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

Хотите узнать больше о расширениях? Посмотрите ролики, рассказывающие о работе с расширениями Firefox.

№175131-07-2017 12:06:02

Gladius333
Забанен
 
Группа: Members
Зарегистрирован: 11-02-2017
Сообщений: 92
UA: Firefox 54.0

Re: Обсуждение кнопок CB

bunda1 пишет
Gladius333 пишет

Вопрос можно кроме меню "допольнительно", добавить еще одно меню?
==================================
Или можно добавить в меню-еще меню, к примеру
------------------------------------------------
дополнительно[выпадающее меню]
---линкс[выпадающее меню-сами ссылки]
---разное[выпадающее меню-сами ссылки]
-

Конечно можно, только я не понял что именно требуется.

Второй вариант с подменю, а первый можно как пример? я его сохраню чтобы потом не задавать вопрос.
1)"допольнительно", добавить еще одно меню?
--Дополнительно=[сами ссылки]
--Что то...=[сами ссылки]
------------------------------------------------
2)
---дополнительно=[выпадающее меню]
===линкс=[выпадающее меню-сами ссылки]
===разное=[выпадающее меню-сами ссылки]

Отредактировано Gladius333 (31-07-2017 18:00:29)

Отсутствует

 

№175231-07-2017 13:45:29

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

Re: Обсуждение кнопок CB

Все равно не понял что именно требуется, но вот пример:

Выделить код

Код:

((contextMenu, el)=> {
   var menu = document.createElement("menu");
   menu.setAttribute("label", "дополнительно");
   menu.setAttribute("id", "context-ext-addon");
   contextMenu.insertBefore(menu, contextMenu.children[el]);
   addDestructor(()=> menu.remove() );

var array = [
   ["дополнительно1"],
   ["Искать логин на Login2",function(){window.open('http://login2.me/#'+location.hostname,'login2.me_'+location.hostname,'width=500,height=400,left=500,top=100,scrollbars=yes,location=no')}],
   ["Искать логин на Loginz",function(){window.open('http://loginz.org/view/'+location.hostname,'loginz_'+location.hostname,'width=500,height=400,left=500,top=100,scrollbars=yes,location=no')}],
   ["Искать логин на ByPass",function(){window.open('https://bypass.org.ru/login/'+location.hostname,'bypass_'+location.hostname,'width=500,height=400,left=500,top=100,scrollbars=yes,location=no')}],
   ["Искать логин на BugMeNot",function(){window.open('http://bugmenot.com/view/'+location.hostname,'bugmenot_'+location.hostname,'width=500,height=400,left=500,top=100,scrollbars=yes,location=no')}],
   ["separator"],
   ["Набрать сообщение в форме", function(){window.open('http://southron4965.ucoz.ru/files/Opera_LE/html/forma.html')}],
   ["Искать страницу на Archive.org",function(){window.open('http://web.archive.org/web/*/'+location.href)}],
   ["дополнительно2"],
   ["Посмотреть отзывы о сайте в WOT",function(){window.open('https://www.mywot.com/ru/scorecard/'+location.hostname)}],
   ["Информация о сервере (netcraft)",function(){window.open('http://toolbar.netcraft.com/site_report?url='+location.hostname)}],
   ["Проверить доступность сайта через isitdownrightnow.com",function(){window.open('http://www.isitdownrightnow.com/downorjustme.php?url='+location.hostname,'DownForMe_'+location.hostname,'width=600,height=400,left=100,top=100,scrollbars=yes,location=no')}],
   ["separator"],
   ["Узнать, кому принадлежит домен через Domaintools",function(){window.open('http://whois.domaintools.com/'+location.hostname)}],
   ["Узнать, кому принадлежит домен через Reg.ru",function(){window.open('https://www.reg.ru/whois/?dname='+location.hostname)}],
   ["дополнительно3"],
   ["Удалить куки текущего сайта", "deleteCookiesFromHost()"],
   ["Искать страницу в кэше Google",function(){window.open('http://www.google.com/search?q=cache:'+location.href)}],
];
var menuPopup = menu.appendChild( document.createElement("menupopup") );
var subMenu, subMenupopup; 
array.forEach(m=> {
   if ( m.length == 1 && m[0] != "separator" ) {
        subMenu = menuPopup.appendChild(document.createElement("menu"));
        subMenu.setAttribute("label", m[0]);
        subMenupopup = subMenu.appendChild(document.createElement("menupopup"));  
        return;
        }
   if ( m[0] == "separator"  ) { subMenupopup.appendChild(document.createElement("menuseparator")); return };
   
   var mItem = subMenupopup.appendChild(document.createElement("menuitem"));
   mItem.setAttribute("label", m[0]);
   typeof(m[1]) == "string"
   ? mItem.addEventListener("command", ()=> eval(m[1]))
   : mItem.addEventListener("command", ()=> content.location.href = "javascript:(" + encodeURI(m[1]) + ")()");
});

   
   function deleteCookiesFromHost() {
      var host = Services.eTLD.getBaseDomain(gBrowser.currentURI);

      for ( var en = Services.cookies.enumerator; en.hasMoreElements(); ) {
            var cookie = en.getNext().QueryInterface(Ci.nsICookie);
            ~cookie.host.indexOf(host.trim()) && Services.cookies.remove(cookie.host, cookie.name, cookie.path, false); 
            }
   
      var reversedDomain = host.split("").reverse().join("") + ".";
      Cu.import("resource://gre/modules/FileUtils.jsm");
      var file = FileUtils.getFile("ProfD", ["webappsstore.sqlite"]);
      var dbConn = Services.storage.openDatabase(file);
      dbConn.executeSimpleSQL("DELETE FROM webappsstore2 WHERE scope LIKE \"%" + reversedDomain +"%\"");
      dbConn.close();
   
      var dir = Services.dirsvc.get('Home', Ci.nsIFile);
      dir.append("Application Data");
      dir.append("Macromedia");
      dir.remove(true);
      dir.create(Ci.nsIFile.DIRECTORY_TYPE, 0777);
   };
})(document.getElementById("contentAreaContextMenu"), "context-inspect");

