2011-01-15 7 views
1

ich eine Firefox-Erweiterung zu schreiben, die einen Socket-Server erstellt, die folgende Ausgabe der aktiven Registerkarte URL, wenn ein Client eine Verbindung mit ihr macht. Ich habe den folgenden Code in meiner Javascript-Datei:Hilfe bei der Firefox-Erweiterung in mehreren Fenstern

var serverSocket; 

function startServer() 
{ 
    var listener = 
    { 
     onSocketAccepted : function(socket, transport) 
     { 
      try { 
       var outputString = gBrowser.currentURI.spec + "\n"; 
       var stream = transport.openOutputStream(0,0,0); 
       stream.write(outputString,outputString.length); 
       stream.close(); 
      } catch(ex2){ dump("::"+ex2); } 
     }, 

     onStopListening : function(socket, status){} 
    }; 

    try { 
     serverSocket = Components.classes["@mozilla.org/network/server-socket;1"] 
     .createInstance(Components.interfaces.nsIServerSocket); 

     serverSocket.init(7055,true,-1); 
     serverSocket.asyncListen(listener); 
    } catch(ex){ dump(ex); } 

    document.getElementById("status").value = "Started"; 
} 



function stopServer() 
{ 
    if (serverSocket) 
    serverSocket.close(); 
} 

window.addEventListener("load", function() { startServer(); }, false); 
window.addEventListener("unload", function() { stopServer(); }, false); 

Wie es ist, funktioniert es für mehrere Registerkarten in einem einzigen Fenster. Wenn ich mehrere Fenster öffne, ignoriert es die zusätzlichen Fenster. Ich denke, es ist ein Server-Socket für jedes Fenster erstellen, aber da sie den gleichen Port verwenden, können die zusätzlichen Sockets nicht initialisiert werden. Ich brauche es, um einen Server-Socket zu erstellen, wenn der Browser gestartet wird und weiter ausgeführt wird, wenn ich die Fenster schließe (Mac OS X). So wie es ist, wenn ich ein Fenster schließe, aber Firefox läuft, schließt sich der Socket und ich muss Firefox neu starten, um es zum Laufen zu bringen. Wie gehe ich da vor?

+0

Sie sollten posten Sie Ihre XUL-Code, so können wir sehen, wie Ihr Overlay funktioniert. – jmort253

Antwort

1

Sie wahrscheinlich wollen:

  1. Beweg dich r Code in eine JavaScript-Komponente
  2. Registrieren Komponente als profile-after-changeobserver
  3. Wann immer jemand eine Verbindung zu Ihrer Steckdose macht, finden Sie das aktive Fenster und zurück ihre URL.

Verwendung so etwas wie

var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"] 
        .getService(Components.interfaces.nsIWindowMediator); 
var win = wm.getMostRecentWindow("navigator:browser"); 
var spec = win ? win.getBrowser().currentURI.spec : ""; 
var outputString = spec + "\n"; 

usw.

+0

Kann ich mich für Beobachterbenachrichtigungen anmelden, wenn sich der JavaScript-Code nicht in einer Komponente befindet? Wenn ich mich für Profil-nach-Änderung-Benachrichtigungen registriere, wie kann ich zwischen Start und Herunterfahren unterscheiden? – David

+0

Nur Komponenten können automatisch für Benachrichtigungen mit dem Category Manager registriert werden. Anderer Code kann sich für viele Benachrichtigungen mit dem Observatory-Dienst registrieren, aber dafür ist Profil-nach-Änderung zu früh. In Bezug auf Ihre andere Frage erhalten Sie nur eine Profil-nach-Änderung Benachrichtigung; Beim Herunterfahren wird eine andere Gruppe von Benachrichtigungen ausgelöst. – Neil

2

Firefox-Erweiterung Overlays binden an Fensterobjekte. Eine Möglichkeit besteht darin, eine XPCOM-Komponente zu erstellen oder eine Komponente zu finden, die bereits von einer anderen Person erstellt wurde, damit Sie Funktionalität erstellen können, ohne sie an die Fensterobjekte zu binden.

Natürlich Abschnitt # 2 unten auf Observer Benachrichtigungen kann hilfreich sein, auch.

Mögliche Abhilfe: # 1

Statt Aufruf „start()“ jedes Mal, wenn ein Fenster geöffnet wird, können Sie einen Flag namens windowCount, dass Sie jedes Mal, wenn ein neues Fenster öffnen erhöhen könnten. Wenn windowCount größer als 0 ist, rufen Sie startServer() nicht auf.

Als Fenster zu schließen, könnte man die Zählung verringern. Sobald es 0 erreicht, stoppe den Server.

ist hier Informationen von den Mozilla-Foren zu diesem Problem: http://forums.mozillazine.org/viewtopic.php?f=19&t=2030279

Mögliche Abhilfe # 2:

dies gesagt wurde, habe ich die Dokumentation auch für Observer Benachrichtigungen gefunden, die hilfreich sein können da gibt es einen Abschnitt auf Anwendung Starten und Herunterfahren: https://developer.mozilla.org/en/Observer_Notifications

UPDATE:

Hier sind einige Ressourcen auf XPCOM Komponenten in JavaScript erstellen und in C++:

+0

Ich habe versucht, Workaround # 1, aber ich würde immer noch nur die URL des ersten Fensters, das ich geöffnet habe. Ich kann nicht herausfinden, warum, aber ich denke, mit einer XPCOM-Komponente ist der beste Weg. Hast du eine Verbindung zu einem einfachen Beispiel von einem, das ich betrachten kann? Vielen Dank. – David

+0

@Johnny Grass - Ich habe einige Links hinzugefügt, die beim Erstellen von XPCOM-Komponenten hilfreich sein können. JavaScript ist wahrscheinlich einfacher. Reichen Sie auch Methode 2 nicht ein, da dies XPCOM möglicherweise nicht erfordert. XPCOM kann nach meiner Erfahrung ziemlich kompliziert sein. Viel Glück! – jmort253

+0

Danke, ich werde ein wenig mehr darüber nachdenken. Ich schaute durch und hatte den Eindruck, dass Observer Notifications XPCOM erforderte. – David

Verwandte Themen