由于扩展程序无法访问unsafeWindow
,就像Firefox一样,可以挂钩到DOM脚本中,我正在寻找其他想法,所以我来寻求帮助!
如何使用一些代码注入DOM并将截获的响应发送到后台页面,然后在调用内容脚本进行最终处理之前进行一些初始处理。完成后,它会使用修改后的响应或原始(取决于)来回答背景,然后后台页面将响应发送回DOM,并将其处理为DOM脚本响应函数。 这个只有一个问题,后台页面无法与DOM通信。
我做了一个小测试,注入了一些代码,在那里我输出了一些东西到控制台和一个警报。结果并不好,因为警报被触发但控制台是空的 - 甚至没有错误,这让我想知道 - 什么控制台收到了输出?
function injectCode(fn){ // Executing an anonymous script
var script = document.createElement('script');
script.type = 'application/javascript';
script.textContent = '(' + fn + ')();';
document.documentElement.appendChild(script); // run the script
document.documentElement.removeChild(script); // clean up
}
var code = function(){
console.log('dom',window);
alert('code injected');
}
injectCode(code);
我还尝试使用addEventListener
和DOMAttrModified
DOMSubtreeModified
DOMNodeInserted
对DOM元素进行更改,这些元素会在DOM ajax响应完全解析后发生变化,但都无法触发。
我试图以任何方式做不可能的事情吗?
答案 0 :(得分:0)
在继续之前,请确保您知道script contexts in an extension。
之间的差异要从后台页面注入脚本,您必须执行内容脚本,然后按照注入脚本执行在你的问题/ here。
示例(使用chrome.tabs.executeScript
):
// null = current active tab
// Simple code, background:
chrome.tabs.executeScript(null, {
code: [
'var s = document.createElement("script");',
's.textContent = "console.log(window);";',
'(document.head||document.documentElement).appendChild(s);',
's.parentNode.removeChild(s);'
].join('\n')
});
我可以想象这种方法对于大量代码来说是不可行的。对于一组预定义的脚本,您可以使用两个脚本:代码本身和帮助程序脚本:
// config.js
var fn_code = function() {
console.log(window); ....
};
// helper.js
var s = document.createElement('script');
s.textContent = '(' + fn_code + ')();';
(document.head||document.documentElement).appendChild(s);
s.parentNode.removeChild(s);
// Background:
chrome.tabs.executeScript(null, {file: 'config.js'}, function() {
chrome.tabs.executeScript(null, {file: 'helper.js'});
});
注意:我没有直接链接到“config.js”,因为这会在使用manifest version 2时使用变得复杂,请参阅"web_accessible_resources"
。
之前的方法仅显示如何在一个方向上执行代码(背景 - >页面)。如果需要从注入的脚本激活后台函数,则必须定义并侦听自定义事件处理程序。请参阅this answer + demo。
因为代码是注入,因此在页面范围内运行,您必须在页面上检查控制台。
当chrome.tabs.executeScript
无法执行内容脚本时(例如,因为扩展程序没有访问某个页面的权限),后台页面中的控制台会记录错误。可以通过these steps访问此控制台。