扩展:如何拦截AJAX响应?

时间:2012-05-06 08:29:29

标签: ajax google-chrome-extension

由于扩展程序无法访问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);

我还尝试使用addEventListenerDOMAttrModified DOMSubtreeModified DOMNodeInserted对DOM元素进行更改,这些元素会在DOM ajax响应完全解析后发生变化,但都无法触发。

我试图以任何方式做不可能的事情吗?

1 个答案:

答案 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访问此控制台。