为什么从 Firefox 附加组件读取时 CSSRule 为空?

Why is CSSRule empty when read from a Firefox add-on?

CSSRule DOM interface 包含对应于每种类型的 CSS 规则的常量。规则的类型可以用像

这样的语句来测试
someRule.type == CSSRule.STYLE_RULE

我正在使用 SDK 构建 Firefox 附加组件。从该加载项的内容脚本文件中读取时,CSSRule 存在但为空。

console.log("CSSRule is " + CSSRule);
for(var key in CSSRule) {
    console.log('key: ' + key + '\n' + 'value: ' + CSSRule[key]);
}
console.log("CSSRule.STYLE_RULE is " + CSSRule.STYLE_RULE);

产出

CSSRule is [object CSSRule]
CSSRule.STYLE_RULE is undefined

当从页面内的 script 或从 Firefox 控制台执行相同的操作时,输出如我所料,CSSRule.STYLE_RULE 设置为 1

从 pageMod contentScript 而不是外部内容脚本文件执行时,CSSRule{}

等待页面完成加载,并使用 window.CSSRule 而不是 CSSRule,不要改变行为。

我已经在 Firefox 45.0.1(当前版本)和今天的夜间(48.01a 2016-04-10)上测试了这个 OS X。

为什么 CSSRule 是空的?除了手动将它们设置为正确的值外,我如何访问这些常量?

这是bug 898764. Extension scripts run in a sandbox that provides xray vision上的内容。

这意味着不受信任的 Web 内容定义的属性不可见,但所有 IDL 定义的属性和常量的原始实例应该可见。

目前以下可能是一种解决方法,但会将您的代码暴露给可能被内容更改或删除的值:

if(!("STYLE_RULE" in CSSRule)) {
   window.CSSRule = unsafeWindow.CSSRule
}

if it works, just run your code as a script on the page instead of directly from the extension. – dandavis

出于安全原因不推荐这样做,如果您想发布它可能无法通过插件审查。