我正在构建一个在我无法控制的社交网站上使用的扩展程序。该网站允许用户从其他域插入内容(图像,闪存等...)。我想阻止它。
我最初认为触发jquery document.ready并从那时删除html中的内容会很好,因为当dom加载但内容尚未加载时文档就会触发。我只是清空必要的div元素,希望这会阻止http请求的发生。不幸的是,这种技术不起作用。
然后我发现了chrome.webRequest,看起来它可能会起作用。我遇到的困难是将扩展程序仅限于我所在的域名。 Chrome.webRequest只能在后台页面中使用,而不能在内容脚本中使用。
我的初始显示权限看起来像这样:
"permissions": [
"tabs",
"http://www.example.com/*",
],
但后来我使用chrome.webRequest.onBeforeRequest.addListener记录了请求我注意到只记录了扩展所针对的站点的图像请求。所以我将权限更改为:
"permissions": [
"tabs",
"<all_urls>",
"webRequest",
"webRequestBlocking"
],
我现在可以使用chrome.webRequest.onBeforeRequest.addListener查看所有请求。但是,因为此事件在后台页面中被触发,所以我将在浏览器中访问所有域和域。当我阻止加载图像时,它会阻止所有加载的网站上的所有图像。
问题是chrome.webRequest.onBeforeRequest.addListener返回的对象不包含用户当前所在选项卡的url。只有tabid。请求中没有任何内容可以看到我可以检测当前选项卡所在的域。我显然可以使用chrome.tabs.query获取带有tab标签的tab.url,但这与事件onBeforeRequest监听器是异步的。
这是目前的事件监听器代码:
chrome.webRequest.onBeforeSendHeaders.addListener(
function(details) {
if(details.type == "image" && (details.url.indexOf("://www.example.com") == -1)){
console.log(details.url);
//THIS LOGS ALL IMAGES LOADING EXCEPT THE SITE THE EXTENSION IS FOR
//BUT THE CANCEL ALSO CANCELS IMAGES LOADING ON ALL OTHER SITES.
return {cancel: true};
}
},
{urls: ["<all_urls>"]},
["blocking"]);
因此,简而言之,当加载的图像(可以是来自任何地方的图像)被加载到扩展名所在的站点时,我如何才运行取消代码?
最后(如果我可以让它工作)Firefox有类似chrome.webrequest的选项,因为我想构建一个类似Firefox的插件。
答案 0 :(得分:1)
在这里你去找解决方案已经存在,所以不要接受这个作为解决方案,但是我发布在这里,所以它很好看,所有人都可以看到: