Я хочу создать расширение, добавляющее кнопку в Firefox. Код кнопки есть, работает в CustomButtons, а вот как сделать из неё расширение не представляю =(. Объясните пожалуйста саму структуру расширения и куда там прописывать код =) или дайте ссылку на данный материал.
(сори если повторяюсь, но в поиске ничего внятного не нашёл)

Najlus
Попробуй поковырять расширение Ru-Board Navigation

Najlus
В общем случае задача нетривиальна.
Про структуру: https://developer.mozilla.org/Ru/Building_an_Extension, https://developer.mozilla.org/En/Building_an_Extension.
А начать лучше с работающего расширения, добавляющего кнопки.

Infocatcher пишет

NajlusВ общем случае задача нетривиальна.Про структуру: https://developer.mozilla.org/Ru/Building_an_Extension, https://developer.mozilla.org/En/Building_an_Extension.А начать лучше с работающего расширения, добавляющего кнопки.

Ааа, никогда не дружил с английским, придётся методом научного тыка работать =(

20-07-2009 17:04:22
Дополнение обозвал Sample, кнопка не появилась =(

Najlus
По первой ссылке почти все на русском.

20-07-2009 17:07:02
Что в консоли ошибок?

Предупреждение: Неизвестное свойство «behavior».  Потерянное объявление.
Источник: http://vkontakte.ru/css/rustyle.css?31
Строка: 25
Предупреждение: Ошибка при анализе значения «cursor».  Потерянное объявление.
Источник: http://vkontakte.ru/css/rustyle.css?31
Строка: 120
Предупреждение: Ожидалось объявление, но найдено «/».  Пропущено до следующего объявления.
Источник: http://vkontakte.ru/css/rustyle.css?31
Строка: 277

И таких предупреждений куча, наверное на css ругается, щас попробую удалить

Не, это про стили со страниц.

about:config → javascript.options.showInConsole = true
И расширение Console² может пригодиться.

Расширение это не спасло... буду и дальше пытаться =(

А что написано в chrome.manifest и install.rdf ?

<?xml version="1.0"?>

<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
     xmlns:em="http://www.mozilla.org/2004/em-rdf#">

  <Description about="urn:mozilla:install-manifest">
    <em:id>sinklerfirst@gmail.com</em:id>
    <em:version>1.0</em:version>
    <em:type>2</em:type>
   
    <!-- Указывается приложение для которого может
            быть установлено Расширение, его максимальная
            и минимальная поддерживаемая версия. -->
    <em:targetApplication>
      <Description>
        <em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id>
        <em:minVersion>1.0</em:minVersion>
        <em:maxVersion>4.0</em:maxVersion>
      </Description>
    </em:targetApplication>
   
    <!-- Front End MetaData -->
    <em:name>sample</em:name>
    <em:description>A test extension</em:description>
    <em:creator>Your Name Here</em:creator>
    <em:homepageURL>http://www.example.com/</em:homepageURL>
  </Description>     
</RDF>

Странно О_О я же менял
а вот в маифесте (было создано на основе расширения mozilla-forums):

overlay    chrome://browser/content/browser.xul    chrome://QickBookmarks/content/forumzillaOverlay.xul
content    QickBookmarks    jar:chrome/QickBookmarks.jar!/content/QickBookmarks/

skin    QickBookmarks    classic/1.0    jar:chrome/QickBookmarks.jar!/skin/classic/
style    chrome://global/content/customizeToolbar.xul    chrome://QickBookmarks/skin/main.css
style    chrome://browser/content/browser.xul    chrome://QickBookmarks/skin/main.css

locale    QickBookmarks    ru-RU    jar:chrome/QickBookmarks.jar!/locale/ru-RU/QickBookmarks/

20-07-2009 18:16:03
Console² пожаловался вот на это:

Ошибка: неправильный
Источник: chrome://qickbookmarks/content/forumzillaOverlay.xul
Строка: 44, символ: 12
Исходный код:
    image && mi. setAttribute ("image", "moz-anno:favicon:" + image);

Во-первых, описание в chrome.manifest должно совпадать со структурой папок:

Выделить код

Код:

install.rdf
chrome.manifest

chrome/
	QickBookmarks.jar
		content/
			QickBookmarks/
				forumzillaOverlay.xul
		skin/
			classic/
				main.css
		locale/
			ru-RU/
				QickBookmarks/

Console² пожаловался вот на это:

Видимо, неправильно подключен скрипт.
Должно быть примерно вот так:

Выделить код

Код:

<overlay xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
	<script type="application/x-javascript" src="chrome://QickBookmarks/content/QickBookmarks.js" />

А в
chrome/QickBookmarks.jar/content/QickBookmarks/QickBookmarks.js
уже сам скрипт.

Плюс должна быть кнопка.

Расширение утановилось, но кнопки тютю =(

20-07-2009 19:01:39
Опять на туже ошибку жалуется

Тогда нужно смотреть, что в forumzillaOverlay.xul.
Минимальный вариант примерно такой:

Выделить код

Код:

<?xml version="1.0"?>
<overlay xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
	<toolbarpalette id="BrowserToolbarPalette"> <!-- Встроенное в Firefox хранилище кнопок -->
		<toolbarbutton label="Some label" oncommand="someJsFunc();" /> <!-- Добавляемая кнопка -->
	</toolbarpalette>
</overlay>
Infocatcher пишет

Видимо, неправильно подключен скрипт.
Должно быть примерно вот так:

Или использовать CDATA, если скрипт в самом xul-файле. Тогда XML-парсер не будет ругаться на & и < в JS-коде. Примерно так:

Выделить код

Код:

<script> <![CDATA[
   // ... собственно JS-код
]]> </script>
FFUser665 пишет

дык сделай так:ищешь одинаковые(делающие одно и то же) 1кнопку под СВ2 расширение добавляющее эту кнопкусмотришь код кнопкираспаковываешь расширение и смотришь как и где это код прописан в нёмдалее действуешь со своим кодом аналогично

Ээээ а вы хоть одну такую пару знаете?

21-07-2009 19:10:21

Infocatcher пишет

Тогда нужно смотреть, что в forumzillaOverlay.xul.Минимальный вариант примерно такой:Код:<?xml version="1.0"?>
<overlay xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
    <toolbarpalette id="BrowserToolbarPalette"> <!-- Встроенное в Firefox хранилище кнопок -->
        <toolbarbutton label="Some label" oncommand="someJsFunc();" /> <!-- Добавляемая кнопка -->
    </toolbarpalette>
</overlay>

Чёт немного не понял код. Ясно что он обращается к хранилищу кнопок лиса, а вот что значит строка
<toolbarbutton label="Some label" oncommand="someJsFunc();" />
както не особо.

Najlus пишет

а вот что значит строка

Строка добавляет новую кнопку, которая будет видна из
Вид – Панели инструментов – Настроить

label – подпись
oncommand – выполняемая команда

А код кнопки где именно прописывать? в скобках someJsFunc(); или вместо этой команды?

Если скрипт большой, он должен быть подключен с помощью тэга <script> и должен реализовывать некоторую внешнюю функцию, которая будет вызываться из oncommand.
Ну, и имена глобальных функций и переменных должны быть индивидуальными для каждого расширения – чтобы не было конфликтов.

То есть в <overlay> должен быть добавлен скрипт (возможно, путь к скрипту должен быть через chrome:// – давно не проверял, раньше, вроде, можно было указывать относительный путь):

Выделить код

Код:

<?xml version="1.0"?>
<overlay xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
	<script type="application/x-javascript" src="cbToExt.js" />
	<toolbarpalette id="BrowserToolbarPalette">
		<toolbarbutton id="qickBookmarksButton" label="Qick Bookmarks" oncommand="qickBookmarks.command();" />
	</toolbarpalette>
</overlay>

В скрипте должно быть что-то вроде

Выделить код

Код:

var qickBookmarks = {
	buttonId: "qickBookmarksButton",
	initialized: false,
	init: function() {
		window.removeEventListener("load", this, false);
		if(this.initialized || !this.button)
			return;
		this.cbInit.call(this.button);
		this.initialized = true;
	},
	command: function() {
		if(!this.initialized)
			this.init();
		this.cbCode.call(this.button);
	},
	cbCode: function() {
		/*CODE*/
	},
	cbInit: function() {
		/*Initialization Code*/
	},
	get button() {
		var button = document.getElementById(this.buttonId);
		if(!button)
			return null;
		delete this.button;
		return this.button = button;
	},
	handleEvent: function(e) {
		switch(e.type) {
			case "load": this.init(e); break;
		}
	}
};
window.addEventListener("load", qickBookmarks, false);

Правда, по-хорошему надо бы посмотреть, как там все запускается в Custom Buttons. =)

P.S. Работоспособность не проверял.

21-07-2009 20:35:09
P.P.S. Там потом еще будет ругаться на

Выделить код

Код:

custombuttons. writeFile (path, xmenu);

Пояснения.

Выделить код

Код:

var qickBookmarks = { ... }

– удобно для того, чтобы глобальные переменные не пересекались с другими расширениями.

Выделить код

Код:

window.addEventListener("load", qickBookmarks, false);

– добавляет обработчик события "load" окна браузера (до полной загрузки нельзя обратиться к элементам интерфейса – их еще нету).

Выделить код

Код:

handleEvent: function(e) { ... }

– метод объекта qickBookmarks, который будет вызван при наступлении события "load".

Всёравно не пашет =(

Najlus пишет

Всёравно не пашет =(

А консоль ошибок на что?

В том и дело, что не хватает реализации

Выделить код

Код:

custombuttons. writeFile (path, xmenu);

Остальное должно работать, если заменить

Выделить код

Код:

cbCode: function() {
        /*CODE*/
    },
    cbInit: function() {
        /*Initialization Code*/
    },

соответствующими скриптами из кода исходной кнопки.

Так что сначала нужно сделать, чтобы ругалось только на отсутствующее API Custom Buttons (т.е. чтобы работало только при включении Custom Buttons).

Как-то так:
qick_bookmarks-0.1.1dev-fx.xpi [8,0 Кбайт] (без jar-архива)
qick_bookmarks-0.1.1-fx.xpi [6,1 Кбайт]