Полезная информация

Список ответов на каверзные вопросы можно получить в FAQ-разделе форума.

№485117-09-2012 14:03:51

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2252
UA: Firefox 11.0

Re: Custom Buttons

okkamas_knife

«бдыщ» - ржака! :lol: Слушал несколько деятков раз,
особенный прикол - если её быстро нажать раз 7 подряд :lol:

Отсутствует

 

№485217-09-2012 15:48:23

Kamui
Участник
 
Группа: Members
Зарегистрирован: 31-03-2011
Сообщений: 1796
UA: Firefox 16.0

Re: Custom Buttons

bunda1
Здесь ты мне дал код, который ищет выделенный текст в активной/фоновой вкладке, все ищет нормально, но как оказалось вкладки с поиском открываются справа от всех вкладок, а не от текущей, как например открываются ссылки или картинки с помощью драг-жестов. Уточню, стоит TU и там настроено открытие ссылок справа от текущей страницы. И еще из-за этого получается что страницы с поиском не автогруппируются в стэк, как например открытые в новых вкладках ссылки или изображения. Можно как-то исправить?

Отсутствует

 

№485317-09-2012 18:48:26

bunda1
Moderator
 
Группа: Moderators
Откуда: Латвия
Зарегистрирован: 09-02-2010
Сообщений: 4811
UA: Firefox 3.6

Re: Custom Buttons

Kamui

Выделить код

Код:

{dir:'UD', modifier:'',name:'Поиск текста в google в новой активной странице',obj:'text',cmd:function(self,event,info){ var x = gBrowser.mCurrentTab._tPos +1; gBrowser.moveTabTo(gBrowser.selectedTab = gBrowser.addTab("http://www.google.com/search?q=" + document.commandDispatcher.focusedWindow.getSelection()), x) }},
{dir:'DU', modifier:'',name:'Поиск текста в google в новой фоновой странице',obj:'text',cmd:function(self,event,info){ gBrowser.moveTabTo(gBrowser.addTab("http://www.google.com/search?q=" + document.commandDispatcher.focusedWindow.getSelection()), gBrowser.mCurrentTab._tPos +1) }},

Отсутствует

 

№485417-09-2012 19:31:39

Infocatcher
Not found
 
Группа: Extensions
Зарегистрирован: 24-05-2007
Сообщений: 4339
UA: Firefox 15.0

Re: Custom Buttons

bunda1
Лень проверять, как ведет себя с расширениями, но встроенная настройка browser.tabs.insertRelatedAfterCurrent отрабатывает при передаче aReferrerURI в

Выделить код

Код:

<method name="addTab">
        <parameter name="aURI"/>
        <parameter name="aReferrerURI"/>
        <parameter name="aCharset"/>
        <parameter name="aPostData"/>
        <parameter name="aOwner"/>
        <parameter name="aAllowThirdPartyFixup"/>

(см. chrome://browser/content/tabbrowser.xml)
То есть можно вот так:

Выделить код

Код:

gBrowser.selectedTab = gBrowser.addTab(
    "http://www.google.com/search?q=" + encodeURIComponent(document.commandDispatcher.focusedWindow.getSelection()),
    makeURI("http://www.google.com/") // aReferrerURI
);

Добавлено 17-09-2012 19:35:08
Еще можно для Tree Style Tab добавить:

Выделить код

Код:

if("TreeStyleTabService" in window)
    TreeStyleTabService.readyToOpenChildTab(gBrowser.selectedTab);
gBrowser.selectedTab = gBrowser.addTab(
    "http://www.google.com/search?q=" + encodeURIComponent(document.commandDispatcher.focusedWindow.getSelection()),
    makeURI("http://www.google.com/") // aReferrerURI
);

Отредактировано Infocatcher (17-09-2012 19:35:08)


Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела

Отсутствует

 

№485517-09-2012 19:40:18

Kamui
Участник
 
Группа: Members
Зарегистрирован: 31-03-2011
Сообщений: 1796
UA: Firefox 16.0

Re: Custom Buttons

bunda1
Так работает, но не полностью как надо :( когда вкладка стоит одна или она крайняя в стэке, то при открытии стэк не создается.

Попробовал сделать как написал Infocatcher, вроде работает, но не уверен все ли я правильно вставил :)
Вставил так:

Выделить код

Код:

{dir:'U', modifier:'',name:'Поиск текста в google в новой активной странице',obj:'text',cmd:function(self,event,info){gBrowser.selectedTab = gBrowser.addTab(
    "http://www.google.com/search?q=" + encodeURIComponent(document.commandDispatcher.focusedWindow.getSelection()),
    makeURI("http://www.google.com/") // aReferrerURI
); }},

и

Выделить код

Код:

{dir:'D', modifier:'',name:'Поиск текста в google в новой фоновой странице',obj:'text',cmd:function(self,event,info){gBrowser.addTab(
    "http://www.google.com/search?q=" + encodeURIComponent(document.commandDispatcher.focusedWindow.getSelection()),
    makeURI("http://www.google.com/") // aReferrerURI
);}},

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

Попробовал, вроде ничего не сломалось и теперь работает как надо :D спасибо Infocatcher и bunda1!
Теперь еще маленькая просьба, нужен код для такого же поиска, но в текущей вкладке :blush:

Отредактировано Kamui (17-09-2012 19:51:23)

Отсутствует

 

№485617-09-2012 20:24:37

bunda1
Moderator
 
Группа: Moderators
Откуда: Латвия
Зарегистрирован: 09-02-2010
Сообщений: 4811
UA: Firefox 3.6

Re: Custom Buttons

Infocatcher
Спасыбо :)