Отсутствует

 

№175331-07-2017 18:04:02

Gladius333
Забанен
 
Группа: Members
Зарегистрирован: 11-02-2017
Сообщений: 92
UA: Firefox 54.0

Re: Обсуждение кнопок CB

bunda1 пишет

Все равно не понял что именно требуется, но вот пример:

Выделить код

Код:

((contextMenu, el)=> {....

Да то что надо, мне скинули кое-что пока разбераюсь) спс!
Еще хотел как пример без подменю, к примеру у нас было одно "дополнительно", подним без подменю другое "дополнительно".

Отсутствует

 

№175431-07-2017 18:29:00

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

Re: Обсуждение кнопок CB

Gladius333 пишет

к примеру у нас было одно "дополнительно", подним без подменю другое "дополнительно".

Куда поднимим :cry:

Отсутствует

 

№175531-07-2017 19:08:41

Gladius333
Забанен
 
Группа: Members
Зарегистрирован: 11-02-2017
Сообщений: 92
UA: Firefox 54.0

Re: Обсуждение кнопок CB

bunda1 пишет
Gladius333 пишет

к примеру у нас было одно "дополнительно", подним без подменю другое "дополнительно".

Куда поднимим :cry:

Тоже самое только (где красные) и только одно подменю.

скрытый текст
oJ3zLOc.png

Отредактировано Gladius333 (31-07-2017 19:09:00)

Отсутствует

 

№175631-07-2017 21:02:23

oleg953
Участник
 
Группа: Members
Откуда: Ростов где Дон
Зарегистрирован: 07-05-2014
Сообщений: 557
UA: Firefox 52.0

Re: Обсуждение кнопок CB

:angry:

Отредактировано oleg953 (01-08-2017 22:25:22)

Отсутствует

 

№175701-08-2017 15:31:29

bugmenot
Участник
 
Группа: Members
Зарегистрирован: 29-01-2012
Сообщений: 35
UA: Firefox 45.0
Веб-сайт

Re: Обсуждение кнопок CB

Может ли кнопка узнать, посещалась ли ссылка или нет? Я в курсе, что псевдокласс :visited недоступен для проверки в целях безопасности, но локальное расширение по логике таких ограничений иметь не должно...

Отсутствует

 

№175801-08-2017 23:35:07

yup
Участник
 
Группа: Members
Зарегистрирован: 15-04-2016
Сообщений: 1090
UA: Seamonkey 2.40

Re: Обсуждение кнопок CB

bugmenot пишет

Может ли кнопка узнать, посещалась ли ссылка или нет?

Может-может. Причём не только - посещалась ли, но и когда именно.
У меня стоит расширение Link Status Redux, которое для ссылки, на которую мышка наведена, показывает это в строке статуса.

Отредактировано yup (01-08-2017 23:38:00)

Отсутствует

 

№175902-08-2017 07:34:29

bugmenot
Участник
 
Группа: Members
Зарегистрирован: 29-01-2012
Сообщений: 35
UA: Firefox 45.0
Веб-сайт

Re: Обсуждение кнопок CB

yup пишет

Может-может.

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

Отсутствует

 

№176002-08-2017 12:41:44

yup
Участник
 
Группа: Members
Зарегистрирован: 15-04-2016
Сообщений: 1090
UA: Seamonkey 2.40

Re: Обсуждение кнопок CB

bugmenot
Как отправная точка: https://developer.mozilla.org/en-US/doc … query_URIs и https://developer.mozilla.org/en-US/doc … ry_service

Отредактировано yup (02-08-2017 12:44:03)

Отсутствует

 

№176102-08-2017 20:13:51

bugmenot
Участник
 
Группа: Members
Зарегистрирован: 29-01-2012
Сообщений: 35
UA: Firefox 45.0
Веб-сайт

Re: Обсуждение кнопок CB

Расковырял-таки расширение и собрал вот такой код.

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

Выделить код

Код:

var iosvc = Components.classes["@mozilla.org/network/io-service;1"].getService(Components.interfaces.nsIIOService);
      var query = PlacesUtils.history.getNewQuery();
      var queryOptions = PlacesUtils.history.getNewQueryOptions();
      queryOptions.includeHidden = true;
      queryOptions.maxResults = 1;
      queryOptions.resultType = queryOptions.RESULTS_AS_VISIT;
      queryOptions.sortingMode = queryOptions.SORT_BY_DATE_DESCENDING;

      var isVisited = function(link)
      {
        try
        {
          uri1 = iosvc.newURI(link, null, null);
        }
        catch (e if e.result == Components.results.NS_ERROR_MALFORMED_URI)
        {
          uri1 = null;
        }

        query.uri = uri1;
        var results = PlacesUtils.history.executeQuery(query, queryOptions).root;
        results.containerOpen = true;
        return results.hasChildren;
      }


С одной стороны, работает, с другой, нет ли тут косяков и подводных камней, пропущенных по незнанию?

Отсутствует

 

№176203-08-2017 04:24:41

yup
Участник
 
Группа: Members
Зарегистрирован: 15-04-2016
Сообщений: 1090
UA: Seamonkey 2.40

Re: Обсуждение кнопок CB

bugmenot пишет

нет ли тут косяков и подводных камней, пропущенных по незнанию?

1. Mozilla не рекомендует использовать конструкцию "catch (e if ...)".
Тем более, что в данном случае её можно совершенно безболезненно переписать как:

Выделить код

Код:

catch (e) {
  if e.result == Components.results.NS_ERROR_MALFORMED_URI) uri1 = null;
}

2. Mozilla же рекомендует пользоваться асинхронными методами, а там это выглядит примерно так:

Выделить код

Код:

var iosvc = Components.classes["@mozilla.org/network/io-service;1"].getService(Components.interfaces.nsIIOService);
var asyncHistory = Components.classes["@mozilla.org/browser/history;1"].getService(Components.interfaces.mozIAsyncHistory);

var uri = iosvc.newURI(link, null, null);

asyncHistory.isURIVisited(uri, function(uri, isVisited) {
  if (isVisited) alert('visited')
  else alert('not visited');
});

В синхронном nsIGlobalHistory2 описана функция isVisited(), но, похоже, что это дело из [firefox] уже выкосили.

Отредактировано yup (03-08-2017 04:51:54)

Отсутствует

 

№176303-08-2017 08:18:30

bugmenot
Участник
 
Группа: Members
Зарегистрирован: 29-01-2012
Сообщений: 35
UA: Firefox 45.0
Веб-сайт

Re: Обсуждение кнопок CB

2yup
Спасибо, catch поправлю. Асинхронность пока что не нужна, но информация полезная, пригодится.

yup пишет

В синхронном nsIGlobalHistory2 описана функция isVisited(), но, похоже, что это дело из  уже выкосили.

Да, сначала с нее и попытался начать.

Отсутствует

 

№176403-08-2017 11:48:43

yup
Участник
 
Группа: Members
Зарегистрирован: 15-04-2016
Сообщений: 1090
UA: Seamonkey 2.40

Re: Обсуждение кнопок CB

bugmenot пишет

Асинхронность пока что не нужна

Но тотальный переход на WebExtensions уже вот-вот, а там history.search() - асинхронная.
Так что если беспокоиться о предстоящих переделках, то лучше асинхронность в конструкцию сразу закладывать.

Отсутствует

 

№176503-08-2017 12:49:20

bugmenot
Участник
 
Группа: Members
Зарегистрирован: 29-01-2012
Сообщений: 35
UA: Firefox 45.0
Веб-сайт

Re: Обсуждение кнопок CB

yup пишет

Но тотальный переход на WebExtensions уже вот-вот, а там history.search() - асинхронная.Так что если беспокоиться о предстоящих переделках, то лучше асинхронность в конструкцию сразу закладывать.

Да, придется. Спасибо еще раз.

Отредактировано bugmenot (03-08-2017 12:49:35)

Отсутствует

 

№176604-08-2017 22:05:45

Gladius333
Забанен
 
Группа: Members
Зарегистрирован: 11-02-2017
Сообщений: 92
UA: Firefox 54.0

Re: Обсуждение кнопок CB

bugmenot пишет
yup пишет

Но тотальный переход на WebExtensions уже вот-вот, а там history.search() - асинхронная.Так что если беспокоиться о предстоящих переделках, то лучше асинхронность в конструкцию сразу закладывать.

Да, придется. Спасибо еще раз.

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

Отсутствует

 

№176704-08-2017 23:18:27

bugmenot
Участник
 
Группа: Members
Зарегистрирован: 29-01-2012
Сообщений: 35
UA: Firefox 45.0
Веб-сайт

Re: Обсуждение кнопок CB

Gladius333 пишет

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

Это не кнопка. Это функция, которой можно передать ссылку и узнать, есть она в истории или нет. А дальше как хочешь, так ее и применяй.

Отсутствует

 

№176812-08-2017 15:51:52

mokujin
Участник
 
Группа: Members
Зарегистрирован: 17-02-2017
Сообщений: 505
UA: Palemoon 27.0

Re: Обсуждение кнопок CB

Привет.
Подскажите как; в конт. меню страницы(обычном станд. ПКМ) есть пункты добавляемые расширениями. Этих пунктов может быть не один, но всех их зовут одинаково. Я написал действия для этих пунктов, ф-цию-листенер на действия мыши(case 0,1,2). Все работает правильно и как надо, но сейчас держу две ф-ции для двух разных ID. Вопрос такой:
- как повесить одно-и-тоже действие на два(три, пять) разных id в меню ?

Сейчас это так(две абсолютно одинаковых ф-ции , различия только в id):

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

Выделить код

Код:

