2017-08-13 55 views
1

我正在写一个隐私浏览器扩展。我需要做的一件事就是欺骗window.navigator对象,它是我成功为主窗口对象成功完成的属性。我还需要欺骗页面上每个iframe.contentWindow的window.navigator对象。我想我可以使用self.frames,然后通过欺骗每个循环,但是我的代码运行后创建但在我的代码运行时不存在的框架的情况如何。 var myFrame = document.createElement(“iframe”); ???欺骗导航器里面<iframe>

我希望所有导航器对象实例都是主窗口中的实例,以及每个iframe中创建的实例都要被伪造。为了让您知道我正在尝试做什么,这无法欺骗每个iframe中的导航器。

Object.defineProperty(HTMLIFrameElement.prototype.contentWindow, "navigator", { 
    configurable: true, 
    enumerable: true, 
    value: "some fake navigator object" 
}); 

也许是因为它实际上window.HTMLIFrameElement.prototype和那我要去哪里错了?

任何想法? 如果你不明白的问题,请询问更多的细节。

回答

2

iframe中的全局对象(window)不是从HTMLIFrameElement的原型派生的。该原型的contentWindow属性仅仅是一个访问器,它为您提供了一个跨域的代理服务器给其他全局服务器。

要替换实际的navigator属性,您需要在每个iframe中使用{all_frames: true, run_at: document-start}运行脚本。

+0

谢谢你对所有的框架。即使我已经多次使用manifest.json文档,我完全忘了这个关键。我现在还使用match_about_blank:true来将内容脚本注入about:空白页面。我留下的一个问题是,文档指出注入到about:空白页面的脚本不会在document_start注入,即使您指定了文档启动。 https://developer.mozilla.org/en-US/Add-ons/WebExtensions/manifest.json/content_scripts#match_about_blank。这对我来说是一个问题,因为时间安排很重要。任何想法? – Snapper26