为什么要重置文档getter函数

Why are the document getter functions being reset?

本文关键字:getter 函数 文档 为什么      更新时间:2023-11-03

我正在尝试创建一个小的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"
        }
    ]
}

这是内容.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被检索时,它没有提供一种实际监听的方式,这是我最关心的事情。

经过一番挖掘,我发现了它失败的原因。Chrome扩展在它们自己的javascript空间中执行,但使用与它们运行的站点相同的DOM。请参阅https://developer.chrome.com/extensions/content_scripts#execution-环境。这导致它们有单独的全局变量,因此我的脚本试图更改它们只会影响它自己。对于任何想了解如何绕过这一限制的人来说,你所要做的就是从扩展中在文档中添加一个带有代码的脚本标记。