2012-04-10 7 views
0

Ich entwickle eine Symbolleiste für einen Kunden, der eine traditionelle IE-Stil-Symbolleiste am oberen Rand des Fensters unter der Adressleiste möchte. DieseFirefox 11+ Add-on SDK können Sie eine Symbolleiste am oberen Rand des Fensters unter der Adressleiste erstellen?

ist, was ich habe: What I have http://www.hellometro.com/toolbar/now.png

Beachten Sie, dass aufgrund der vertikalen Grenzen der Statusleiste I in allen Caps schreiben für die Buchstaben lesbar zu sein, während klein genug ist, zu passen. (Zwei am weitesten links stehenden Elementen in der Statusleiste, Textfeld und SEARCH-Taste)

Das ist, was ich brauche: What I need http://www.hellometro.com/toolbar/whatiwant.png

Beachten Sie die Symbolleiste oben hinzugefügt, die genügend vertikalen Raum für lesbaren Text innerhalb von Textfeld hat und Taste. (Oben links unter dem Zurück-Button des Browsers).

Ich suche nach einer Möglichkeit, die Suchkomponente in der Statusleiste als Standardposition zu positionieren und dem Benutzer zu erlauben, seine Position auf der Optionsseite zu ändern, damit sie oben oder unten wählen können (weil viele, wenn nicht die meisten) Firefox-Benutzer wissen nicht, dass sie Add-ons verschieben können).

Meine Frage ist: Unterstützt Firefox Add-on SDK, was ich tun möchte, oder muss ich Sprachen wechseln und Lösung aus einem anderen Blickwinkel nähern?

Antwort

5

Dies ist nichts, was Sie mit der verfügbaren Add-on-SDK-API tun können, mit gutem Grund - Add-Ons sollten Bildschirm nicht unnötigerweise verschwenden und das Hinzufügen einer Symbolleiste ist genau das. Sie können dieses Ziel erreichen, indem Sie Low-Level-Module verwenden und direkt zum XUL des Browsers gehen. So etwas sollte funktionieren (ungetestet Code und sehr Hacky):

var widgetID = "foobar"; 
var buttonID = "widget:" + require("self").id + "-" + widgetID; 
var toolbarName = "My Extension Toolbar"; 
require("widget").Widget({ 
    id: widgetID, 
    ... 
}); 

if (firstRun) 
{ 
    var winUtils = require("window-utils"); 
    for (var window in winUtils.browserWindowIterator()) 
    { 
    var toolbox = window.gNavToolbox; 
    if (toolbox) 
    { 
     // Does the button exist already? 
     var button = toolbox.ownerDocument.getElementById(buttonID); 
     if (button && button.parentNode.getAttribute("toolbarname") == toolbarName) 
     continue; // Button already in the right toolbar 
     else if (button) 
     { 
     // Remove button from its current location 
     var toolbar = button.parentNode; 
     toolbar.removeChild(button); 

     // Make sure this change is persisted 
     toolbar.setAttribute("currentset", toolbar.currentSet); 
     toolbar.ownerDocument.persist(toolbar.id, "currentset"); 
     } 

     var toolbar = toolbox.appendCustomToolbar("My Extension Toolbar", buttonID); 
     toolbar.currentSet = toolbar.getAttribute("currentset"); 
     toolbar.ownerDocument.persist(toolbar.id, "currentset"); 

     // Send change notification, the widget needs reinitializing 
     var event = toolbox.ownerDocument.createEvent("Events"); 
     event.initEvent("customizationchange", true, true); 
     toolbox.dispatchEvent(event); 
    } 
    } 
} 

Notiere die undefined firstRun Variable - Sie wollen, dass diese nur einmal tun, sonst werden Sie Wahl des Benutzers wiederherstellen Ihr Widget an anderer Stelle zu bewegen (man kann speichern Sie eine Flagge über simple-prefs Modul oder etwas ähnliches). Beachten Sie auch, dass die buttonID Berechnung interne Details aus der Datei addon-kit/lib/widget.js im SDK verwendet - die Art und Weise, wie die ID der Symbolleistenschaltfläche berechnet wird, kann sich in einer zukünftigen SDK-Version ändern, aber ich denke, dass dies die einzige Möglichkeit ist, ein Widget zu erstellen SDK. Es gibt natürlich auch viele Interna in den anderen Teilen des Codes.

Dokumentation: window-utils module (browserWindowIterator ist undokumentiert), <xul:toolbox>, <xul:toolbar>.

+0

bei dem Versuch, Ihren Vorschlag zu verwenden, ich zwei Symbolleiste mit dem gleichen Namen versehentlich erstellt. Now Toolbar Layout ... ist ausgegraut. Wo kann ich meine beiden benutzerdefinierten Symbolleisten mit demselben Namen löschen? –

+0

Vergesst nicht, dass Duplikate gelöscht werden. Ich habe Firefox geschlossen und es wieder geöffnet, was die beiden Symbolleisten mit dem gleichen Namen konsolidierte (oder zumindest die zweite löschte). –

+0

Ok, ich habe dies in meinen Code eingefügt, aber es ist nur erfolgreich, die benutzerdefinierte Symbolleiste zu erstellen und das Widget aus der Add-on Toolbar zu entfernen. Das Widget wird nie in der neuen benutzerdefinierten Symbolleiste angezeigt. –

2

Ab Firefox 29 (zum Zeitpunkt des Schreibens in Beta) können Sie ganz einfach Schaltflächen der Symbolleiste zu Firefox hinzufügen können, finden Sie in diesem Blog-Post auf, wie es zu tun, um die Add-on-SDK:

https://blog.mozilla.org/addons/2014/03/13/new-add-on-sdk-australis-ui-features-in-firefox-29/

Sie können dies auch über niedrigere Ebene apis tun, sehen Sie dieses Hacks für weitere Informationen schreiben:

https://blog.mozilla.org/addons/2014/03/06/australis-for-add-on-developers-2/