为什么要重置文档getter函数?

时间:2016-04-02 03:43:45

标签: javascript cookies google-chrome-extension

我正在尝试创建一个小的Chrome扩展程序,以帮助找到Cookie在网站中使用的位置。通过在文档上设置cookie的getter方法,扩展名为SUPPOSE。 像这样:

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

在网站上手动输入chrome的javascript控制台,然后尝试访问Cookie(只需输入" document.cookie")就会产生预期的行为弹出测试提示。

但是,当我将它放入chrome扩展程序并在页面的其余部分之前加载它时,它将无法工作。

这是manifest.json(我只是将soundcloud用作测试网站):

{
    "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脚本运行和页面的其余部分初始化之间有时会重置它。但是,当我更改" run_at" manifest.json文件中的字段为" document_end"为了让它在文档的任何重新初始化之后运行以后有效,然后soundcloud的东西将在控制台上开始打印,显示它已正确加载页面但是我的脚本仍然没有产生效果

编辑:在建议之前。我无法使用Chrome的Cookie API,因为它无法提供实际收听时检索cookie的方式,这是我关心的主要内容。

1 个答案:

答案 0 :(得分:1)

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