1

由于扩展无法访问unsafeWindow,如 Firefox 可以,挂钩到 DOM 脚本我是否正在寻找其他想法,所以我来寻求帮助!

如何使用一些代码注入 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);

我还尝试addEventListenerDOMAttrModified DOMSubtreeModified DOMNodeInsertedDOM 元素,这些元素在 DOM ajax 响应被完全解析但都未能触发时发生变化。

我是否正在尝试做不可能的事情?

4

1 回答 1

0

在继续之前,请确保您知道扩展中脚本上下文之间的区别。

要从后台页面注入脚本,您必须执行Content script,然后按您的问题/此处所述注入脚本。

示例(使用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”,因为这会使使用清单版本 2时的使用变得复杂,请参阅"web_accessible_resources".


前面的方法只展示了如何在一个方向(背景->页面)执行代码。如果需要从注入的脚本中激活后台功能,则必须定义并监听自定义事件处理程序。请参阅此答案 + 演示


因为代码是被注入的,所以运行在页面的范围内,你必须在页面上查看控制台。

chrome.tabs.executeScriptContent 脚本执行失败时(例如,因为扩展程序没有访问某个页面的权限),后台页面的控制台会记录一个错误。可以按照以下步骤访问此控制台。

于 2012-05-06T09:29:03.057 回答