Напишите пожалуйста как можно создать кнопки к пункту "настроить" какого нибудь расширения, и пунктам меню.

кнопки можно создавать через custom buttons или custom buttons 2, спросите в соответствующем топике.

А есть какогй нибудь мануал по написанию различных кнопок в custom buttons?

http://forum.mozilla-russia.org/viewtop … 00#p304200

Точнее, есть различные материалы по JavaScript, есть https://developer.mozilla.org/ (в основном на английском, хотя есть и https://developer.mozilla.org/ru).
И есть DOM Inspector, позволяющий посмотреть, как сделан тот или иной элемент самого Firefox или какого-нибудь расширения.
Ну, и исходный код Firefox тоже есть (довольно существенная часть там как раз на JavaScript).

А чтобы конкретно и про кнопки – такого нету.

Najlus

Напишите пожалуйста как можно создать кнопки к пункту "настроить" какого нибудь расширения, и пунктам меню.

Мне проще код написать, чем объяснить.
Если надо открыть диалог настроек какого-нибудь расширения, который обычно открывается через "Инструменты" -> "Дополнения" -> "Настройки", то вот код:

Выделить код

Код:

var extname = "Custom Buttons";
var em = Components. classes ["@mozilla.org/extensions/manager;1"]. getService (Components. interfaces. nsIExtensionManager);
var exts = em. getItemList (Components. interfaces. nsIUpdateItem. TYPE_EXTENSION, {});
for (var i = 0; i < exts. length; i++)
{
	if (exts [i]. name == extname)
	{
		var rs = Components. classes ["@mozilla.org/rdf/rdf-service;1"].
			 getService (Components. interfaces. nsIRDFService);
		var res = rs. GetResource ("urn:mozilla:item:" + exts [i]. id);
		var ds = em. datasource;
		var res2 = rs. GetResource ("http://www.mozilla.org/2004/em-rdf#optionsURL");
		var t = ds. GetTarget (res, res2, true);
		if (t instanceof Components. interfaces. nsIRDFLiteral)
			openOptionsDialog (t. Value);
	}
}
function openOptionsDialog (optionsURL)
{
	var windows = Components. classes ['@mozilla.org/appshell/window-mediator;1'].
				  getService (Components. interfaces. nsIWindowMediator).
				  getEnumerator (null);
	while (windows. hasMoreElements ())
	{
		var win = windows. getNext ();
		if (win. document. documentURI == optionsURL)
		{
			win. focus ();
			return;
		}
	}
	
	var features;
	try
	{
		var instantApply = custombuttonsUtils. getPrefs ("browser.preferences.instantApply");
		features = "chrome,titlebar,toolbar,centerscreen" + (instantApply? ",dialog=no": ",modal");
	}
	catch (e)
	{
		features = "chrome,titlebar,toolbar,centerscreen,modal";
	}
	openDialog(optionsURL, "", features);
}

В первой строке надо заменить "Custom Buttons" на название нужного расширения. Например:

Выделить код

Код:

var extname = "Adblock Plus";

Что касается пунктов меню, тут всё зависит от конкретного случая. Можно попробовать

Выделить код

Код:

document. getElementsByAttribute ("label", "Дополнения") [0]. doCommand ();

или

Выделить код

Код:

document. getElementsByAttribute ("label", "Дополнения") [0]. click ();

где "Дополнения" надо заменить на название соответствующего пункта меню.

В моей сборке использована кнопка для быстрого доступа к настройкам каждого расширения правым кликом по кнопке дополнений (cкриншот). При левом клике окно дополнений открывается в боковухе, при среднем клике - в новой вкладке (Исходник кнопки брал вроде с сайта CustomButtons2).

Код кнопки (вставить в поле "Инициализация"):

Выделить код

Код:

this.url2xul= 'chrome://mozapps/content/extensions/extensions.xul';
this.onClick= function(e)
{
	switch (e.button)
	{
		case 0: 
			openWebPanel(this.tooltipText, this.url2xul); 
			break;
		case 1: 
		{
			var t= gBrowser.mTabs;
			var current= content.document.location.href;
			var i= t.length;
			if (current==this.url2xul) gBrowser.removeCurrentTab(); 
			else while (true)
			{
				if (--i<0) 
				{
					if (current=='about:blank') // replace blank tab
						loadURI(this.url2xul);
					else // add new tab 
						gBrowser.selectedTab= gBrowser.addTab(this.url2xul); 
					break;
				};
				if (t[i].linkedBrowser.currentURI.spec==this.url2xul) // popup loaded
				{
					gBrowser.selectedTab= gBrowser.tabContainer.childNodes[i]; 
					break;
				};
			};
		}; break;
	};
};
this.setAttribute('onclick','this.onClick(event);');

