Disable Javascript error in WPF WebBrowser control

I work with WebBrowser control in WPF, and one of the most annoying problem I have with it, is that sometimes you browse sites that raise a lot of javascript errors and the control become unusable. Thanks to my friend Marco Campi, yesterday I solved the problem. Marco pointed me a link that does not deal with WebBrowser control, but uses a simple javascript script to disable error handling in a web page.

1
2
3
4
5
6
<script type="text/javascript">   1 
function noError(){return true;}
window.onerror = noError;
 
</script>

This solution is really simple, and seems to me the right way to solve the problem. The key to the solution is handle the Navigated event raised from the WebBrowser control. First of all I have my WebBrowser control wrapped in a custom class to add functionalities, in that class I declare this constant

1
2
3
4
5
private const string DisableScriptError =
@"function noError() {
return true;
}
window.onerror = noError;";

This is the very same script of the previous article, then I handle the Navigated event

1
2
3
void browser_Navigated(object sender, System.Windows.Navigation.NavigationEventArgs e)
{
InjectDisableScript();

Actually I’m doing a lot of other things inside the Navigated event handler, but the very first one is injecting into the page the script that disable javascript error.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
private void InjectDisableScript()
{
HTMLDocumentClass doc = Browser.Document as HTMLDocumentClass;
HTMLDocument doc2 = Browser.Document as HTMLDocument;
 
 
//Questo crea lo script per la soprressione degli errori
IHTMLScriptElement scriptErrorSuppressed = (IHTMLScriptElement)doc2.createElement("SCRIPT");
scriptErrorSuppressed.type = "text/javascript";
scriptErrorSuppressed.text = DisableScriptError;
 
IHTMLElementCollection nodes = doc.getElementsByTagName("head");
 
foreach (IHTMLElement elem in nodes)
{
//Appendo lo script all'head cosi è attivo
 
HTMLHeadElementClass head = (HTMLHeadElementClass)elem;
head.appendChild((IHTMLDOMNode)scriptErrorSuppressed);
}
}

This is the code that really solves the problem, the key is creating a IHTMLScriptElement with the script and injecting into the Head of the page, this effectively disables the javascript errors. I’ve not fully tested with a lot of sites to verify that is able to intercept all errors, but it seems to work very well with a lot of links that gave us a lot of problems in the past.

Alk.

Tags: WPF

Tags: Javascript