Overriding window.location on Webbrowser Control

吃可爱长大的小学妹 提交于 2019-12-24 04:32:19

问题


This might seem a weird question, but is there a way to override the window.location without making the browser control navigate to it? The problem I am having is that i am injecting html code in the control, and the window.location is about:blank - causing errors on some javascript code. Trying to make them think they are in a URL other than about:blank


回答1:


I've had success with Object.defineProperty() when document.documentMode >= 9 (IE9+).

To get the WebBrowser control in IE9+ mode, I first load the following URL:

about:<!doctype html><meta http-equiv="X-UA-Compatible" content="IE=edge">

This gives a mostly empty document in the latest document mode.

Then to redefine window.location, I execute some script via eval() or document.write():

Object.defineProperty(window, 'location', {value: {href: 'fubar'}});

The complete sequence is like this:

  • Load the control.
  • Wait for WebBrowser.ReadyState == 4 or the DocumentComplete event.
  • Call document.open() (important).
  • Eval or write the script redefining location.
  • Write the HTML content.
  • Call document.close() (ensures onload gets called).

Note: I use the ActiveX WebBrowser control, and not the .NET component which is a wrapper around that control. It will probably work the same in .NET.




回答2:


HTML5 drafts include window.history.pushState+window.onpopstate, but this is not supported by Trident (MSHTML), and doesn't allow for navigating across domains, nevermind URL schemes.

Some JavaScript implementations also support user-defined getters and setters, so you could maybe do window.__defineGetter__('location', function() { return fakeLocation }), but yet again I believe that won't work with IE's control.

Echoing the commenters: what are you doing?




回答3:


It is not possible to replace the window.location property. window.location is a non-configurable property, which means that it cannot be modified.

The only messy workaround that I can use is to do a find and replace (replace the window.location line with an empty string or something) on the script text before executing it.



来源:https://stackoverflow.com/questions/4138582/overriding-window-location-on-webbrowser-control

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!