const Cb = custombuttons;
const EXTENSION = Ci.nsIUpdateItem.TYPE_EXTENSION;

function prop( aElement, aString ) {
  var emRDF = "http://www.mozilla.org/2004/em-rdf#";
  var arc = RDFService.GetResource(emRDF+ aString);
  var target = extensionDS.GetTarget(aElement, arc, true);
  if(target instanceof Ci.nsIRDFLiteral) return target.Value;
  if(target instanceof Ci.nsIRDFInt) return target.Value;
  return null;
}

var cloneCBcontext = {
  cloneItems: function(aNode, aID, aSeparate) {
    var menupopup = document.getElementById(aID).cloneNode(true);
    var menuitems = menupopup.childNodes.length;
    for(var i = 0; i < menuitems; i++)
      aNode.appendChild(menupopup.firstChild);
    if(aSeparate)
      aNode.appendChild(document.createElement("menuseparator"));
  },
  makeMenu: function(aNode) {
    var m = aNode.appendChild(document.createElement("menu"));
    m.setAttribute("label", "Custom Button");
    m.setAttribute("oncommand", "event.stopPropagation()");
    var mp = m.appendChild(document.createElement("menupopup"));
    cloneCBcontext.cloneItems(mp, "custombuttons-contextpopup");
    aNode.insertBefore(document.createElement("menuseparator"), m);
  }
}




const popupID = "cbContext-extensionsButton";

var test = document.getElementById(popupID);
if(test) test.parentNode.removeChild(test);

var main = document.getElementById("mainPopupSet");
var cPopup = main.appendChild(document.createElement("popup"));
cPopup.id = popupID;
cPopup.setAttribute("oncommand",
  "event.stopPropagation(); document.popupNode.openPrefs(event);")



var RDFService  = Cc["@mozilla.org/rdf/rdf-service;1"].getService(Ci.nsIRDFService);
var Container   = Cc["@mozilla.org/rdf/container;1"].getService(Ci.nsIRDFContainer);
var extensionDS = Cc["@mozilla.org/extensions/manager;1"].getService(Ci.nsIExtensionManager).datasource;

var root;
try {
  root = RDFService.GetResource("urn:mozilla:item:root");
} catch(err) {
  root = RDFService.GetResource("urn:mozilla:extension:root");
}

Container.Init(extensionDS,root);

var elements = Container.GetElements();
var extensionArray = [];
var i = -1;
while(elements.hasMoreElements()) {
  i++;
  var element=elements.getNext();
  element.QueryInterface(Components.interfaces.nsIRDFResource);
  var prop_OptionsURL = prop(element, "optionsURL");
  if(prop(element, "type") == EXTENSION &&  prop_OptionsURL) {
    var prop_name = prop(element, "name");
    extensionArray[i] = [];
    extensionArray[i] [0] = prop_name.charAt(0).toUpperCase() + prop_name.substr(1);
    extensionArray[i] [1] = prop_OptionsURL;
    extensionArray[i] [2] = prop(element, "userDisabled");
    extensionArray[i] [3] = prop(element, "version");
    extensionArray[i] [4] = prop(element, "iconURL");
    if(!extensionArray[i] [4])
      extensionArray[i] [4] = "chrome://mozapps/skin/xpinstall/xpinstallItemGeneric.png";
  }
}

extensionArray.sort();

var features = "chrome, dialog = 0, resizable, titlebar, toolbar, centerscreen";

var extCommand = "window.openDialog('ZZZ', '', '" + features + "');";

for(var i = 0; i < extensionArray.length; i++) {
  var extArray = extensionArray[i];
  try {
    var mItem = document.createElement("menuitem");
    mItem.setAttribute("label", extArray[0] + " " + extArray[3]);
    if(extArray[4]) {
      mItem.setAttribute("class", "menuitem-iconic bookmark-item");
      mItem.setAttribute("image", extArray[4]);
    }
    if(extArray[1])
      mItem.setAttribute("oncommand", extCommand.replace("ZZZ", extArray[1]));
    if(extArray[2]) mItem.setAttribute("disabled", true);
    cPopup.appendChild(mItem);
  } catch(e) {
  }
}