Kamui

Выделить код

Код:

{dir:'DUD', modifier:'',name:'Поиск текста',obj:'text',cmd:function(self,event,info){ loadURI("http://www.google.com/search?q=" + document.commandDispatcher.focusedWindow.getSelection()) }},

Отсутствует

 

№485717-09-2012 20:58:46

Kamui
Участник
 
Группа: Members
Зарегистрирован: 31-03-2011
Сообщений: 1796
UA: Firefox 16.0

Re: Custom Buttons

bunda1
В очередной раз огромное спасибо!;)
Вопросик небольшой: encodeURIComponent обязателен? Просто в коде Infocatcher'а он присутствует, а у тебя нет.

Отсутствует

 

№485817-09-2012 21:09:06

bunda1
Moderator
 
Группа: Moderators
Откуда: Латвия
Зарегистрирован: 09-02-2010
Сообщений: 4811
UA: Firefox 3.6

Re: Custom Buttons

Лучше с encodeURIComponent

Отсутствует

 

№485918-09-2012 09:29:12

Infocatcher
Not found
 
Группа: Extensions
Зарегистрирован: 24-05-2007
Сообщений: 4339
UA: Firefox 15.0

Re: Custom Buttons

okkamas_knife пишет

может в СМ както по другому надо окно открывать чтоб панели  скрыты были и кнопки не обрабатывалсь?

Очевидно, можно открыть не chrome://browser/content/browser.xul (chrome://navigator/content/navigator.xul), а свое окно.

Например, так:

Выделить код

Код:

var uri = "http://translate.google.com/translate?sl=auto&tl=en&ie=UTF-8&u=http%3A%2F%2Fforum.mozilla-russia.org%2Fviewtopic.php%3Fpid%3D582337%23p582337";
var winSrc = '\
    <?xml version="1.0"?>\n\
    <?xml-stylesheet href="chrome://global/skin/" type="text/css"?>\n\
    <window xmlns="' + xulns + '"\n\
        title="Title"\n\
        width="400"\n\
        height="350">\n\
        <browser type="content" flex="1" src="' + encodeHTML(uri) + '" />\n\
    </window>';