// -----------------  Для расширения MediaSnifer\Video-Sniffer действия для кликов  --------------------------------------------------------
(function() {
   addEventListener("click", function(e) {
   
      if(e.target.id != "mediasniffer") return;
    
          var file = Services.dirsvc.get('ProfD', Ci.nsIFile);
          var ref = ('"' + content.document.location + '"');
          var domain = content.document.domain.replace(/^www./g,'');
          var url = ('"' + e.target.getAttribute("tooltiptext") + '"');
          var title = convertFromUnicode("Windows-1251", gBrowser.mCurrentTab.label);

       switch (e.button) {
// скачать через wget или aria
           case 0:
              e.preventDefault();
              e.stopPropagation();
  
             if ( domain == "xvideos.com" ) { var url=url.replace(/p\d+\.ts/ig, 'p\.m3u8'); }

       file.initWithPath(file.path + "\\Soft\\wget\\wgetfile.cmd");
          var process = Cc["@mozilla.org/process/util;1"].createInstance(Ci.nsIProcess);
       process.init(file);
       process.run(false, [url, title.replace(/(?:@|#|&|\\|\/|\.|,|\||\:)+/g,'').slice(0,65), ref], 3);
          break;
          
// скопировать ссылку-подсказку
           case 1:
              var alertsService = Cc["@mozilla.org/alerts-service;1"].getService(Ci.nsIAlertsService);
              var tt = e.target.getAttribute("tooltiptext");
            gClipboard.write( decodeURIComponent(tt) );
            alertsService.showAlertNotification(e.target.image, null, "Скопировал ссылку Mediasniffer-a", false, "", null, ""); 
                 break;          

// Открыть в Smplayer
           case 2:
//            var param = "-add-to-playlist";
            var url = e.target.getAttribute("tooltiptext");
            var file = Services.dirsvc.get('ProfD', Ci.nsIFile);

      file.initWithPath(file.path + "\\Soft\\PotPlayer\\PotPlayerMini.exe");
           var process = Cc["@mozilla.org/process/util;1"].createInstance(Ci.nsIProcess);
        process.init(file);
        process.run(false, [url, "/add"], 2 );
        break;
  }
 }, false, document.getElementById("contentAreaContextMenu"));
})();

// и ниже , точно тоже самое, только с разницей в 
//    if(e.target.id != "video-sniffer") return;


пробовал так сделать

Выделить код

Код:

if(e.target.id != ("mediasniffer" || "video-sniffer")) return;

срабатывает только на первом id , для второго нет. :rolleyes:

Отредактировано mokujin (12-08-2017 15:55:50)


...программисты словно войну какую-то ведут за свои обновления. Блин, почему сейчас повсюду мания ухудшать интерфейсы и делать их максимально неудобными?! Radiation

Отсутствует

 

№176912-08-2017 18:11:58

yup
Участник
 
Группа: Members
Зарегистрирован: 15-04-2016
Сообщений: 1090
UA: Seamonkey 2.40

Re: Обсуждение кнопок CB

mokujin пишет

срабатывает только на первом id , для второго нет.

Да и на первом-то срабатывать не должно.

Выделить код

Код:

if((e.target.id != "mediasniffer") && (e.target.id != "video-sniffer")) return;

или

Выделить код

Код:

if(["mediasniffer", "video-sniffer"].indexOf(e.target.id) < 0) return;

Отредактировано yup (12-08-2017 18:15:34)

Отсутствует

 

№177013-08-2017 05:37:10

mokujin
Участник
 
Группа: Members
Зарегистрирован: 17-02-2017
Сообщений: 505
UA: Palemoon 27.0

Re: Обсуждение кнопок CB

блиииин... делал точно такуюж конструкцию, а заместо и(&&) писал или( || )  и не работало.  fool.gif 
:)
Пасиб, второй пример тоже в копилку, пригодицца.   
Благодарю.


...программисты словно войну какую-то ведут за свои обновления. Блин, почему сейчас повсюду мания ухудшать интерфейсы и делать их максимально неудобными?! Radiation

Отсутствует

 

№177120-08-2017 14:10:31

Gladius333
Забанен
 
Группа: Members
Зарегистрирован: 11-02-2017
Сообщений: 92
UA: unknown 0.0

Re: Обсуждение кнопок CB

Можно добавить сюда, чтобы пойск закрывался и открывался с помощью "Ctrl+F".
К примеру заходишь на страницу, начинаешь печатать в адресной строке а он начинает автоматом пойск+когда начинаешь искать то саму панель приходиться закрывать через крестик или "Escape" жать...

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

Выделить код

Код:

/*[+++] Задаем положение панели поиска наверху */
@-moz-document url("chrome://browser/content/browser.xul"),url("chrome://global/content/viewSource.xul") {
:-moz-any(.browserContainer, #viewSource) .findbar-container > *,
:-moz-any(.browserContainer, #viewSource) .findbar-container > *:not(spacer),
:-moz-any(.browserContainer, #viewSource) :-moz-any(.findbar-find-previous, .findbar-find-next) {display: -moz-box;}
:-moz-any(.browserContainer, #viewSource) .findbar-container :-moz-any(spacer, .findbar-find-fast[anonid="match-case-status"], .findbar-find-fast[anonid="entire-word-status"]) {visibility: collapse}
:-moz-any(.browserContainer, #viewSource) .findbar-find-fast.findbar-find-status, .found-matches {-moz-box-ordinal-group: 0;margin:0 5px 0 -6px!important;}
:-moz-any(.browserContainer, #viewSource) .findbar-button {margin:0 -1px!important;padding:0!important;max-width: 125px!important;}
:-moz-any(.browserContainer, #viewSource) .findbar-closebutton {position: relative !important;right: 0 !important;margin: 0px -3px -5px 0px!important;}
:-moz-any(.browserContainer, #viewSource) .findbar-textbox {height: 20px !important;font-size: medium !important;max-width: 170px!important;}.browserContainer findbar,
#viewSource #FindToolbar {-moz-box-ordinal-group: 0;position: fixed !important;left: 5px;margin-top: -1px !important;box-shadow: 1px 2px 3px rgba(0, 0, 0, .25) !important;border: 1px solid threedshadow !important;border-top: none !important;border-radius: 0 0 9px 9px;transition-property: margin-top, opacity, visibility !important;}
#viewSource #FindToolbar {background-color: -moz-dialog;color: -moz-dialogtext;}
:-moz-any(.browserContainer, #viewSource) .findbar-find-status { color: inherit !important }}


П.С. вот тут есть такая функция, но я чета не разобрался.
скрытый текст

Выделить код

Код:

var tipOrig1 = "ЛКМ: Вкл-Выкл панели поиска по странице";
var tips2 = ['ПКМ: Вкл-Выкл режима подсветки выделенного слова во всех вкладках','ПКМ: Выкл.подсветки "','Ожидание выделения текста для его подсветки во вкладках...'];

// Подсказка для кнопки ...........
function setTip() {
var normLen = function(str) {return str.slice(0,40) + (str.length > 40 ? '..."' : '"')};
self.tooltipText = tipOrig1 + '\n' + tips2[state > 2 ? 1 : state] + ((state > 2 || state == 1) ? normLen(Services.prefs.getComplexValue("CB.autoHighlight.value", Ci.nsISupportsString).data) : '');
};

self.onclick = e => {
if(e.button == 0)toggleFindbar();
if(e.button == 1)gShowPopup(self);
if(e.button == 2 && e.target == self && !e.ctrlKey && !e.shiftKey && !e.altKey && !e.metaKey) {
e.preventDefault();
e.stopPropagation();
if(!cbu.getPrefs("CB.autoHighlight.state")){
let selWord = getSelect();
if(!selWord){
// Нет выделенного
cbu.setPrefs("CB.autoHighlight.state", 2);
} else {
handleSelect(selWord);
setTimeout(()=> autoHighlight(true), 200);
cbu.setPrefs("CB.autoHighlight.state", 1);
}
}else{
cbu.setPrefs("CB.autoHighlight.state", 0);
}}};

function toggleFindbar() {
if (gFindBar.hidden) { gFindBar.onFindCommand(); setTimeout(function() { gFindBar._find() }, 50) }
else {gFindBar.close();setTimeout(()=> autoHighlight(true), 10)}
};

self.ondblclick = e => {e.preventDefault()};

function keyDown(e) {
if(e.keyCode == e.DOM_VK_F && e.ctrlKey && !e.altKey && !e.shiftKey){
e.preventDefault();
toggleFindbar();
}
};

addEventListener("keydown", keyDown, false, getBrowser());

var imgOrig = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAFo9M/3AAAACXBIWXMAAAsSAAALEgHS3X78AAACZElEQVR42mNgAIK/f/+GMvz69ct3yZIlyxjOnTt3BCTK8P///0Yw49ixY0eBnEAGbICdnf0/SCnvrl27nsBFz5492wuio6Oj/4NopoSExAygqmm/f/9G1R8bG/s9LCzsF9iMlNSU/5cuXcp7/fq1Q3Fx8c8XL17MgKsEuu7Rs2fP3IAKOaCYycrK6j+KcXfv3p0gLib+n5OT87+Xp+d/SSmp/0lJSb8Y8IHIyMjv6urqEJO+fPlStG3btpc3btzYjKHyzJkzF9rb2x++f//e/PDhwxNLS0pQ7Q8MDAS6638FjL9o0aLNr169aoIrcHR0/A8NXbAvdu/e3XT58uX5cAURERH/gcHXBZScCcRVKioq/3//+Z0MVwAUZE1ISPjDwcHxX1tb+7+goOB/Hh6e/z9//gzD6j1gmPuD9IHwp0+f8Cu6efNmG8waZaA7ztXV1f3Pycn5X1ZW9r8E6N3s7Oz/vb29/x8/frwU5AGspn3+8iW/sLDwf319/Y2vX7/WARX2Iss/eHA/ISUl5feUyZNBwWWMYQAwsp+DwvLNmzdOQAXC2Cw5fvx4qZub2/+LFy8uwZA8derURi0trf8rVqyYAzTAFIi9gdgdiD2A2AuILUuKS854AhPJ58+fU7B64/r16/P09fX/S0lJ/a2oqDiybt26tcuWLdsQHx9/SUxM7L+ysvJ/GRmZ/5mZmd+BGSgMZwoD2mbw6NHjqiNHjsw5efLk9A8fPqQANcQmJ6d8B0kLCAj8Z2Rk/B8dE/0LZzziAqCoi4qKAhsEMgREd3V1vWMgFQBd5Ddp0qTbwEzUCuIDAFDBb1F5m6ZWAAAAAElFTkSuQmCC";
var imgLockedSearch = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAFo9M/3AAAACXBIWXMAAAsSAAALEgHS3X78AAACrUlEQVR42o2T30tTYRjHn/PuDM/mmh7RxjYzGiioiRR10UC8CUzzolmIOtAxpsQKc660i4LsqigIpUKxYqCgBu4PKOlmidpNxGA4QujC/IHr7MyUzXPYnt4dp8xZ0POBw8tzvu/3vM953odBBBrtUUilrgnuz26EcNgn0ewaDOEQKotgcFyyoQ2Bkk4wSjYTHJdnpAn9RiAwVlJX176pZD2rHkVut9uVLeRDy0d4TZFlWREcerhcHcZ4XAJIe7i6XdgR6UCrZMW+wT6MxV7spoWK2O8fTtbv1SOXgVCsViseCtKPSGRo13DSgBqNBpsaG9FoMmFPj+P4ubPD4Wg1Li5+2z+ULPfrAoGL+RUVO3JpabeQpTORUGi65OEb9YmB+ufkmRTMG7h315glWAObzYb3KZDB88mDOzsPfh8ckoiiCE8oXAbhtADRaL7qwIIYDAbo/dkLw5R+ynzDPJjNP6TDjyCq153OTuQ4Dqurq5HnedTpdJhMtkX/WiZiC0eIn0+vZblVJLn1M4w/kUq1RNNrUTyjzjhUsMvLj/mpqRArCAJotVp6SVIQj8fBYrHQn6ZNFBV5RIAEHjOUpDuxwUGilywS6G/qoZgtBi/lIG7sXge9twDOnz0Ht25PRgCW5CMGs7OvkpOTcyTyPgIhNgS/KLlhX7fDlmMLxscvJ8rKBqLZ70hNjSSHw2Go/FoJFspVSgPlCqWJconCzDCgUqnAZPq+l2tOyss9wtxcV3ypewlWT60CP8ZD7ZdaqApUAfuQhRXDCiy8XKDTEQSvFwoQ2zVHSjjahgvq7e26vM1NLcuygGbzhqxWJ8HthoLRUR8UFhZCLBaDzq42ePcWRUKm4/+8rrmR7q/TqeZ9vhnaSkYZ0pGRR8jsD/f/mewb2biJiRp9c/Mebe1T3R+cNmFDpJ/KUgAAAABJRU5ErkJggg==";
var imgReady = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAFo9M/3AAAACXBIWXMAAAsSAAALEgHS3X78AAAC5klEQVR42mNk+F/MkMhgepch/N+iO0uWLFnGsOTG7i9A0TNM0eouvQwgMP/S1i////8PBHOAMowgggEK2DmmGDMK/K8+P/OQhXa43YFLYNGzZ8+C9UZHR/8HGxaXkVIANGPa79+/wQrgZkSlvDb69f0nA9iMkLSXBnm5efmSkpKXWns69qlWeb/N5tv6EKxl8tr5v549e+YGNIYDipmsrKzA5oPtyA26cmkR67nFEuIS37m4uL57e3n9vf/gAUNC+gcjFDvRQVjCc6OLJ84yghVU/XYQ1zv0T+KHGu/XBNmtd5DUmTCuubLv2+3NJ19nZGSEXblyJWrTxo153d3/z8JUMC2tncxZUVExXVBQ8KStrW2+rp7elpavzlJwBR8+fGBgZGTsgPkC6NXznO/+ssEViIuLg4KvC8ieCMRFmZmZtQ9lfn+BK1i3XO7cxKlTSjk5OdN0dHRa3759yzCPL04+/p+xEFZvRv43EFjOFKsMYsf+XnyfCd3/yxkvfIj8t/guiK3wnosTbIIWgzh743UT5csrDnC+e/eOARiiDP/+/WP4/v07g5KSEoNAvPG7HOHtD78z/PmHbiBj2a+Nj3+XH5Dh4+O7WVZWtgyomR/o62KYggcP7ic0tbfNN9LRY1iRw3DjCMODrygGTFsz//fupZtYZs+e7SwsLHwRqPktui3Hjx8vra+v7/KalfuuQP7AfWQ5pn86Il9v3rzJsGfPniggXwkY1t5A7A7EHkDsBcSWa9esDWdmZma4LfXjM7rhTDnqB+6k7u5+297eniwlK3OqEgjWr1+ftnz58oyEhIQOYDwdW79hvfHly5cZfpXsl0v4Dwl+uBeQo8GSQZ7L7qMMP9fLX+z/WRj/v5Jh/PoXSP/I3iW/cMZsRgEBAYaPHz8yRMRH/2eb6/VgIdPZdziTKzoAxe+/pB1KKxcsBQYTUNv//wyNEzv+ggwAyRNlCAhE/NcX0Fj4Ruafr+L7JuEjkgA5RWMpXs0CsgAAAABJRU5ErkJggg==";
var imgReadySearch = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAFo9M/3AAAACXBIWXMAAAsSAAALEgHS3X78AAAC1UlEQVR42o2SbUhTURjHn3MdOqftJaVZzLRJmZukOZP0g/olNKVgJqmJOSVL1AQzDSyJ+SXBT5JEWmFmZYJGKVIo4bCJGZq1FSm5nGSJZtetnHO77Z7uvanoJOj/+3DPee5z/ufleRDgcsiDQybIoO9NFumLMNwf71tioiOgxVrMDZoNPUtqrGYmwAUQF12VF79BhcT48ljjwGFlRrzOwEXLZsq45OzsbG4J0ZvWBzcYKIriEtY9Tp35HuW0O4DzSD87F7l8bRnMQjPEVMfA3qrjC8XCnmluyfXOZmeCIwHzVyEY4uLi/p6R3eN82nvD0Z8V8yKpCJAAQXJKEkyZzaA5Z4natKe7Tmpmo969GkVcQhWVKD0wQAes7Ntm0wT2TG7IiyY6PqQqXLf1srrEGt4b6omoogKpNiSMILVajUMfh0ItA/cQ/WXgF3Nk9orPi2/snLBYLNxP/ipkEAnepMtzzYKQSqVQ+rUU6hkuMAwmDcK0jFpa38QTV46ezs/DfD4fK5VKLJFIsK+vL851Pfy8pTyssnCkuI3ICWHHOVTrFOF+/zb01pJFt5rYcfCiwJtzUIDUS/sxOsT4SOdNkiQIBAKgaRrsdjvI5XIQ56rIEr9n03b4Tbsbokrn0y/UJZ3MKXeCsFAI/jx/KGdYU7rtBAjLRRAVfhAelcC4Hsy2jQZEcBcZYGZqZyg0QBOvadNiVh0+neC46oCu7m5Inw7e4X4Cgg73t01MTEDYWBjIGVIZkhiSGVIYYhlQOwIPDw/4tGvl1xaDklDdZEFf3Y/hgmGYCZwBSaMEIl5HgOKlAnjVPDBJTTDUMARGoxGcF/t3a7Bq+6Y32FiGWAgSxFtlIsGc0wvzEJ6XIZuL+a4U9wa13LyFxGIxWK1WyMzNxp53UswtxCj5z3Z1F1tfOv+5vP3uA4TYJsYYtPW1LtaA60r4T2XiCPH+lgUZfWzPYo2ffucfIF9BRWk+aooAAAAASUVORK5CYII=";

// Обработчик следит за загрузкой и переключением вкладки и запускают автовыделение ..........
var listener = {onStateChange: function(wpr, req, flag) {if ( gBrowser.currentURI.spec.startsWith("http") && flag & Ci.nsIWebProgressListener.STATE_STOP )
setTimeout(()=> autoHighlight(true), 10);},onLocationChange: function(wpr, req) {if ( gBrowser.currentURI.spec.startsWith("http") && !req && wpr.document.readyState == "complete" )
setTimeout(()=> autoHighlight(true), 10);}};

function handleSelect(str) {var converter = Components.classes["@mozilla.org/intl/scriptableunicodeconverter"]
.createInstance(Components.interfaces.nsIScriptableUnicodeConverter);
converter.charset="UTF-8";cbu.setPrefs("CB.autoHighlight.value", converter.ConvertFromUnicode(str));};

// Получить выделенный текст из страницы или false ..........
function getSelect() {let selA = gBrowser.contentDocument.defaultView.getSelection(), selB ='', sel = '', el = document.commandDispatcher.focusedElement;
selA = selA ? selA.toString() : '';
try { selB = el && el.value ? el.value.substring(el.selectionStart, el.selectionEnd) : '' } catch(e) {};
selB = selB ? selB.toString() : '';
sel = selA.length > selB.length ? selA : selB;
return(sel == '') ? false : sel.replace(/^\s+|\s+$/g,"");};


//выделить текст ..........
function autoHighlight(power) {
var finder = gBrowser.finder || gFindBar;
var lighted = (finder._highlightDoc || finder.highlight).bind(finder);
lighted(false,"");
if(power){
var lightstr = Services.prefs.getComplexValue("CB.autoHighlight.value", Ci.nsISupportsString);
if(lightstr)lighted(true, lightstr.data);};};

var addFlag = false, state = 0, wnd = document.getElementById('main-window');

function onMouseup() {let selection = getSelect();
if(!selection || state<2)return;
setTimeout(()=> autoHighlight(true), 200);
handleSelect(selection);
cbu.setPrefs("CB.autoHighlight.state", state+1);};

function onMouseent() {autoHighlight(true)};

function onStateChange() {
state = cbu.getPrefs("CB.autoHighlight.state");
if(!state && state != 0){
state=0;
cbu.setPrefs("CB.autoHighlight.state", 0);
};
if(state<3){
addFlag = false;
//gBrowser.removeProgressListener(listener);
removeEventListener("mouseup", onMouseup, false, getBrowser());
};
setTip();
switch (state) {
case 0:
gBrowser.removeProgressListener(listener);
wnd.removeEventListener("mouseenter", onMouseent, false);
if(cbu.getPrefs("CB.autoHighlight.value")){
setTimeout(()=> cbu.setPrefs("CB.autoHighlight.value", ""), 50);
autoHighlight(false);
};
self.image = imgOrig;
break;
case 1:
//setTimeout(()=> autoHighlight(true), 100);
wnd.addEventListener("mouseenter", onMouseent, false);gBrowser.addProgressListener(listener);
self.image = imgLockedSearch;break;case 2:addEventListener("mouseup", onMouseup, false, getBrowser());self.image = imgReady;break;default:
//setTimeout(()=> autoHighlight(true), 100);
if(!addFlag){if(self.image != imgReady)addEventListener("mouseup", onMouseup, false, getBrowser());self.image = imgReadySearch;addFlag = true;
wnd.addEventListener("mouseenter", onMouseent, false);gBrowser.addProgressListener(listener);};break;}};

onStateChange();gPrefService.addObserver("CB.autoHighlight.state", onStateChange, false);

addDestructor(() => {gPrefService.removeObserver("CB.autoHighlight.state", onStateChange, false);
gBrowser.removeProgressListener(listener);removeEventListener("mouseup", onMouseup, false, getBrowser());
wnd.removeEventListener("mouseenter", onMouseent, false);cbu.setPrefs("CB.autoHighlight.value", "");
cbu.setPrefs("CB.autoHighlight.state", 0);autoHighlight(false);try{removeEventlistener("keydown", keyDown, false, getBrowser())}catch(e){};});

Отредактировано Gladius333 (20-08-2017 14:15:42)

Отсутствует

 

№177201-09-2017 01:56:08

polk90
Участник
 
Группа: Members
Зарегистрирован: 07-07-2005
Сообщений: 80
UA: Firefox 55.0

Re: Обсуждение кнопок CB

долго браузер не обновлял, обновился до Waterfox _55.0.22,
часть кнопок работать перестали.

была кнопка рестарта Firefox, брал там

Инициализация

Выделить код

Код:

// ***** VARS ***** //

var prompts = Components.classes["@mozilla.org/embedcomp/prompt-service;1"]
                        .getService(Components.interfaces.nsIPromptService);




// ***** FUNCTIONS ***** //

function createBrandingBundle() {
    var myBrandingPath = null;
    var myStringBundleService = Components.classes["@mozilla.org/intl/stringbundle;1"]
                        .getService(Components.interfaces.nsIStringBundleService);
    
    myBrandingPath = "chrome://branding/locale/brand.properties"
    return myStringBundleService.createBundle(myBrandingPath);
}


function getWindowType() {
    // Relies on Branding Code so can not be run on startup
    var myBrandStrings = createBrandingBundle();
    var thisBrandShortName = myBrandStrings.GetStringFromName("brandShortName")
    switch (thisBrandShortName) {
      case "Mozilla Thunderbird":
      case "Shredder":
      case "Thunderbird":
        return "mail:3pane";
      case "Nvu":
        return "composer:html";
      case "Calendar":
      case "Sunbird":
        return "calendarMainWindow";
      case "eMusic Download Manager":
      case "eMusic Remote":
        return "emusic:window";
      case "Songbird":
        return "Songbird:Main";
      default:
        return "navigator:browser";
    }
}


function Restart()
{
    // Notify all windows that an application quit has been requested.
    var os = Components.classes["@mozilla.org/observer-service;1"]
                     .getService(Components.interfaces.nsIObserverService);
    var cancelQuit = Components.classes["@mozilla.org/supports-PRBool;1"]
                              .createInstance(Components.interfaces.nsISupportsPRBool);
    os.notifyObservers(cancelQuit, "quit-application-requested", "restart");

    // Something aborted the quit process.
    if (cancelQuit.data)
     return false;

    var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"]
                     .getService(Components.interfaces.nsIWindowMediator);
    var windows = wm.getEnumerator("");

    var windowType = getWindowType();

    while (windows.hasMoreElements()) {
      var myConfigWindow = windows.getNext().QueryInterface(Components.interfaces.nsIDOMWindowInternal);
      if (myConfigWindow.document.documentElement.getAttribute("windowtype") != windowType) {
         myConfigWindow.close();
      }
    }

    if ("@zeniko/crashrecoveryservice;1" in Components.classes) {
      nsPreferences.setBoolPref("extensions.crashrecovery.resume_session_once", true);
    }

    var appStartup = Components.interfaces.nsIAppStartup;
    Components.classes["@mozilla.org/toolkit/app-startup;1"]
      .getService(appStartup).quit(appStartup.eRestart | appStartup.eAttemptQuit);

    return true;
}




// ***** MOUSE HANDLING ***** //

this.leftclick = function(evt) {
  var RestartProceed = prompts.confirm(null, "Restart Firefox", "Перезапустить приложение?");
  if (RestartProceed) {
    Restart();
  }
}

this.aleftclick = function(evt) {
  Restart();
}




// ***** INITIALISATION ***** //

this.tooltipText = "Restart";
this.style.opacity = '.85';

this.setAttribute("onclick","custombuttons.gQuot.mHandler(event, this)");
this.setAttribute('ondblclick', 'gQuot(event, this)');




// ***** ATTRIBUTES ***** //

this.setAttribute('author','Rawny, zooot');
this.setAttribute('version','4');
this.setAttribute('homepage', 'http://custombuttons2.com/forum/buttons/buttons-database/restart-session-restore.html');
this.setAttribute('dependency','FF2.0*, FL1.0*, TB2.0*, CB2 2.0.5*');
this.setAttribute('status','Complete');
this.setAttribute('public',true)


посмотрите пожалуйста, можно поправить?

Отредактировано polk90 (05-09-2017 04:59:47)

Отсутствует

 

№177301-09-2017 02:48:16

mokujin
Участник
 
Группа: Members
Зарегистрирован: 17-02-2017
Сообщений: 505
UA: Firefox 32.0

Re: Обсуждение кнопок CB


...программисты словно войну какую-то ведут за свои обновления. Блин, почему сейчас повсюду мания ухудшать интерфейсы и делать их максимально неудобными?! Radiation

Отсутствует

 

№177401-09-2017 12:28:31

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

Re: Обсуждение кнопок CB

polk90 пишет

долго браузер не обновлял, обновился до Waterfox _55.0.22,
часть кнопок работать перестали.
была кнопка рестарта Firefox, брал там
посмотрите пожалуйста, можно поправить?

Выделить код

Код:

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%3ERestart%20%28with%20confirmation%29%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjM2qefiJQAAA6hJREFUOE9VkwtMU1cYx/+9tYAKWAYixWXjIQpYBGEF3AZoNKEyLeCiDQ+dBidjQHj4qHEoyLYw0KCTQUarqLQisGRmG+CCo0zEGljXAI0dr0InJpDNER/Lqin026GajJ3kl3Puyf1+93+/nMPD4pGpFYLHSbxErnJ3Hr3HA3lbbXa71U6WpzbSzv9tU8NORvB5TzFPfmyu/688XStakae7LFWO/pXcYqF930/RwbYpkn8zSYnqMYqq+438ywzTyOr5Ghndb7nk3/uO/2Gv7aUgXesrKuzvKPrpj7lDHQ9pd+sEpTSbKXURu1rMlNJkpo01921LP+p9kHx9cm79CT0BaV2eHvn3mg53/Wk/1P6QZOylheL3WyZIdt3sYGG9sOfYZ/JtjWN0Vj9LkScNTHDgduKOhvEn+bdmSKoepyTNOIs8Tn4Vg+Sr6HewpmqIpEycxARJTLaT/VZ53yxFnPyV4F3Y25bWNk2bNWaKaRijmEujtLyw5wmSGlQIzZQiJEPKkzXdWHpYZxOrRknSOEFvt/xOBXdnab2ij+D/cdczWdsM+dWN0Ju1I+R2VEdI+KqGdcaLwWHLpQDsbG1Dds8cFCxy2RCtrB0n2a1HFJj/M0F05A6FaaZI8IWJBBX3iZP/YEVQntjR3PgrTth6rRMZP9pQzL52jDXtExb71AAFXZ4k770dBHn7MqqyeFDeIOhgH2iTGtaQGvg6BJLzexBZ1YzwzzXYwAj9VIOQ8pesO61BRGUL4tUuzz+zuFG2ASS/DYprBvlXI+fVAVnGZk/Gax6pEItzESnJhTh8H4LWJsN/hQRvIKx6SX+JyYmy9Bzt6gbtYYTW4YFPBT7wLIe3sBRebB0XW++cd84YvP+CMSJZadoUd6QzKNzvBEvqnoucvTfdX5QYRQ5BRi8oS4f5ba14HK3CgETFv7P7hmsnK26sN8VUKI1xRXWGd9KTVT5bndNYOucdCAwo57ouDL9rLzAIKVMHytFjvsiAZ0cNmC4bdB86P7xGqxyOblaZ4quVxoTjxe1r93vlI5ZLgDMgAMelYsu6SlfjGVO4/ZRxFRUYOLvCiOenTdyjs8O+IxfNUXevmjd/ywS1xzqDS18vdpIjAsLF91DAbUdiYKlz94H2gBcKvZAqx1bO1Vh8HistoWaVOeaXMl3IzZQrqy+uLuZnIwyrWDHvfzeZPQgEsdiwPA3Hgytd9NEqNyvjH0m928zGL90HAkqWnHPaDik/CiLHAXs1/gU8lc1wSyvYVQAAAABJRU5ErkJggg%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/*Initialization%20Code*/%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5Bif%20%28%20%21custombuttons.confirmBox%28null%2C%20%22%u041F%u0435%u0440%u0435%u0437%u0430%u043F%u0443%u0441%u0442%u0438%u0442%u044C%20%u0431%u0440%u0430%u0443%u0437%u0435%u0440%3F%22%2C%20%22%u0414%u0430%22%2C%20%22%u041E%u0442%u043C%u0435%u043D%u0430%22%29%20%29%20return%3B%20%0Avar%20startup%20%3D%20Services.startup%3B%0Astartup.quit%28startup.eForceQuit%20%7C%20startup.eRestart%29%3B%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%5BLeft%20%20%20%20%20%20%20%20%3D%20Restart%20application%20with%20confirmation%20dialogue%0AAlt+Left%20%3D%20Restart%20application%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

Отсутствует

 

№177501-09-2017 14:02:02

polk90
Участник
 
Группа: Members
Зарегистрирован: 07-07-2005
Сообщений: 80
UA: Firefox 55.0

Re: Обсуждение кнопок CB

bunda1
Спасибо, но к сожалению, у меня не заработало,
пробовал и на чистом профиле, только с этой кнопкой,
может что-то в 55 перепилили, что не дает ей сработать?

Отсутствует

 

Board footer

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