cloneCBcontext.makeMenu(cPopup);
this.setAttribute("context", popupID);

if(typeof Local_Install != "object") return;

var test = document.getElementById("cbContext-extensions");
if(test) test.parentNode.removeChild(test);

var cbPopup = document.getElementById("custombuttons-contextpopup-subCall").cloneNode(true); // Cb context

// var subPopup = document.createElement("menupopup");

// subPopup.appendChild(cbPopup);
// subPopup.appendChild(cbPopup.lastChild);

var subMenu = document.createElement("menu");
subMenu.setAttribute("label", "Custom Button");
subMenu.setAttribute("image", Cb.defaultImg() );
subMenu.appendChild(cbPopup.lastChild);

var extensionsPopup = document.getElementById("emb-context");
var popup = extensionsPopup.cloneNode(true);
popup.id = "cbContext-extensions";
popup.appendChild(document.createElement("menuseparator"));
popup.appendChild(subMenu);
//popup.appendChild(subPopup);

extensionsPopup.parentNode.appendChild(popup);

this.setAttribute("context", popup.id);
this.onclick = function(aEvent) {
  if(aEvent.button === 1) gBrowser.selectedTab = gBrowser.addTab('chrome://mozapps/content/extensions/extensions.xul?type=extensions');
}

this.style.opacity = '.65';
this.setAttribute( 'onmouseover', 'custombuttons.ButtonBrt(event);' );
this.setAttribute(  'onmouseout', 'custombuttons.ButtonDim(event);' );

А возможно ли получить быстрый доступ к настройкам из about:config (то есть, менять, нажимая на кнопку) через это расширение?

MySh пишет

А возможно ли получить быстрый доступ к настройкам из about:config (то есть, менять, нажимая на кнопку) через это расширение?

Менять настройки можно, вот пример: http://forum.mozilla-russia.org/viewtopic.php?pid=308700#p308700

А как прописать кнопки зарытия, свёртывания и развёртывания(полный экран)?

Najlus пишет

А как прописать кнопки

зарытия

Выделить код

Код:

close ();

свёртывания

Выделить код

Код:

minimize ();

развёртывания

Выделить код

Код:

maximize ();

(полный экран)

Выделить код

Код:

fullScreen = true;

Спасибо большое

Сори что опять надоедаю *виновато улыбается* а как отключить кнопку изменения размера окна внизу слева (в статусбаре), а ещё желательнее убрать совсем.
ЗЫ Organize StatusBar такого сделать не может

Najlus пишет

а как отключить кнопку изменения размера окна внизу слева (в статусбаре), а ещё желательнее убрать совсем.

Слева ли? =)
userChrome.css:

Выделить код

Код:

statusbar > .statusbar-resizerpanel {
  display: none !important;
}
Infocatcher пишет

Слева ли? =)

сори =) сёдня практика была =) а за код спасибо.
ЗЫ его можно просто в stylish использовать =)

Anton

Менять настройки можно, вот пример: http://forum.mozilla-russia.org/viewtopic.php?pid=308700#p308700

Спасибо, как раз то, что надо.

Najlus пишет

ЗЫ его можно просто в stylish использовать =)

Угу, но тогда лучше добавить в начало

Выделить код

Код:

@namespace url(http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul);

а что оно даёт?

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

Najlus пишет

а что оно даёт?

Это нечто вроде области применения.

Можно сравнить

Выделить код

Код:

@namespace url(http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul);
* { color: red !important; }

и

Выделить код

Код:

* { color: red !important; }

в Stylish.

wolwerine пишет

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

Возможно.
Код примерно такой:

Выделить код

Код:

var toolbarName = "Панель навигации";
var toolbar = document. getElementsByAttribute ("toolbarname", toolbarName) [0];
toolbar. collapsed = !toolbar. collapsed;
document. persist (toolbar. id, "collapsed");

где "Панель навигации" надо заменить на название нужной панели инструментов.

понятно, спасибо. а есть какой нибудь мануал на русском по about:config?
И как можно удалить ненужные кнопки при вборе пункта "настройка" в контекстном меню тулбаров. если никак то напишите пожалуйста коды кнопок перезагрузки браузера, открытия менеджера дополнений, открытия about:config в новой вкладке и https://addons.mozilla.org/ru/firefox/.
И можно ли как нибудь убрать windows'овскую рамку вокруг браузера?

Najlus пишет

