2016-04-02 20 views
0

我正在尝试创建一个小的Chrome扩展程序来帮助查找Cookie在网站中的使用位置。通过在文档上设置Cookie的getter方法,扩展名为SUPPOSE。 像这样:为什么文档获取器功能被重置?

document.__defineGetter__('cookie',function(){ 
    alert("test"); 
}); 

当手动投入Chrome的JavaScript控制台在网站上,然后试图访问一个cookie(只需键入“document.cookie”),它会导致预期的行为它会弹出测试提示。

但是,当我把它放入一个扩展名并在页面的其余部分加载之前,它将无法工作。

这里是(我只是用的SoundCloud作为测试的网站)在manifest.json:

{ 
    "name": "Cookie Auditor", 
    "version": "0.1", 
    "manifest_version": 2, 
    "description": "An extension to help examine where cookies are being used in websites.", 
    "content_scripts": [ 
     { 
      "matches": ["*://*.soundcloud.com/*"], 
      "js": ["content.js"], 
      "run_at": "document_start" 
     } 
    ] 
} 

这里是content.js:

console.log(document.location); 
document.__defineGetter__('cookie',function(){ 
    alert("test"); 
}); 
console.log(document.__lookupGetter__('cookie')); 

当试图手动触发它(document.cookie)它只是返回正常值并且无法执行javascript。当它在这里工作失败时,我会对文档位置进行检查,以确保它在正确的域中执行并且甚至可以加载。 奇怪的部分是当你用这个扩展加载页面时,它会打印出它在正确的域上,它甚至表明cookie getter方法被正确覆盖(它在控制台中打印该函数)。 但是,当您查找getter方法时,它已被重置(document.__lookupGetter__('cookie'))。

我最后一个想法是,它正在运行我的content.js脚本和初始化页面的其余部分之间的某个时候被重置。但是,当我将manifest.json文件中的“run_at”字段更改为“document_end”,试图在文档的任何重新初始化之后使其运行更晚且有力时,soundcloud的东西将在控制台上开始打印,以显示它已经正确加载页面,但是我的脚本仍然没有产生效果。

编辑:建议之前。我无法使用chrome的cookie API,因为它没有提供实际监听cookie的方式,这是我关心的主要问题。

回答

1

经过一番挖掘,我发现它为什么失败。 Chrome扩展程序在其自己的JavaScript空间中执行,但与其运行的网站具有相同的DOM。请参阅https://developer.chrome.com/extensions/content_scripts#execution-environment。这导致他们有独立的全局变量,因此我的脚本试图改变他们只会影响自己。对于任何想要解决此限制的人来说,您只需将代码的脚本标记添加到您的扩展的文档中即可。