在WebBrowser控件中禁用JavaScript错误
我正在开发一个带有浏览到SharePoint站点的WebBrowser控件的Windows应用程序。
我的问题是,我得到JavaScript错误。
我怎样才能禁用JavaScript错误? 我不希望他们弹出。
webBrowser.ScriptErrorsSuppressed = true;
这将禁用脚本错误并禁用其他窗口,例如NTLM登录窗口或客户端证书接受窗口。 下面只会压缩javascript错误。
// Hides script errors without hiding other dialog boxes.
private void SuppressScriptErrorsOnly(WebBrowser browser)
{
// Ensure that ScriptErrorsSuppressed is set to false.
browser.ScriptErrorsSuppressed = false;
// Handle DocumentCompleted to gain access to the Document object.
browser.DocumentCompleted +=
new WebBrowserDocumentCompletedEventHandler(
browser_DocumentCompleted);
}
private void browser_DocumentCompleted(object sender,
WebBrowserDocumentCompletedEventArgs e)
{
((WebBrowser)sender).Document.Window.Error +=
new HtmlElementErrorEventHandler(Window_Error);
}
private void Window_Error(object sender,
HtmlElementErrorEventArgs e)
{
// Ignore the error and suppress the error dialog box.
e.Handled = true;
}
上述解决方案都不适用于我的场景,处理.Navigated和.FileDownload事件似乎非常合适,但访问WebBrowser.Document属性会引发由跨框架脚本安全性导致的UnauthorizedAccessException(我们的Web内容包含框架 - 全部打开相同的域/地址但帧有自己的安全漏洞被阻止)。
工作的解决方案是覆盖IOleCommandTarget并捕获该级别的脚本错误命令。 这是WebBrowser子类来实现这个功能:
/// <summary>
/// Subclassed WebBrowser that suppresses error pop-ups.
///
/// Notes.
/// ScriptErrorsSuppressed property is not used because this actually suppresses *all* pop-ups.
///
/// More info at:
/// http://stackoverflow.com/questions/2476360/disable-javascript-error-in-webbrowser-control
/// </summary>
public class WebBrowserEx : WebBrowser
{
#region Constructor
/// <summary>
/// Default constructor.
/// Initialise browser control and attach customer event handlers.
/// </summary>
public WebBrowserEx()
{
this.ScriptErrorsSuppressed = false;
}
#endregion
#region Overrides
/// <summary>
/// Override to allow custom script error handling.
/// </summary>
/// <returns></returns>
protected override WebBrowserSiteBase CreateWebBrowserSiteBase()
{
return new WebBrowserSiteEx(this);
}
#endregion
#region Inner Class [WebBrowserSiteEx]
/// <summary>
/// Sub-class to allow custom script error handling.
/// </summary>
protected class WebBrowserSiteEx : WebBrowserSite, NativeMethods.IOleCommandTarget
{
/// <summary>
/// Default constructor.
/// </summary>
public WebBrowserSiteEx(WebBrowserEx webBrowser) : base (webBrowser)
{
}
/// <summary>Queries the object for the status of one or more commands generated by user interface events.</summary>
/// <param name="pguidCmdGroup">The GUID of the command group.</param>
/// <param name="cCmds">The number of commands in <paramref name="prgCmds" />.</param>
/// <param name="prgCmds">An array of OLECMD structures that indicate the commands for which the caller needs status information. This method fills the <paramref name="cmdf" /> member of each structure with values taken from the OLECMDF enumeration.</param>
/// <param name="pCmdText">An OLECMDTEXT structure in which to return name and/or status information of a single command. This parameter can be null to indicate that the caller does not need this information.</param>
/// <returns>This method returns S_OK on success. Other possible return values include the following.
/// E_FAIL The operation failed.
/// E_UNEXPECTED An unexpected error has occurred.
/// E_POINTER The <paramref name="prgCmds" /> argument is null.
/// OLECMDERR_E_UNKNOWNGROUP The <paramref name="pguidCmdGroup" /> parameter is not null but does not specify a recognized command group.</returns>
public int QueryStatus(ref Guid pguidCmdGroup, int cCmds, NativeMethods.OLECMD prgCmds, IntPtr pCmdText)
{
if((int)NativeMethods.OLECMDID.OLECMDID_SHOWSCRIPTERROR == prgCmds.cmdID)
{ // Do nothing (suppress script errors)
return NativeMethods.S_OK;
}
// Indicate that command is unknown. The command will then be handled by another IOleCommandTarget.
return NativeMethods.OLECMDERR_E_UNKNOWNGROUP;
}
/// <summary>Executes the specified command.</summary>
/// <param name="pguidCmdGroup">The GUID of the command group.</param>
/// <param name="nCmdID">The command ID.</param>
/// <param name="nCmdexecopt">Specifies how the object should execute the command. Possible values are taken from the <see cref="T:Microsoft.VisualStudio.OLE.Interop.OLECMDEXECOPT" /> and <see cref="T:Microsoft.VisualStudio.OLE.Interop.OLECMDID_WINDOWSTATE_FLAG" /> enumerations.</param>
/// <param name="pvaIn">The input arguments of the command.</param>
/// <param name="pvaOut">The output arguments of the command.</param>
/// <returns>This method returns S_OK on success. Other possible return values include
/// OLECMDERR_E_UNKNOWNGROUP The <paramref name="pguidCmdGroup" /> parameter is not null but does not specify a recognized command group.
/// OLECMDERR_E_NOTSUPPORTED The <paramref name="nCmdID" /> parameter is not a valid command in the group identified by <paramref name="pguidCmdGroup" />.
/// OLECMDERR_E_DISABLED The command identified by <paramref name="nCmdID" /> is currently disabled and cannot be executed.
/// OLECMDERR_E_NOHELP The caller has asked for help on the command identified by <paramref name="nCmdID" />, but no help is available.
/// OLECMDERR_E_CANCELED The user canceled the execution of the command.</returns>
public int Exec(ref Guid pguidCmdGroup, int nCmdID, int nCmdexecopt, object[] pvaIn, int pvaOut)
{
if((int)NativeMethods.OLECMDID.OLECMDID_SHOWSCRIPTERROR == nCmdID)
{ // Do nothing (suppress script errors)
return NativeMethods.S_OK;
}
// Indicate that command is unknown. The command will then be handled by another IOleCommandTarget.
return NativeMethods.OLECMDERR_E_UNKNOWNGROUP;
}
}
#endregion
}
〜
/// <summary>
/// Native (unmanaged) methods, required for custom command handling for the WebBrowser control.
/// </summary>
public static class NativeMethods
{
/// From docobj.h
public const int OLECMDERR_E_UNKNOWNGROUP = -2147221244;
/// <summary>
/// From Microsoft.VisualStudio.OLE.Interop (Visual Studio 2010 SDK).
/// </summary>
public enum OLECMDID
{
/// <summary />
OLECMDID_OPEN = 1,
/// <summary />
OLECMDID_NEW,
/// <summary />
OLECMDID_SAVE,
/// <summary />
OLECMDID_SAVEAS,
/// <summary />
OLECMDID_SAVECOPYAS,
/// <summary />
OLECMDID_PRINT,
/// <summary />
OLECMDID_PRINTPREVIEW,
/// <summary />
OLECMDID_PAGESETUP,
/// <summary />
OLECMDID_SPELL,
/// <summary />
OLECMDID_PROPERTIES,
/// <summary />
OLECMDID_CUT,
/// <summary />
OLECMDID_COPY,
/// <summary />
OLECMDID_PASTE,
/// <summary />
OLECMDID_PASTESPECIAL,
/// <summary />
OLECMDID_UNDO,
/// <summary />
OLECMDID_REDO,
/// <summary />
OLECMDID_SELECTALL,
/// <summary />
OLECMDID_CLEARSELECTION,
/// <summary />
OLECMDID_ZOOM,
/// <summary />
OLECMDID_GETZOOMRANGE,
/// <summary />
OLECMDID_UPDATECOMMANDS,
/// <summary />
OLECMDID_REFRESH,
/// <summary />
OLECMDID_STOP,
/// <summary />
OLECMDID_HIDETOOLBARS,
/// <summary />
OLECMDID_SETPROGRESSMAX,
/// <summary />
OLECMDID_SETPROGRESSPOS,
/// <summary />
OLECMDID_SETPROGRESSTEXT,
/// <summary />
OLECMDID_SETTITLE,
/// <summary />
OLECMDID_SETDOWNLOADSTATE,
/// <summary />
OLECMDID_STOPDOWNLOAD,
/// <summary />
OLECMDID_ONTOOLBARACTIVATED,
/// <summary />
OLECMDID_FIND,
/// <summary />
OLECMDID_DELETE,
/// <summary />
OLECMDID_HTTPEQUIV,
/// <summary />
OLECMDID_HTTPEQUIV_DONE,
/// <summary />
OLECMDID_ENABLE_INTERACTION,
/// <summary />
OLECMDID_ONUNLOAD,
/// <summary />
OLECMDID_PROPERTYBAG2,
/// <summary />
OLECMDID_PREREFRESH,
/// <summary />
OLECMDID_SHOWSCRIPTERROR,
/// <summary />
OLECMDID_SHOWMESSAGE,
/// <summary />
OLECMDID_SHOWFIND,
/// <summary />
OLECMDID_SHOWPAGESETUP,
/// <summary />
OLECMDID_SHOWPRINT,
/// <summary />
OLECMDID_CLOSE,
/// <summary />
OLECMDID_ALLOWUILESSSAVEAS,
/// <summary />
OLECMDID_DONTDOWNLOADCSS,
/// <summary />
OLECMDID_UPDATEPAGESTATUS,
/// <summary />
OLECMDID_PRINT2,
/// <summary />
OLECMDID_PRINTPREVIEW2,
/// <summary />
OLECMDID_SETPRINTTEMPLATE,
/// <summary />
OLECMDID_GETPRINTTEMPLATE
}
/// <summary>
/// From Microsoft.VisualStudio.Shell (Visual Studio 2010 SDK).
/// </summary>
public const int S_OK = 0;
/// <summary>
/// OLE command structure.
/// </summary>
[StructLayout(LayoutKind.Sequential)]
public class OLECMD
{
/// <summary>
/// Command ID.
/// </summary>
[MarshalAs(UnmanagedType.U4)]
public int cmdID;
/// <summary>
/// Flags associated with cmdID.
/// </summary>
[MarshalAs(UnmanagedType.U4)]
public int cmdf;
}
/// <summary>
/// Enables the dispatching of commands between objects and containers.
/// </summary>
[ComVisible(true), Guid("B722BCCB-4E68-101B-A2BC-00AA00404770"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
[ComImport]
public interface IOleCommandTarget
{
/// <summary>Queries the object for the status of one or more commands generated by user interface events.</summary>
/// <param name="pguidCmdGroup">The GUID of the command group.</param>
/// <param name="cCmds">The number of commands in <paramref name="prgCmds" />.</param>
/// <param name="prgCmds">An array of <see cref="T:Microsoft.VisualStudio.OLE.Interop.OLECMD" /> structures that indicate the commands for which the caller needs status information.</param>
/// <param name="pCmdText">An <see cref="T:Microsoft.VisualStudio.OLE.Interop.OLECMDTEXT" /> structure in which to return name and/or status information of a single command. This parameter can be null to indicate that the caller does not need this information.</param>
/// <returns>This method returns S_OK on success. Other possible return values include the following.
/// E_FAIL The operation failed.
/// E_UNEXPECTED An unexpected error has occurred.
/// E_POINTER The <paramref name="prgCmds" /> argument is null.
/// OLECMDERR_E_UNKNOWNGROUPThe <paramref name="pguidCmdGroup" /> parameter is not null but does not specify a recognized command group.</returns>
[PreserveSig]
[return: MarshalAs(UnmanagedType.I4)]
int QueryStatus(ref Guid pguidCmdGroup, int cCmds, [In] [Out] NativeMethods.OLECMD prgCmds, [In] [Out] IntPtr pCmdText);
/// <summary>Executes the specified command.</summary>
/// <param name="pguidCmdGroup">The GUID of the command group.</param>
/// <param name="nCmdID">The command ID.</param>
/// <param name="nCmdexecopt">Specifies how the object should execute the command. Possible values are taken from the <see cref="T:Microsoft.VisualStudio.OLE.Interop.OLECMDEXECOPT" /> and <see cref="T:Microsoft.VisualStudio.OLE.Interop.OLECMDID_WINDOWSTATE_FLAG" /> enumerations.</param>
/// <param name="pvaIn">The input arguments of the command.</param>
/// <param name="pvaOut">The output arguments of the command.</param>
/// <returns>This method returns S_OK on success. Other possible return values include
/// OLECMDERR_E_UNKNOWNGROUP The <paramref name="pguidCmdGroup" /> parameter is not null but does not specify a recognized command group.
/// OLECMDERR_E_NOTSUPPORTED The <paramref name="nCmdID" /> parameter is not a valid command in the group identified by <paramref name="pguidCmdGroup" />.
/// OLECMDERR_E_DISABLED The command identified by <paramref name="nCmdID" /> is currently disabled and cannot be executed.
/// OLECMDERR_E_NOHELP The caller has asked for help on the command identified by <paramref name="nCmdID" />, but no help is available.
/// OLECMDERR_E_CANCELED The user canceled the execution of the command.</returns>
[PreserveSig]
[return: MarshalAs(UnmanagedType.I4)]
int Exec(ref Guid pguidCmdGroup, int nCmdID, int nCmdexecopt, [MarshalAs(UnmanagedType.LPArray)] [In] object[] pvaIn, int pvaOut);
}
}
链接地址: http://www.djcxy.com/p/41825.html