есть какой нибудь мануал на русском по about:config?

Наверху есть ссылка "MozUtil". Где-то там

И как можно удалить ненужные кнопки при вборе пункта "настройка" в контекстном меню тулбаров. если никак то

Интересная логика : )

Выделить код

Код:

menuitem[label="Панель навигации"]
{
	display: none !important;
}

в userChrome.css

ЭЭЭ а что делает этот код? я чёто разобраться немогу

Удаляет "...ненужные кнопки при вборе пункта "настройка" в контекстном меню тулбаров.".

ничего он не удаляет

А Вы куда код прописываете-то?

в stylish. возможно мою просьбу не так поняли...

Najlus пишет

возможно мою просьбу не так поняли...

Надо изложить чётче, что требуется.
Какие кнопки надо удалить - те, что в диалоге "Настройка панелей инструментов" ? Какие именно из них ?

Использую расширение toolbar buttons, а точнее лишь несколько кнопок из него, причем неиспользуемые кнопки висят в этом диалоговом окне мёртвым грузом и затрудняют поиск нужной кнопки (например с вновь установленного дополнения)

Najlus пишет

Использую расширение toolbar buttons, а точнее лишь несколько кнопок из него, причем неиспользуемые кнопки висят в этом диалоговом окне мёртвым грузом и затрудняют поиск нужной кнопки (например с вновь установленного дополнения)

Должна помочь вот эта: http://codefisher.org/toolbar_button/toolbar_button_maker страница

Еще вот такой стиль может пригодиться:

Выделить код

Код:

/*** Настройка панелей инструментов ***/
/* Зеленый фон при наведении на элементы, которые можно перетащить (очень удобно хватать разделители) */
toolbarpaletteitem[place="toolbar"]:hover, toolbarpaletteitem[place="palette"]:hover {
	background-color: #cfc !important;
}

/* Компактный вид списка доступных кнопок */
/* Основано на http://userstyles.org/styles/547 */
/* allow any number of columns in Customize Toolbar box */
#palette-box {
	float: left !important;
	overflow-x: hidden !important;
}
#palette-box .paletteRow {
	display: inline !important;
}
#palette-box toolbarpaletteitem {
	display: inline !important;
	margin: 0 !important;
	padding: 8px !important;
}

#palette-box toolbarpaletteitem > hbox,
#palette-box toolbarpaletteitem label {
	display: inline !important;
}

/* fix separator */
#wrapper-separator #separator {
	display: inline !important;
	font-size: 40px !important;
}

/* make all buttons' text be on the bottom - thanks Grist! */
#palette-box toolbarpaletteitem toolbarbutton {
	-moz-box-orient: vertical !important;
	text-align: center !important;
}

А как сделать чтобы лис при нажатии на кнопку открывал вебсайт, и как сделать кнопку для перезагрузки лиса?

Najlus пишет

А как сделать чтобы лис при нажатии на кнопку открывал вебсайт

Может проще на панели закладок разместить нужную?!!

может и проще, но не то

Najlus

А как сделать чтобы лис при нажатии на кнопку открывал вебсайт

http://codefisher.org/toolbar_button/link-button-maker

как сделать кнопку для перезагрузки лиса?

http://codefisher.org/toolbar_button/to … flag=ru-RU

Это если не заморачиваться с Custom Buttons.

Sid пишет

http://codefisher.org/toolbar_button/link-button-maker

"Несовместимо с Mozilla Firefox 3.0.10"
Хотя в установщике (файл дополнения) прописано что версия браузера подходит подходит...

Najlus пишет

"Несовместимо с Mozilla Firefox 3.0.10"

Скорее всего, xpi скачался не полностью.
На крайний случай код для Custom Buttons:

Выделить код

Код:

this. url = "http://ya.ru";
this. onclick = function (event)
{
	if (event. button != 2)
		openUILink (this. url, event);
}

в раздел "Инициализация".

Спасибо =) именно это мне и нужно было
А что нужно прописать чтобы сайт открывался в новой вкладке?

Выделить код

Код:

getBrowser (). addTab ("http://ya.ru");

или

Выделить код

Код:

getBrowser (). selectedTab = getBrowser (). addTab ("http://ya.ru")

или

Выделить код

Код:

openUILinkIn ("http://ya.ru", "tab"); // ..., "tabshifted");

А зачем тот код надо было прописывать в инициализации? всё работает только при getBrowser (). selectedTab = getBrowser (). addTab ("http://ya.ru") в коде кнопки

