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