2017-05-02 2 views
0

verfolge ich die Führung here:Wie kann man in der neuesten Firefox WebExtension auf die Xray Vision verzichten?

Ich möchte Xrays Vision eines iframe verzichten:

var foo = $(Components.utils.waiveXrays($("#foobar").get(0).contentWindow.document)); 

Die oben in einem Content-Skript mit manifest.json wie folgt ausgeführt werden:

"content_scripts": [ 
    { 
     "matches": /* something */, 
     "css": ["content.css"], 
     "js": ["jquery-3.2.1.js","content.js"] 
    } 
    ] 

Aber ich werde ein undefiniertes Objekt Fehlermeldung erhalten:

[firefox/index.js][debug] Firefox stderr: JavaScript error: , line 0: Error: Components.utils is undefined 

Ich denke, der Leitfaden auf der Mozilla-Website ist veraltet. Es ist nicht für reine WebExtension-Implementierung.

Was sollte jetzt die korrekte neueste Methode sein?

Antwort

0

Nach ein paar Tagen der Forschung (und Fragen in Mozilla Firefox Mailing-Liste). Ich habe bereits die Lösung gefunden. Die richtige Führung ist here (ab 2017 14. Mai):

In the SDK, content scripts can share objects with page scripts, using techniques like unsafeWindow and createObjectIn. In WebExtensions, the unsafeWindow is available via wrappedJSObject instead. All the export helper functions are available, too.

Wenn ich die verzichtet xrays Version von Window-Objekt zugreifen möchten, sollte ich verwenden:

window.wrappedJSObject 

Wenn ein iframe innerhalb die Seite und ich möchte auf das Objekt zugreifen. Hier ist eine der Art und Weise:

document.getElementById("the_iframe").contentWindow.wrappedJSObject 

Allerdings habe ich festgestellt, dass, wenn der iframe in Cross-Domain ist, wird die wrappedJSObject sein nicht zugänglich (ab Firefox Version 51.0.1). Ich brauche eine andere Methode wie folgt zu suchen:

einen Content-Skript vor, dass alle Kind iframe injiziert und dann ein Hintergrund-Skript, das ein messaging bridge zwischen dem Kind iframe und der oberen Seite bieten implementieren:

"background": { 
    "scripts": ["background.js"] 
    }, 

    "content_scripts": [ 
    { 
     "matches": ["*://*.something"], 
     "css": ["content.css"], 
     "all_frames": true, /* ADD THIS LINE */ 
     "js": ["jquery-3.2.1.js","content.js"] 
    } 
    ] 

In Inhalt Js, so etwas tun:

if(window.top == window.self) { // main 
    main(); 
} 
else if(window.name == "frameA") { // match frameA 
  browser.runtime.onMessage.addListener(function(msg) { 
    /* Check the message msg and then access the waived X rays vision by window.wrappedJSObject */ 
    if(msg matches something) { 
     var ret = window.wrappedJSObject.foobar(msg.data); 
     /* Send back the return value to background.js by browser.runtime.sendMessage */ 
     browser.runtime.sendMessage({"returnVal": ret, "from": "frameA"}); 
    } 
    } 
    }); 
} 

In background.js, eine Nachrichtenweiterleitung tun:

function forward_to_all(r) 
{ 
    var forwardMessage = function(tabs) { 
    for(let tab of tabs) { 
     browser.tabs.sendMessage(tab.id,r); 
    } 
    } 
    browser.tabs.query({currentWindow:true, active:true}).then(forwardMessage); 
} 
browser.runtime.onMessage.addListener(function(msg) { 
    if(msg matches something) { 
    forward_to_all(msg); 
    } 
}); 
1

Sie sind nicht in der Lage, auf Xrays in Firefox Webextensions verzichten, wenn Sie in der Lage sind, dann ist es ein Fehler, der schnell deaktiviert werden würde.

I think the guide on Mozilla website is outdated.

In der Tat.

What should be the correct latest method now?

was Sie tun möchten (dh Verzicht auf Xray-Wrapper) ist nicht möglich. Wahrscheinlich am besten, über einen neuen Weg nachzudenken, um zu erreichen, was Sie wollen, was auch immer das ist (ich kann es nicht an der Beschreibung erkennen).

Verwandte Themen