Najlus пишет

А зачем тот код надо было прописывать в инициализации?

А тогда кнопка работает почти как закладка. По левой кнопке открывает в текущем табе, по средней - в новом.

Najlus пишет

всё работает только при getBrowser (). selectedTab = getBrowser (). addTab ("http://ya.ru") в коде кнопки

Неверно. Всё работает не только при при "getBrowser (). selectedTab...".

Да я имею ввиду что достаточно только этой строки чтобы кнопка работала

Anton пишет

"Панель навигации" надо заменить на название нужной панели инструментов.

ага, помогло. ипользовал Custom Buttons² v3.0.0.
иконку сделал 32х32 - тоже выглядит как надо.

А что нужно прописать для обновления всех открытых вкладок?

Najlus пишет

А что нужно прописать для обновления всех открытых вкладок?

Выделить код

Код:

gBrowser.reloadAllTabs(gBrowser.mCurrentTab);

Спасибо

А можно ли как нибудь сделать так, чтобы он не обновлял FastDial ( chrome://fastdial/content/fastdial.html )

Использую Reload Every - настройка автообновления выбранных вкладок через заданные промежутки времени. Очень удобно. Для каждой вкладки установил свой период обновления от 1 до 15 минут. На Fast Dial и GMail - отключил.

Не, автообновление это не то, мне нужно самому запускать процесс

Najlus пишет

А можно ли как нибудь сделать так, чтобы он не обновлял FastDial ( chrome://fastdial/content/fastdial.html )

Примерно так:

Выделить код

Код:

var notReload = ["chrome://fastdial/content/fastdial.html"];

var nl = notReload.length;
var curBr = gBrowser.mCurrentTab.linkedBrowser;
reloadBrowser(curBr);

var brs = gBrowser.browsers, br;
for(var i = 0, len = brs.length; i < len; i++) {
	br = brs[i];
	if(br != curBr)
		reloadBrowser(br);
}

function reloadBrowser(br) {
	if(canReload(br.currentURI.spec))
		br.reload();
}
function canReload(uri) {
	uri = uri.toLowerCase();
	for(var i = 0; i < nl; i++)
		if(uri.indexOf(notReload[i]) == 0)
			return false;
	return true;
}

Пример:
var notReload = ["chrome://fastdial/content/fastdial.html", "http://forum.mozilla-russia.org/viewtopic.php?"];
Если начало адреса совпадает с одной из строк, то эта вкладка обновлена не будет.

спасибо =) а на каком языке всё это пишется?

Najlus пишет

а на каком языке всё это пишется?

На русском.

Я имею ввиду язык программирования, и Русским там и не попахивает.

JavaScript

А где можно найти список компонент с свойствами?

Najlus пишет

А где можно найти список компонент с свойствами?

Сложно ответить на такой сильно общий вопрос. "Компоненты" разные бывают.
В общем, нельзя ли поконкретней ?

я имею ввиду список компонент с свойствами Firefox =)

Najlus пишет

я имею ввиду список компонент с свойствами Firefox =)

Что Вы понимаете под "компонентой" и далее, "компонентой со свойствами Firefox" ?

ну к примеру адрес текущего таба (вроде бы): gBrowser.mCurrentTab.linkedBrowser. есть где нибудь спсок, где прописаны эти своего рода "адреса" (эт очень буквально я так назвал)

Najlus пишет

есть где нибудь спсок, где прописаны эти своего рода "адреса"

Вряд ли есть такие списки.
Все эти переменные и свойства объектов определяются в js или xml файлах браузера.
Часть свойств, конечно, документирована, например свойства элементов управления, некоторых программных объектов.
Но для приведенного примера (gBrowser.mCurrentTab...) такая документация не очень полезна.

слышал что существует какойто DOM inspektor, а он с чем работает?

Najlus

DOM
DOM Inspector :)

Для чего нужен DOM так и не понял, а зачем ссылка на расширение?

...а зачем ссылка на расширение?

Najlus
так потому что это он самый и есть ;)

слышал что существует какойто DOM inspektor

Для чего нужен DOM так и не понял...

ну я тоже не особо разобрался, там для много чего .....:whistle::angel:

Крошка Ру пишет

так потому что это он самый и есть ;)

Да знаю я что есть =) только зачем именно он понять не могу

Najlus

ну вот пример > пост № 710 :)

Ну кажись примерно понял зачем этот DOM inspektor