Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Delete tag from WebBrowser Control before rendering

The Problem:

I'm running a winforms application with an embedded WebBrowser control. I've used the magic registry setting to switch this Control to IE 8 mode (as answered here Will the IE9 WebBrowser Control Support all of IE9's features, including SVG?).

But now if I navigate to a website which contains the Meta tag X-UA-Compatible IE=9 (as of http://msdn.microsoft.com/en-us/library/cc288325(v=vs.85).aspx) my webbrowser control switches to IE9 mode and ignores the registry settings.

I would like my control to stay in IE8 mode...

My solution attempts

I've tried to remove the meta tag after the control has loaded (Document_complete) using IHTMLDOMNode.removeChild but the control does not re-render the page.

I've tried to load the HTML content manually (using WebClient), remove the meta tag and feed this into the the webbrowser control (using Document.Write or DocumentText) but this way the control refuses to load any other content (like images).

Help

Now I'm out of ideas short of writing my own HTTPProxy and modifiying the response on the way (which I would not like to do).

Anyone any ideas?

I'm using .Net 4, I cannot change the website which will be displayed and I need it to render in IE8 mode regardless of the X-UA-Compatible tag...

Thanks!

like image 311
daniel.herken Avatar asked May 31 '12 17:05

daniel.herken


2 Answers

I had problems with DocumentText too - I gave up with it.

My solution was to write an in-process HTTP server and point the WebBrowser at that.

I wrote an article about it here: http://SimplyGenius.net/Article/WebBrowserEx

In my case, I was getting the content from the file system.
You'd have to change it to make calls to your target website, but it shouldn't be too much work.
Then you can modify the HTML as you like, and links will still work.

like image 155
Nick Butler Avatar answered Sep 30 '22 16:09

Nick Butler


Don't know of a way to make the WebBrowser control ignore that tag and not override your registry setting. For a quick (dirty) workaround you could do the following.

Create a request for the site which you want to show in the WebBrowser control.

var requestUri = new Uri("http://stackoverflow.com/");
var request = (HttpWebRequest) WebRequest.Create(requestUri);

Get the response.

var response = request.GetResponse();
using (var stream = response.GetResponseStream())
using (var reader = new StreamReader(stream))
{
    var html = reader.ReadToEnd();
    //...
}

Use NuGet to install the HTMLAgilityPack.

http://nuget.org/packages/HtmlAgilityPack

Load the HTML you've just retrieved in an HtmlDocument instance.

var document = new HtmlAgilityPack.HtmlDocument();
document.LoadHtml(html);

Select the tag. Here I use StackOverflow.com as an example and select its stylesheet node instead. When found, just remove the node.

var nodes = document.DocumentNode.SelectNodes("//link[@rel=\"stylesheet\"]");
foreach(var node in nodes)
{
    node.ParentNode.RemoveChild(node);
}

All that remains is to retrieve the modified HTML and feed it directly to the WebBrowser control.

html = document.DocumentNode.OuterHtml;
webBrowser.DocumentText = html;

It cannot interprete what's not there.

You could do the same to solve your issue. Issue a request, get the response, modify the HTML and feed it to the WebBrowser control. Tested it, seems to load the rest of the document OK.

like image 30
Christophe Geers Avatar answered Sep 30 '22 15:09

Christophe Geers