如何使用chrome.contentSettings API禁用脚本,同时允许扩展中的内容脚本

时间:2014-02-05 12:21:30

标签: google-chrome-extension

我正在开发一个用于DOM内容提取的工具。所以我使用客户端脚本实现了一个简单的chrome扩展,允许使用click来选择所需的元素并将其解压缩。

我想使用这些数据(例如元素的路径)进行批处理工作,这可以很容易地与wget和其他工具一起使用。但问题是。因为我用来选择元素的网页被脚本更改,所以路径结果是错误的,因为wget不会执行脚本。

为了解决这个问题,我尝试使用chrome.contentSettings API阻止javascript,但是意外地,它也阻止了内容脚本(至少是事件处理部分,因为我的代码的其他部分被执行)。有没有办法解决这个问题,比如使用例外规则或使用其他一些方法来阻止网页上的脚本?

以下是用于禁止目标主机上的javascript的后台脚本。

var contentSettings = chrome.contentSettings;

contentSettings.javascript.clear({}, function() {

contentSettings.javascript.set({
  primaryPattern: '*://*.example.com/*',
  setting: 'block'
});

});

提前致谢。

1 个答案:

答案 0 :(得分:0)

事实证明,chrome.contentSettings API无法满足此需求。

相反,使用chrome.webRequest API可以轻松解决此问题,但它有其他限制,例如无法阻止网页中的内联脚本。

这是可以解决问题的后台脚本。

var matches = chrome.runtime.getManifest().content_scripts[0].matches;
var pattern = new RegExp('^https?:\\/\\/(\\w+\\.)?(' +
    matches.map(function(pattern) {
      return RegExp.escape(pattern.substring(6, pattern.length - 2));
    }).join('|') + ')\\/', 'i');

chrome.webRequest.onBeforeSendHeaders.addListener(function(details) {
  return {
    cancel: details.requestHeaders.some(function(header) {
      if (header.name == 'Referer' && pattern.test(header.value))
        return true;
    })
  };
}, {
  urls: ['<all_urls>'],
  types: ['script']
}, ['blocking', 'requestHeaders']);