2016-04-10 13 views
1

Die CSSRule DOM interface enthält Konstanten für jeden Typ von CSS-Regel. Der Typ einer Regel kann mit Anweisungen wieWarum ist CSSRule leer, wenn es von einem Firefox-Add-On gelesen wird?

getestet werden. Ich baue ein Firefox Add-on mit dem SDK. Wenn es aus der Inhaltsskriptdatei dieses Add-ons gelesen wird, ist CSSRule vorhanden, aber leer.

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); 

Ausgänge

CSSRule is [object CSSRule] 
CSSRule.STYLE_RULE is undefined 

Wenn von einem script innerhalb einer Seite die gleiche Ausführung, oder von der Konsole den folgenden, ist der Ausgang als erwarte ich, mit CSSRule.STYLE_RULE Satz 1.

Wenn man von einem pageMod contentScript anstelle einer externen Inhaltsskriptdatei ausgeführt wird, ist CSSRule{} statt.

Warten Sie, bis die Seite geladen wurde, und verwenden Sie window.CSSRule anstelle von CSSRule, ändern Sie das Verhalten nicht.

Ich habe dies auf Firefox 45.0.1 (aktuelle Version) und jede Nacht (48.01a 2016.04.10) von heute getestet, auf OS X.

Warum ist CSSRule leer? Wie kann ich auf diese Konstanten zugreifen, außer sie manuell auf die richtigen Werte zu setzen?

+0

welche FF-Version? Hast du es jeden Abend versucht? – the8472

+0

@ the8472 45.0.1, das gleiche Verhalten bei Nacht. Habe die Frage bearbeitet. – Leopold

+0

Wenn es funktioniert, führen Sie einfach Ihren Code als Skript auf der Seite statt direkt von der Erweiterung aus. – dandavis

Antwort

3

Dies ist bug 898764. Erweiterungsskripts werden in einer Sandbox ausgeführt, die für den Inhalt bereitstellt.

Das bedeutet, dass vom nicht vertrauenswürdigen Webinhalt definierte Eigenschaften nicht sichtbar sind, aber unveränderte Instanzen aller IDL-definierten Eigenschaften und Konstanten sollten sichtbar sein.

Zur Zeit folgenden als Behelfslösung dienen könnte, würde aber nach Inhalt des Code auf Werte möglicherweise geändert oder entfernt aussetzen:

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

wenn es funktioniert, nur der Code als Script ausführen auf der Seite statt direkt von der Erweiterung. - dandavis

Dies wird aus Sicherheitsgründen nicht empfohlen und kann Addon Review möglicherweise nicht bestehen, wenn Sie es veröffentlichen möchten.

+0

'unsafeWindow.CSSRule' hat den richtigen Wert, danke. Aus Sicherheitsgründen verwende ich stattdessen die konstanten Werte (wie zum Beispiel "1" für ein "STYLE_RULE"). – Leopold

+1

Laut [bug 898764] (https://bugzilla.mozilla.org/show_bug.cgi?id=898764) CSSRule ist einfach nicht in Bezug auf WebIDL implementiert und daher wird es nicht richtig xrayed. Sobald das behoben ist, sollte es auch in Addons funktionieren. – the8472