Доброго всем утра,

1. Есть у меня в тулбаре кнопка (type=menu) с широкой (85px по ширине, 20px по высоте) картинкой. При перемещении этой кнопки в окно Customise Toolbar от кнопки остаётся только название и дроп-маркер, а картинки нет. Как это исправить?

2. Как сделать так, чтобы при старте FF в окне Customise Toolbar уже были некие toolbaritem'ы?

Заранее спасибо.

чтобы в Customise Toolbar был значок у кнопки, можно сунуть в chrome.manifes примерно такого вида

Выделить код

Код:

style chrome://global/content/customizeToolbar.xul chrome://myaddon/skin/customizeToolbar.css

и внего вписать id кнопки и картинку к нему. чтобы текст отображался под иконкой, можно добавить к ней класс toolbarbutton-1

чтобы вручную сунуть кнопку на тулбар, я использую такой код:

Выделить код

Код:

var navbar = document.getElementById("nav-bar");
				var urlbar = document.getElementById("urlbar-container");
				navbar.insertItem("mybutton", (urlbar && urlbar.parentNode == navbar ? urlbar : null), null, false);
				navbar.setAttribute("currentset", navbar.currentSet);
				document.persist(navbar.id, "currentset");

2. Как сделать так, чтобы при старте FF в окне Customise Toolbar уже были некие toolbaritem'ы?

В оверлей на browser.xul добавить их как дочерние в элемент <toolbarpalette id="BrowserToolbarPalette">

Заработало, спасибо. Но есть ещё вопрос: я при старте браузера навешиваю на элементы всякие события и т.д., и когда добавляется новый элемент через Customise Toolbar - новые элементы не работают (потому как не инициализированы). Это как-то можно обойти? События есть какие-нибудь?

dragdrop или xbl

А xbl тут причём?

я при старте браузера навешиваю на элементы всякие события и т.д., и когда добавляется новый элемент через Customise Toolbar - новые элементы не работают (потому как не инициализированы). Это как-то можно обойти? События есть какие-нибудь?

ммм. я не совсем понял о чём ты
при старте браузера вешаются события на кнопку, которой может не быть?

Когда на элемент "навешивается" биндинг, управление получает конструктор биндинга. В нём можно выполнить все необходимые действия по инициализации элемента.

И всё-таки простой способ есть:

Выделить код

Код:

var methodstr = BrowserToolboxCustomizeDone.toString();
if(methodstr.indexOf("myFunc") == -1)
{
  methodstr = methodstr.substring(0, methodstr.lastIndexOf("}") - 1);
  methodstr += "var wm = Components.classes['@mozilla.org/appshell/window-mediator;1'].getService(Components.interfaces.nsIWindowMediator);"
  methodstr += "var mainwindow = wm.getMostRecentWindow('navigator:browser');";
  methodstr += "if(mainwindow.myFunc) mainwindow.myFunc();";
  methodstr += "}";

  eval("BrowserToolboxCustomizeDone =" + methodstr);
}

Грубо, зато работает.

при старте браузера вешаются события на кнопку, которой может не быть?

Имелось ввиду - при старте расширения.

Добавлено Wed Jul  2 00:32:39 2008 :
P.S. вышеприведённый код надо исполнять при инициализации расширения.

Грубо, зато работает.

"Хак" это называется.

Кстати, в browser.js есть такие строки:

Выделить код

Код:

var toolbox = document.getElementById("navigator-toolbox");
toolbox.customizeDone = BrowserToolboxCustomizeDone;

откуда

Выделить код

Код:

var toolbox = document. getElementById ("navigator-toolbox");
var oldCustomizeDone = toolbox. customizeDone;
toolbox. customizeDone = function myCustomizeDone (aToolboxChanged)
{
    oldCustomizeDone (aToolboxChanged);
    // ...
};

или

Выделить код

Код:

var toolbox = document. getElementById ("navigator-toolbox");
toolbox. customizeDone = (function (oldFunction)
{
    return function (aToolboxChanged)
    {
        oldFunction (aToolboxChanged);
        // ...
    };
}) (toolbox. customizeDone);

Тоже логичный выход. Но, что интересно, Яндекс в Яндекс.Баре решил делать по-моему :D

Но, что интересно, Яндекс в Яндекс.Баре решил делать по-моему

От того, что разработчики Яндекс бара сделали расширение для Яндекса, потенциально ненадёжный подход не стал более надёжным.