C#如何拦截 Webbrowser Control的响应内容
场景目标
假如Webbrowser中的一个页面打开后第一件事就是执行了alert,我们想要阻止它该如何做?
<html> <head> <script src="foo.js"> </script> <script> alert('alert immediate!'); </script> </head> <body> <h2> hello</h2> </body> </html>
绑定DocumentComplete事件,不行,太晚了js早已执行。
绑定ProgressChanged事件,不行,虽然早于load事件,但还是晚于js执行时间。
以上支持的事件根本无法达到目的,于是尝试过FiddlerCore利用中间代理原理过滤网络响应内容。
代理法虽然可以达到目的,但证书安装、代理设置、网络开销都显得不那么优雅稳定。
Navigated事件
一直以为Navigated事件是在发出请求后就触发,最近突然发现并不是这样。
经过测试,Navigated会在html里第一个script开始执行前触发,这时加载的html会被截断到第一个script标签位置。
也就是说当此事件触发时,浏览器内加载的html为
<html> <head> <script src="foo.js"> </script> </head> </html>
不过这时window、document等对象都已存在,于是我们就可以愉快地进行操作了。
注意:
1.主窗口及iframe都可触发
2.触发时页面内js尚未执行
3.由于此事件早于任何js代码的执行时间,所以无法实现对页面内Js方法的覆盖
4.如果第一个script在head里,也无法实现对HTML的修改 :)
5.如果动态插入script标签或利用其它延时原理,有可能会在页面的某个script标签后执行,但执行先后次序极不可控,意义不大。
总结
此事件适用于需要在任何js执行前进行自定义操作的场景,操作内容限于对window、document对象的处理;如果第一个script标签在body中,还可以对之前的html进行操作。