【问题标题】:Why are the document getter functions being reset?为什么要重置文档获取器功能?
【发布时间】:2016-04-02 12:14:36
【问题描述】:

我正在尝试创建一个小型 chrome 扩展程序来帮助查找 cookie 在网站中的使用位置。扩展应该通过为文档上的 cookie 设置 getter 方法来工作。 像这样:

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 脚本运行和页面的其余部分初始化之间的某个时间被重置。但是,当我将 manifest.json 文件中的“run_at”字段更改为“document_end”以尝试使其稍后运行并可能在对文档进行任何类型的重新初始化后运行,则 soundcloud 的内容将开始在控制台上打印,显示它已正确加载页面,但我的脚本仍然无法生效。

编辑:建议之前。我不能使用 chrome 的 cookie API,因为它没有提供一种实际监听何时检索 cookie 的方法,这是我关心的主要事情。

【问题讨论】:

    标签: javascript cookies google-chrome-extension


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2016-12-11
      • 2016-01-02
      • 2021-11-08
      • 2019-05-17
      • 2023-01-27
      • 2011-02-23
      • 2018-12-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多