window.openDialog(
    "data:application/vnd.mozilla.xul+xml," + encodeURIComponent(winSrc.trimLeft()),
    "_blank",
    "chrome,resizable,centerscreen,location=0"
);
function encodeHTML(s) {
    return s
        .replace(/&/g, "&amp;")
        .replace(/</g, "&lt;")
        .replace(/>/g, "&gt;")
        .replace(/"/g, "&quot;");
}

Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела

Отсутствует

 

№486018-09-2012 19:23:51

Andrey_Krropotkin
Участник
 
Группа: Members
Зарегистрирован: 11-11-2011
Сообщений: 484
UA: Firefox 15.0

Re: Custom Buttons

Подскажите как можно оптимизировать этот код:

скрытый текст

Выделить код

Код:

/*Initialization code*/
var prefBranch = Components.classes["@mozilla.org/preferences-service;1"].
  getService(Components.interfaces.nsIPrefBranch);
var pref = new Object();
Components.utils.import("resource://gre/modules/AddonManager.jsm");
//вписываем название джетпаков
pref["Adblock Plus"] = "Jetpacks";
pref["Config Descriptions"] = "Jetpacks1";
pref["Enjoy Reading"] = "Jetpacks2";

var strEnable = "Jetpack включен";
var strDisable = "Jetpack выключен";
var imgEnable = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAltJREFUOMtt0l9olXUcx/HX8zzThHh07cLQJSZoozXNONMonYxI6zhwhnVnGQldqASZKN50USgWE0ThgCEiZV2JyNDpEnXMLhbuNBC7SOnfVHQj5p/Hmmw+53hxzo7T9bv5Xfy+78/v8/1+P4EnT7NqvIOMVEYkRF6q16hjegxBsVgMgiAoBk/AWRyQminyf2cguzi7veOrjg+xBD8H4+Cd2A7xNJLZxDUkMISrTH8QO7e3R/3z9TCKVSWBJitEOsFC1BOXpZOyfhzFOptPeW3O6wqFgh9Of7/7/bc/2BJoVi11CbVewXziMhiX4SSkY/lx2VktYOOejXJHcwOmeKlKqkWk1jTiholNJ/iu6VAF/iL/uVx3jsiz7lsdlqdNLcaNdMxF2+Jd1s5bB/Zd2qOt70tmVcoyoUijiPq6F7SvPGNp7fLK69b5m322YBs4fOVbn/R8WppJTbkgkqmSKsD+1gOWzmwyMDzgp+unrZm71q5X28Dxv9tt6N70uLsUkUIo0iuiMFIADc80aH7uLd8sOygQ6L7RZf3ZVoqJeAweqmjlSynDyH+joK76RUdWtJsUTvLLP3nvda4ynD5aJ6VMPBL41wmp/puDN0FVWGVyONnlO79pPbXS8IOkYhuSX3EL3JA6Frrgrsj6vit9Fdlr967KnnzTnfuDkrEwFUgu4iJK/X/svFulxP/lj5qG6hkL5r7c2D/Yb82Od12+9runUkYS/MnIhbL1IkJf65Lz+ObR5A0cFJld/kXlhtR1fOS8H8eQYEL0FpnqaS3IoBGhVK9IHid0uT2+/CEAYcfQrHKJYQAAAABJRU5ErkJggg==";
var imgDisable = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAeJJREFUOMudk81qU1EUhb+7krYZaIkUhQQcqLVG30BKCyoOOtFROgiJZuxTXF/CcaEhhtyROCoO/C19BNOgM0mgk6IpGNN713WQUKMVU1yjczjrfJyz914Bf6hef5wbDn/clFTAFJVVAPTiOO4lSdKJouj7tD+Y3lQqletID7DPAwjwyakAjjLi5XajsX8KUK1W7xmvYTD0wR2hHgjjonAJVJjY95rN5s4JYHNz81o2m60BiWO/Kd0q7YZh6OnXhWGobvfTbfBdICNlnjca2/tBvV7PjYajJ4hF269brdZb/qFqpbpqfB84GgwGzzQajVaQFiUOkiT5wAwtryzvjb/IuXw+XxJQmJRqP4qiZBYgDENjdwDSlIKMixIEQabHGSWpB2DSooRSm/+SHaca00SaJMWzX3RxPBnqyXYfjKUb5XI5M7MGT0MBpQmor8PDwy7wFfvS3Nzc+ixA52NnVVJB0sCJO8G4t5WrhkeSbPv98XH8Lorav3WkXC5nFhZya3ayBmQcu9lqt7q/RrlSuWNYBwKkAxx34thfEGSz85eBEvbFiX232Wy+OhWmWq12JU3Th7bz0xHyZGX7mx2/aLfbn/+aRoCNjY2FpQtLK4gCdjE2QVb0YtPP5ea7W1tbw2n/Tyf84OJw4lGJAAAAAElFTkSuQmCC";
var menu = <menupopup
  xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
  onclick="this.parentNode.menuClick(event)"
  onpopupshowing="this.parentNode.popupShowing()">
     
    <menuitem
      class="menuitem-iconic"
      image={imgEnable}
      tooltiptext={strEnable}
      label="Adblock Plus"
      onclick={"document.getElementById('" + this.id + "').togglePreference(this.label)"}/>
    <menuitem
      class="menuitem-iconic"
      image={imgEnable}
      tooltiptext={strEnable}
      label="Config Descriptions"
      onclick={"document.getElementById('" + this.id + "').togglePreference(this.label)"}/>
     <menuitem
      class="menuitem-iconic"
      image={imgEnable}
      tooltiptext={strEnable}
      label="Enjoy Reading"
      onclick={"document.getElementById('" + this.id + "').togglePreference(this.label)"}/>
</menupopup>;

this.appendChild(custombuttonsUtils.makeXML(menu));
this.type = "menu";
this.orient = "horizontal";
this.menuClick = function(event) {
  event.preventDefault();
  event.stopPropagation();
  this.open = false;
}

//переключатель рисунков
this.popupShowing = function() {
  var nodeList = this.getElementsByTagName("menuitem");
  for (var i = 0; i < nodeList.length; i++) {
    var label = nodeList[i].getAttribute("label");
    if (label == "Config Descriptions" || label == "Adblock Plus" || label == "Enjoy Reading")  {
      if (prefBranch.getBoolPref(pref[label]) == true) {
        nodeList[i].setAttribute("image", imgEnable);
        nodeList[i].setAttribute("tooltiptext", strEnable);
      } else {
        nodeList[i].setAttribute("image", imgDisable);
        nodeList[i].setAttribute("tooltiptext", strDisable);
      }
      }
 } 
}

//переключатель джетпаков
this.togglePreference = function(label) {
if (label == "Adblock Plus" ) 
  {
        AddonManager.getAddonsByTypes(["extension"], function(addons) {
        for(var i = 0, l = addons.length; i < l; i++)
        if(addons[i].name == "Adblock Plus")
        {
        //Переключить джетпак
         addons[i].userDisabled = !addons[i].userDisabled;
                 
        //создаем параметр "Jetpacks"в about:config и переключаем настройки 
         custombuttons.setPrefs("Jetpacks", !addons [i]. userDisabled );
        }
          })
  }
  
if (label == "Config Descriptions" ) 
  {
        AddonManager.getAddonsByTypes(["extension"], function(addons) {
        for(var i = 0, l = addons.length; i < l; i++)
        if(addons[i].name == "Config Descriptions")
        {
        //Переключить джетпак
         addons[i].userDisabled = !addons[i].userDisabled;
                 
        //создаем параметр "Jetpacks1"в about:config и переключаем настройки 
         custombuttons.setPrefs("Jetpacks1", !addons [i]. userDisabled );
        }
        })
    }

if (label == "Enjoy Reading" ) 
    {
        AddonManager.getAddonsByTypes(["extension"], function(addons) {
        for(var i = 0, l = addons.length; i < l; i++)
        if(addons[i].name == "Enjoy Reading")
        {
        //Переключить джетпак
         addons[i].userDisabled = !addons[i].userDisabled;
                 
        //создаем параметр "Jetpacks2"в about:config и переключаем настройки 
         custombuttons.setPrefs("Jetpacks2", !addons [i]. userDisabled );
        }
        })
     }
}

Отредактировано Andrey_Krropotkin (18-09-2012 19:24:57)

Отсутствует

 

№486118-09-2012 20:39:12

bunda1
Moderator
 
Группа: Moderators
Откуда: Латвия
Зарегистрирован: 09-02-2010
Сообщений: 4811
UA: Firefox 3.6

Re: Custom Buttons

Andrey_Krropotkin пишет

Подскажите как можно оптимизировать этот код:

Самый простой вариант.

скрытый текст

Выделить код

Код:

var menu = <menupopup xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
            oncommand = "this.parentNode.toggleAddons(event.target.label)">

    <menuitem
    label = "Adblock Plus"
    type = "checkbox"/>
    
    <menuitem
    label = "Config Descriptions"
    type = "checkbox"/>
     
    <menuitem
    label="Enjoy Reading"
    type = "checkbox"/>
      
</menupopup>;
var bool = XML.prettyPrinting;
XML.prettyPrinting = false;
var el = new DOMParser().parseFromString(menu.toXMLString(), "application/xml").documentElement;
XML.prettyPrinting = bool;
this.appendChild(el);
this.type = "menu";
this.orient = "horizontal";


//переключатель джетпаков
this.toggleAddons = function(label) {
     AddonManager.getAddonsByTypes(["extension"], function(addons) {
     for( var i = 0, l = addons.length; i < l; i++)
          if ( addons[i].name == label ) addons[i].userDisabled = !addons[i].userDisabled;
     })
};


var nodeList = this.getElementsByTagName("menuitem");
AddonManager.getAddonsByTypes(["extension"], function(addons) {
for( var i = 0, l = addons.length; i < l; i++)
if ( !addons[i].userDisabled ) {
     var label = addons[i].name;
     if ( label == "Adblock Plus") nodeList[0].setAttribute("checked", true);
     if ( label == "Config Descriptions") nodeList[1].setAttribute("checked", true);
     if ( label == "Enjoy Reading") nodeList[2].setAttribute("checked", true);
          }
})

Отредактировано bunda1 (19-09-2012 00:28:15)

Отсутствует

 

№486218-09-2012 22:11:31

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2252
UA: Firefox 11.0

Re: Custom Buttons

bunda1

У меня и такое начало работает, промахнуться маловероятно, но ведь это всё равно - не строка :(

скрытый текст

Выделить код

Код:

var menu = <menupopup xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
            onclick="this.parentNode.toggleAddons(event.target.label)">
        
<menuitem label="Adblock Plus"/>
<menuitem label="Config Descriptions"/>
<menuitem label="Enjoy Reading"/>
    
</menupopup>;
 . . . . .

Отсутствует

 

№486318-09-2012 22:33:27

Infocatcher
Not found
 
Группа: Extensions
Зарегистрирован: 24-05-2007
Сообщений: 4339
UA: Firefox 15.0

Re: Custom Buttons

Пунктам меню лучше назначать oncommand а не onclick – тогда можно будет и нажатием Enter вызвать, и нажать левую кнопку мыши на меню, «дотащить» до нужного пункта и отпустить только на нем.


Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела

Отсутствует

 

№486418-09-2012 22:46:34

bunda1
Moderator
 
Группа: Moderators
Откуда: Латвия
Зарегистрирован: 09-02-2010
Сообщений: 4811
UA: Firefox 3.6

Re: Custom Buttons

Infocatcher пишет

Пунктам меню лучше назначать oncommand а не onclick – тогда можно будет и нажатием Enter вызвать, и нажать левую кнопку мыши на меню, «дотащить» до нужного пункта и отпустить только на нем.

Спасибо, я это не знал.

Как сделать что бы функция отдала addons[i].userDisabled

Выделить код

Код:

Services.console.logStringMessage('getEnable = ' + getEnable("Adblock Plus") );

function getEnable(label) {
      AddonManager.getAddonsByTypes(["extension"], function(addons) {
      for( var i = 0, l = addons.length; i < l; i++)
          if ( addons[i].name == label ) return addons[i].userDisabled;
      })
   
};

Добавлено 18-09-2012 22:55:13

Dumby пишет

bunda1
У меня и такое начало работает, промахнуться маловероятно, но ведь это всё равно - не строка :(

Да работает спасибо. Что-то я не догоняю, причем тут строка?

Отредактировано bunda1 (18-09-2012 22:55:13)

Отсутствует

 

№486518-09-2012 23:23:21

Infocatcher
Not found
 
Группа: Extensions
Зарегистрирован: 24-05-2007
Сообщений: 4339
UA: Firefox 15.0

Re: Custom Buttons

bunda1 пишет

Как сделать что бы функция отдала addons[i].userDisabled

Никак, это асинхронная функция.


Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела

Отсутствует

 

№486618-09-2012 23:29:12

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2252
UA: Firefox 11.0

Re: Custom Buttons

bunda1 пишет

Что-то я не догоняю, причем тут строка?

Э-э-э, ты посеял во мне сомнения :sick:, но посмотрел код Cookies Permissions (2012-08-17),
дак там XUL идёт именно строкой, полагаю - не просто так, всвязи с этим

Infocatcher,  пожалуйста, скажи, такая запись «не строкой» всё ещё deprecated,
это отключат, или я что-то не так понял (что весьма вероятно)...

Отсутствует

 

№486719-09-2012 00:03:06

Infocatcher
Not found
 
Группа: Extensions
Зарегистрирован: 24-05-2007
Сообщений: 4339
UA: Firefox 15.0

Re: Custom Buttons

Dumby пишет

такая запись «не строкой» всё ещё deprecated,
это отключат, или я что-то не так понял (что весьма вероятно)...

Тут ничего не поменялось. Возможность писать var xul = <menu>...</menu>; обещают отключить.
Более того, javascript.options.xml.content уже false в Nightly.

Не строкой можно через JXON, но там и парсер нужно самостоятельно делать, и все равно корявенько как-то смотрится.

Dumby пишет

дак там XUL идёт именно строкой, полагаю - не просто так, всвязи с этим

Да, все верно.


Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела

Отсутствует

 

№486819-09-2012 00:31:03

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2252
UA: Firefox 11.0

Re: Custom Buttons

Infocatcher

OK, огромное спасибо за подтверждение, все сомнения развеяны,
жаль конечно, что они так упорствуют, но и «строкой» вроде не сложно...
И ждём (не скоро) массового «обвала» разных кнопок  :|

Отсутствует

 

№486919-09-2012 15:42:58

Infocatcher
Not found
 
Группа: Extensions
Зарегистрирован: 24-05-2007
Сообщений: 4339
UA: Firefox 15.0

Re: Custom Buttons

okkamas_knife пишет

чтоб заранее подумать о замене.

Да там переписать не особо сложно. Только муторно – надо экранировать кавычки и обратные слэши и перекодировать специальные HTML/XML-символы.
И если пытаться автоматизировать, будет несколько избыточный код. :)

okkamas_knife пишет

(как я понял в СМ они тоже сдохнут,не?)

Движок-то тот же самый.
Но пока что в Nightly только для страниц отключили.


okkamas_knife пишет

насколько реально эту фичу засунуть в само дополнение СВ?

Написать на JavaScript парсер JavaScript? Это и нетривиально, и тормозить же будет.

okkamas_knife пишет

или соорудить какойто костыль которым можно легко исправить поломавшуюся кнопку.

Простой не получится, для простого нужен полноценный разбор синтаксиса.


Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела

Отсутствует

 

№487019-09-2012 18:28:46

bunda1
Moderator
 
Группа: Moderators
Откуда: Латвия
Зарегистрирован: 09-02-2010
Сообщений: 4811
UA: Firefox 3.6

Re: Custom Buttons

Infocatcher пишет

Тут ничего не поменялось. Возможность писать var xul = <menu>...</menu>; обещают отключить.
Более того, javascript.options.xml.content уже false в Nightly.

А такое меню будет работать?

скрытый текст

Выделить код

Код:

// Создать меню ............................................................................................
menuPopup = document.getElementById("mainPopupSet").appendChild(document.createElement("menupopup"));
menuPopup.setAttribute("id", "fileAndFolders-popup");
// добавляем массив с данными для создание меню ....
var lst = [
        {
          label:"Profile",
          image:"chrome://mozapps/skin/profile/profileicon.png",
          value:"ProfD", 
          command:OpenFirefoxFolder
        },
        { 
          label:"Firefox",
          image:"chrome://branding/content/icon16.png",
          value:"CurProcD",
          command:OpenFirefoxFolder
        },
        {
          label:"Download",
          image:"chrome://mozapps/skin/downloads/downloadIcon.png",
          command:OpenDownloadFolder
        },
        {
          label:"separator"
        },
        {
          label:"Extensions",
          image:"chrome://mozapps/skin/extensions/extensionGeneric-16.png",
          value:"ProfD,extensions", 
          command:OpenFirefoxFolder,
        }, 
        {
          label:"Custom buttons",
          image:"chrome://custombuttons/skin/cbicon.png",
          value:"ProfD,custombuttons", 
          command:OpenFirefoxFolder,
        },
        {
          label:"Bookmark backups",
          image:"chrome://custombuttons/skin/button.png",
          value:"ProfD,bookmarkbackups", 
          command:OpenFirefoxFolder,
        },
        {
          label:"Search plugins(default)",
          style:"list-style-image:url('chrome://global/skin/icons/Search-glass.png')!important; -moz-image-region: rect(0, 16px, 16px, 0) !important;",
          value:"CurProcD,searchplugins", 
          command:OpenFirefoxFolder,
        },
        {
          label:"Search plugins(user-defined)",
          style:"list-style-image:url('chrome://global/skin/icons/Search-glass.png')!important; -moz-image-region: rect(0, 16px, 16px, 0) !important;",
          value:"UsrSrchPlugns", 
          command:OpenFirefoxFolder,
        },
        {
          label:"separator"
        },
        {
          label:"Chrome",
          style:"list-style-image:url('chrome://global/skin/icons/folder-item.png')!important; -moz-image-region: rect(0, 32px, 16px, 16px) !important;",
          value:"UChrm", 
          command:OpenFirefoxFolder,
        },
        {
          label:"userChrome.css",
          style:"list-style-image:url('chrome://global/skin/icons/folder-item.png')!important; -moz-image-region: rect(0, 16px, 16px, 0) !important;",
          value:"ProfD,chrome,userChrome.css", 
          command:OpenFirefoxFolder,
        },
        {
          label:"userContent.css",
          style:"list-style-image:url('chrome://global/skin/icons/folder-item.png')!important; -moz-image-region: rect(0, 16px, 16px, 0) !important;",
          value:"ProfD,chrome,userContent.css",  
          command:OpenFirefoxFolder,
        },
        ];
// цикл по очереди добавляет из массива 'lst' нужные атрибуты к пунктам меню ....     
for( var i = 0, m; m = lst[i]; i++) {
     var menuItem = document.createElement("menuitem");
     menuItem.setAttribute("label", m.label);
     menuItem.setAttribute("class", "menuitem-iconic");
     if ("image" in m) menuItem.setAttribute("image", m.image);
     if ("style" in m) menuItem.setAttribute("style", m.style);
     if (m.label == "separator") menuItem = document.createElement("menuseparator");
     if ("value" in m) menuItem.setAttribute("value", m.value);
     menuItem.addEventListener("command", m.command, false);
     // не добавляете цекбоксы к пункту если уже добавлен "image" ....
     //if ("checked" in m) menuItem.setAttribute("type", "checkbox");
     //if ("checked" in m) menuItem.setAttribute("checked", m.checked);
     //menuItem.id = "menuItem-" + m.label.toString();
     menuPopup.appendChild(menuItem);
};

 

// Функция открывает папки и файлы Firefox, выбор завысит от параметра 'value' для функции ..................
function OpenFirefoxFolder(event) {
// получаем 'value' от нажатого пункта в меню ....
var menuitem = event.target;
var value = menuitem.getAttribute("value");

// создаем массив из слов в 'value' и получаем названия нужных папок и файлов .... 
var array = value.split(",");
var directory = array[0];
var folders = (array[1])? array[1]: false;
var file = (array[2])? array[2]: false;

// указать нужный каталог ....
var dir = Components.classes['@mozilla.org/file/directory_service;1']
                    .getService(Components.interfaces.nsIProperties)
                    .get(directory, Components.interfaces.nsILocalFile);
// указать нужную подпапку если она записана в 'value' ....                    
if (folders) dir.append( folders );

// указать нужный файл если он записан в 'value' и открыть файл ....
if (file) dir.append( file ), dir.launch();

// открыть папку если в 'value' не записан файл ....
if (dir.exists() && !file ) dir.reveal();
};



// Функция открывает папку загрузки Firefox если папка существует ...........................................
function OpenDownloadFolder() {
// получить папку загрузки из 'about:config' ....
var prefs = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService);
var dir = prefs.getComplexValue("browser.download.dir", Components.interfaces.nsISupportsString).data;
// открыть папку .... 
var local = Components.classes["@mozilla.org/file/local;1"]. createInstance(Components.interfaces.nsILocalFile);
local.initWithPath( dir );
local.launch();
};



// Настройка функций кликов мыши(Mouse Click settings) ......................................................
this.onclick = function(event) {
     // действие при клике ЛКМ .... 
     if ( event.button == 0 ) {
          // открыть меню ....
          document.getElementById("fileAndFolders-popup").showPopup(this, -1, -1, "popup", "bottomleft", "topleft");
          };
}
//this.type = "menu";

Отсутствует

 

№487119-09-2012 22:04:33

Infocatcher
Not found
 
Группа: Extensions
Зарегистрирован: 24-05-2007
Сообщений: 4339
UA: Firefox 15.0

Re: Custom Buttons

bunda1 пишет

А такое меню будет работать?

Будет.

okkamas_knife пишет

а уже есть какая нибудь ночнушка где всё это уже отключено и выкинуто - чтоб проверить какие кнопки не будут работать и решить как с этим бороться?

Есть. Вроде, уже и в Aurora (или как там называется) есть.
Надо выставить javascript.options.xml.chrome и javascript.options.xml.content в false.

Писать инструкцию пока лень (да и некогда, в общем).
Вот некий конвертер: convertE4X.js
Правда, особо не тестировал.

Добавлено 19-09-2012 22:23:23
Только надо понимать, что в сложных случаях ничего не выйдет.

Отредактировано Infocatcher (19-09-2012 22:23:23)


Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела

Отсутствует

 

№487220-09-2012 11:25:50

Infocatcher
Not found
 
Группа: Extensions
Зарегистрирован: 24-05-2007
Сообщений: 4339
UA: Firefox 15.0

Re: Custom Buttons

okkamas_knife пишет

чтото типа ФАКа с примерами какого типа куски кода нужно переделывать и каким образом.

Черновой вариант: http://forum.mozilla-russia.org/viewtop … pid=582620


Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела

Отсутствует

 

№487322-09-2012 02:31:38

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2252
UA: Firefox 11.0

Re: Custom Buttons

О! Вижу кнопку-«ремонтник» и FAQ, такой подробный, больше половины - даже не знал, что такое бывает,
очень здо́рово, Infocatcher - спасибо !

Вот, ещё сделал себе кнопку, чтоб на chrome window в DOM Inspector'е быстренько поглядеть,
ну или другой какой объект, открывает как «исследовать в новом окне» и как «JavaScript Object»,
может кому пригодится...  Да, и XUL там, поскольку простой, лежит как «первый многострочный комментарий»,
так что - правим под себя, экранирование пока не требуется.

скрытый текст

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3ED%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/x-icon%3Bbase64%2CAAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADyeFz/8nhc//J4XP/yeFz/8nhc//J4XP/yeFz/8nhc//J4XN/yeFyf8nhcQAAAAAAAAAAAAAAAAAAAAAAAAAAA8nhc//V+Z//1mYT/9ZmE//WZhP/1mYT/8IZu/+t0V//wdlv/8nhc//J4XP/yeFyv8nhcEAAAAAAAAAAAAAAAAPJ4XP/1l4T//9TU///U1P//1NT//9TU///U1P//1NT//9TU//Cvnv/wdFn/8nhc//J4XM/yeFwQAAAAAAAAAADyeFz/8pOA///U1P//1NT//9TU///U1P/Ue3v//9TU///U1P//1NT//9TU//CQeP/yeFz/8nhczwAAAAAAAAAA8nhc//CQff//1NT//9TU///U1P/Ue3v/1Ht7/9R7e///1NT//9TU///U1P//1NT/8H5l//J4XP/yeFxgAAAAAPJ4XP/1lYL//9TU///U1P/Ue3v/1Ht7/9R7e//Ue3v/1Ht7///U1P//1NT//9TU///U1P/yeFz/8nhcvwAAAADyeFz/9ZmE///U1P/Ue3v/1Ht7/9R7e//Ue3v/1Ht7/9R7e//Ue3v//9TU///U1P//1NT/8HRZ//J4XP8AAAAA8nhc//WZhP//1NT//9TU///U1P//1NT//9TU///U1P//1NT//9TU///U1P//1NT//9TU//B+Zf/yeFz/AAAAAPJ4XP/1mYT//9TU///U1P//1NT//9TU/9R7e///1NT//9TU///U1P//1NT//9TU///U1P/whm7/8nhc/wAAAADyeFz/9ZmE///U1P//1NT//9TU/9R7e//Ue3v/1Ht7///U1P//1NT//9TU///U1P//1NT/8HRZ//J4XP8AAAAA8nhc//WZhP//1NT//9TU/9R7e//Ue3v/1Ht7/9R7e//Ue3v//9TU///U1P//1NT//9TU//J4XP/yeFzPAAAAAPJ4XP/1mYT//9TU/9R7e//Ue3v/1Ht7/9R7e//Ue3v/1Ht7/9R7e///1NT//9TU/+17Yf/yeFz/8nhcYAAAAADyeFz/9ZmE///U1P//1NT//9TU///U1P//1NT//9TU///U1P//1NT//9TU/+2KdP/yeFz/8nhczwAAAAAAAAAA8nhc//WZhP//1NT//9TU///U1P//1NT//9TU///U1P//1NT/8K+e//B0Wf/yeFz/8nhcz/J4XBAAAAAAAAAAAPJ4XP/1fmf/9ZmE//WZhP/1mYT/9ZmE//CGbv/rdFf/8HZb//J4XP/yeFz/8nhcv/J4XBAAAAAAAAAAAAAAAADyeFz/8nhc//J4XP/yeFz/8nhc//J4XP/yeFz/8nhc//J4XN/yeFyf8nhcQAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+sQQAHrEEAA6xBAAOsQQABrEEAAaxBAAGsQQABrEEAAaxBAAGsQQABrEEAAaxBAAOsQQADrEEAB6xBAB+sQQ%3D%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B/*%0A%0A%3Cmenupopup%20xmlns%3D%22http%3A//www.mozilla.org/keymaster/gatekeeper/there.is.only.xul%22%0A%09oncommand%3D%22this.parentNode.openObject%28event.target.label%2Cevent.target.getAttribute%28%27obj%27%29%29%22%3E%0A%0A%3Cmenuitem%20label%3D%22window%22%20obj%3D%22window%22/%3E%0A%3Cmenuitem%20label%3D%22document%22%20obj%3D%22document%22/%3E%0A%3Cmenuitem%20label%3D%22gBrowser%22%20obj%3D%22gBrowser%22/%3E%0A%0A%3Cmenuseparator/%3E%0A%0A%3Cmenuitem%20label%3D%22content%22%20obj%3D%22content%22/%3E%0A%3Cmenuitem%20label%3D%22document%22%20obj%3D%22content.document%22/%3E%0A%0A%3C/menupopup%3E%3B%0A%0A*/%0A%0A//%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%0Aconst%20comm%20%3D%20this.getAttribute%28%22cb-init%22%29.match%28/%5C/%5C*%5B%5Cs%5CS%5D+%5C*%5C//%29%5B0%5D%3B%0Aconst%20xul%20%3D%20comm.substring%28comm.indexOf%28%22%3C%22%29%2C%20comm.lastIndexOf%28%22%3E%22%29+1%29%0A%09%09.replace%28/%3E%5Cs+%3C/g%2C%20%22%3E%3C%22%29%3B%0Avar%20menu%20%3D%20%28new%20DOMParser%28%29%29.parseFromString%28xul%2C%20%22application/xml%22%29.documentElement%3B%0A//%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%0Athis.appendChild%28menu%29%3B%0Athis.type%20%3D%20%22menu%22%3B%0Athis.orient%20%3D%20%22horizontal%22%3B%0A%0Athis.openObject%20%3D%20function%28label%2C%20obj%29%20%7B%0A%0A%09var%20win%20%3D%20window.openDialog%28%22chrome%3A//inspector/content/object.xul%22%2C%0A%09%09%09%22_blank%22%2C%20%22chrome%2Call%2Cdialog%3Dno%22%2C%0A%09%09%09%20eval%28obj%29.wrappedJSObject%20%7C%7C%20eval%28obj%29%29%3B%0A%0A%09win.onload%20%3D%20function%28e%29%20%7B%0A%0A%09%09var%20doc%20%3D%20e.target%3B%0A%09%09doc.title%20+%3D%20%22%20%20-%20%20%22%20+%20label%3B%0A%09%09var%20panel%20%3D%20doc.getElementsByTagName%28%22domi-panel%22%29%5B0%5D%3B%0A%0A%09%09function%20showAsJSO%28%29%20%7B%0A%09%09%09if%20%28panel.registry%29%20%7B%20panel.switchViewer%287%29%3B%20return%3B%20%7D%0A%09%09%09window.setTimeout%28showAsJSO%2C%2010%29%3B%20%7D%0A%09%09showAsJSO%28%29%3B%0A%09%7D%0A%7D%0A//%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%0Avar%20thisCB%20%3D%20this%3B%0Afunction%20dm%28%29%20%7B%20return%20document.getAnonymousElementByAttribute%28%0A%09%09thisCB%2C%20%22class%22%2C%20%22toolbarbutton-menu-dropmarker%22%29%3B%20%7D%0A%09%09%09%0Afunction%20hdm%28%29%20%7B%20if%20%28dm%28%29%29%20%7B%20dm%28%29.setAttribute%28%22hidden%22%2C%20%22true%22%29%3B%20return%20%7D%0A%09%09window.setTimeout%28hdm%2C%2010%29%3B%20%7D%0Ahdm%28%29%3B%0A%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B/*CODE*/%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

Отсутствует

 

№487422-09-2012 10:44:49

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2252
UA: Firefox 11.0

Re: Custom Buttons

okkamas_knife пишет

практически на любом элементе интерфейса или страницы

Вот-вот, но мне Attributes Inspector для этого дела нравится.
А кнопка совсем не об этом. Это типа «закладки для "любимых" объектов»,
которые в два клика никак не откроешь. Но на её полезности, разумеется, не настаиваю :)

Отсутствует

 

№487522-09-2012 20:40:29

Infocatcher
Not found
 
Группа: Extensions
Зарегистрирован: 24-05-2007
Сообщений: 4339
UA: Firefox 15.0

Re: Custom Buttons

okkamas_knife пишет

кнопке скрытия меню - в СМ иногда меню двоится

Странно, что иногда.
У меня вообще получалось, что в SM чаще происходит повторная инициализация.
Можно попробовать так:

Выделить код

Код:

this.initBtn = function() {
  if(mPopup.hasChildNodes())
    mPopup.textContent = "";
  var mBarItems = bar.childNodes;
  bar.setAttribute('collapsed','true');
  for(i=0;i<mBarItems.length;i++) {
    if(mBarItems[i].nodeName == 'menu') {
      var mBarClone = mBarItems[i].cloneNode(true);
      mPopup.appendChild(mBarClone);
    }
  }
}

Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела

Отсутствует

 

Board footer

Powered by PunBB
Modified by Mozilla Russia
Copyright © 2004–2020 Mozilla Russia GitHub mark
Язык отображения форума: [Русский] [English]