2009-08-18 6 views
0

Ich habe eine Firefox-Erweiterung geschrieben, die abfängt, wenn eine bestimmte URL eingegeben wird und einige Sachen macht. Meine Haupt-App startet Firefox mit dieser URL. Die URL enthält vertrauliche Informationen, daher möchte ich nicht, dass sie im Verlauf gespeichert werden.Wie kann ein Bookmarklet auf eine Firefox-Erweiterung zugreifen (oder umgekehrt)?

Ich bin besorgt über den Fall, wo die Erweiterung nicht installiert ist. Wenn es nicht installiert ist und Firefox mit der sensiblen URL gestartet wird, wird es im Verlauf gespeichert und ich kann nichts dagegen tun. Also meine Idee ist ein Bookmarklet zu verwenden.

Ich werde Firefox mit "javascript: window.location.href = 'favorinstallthissplugin.html"; sensitiveinfo =' blahblah '"starten.

Wenn die Erweiterung nicht installiert ist, werden sie auf eine Seite umgeleitet, die sie anweist, sie zu installieren, und die vertraulichen Informationen werden nicht im Verlauf gespeichert. Wenn die Erweiterung IS installiert ist, wird es die Informationen in der Variable sensitiveinfo erfassen und seine Sache tun.

Meine Frage ist, kann das Bookmarklet eine Methode in der Erweiterung anrufen, um die sensiblen Informationen zu übergeben (und wenn ja, wie) oder kann die Erweiterung fangen, wenn JavaScript im Bookmarklet aufgerufen wird?

Wie kann ein Bookmarklet und eine Firefox-Erweiterung kommunizieren?

p.s. Das alternative Mittel, um diese Situation zu umgehen, wäre, dass meine Hauptanwendung Firefox startet und mit der Nebenstelle über Sockets kommuniziert, aber das tue ich nicht gern, weil ich im Laufe der Jahre zu viele Probleme mit Benutzern mit verrückten Firewalls bekommen habe, die Sockets blockieren Kommunikation. Ich würde gerne alles ohne Steckdosen machen, wenn möglich.

Antwort

1

Soweit ich weiß, können Bookmarkle niemals auf Chrome-Dateien (Erweiterungen) zugreifen.

1

Bookmarklets werden im Bereich des aktuellen Dokuments ausgeführt, das fast immer ein Inhaltsdokument ist. Wenn Sie jedoch sind vorbei es über die Kommandozeile in, scheint es zu funktionieren:

/Applications/Namoroka.app/Contents/MacOS/firefox-bin javascript:alert\(Components\)

Components Zugriff werfen würde, wenn es nicht erlaubt war, aber die Warnung zeigt das richtige Objekt.

+0

Obwohl Sie auf das Objekt Komponenten zugreifen können, sieht es so aus, als ob Sie versuchen, auf eine nützliche Methode/Eigenschaft für dieses Objekt zuzugreifen, z. B. Klassen oder QueryInterface() wird Ihre Berechtigung verweigert. Also ich denke es ist einfach nicht möglich. – mhenry1384

1

Sie könnten unsafeWindow verwenden, um eine globale zu injizieren. Sie können eine einfache Eigenschaft hinzufügen, so dass Ihr Bookmarklet nur erkennen muss, ob das Globale definiert ist oder nicht, aber Sie sollten wissen, dass es keine Möglichkeit gibt, Sites in einem Nicht-Bookmarklet-Kontext vom Sniffing auszuschließen für das gleiche global (da es ein Datenschutzproblem für einige sein kann, dass Websites erkennen können, ob sie die Erweiterung verwenden). Ich habe in meinem eigenen Add-on bestätigt, das ein globales in einer Art ähnlich der unten injiziert, die es in einem Bookmarklet sowie normalen Site-Kontext funktioniert.

Wenn Sie registrieren ein nsIObserver, zum Beispiel, wo content-document-global-created das Thema ist, und dann packen die subject, können Sie Ihre globales injizieren (siehe this, wenn Sie etwas anspruchsvollere wie ein Objekt mit Methoden injizieren müssen).

Hier einig (ungetestet) Code, der den Trick tun soll:

var observerService = Cc['@mozilla.org/observer-service;1'].getService(Ci.nsIObserverService); 
observerService.addObserver({observe: function (subject, topic, data) { 

    var unsafeWindow = XPCNativeWrapper.unwrap(subject); 
    unsafeWindow.myGlobal = true; 

}}, 'content-document-global-created', false); 

Siehe this und this, wenn Sie eine scheinbar einfache Art und Weise in einem SDK wollen Add-on (nicht sicher, ob SDK postMessage Kommunikation funktionieren würde, als eine Alternative, aber mit der anscheinend gleichen Sorge, dass dies auch Nicht-Bookmarklet-Kontexten (dh regulären Webseiten) ausgesetzt wäre).

+0

Ich mag diesen Beitrag, danke für das Teilen von Brett, aber warum '' 'content-document-global-created''' und nicht' '' document-element-insert''' zum Thema beobachten? – Noitidart

+0

Kein Grund - vielleicht wäre das besser ... –

+0

Ah. Kannst du mir helfen zu verstehen, was es tut, wie könnte es besser werden? Wissen Sie, was das Thema Content-Document-Global-Created ist? Was macht es genau? Stellt es ein Javascript ein, bevor Skripte ausgeführt werden? Wenn document-element-inserted noch nicht ausgeführt wurde, können Sie zu diesem Zeitpunkt noch nicht einmal auf dom zugreifen. Und wenn Sie Javascript einfügen müssen, warum verwenden Sie einen Beobachter? Warum gehst du nicht einfach '' 'gBrowser.contentWindow.wrappedJSObject.myGlobal = true'''? – Noitidart