Frage

Kann ein Firefox XPCOM Komponente lesen und Seiteninhalt auf mehrere Seiten schreiben?

Szenario: Ein Bündel von lokalen HTML und Javascript-Dateien. A "Main.html" Datei öffnet sich ein Fenster "pluginWindow" und schafft ein Plugin:
netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
var obj = Components.classes[cid].createInstance();
plugin = obj.QueryInterface(Components.interfaces.IPlugin);
plugin.addObserver(handleEvent);

Das Plugin, das 3 Methoden hat.

IPlugin.Read - Lesen von Daten aus Plugin
IPlugin.Write - Sendet Daten an das Plugin
IPlugin.addObserver -. zum Lesen eines Callback-Handler hinzufügen

Die "Main.html" ruft dann in die pluginWindow und versucht die Plugin Methode Write zu nennen.

Ich erhalte eine Fehlermeldung:

Permission denied to call method UnnamedClass.Write

War es hilfreich?

Lösung

Als erstes ist Ihr C ++ Code wirklich eine Plugin oder ein XPCOM Komponente , möglicherweise als Teil eines Erweiterung ? Klingt wie es die spätere ist.

Wenn ja, dann ist es nicht verwendbar von nicht vertrauenswürdigen JS-Code - jeder Webseite oder einer lokalen HTML-Datei. Es ist voll nutzbar von privilegierten Code, die häufigste Art, von denen die Erweiterung Code rel="nofollow.

Sie arbeiten, um dieses Problem, wenn die Komponente der Erstellung des enablePrivilege('UniversalXPConnect') Anruf mit. Dies ist nicht wirklich zu empfehlen, es sei denn, dies wird nicht an Benutzer verteilt werden (da dieser Aufruf eine verwirrende Box erscheint und wenn Sie eine Präferenz festgelegt immer Datei ermöglichen: // Skripte XPCOM verwenden, kann es ein Sicherheitsproblem sein, da nicht alle lokalen Seiten sind vertrauenswürdig -. denken gespeicherten Webseiten)

Ihr Write Aufruf fehlschlägt aus dem gleichen Grunde - file: // Seiten nicht XPCOM Komponenten zu verwenden, vertraut. Sie wahrscheinlich kann es an die Arbeit, wenn Sie einen anderen enablePrivilege Aufruf in der gleichen Funktion hinzufügen, die selbst schreiben nennen.

Je nach Situation kann es eine bessere Lösung sein.

Wenn Sie Ihre Dateien müssen behandelt werden als vertrauenswürdig, Sie können sie als eine Erweiterung verpacken wollen und greifen Sie über ein chrome: // URL. Dies gibt den Code in diesen Seiten die Berechtigung, XPCOM-Komponente aufzurufen, einschließlich Ihnen.

Wenn die Komponente Methoden sicher sind von jeder Seite zu verwenden, oder wenn die Umgebung kontrolliert wird und keine nicht vertrauenswürdige Seiten werden im Browser geladen, könnten Sie Ihre Komponente zugänglich Inhalt machen (Suche nach nsSidebar in mozilla Code für ein Beispiel und auch für nsISecurityCheckedComponent).

Ach ja, und wenn Sie gute Antworten hier nicht bekommen, sollten Sie auf jeden Fall die mozilla Newsgroups / Mailinglisten versuchen.

[Bearbeiten in Antwort auf einen Kommentar] Betrachten Sie den Code setzen, der die Komponente in einem Chrom aufrufen muss: // Skript. Alternativ sollten Sie in der Lage sein, um Ihre Seiten mit den Chrom-Privilegien „segnet“ mit Code wie diese (beachten Sie, dass es das Gegenteil von dem tut, was man braucht - Strippen der Chrom Privilegien entfernt).

Andere Tipps

Ist Main.html und das andere Fenster mit Chrom-Rechten ausgeführt? Wenn Sie Main.html Zugriff auf „normal“, nur um es auf die Adressleiste von Firefox setzen, dann wird es haben Beschränkungen, was es tun kann (sonst eine beliebige Web-Seite könnte genau das gleiche tun).

Wenn Sie eine Firefox-Plugin erstellen, legen Sie Ihren Code in einer XUL Overlay.

Wenn Sie wirklich wollen, jeder Web-Seite zu ermöglichen, alles zu tun, es ist dein Plugin tut, können Sie einen Mechanismus durch Wich etablieren die Seite kann das Plugin bitten, den Betrieb mit seinen Chrom Privilegien zu tun und das Ergebnis an der Seite senden danach .

Wenn Sie nicht eine Firefox-Erweiterung machen ... dann bin ich Angst, dass ich etwas falsch verstanden, könnten Sie erklären es mehr?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top