Javascript 自定义chrome扩展中的钩子窗口属性

Javascript 自定义chrome扩展中的钩子窗口属性,javascript,google-chrome,google-chrome-extension,Javascript,Google Chrome,Google Chrome Extension,我正在尝试在自定义chrome扩展中挂接一些窗口属性。我想拦截get/set调用,因此在我的内容脚本中添加了一些函数: window.__defineGetter__('name', function() { ... }) window.__defineSetter__('name', function(v) { ... }) 但它似乎不会覆盖window.name属性的默认行为。有什么问题吗 这是注入内容脚本的清单条目: ... "content_scripts": [ {

我正在尝试在自定义chrome扩展中挂接一些窗口属性。我想拦截get/set调用,因此在我的内容脚本中添加了一些函数:

window.__defineGetter__('name', function() { ... })
window.__defineSetter__('name', function(v) { ... })
但它似乎不会覆盖window.name属性的默认行为。有什么问题吗

这是注入内容脚本的清单条目:

...
"content_scripts": [
    {
      "matches": [
        "*://*/*"
      ],
      "js": [
        "src/inject/inject.js"
      ]
    }
]
...

这里有两个问题:

1) 您的脚本注入太晚,无法影响页面上的脚本。 见:

可选。控制何时注入js中的文件。可以是“文档开始”、“文档结束”或“文档空闲”。默认为“文档空闲”

在“document_start”的情况下,这些文件是在css中的任何文件之后,但在构建任何其他DOM或运行任何其他脚本之前注入的

在“document_end”的情况下,文件在DOM完成后立即注入,但在加载子资源(如图像和帧)之前注入

在“document_idle”的情况下,浏览器选择在“document_end”和window.onload事件触发后立即插入脚本的时间。注入的确切时刻取决于文档的复杂程度和加载所需的时间,并针对页面加载速度进行了优化

因此,默认情况下,您的脚本在构建整个DOM之后运行(因此,作为DOM一部分的脚本将运行)+一些不确定的延迟,直到页面“空闲”

要修复此问题,您需要在内容脚本定义中添加
“run\u at”:“document\u start”


请注意,就页面加载性能而言,这可能非常昂贵。您应该将在
“document\u start”
处运行的代码限制为仅需要它的代码

您可以创建第二个内容脚本,该脚本稍后将注入,并将使用相同的上下文。只挂接到
DOMContentLoaded
是可能的,但是脚本在运行之前仍然需要编译,因此仍然会影响性能


2) 内容脚本具有独立的上下文 您要做的是更改内容脚本的
窗口。仅更改内容脚本的名称。由于控制台默认在页面上下文中执行(选择器中的
),因此看不到效果

这是一个结果。但是,可以通过向文档中注入
标记来绕过它。请注意,如果有的话

代码由以下人员提供:

请注意,
document.head
将在
的“document\u start”
处未定义,但回退将成功

要阅读有关
网络可访问资源的更多信息,请参阅。

一般来说,对于页面级脚本,.

如何注入内容脚本?它在页面加载之前由chrome注入,因此代码只执行一次。。。我不需要background.js/page实际上我的意思是,如果是通过manifest,你能在问题中包括该部分吗?嗯,我不认为这是问题所在,事实上,如果我在dom完全加载后从控制台获得window.name属性,它会执行默认的getter而不是我的…哦,对了。这不是唯一的问题。我会编辑这个,但当页面有CSP标题时可能会出现问题。。。所以我必须把它去掉。无论页面的CSP如何,脚本都将执行。
var s = document.createElement('script');
// TODO: add "script.js" to web_accessible_resources in manifest.json
s.src = chrome.extension.getURL('script.js');
s.onload = function() {
    this.parentNode.removeChild(this);
};
(document.head || document.documentElement).appendChild(s);