Изменить масштаб( Firefox 24 + )
Автор: bunda1
Версия: от 27.11.2017.
Описание: Kод создает в адресной строке кнопку которая показывает размер масштаба текущей страницы. Можно передвигать кнопку в адресной строке относительно других элементов строки изменяя в коде величину в строке margin-right: -1px;
http://s019.radikal.ru/i625/1206/5c/3f192014a0e7.jpg 
Колесиком мыши на кнопке можно менять масштаб текущей страницы.
Левым кликом на кнопке можно переключить режим изменения масштаба - менять масштаб страниц или менять масштаб только текста на страницах, если переключена на менять только текст размер масштаба в адресной строке будет отображаться жирным шрифтом.
Средним кликом  на кнопке можно переключить - единый масштаб для всех страниц или только для сайта, если переключена на единый масштаб для всех страниц - размер масштаба в адресной строке будет красного цвета.
Правым кликом на кнопке можно сбросить масштаб на 100%.

Использование: положите код в любую Custom Buttons кнопку, в инициализацию. Не обязательно создавать новую CB кнопку, можно использовать уже существующую.

Выделить код

Код:

// Кнопка для управления масштабом страницы в адресной строке, от 27.11.2017. ..........................
(()=> {
   // Удалить из адресной строки FF51 стандартную кнопку масштаба ....
   var but = document.getElementById('urlbar-zoom-button');
   if (but) but.style.display = "none";
   
   // Создать в адресной строке кнопку масштаба ....
   var zoomButton = document.createElement("statusbarpanel");
   var urlbarIcons = document.getElementById("urlbar-icons") || document.getElementById("page-action-buttons"); // FF57
   urlbarIcons.insertBefore(zoomButton, urlbarIcons.lastChild); // перед последней кнопкой адресной строки
   addDestructor(()=> zoomButton.remove());
     
   updateZoomButton(); 
   zoomButton.id = "zoomButton";
   zoomButton.setAttribute("context", "event.stopPropagation()");
   zoomButton.style.cssText = "-moz-appearance: none; border: 0; margin-right: -1px;"; // Css стиль для кнопки масштаба   
   zoomButton.tooltipText = "Л: Менять масштаб страницы или только текста\nС: Единый масштаб для всех страниц \nП: Сбросить масштаб на 100% ";

   
   // Отслеживать клики на кнопке масштаба ....           
   addEventListener("click", e=> {                  
      if ( e.button == 0 ) ZoomManager.toggleZoom(); // переключить режим изминения масштаба
      
      if ( e.button == 1 ) { // единый масштаб для всех страниц
           cbu.isPref("CB.zoom.allEvenly", false);
           cbu.setPrefs("CB.zoom.allEvenly", !cbu.getPrefs("CB.zoom.allEvenly") );
           cbu.setPrefs("CB.zoom.Percent", ZoomManager.zoom.toFixed(2) );
                
           updateZoomButton();
           }

      if ( e.button == 2 ) FullZoom.reset(); // сбросить масштаб
               
   }, false, zoomButton);

         
   // Менять масштаб колесиком мыши на кнопке масштаба ....
   addEventListener("DOMMouseScroll", e=> {
      e.detail > 0 ? FullZoom.reduce() : FullZoom.enlarge();
   }, false, zoomButton);
           
 
   // Следим за изменением масштаба и запускаем обновление кнопки ....
   var str = "{ setTimeout(()=> { updateZoomButton() }, 50);";
   var handleEvent = parseInt(Services.appinfo.version) > 33 ? FullZoom.handleEvent : FullZoom._handleMouseScrolled;
   var array = [FullZoom.reset, FullZoom.reduce, FullZoom.enlarge, ZoomManager.toggleZoom, handleEvent];
   array.forEach(func=> { setTimeout(()=> { eval( (func.toString().replace('_', '.').match(/function ([^(]*)\(/)[1] + " = " + func.toString().replace("{", str)) )}, 50) }); 
   addDestructor(()=> { 
      array.forEach(func=> { eval( (func.toString().replace('_', '.').match(/function ([^(]*)\(/)[1] + " = " + func.toString()).replace(str,"{") ) });  
   });   
   
   
   // Показывать текущий масштаб страницы на кнопке и изменять цвет и шрифт отображения масштаба ....
   function updateZoomButton(e) {
      zoomButton.label = Math.round(ZoomManager.zoom*100) + "%"; 
      setTimeout(()=> {  
         zoomButton.style.fontWeight = ZoomManager.useFullZoom ? '' : 'bold';
         zoomButton.style.color = cbu.getPrefs("CB.zoom.allEvenly") ? "red" : "";
      }, 5);
      
      // запомнить текущий масштаб в 'about:config'
      if ( e == undefined ) { 
           try { window.clearTimeout(zoomButton.prefTimeout) } catch(e) {};
           zoomButton.prefTimeout = window.setTimeout(()=> {
              cbu.setPrefs("CB.zoom.Percent", ZoomManager.zoom.toFixed(2) )  
           }, 250);
           }     
   };
     
     
   // Устанавливать единый масштаб для всех страниц если это разрешено в 'about:config' ....
   addEventListener("TabAttrModified", e=> {
      if ( e.target.linkedBrowser.currentURI.spec !== gBrowser.currentURI.spec ) return;
             
      if ( cbu.getPrefs("CB.zoom.allEvenly") && content.location.protocol.startsWith("http") ) {
           var value = cbu.getPrefs("CB.zoom.Percent");
           if ( ZoomManager.zoom.toFixed(2) == value ) return;

           setTimeout(()=> { 
              gBrowser.markupDocumentViewer[ZoomManager.useFullZoom ? 'fullZoom' : 'textZoom'] = value;
              updateZoomButton(e);   
           }, 0); 
           }      
      else 
           updateZoomButton(e);
                 
   }, true, gBrowser.tabContainer);   
})();

Добавьте пожалуйста сброс до 100% по правому клику или по двойному.

bunda1 пишет:

Левым кликом на кнопке можно переключить - менять масштаб страницы или только текста на странице(размер масштаба в адресной строке будет жирным шрифтом).

ПКМ и СКМ тоже

Andrey_Krropotkin пишет:

Добавьте пожалуйста сброс до 100% по правому клику или по двойному.

Я сделал сброс до 100% по правому клику.

13-11-2011 15:59:39

mserv пишет:

bunda1 пишет:

Левым кликом на кнопке можно переключить - менять масштаб страницы или только текста на странице(размер масштаба в адресной строке будет жирным шрифтом).

ПКМ и СКМ тоже

Исправил.  :) Спасибо что быстро находишь мои ошибки.

bunda1
Пользуюсь вашей кнопкой Zoom2 Просматриваешь скажем форум, выставил 200% масштаб, переходишь на вторую страницу форума сбрасывает на 100%, тоже самое при открытии др. вкладки или новой страницы.
Можно ли сделать, чтобы отформатированный масштаб браузер сохранял на другие страницы?

BBoxerb пишет:

Пользуюсь вашей кнопкой Zoom2 Просматриваешь скажем форум, выставил 200% масштаб, переходишь на вторую страницу форума сбрасывает на 100%

У меня такого не наблюдается, это на каком форуме? Кнопка устанавливает единый масштаб для сайта - под одним адресом, но не для новых страниц, которые находятся на других сайтах.

BBoxerb пишет:

Можно ли сделать, чтобы отформатированный масштаб браузер сохранял на другие страницы?

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


Можно зделать так.
about:config
browser.zoom.siteSpecific - false

Изменить масштаб (Firefox 3.6 - 10)
Добавил новые возможности:
Теперь можно: cредним кликом  на кнопке переключить - единый масштаб для всех страниц или только для сайта, если переключена на единый масштаб для всех страниц - размер масштаба в адресной строке будет подчеркнут.

Была у меня ваша кнопка "Zoom2" я решил сделать еще одну кнопку "Изменить масштаб", но поскольку мне нужно чтобы масштаб сохранялся, а не откатывался на 100% я обе кнопки удалил, но в адресной строке масштаб остался:)
Щас я создал новую кнопку, масштаб выделяется ЛКМ, подчеркивается Средней кнопкой, откатывается до 100 ПКМ, но главное подчеркивание средней кнопкой не сохраняет масштаб:(

BBoxerb пишет:

но главное подчеркивание средней кнопкой не сохраняет масштаб:(

Точно есть такая проблема, самопроизвольный сброс на 100% ,тут надо подумать.
Но вроде решение есть.

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

mserv
Тут проблема, я уже пытался это сделать, но #ucjs_zoom_statuslabel{color: green !important;} почему то не получается.

bunda1
А черту приблизить ближе к цифре это возможно?

mserv пишет:

bunda1
А черту приблизить ближе к цифре это возможно?

папробуй изменить в userChrome.css высоту для #ucjs_zoom_statuslabel
или измени в коде

Выделить код

Код:

Zoom.style.borderBottom = "1px solid";

на что то, например на

Выделить код

Код:

Zoom.style.borderRight = "1px solid";

Изменить масштаб (Firefox 3.6 - 10)
Исправил ошибки:
самопроизвольный сброс на 100% если кнопка переключена на единый масштаб для всех страниц.

bunda1
Cовсем другое дело, спасибо:)

Изменить масштаб (Firefox 3.6 - 10)
Исправил ошибки:
самопроизвольный сброс масштаба,  если масштаб на странице изменялся расширением FireGestures или чем то подобным и если кнопка была переключена на единый масштаб для всех страниц.

может не в тему, но есть ли расширение для firefox добавляющее в строку состояния две кнопки "-""+" для масштабирования станицы? чтоб не крутить колёсико мыши удерживая Ctrl

Всем привет! Подскажите, как выставить для мозиллы например масштаб 200 для всех страниц?

iluha-mai
Средним кликом  на кнопке можно переключить - единый масштаб для всех страниц или только для сайта, если переключена на единый масштаб для всех страниц - размер масштаба в адресной строке будет подчеркнут.

Изменить масштаб (Firefox 3.6 +) Изменить масштаб(Firefox 3.6 +)
Изменил: Теперь если кнопка переключена на единый масштаб для всех страниц - размер масштаба в адресной строке будет красного цвета.

bunda1
Обновил код иниц. Нууу что-то у меня при открытии новой вкладки масштаб выделенный красным сбрасывает на 100%, скажем с 80-->100:rolleyes:

BBoxerb пишет:

Обновил код иниц. Нууу что-то у меня при открытии новой вкладки масштаб выделенный красным сбрасывает на 100%, скажем с 80-->100:rolleyes:

Так и должно быть, ты же включил единый масштаб для всех страниц = 100% 20-05-2012 17:47:57

bunda1
Наверное что-то не так вставил, я правивльно понимаю, что если жирным черным то он должен сохранять старый масштаб для всех вкладок( скажем 80%) а с красным он сбрасывает на 100%?

BBoxerb пишет:

... я правивльно понимаю, что если жирным черным то он должен сохранять старый масштаб для всех вкладок( скажем 80%) а с красным он сбрасывает на 100%?

Нет не правильно:
Если жирным черным то для каждого сайта будет свой масштаб.
Если красным то будет единый масштаб для всех страниц, если включил красный на странице у который масштаб скажем 80% то у всех страниц теперь будет 80%. Но это можно любой момент изменить если колесиком мыши изменить масштаб текущей страницы и тогда у всех страниц теперь будет размер такой же как текущей страницы. Все просто.

bunda1
А нельзя сделать, чтобы правило красного распространялось и на вкладки? При открытии новой вкладки он сбрасывает на 100%
В Огн.Лисе лично я открываю новые вкладки по максимуму, а новую страницу только тогда, когда вкладок накопится штук 20-ть:)

BBoxerb
Ты наверно имеешь виду открытие новых окон, действительно масштаб сбрасывается на 100%. Попробую с этим что то сделать.

Изменить масштаб (Firefox 3.6 +) 13-11-2011 02:51:31
Исправил ошибки:
Самопроизвольный сброс масштаба в новом окне.

Уменьшил потребление ресурсов кодом кнопки.
Убрал лишний код.
Добавил в исключения для единого масштаба все страницы about: и страницу Fast Dial

Cнова я:)
Как-то странно, открываешь новую вкладку, масштаб сохраняется.
Но часто бывает, что через скажем минуту, масштаб страницы сжимается до крошечного:(
Приходится кликать на 100%.
Не пойму, это оттого, что у меня другие кнопки на масштаб установлены, в частности твоя, которая меняет мин. размер шрифта с 12 на 24?
Вставлял код/редактировал кнопку несколько раз, не помогает.
Ничего такого не замечал?

BBoxerb пишет:

Cнова я:)
Как-то странно, открываешь новую вкладку, масштаб сохраняется.
Но часто бывает, что через скажем минуту, масштаб страницы сжимается до крошечного:(
Приходится кликать на 100%.
Не пойму, это оттого, что у меня другие кнопки на масштаб установлены, в частности твоя, которая меняет мин. размер шрифта с 12 на 24?
Вставлял код/редактировал кнопку несколько раз, не помогает.
Ничего такого не замечал?

Если я правильно понял у тебя самопроизвольный уменьшается масштаб ?
Кнопка Наименьший размер шрифта вряд ли виновата.
Такое возможно если использовать CB кнопки или расширения которые использует жесты мыши как расширения FireGestures, ты такие используешь ?

BBoxerb пишет:

Не пойму, это оттого, что у меня другие кнопки на масштаб установлены

Какие кнопки ?

bunda1
Ты мне сделал кнопку которая меняет миним. размер шрифта с одного на другое.
Самопроизвольно сжимается масштаб походу из-за мыши (обычная мышь Логитек о расширениях Firegestus даже не слышал что это?) и когда средняя кнопка мыши в режиме "КРАСНЫЙ-выделенный"
Я сейчас пользуюсь режимом ЧЕрный-Выделенный, но каждый раз когда я открываю новую вкладку он сбрасывает на 100%
Зато в режиме Черного-выделенного не сжимает самопроизвольно масштаб :)
(Я уже грил я открываю вкладки а не новые страницы, новые страницы открываю когда вкладок уже открыто много:))

При открытии новых окон не сохраняется масштаб, как исправить?

Mils пишет:

При открытии новых окон не сохраняется масштаб, как исправить?

У меня такой баг не наблюдается. Когда ты устанавливал или обновлял кнопку? Я уже исправлял такой баг 06-07-2012 21:38:56

bunda1
После сегодняшнего обновления в [nightly] масштаб меняет, а отображает постоянно 100%.

voqabuhe пишет:

После сегодняшнего обновления в [nightly] масштаб меняет, а отображает постоянно 100%.

Да в коде были ошибки я их исправыл но код все равно не работает как надо и старый код тоже. Похоже на Nightly сломали:

Выделить код

Код:

eval("FullZoom.onLocationChange = " + FullZoom.onLocationChange.toString().replace(/}$/, __cmd));

27-05-2013 21:03:48
Буду думать :|

27-05-2013 21:13:28
Ну вроде исправил: Изменить масштаб( Firefox 3.6 + )

bunda1 пишет:

Ну вроде исправил: Изменить масштаб( Firefox 3.6 + )

Да спасибо, теперь вроде всё работает. Кстати с предыдущей версией у меня  никаких проблем не было.

bunda1
В режиме "менять масштаб страниц" ошибка осталась. С той лишь разницей, что отображается ранее установленный масштаб.

Если я правильно понял то после переключения на режим "менять масштаб страниц" переключаясь на другие сайты масштаб меняется но на кнопке отображается ранее установленный масштаб.
Я такой глюк на Nightly не наблюдаю и вроде такое невозможно :/
Что пишет консоль ошибок ?

bunda1
Да  правильно понял.  Именно так всё и происходит, правда с небольшим уточнением :), как оказалось, если менять масштаб на кнопке, то всё работает, это у меня не меняется, если пользуюсь жестами. Так что вопрос снимается, буду с   FireGestures разбираться.

Увеличить масштаб:

Выделить код

Код:

document.getElementById("cmd_fullZoomEnlarge").doCommand();

Уменьшить масштаб:

Выделить код

Код:

document.getElementById("cmd_fullZoomReduce").doCommand();

bunda1
Да всё спасибо. Я уже нашёл, там есть свои, вот так выглядят 
Увеличить:
cmd_fullZoomEnlarge
Уменьшить:
cmd_fullZoomReduce

bunda1
В [nightly], если переключить режим отображения страницы менять масштаб страницы/только текст, а затем ПКМ открыть любую ссылку на странице, то дополнительно открывается ещё две вкладки и их колличество прибавляется после каждого переключения. :(

voqabuhe пишет:

bunda1
В [nightly], если переключить режим отображения страницы менять масштаб страницы/только текст, а затем ПКМ открыть любую ссылку на странице, то дополнительно открывается ещё две вкладки и их колличество прибавляется после каждого переключения. :(

Ты уверен, ни какой связи с открытием ссылок на странице не должно быть. Может попробуй:

Выделить код

Код:

// Кнопка для управления масштабом страницы в адресной строке, от 30.11.2013. ................................
(function () {   
   // Создать в адресной строке кнопку масштаба ....
   var zoomButton = document.createElement("statusbarpanel");
   var urlbarIcons = document.getElementById("urlbar-icons");
   urlbarIcons.insertBefore( zoomButton, urlbarIcons.lastChild ); // перед первой иконкой адресной строки
   addDestructor(function() { urlbarIcons.removeChild( zoomButton ) });
   
   updateZoomButton(); 
   zoomButton.id = "zoomButton";
   zoomButton.style.cssText = "-moz-appearance: none; border: 0; margin-right: -20px;"; // Css стиль для кнопки масштаба
   zoomButton.tooltipText = "Л: Менять масштаб страницы или только текста\nС: Единый масштаб для всех страниц \nП: Сбросить масштаб на 100% ";

   
   // Отслеживать клики на кнопке масштаба ....           
   addEventListener("click", function(e) {                  
      if ( e.button == 0 ) ZoomManager.toggleZoom(); // переключить режим изминения масштаба
      
      if ( e.button == 1 ) { // единый масштаб для всех страниц
           cbu.isPref("CB.zoom.allEvenly", false );
           cbu.setPrefs("CB.zoom.allEvenly", !cbu.getPrefs("CB.zoom.allEvenly") );
           cbu.setPrefs("CB.zoom.Percent", ZoomManager.zoom.toFixed(2) );
                
           updateZoomButton();
           }

      if ( e.button == 2 ) { e.preventDefault(); FullZoom.reset() }; // сбросить масштаб
               
   }, false, zoomButton );

         
   // Менять масштаб колесиком мыши на кнопке масштаба ....
   addEventListener("DOMMouseScroll", function(e) {
      e.detail > 0 ? FullZoom.reduce() : FullZoom.enlarge();
   }, false, zoomButton );
           
 
   // Следим за изменением масштаба и запускаем изменения отображения масштаба на кнопке или установку единого масштаба ....
   var str = "updateZoomButton(); $&";//
   var array = [FullZoom.reset, FullZoom.reduce, FullZoom.enlarge, ZoomManager.toggleZoom, FullZoom._handleMouseScrolled];
   array.forEach(function( func ) { eval( (func.toString().match(/function ([^(]*)\(/)[1] + " = " + func.toString().replace(/}$/, str)).replace('_', '.') ) }); 
   addDestructor(function() { 
      array.forEach(function( func ) { eval( (func.toString().match(/function ([^(]*)\(/)[1] + " = " + func.toString()).replace('_', '.') ) });  
   });
   
   
   // Показывать текущий масштаб страницы на кнопке и изменять цвет и шрифт отображения масштаба ....
   function updateZoomButton(e) {
      zoomButton.label = Math.round(ZoomManager.zoom*100) + "%"; 
      setTimeout(function() {  
         zoomButton.style.fontWeight = ZoomManager.useFullZoom ? '' : 'bold';
         zoomButton.style.color = cbu.getPrefs("CB.zoom.allEvenly") ? "red" : "";
      }, 5);

      if ( e == undefined ) cbu.setPrefs("CB.zoom.Percent", ZoomManager.zoom.toFixed(2) )       
   };
     
     
   // Устанавливать единый масштаб для всех страниц если это разрешено в 'about:config' ....
   addEventListener("TabAttrModified", function(e) { 
      if ( e.target.linkedBrowser.currentURI.spec !== gBrowser.currentURI.spec ) return;
             
      if ( cbu.getPrefs("CB.zoom.allEvenly") && content.location.protocol.startsWith("http") ) {
       var value = cbu.getPrefs("CB.zoom.Percent");
       if ( ZoomManager.zoom.toFixed(2) == value ) return;

       setTimeout(function() {  
              gBrowser.markupDocumentViewer[ZoomManager.useFullZoom ? 'fullZoom' : 'textZoom'] = value;
              updateZoomButton(e);   
           }, 0) 
           }
      
      else updateZoomButton(e);      
   }, true, gBrowser.tabContainer );   
})();

bunda1 пишет:

Ты уверен, ни какой связи с открытием ссылок на странице не должно быть.

Конечно уверен, несколько раз пробовал.

Может попробуй:

   Что-то не то, все кнопки пропали, которые там были вместе с Масштабом.   
Виноват, видно неправильно вставил. Всё нормально работает, а главное так оперативно.
  Спасибо!!! :beer:

Я пользуюсь кнопкой с этого форума, не могу даже сказать точное название. Вот её код

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

Выделить код

Код:

this.tooltipText = "[L=Zoom+ |M=Page/Text |R=Zoom-]";

var prefs = Components.classes["@mozilla.org/preferences-service;1"].getService(Ci.nsIPrefBranch);

var TextIcon = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACQklEQVQ4jaWSzUtUYRTGf+97rzM6V22YVBQJa1GbPjCiIMJFzaJNYosiiSAooV0ryWW7Nv0DiYXRJnAVtgqMaBEEFShJovmRM43jfDsfd+aO9973bWVIjBZ0ls/znIdzznPgP0vsRYxPvt/KFUqVRHLLS6RE36sXtxpqZSPwZP/A1aagdSBkRXqlGe7bTJcxgkev/LPB9ZsPxoslh0zOJpkqkUiWsLoHXzfSmo3AuhfsysYKxBNFFpezlIoFlG8DdADZfScYvv1oJpO1WVjK8PHTUj6+vpJWfhmUS0vn0Nu/rnDoyOmoXd0mnamQXH1+w9l69xAMhNGMGew5ta9B/5nLI0ppao6HXd0GJzbjVuafSLMVabQjDItg+OLTPQ0Gr41O2NVtsjmbjdiX6R3crS5PC9mMkEECbSfuNjTo7Dzc79Q98oUqyXSZaurl0A5XTU0NmaaJECZCGBjNx0Z2uN/PcX9sKleuycjc/CbLqzHUdg7QCCOENCyQAdAK7dsor0xl45mAXTEWSkS+LiRZWVnEq62h3C0QAmm0Icx2pBFCyABaK7SuA1Y/2LMC4PylsZlivScaj33HrXzDKX2+gxZ9SImUzSADKF/9DIXPTiAkWnto38k7+TcHTYB0qTOaSf/ArS5Ttxen8cuTAChQuw7m1rqGjUBHFHzQKgIgWiIXRptazz32amu4tTXcylwPsPln3jsVDA9orV3QPtqrfRBW772KcuIVt570lJtvVfX18F7NAKZ1fBbtd2vtOdKw+n4B6skL1gRzZQAAAAAASUVORK5CYII=';

var PageIcon = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAwElEQVQ4jd3RMWpCQRSF4S/iBtyCELHW1sIV6ALiRnQH4hJ0ByF2Ym8aG1Ml8Ji3ArXRDZhUA+bx3qCWHjgw3Jn57+XcF1fq0JXQF7vUvYxw4bfKGWHO4mFA9AfLJCAjdOhG9+jPWVxDmrSSgLIGGz4jYMwEaslQCtqyLdbuAgwYxvOJM9SrHscRoUFjwLDFKwTy97Igb93CG6P4p3KCQF6sHdhPma1YJwGBvF22phLdFeKTAv6F+MP3gf2R462AP7hdbq8C1bDsAAAAAElFTkSuQmCC';

if(prefs.getBoolPref("browser.zoom.full"))
  this.image = PageIcon;
else
  this.image = TextIcon;
this.leftclick = function(e)
{
document.getElementById("cmd_fullZoomEnlarge").doCommand();
}

this.midclick = function (evt){
if(prefs.getBoolPref("browser.zoom.full"))
{  
prefs.setBoolPref("browser.zoom.full", false);
this.image = TextIcon;
ucjs_zoom.updateZoom();
}
else{
prefs.setBoolPref("browser.zoom.full", true);
this.image = PageIcon;
ucjs_zoom.updateZoom();
}
  };

this.rightclick = function(event) {
document.getElementById("cmd_fullZoomReduce").doCommand();    
};
this. gQuot = {};
this. gQuot. __proto__ = custombuttons. gQuot;
this. gQuot. dcDelay = 0;
this. setAttribute ('onclick', 'this.gQuot.mHandler(event, this)');
      
       
//Zoom+ ........................................ 
var ucjs_zoom = {    
     _TAGET_ID:    "page-report-button",
     
    // Цвет и знаков(default: представляющая режим масштабирования)
    _ZOOM_MODE: [ { txt: "\Full Zoom", color: "false", font: "font-weight: normal ;" },       // Полный зум, черный
                  { txt: "\Zoom", color: "true", font: "font-weight: bold;" } ],    // Масштаб текста синий
    

    //Инициализация
    init: function() {
        
        // Zoom 
        var _cmd = "ucjs_zoom.updateZoom(); $&";
        // toggleZoom
        eval("ZoomManager.toggleZoom = " + ZoomManager.toggleZoom.toString().replace(/}$/, _cmd));
        // reset
        eval("FullZoom.reset = " + FullZoom.reset.toString().replace(/}$/, _cmd));
        // enlarge
        eval("FullZoom.enlarge = " + FullZoom.enlarge.toString().replace(/}$/, _cmd));
        // reduce
        eval("FullZoom.reduce = " + FullZoom.reduce.toString().replace(/}$/, _cmd));
        // onLocationChange
        eval("FullZoom.onLocationChange = " + FullZoom.onLocationChange.toString().replace(/}$/, _cmd));
        // _handleMouseScrolled
        _cmd = "setTimeout(ucjs_zoom.updateZoom, 0); $&";
        eval("FullZoom._handleMouseScrolled = " + FullZoom._handleMouseScrolled.toString().replace(/}$/, _cmd));

        

      // Zoom Создание панели
        var zoomPanel = document.createElement("statusbarpanel");
        zoomPanel.setAttribute("id", "ucjs_zoom_statuslabel");
        zoomPanel.setAttribute("context", "ucjs_zoom-context");
        var targetPanel = document.getElementById(this._TAGET_ID);
        targetPanel.parentNode.insertBefore(zoomPanel, targetPanel.nextSibling);
        
        // Zoom Колесико прокрутки на панели
        zoomPanel.addEventListener("DOMMouseScroll", function(event){
         if (event.detail > 0) FullZoom.reduce();
        else FullZoom.enlarge();
        }, false);
        
        //Zoom Reset
        zoomPanel.addEventListener("click", function(){document.getElementById("cmd_fullZoomReset").doCommand()}, true);
    

    },

    // Чтобы изменить значение масштаба для определения количества
    set_Zoom: function(n) {
        var markupDocumentViewer = getBrowser().markupDocumentViewer;
        if (!markupDocumentViewer) return;

        if (ZoomManager.useFullZoom) {
            if (markupDocumentViewer.textZoom != 1) markupDocumentViewer.textZoom = 1;
            if (markupDocumentViewer.fullZoom != n) markupDocumentViewer.fullZoom = n;
        } else {
            if (markupDocumentViewer.textZoom != n) markupDocumentViewer.textZoom = n;
            if (markupDocumentViewer.fullZoom != 1) markupDocumentViewer.fullZoom = 1;
        }
        ucjs_zoom.updateZoom();
        return n;
    },

     // Обновить статус кнопки
    updateZoom: function(){
        
        // Кнопка для обновления статуса
        var Zoom = document.getElementById("ucjs_zoom_statuslabel");
        Zoom.setAttribute("label", Math.floor((ZoomManager.zoom + 0.005) * 100) + "%");
        Zoom.setAttribute("tooltiptext", ucjs_zoom._ZOOM_MODE[ZoomManager.useFullZoom? 0: 1].txt);
        Zoom.setAttribute("ZoomStyle", ucjs_zoom._ZOOM_MODE[ZoomManager.useFullZoom? 0: 1].color);
        Zoom.setAttribute("style", ucjs_zoom._ZOOM_MODE[ZoomManager.useFullZoom? 0: 1].font);
        
   }    
};
//Запускаем функцию
// не запускаем функцию, если функция уже выполнялась
if (!document.getElementById("ucjs_zoom_statuslabel")) ucjs_zoom.init();




//image Change Size.......................................
(function imageChangeSize(){
    // выходим, если функция уже выполнялась
    if (document.getElementById("imagechangesize")) return;

    const MAGNIFICATION = 2; 
    const MAX_MAGNIFICATION = MAGNIFICATION * 8; 
    const MIN_MAGNIFICATION = MAGNIFICATION / 8; 
    const ZOOM_ATTR = "jsa-zoom"; 
    const kXULNS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";

    var contextMenu = document.getElementById("contentAreaContextMenu");
    var separator = document.getElementById("context-sep-properties");
    var eventTarget = null;

    var menu = document.createElementNS(kXULNS, "menu");
    menu.id = "imagechangesize";
    var locale = Components.classes["@mozilla.org/preferences-service;1"]
                         .getService(Components.interfaces.nsIPrefBranch)
                         .getCharPref("general.useragent.locale");
    menu.setAttribute("label", locale.indexOf("ru") == -1 ? "Image zoom" : "Изменить размер");

    menu.setAttribute("accesskey", "i");
    menu.hidden = true;
    contextMenu.insertBefore(menu, separator);

    var menuPopup = document.createElementNS(kXULNS, "menupopup");
    menu.appendChild(menuPopup);

    var lst = [
        {
          label:"\Zoom (+)",
          command:zoomIn
        },
        {
          label:"\Zoom (-)",
          command:zoomOut
        },
        {
          label:"\Zoom (0)",
          command:original
        }
        ];
    
    for(var i = 0, m; m = lst[i]; i++){
        var menuItem = document.createElementNS(kXULNS, "menuitem");
        menuItem.setAttribute("label", m.label);
        if ("accesskey" in m) menuItem.setAttribute("accesskey", m.accesskey);
        menuItem.addEventListener("command", m.command, false);
        menuItem.id = "image-change-size-" + m.label.toString();
        menuPopup.appendChild(menuItem);
    }

    contextMenu.addEventListener("popupshowing", setMenuDisplay, false);

    function setMenuDisplay(aEvent) {
        if(gContextMenu.onImage){
            document.getElementById("imagechangesize").hidden = false;
        }else{
            document.getElementById("imagechangesize").hidden = true;
        }
    }

    function zoomIn(){
        var imgObj = gContextMenu.target;
        if(imgObj.localName.toLowerCase() != "img") return;
        var zoom = imgObj.getAttribute(ZOOM_ATTR);
        if(zoom == null) zoom = 1;
        if(MAX_MAGNIFICATION > zoom){
            zoom = parseFloat(zoom) * MAGNIFICATION;
            imgObj.width = imgObj.naturalWidth * zoom;
            imgObj.height = imgObj.naturalHeight * zoom;
            imgObj.setAttribute(ZOOM_ATTR, zoom);
        }
    }

    function original(){
        var imgObj = gContextMenu.target;
        if(imgObj.localName.toLowerCase() != "img") return;

        imgObj.width = imgObj.naturalWidth;
        imgObj.height = imgObj.naturalHeight;
        imgObj.removeAttribute(ZOOM_ATTR);
    }

    function zoomOut(){
        var imgObj = gContextMenu.target;
        if(imgObj.localName.toLowerCase() != "img") return;

        var zoom = imgObj.getAttribute(ZOOM_ATTR);
        if(zoom == null) zoom = 1;

        if(MIN_MAGNIFICATION < zoom){
            zoom = parseFloat(zoom) / MAGNIFICATION;
            if(zoom == 0){
                imgObj.width = imgObj.naturalWidth;
                imgObj.height = imgObj.naturalHeight;
            }else{
                imgObj.width = imgObj.naturalWidth * zoom;
                imgObj.height = imgObj.naturalHeight * zoom;
            }
            imgObj.setAttribute(ZOOM_ATTR, zoom);
        }
    }

})();


Менять кнопку мне бы не хотелось, эта меня вполне устраивает. Но одно НО - часто в адресной строке показан масштаб 100%, хотя на самом деле он другой.
Как бы эту кнопку довести до ума?

rbfyec
Знакомый код :)

Попробуй:

Выделить код

Код:

this.tooltipText = "[L=Zoom+ |M=Page/Text |R=Zoom-]";

var prefs = Components.classes["@mozilla.org/preferences-service;1"].getService(Ci.nsIPrefBranch);

var TextIcon = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACQklEQVQ4jaWSzUtUYRTGf+97rzM6V22YVBQJa1GbPjCiIMJFzaJNYosiiSAooV0ryWW7Nv0DiYXRJnAVtgqMaBEEFShJovmRM43jfDsfd+aO9973bWVIjBZ0ls/znIdzznPgP0vsRYxPvt/KFUqVRHLLS6RE36sXtxpqZSPwZP/A1aagdSBkRXqlGe7bTJcxgkev/LPB9ZsPxoslh0zOJpkqkUiWsLoHXzfSmo3AuhfsysYKxBNFFpezlIoFlG8DdADZfScYvv1oJpO1WVjK8PHTUj6+vpJWfhmUS0vn0Nu/rnDoyOmoXd0mnamQXH1+w9l69xAMhNGMGew5ta9B/5nLI0ppao6HXd0GJzbjVuafSLMVabQjDItg+OLTPQ0Gr41O2NVtsjmbjdiX6R3crS5PC9mMkEECbSfuNjTo7Dzc79Q98oUqyXSZaurl0A5XTU0NmaaJECZCGBjNx0Z2uN/PcX9sKleuycjc/CbLqzHUdg7QCCOENCyQAdAK7dsor0xl45mAXTEWSkS+LiRZWVnEq62h3C0QAmm0Icx2pBFCyABaK7SuA1Y/2LMC4PylsZlivScaj33HrXzDKX2+gxZ9SImUzSADKF/9DIXPTiAkWnto38k7+TcHTYB0qTOaSf/ArS5Ttxen8cuTAChQuw7m1rqGjUBHFHzQKgIgWiIXRptazz32amu4tTXcylwPsPln3jsVDA9orV3QPtqrfRBW772KcuIVt570lJtvVfX18F7NAKZ1fBbtd2vtOdKw+n4B6skL1gRzZQAAAAAASUVORK5CYII=';

var PageIcon = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAwElEQVQ4jd3RMWpCQRSF4S/iBtyCELHW1sIV6ALiRnQH4hJ0ByF2Ym8aG1Ml8Ji3ArXRDZhUA+bx3qCWHjgw3Jn57+XcF1fq0JXQF7vUvYxw4bfKGWHO4mFA9AfLJCAjdOhG9+jPWVxDmrSSgLIGGz4jYMwEaslQCtqyLdbuAgwYxvOJM9SrHscRoUFjwLDFKwTy97Igb93CG6P4p3KCQF6sHdhPma1YJwGBvF22phLdFeKTAv6F+MP3gf2R462AP7hdbq8C1bDsAAAAAElFTkSuQmCC';

if(prefs.getBoolPref("browser.zoom.full"))
  this.image = PageIcon;
else
  this.image = TextIcon;
this.leftclick = function(e)
{
document.getElementById("cmd_fullZoomEnlarge").doCommand();
}

this.midclick = function (evt){
if(prefs.getBoolPref("browser.zoom.full"))
{  
prefs.setBoolPref("browser.zoom.full", false);
this.image = TextIcon;
ucjs_zoom.updateZoom();
}
else{
prefs.setBoolPref("browser.zoom.full", true);
this.image = PageIcon;
ucjs_zoom.updateZoom();
}
  };

this.rightclick = function(event) {
document.getElementById("cmd_fullZoomReduce").doCommand();    
};
this. gQuot = {};
this. gQuot. __proto__ = custombuttons. gQuot;
this. gQuot. dcDelay = 0;
this. setAttribute ('onclick', 'this.gQuot.mHandler(event, this)');
      
       
//Zoom+ ........................................ 
var ucjs_zoom = {    
     _TAGET_ID:    "page-report-button",
     
    // Цвет и знаков(default: представляющая режим масштабирования)
    _ZOOM_MODE: [ { txt: "\Full Zoom", color: "false", font: "font-weight: normal ;" },       // Полный зум, черный
                  { txt: "\Zoom", color: "true", font: "font-weight: bold;" } ],    // Масштаб текста синий
    

    //Инициализация
    init: function() {
        
        // Zoom 
        var _cmd = "ucjs_zoom.updateZoom(); $&";
        // toggleZoom
        eval("ZoomManager.toggleZoom = " + ZoomManager.toggleZoom.toString().replace(/}$/, _cmd));
        // reset
        eval("FullZoom.reset = " + FullZoom.reset.toString().replace(/}$/, _cmd));
        // enlarge
        eval("FullZoom.enlarge = " + FullZoom.enlarge.toString().replace(/}$/, _cmd));
        // reduce
        eval("FullZoom.reduce = " + FullZoom.reduce.toString().replace(/}$/, _cmd));
        // _handleMouseScrolled
        _cmd = "setTimeout(ucjs_zoom.updateZoom, 0); $&";
        eval("FullZoom._handleMouseScrolled = " + FullZoom._handleMouseScrolled.toString().replace(/}$/, _cmd));
        
        addEventListener("TabAttrModified", function(e) { 
           if ( e.target.linkedBrowser.currentURI.spec !== gBrowser.currentURI.spec ) return;             
           ucjs_zoom.updateZoom();      
        }, true, gBrowser.tabContainer );
        

      // Zoom Создание панели
        var zoomPanel = document.createElement("statusbarpanel");
        zoomPanel.setAttribute("id", "ucjs_zoom_statuslabel");
        zoomPanel.setAttribute("context", "ucjs_zoom-context");
        var targetPanel = document.getElementById(this._TAGET_ID);
        targetPanel.parentNode.insertBefore(zoomPanel, targetPanel.nextSibling);
        
        // Zoom Колесико прокрутки на панели
        zoomPanel.addEventListener("DOMMouseScroll", function(event){
         if (event.detail > 0) FullZoom.reduce();
        else FullZoom.enlarge();
        }, false);
        
        //Zoom Reset
        zoomPanel.addEventListener("click", function(){document.getElementById("cmd_fullZoomReset").doCommand()}, true);
    

    },

    // Чтобы изменить значение масштаба для определения количества
    set_Zoom: function(n) {
        var markupDocumentViewer = getBrowser().markupDocumentViewer;
        if (!markupDocumentViewer) return;

        if (ZoomManager.useFullZoom) {
            if (markupDocumentViewer.textZoom != 1) markupDocumentViewer.textZoom = 1;
            if (markupDocumentViewer.fullZoom != n) markupDocumentViewer.fullZoom = n;
        } else {
            if (markupDocumentViewer.textZoom != n) markupDocumentViewer.textZoom = n;
            if (markupDocumentViewer.fullZoom != 1) markupDocumentViewer.fullZoom = 1;
        }
        ucjs_zoom.updateZoom();
        return n;
    },

     // Обновить статус кнопки
    updateZoom: function(){
        
        // Кнопка для обновления статуса
        var Zoom = document.getElementById("ucjs_zoom_statuslabel");
        Zoom.setAttribute("label", Math.floor((ZoomManager.zoom + 0.005) * 100) + "%");
        Zoom.setAttribute("tooltiptext", ucjs_zoom._ZOOM_MODE[ZoomManager.useFullZoom? 0: 1].txt);
        Zoom.setAttribute("ZoomStyle", ucjs_zoom._ZOOM_MODE[ZoomManager.useFullZoom? 0: 1].color);
        Zoom.setAttribute("style", ucjs_zoom._ZOOM_MODE[ZoomManager.useFullZoom? 0: 1].font);
        
   }    
};
//Запускаем функцию
// не запускаем функцию, если функция уже выполнялась
if (!document.getElementById("ucjs_zoom_statuslabel")) ucjs_zoom.init();




//image Change Size.......................................
(function imageChangeSize(){
    // выходим, если функция уже выполнялась
    if (document.getElementById("imagechangesize")) return;

    const MAGNIFICATION = 2; 
    const MAX_MAGNIFICATION = MAGNIFICATION * 8; 
    const MIN_MAGNIFICATION = MAGNIFICATION / 8; 
    const ZOOM_ATTR = "jsa-zoom"; 
    const kXULNS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";

    var contextMenu = document.getElementById("contentAreaContextMenu");
    var separator = document.getElementById("context-sep-properties");
    var eventTarget = null;

    var menu = document.createElementNS(kXULNS, "menu");
    menu.id = "imagechangesize";
    var locale = Components.classes["@mozilla.org/preferences-service;1"]
                         .getService(Components.interfaces.nsIPrefBranch)
                         .getCharPref("general.useragent.locale");
    menu.setAttribute("label", locale.indexOf("ru") == -1 ? "Image zoom" : "Изменить размер");

    menu.setAttribute("accesskey", "i");
    menu.hidden = true;
    contextMenu.insertBefore(menu, separator);

    var menuPopup = document.createElementNS(kXULNS, "menupopup");
    menu.appendChild(menuPopup);

    var lst = [
        {
          label:"\Zoom (+)",
          command:zoomIn
        },
        {
          label:"\Zoom (-)",
          command:zoomOut
        },
        {
          label:"\Zoom (0)",
          command:original
        }
        ];
    
    for(var i = 0, m; m = lst[i]; i++){
        var menuItem = document.createElementNS(kXULNS, "menuitem");
        menuItem.setAttribute("label", m.label);
        if ("accesskey" in m) menuItem.setAttribute("accesskey", m.accesskey);
        menuItem.addEventListener("command", m.command, false);
        menuItem.id = "image-change-size-" + m.label.toString();
        menuPopup.appendChild(menuItem);
    }

    contextMenu.addEventListener("popupshowing", setMenuDisplay, false);

    function setMenuDisplay(aEvent) {
        if(gContextMenu.onImage){
            document.getElementById("imagechangesize").hidden = false;
        }else{
            document.getElementById("imagechangesize").hidden = true;
        }
    }

    function zoomIn(){
        var imgObj = gContextMenu.target;
        if(imgObj.localName.toLowerCase() != "img") return;
        var zoom = imgObj.getAttribute(ZOOM_ATTR);
        if(zoom == null) zoom = 1;
        if(MAX_MAGNIFICATION > zoom){
            zoom = parseFloat(zoom) * MAGNIFICATION;
            imgObj.width = imgObj.naturalWidth * zoom;
            imgObj.height = imgObj.naturalHeight * zoom;
            imgObj.setAttribute(ZOOM_ATTR, zoom);
        }
    }

    function original(){
        var imgObj = gContextMenu.target;
        if(imgObj.localName.toLowerCase() != "img") return;

        imgObj.width = imgObj.naturalWidth;
        imgObj.height = imgObj.naturalHeight;
        imgObj.removeAttribute(ZOOM_ATTR);
    }

    function zoomOut(){
        var imgObj = gContextMenu.target;
        if(imgObj.localName.toLowerCase() != "img") return;

        var zoom = imgObj.getAttribute(ZOOM_ATTR);
        if(zoom == null) zoom = 1;

        if(MIN_MAGNIFICATION < zoom){
            zoom = parseFloat(zoom) / MAGNIFICATION;
            if(zoom == 0){
                imgObj.width = imgObj.naturalWidth;
                imgObj.height = imgObj.naturalHeight;
            }else{
                imgObj.width = imgObj.naturalWidth * zoom;
                imgObj.height = imgObj.naturalHeight * zoom;
            }
            imgObj.setAttribute(ZOOM_ATTR, zoom);
        }
    }

})();


Замени код и сделай рестарт.

bunda1
Теперь порядок! Спасибо! :D

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

rbfyec пишет:

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

А зачем, в чём проблема?

bunda1 пишет:

А зачем, в чём проблема?

Кнопка "Открывать всё в новых вкладках, от 17.11.2013" из этого поста http://forum.mozilla-russia.org/viewtop … 66#p633366 вроде работает хорошо, но всё же иногда закладки и др. начинают открываться в текущей вкладке.

Помогает перезапуск этой кнопки.

rbfyec пишет:

Кнопка "Открывать всё в новых вкладках, от 17.11.2013" из этого поста http://forum.mozilla-russia.org/viewtop … 66#p633366 вроде работает хорошо, но всё же иногда закладки и др. начинают открываться в текущей вкладке.
Помогает перезапуск этой кнопки.

Мистика, не возможно. А закладки ты откуда отрываешь?

bunda1 пишет:

А закладки ты откуда отрываешь?

Menubar - Закладки - выпадающий список

rbfyec
Да "Открывать всё в новых вкладках, от 17.11.2013" глючит буду исправлять.

bunda1 пишет:

Да "Открывать всё в новых вкладках, от 17.11.2013" глючит буду исправлять.

Буду ждать :)

rbfyec пишет:

bunda1 пишет:

Да "Открывать всё в новых вкладках, от 17.11.2013" глючит буду исправлять.

Буду ждать :)

Выделить код

Код:

// Открывать всё в новых вкладках, от 06.12.2013. ......................................
(function () {
   // открывать всё в новых вкладках, если пустая страница открывать в текущей ....
   const where = whereToOpenLink;
   eval("whereToOpenLink = " + where.toString().replace('return "current";\n}', '\nif ( ["about:newtab", "about:blank"].indexOf(content.location.href)!= -1 ) return "current"; \nreturn e.originalTarget.id ? "tab" : "current";;\n}'));   

   // открывать закладки и историю в новых вкладках, если букмарклети или пустая страница в текущей ....
   const openNode = PlacesUIUtils._openNodeIn;
   eval("PlacesUIUtils._openNodeIn = " + openNode.toString().replace(') {', '){\n if (["about:newtab", "about:blank"].indexOf(content.location.href)!= -1 ) aWhere = "current";\n aWhere = (aWhere == "tab" || aNode.uri.startsWith("javascript:") ) ? "current" : "tab";\n')
   );

   // если JavaScript ссылка или пустая страница открывать в текущей ....
   const linkIn = openLinkIn;
   eval("openLinkIn = " + linkIn.toString().replace(';', ';;\n if ( url.startsWith("javascript:") ) where = "current";\n if (["about:newtab", "about:blank"].indexOf(content.location.href)!= -1 ) where = "current";')
   );

   // команды адресной строки открывают всё связанное с адресной строкой в новых вкладках, если alt+ в текущей ....
   const handle = gURLBar.handleCommand;
   eval("gURLBar.handleCommand = " + handle.toString().replace(/aTriggeringEvent\s*&&\s*aTriggeringEvent.altKey/, "!($&)"));

   // удалять изменения из внутренних функций Firefox ....
   addDestructor(function() {
      eval("whereToOpenLink = " + where);
      eval("PlacesUIUtils._openNodeIn = " + openNode);
      eval("openLinkIn = " + linkIn);
      eval("gURLBar.handleCommand = " + handle);
   });
   
})();

Спасибо! Теперь буду тестить, гонять во всех режимах, смотреть что получится :)

Что замечено: если кликнуть кнопку "Перезагрузить" - это открывает страницу в новой вкладке. Несмотря на нажатый Alt.

То же самое если кликнуть стрелку в адресной строке (id="go-button").
А вот если нажимать Enter (фокус в адресной строке) - тогда да, без Alt адрес открывается в новой вкладке, с Alt - в текущей.

bunda1
А можешь сделать чтобы Открывать всё в новых вкладках работала с Location Bar Enhancer в адресной строке?

rbfyec и voqabuhe
Лучше перенести обсуждение Открывать всё в новых вкладках сюда Custom Buttons | Форум Mozilla Россия

bunda1 пишет:

Изменить масштаб( Firefox 3.6 + )
Автор: bunda1
Версия: от 30.11.2013.
Описание: Kод создает в адресной строке кнопку которая показывает размер масштаба текущей страницы.

Колесиком мыши на кнопке можно менять масштаб текущей страницы.
Левым кликом на кнопке можно переключить режим изменения масштаба - менять масштаб страниц или менять масштаб только текста на страницах, если переключена на менять только текст размер масштаба в адресной строке будет отображаться жирным шрифтом.
Средним кликом  на кнопке можно переключить - единый масштаб для всех страниц или только для сайта, если переключена на единый масштаб для всех страниц - размер масштаба в адресной строке будет красного цвета.
Правым кликом на кнопке можно сбросить масштаб на 100%.

Использование: положите код в любую Custom Buttons кнопку, в инициализацию. Не обязательно создавать новую CB кнопку, можно использовать уже существующую.

У меня возник вопрос касательно текстового зума.
Не знаю, правда, или это в принципе возможно, но если да, то хотелось бы иметь эту возможность (или если можно, покажите как её добавить)
Допустим у меня полный зум ( и текст и остальное) равен 90%.
Левым кликом я оставлю текст в 90%, а всё остальное будет переведено в 100%.
Далее я могу регулировать как угодно зум текста колёсиком.
Это - то, что мы имеем на сегодня.
Есть ли возможность ввести режим (назовём его "Текст1"), при переключении на который полный зум останется таким как был до переключения (а не 100% безусловно), а текстовый зум я смогу менять как угодно?
Или это просто в принципе невозможно?

difabor пишет:

Есть ли возможность ввести режим (назовём его "Текст1"), при переключении на который полный зум останется таким как был до переключения (а не 100% безусловно), а текстовый зум я смогу менять как угодно?
Или это просто в принципе невозможно?

Возможность такая наверно есть но я не знаю как это сделать. Надо подумать.

Спасибо! Менять масштаб только текста это шикарно!!!

Заметил небольшую особенность, если добавляешь код инициализации в существующую кнопку, то она мутнеет (обесцвечивается).
Это можно поправить? :)

ma3ca пишет:

Заметил небольшую особенность, если добавляешь код инициализации в существующую кнопку, то она мутнеет (обесцвечивается).
Это можно поправить?

№5914

voqabuhe пишет:

№5914

Вставил код, перед инициализацией кода масштаба, но не помогло.

Там даже если новую кнопку создавать, то она все-равно обесцвеченная получается. :)

Разобрался, отключил дополнение, которое меняло масштаб, оставил только эту кнопку.

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

ma3ca пишет:

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

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

Выделить код

Код:

zoomButton.style.fontWeight = ZoomManager.useFullZoom ? '' : 'bold';

на:

Выделить код

Код:

zoomButton.style.fontFamily = ZoomManager.useFullZoom ? '' : 'cursive';

Спасибо bunda1 за отличную кнопку!

Давно хотел что-то подобное и вы можно сказать реализовали мою мечту :)

Нашел небольшую проблему: у меня кнопка оказалась не самой левой в ряду иконок:
http://s018.radikal.ru/i515/1406/f6/7b1d9aa62ebf.png
Проверял на чистом профайле, там кнопка встала слева от звезды, но после зотеро.
Помогло изменение в коде в данной строке:

Выделить код

Код:

...
urlbarIcons.insertBefore( zoomButton, urlbarIcons.lastChild ); // перед первой иконкой адресной строки
...

заменил lastChild на firstChild и кнопка встала на своё место - самое левое после всех иконок.

Проверено на фаере 29, виндоус 7.

Похоже что зотеро запускает похожий код добавления кнопки но после того как срабатывает расширение Сustom Buttons и код Изменить масштаб

02-06-2014 23:19:47
Мда, фраза перед первой иконкой адресной строки немного водит в заблуждение. Исправлю. Спасибо :)

bunda1
В [nightly] показывает одинаковый масштаб для всех страниц. Сама кнопка стала тусклой, как не активная, а в сборных кнопка вообще не работает. Если можно поправь, плиз.

voqabuhe пишет:

bunda1
В [nightly] показывает одинаковый масштаб для всех страниц. Сама кнопка стала тусклой, как не активная, а в сборных кнопка вообще не работает. Если можно поправь, плиз.

Выделить код

Код:

// Кнопка для управления масштабом страницы в адресной строке, от 30.11.2013. ................................
(function () {   
   // Создать в адресной строке кнопку масштаба ....
   var zoomButton = document.createElement("statusbarpanel");
   var urlbarIcons = document.getElementById("urlbar-icons");
   urlbarIcons.insertBefore( zoomButton, urlbarIcons.lastChild ); // перед последней кнопкой адресной строки
   addDestructor(function() { urlbarIcons.removeChild( zoomButton ) });
   
   updateZoomButton(); 
   zoomButton.id = "zoomButton";
   zoomButton.style.cssText = "-moz-appearance: none; border: 0; margin-right: -20px;"; // Css стиль для кнопки масштаба
   zoomButton.tooltipText = "Л: Менять масштаб страницы или только текста\nС: Единый масштаб для всех страниц \nП: Сбросить масштаб на 100% ";

   
   // Отслеживать клики на кнопке масштаба ....           
   addEventListener("click", function(e) {                  
      if ( e.button == 0 ) ZoomManager.toggleZoom(); // переключить режим изминения масштаба
      
      if ( e.button == 1 ) { // единый масштаб для всех страниц
           cbu.isPref("CB.zoom.allEvenly", false );
           cbu.setPrefs("CB.zoom.allEvenly", !cbu.getPrefs("CB.zoom.allEvenly") );
           cbu.setPrefs("CB.zoom.Percent", ZoomManager.zoom.toFixed(2) );
                
           updateZoomButton();
           }

      if ( e.button == 2 ) { e.preventDefault(); FullZoom.reset() }; // сбросить масштаб
               
   }, false, zoomButton );

         
   // Менять масштаб колесиком мыши на кнопке масштаба ....
   addEventListener("DOMMouseScroll", function(e) {
      e.detail > 0 ? FullZoom.reduce() : FullZoom.enlarge();
   }, false, zoomButton );
           
 
   // Следим за изменением масштаба и запускаем обновление кнопки ....
   var str = "updateZoomButton(); $&";
   var array = [FullZoom.reset, FullZoom.reduce, FullZoom.enlarge, ZoomManager.toggleZoom, FullZoom.handleEvent];
   array.forEach(function( func ) { eval( (func.toString().match(/function ([^(]*)\(/)[1] + " = " + func.toString().replace(/}$/, str)).replace('_', '.') ) }); 
   addDestructor(function() { 
      array.forEach(function( func ) { eval( (func.toString().match(/function ([^(]*)\(/)[1] + " = " + func.toString()).replace('_', '.') ) });  
   });
   
   
   // Показывать текущий масштаб страницы на кнопке и изменять цвет и шрифт отображения масштаба ....
   function updateZoomButton(e) {
      zoomButton.label = Math.round(ZoomManager.zoom*100) + "%"; 
      setTimeout(function() {  
         zoomButton.style.fontWeight = ZoomManager.useFullZoom ? '' : 'bold';
         zoomButton.style.color = cbu.getPrefs("CB.zoom.allEvenly") ? "red" : "";
      }, 5);
      
      // запомнить текущий масштаб в 'about:config'
      if ( e == undefined ) { 
           try { window.clearTimeout( prefTimeout ) } catch(e) {};
           prefTimeout = window.setTimeout(function() {
              cbu.setPrefs("CB.zoom.Percent", ZoomManager.zoom.toFixed(2) )  
           }, 250 );
           }     
   };
     
     
   // Устанавливать единый масштаб для всех страниц если это разрешено в 'about:config' ....
   addEventListener("TabAttrModified", function(e) { 
      if ( e.target.linkedBrowser.currentURI.spec !== gBrowser.currentURI.spec ) return;
             
      if ( cbu.getPrefs("CB.zoom.allEvenly") && content.location.protocol.startsWith("http") ) {
       var value = cbu.getPrefs("CB.zoom.Percent");
       if ( ZoomManager.zoom.toFixed(2) == value ) return;

       setTimeout(function() {  
              gBrowser.markupDocumentViewer[ZoomManager.useFullZoom ? 'fullZoom' : 'textZoom'] = value;
              updateZoomButton(e);   
           }, 0) 
           }
      
      else updateZoomButton(e);      
   }, true, gBrowser.tabContainer );   
})();

bunda1
Спасибо, теперь всё работает, всё отлично.

А можно соединить эту кнопку с этой:

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

Выделить код

Код:

// Объявляем переменные для этой вкладки ................................
var _this = this;
var alertsService = Components.classes["@mozilla.org/alerts-service;1"].getService(Components.interfaces.nsIAlertsService);
var bmsvc = Components.classes["@mozilla.org/browser/nav-bookmarks-service;1"].getService(Components.interfaces.nsINavBookmarksService);


var ucjsMouseGestures = {

   // настройки ....
   enableWheelGestures: true,
   enableRockerGestures: true,
   enablePopupGestures: true,

   _lastX: 0,
   _lastY: 0,
   _directionChain: '',
   _isMouseDownL: false,
   _isMouseDownR: false,
   _hideFireContext: false,    //for windows
   _shouldFireContext: false, //for linux
   POPUP_ID: 'GesturePopup',
   
   // Жесты ....
   GESTURES: {
           
// Управление страницей ................................
  'W-':{name:'Увеличить масштаб',cmd:function(){ FullZoom.enlarge() }},
  'W+':{name:'Уменьшить масштаб',cmd:function(){ FullZoom.reduce() }},
  'UDU':{name:'Сбросить масштаб',cmd:function(){ FullZoom.reset() }},
  'L<R':{name:'Сбросить масштаб',cmd:function(){ FullZoom.reset() }},
},

init:function() {
    var self = this;
    var events = ["mousedown", "mousemove", "mouseup", "contextmenu"];
    if ( this.enableRockerGestures ) events.push("draggesture");
    if ( this.enableWheelGestures ) events.push("DOMMouseScroll");
    function registerEvents( aAction, eventArray ) {
       eventArray.forEach(function(aType) { gBrowser.mPanelContainer[aAction + "EventListener"]( aType, self, true ) });
    };
    registerEvents("add", events);

    window.addEventListener("unload", function() { 
           registerEvents("remove",events);
    }, false );
    addDestructor(function() { registerEvents("remove", events) }); 
},

handleEvent:function( event ) {
    switch( event.type ) {
        case"mousedown":
            if ( event.button ==2 ) {
                 this._isMouseDownR = true;
                 this._hideFireContext = false;
                 this._startGesture( event );
                 }
            if ( this.enableRockerGestures ) {
                 if ( event.button == 2 && this._isMouseDownL ) {
                      this._isMouseDownL = false;
                      this._isMouseDownR = false;
                      this._shouldFireContext = false;
                      this._hideFireContext = true;
                      this._directionChain = "L>R";
                      this._stopGesture(event);
                      }
                 else if ( event.button == 0 ) {
                           this._isMouseDownL = true;
                           if ( this._isMouseDownR ) {
                                this._isMouseDownL = false;
                                this._shouldFireContext = false;
                                this._hideFireContext = true;
                                this._directionChain = "L<R";
                                this._stopGesture( event );
                                }
                           }
                 }
                break;

        case"mousemove":
            if ( this._isMouseDownR ) {
                 this._hideFireContext = true;
                 this._progressGesture( event );
                 }
            break;

        case"mouseup":
            if ( content.xdTrailArea ) {
                 content.xdTrailArea.parentNode.removeChild( content.xdTrailArea );
                 content.xdTrailArea = content.document.documentElement.appendChild(document.createElementNS("http://www.w3.org/1999/xhtml", "xdTrailArea"));
                 }
            if ( event.ctrlKey && event.button == 2 ) {
                 this._isMouseDownL = false;
                 this._isMouseDownR = false;
                 this._shouldFireContext = false;
                 this._hideFireContext = false;
                 this._directionChain = '';
                 event.preventDefault();
                 XULBrowserWindow.statusTextField.label = "Reset Gesture";
                 break;
                 }
            if ( this._isMouseDownR && event.button == 2 ) {
                 if ( this._directionChain ) this._shouldFireContext = false;
                      this._isMouseDownR = false;
                      this._stopGesture( event );
                 if ( this._shouldFireContext && !this._hideFireContext ) {
                      this._shouldFireContext = false;
                      this._displayContextMenu( event );
                      }
                 }
            else if ( this.enableRockerGestures && event.button == 0 && this._isMouseDownL ) { 
                      this._isMouseDownL = false;
                      this._shouldFireContext = false;
                      }
            else if ( this.enablePopupGestures && ( event.button == 0 || event.button == 1 ) && event.target.localName =='menuitem' ) {
                      this._isMouseDownL = false;
                      this._shouldFireContext = false;
                      var popup = document.getElementById( this.POPUP_ID );
                      var activeItem = event.target;
                  
                      switch( popup.getAttribute("gesturecommand") ) {
                          case"WebSearchPopup":
                              var selText = popup.getAttribute("selectedtext");
                              var engine = activeItem.engine;
                              if ( !engine ) break;
                              var submission = engine.getSubmission( selText, null );
                              if ( !submission ) break;
                              document.getElementById('searchbar').textbox.value = selText;
                              gBrowser.loadOneTab( submission.uri.spec,null,null,submission.postData,null,false );
                              break;
                          case"ClosedTabsPopup":
                              undoCloseTab( activeItem.index );
                              break;
                          case"HistoryPopup":
                              gBrowser.webNavigation.gotoIndex( activeItem.index );
                              break;
                          case"AllTabsPopup":
                              gBrowser.selectedTab = gBrowser.mTabs[activeItem.index];
                              break;
                          }
                      popup.hidePopup();
                      }
            try { document.getElementById("statusbar-display").label = "" } catch(e) {};
            break;
        
        case"popuphiding":
            var popup = document.getElementById( this.POPUP_ID );
            popup.removeEventListener("popuphiding",this,true);
            document.documentElement.removeEventListener("mouseup",this,true);
            while( popup.hasChildNodes() ) popup.removeChild( popup.lastChild );
            break;

        case"contextmenu":
            if ( this._isMouseDownL || this._isMouseDownR || this._hideFireContext ) {
                 event.preventDefault();
                 event.stopPropagation();
                 this._shouldFireContext = true;
                 this._hideFireContext = false;
                 }
            break;

        case"DOMMouseScroll":
            if ( this.enableWheelGestures&&this._isMouseDownR ) {
                 event.preventDefault();
                 event.stopPropagation();
                 this._shouldFireContext = false;
                 this._hideFireContext = true;
                 this._directionChain = "W" + ( event.detail > 0 ? "+" : "-" );
                 this._stopGesture(event);
                 }
             break;

        case"draggesture":
            this._isMouseDownL = false;
            break;
        }
},

_displayContextMenu:function( event ) {
    var evt = event.originalTarget.ownerDocument.createEvent("MouseEvents");
    evt.initMouseEvent("contextmenu",true,true,event.originalTarget.defaultView,0,event.screenX,event.screenY,event.clientX,event.clientY,false,false,false,false,2,null);
    event.originalTarget.dispatchEvent(evt);
},

_startGesture:function( event ) {
    this._lastX = event.screenX;
    this._lastY = event.screenY;
    this._directionChain = "";
},

_progressGesture:function( event ) {
    var x = event.screenX, y = event.screenY;
    var lastX = this._lastX, lastY = this._lastY;
    var subX = x-lastX, subY=y-lastY;
    var distX = ( subX > 0 ? subX : (-subX) ), distY = ( subY > 0 ? subY : ( -subY ) );
    var direction;
    if ( distX < 10 && distY < 10 ) return;
        
        if ( distX > distY ) direction = subX < 0 ? "L" : "R";
    else direction = subY < 0 ? "U" : "D";

    var dChain = this._directionChain;
    if ( direction !== dChain.charAt( dChain.length-1 ) ) {
         dChain += direction;
         this._directionChain += direction;
         var gesture = this.GESTURES[dChain];
         XULBrowserWindow.statusTextField.label = "Жест мыши: "+ dChain + ( gesture ? ' ('+ gesture.name +')' : '' );
         }
    this._lastX = x;
    this._lastY = y;
},

_stopGesture:function(event){
    try {
        if ( dChain = this._directionChain ) this.GESTURES[dChain].cmd( this, event );
        XULBrowserWindow.statusTextField.label = "";
    }
    catch(e) {
             setTimeout(function() { XULBrowserWindow.statusTextField.label = "Неизвестный жест мыши: " + dChain }, 0);
             setTimeout(function() { XULBrowserWindow.statusTextField.label = "" }, 600);
    }
    this._directionChain = "";
},

_buildPopup:function( event,gestureCmd ) {
    if ( !this.enablePopupGestures ) return;
    var popup = document.getElementById( this.POPUP_ID );
    if ( !popup ) {
         popup = document.createElement("popup");
         popup.id = this.POPUP_ID;
         }
    document.getElementById("mainPopupSet").appendChild( popup );
    popup.setAttribute("gesturecommand", gestureCmd );
    
    switch( gestureCmd ) {
        case"WebSearchPopup":
            var searchSvc = Cc["@mozilla.org/browser/search-service;1"].getService(Ci.nsIBrowserSearchService);
            var engines = searchSvc.getVisibleEngines({});
            if ( engines.length < 1 ) throw"Поисковые системы не установлены.";
            for ( var i = engines.length - 1; i >= 0;--i ) {
                  var engine = engines[i];
                  var menuitem = document.createElement("menuitem");
                  menuitem.setAttribute("label", engine.name );
                  menuitem.setAttribute("class", "menuitem-iconic");
                  if ( engine.iconURI ) menuitem.setAttribute("src", engine.iconURI.spec );
                  popup.insertBefore( menuitem, popup.firstChild );
                  menuitem.engine = engine;
                  }
            popup.setAttribute("selectedtext", getBrowserSelection().toString() );
            break;
        
        case"ClosedTabsPopup":
            try {
                if ( !gPrefService.getBoolPref("browser.sessionstore.enabled") ) throw"Функция восстановления сессий отключена.";
                }
            catch(e){}
            var ss = Cc["@mozilla.org/browser/sessionstore;1"].getService(Ci.nsISessionStore);
            if ( ss.getClosedTabCount(window) ==0 ) throw"Нет восстанавливаемых вкладок в этом окне.";
            var undoItems = eval("("+ss.getClosedTabData(window)+")");
            for ( var i=0, LEN = undoItems.length; i<LEN; i++ ) {
                  var menuitem=popup.appendChild(document.createElement("menuitem"));
                  menuitem.setAttribute("label",undoItems[i].title);
                  menuitem.setAttribute("class","menuitem-iconic bookmark-item");
                  menuitem.index = i;
                  var iconURL = undoItems[i].image;
                  if ( iconURL ) menuitem.setAttribute("image", iconURL );
                  }
            break;
        
        case"HistoryPopup":
            var sessionHistory = gBrowser.webNavigation.sessionHistory;
            if ( sessionHistory.count<1 ) throw"Нет истории в этой вкладке.";
            var curIdx = sessionHistory.index;
            for ( var i = 0, shc = sessionHistory.count; i < shc; i++ ) {
                  var entry = sessionHistory.getEntryAtIndex(i,false);
                  if ( !entry ) continue;
                  var menuitem = document.createElement("menuitem");
                  popup.insertBefore(menuitem,popup.firstChild);
                  menuitem.setAttribute("label",entry.title);
                  try {
                      var iconURL = Cc["@mozilla.org/browser/favicon-service;1"].getService(Ci.nsIFaviconService).getFaviconForPage( entry.URI ).spec;
                      menuitem.style.listStyleImage = "url("+iconURL+")";
                      }
                  catch(e){}
                  menuitem.index = i;
                  if ( i==curIdx ) {
                       menuitem.style.listStyleImage = "";
                       menuitem.setAttribute("type","radio");
                       menuitem.setAttribute("checked","true");
                       menuitem.className = "unified-nav-current";
                       activeItem = menuitem;
                       }
                  else 
                       {
                       menuitem.className = i< curIdx ? "unified-nav-back menuitem-iconic" : "unified-nav-forward menuitem-iconic";
                       }
            }
            break;
        
        case"AllTabsPopup":
            var tabs = gBrowser.mTabs;
            if ( tabs.length < 1 ) return;
            for ( var i=0, LEN = tabs.length; i < LEN; i++ ) {
                  var menuitem = popup.appendChild(document.createElement("menuitem"));
                  var tab = tabs[i];
                  menuitem.setAttribute("class", "menuitem-iconic bookmark-item");
                  menuitem.setAttribute("label", tab.label);
                  menuitem.setAttribute("crop", tab.getAttribute("crop") );
                  menuitem.setAttribute("image", tab.getAttribute("image"));
                  menuitem.index = i;
                  if ( tab.selected ) menuitem.setAttribute("style", "color: red; font-weight: bold;");
                  if ( tab.hasAttribute('unread') ) menuitem.setAttribute("style", "color: blue;"); 
                  }
            break;
        }
        
    document.popupNode = null;
    document.tooltipNode = null;
    popup.addEventListener("popuphiding", this, true);
    popup.openPopup( null, "", event.clientX, event.clientY, false, false );
    document.documentElement.addEventListener("mouseup", this, true);
},
  };
ucjsMouseGestures.init();  


?
И получится отличная замена MouseZoom

В каком смысле соединить, я не понял?

Оставить масштаб в адресной строке, функции ЛК и СК, а масштаб менять и сбрасывать по ПКМ+колёсико и ПК+ЛК. Чтоб не в адресной строке.
Я пока положил в одну инициализацию, в принципе работает и так.

Mishania пишет:

Я пока положил в одну инициализацию, в принципе работает и так.

Да можно и так.

Не отображается изменение масштаба (застопорилось на 100%) - PM 24.7.2

Quartz1t пишет:

Не отображается изменение масштаба (застопорилось на 100%) - PM 24.7.2

На FF 24.8.1 работает, а что показывает при переключение масштаба выше 100% на кнопке консоль ошибок: chrome://global/content/console.xul

bunda1 пишет:

что показывает при переключение масштаба выше 100% на кнопке консоль ошибок: chrome://global/content/console.xul

пусто. попробую на "чистом" профиле, с одним дополнением СВ и одной кнопкой. после отпишусь...

29-09-2014 12:24:11
с "чистым" всё работает правильно. какая-то несовместимость... зря поднял шум. разберусь самостоятельно. спасибо.

----------------------------------

удалил дополнение Zoom Page и всё заработало, а вот простое отключение ничего не дало, что и ввело в заблуждение...

bunda1
Ну вот нету у меня адресной строки, не пользуюсь. Можно как то переместить кнопку на панель вкладок.

villa7 пишет:

bunda1
Ну вот нету у меня адресной строки, не пользуюсь. Можно как то переместить кнопку на панель вкладок.

Попробуйте вместо

Выделить код

Код:

var urlbarIcons = document.getElementById("urlbar-icons");

написать

Выделить код

Код:

var urlbarIcons = document.getElementById("TabsToolbar");

Панелька окажется в правом углу

difabor пишет:

Панелька окажется в правом углу

Да можно и так.

bunda1 пишет:

difabor пишет:

Панелька окажется в правом углу

Да можно и так.

А можно ещё как-то для панели вкладок? Чтобы не было в правом углу?

del

Waterfox 34 и classic restorer, меняю масштаб колёсиком, но есть проблема:
http://thumbnails112.imagebam.com/37230/f6423b372299943.jpg
- Цифры заезжают на иконку выпадающей адресной строки.

Можно ли сделать по аналогии с ucjs_statusbar_zoom_panel_1.3.uc:
1) Главное - левая кнопка мыши - сброс масштаба до 100%.
2) По возможности, правая кнопка - выпадающий список с выбором масштаба?
http://thumbnails112.imagebam.com/37231/e693f1372301726.jpg

1fesFFFF пишет:

Waterfox 34 и classic restorer, меняю масштаб колёсиком, но есть проблема:
- Цифры заезжают на иконку выпадающей адресной строки.

Измени под себя margin-right: -20 в строке кода: zoomButton.style.cssText = "-moz-appearance: none; border: 0; margin-right: -20px;"; // Css стиль для кнопки масштаба

1fesFFFF пишет:

Можно ли сделать по аналогии с ucjs_statusbar_zoom_panel_1.3.uc:
1) Главное - левая кнопка мыши - сброс масштаба до 100%.
2) По возможности, правая кнопка - выпадающий список с выбором масштаба?

Выделить код

Код:

// Кнопка для управления масштабом страницы в адресной строке 2, от 14.12.2014. ................................
(function f() {   
   // Создать в адресной строке кнопку масштаба ....
   var zoomButton = document.createElement("statusbarpanel");
   zoomButton.setAttribute("context", "event.stopPropagation()");
   var urlbarIcons = document.getElementById("urlbar-icons");
   urlbarIcons.insertBefore( zoomButton, urlbarIcons.lastChild ); // перед последней кнопкой адресной строки
   addDestructor(function() { urlbarIcons.removeChild( zoomButton ) });
   
   updateZoomButton(); 
   zoomButton.id = "zoomButton";
   zoomButton.style.cssText = "-moz-appearance: none; border: 0; margin-right: -20px;"; // Css стиль для кнопки масштаба
   zoomButton.tooltipText = "Л: Сбросить масштаб на 100%\nС: Единый масштаб для всех страниц \nП: Открыть меню управления масштабом ";

   
   // Отслеживать клики на кнопке масштаба ....           
   addEventListener("click", function(e) {
      // сбросить масштаб               
      if ( e.button == 0 && e.target.localName !== "menuitem" ) FullZoom.reset();
       
      // единый масштаб для всех страниц
      if ( e.button == 1 ) {                 
           cbu.isPref("CB.zoom.allEvenly", false );
           cbu.setPrefs("CB.zoom.allEvenly", !cbu.getPrefs("CB.zoom.allEvenly") );
           cbu.setPrefs("CB.zoom.Percent", ZoomManager.zoom.toFixed(2) );
                
           updateZoomButton();
           }
      
      // открыть меню управления масштабом  
      if ( e.button == 2 ) {            
           
           zoomButton.textContent = ""; // удалить старое меню
           
           // создать новое меню управления масштабом
           var zoom = zoomButton.label.replace('%','');
           var menu = zoomButton.appendChild( document.createElement("menupopup") );
           cbu.getPrefs("toolkit.zoomManager.zoomValues").split(',').forEach(function( val ) {
              var mItem = menu.appendChild( document.createElement("menuitem") ); 
              var str = Math.round(val*100);      
              mItem.setAttribute("value", val );
              mItem.setAttribute("label", str );
              mItem.setAttribute('type', 'checkbox');
              mItem.setAttribute('checked', str == zoom );              
              mItem.setAttribute("oncommand", "this.parentNode.setZoom(event)"); 
           });
           menu.setZoom = function(e) {
              gBrowser.markupDocumentViewer[ZoomManager.useFullZoom ? 'fullZoom' : 'textZoom'] = e.target.value;
              updateZoomButton();
           };
           
           menu.appendChild( document.createElement("menuseparator") ); // добавить разделитель 
           
           // добавить к новому меню стандартное меню масштаба
           var popup = document.getElementById("viewFullZoomMenu").lastChild;
           [...popup.childNodes].forEach(function( mItem ) {
               popup.lastChild.setAttribute('checked', !ZoomManager.useFullZoom );
               menu.appendChild( mItem.cloneNode(true) );
           });
           
           menu.showPopup( zoomButton, -1, -1, "popup", "bottomleft", "topleft"); // открыть меню           
           };
               
   }, false, zoomButton );

         
   // Менять масштаб колесиком мыши на кнопке масштаба ....
   addEventListener("DOMMouseScroll", function(e) {
      e.detail > 0 ? FullZoom.reduce() : FullZoom.enlarge();
   }, false, zoomButton );
           
 
   // Следим за изменением масштаба и запускаем обновление кнопки ....
   var str = "updateZoomButton(); $&";
   var handleEvent = parseInt(Application.version) > 33 ? FullZoom.handleEvent : FullZoom._handleMouseScrolled;
   var array = [FullZoom.reset, FullZoom.reduce, FullZoom.enlarge, ZoomManager.toggleZoom, handleEvent];
   array.forEach(function(func) { eval( (func.toString().match(/function ([^(]*)\(/)[1] + " = " + func.toString().replace(/}$/, str)).replace('_', '.') ) }); 
   addDestructor(function() { 
      array.forEach(function(func) { eval( (func.toString().match(/function ([^(]*)\(/)[1] + " = " + func.toString()).replace('_', '.') ) });  
   });
   
   
   // Показывать текущий масштаб страницы на кнопке и изменять цвет и шрифт отображения масштаба ....
   function updateZoomButton(e) {
      zoomButton.label = Math.round(ZoomManager.zoom*100) + "%"; 
      setTimeout(function() {  
         zoomButton.style.fontWeight = ZoomManager.useFullZoom ? '' : 'bold';
         zoomButton.style.color = cbu.getPrefs("CB.zoom.allEvenly") ? "red" : "";
      }, 5);
      
      // запомнить текущий масштаб в 'about:config'
      if ( e == undefined ) { 
           try { window.clearTimeout( f.timeout ) } catch(e) {};
           f.timeout = window.setTimeout(function() {
              cbu.setPrefs("CB.zoom.Percent", ZoomManager.zoom.toFixed(2) )  
           }, 250 );
           }     
   };
     
     
   // Устанавливать единый масштаб для всех страниц если это разрешено в 'about:config' ....
   addEventListener("TabAttrModified", function(e) { 
      if ( e.target.linkedBrowser.currentURI.spec !== gBrowser.currentURI.spec ) return;
             
      if ( cbu.getPrefs("CB.zoom.allEvenly") && content.location.protocol.startsWith("http") ) {
           var value = cbu.getPrefs("CB.zoom.Percent");
           if ( ZoomManager.zoom.toFixed(2) == value ) return;

           setTimeout(function() {  
              gBrowser.markupDocumentViewer[ZoomManager.useFullZoom ? 'fullZoom' : 'textZoom'] = value;
              updateZoomButton(e);   
           }, 0) 
           }      
      else 
           updateZoomButton(e);
                 
   }, true, gBrowser.tabContainer );   
})();

bunda1
Спасибо. Работает как надо!

Как можно перенести на панель дополнений [firefox]?

god_05 пишет:

Как можно перенести на панель дополнений [firefox]?

Попробуйте вместо

Выделить код

Код:

var urlbarIcons = document.getElementById("urlbar-icons");

написать

Выделить код

Код:

var urlbarIcons = document.getElementById("addon-bar");

(шестая строка кода)

В FF 44 перестала работать. Как исправить?

KNV пишет:

В FF 44 перестала работать. Как исправить?

Конкретно что не работает?

Ничего не делает. В 43 всё отлично. :(
Вообще в 44 большая часть кнопок отвалилась. :o

KNV пишет:

Вообще в 44 большая часть кнопок отвалилась. :o

№8

voqabuhe
Спасибо, заработало. Но оно же не подписано...

KNV пишет:

Но оно же не подписано...

А тебе ехать, или шашечки...?:)

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

А как убрать % ?

KNV пишет:

А как убрать % ?

Удали + "%" в:

Выделить код

Код:

zoomButton.label = Math.round(ZoomManager.zoom*100) + "%";

Теперь хорошо. Заменил % на пробел.

В бете перестали меняться цифры и цвет.

Изменить масштаб перестал работать на FF47 и [nightly]. Исправил: Изменить масштаб

bunda1 пишет:

Изменить масштаб перестал работать на FF47 и [nightly]

Почему перестал? У меня в [nightly] работает.

voqabuhe пишет:

bunda1 пишет:

Изменить масштаб перестал работать на FF47 и [nightly]

Почему перестал? У меня в [nightly] работает.

Вроде не должен работать на [nightly] потому что в старом коде есть Application который уже из [nightly] убрали. Мистика однако.

bunda1
Единственно  заметил, если сбрасывать масштаб ПКМ, то сброс происходил, а значение в адресной строке сразу не изменялось, только после последующего изменения масштаба.
В обновлённой версии всё ОК. Спасибо.

А как задать свой шаг изменения масштаба?

В about:config есть toolkit.zoomManager.zoomValues, который содержит значения зума. Шаг - это выбор следующего значения в ту или иную сторону

voqabuhe пишет:

А как задать свой шаг изменения масштаба?

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

difabor
Спасибо.

usalex пишет:

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

Согласен, если  такую возможность bunda1 добавил бы в настройки кнопки, было бы намного удобней. :)

Как уже писал difabor в about:config есть toolkit.zoomManager.zoomValues где легко можно установить всю свою линейку масштабов целиком. Например если заменить там 1.33 на 1.4 и тогда при увеличении масштаба 120% масштаб увеличится до 140% а не 133% как раньше.

17-05-2016 17:44:25

voqabuhe пишет:

Согласен, если  такую возможность bunda1 добавил бы в настройки кнопки, было бы намного удобней. :)

В начале кода что то типа: USER_ZOOM_LEVEL: [ 30, 50, 75, 100, 150, 200, 250, 300 ] ?

bunda1 пишет:

В начале кода что то типа: USER_ZOOM_LEVEL: [ 30, 50, 75, 100, 150, 200, 250, 300 ] ?

Не, я веду речь что бы была возможность менять шаг из контекстного меню кнопки в адресной строке. Например задал шаг 10, и все дальнейшие изменения масштаба происходят с шагом 10%...  Например как это у тебя сделано в кнопке Toggle Find+ Закрыть через: n секунд.  Так и тут ввёл в окошке 10 и всё... Или что-то подобное. Возможно такое?

bunda1 пишет:

Как уже писал difabor в about:config есть toolkit.zoomManager.zoomValues где легко можно установить всю свою линейку масштабов целиком.

Отлично! Спасибо. Не знал об этом.
Значит осталась ещё одна нужная мне настройка, до которой не знаю, как добраться. Я имею в виду дефолтный масштаб для новых вкладок. Хочу, чтоб новые (ещё не посещенные) вкладки открывались в масштабе не 100%, а в том, который я сам укажу: например, 133%
Не могли бы подсказать, возможно ли это реализовать через настройки FF или через вашу Кнопку?

usalex пишет:

Хочу, чтоб новые (ещё не посещенные) вкладки открывались в масштабе не 100%, а в том, который я сам укажу: например, 133%

Не знаю как такое сделать. Проблема в том как отличить ещё не посещенные вкладки.

17-05-2016 18:50:35

voqabuhe пишет:

Возможно такое?

Да такое возможно, только тут не кнопка а код.

usalex

Хочу, чтоб новые (ещё не посещенные) вкладки открывались в масштабе не 100%, а в том, который я сам укажу: например, 133%

NoSquint :: Дополнения Firefox
Там же можно установить шаг масштаба.

bunda1 пишет:

Да такое возможно

Было бы замечательно :)

только тут не кнопка а код.

Не понял, где тут?

voqabuhe пишет:

Не понял, где тут?

Изменить масштаб не понятно где там присобачить контекстного меню кнопки, все клики заняты.

usalex пишет:

дефолтный масштаб для новых вкладок

Можно сразу увеличить дефолтный масштаб всех вкладок layout.css.devPixelsPerPx = 1.1 - будет 110% и т.д.

bunda1 пишет:

Изменить масштаб не понятно где там присобачить контекстного меню кнопки, все клики заняты.

Ну через любой модификатор, или длинный клик...?

bunda1 пишет:

Проблема в том как отличить ещё не посещенные вкладки

Но ведь расширения типа Zoom Page как-то отличают.

oleg.sgh пишет:

NoSquint :: Дополнения Firefox

Спасибо. Опробую - может, подойдёт.
Попробовал - не особо понравилось. Плюс - в отличие от Zoom Page нет глюка с масштабом вкладки about:newtab
Минус - нет индикации текущего масштаба и нет своей шкалы масштабов (только свой шаг).

xrun1 пишет:

Можно сразу увеличить дефолтный масштаб всех вкладок layout.css.devPixelsPerPx = 1.1 - будет 110% и т.д.

Надо пробовать. Спасибо. Сейчас у меня там выставлено минус один
Попробовал - нет, мне это не нравится. Нужно другой способ искать. Или расширение ставить или ещё как-то...

usalex пишет:

Попробовал - нет, мне это не нравится.

Кому ж это может понравиться, весь интерфейс сразу испохабила. :dumb:

usalex

Минус - нет индикации текущего масштаба и нет своей шкалы масштабов (только свой шаг).

Индикация текущего масштаба в кнопке. Поставьте 1 процент и будет возможность сделать вообще любой масштаб....правда не понятно для чего может понадобится масштаб...128 процентов.

oleg.sgh пишет:

Индикация текущего масштаба в кнопке.

Я не нашел. Там три круглых кнопки: "+", "-" и кнопка сброса масштаба. Никаких процентов я на них не вижу.

usalex
Описание: Kод создает в адресной строке кнопку которая показывает размер масштаба текущей страницы.
Если не нужна эта кнопка то есть штатная +100 -. Вытащить из главного меню в режиме изменить.

oleg.sgh
Спасибо за инфу.
И мои извинения за оффтоп - понимаю, что здесь место для обсуждения конкретной авторской работы, а не сторонних расширений.

usalex
Тоже извинюсь за оффтоп но уточню...подытожу. Ставится и кнопка и дополнения. Кнопка - индикатор масштаба и удобство его изменения. Дополнение -  установленный масштаб и шрифт для всех страниц по умолчанию, установка шага изменения, индивидуальная настройка по домену.

voqabuhe пишет:

Ну через любой модификатор, или длинный клик...?

На следующей неделе сделаю.

bunda1 пишет:

На следующей неделе сделаю.

Спасибо.

bunda1
В [nightly] у меня в адресной строке стало отображаться  два показания масштаба одновременно.

voqabuhe пишет:

два показания масштаба одновременно

Двойная инициализация кнопки? На другую панель не пробовали перенести?

565718 – Show zoom indicator in UI if not at default zoom level

Выделить код

Код:

#urlbar-zoom-button {
    display: none !important;
}

voqabuhe пишет:

bunda1
В [nightly] у меня в адресной строке стало отображаться  два показания масштаба одновременно.

Как тут правильно заметили наверно проблема в двойной инициализации кнопки, такое бывает если кнопка находится в панели меню кнопки меню. Может положи в начале кода инициализации:

Выделить код

Код:

if ( this.hasAttribute("initialized") ) return;

bunda1 пишет:

Как тут правильно заметили наверно проблема в двойной инициализации кнопки, такое бывает если кнопка находится в панели меню кнопки меню.

Не-не, это в ночнушке впилили.

turbot пишет:

Не-не, это в ночнушке впилили.

А ну да, у меня [nightly] 50, а у тебя уже 51.

turbot пишет:

Выделить код

Код:

#urlbar-zoom-button { 
display: none !important; 
}

Ага спасибо, но это первое что и я сделал, а уж потом здесь сообщил, что бы bunda1 проинформировать. :)

voqabuhe пишет:

Ага спасибо, но это первое что и я сделал, а уж потом здесь сообщил, что бы bunda1 проинформировать. :)

Спасибо :) Подправлю свой код.

А как подвинуть кнопку левее? А то наползает:
http://savepic.ru/11879743.png

И, что кнопку надо каждый раз запускать при открытии браузера?

stvol пишет:

А как подвинуть кнопку левее?

В строке кода:

Выделить код

Код:

zoomButton.style.cssText = "-moz-appearance: none; border: 0; margin-right: -20px;";

измени 20 так как тебе лучше.


stvol пишет:

И, что кнопку надо каждый раз запускать при открытии браузера?

А ты положи код Изменить масштаб в инициализацию кнопки.

bunda1

bunda1 пишет:

измени 20 так как тебе лучше

Попробую!

bunda1 пишет:

А ты положи код Изменить масштаб в инициализацию кнопки.

Таки, он там и находится:
http://savepic.ru/11913544.png

stvol пишет:

Таки, он там и находится:

В чём тогда проблема, я не понял?

bunda1

bunda1 пишет:

В чём тогда проблема, я не понял?

Каждый раз, при открытии браузера,  приходится запускать её в ручную (или так и должно быть?)!

stvol пишет:

bunda1

bunda1 пишет:

В чём тогда проблема, я не понял?

Каждый раз, при открытии браузера,  приходится запускать её в ручную (или так и должно быть?)!

А как ты запускать её в ручную?

bunda1 пишет:

А как ты запускать её в ручную?

Жму на иконку этой кнопки! Точнее, жму на "меню" и кнопка появляется!
А вот если перетащить её на панель, то всё работает как надо!

Понятно. Да есть такой глюк у Сustom Buttons что кнопки не инициализируется из большого меню пока это меню не открыть. Ничего не поделаешь надо кнопку держать на панели.

bunda1
Спасибо за инфу!
Попутно вопрос: есть ли кнопка автоподстройки масштаба под контент сайта (убирать горизонтальную прокрутку)!

stvol пишет:

Каждый раз, при открытии браузера,  приходится запускать её в ручную

Есть два пути решения проблемы.
1. положить код кнопки в инициализацию любой кнопки на панели.
У меня спец.кнопка для этого и в ней штук 10 или 15 разных кодов.

2. установить кнопку "Спрятать панель дополнений" (работает совместно с CTR)
Панель дополнений стартует вместе с ФФ и кнопки в ней инициализируются,
потом почти мгновенно кнопка  "Спрятать панель дополнений" ее прячет.

Почему-то, у меня эта кнопка не дружит с Menu Wizard (или наоборот: Menu Wizard не дружит с кнопкой)! Пропадают некоторые опции дополнения!

Можно подружить кнопку и дополнение NoSquint Plus?
При изменении масштаба Ctrl  + колесико, кнопка не показывает действительное значение, до обновления вкладки.

oleg.sgh
А зачем они оба два сразу? :)

voqabuhe
Потому что разные функции у кнопки и дополнения.

oleg.sgh пишет:

Потому что разные функции у кнопки и дополнения.

А разве они оба не для изменения масштаба? :)

voqabuhe
В кнопке есть только общий масштаб для всех страниц. В дополнении, кроме единых параметров по умолчанию, возможна индивидуальная установка.
В дополнении слишком громоздкий индикатор масштаба, как и штатный, с этим же косяком. Нет возможности менять масштаб колесом. Поэтому, кнопка и дополнение.

oleg.sgh пишет:

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

В кнопке тоже есть такая возможность

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

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

oleg.sgh пишет:

А какие костыли и в каком сочетании, позвольте определять мне самому.

А я что как-то этому препятствовал? :sick:

oleg.sgh пишет:

Можно подружить кнопку и дополнение NoSquint Plus?
При изменении масштаба Ctrl  + колесико, кнопка не показывает действительное значение, до обновления вкладки.

Не получается подружить кнопку и дополнение NoSquint Plus :(

bunda1
Жаль. Просто в старой версии NoSquint, даже установки дополнения менялись кнопкой...было удобно.
Может можно тогда убрать лишнее в индикаторе дополнения, оставив только число масштаба?
Кнопкой или стилем...без разницы.
В глобальных настройках должна стоять галка для отображения индикатора дополнения.

скрытый текст
http://content-20.foto.my.mail.ru/mail/oleg.sgh2/_blogs/b-7583.png

bunda1 пишет:

Не получается подружить кнопку и дополнение NoSquint Plus

Может проще, если есть что-то полезное в NoSquint, то добавить это в кнопку. Хотя на мой взгляд в кнопке есть всё необходимое для комфортного изменения масштаба, но мало ли... ;)

voqabuhe
Я же написал выше различия кнопки и дополнения...повторю
В дополнении есть установки по умолчанию масштаба и размера шрифта. У меня, например, 125\85. Если не уменьшать шрифт, при увеличенном масштабе, то заголовки становятся большими. Эти настройки для всего интернета. В то же время, для некоторых сайтов, можно установить свой масштаб и размер шрифта. В кнопке либо одно, либо другое, либо третье... Вдобавок, можно сделать шрифт совсем черным и изменить цвет ссылок. Последнее можно сделать стилями но это надо ковыряться с сайтами.
Кнопка теперь как индикатор и возможность быстро изменить масштаб мышкой...до обновления страницы.

oleg.sgh пишет:

bunda1
Жаль. Просто в старой версии NoSquint, даже установки дополнения менялись кнопкой...было удобно.
Может можно тогда убрать лишнее в индикаторе дополнения, оставив только число масштаба?
Кнопкой или стилем...без разницы.
В глобальных настройках должна стоять галка для отображения индикатора дополнения.

Вот что то намутил:

Выделить код

Код:

var indicator = document.getElementById('zoomlevel-indicator');  
var indicatorHandler = new MutationObserver(()=> {
   if (indicator.value.slice(-5) == '/100%') indicator.value = indicator.value.replace("/100%", "");
});
indicatorHandler.observe(indicator, {attributes: true});
addDestructor(()=> indicatorHandler.disconnect() );

или даже так:

Выделить код

Код:

// Кнопка для управления масштабом страницы в адресной строке .......................
(()=> {   
   // Создать в адресной строке кнопку масштаба ....
   var zoomButton = document.createElement("statusbarpanel");
   var urlbarIcons = document.getElementById("urlbar-icons");
   urlbarIcons.insertBefore(zoomButton, urlbarIcons.lastChild); // перед последней кнопкой адресной строки
   addDestructor(()=> zoomButton.remove());
   zoomButton.id = "zoomButton";
   zoomButton.style.cssText = "-moz-appearance: none; border: 0; margin-right: -12px;"; // Css стиль для кнопки масштаба
         
   // Менять масштаб колесиком мыши на кнопке масштаба ....
   addEventListener("DOMMouseScroll", e=> {
      e.detail > 0 ? document.getElementById("menu_zoomReduce").click() : document.getElementById("menu_zoomEnlarge").click();
   }, false, zoomButton);
           
 
   // Следим за изменением масштаба и запускаем обновление кнопки ....
   var indicator = document.getElementById('zoomlevel-indicator');
   indicator.hidden = true; 
   var indicatorHandler = new MutationObserver(()=> updateZoomButton() );
   indicatorHandler.observe(indicator, {attributes: true});
   addDestructor(()=> indicatorHandler.disconnect() )  
   
   
   // Показывать текущий масштаб страницы на кнопке и изменять цвет и шрифт отображения масштаба ....
   function updateZoomButton() {
      zoomButton.label = indicator.value.replace("/100%", "");    
   };
   updateZoomButton(); 
})();

05-11-2016 23:49:04

voqabuhe пишет:

bunda1 пишет:

Не получается подружить кнопку и дополнение NoSquint Plus

Может проще, если есть что-то полезное в NoSquint, то добавить это в кнопку.

Это не просто :/

bunda1

или даже так:

Теперь подружилась...даже слишком. Дискретность изменения масштаба стала 10% и при изменении штатными кнопками браузера и клавишами.
Свои настройки дискретности в toolkit.zoomManager.zoomValues, естественно, тоже перестали работать.
Хотелось бы:
1. Либо немного раздружить кнопку и дополнение, что бы штатными средствами масштаб изменялся как установлено в toolkit.zoomManager.zoomValues.
Либо, что предпочтительнее, сделать в кнопке дискретность изменения масштаба 5%.

2. Оставить только числовое значения масштаба (предпочтительно) или убрать значение масштаба шрифта. (значение масштаба шрифта появляется если он отличен от 100, в глобальных настройках)

http://content.foto.my.mail.ru/mail/oleg.sgh2/_blogs/i-7585.jpg
Код в кнопке, видимо, не срабатывает.

3. Сброс масштаба, по правому клику на кнопке, до дефолтных 100% браузера.

По п. 1, решено - extensions.zoomlevel.zoomIncrement;5. Тем не менее, желательно, изменение этого параметра добавить в саму кнопку.

oleg.sgh пишет:

bunda1

или даже так:

Теперь подружилась...даже слишком. Дискретность изменения масштаба стала 10% и при изменении штатными кнопками браузера и клавишами.
По п. 1, решено - extensions.zoomlevel.zoomIncrement;5. Тем не менее, желательно, изменение этого параметра добавить в саму кнопку.

Мой код или даже так: просто отображает в адресной строке информацию от индикатора масштаба NoSquint и прячет этот индикатор. С дискретностью изменения масштаба мой код ни как не связан. И почему у тебя в адресной строке два индикатора?

bunda1

просто отображает в адресной строке информацию от индикатора

Не просто отображает а еще меняет масштаб колесом, когда курсор на цыферьках...как в оригинале.
extensions.zoomlevel.zoomIncrement;5 устанавливается в about:config и отвечает за дискретность шага в дополнении.

почему у тебя в адресной строке два индикатора?

Один показывает масштаб,  второй размер шрифта
значение масштаба шрифта появляется если он отличен от 100, в глобальных настройках

oleg.sgh пишет:

bunda1
2. Оставить только числовое значения масштаба (предпочтительно) или убрать значение масштаба шрифта. (значение масштаба шрифта появляется если он отличен от 100, в глобальных настройках)
3. Сброс масштаба, по правому клику на кнопке, до дефолтных 100% браузера.

Теперь попробуй:

Выделить код

Код:

// Кнопка для управления масштабом страницы в адресной строке .......................
(()=> {   
   // Создать в адресной строке кнопку масштаба ....
   var zoomButton = document.createElement("statusbarpanel");
   var urlbarIcons = document.getElementById("urlbar-icons");
   zoomButton.setAttribute("context", "event.stopPropagation()");
   urlbarIcons.insertBefore(zoomButton, urlbarIcons.lastChild); // перед последней кнопкой адресной строки
   addDestructor(()=> zoomButton.remove());
   zoomButton.id = "zoomButton";
   zoomButton.style.cssText = "-moz-appearance: none; border: 0; margin-right: -12px;"; // Css стиль для кнопки масштаба
   zoomButton.tooltipText = "П: Сбросить масштаб на 100% \nКолёсиком мыши на кнопке можно масштаб";
   
   // Отслеживать клики на кнопке масштаба ....           
   addEventListener("click", e=> {                  
      if ( e.button == 2 ) document.getElementById("menu_zoomReset").click(); // сбросить масштаб
   }, false, zoomButton);
   
         
   // Менять масштаб колесиком мыши на кнопке масштаба ....
   addEventListener("DOMMouseScroll", e=> {
      e.detail > 0 ? document.getElementById("menu_zoomReduce").click() : document.getElementById("menu_zoomEnlarge").click();
   }, false, zoomButton);
           
 
   // Следим за изменением масштаба и запускаем обновление кнопки ....
   var indicator = document.getElementById('zoomlevel-indicator');
   indicator.hidden = true; 
   var indicatorHandler = new MutationObserver(()=> updateZoomButton() );
   indicatorHandler.observe(indicator, {attributes: true});
   addDestructor(()=> indicatorHandler.disconnect() )  
   
   
   // Показывать текущий масштаб страницы на кнопке и изменять цвет и шрифт отображения масштаба ....
   function updateZoomButton() {
      zoomButton.label = indicator.value.slice(0,4).replace("/", "");    
   };
   updateZoomButton(); 
})();

06-11-2016 13:04:52
А вот что там с extensions.zoomlevel.zoomIncrement я не понял, у меня он 10 и не меняется при исползования кнопки.

oleg.sgh пишет:

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

Это можно. Но хочу уточнить - получается что NoSquint сам произвольно иногда меняет extensions.zoomlevel.zoomIncrement или как?

bunda1

получается что NoSquint сам произвольно иногда меняет extensions.zoomlevel.zoomIncrement или как?

Это параметр устанавливает дополнение а значение можно менять в надстройках самого дополнения. Дело только в том, что в интерфейсе дополнения, минимальное 10. Шаг 5, можно установить только в about:config. Эти пляски начались с переходом на новое дополнение (в старом вообще можно было установить шаг 1). Только сегодня нашел как, принудительно, установить шаг 5,  для нового дополнения.

Понятно. Можно просто добавить в мой код:

Выделить код

Код:

   cbu.setPrefs("extensions.zoomlevel.zoomIncrement", 5);

bunda1
То что и было нужно http://www.kolobok.us/smiles/standart/yes2.gif Спасибо http://savepic.ru/9490836m.gif

bunda1
Если возможно, добавьте пожалуйста, чтобы в области адресной строки тоже можно было вращением колесика изменять масштаб.

В 51 бете появился свой убогий масштаб в адресной строке. Как убрать?

KNV пишет:

В 51 бете появился свой убогий масштаб в адресной строке. Как убрать?

Изменить масштаб

24-11-2016 22:26:26

Stakhovsky пишет:

bunda1
Если возможно, добавьте пожалуйста, чтобы в области адресной строки тоже можно было вращением колесика изменять масштаб.

Выделить код

Код:

// Кнопка для управления масштабом страницы в адресной строке, от 24.11.2016. ..........................
(()=> {
   // Удалить из адресной строки FF51 стандартную кнопку масштаба ....
   var but = document.getElementById('urlbar-zoom-button');
   if (but) but.style.display = "none";
   
   // Создать в адресной строке кнопку масштаба ....
   var zoomButton = document.createElement("statusbarpanel");
   var urlbarIcons = document.getElementById("urlbar-icons");
   urlbarIcons.insertBefore(zoomButton, urlbarIcons.lastChild); // перед последней кнопкой адресной строки
   addDestructor(()=> zoomButton.remove());
     
   updateZoomButton(); 
   zoomButton.id = "zoomButton";
   zoomButton.style.cssText = "-moz-appearance: none; border: 0; margin-right: -20px;"; // Css стиль для кнопки масштаба
   zoomButton.tooltipText = "Л: Менять масштаб страницы или только текста\nС: Единый масштаб для всех страниц \nП: Сбросить масштаб на 100% ";

   
   // Отслеживать клики на кнопке масштаба ....           
   addEventListener("click", e=> {                  
      if ( e.button == 0 ) ZoomManager.toggleZoom(); // переключить режим изминения масштаба
      
      if ( e.button == 1 ) { // единый масштаб для всех страниц
           cbu.isPref("CB.zoom.allEvenly", false);
           cbu.setPrefs("CB.zoom.allEvenly", !cbu.getPrefs("CB.zoom.allEvenly") );
           cbu.setPrefs("CB.zoom.Percent", ZoomManager.zoom.toFixed(2) );
                
           updateZoomButton();
           }

      if ( e.button == 2 ) { e.preventDefault(); FullZoom.reset(); }; // сбросить масштаб
               
   }, false, zoomButton);

         
   // Менять масштаб колесиком мыши на адресной строке ....
   addEventListener("DOMMouseScroll", e=> {
      e.detail > 0 ? FullZoom.reduce() : FullZoom.enlarge();
   }, false, gURLBar);
           
 
   // Следим за изменением масштаба и запускаем обновление кнопки ....
   var str = "{ setTimeout(()=> { updateZoomButton() }, 50);";
   var handleEvent = parseInt(Services.appinfo.version) > 33 ? FullZoom.handleEvent : FullZoom._handleMouseScrolled;
   var array = [FullZoom.reset, FullZoom.reduce, FullZoom.enlarge, ZoomManager.toggleZoom, handleEvent];
   array.forEach(func=> { setTimeout(()=> { eval( (func.toString().replace('_', '.').match(/function ([^(]*)\(/)[1] + " = " + func.toString().replace("{", str)) )}, 50) }); 
   addDestructor(()=> { 
      array.forEach(func=> { eval( (func.toString().replace('_', '.').match(/function ([^(]*)\(/)[1] + " = " + func.toString()).replace(str,"{") ) });  
   });   
   
   
   // Показывать текущий масштаб страницы на кнопке и изменять цвет и шрифт отображения масштаба ....
   function updateZoomButton(e) {
      zoomButton.label = Math.round(ZoomManager.zoom*100) + "%"; 
      setTimeout(()=> {  
         zoomButton.style.fontWeight = ZoomManager.useFullZoom ? '' : 'bold';
         zoomButton.style.color = cbu.getPrefs("CB.zoom.allEvenly") ? "red" : "";
      }, 5);
      
      // запомнить текущий масштаб в 'about:config'
      if ( e == undefined ) { 
           try { window.clearTimeout(zoomButton.prefTimeout) } catch(e) {};
           zoomButton.prefTimeout = window.setTimeout(()=> {
              cbu.setPrefs("CB.zoom.Percent", ZoomManager.zoom.toFixed(2) )  
           }, 250);
           }     
   };
     
     
   // Устанавливать единый масштаб для всех страниц если это разрешено в 'about:config' ....
   addEventListener("TabAttrModified", e=> {
      if ( e.target.linkedBrowser.currentURI.spec !== gBrowser.currentURI.spec ) return;
             
      if ( cbu.getPrefs("CB.zoom.allEvenly") && content.location.protocol.startsWith("http") ) {
           var value = cbu.getPrefs("CB.zoom.Percent");
           if ( ZoomManager.zoom.toFixed(2) == value ) return;

           setTimeout(()=> { 
              gBrowser.markupDocumentViewer[ZoomManager.useFullZoom ? 'fullZoom' : 'textZoom'] = value;
              updateZoomButton(e);   
           }, 0); 
           }      
      else 
           updateZoomButton(e);
                 
   }, true, gBrowser.tabContainer);   
})();

Спасибо. Всё работает.
Блин, теперь ругается на аддон — не подписан. Хочет отключить.

KNV пишет:

Блин, теперь ругается на аддон — не подписан. Хочет отключить.

Как отключить проверку цифровых подписей в дополнениях Firefox | Форум Mozilla Россия

bunda1
Супер, спасибо большое.

bunda1
Так проверка у меня и была отключена. Аддон установился и работал. Потом [firefox] внезапно закозлился и удалил его. Сейчас заново всё сделал. Пока работает.

Обновилось дополнение NoSquint Plus и кнопка перестала показывать значение масштаба
Можно подправить?

Виноват, отбой...после перезапуска [firefox], все стало работать как надо.

Исправил Изменить масштаб для Firefox 57.

О заработала кнопка:D спасибо мастер bunda1.

bunda1
Большое спасибо за эту полезную кнопку.
А нельзя ли сделать такую настройку, чтоб задавался не инкремент зума, а чтоб просто "вбить" свою шкалу значений, как это реализовано в расширении Zoom Page ?
(я пользуюсь примерно такими значениями:  ...110 120 125 130 133 135 140 145 150)

usalex пишет:

(я пользуюсь примерно такими значениями:  ...110 120 125 130 133 135 140 145 150)

В about:config > toolkit.zoomManager.zoomValues измени значение на 1.1,1.2,1.25,1.3,1.35,1.4,1.45,1.5

bunda1 пишет:

В about:config > toolkit.zoomManager.zoomValues измени значение на 1.1,1.2,1.25,1.3,1.35,1.4,1.45,1.5

Спасибо. Работает. А как там прописать, чтоб все новые страницы открывались в масштабе не 100% а 125% ?

usalex пишет:

А как там прописать, чтоб все новые страницы открывались в масштабе не 100% а 125% ?

А вот не знаю. Может СКМ на кнопке маштаба поможет.

bunda1 пишет:

Может СКМ на кнопке маштаба поможет.

Увы, этот приём не помогает сделать серфинг комфортней.

А нельзя ли добавить в кнопку фичу начального (заданного пользователем) масштаба для впервые посещаемой страницы?
Ведь ФФ где-то хранит список ранее посещенных страниц. Пусть "кнопка" сначала заглядывает в этот список и, если там нет сайта, который в данный момент открывается, масштабировать такую страницу на тот процент, который пользователь прописал в коде кнопки в качестве начального.

Можно такое сделать?

bunda1
Не могли бы вы добавить в кнопку ещё один способ изменения масштаба: "Изменять масштаб колёсиком мыши при зажатой правой кнопке"?

usalex
У меня сразу две в одной

Выделить код

Код:

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%3ECB%20Mouse%20Gestures+%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/x-icon%3Bbase64%2CAAABAAEAEhIAAAEAIACABQAAFgAAACgAAAASAAAAJAAAAAEAIAAAAAAAWAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgEBAwEAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAABAgEBAwAAAAACAQECAAAAAHdLNaSlZkbqkFY60ZNZO9aSWDrWkVY51o9VONaOVDfWjVI11oxSNdaMUDPWhkww0ZdYOupsQCykAAAAAAIBAQIAAAAAc0k1oNebe//0yrD/+djC/vjWv//418D/+Na///fWv//31r//99W///XTuv/11Lz/9tfA/u3Dqf/Jjm//Zz4qoAAAAAAAAAAAq2tL1vXMsf/w4c327di9++nStfvs1bn77Na7++zWu/vs1rv77NS5+/Tk0Pvt2L377NW4+/Ll0vbtxar/mFk61gAAAAAAAAAAl10/0Pvdxv/q07b71quB/9iuhP/VqX//06J0/9Khcf/SonL/z5pm/+7dzf/q1cH/1ah9/+zStPv22MP/hkww0AAAAAAAAAAAnF9C1vzcxv/kxaT70aBw/9mtg//euJX/6c+3/+zVv//s1sD/6tG5//r18P//////48Wo/+bHpvv22ML/i1Az1gAAAAAAAAAAnWBC1v3eyv/iwp/7ypFY/9qwiP/u3Mr/9+7k//jw6P/48Oj/9+/m//z69///////5862/+XHpvv42cT/jFE01gAAAAAAAAAAnmJE1v7hzv/fvZf7wX06/+LBof/27OP/z5dh/8mLTv/JjE//xIE+//Pl1v/05tn/zJJb/963jfv53cv/jVEz1gAAAAAAAAAAn2JE1v/i0f/dt477u28k/+PDo//47+j/w348/8qNUv/JjVH/xoZH/9+6l//VpXf/vnUw/963jvv53cv/jlM11gAAAAAAAAAAoGNF1v/j0f/duJD7u3Ao/+PDpf/48Oj/w4A//8qNU//JjFH/yYxR/8qOVP/KkFb/wX8+/922jfv63cv/j1Q21gAAAAAAAAAAoWVH1v/i0P/gwJ77w4FD/+bLsP/58uv/yo9X/9Cbaf/Pmmf/z5pn/86YZP/Qm2n/yY9Y/+G/m/v63Mr/kVU31gAAAAAAAAAAo2ZJ1v/hz//kyav7ypRf/+jRuv/58uz/0J9w/9Spfv/UqH3/1Kh9/9Wpfv/VqoD/z59v/+XJqfv53Mn/klc51gAAAAAAAAAApGhK1v/fzf/n0Lf70aR5/+3Zx//69fH/166I/9u3lP/btpP/27aT/9u2k//cuJX/1q2H/+fPtvv42sj/k1g71gAAAAAAAAAAoWZJ0P7fz//s3Mr72riZ/+bPuf/s3Mz/3L2e/97Ao//ewKP/3sCj/97Ao//ewaP/3Luf/+7cy/v428n/kFU50AAAAAAAAAAAunhY1vvTvf/u5Nv27+LU++rax/vq2MX77eDP++3fzvvt38777d/O++3fz/vt38778OLT+/Hm3Pb0zLT/p2dG1gAAAAAAAAAAflM+oOSpi//71L7//d/N/v7ey//+383//d3K//zdyv/83cn//NzJ//vcyP/72sf/+tzK/vTNt//XnH3/ckgzoAAAAAACAQECAAAAAINXQaS4d1fqomZK0aVoS9akZ0rWomZJ1qFkR9agZEbWnmNF1p1hRNacYELWl11A0apqSup4TDakAAAAAAIBAQIAAAAAAgEBAwEAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAABAgEBAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B%28%7B%0A%20%20%20//%20%u0416%u0435%u0441%u0442%u044B%20%u043C%u044B%u0448%u0438%20....%0A%20%20%20GESTURES%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20//%20%u0423%u043F%u0440%u0430%u0432%u043B%u0435%u043D%u0438%u0435%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%u0435%u0439%20................................%0A%20%20%27W-%27%3A%7Bname%3A%27%u0423%u0432%u0435%u043B%u0438%u0447%u0438%u0442%u044C%20%u043C%u0430%u0441%u0448%u0442%u0430%u0431%27%2Ccmd%3Afunction%28%29%7B%20FullZoom.enlarge%28%29%20%7D%7D%2C%0A%20%20%27W+%27%3A%7Bname%3A%27%u0423%u043C%u0435%u043D%u044C%u0448%u0438%u0442%u044C%20%u043C%u0430%u0441%u0448%u0442%u0430%u0431%27%2Ccmd%3Afunction%28%29%7B%20FullZoom.reduce%28%29%20%7D%7D%2C%0A%20%20%27UDU%27%3A%7Bname%3A%27%u0421%u0431%u0440%u043E%u0441%u0438%u0442%u044C%20%u043C%u0430%u0441%u0448%u0442%u0430%u0431%27%2Ccmd%3Afunction%28%29%7B%20FullZoom.reset%28%29%20%7D%7D%2C%0A%20%20%27L%3CR%27%3A%7Bname%3A%27%u0421%u0431%u0440%u043E%u0441%u0438%u0442%u044C%20%u043C%u0430%u0441%u0448%u0442%u0430%u0431%27%2Ccmd%3Afunction%28%29%7B%20FullZoom.reset%28%29%20%7D%7D%2C%0A%20%20%27L%27%3A%7Bname%3A%27%u041D%u0430%u0437%u0430%u0434%27%2Ccmd%3Afunction%28%29%7B%20BrowserBack%28%29%20%7D%7D%2C%0A%20%20%27R%27%3A%7Bname%3A%27%u0412%u043F%u0435%u0440%u0451%u0434%27%2Ccmd%3Afunction%28%29%7B%20BrowserForward%28%29%20%7D%7D%2C%0A%20%20//%20%27DR%27%3A%7Bname%3A%27%u041E%u0431%u043D%u043E%u0432%u0438%u0442%u044C%27%2Ccmd%3Afunction%28%29%7B%20gBrowser.reload%28%29%20%7D%7D%2C%0A%20%20%27L%3ER%27%3A%7Bname%3A%27%u041E%u0431%u043D%u043E%u0432%u0438%u0442%u044C%27%2Ccmd%3Afunction%28%29%7B%20gBrowser.reload%28%29%20%7D%7D%2C%0A%20%20%27DR%27%3A%7Bname%3A%27%u041E%u0431%u043D%u043E%u0432%u0438%u0442%u044C%20%u043A%u044D%u0448%27%2Ccmd%3Afunction%28%29%7B%20BrowserReloadSkipCache%28%29%20%7D%7D%2C%0A%20%20%27U%27%3A%7Bname%3A%27%u0421%u0442%u043E%u043F%27%2Ccmd%3Afunction%28%29%7B%20BrowserStop%28%29%20%7D%7D%2C%0A%20%20%7D%2C%0A%0Ainit%3Afunction%28%29%20%7B%0A%20%20%20var%20func%20%3D%20this%3B%0A%0A%20%20%20%5B%22mousedown%22%2C%20%22mousemove%22%2C%20%22mouseup%22%2C%20%22contextmenu%22%2C%20%22draggesture%22%2C%20%22DOMMouseScroll%22%5D%0A%20%20%20%20.forEach%28%28type%29%3D%3E%20addEventListener%28type%2C%20this%2C%20true%2C%20gBrowser%29%20%29%3B%20%0A%7D%2C%0A%0AhandleEvent%3Afunction%28event%29%20%7B%0A%20%20%20%20switch%28event.type%29%20%7B%0A%20%20%20%20%20%20%20%20case%22mousedown%22%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20%28%20event.button%20%3D%3D%202%20%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20this._isMouseDownR%20%3D%20true%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20this._hideFireContext%20%3D%20false%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20this._startGesture%28%20event%20%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20%28%20event.button%20%3D%3D%202%20%26%26%20this._isMouseDownL%20%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20this._isMouseDownL%20%3D%20false%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20this._isMouseDownR%20%3D%20false%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20this._shouldFireContext%20%3D%20false%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20this._hideFireContext%20%3D%20true%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20this._directionChain%20%3D%20%22L%3ER%22%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20this._stopGesture%28event%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20else%20if%20%28%20event.button%20%3D%3D%200%20%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20this._isMouseDownL%20%3D%20true%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28%20this._isMouseDownR%20%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20this._isMouseDownL%20%3D%20false%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20this._shouldFireContext%20%3D%20false%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20this._hideFireContext%20%3D%20true%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20this._directionChain%20%3D%20%22L%3CR%22%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20this._stopGesture%28%20event%20%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%0A%20%20%20%20%20%20%20%20case%22mousemove%22%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20%28%20this._isMouseDownR%20%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20this._hideFireContext%20%3D%20true%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20this._progressGesture%28%20event%20%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%0A%20%20%20%20%20%20%20%20case%22mouseup%22%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20%28%20content.xdTrailArea%20%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20content.xdTrailArea.parentNode.removeChild%28%20content.xdTrailArea%20%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20content.xdTrailArea%20%3D%20content.document.documentElement.appendChild%28document.createElementNS%28xhtmlns%2C%20%22xdTrailArea%22%29%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20%28%20event.ctrlKey%20%26%26%20event.button%20%3D%3D%202%20%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20this._isMouseDownL%20%3D%20false%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20this._isMouseDownR%20%3D%20false%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20this._shouldFireContext%20%3D%20false%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20this._hideFireContext%20%3D%20false%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20this._directionChain%20%3D%20%27%27%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20event.preventDefault%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20XULBrowserWindow.statusTextField.label%20%3D%20%22Reset%20Gesture%22%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20%28%20this._isMouseDownR%20%26%26%20event.button%20%3D%3D%202%20%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28%20this._directionChain%20%29%20this._shouldFireContext%20%3D%20false%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20this._isMouseDownR%20%3D%20false%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20this._stopGesture%28%20event%20%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28%20this._shouldFireContext%20%26%26%20%21this._hideFireContext%20%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20this._shouldFireContext%20%3D%20false%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20this._displayContextMenu%28%20event%20%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20else%20if%20%28%20event.button%20%3D%3D%200%20%26%26%20this._isMouseDownL%20%29%20%7B%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20this._isMouseDownL%20%3D%20false%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20this._shouldFireContext%20%3D%20false%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20else%20if%20%28%20%28event.button%20%3D%3D%200%20%7C%7C%20event.button%20%3D%3D%201%29%20%26%26%20event.target.localName%20%3D%3D%27menuitem%27%20%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20this._isMouseDownL%20%3D%20false%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20this._shouldFireContext%20%3D%20false%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20popup%20%3D%20document.getElementById%28%27GesturePopup%27%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20activeItem%20%3D%20event.target%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20switch%28%20popup.getAttribute%28%22gesturecommand%22%29%20%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20case%22WebSearchPopup%22%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20selText%20%3D%20popup.getAttribute%28%22selectedtext%22%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20engine%20%3D%20activeItem.engine%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28%20%21engine%20%29%20break%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20submission%20%3D%20engine.getSubmission%28%20selText%2C%20null%20%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28%20%21submission%20%29%20break%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20document.getElementById%28%27searchbar%27%29.textbox.value%20%3D%20selText%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20gBrowser.loadOneTab%28%20submission.uri.spec%2Cnull%2Cnull%2Csubmission.postData%2Cnull%2Cfalse%20%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20case%22ClosedTabsPopup%22%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20undoCloseTab%28%20activeItem.index%20%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20case%22HistoryPopup%22%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20gBrowser.webNavigation.gotoIndex%28%20activeItem.index%20%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20case%22AllTabsPopup%22%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20gBrowser.selectedTab%20%3D%20gBrowser.mTabs%5BactiveItem.index%5D%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20popup.hidePopup%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20try%20%7B%20document.getElementById%28%22statusbar-display%22%29.label%20%3D%20%22%22%20%7D%20catch%28e%29%20%7B%7D%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20case%22popuphiding%22%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20var%20popup%20%3D%20document.getElementById%28%27GesturePopup%27%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20popup.removeEventListener%28%22popuphiding%22%2Cthis%2Ctrue%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20document.documentElement.removeEventListener%28%22mouseup%22%2Cthis%2Ctrue%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20while%28%20popup.hasChildNodes%28%29%20%29%20popup.removeChild%28%20popup.lastChild%20%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%0A%20%20%20%20%20%20%20%20case%22contextmenu%22%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20%28%20this._isMouseDownL%20%7C%7C%20this._isMouseDownR%20%7C%7C%20this._hideFireContext%20%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20event.preventDefault%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20event.stopPropagation%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20this._shouldFireContext%20%3D%20true%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20this._hideFireContext%20%3D%20false%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%0A%20%20%20%20%20%20%20%20case%22DOMMouseScroll%22%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20%28%20this._isMouseDownR%20%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20event.preventDefault%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20event.stopPropagation%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20this._shouldFireContext%20%3D%20false%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20this._hideFireContext%20%3D%20true%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20this._directionChain%20%3D%20%22W%22%20+%20%28%20event.detail%20%3E%200%20%3F%20%22+%22%20%3A%20%22-%22%20%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20this._stopGesture%28event%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%0A%20%20%20%20%20%20%20%20case%22draggesture%22%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20this._isMouseDownL%20%3D%20false%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20%7D%0A%7D%2C%0A%0A_displayContextMenu%3Afunction%28%20event%20%29%20%7B%0A%20%20%20%20var%20evt%20%3D%20event.originalTarget.ownerDocument.createEvent%28%22MouseEvents%22%29%3B%0A%20%20%20%20evt.initMouseEvent%28%22contextmenu%22%2Ctrue%2Ctrue%2Cevent.originalTarget.defaultView%2C0%2Cevent.screenX%2Cevent.screenY%2Cevent.clientX%2Cevent.clientY%2Cfalse%2Cfalse%2Cfalse%2Cfalse%2C2%2Cnull%29%3B%0A%20%20%20%20event.originalTarget.dispatchEvent%28evt%29%3B%0A%7D%2C%0A%0A_startGesture%3Afunction%28%20event%20%29%20%7B%0A%20%20%20%20this._lastX%20%3D%20event.screenX%3B%0A%20%20%20%20this._lastY%20%3D%20event.screenY%3B%0A%20%20%20%20this._directionChain%20%3D%20%22%22%3B%0A%7D%2C%0A%0A_progressGesture%3Afunction%28%20event%20%29%20%7B%0A%20%20%20%20var%20x%20%3D%20event.screenX%2C%20y%20%3D%20event.screenY%3B%0A%20%20%20%20var%20lastX%20%3D%20this._lastX%2C%20lastY%20%3D%20this._lastY%3B%0A%20%20%20%20var%20subX%20%3D%20x-lastX%2C%20subY%3Dy-lastY%3B%0A%20%20%20%20var%20distX%20%3D%20%28%20subX%20%3E%200%20%3F%20subX%20%3A%20%28-subX%29%20%29%2C%20distY%20%3D%20%28%20subY%20%3E%200%20%3F%20subY%20%3A%20%28%20-subY%20%29%20%29%3B%0A%20%20%20%20var%20direction%3B%0A%20%20%20%20if%20%28%20distX%20%3C%2010%20%26%26%20distY%20%3C%2010%20%29%20return%3B%0A%20%20%20%20%20%20%20%20%0A%20%20%20%20if%20%28%20distX%20%3E%20distY%20%29%20direction%20%3D%20subX%20%3C%200%20%3F%20%22L%22%20%3A%20%22R%22%3B%0A%20%20%20%20else%20%0A%20%20%20%20%20%20%20%20%20direction%20%3D%20subY%20%3C%200%20%3F%20%22U%22%20%3A%20%22D%22%3B%0A%0A%20%20%20%20var%20dChain%20%3D%20this._directionChain%3B%0A%20%20%20%20if%20%28%20direction%20%21%3D%3D%20dChain.charAt%28%20dChain.length-1%20%29%20%29%20%7B%0A%20%20%20%20%20%20%20%20%20dChain%20+%3D%20direction%3B%0A%20%20%20%20%20%20%20%20%20this._directionChain%20+%3D%20direction%3B%0A%20%20%20%20%20%20%20%20%20var%20gesture%20%3D%20this.GESTURES%5BdChain%5D%3B%0A%20%20%20%20%20%20%20%20%20XULBrowserWindow.statusTextField.label%20%3D%20%22%u0416%u0435%u0441%u0442%20%u043C%u044B%u0448%u0438%3A%20%22+%20dChain%20+%20%28%20gesture%20%3F%20%27%20%28%27+%20gesture.name%20+%27%29%27%20%3A%20%27%27%20%29%3B%0A%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20this._lastX%20%3D%20x%3B%0A%20%20%20%20this._lastY%20%3D%20y%3B%0A%7D%2C%0A%0A_stopGesture%3Afunction%28event%29%20%7B%0A%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20if%20%28%20dChain%20%3D%20this._directionChain%20%29%20this.GESTURES%5BdChain%5D.cmd%28%20this%2C%20event%20%29%3B%0A%20%20%20%20%20%20%20%20XULBrowserWindow.statusTextField.label%20%3D%20%22%22%3B%0A%20%20%20%20%7D%0A%20%20%20%20catch%28e%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20setTimeout%28function%28%29%20%7B%20XULBrowserWindow.statusTextField.label%20%3D%20%22%u041D%u0435%u0438%u0437%u0432%u0435%u0441%u0442%u043D%u044B%u0439%20%u0436%u0435%u0441%u0442%20%u043C%u044B%u0448%u0438%3A%20%22%20+%20dChain%20%7D%2C%200%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20setTimeout%28function%28%29%20%7B%20XULBrowserWindow.statusTextField.label%20%3D%20%22%22%20%7D%2C%20600%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20this._directionChain%20%3D%20%22%22%3B%0A%7D%2C%0A%0AshowAlert%3Afunction%28image%2C%20label%2C%20notification%29%20%7B%0A%20%20%20%20Cc%5B%22@mozilla.org/alerts-service%3B1%22%5D.getService%28Ci.nsIAlertsService%29%0A%20%20%20%20.showAlertNotification%28image%2C%20label%2C%20notification%2C%20false%2C%20%22%22%2C%20null%2C%20%22%22%29%3B%0A%7D%2C%0A%0A_buildPopup%3Afunction%28event%2C%20gestureCmd%29%20%7B%0A%20%20%20%20var%20popup%20%3D%20document.getElementById%28%27GesturePopup%27%29%3B%0A%20%20%20%20if%20%28%20%21popup%20%29%20%7B%0A%20%20%20%20%20%20%20%20%20popup%20%3D%20document.createElement%28%22popup%22%29%3B%0A%20%20%20%20%20%20%20%20%20popup.id%20%3D%20%27GesturePopup%27%3B%0A%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20document.getElementById%28%22mainPopupSet%22%29.appendChild%28%20popup%20%29%3B%0A%20%20%20%20popup.setAttribute%28%22gesturecommand%22%2C%20gestureCmd%20%29%3B%0A%20%20%20%20%0A%20%20%20%20switch%28%20gestureCmd%20%29%20%7B%0A%20%20%20%20%20%20%20%20case%22WebSearchPopup%22%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20var%20engines%20%3D%20Services.search.getVisibleEngines%28%7B%7D%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20%28%20engines.length%20%3C%201%20%29%20throw%22%u041F%u043E%u0438%u0441%u043A%u043E%u0432%u044B%u0435%20%u0441%u0438%u0441%u0442%u0435%u043C%u044B%20%u043D%u0435%20%u0443%u0441%u0442%u0430%u043D%u043E%u0432%u043B%u0435%u043D%u044B%22%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20%28%20var%20i%20%3D%20engines.length%20-%201%3B%20i%20%3E%3D%200%3B--i%20%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20engine%20%3D%20engines%5Bi%5D%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20menuitem%20%3D%20document.createElement%28%22menuitem%22%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20menuitem.setAttribute%28%22label%22%2C%20engine.name%20%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20menuitem.setAttribute%28%22class%22%2C%20%22menuitem-iconic%22%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28%20engine.iconURI%20%29%20menuitem.setAttribute%28%22src%22%2C%20engine.iconURI.spec%20%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20popup.insertBefore%28%20menuitem%2C%20popup.firstChild%20%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20menuitem.engine%20%3D%20engine%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20popup.setAttribute%28%22selectedtext%22%2C%20getBrowserSelection%28%29.toString%28%29%20%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20case%22ClosedTabsPopup%22%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28%20%21gPrefService.getBoolPref%28%22browser.sessionstore.enabled%22%29%20%29%20throw%22%u0424%u0443%u043D%u043A%u0446%u0438%u044F%20%u0432%u043E%u0441%u0441%u0442%u0430%u043D%u043E%u0432%u043B%u0435%u043D%u0438%u044F%20%u0441%u0435%u0441%u0441%u0438%u0439%20%u043E%u0442%u043A%u043B%u044E%u0447%u0435%u043D%u0430%22%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20catch%28e%29%7B%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20var%20ss%20%3D%20Cc%5B%22@mozilla.org/browser/sessionstore%3B1%22%5D.getService%28Ci.nsISessionStore%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20%28%20ss.getClosedTabCount%28window%29%20%3D%3D0%20%29%20throw%22%u041D%u0435%u0442%20%u0432%u043E%u0441%u0441%u0442%u0430%u043D%u0430%u0432%u043B%u0438%u0432%u0430%u0435%u043C%u044B%u0445%20%u0432%u043A%u043B%u0430%u0434%u043E%u043A%20%u0432%20%u044D%u0442%u043E%u043C%20%u043E%u043A%u043D%u0435.%22%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20var%20undoItems%20%3D%20eval%28%22%28%22+ss.getClosedTabData%28window%29+%22%29%22%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20%28%20var%20i%3D0%2C%20LEN%20%3D%20undoItems.length%3B%20i%3CLEN%3B%20i++%20%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20menuitem%3Dpopup.appendChild%28document.createElement%28%22menuitem%22%29%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20menuitem.setAttribute%28%22label%22%2CundoItems%5Bi%5D.title%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20menuitem.setAttribute%28%22class%22%2C%22menuitem-iconic%20bookmark-item%22%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20menuitem.index%20%3D%20i%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20iconURL%20%3D%20undoItems%5Bi%5D.image%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28%20iconURL%20%29%20menuitem.setAttribute%28%22image%22%2C%20iconURL%20%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20case%22HistoryPopup%22%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20var%20sessionHistory%20%3D%20gBrowser.webNavigation.sessionHistory%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20%28%20sessionHistory.count%3C1%20%29%20throw%22%u041D%u0435%u0442%20%u0438%u0441%u0442%u043E%u0440%u0438%u0438%20%u0432%20%u044D%u0442%u043E%u0439%20%u0432%u043A%u043B%u0430%u0434%u043A%u0435.%22%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20var%20curIdx%20%3D%20sessionHistory.index%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20%28%20var%20i%20%3D%200%2C%20shc%20%3D%20sessionHistory.count%3B%20i%20%3C%20shc%3B%20i++%20%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20entry%20%3D%20sessionHistory.getEntryAtIndex%28i%2Cfalse%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28%20%21entry%20%29%20continue%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20menuitem%20%3D%20document.createElement%28%22menuitem%22%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20popup.insertBefore%28menuitem%2Cpopup.firstChild%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20menuitem.setAttribute%28%22label%22%2Centry.title%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20iconURL%20%3D%20Cc%5B%22@mozilla.org/browser/favicon-service%3B1%22%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.getService%28Ci.nsIFaviconService%29.getFaviconForPage%28entry.URI%29.spec%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20menuitem.style.listStyleImage%20%3D%20%22url%28%22+iconURL+%22%29%22%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20catch%28e%29%7B%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20menuitem.index%20%3D%20i%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28%20i%3D%3DcurIdx%20%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20menuitem.style.listStyleImage%20%3D%20%22%22%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20menuitem.setAttribute%28%22type%22%2C%22radio%22%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20menuitem.setAttribute%28%22checked%22%2C%22true%22%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20menuitem.className%20%3D%20%22unified-nav-current%22%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20activeItem%20%3D%20menuitem%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20else%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20menuitem.className%20%3D%20i%20%3C%20curIdx%20%3F%20%22unified-nav-back%20menuitem-iconic%22%20%3A%20%22unified-nav-forward%20menuitem-iconic%22%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20case%22AllTabsPopup%22%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20var%20tabs%20%3D%20gBrowser.mTabs%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20%28%20tabs.length%20%3C%201%20%29%20return%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20%28%20var%20i%3D0%2C%20LEN%20%3D%20tabs.length%3B%20i%20%3C%20LEN%3B%20i++%20%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20menuitem%20%3D%20popup.appendChild%28document.createElement%28%22menuitem%22%29%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20tab%20%3D%20tabs%5Bi%5D%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20menuitem.setAttribute%28%22class%22%2C%20%22menuitem-iconic%20bookmark-item%22%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20menuitem.setAttribute%28%22label%22%2C%20tab.label%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20menuitem.setAttribute%28%22crop%22%2C%20tab.getAttribute%28%22crop%22%29%20%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20menuitem.setAttribute%28%22image%22%2C%20tab.getAttribute%28%22image%22%29%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20menuitem.index%20%3D%20i%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28%20tab.selected%20%29%20menuitem.setAttribute%28%22style%22%2C%20%22color%3A%20red%3B%20font-weight%3A%20bold%3B%22%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28%20tab.hasAttribute%28%27unread%27%29%20%29%20menuitem.setAttribute%28%22style%22%2C%20%22color%3A%20blue%3B%22%29%3B%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%0A%20%20%20%20document.popupNode%20%3D%20null%3B%0A%20%20%20%20document.tooltipNode%20%3D%20null%3B%0A%20%20%20%20popup.addEventListener%28%22popuphiding%22%2C%20this%2C%20true%29%3B%0A%20%20%20%20popup.openPopup%28%20null%2C%20%22%22%2C%20event.clientX%2C%20event.clientY%2C%20false%2C%20false%20%29%3B%0A%20%20%20%20document.documentElement.addEventListener%28%22mouseup%22%2C%20this%2C%20true%29%3B%0A%7D%0A%7D%29.init%28%29%3B%0A%0A%0A%0A%0A//%20%u041A%u043D%u043E%u043F%u043A%u0430%20%u0434%u043B%u044F%20%u0443%u043F%u0440%u0430%u0432%u043B%u0435%u043D%u0438%u044F%20%u043C%u0430%u0441%u0448%u0442%u0430%u0431%u043E%u043C%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%u044B%20%u0432%20%u0430%u0434%u0440%u0435%u0441%u043D%u043E%u0439%20%u0441%u0442%u0440%u043E%u043A%u0435%2C%20%u043E%u0442%2027.11.2017.%20..........................%0A%28%28%29%3D%3E%20%7B%0A%20%20%20//%20%u0423%u0434%u0430%u043B%u0438%u0442%u044C%20%u0438%u0437%20%u0430%u0434%u0440%u0435%u0441%u043D%u043E%u0439%20%u0441%u0442%u0440%u043E%u043A%u0438%20FF51%20%u0441%u0442%u0430%u043D%u0434%u0430%u0440%u0442%u043D%u0443%u044E%20%u043A%u043D%u043E%u043F%u043A%u0443%20%u043C%u0430%u0441%u0448%u0442%u0430%u0431%u0430%20....%0A%20%20%20var%20but%20%3D%20document.getElementById%28%27urlbar-zoom-button%27%29%3B%0A%20%20%20if%20%28but%29%20but.style.display%20%3D%20%22none%22%3B%0A%20%20%20%0A%20%20%20//%20%u0421%u043E%u0437%u0434%u0430%u0442%u044C%20%u0432%20%u0430%u0434%u0440%u0435%u0441%u043D%u043E%u0439%20%u0441%u0442%u0440%u043E%u043A%u0435%20%u043A%u043D%u043E%u043F%u043A%u0443%20%u043C%u0430%u0441%u0448%u0442%u0430%u0431%u0430%20....%0A%20%20%20var%20zoomButton%20%3D%20document.createElement%28%22statusbarpanel%22%29%3B%0A%20%20%20var%20urlbarIcons%20%3D%20document.getElementById%28%22urlbar-icons%22%29%20%7C%7C%20document.getElementById%28%22page-action-buttons%22%29%3B%20//%20FF57%0A%20%20%20urlbarIcons.insertBefore%28zoomButton%2C%20urlbarIcons.lastChild%29%3B%20//%20%u043F%u0435%u0440%u0435%u0434%20%u043F%u043E%u0441%u043B%u0435%u0434%u043D%u0435%u0439%20%u043A%u043D%u043E%u043F%u043A%u043E%u0439%20%u0430%u0434%u0440%u0435%u0441%u043D%u043E%u0439%20%u0441%u0442%u0440%u043E%u043A%u0438%0A%20%20%20addDestructor%28%28%29%3D%3E%20zoomButton.remove%28%29%29%3B%0A%20%20%20%20%20%0A%20%20%20updateZoomButton%28%29%3B%20%0A%20%20%20zoomButton.id%20%3D%20%22zoomButton%22%3B%0A%20%20%20zoomButton.setAttribute%28%22context%22%2C%20%22event.stopPropagation%28%29%22%29%3B%0A%20%20%20zoomButton.style.cssText%20%3D%20%22-moz-appearance%3A%20none%3B%20border%3A%200%3B%20margin-right%3A%20-1px%3B%22%3B%20//%20Css%20%u0441%u0442%u0438%u043B%u044C%20%u0434%u043B%u044F%20%u043A%u043D%u043E%u043F%u043A%u0438%20%u043C%u0430%u0441%u0448%u0442%u0430%u0431%u0430%20%20%20%0A%20%20%20zoomButton.tooltipText%20%3D%20%22%u041B%3A%20%u041C%u0435%u043D%u044F%u0442%u044C%20%u043C%u0430%u0441%u0448%u0442%u0430%u0431%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%u044B%20%u0438%u043B%u0438%20%u0442%u043E%u043B%u044C%u043A%u043E%20%u0442%u0435%u043A%u0441%u0442%u0430%5Cn%u0421%3A%20%u0415%u0434%u0438%u043D%u044B%u0439%20%u043C%u0430%u0441%u0448%u0442%u0430%u0431%20%u0434%u043B%u044F%20%u0432%u0441%u0435%u0445%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%20%5Cn%u041F%3A%20%u0421%u0431%u0440%u043E%u0441%u0438%u0442%u044C%20%u043C%u0430%u0441%u0448%u0442%u0430%u0431%20%u043D%u0430%20100%25%20%22%3B%0A%0A%20%20%20%0A%20%20%20//%20%u041E%u0442%u0441%u043B%u0435%u0436%u0438%u0432%u0430%u0442%u044C%20%u043A%u043B%u0438%u043A%u0438%20%u043D%u0430%20%u043A%u043D%u043E%u043F%u043A%u0435%20%u043C%u0430%u0441%u0448%u0442%u0430%u0431%u0430%20....%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20addEventListener%28%22click%22%2C%20e%3D%3E%20%7B%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20if%20%28%20e.button%20%3D%3D%200%20%29%20ZoomManager.toggleZoom%28%29%3B%20//%20%u043F%u0435%u0440%u0435%u043A%u043B%u044E%u0447%u0438%u0442%u044C%20%u0440%u0435%u0436%u0438%u043C%20%u0438%u0437%u043C%u0438%u043D%u0435%u043D%u0438%u044F%20%u043C%u0430%u0441%u0448%u0442%u0430%u0431%u0430%0A%20%20%20%20%20%20%0A%20%20%20%20%20%20if%20%28%20e.button%20%3D%3D%201%20%29%20%7B%20//%20%u0435%u0434%u0438%u043D%u044B%u0439%20%u043C%u0430%u0441%u0448%u0442%u0430%u0431%20%u0434%u043B%u044F%20%u0432%u0441%u0435%u0445%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%0A%20%20%20%20%20%20%20%20%20%20%20cbu.isPref%28%22CB.zoom.allEvenly%22%2C%20false%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20cbu.setPrefs%28%22CB.zoom.allEvenly%22%2C%20%21cbu.getPrefs%28%22CB.zoom.allEvenly%22%29%20%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20cbu.setPrefs%28%22CB.zoom.Percent%22%2C%20ZoomManager.zoom.toFixed%282%29%20%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20updateZoomButton%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20if%20%28%20e.button%20%3D%3D%202%20%29%20FullZoom.reset%28%29%3B%20//%20%u0441%u0431%u0440%u043E%u0441%u0438%u0442%u044C%20%u043C%u0430%u0441%u0448%u0442%u0430%u0431%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%7D%2C%20false%2C%20zoomButton%29%3B%0A%0A%20%20%20%20%20%20%20%20%20%0A%20%20%20//%20%u041C%u0435%u043D%u044F%u0442%u044C%20%u043C%u0430%u0441%u0448%u0442%u0430%u0431%20%u043A%u043E%u043B%u0435%u0441%u0438%u043A%u043E%u043C%20%u043C%u044B%u0448%u0438%20%u043D%u0430%20%u043A%u043D%u043E%u043F%u043A%u0435%20%u043C%u0430%u0441%u0448%u0442%u0430%u0431%u0430%20....%0A%20%20%20addEventListener%28%22DOMMouseScroll%22%2C%20e%3D%3E%20%7B%0A%20%20%20%20%20%20e.detail%20%3E%200%20%3F%20FullZoom.reduce%28%29%20%3A%20FullZoom.enlarge%28%29%3B%0A%20%20%20%7D%2C%20false%2C%20zoomButton%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%0A%20%0A%20%20%20//%20%u0421%u043B%u0435%u0434%u0438%u043C%20%u0437%u0430%20%u0438%u0437%u043C%u0435%u043D%u0435%u043D%u0438%u0435%u043C%20%u043C%u0430%u0441%u0448%u0442%u0430%u0431%u0430%20%u0438%20%u0437%u0430%u043F%u0443%u0441%u043A%u0430%u0435%u043C%20%u043E%u0431%u043D%u043E%u0432%u043B%u0435%u043D%u0438%u0435%20%u043A%u043D%u043E%u043F%u043A%u0438%20....%0A%20%20%20var%20str%20%3D%20%22%7B%20setTimeout%28%28%29%3D%3E%20%7B%20updateZoomButton%28%29%20%7D%2C%2050%29%3B%22%3B%0A%20%20%20var%20handleEvent%20%3D%20parseInt%28Services.appinfo.version%29%20%3E%2033%20%3F%20FullZoom.handleEvent%20%3A%20FullZoom._handleMouseScrolled%3B%0A%20%20%20var%20array%20%3D%20%5BFullZoom.reset%2C%20FullZoom.reduce%2C%20FullZoom.enlarge%2C%20ZoomManager.toggleZoom%2C%20handleEvent%5D%3B%0A%20%20%20array.forEach%28func%3D%3E%20%7B%20setTimeout%28%28%29%3D%3E%20%7B%20eval%28%20%28func.toString%28%29.replace%28%27_%27%2C%20%27.%27%29.match%28/function%20%28%5B%5E%28%5D*%29%5C%28/%29%5B1%5D%20+%20%22%20%3D%20%22%20+%20func.toString%28%29.replace%28%22%7B%22%2C%20str%29%29%20%29%7D%2C%2050%29%20%7D%29%3B%20%0A%20%20%20addDestructor%28%28%29%3D%3E%20%7B%20%0A%20%20%20%20%20%20array.forEach%28func%3D%3E%20%7B%20eval%28%20%28func.toString%28%29.replace%28%27_%27%2C%20%27.%27%29.match%28/function%20%28%5B%5E%28%5D*%29%5C%28/%29%5B1%5D%20+%20%22%20%3D%20%22%20+%20func.toString%28%29%29.replace%28str%2C%22%7B%22%29%20%29%20%7D%29%3B%20%20%0A%20%20%20%7D%29%3B%20%20%20%0A%20%20%20%0A%20%20%20%0A%20%20%20//%20%u041F%u043E%u043A%u0430%u0437%u044B%u0432%u0430%u0442%u044C%20%u0442%u0435%u043A%u0443%u0449%u0438%u0439%20%u043C%u0430%u0441%u0448%u0442%u0430%u0431%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%u044B%20%u043D%u0430%20%u043A%u043D%u043E%u043F%u043A%u0435%20%u0438%20%u0438%u0437%u043C%u0435%u043D%u044F%u0442%u044C%20%u0446%u0432%u0435%u0442%20%u0438%20%u0448%u0440%u0438%u0444%u0442%20%u043E%u0442%u043E%u0431%u0440%u0430%u0436%u0435%u043D%u0438%u044F%20%u043C%u0430%u0441%u0448%u0442%u0430%u0431%u0430%20....%0A%20%20%20function%20updateZoomButton%28e%29%20%7B%0A%20%20%20%20%20%20zoomButton.label%20%3D%20Math.round%28ZoomManager.zoom*100%29%20+%20%22%25%22%3B%20%0A%20%20%20%20%20%20setTimeout%28%28%29%3D%3E%20%7B%20%20%0A%20%20%20%20%20%20%20%20%20zoomButton.style.fontWeight%20%3D%20ZoomManager.useFullZoom%20%3F%20%27%27%20%3A%20%27bold%27%3B%0A%20%20%20%20%20%20%20%20%20zoomButton.style.color%20%3D%20cbu.getPrefs%28%22CB.zoom.allEvenly%22%29%20%3F%20%22red%22%20%3A%20%22%22%3B%0A%20%20%20%20%20%20%7D%2C%205%29%3B%0A%20%20%20%20%20%20%0A%20%20%20%20%20%20//%20%u0437%u0430%u043F%u043E%u043C%u043D%u0438%u0442%u044C%20%u0442%u0435%u043A%u0443%u0449%u0438%u0439%20%u043C%u0430%u0441%u0448%u0442%u0430%u0431%20%u0432%20%27about%3Aconfig%27%0A%20%20%20%20%20%20if%20%28%20e%20%3D%3D%20undefined%20%29%20%7B%20%0A%20%20%20%20%20%20%20%20%20%20%20try%20%7B%20window.clearTimeout%28zoomButton.prefTimeout%29%20%7D%20catch%28e%29%20%7B%7D%3B%0A%20%20%20%20%20%20%20%20%20%20%20zoomButton.prefTimeout%20%3D%20window.setTimeout%28%28%29%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20cbu.setPrefs%28%22CB.zoom.Percent%22%2C%20ZoomManager.zoom.toFixed%282%29%20%29%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%7D%2C%20250%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%7D%20%20%20%20%20%0A%20%20%20%7D%3B%0A%20%20%20%20%20%0A%20%20%20%20%20%0A%20%20%20//%20%u0423%u0441%u0442%u0430%u043D%u0430%u0432%u043B%u0438%u0432%u0430%u0442%u044C%20%u0435%u0434%u0438%u043D%u044B%u0439%20%u043C%u0430%u0441%u0448%u0442%u0430%u0431%20%u0434%u043B%u044F%20%u0432%u0441%u0435%u0445%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%20%u0435%u0441%u043B%u0438%20%u044D%u0442%u043E%20%u0440%u0430%u0437%u0440%u0435%u0448%u0435%u043D%u043E%20%u0432%20%27about%3Aconfig%27%20....%0A%20%20%20addEventListener%28%22TabAttrModified%22%2C%20e%3D%3E%20%7B%0A%20%20%20%20%20%20if%20%28%20e.target.linkedBrowser.currentURI.spec%20%21%3D%3D%20gBrowser.currentURI.spec%20%29%20return%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20if%20%28%20cbu.getPrefs%28%22CB.zoom.allEvenly%22%29%20%26%26%20content.location.protocol.startsWith%28%22http%22%29%20%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20var%20value%20%3D%20cbu.getPrefs%28%22CB.zoom.Percent%22%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20if%20%28%20ZoomManager.zoom.toFixed%282%29%20%3D%3D%20value%20%29%20return%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20setTimeout%28%28%29%3D%3E%20%7B%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20gBrowser.markupDocumentViewer%5BZoomManager.useFullZoom%20%3F%20%27fullZoom%27%20%3A%20%27textZoom%27%5D%20%3D%20value%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20updateZoomButton%28e%29%3B%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%7D%2C%200%29%3B%20%0A%20%20%20%20%20%20%20%20%20%20%20%7D%20%20%20%20%20%20%0A%20%20%20%20%20%20else%20%0A%20%20%20%20%20%20%20%20%20%20%20updateZoomButton%28e%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%7D%2C%20true%2C%20gBrowser.tabContainer%29%3B%20%20%20%0A%7D%29%28%29%3B%0A%0A//%20%u041F%u043E%u0434%u0441%u043A%u0430%u0437%u043A%u0430%20%u043A%u043D%u043E%u043F%u043A%u0438%20................................%0Athis.tooltipText%20%3D%20%22CB%20Mouse%20Gestures+%20%20%5Cn%u0417%u0430%u043F%u0443%u0441%u043A%u0430%u0435%u0442%20%u0436%u0435%u0441%u0442%u0438%20%u043C%u044B%u0448%u0438%20%u0434%u043B%u044F%20%u041F%u041A%u041C%20%u043D%u0430%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%u0435%20%5Cn%u041B%3A%20%u0420%u0435%u0434%u0430%u043A%u0442%u0438%u0440%u043E%u0432%u0430%u0442%u044C%20%u044D%u0442%u0443%20%u043A%u043D%u043E%u043F%u043A%u0443%22%3B%0A%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B//%20%u0420%u0435%u0434%u0430%u043A%u0442%u0438%u0440%u043E%u0432%u0430%u0442%u044C%20%u044D%u0442%u0443%20%u043A%u043D%u043E%u043F%u043A%u0443%20....%0Acustombuttons.editButton%28this%29%3B%0A%0A%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

Тут и управление жестами и масштаб в адресной строке.

Mishania
А кто автор этой кнопки (откуда она взялась)?

Вот только у меня при её использовании не появляется индикатор масштаба в адресной строке.
После использования и последующего удаления кнопки "Изменить масштаб" штатный индикатор пропал и теперь я не знаю как его восстановить.

Я удалил из этой двойной кнопки код, относящийся к "Изменить масштаб" и оставил только жесты (кручу колёсиком с зажатой правой кнопкой).
Но для меня кнопка жестов избыточна. Мне жесты не нужны, а нужно только изменение масштаба.
Если автор добавит в свою кнопку метод "Колёсико с зажатой ПКМ" будет самое то.

usalex пишет:

Изменять масштаб колёсиком мыши при зажатой правой кнопке

это может расширение MouseZoomer

Бумбик
Спасибо.
Но, у этого расширения хоть и настраиваемый, но фиксированный шаг масштаба.
А у меня своя нелинейная шкала, по которой кнопка отрабатывает на ура.
К тому же, в расширении после отжатия ПКМ выскакивает контекстное меню страницы, чего быть не должно - конкретная недоработка.
Поэтому попробую все же уговорить автора добавить в кнопку метод "Колёсико с зажатой ПКМ" :)

Бумбик
Кнпоку для CB делали по моей просьбе, специально чтоб заменить это расширение.
usalex
Я уже и не помню кто делал, но точно но на этом форуме, по моей просьбе и если не ошибаюсь вам даже в другой ветке ссылку давали именно на первоисточник. Если индикатор не появляется, то что-то у вас не так. Попробуйте поэкспериментировать на чистом профиле и кнопку на панель.

Mishania пишет:

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

Да, давали - там я её и взял. Кнопку выложили вы с просьбой исправить для работы с e10s.
Доработку сделал bunda1 и теперь я этой кнопкой пользуюсь.
Похоже, много полезных кнопок просто разбросано по форуму и о них можно так никогда и не узнать :)

usalex пишет:

уговорить

:/

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

Выделить код

Код:

addEventListener("wheel", {
    flag: false, handleEvent(e) {this[e.type](e);},
    contextmenu(e) {
        this.flag = e.preventDefault();
        window.removeEventListener("contextmenu", this);
    },
    wheel(e) {
        if (e.buttons != 2 || !gBrowser.selectedBrowser.matches(":hover")) return;
        if (!this.flag) this.flag = !window.addEventListener("contextmenu", this);
        e.preventDefault(); FullZoom[e.deltaY > 0 ? "reduce" : "enlarge"]();
    }
}, false, gBrowser);
FullZoom._globalValue = 1.25; addDestructor(() => delete FullZoom._globalValue);

Dumby
Вот это да!!! Просто рождественский подарок какой-то... :)
Спасибо вам огромное!
Мало того, что добавили удобнейший способ изменения масштаба, так ещё и реализовали фичу, которую я уж посчитал нереализуемой (с помощью кнопок): "Кастомный масштаб для впервые посещаемых страниц".
Вау! Супер!

usalex пишет:

Кнопку выложили вы с просьбой исправить для работы с e10s.
Доработку сделал bunda1 и теперь...

А, кстати, зачем делать для кнопки поддержку многопроцессности, если само расширение Custom Buttons при установке отключает эту самую многопроцессность?

Dumby, спасибо за подробное разъяснение вопроса! :beer:
(свою ошибку поправил :) но слово все равно какое-то корявое... надо бы какую-нибудь замену ему подобрать)

usalex пишет:

А, кстати, зачем делать для кнопки поддержку многопроцессорности, если само расширение Custom Buttons при установке отключает эту самую многопроцессорность?

скрытый текст
Само расширение Custom Buttons, при установке, нигде ничего не отключает.
Ни многопроцессорность, ни многопроцессность, ни что-либо другое иное прочее.

Само расширение Custom Buttons полностью совместимо с многопроцессностью.
Более того, оно (ну, может, за исключением своего протокола),
не имеет к многопроцессности никакого отношения совсем.

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

А в Custom Buttons не заявлено, что оно совместимо с e10s только потому,
чтобы кнопки могли воспользоваться всем тем, что хоть как-то, иногда,
обеспечивает работу немногопроцессного кода в многопроцессном Firefox.


Те, для кого многопроцессный Firefox является осознанным выбором,
уже давно переключили соответствующие настройки принудительно,
и, обретя независимость, и все приемущества и недостатки такого выбора,
видят, что некоторые кнопки не работают вообще, отсюда и просьбы исправить.

Возможно, некоторые из них, осознавая, что в многопроцессном Firefox,
следует, по-возможности, всячески избегать использования немногопроцессного кода,
так как от этого только тормоза́ и глюки, даже если код работает,
тоже могут попросить переписать код кнопки под e10s.

Вот такой вот резон «зачем делать для кнопки поддержку многопроцессорности»

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

Stkvsky пишет:

это из за того что у меня очищаются куки после перезапуска?

Нет, куки тут не причём. Наверно у тебя при перезапуске стираются настройки сайтов.

bunda1
Точно, спасибо.

bunda1
Вы бы не могли сделать, если возможо, чтобы значения масштаба для каждого сайта хранились не в настройках сайта?

Настройки хочется тоже очищать после закрытия браузера, так как там, оказывается, хранится информация Автономное-веб сожержимое и данные пользователя

Stkvsky пишет:

bunda1
Вы бы не могли сделать, если возможо, чтобы значения масштаба для каждого сайта хранились не в настройках сайта?

Можно, но сложно. Я не возьмусь.

bunda1 - подскажите, как включить "Колесико мыши" над всей панелью кнопок, а не только на кнопке Zoom?

Удобнее при клике на кнопку "Режим чтения" сразу покрутить Колесико и установить нужный масштаб. Есть вариант с gURLBar, но это не то...
в DOM Инспекторе нашёл панель кнопок "nav-bar-customization-target" (hbox), но как её в вашу кнопку добавить?

Выделить код

Код:

// Менять масштаб колесиком мыши на кнопке масштаба zoomButton или адресной строке gURLBar
addEventListener("DOMMouseScroll", e=> { e.detail > 0 ? FullZoom.reduce() : FullZoom.enlarge(); }, false, gURLBar);

Dobrov
https://forum.mozilla-russia.org/viewto … 60#p726960

Внимательней, я уже отметил, что вариант с gURLBar мне не подходит! , нужен Zoom при прокрутке над панелью кнопок!

Dobrov пишет:

Удобнее при клике на кнопку "Режим чтения" сразу покрутить Колесико и установить нужный масштаб

:/

Выделить код

Код:

// Менять масштаб колесиком мыши на кнопке масштаба zoomButton или адресной строке gURLBar
var urlbarIcons = document.getElementById("urlbar-icons") || document.getElementById("page-action-buttons"); // FF57
addEventListener("DOMMouseScroll", e=> { e.detail > 0 ? FullZoom.reduce() : FullZoom.enlarge(); }, false, urlbarIcons);

bunda1 - спасибо, но для адресной строки и так работает gURLBar, а иконку ReaderMode я в строке адреса скрыл.

У меня отдельная кнопка CustomButtons - вкл/выкл Режим чтения (toggleReaderMode)
как включить "Колесико мыши" над всей панелью кнопок?
или хотя бы над отдельной кнопкой cb-name="Reader mode", но чтобы сохранилось изменение масштаба также и в адресной строке

Dobrov пишет:

как включить "Колесико мыши" над всей панелью кнопок?

Что ты называешь панелью кнопок?

Dobrov пишет:

или хотя бы над отдельной кнопкой cb-name="Reader mode", но чтобы сохранилось изменение масштаба также и в адресной строке

В инициализацию кнопки Reader mode:

Выделить код

Код:

this.onwheel =e=> e.deltaY < 0 ? FullZoom.reduce() : FullZoom.enlarge();

bunda1 пишет:

Что ты называешь панелью кнопок?

это #nav-bar - нужен такой функционал: нажать кнопку "Reader Mode" в #nav-bar-е, затем изменить масштаб Колёсиком мыши.

Добавил код в инициализацию, только ролик наоборот работал, поменял условия:

Выделить код

Код:

this.onwheel =e=> e.deltaY < 0 ? FullZoom.enlarge() : FullZoom.reduce();

А вариант [CB]Изменить масштаб, работающий над всей #nav-bar возможно сделать?

Dobrov пишет:

А вариант [CB]Изменить масштаб, работающий над всей #nav-bar возможно сделать?

Не понял :/

bunda1 - панелью кнопок я называл тулбар, куда все новые кнопки рассширений добавляются по-умолчанию.
если смотреть в DOM Inspector-е, это id="nav-bar-customization-target"

возможно ли сделать, чтобы масштаб менялся Колёсиком над кнопками этой панели кнопок ?

Dobrov пишет:

возможно ли сделать, чтобы масштаб менялся Колёсиком над кнопками этой панели кнопок ?

Выделить код

Код:

var navBar = document.getElementById("nav-bar");
addEventListener("DOMMouseScroll", e=> { e.detail > 0 ? FullZoom.reduce() : FullZoom.enlarge(); }, false, navBar);

При многопроцессе не показывает кол-во совпадений: 0/0

Я так понимаю, что удалить иконку масштаба при 100% никак?

bunda1 пишет:

При многопроцессе не показывает кол-во совпадений: 0/0

а, что это? У меня другой код в 58 , и проблем вроде нет...В SM есть, как бы задать на :
FullZoom.reset();  стиль style.display = "none"; чтобы икона в адресе исчезала....

drage2 пишет:

а, что это? У меня другой код в 58 , и проблем вроде нет...В SM есть, как бы задать на :
FullZoom.reset();  стиль style.display = "none"; чтобы икона в адресе исчезала....

Выделить код

Код:

FullZoom.reset();
zoomButton.style.display = "none";

bunda1

bunda1 пишет:

FullZoom.reset(); zoomButton.style.display = "none";

Так она совсем пропадает и кнопка A/P не работают....
Кстати, есть кнопка вызова любой проги с командой

Выделить код

Код:

var file = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsIFile);
file.initWithPath('C:\\PotPlayer\\PotPlayer.exe');
var process = Cc["@mozilla.org/process/util;1"].createInstance(Ci.nsIProcess);
var args = ["/команда"];
process.init( file );
process.run( false, args, args.length ); 

А,наоборот, закрыть прогу, выйти можно? Все уже подставлял....никак. Это я хочу прикрутить к кнопке Memory, все работает, но при выходе из браузера
неплохо бы и memreduc закрыть , или любую (у меня разные на каждый браузер)

drage2 пишет:

А,наоборот, закрыть прогу, выйти можно?

Выделить код

Код:

// Пример, код закрывает notepad.exe при выходе из браузера:
var closer = {
    observe: function(subject, topic, data) {
       if ( data == "shutdown" ){
            var VBScript =
               'strComputer = "."\
               \nSet objWMIService = GetObject("winmgmts:" _\
               \n& "{impersonationLevel=impersonate}!\\\\" & strComputer & "\\root\\cimv2")\
               \nSet colProcessList = objWMIService.ExecQuery _\
               \n("Select * from Win32_Process Where Name = \x27notepad.exe\x27")\
               \nFor Each objProcess in colProcessList\
               \nobjProcess.Terminate()\
               \nNext';
   
            var file = Services.dirsvc.get('ProfD', Ci.nsIFile);
            file.append("processTerminate.vbs");
            custombuttonsUtils.writeFile(file.path, VBScript);
            file.launch();
            }  
    }
};
Services.obs.addObserver(closer, "quit-application", false);

В чем проблема ? Левым кликом + масштаб все ОК! , как правым в минус , так сразу  на -5% ..
А, задано: 90-100-105-112-117 и т.д ...  Ctrl - все как надо....
Поменял 0 на 2, теперь тоже самое все-равно на правом клике, что с ПКМ не так?

drage2 пишет:

В чем проблема ? Левым кликом + масштаб все ОК! , как правым в минус , так сразу  на -5% ..
А, задано: 90-100-105-112-117 и т.д ...  Ctrl - все как надо....
Поменял 0 на 2, теперь тоже самое все-равно на правом клике, что с ПКМ не так?

Не понял.

bunda1

bunda1 пишет:

Не понял.

ЛКМ- увелиить масштаб, ПКМ- уменьшить , или наоборот...
toolkit.zoomManager.zoomValues - 0.9,1,1.05,1.1,1.12,1.15,1.17,1.2,1.25,1.27
Левый клик - всегда идет точно  , как задано, правый скачет , как ему вздумается...и не важно , увеличить или уменьшить.Косяк, только на ПКМ

А ты убрал FullZoom.reset(); с ПКМ?

bunda1
Убирал, эффект тот-же.ctrl - точно выдает...Клик = скачет.А, у вас не так? Если toolkit.zoomManager.zoomValues не по умолчанию?

drage2 пишет:

bunda1
А, у вас не так? Если toolkit.zoomManager.zoomValues не по умолчанию?

Проверил. Вроде всё нормально.

bunda1
Какая кнопка? Там только колесом? Не вижу команды на ПКМ

drage2 пишет:

bunda1
Какая кнопка? Там только колесом? Не вижу команды на ПКМ

Изменить масштаб

bunda1
А масштаб как менять? У меня нет колесика.Где клики ? У меня так: И происходит лажа - то -5%, то -7%
// действие при клике ПКМ ....   
     if ( e.button == 2 &&!e.ctrlKey && !e.shiftKey && !e.altKey && !e.metaKey) {
          e.preventDefault();
          FullZoom.reduce();           
          }
   
           
};
this.setAttribute("ondblclick", "event.preventDefault()");

drage2
Не понял, что ты хочешь добится?

bunda1

bunda1 пишет:

Не понял, что ты хочешь добиться?

Точного масштабирования ....Левая точно масштабирует , а правая -нет!

А как сделать свои значения масштабирования или хотя бы шаг?
toolkit.zoomManager.zoomValues не помогает, что за ерунда?

momo2000 пишет:

При многопроцессе не показывает кол-во совпадений: 0/0

Что то не понял, я вроде писал это в тему [CB]Toggle Find+ и bunda1 ответил что в курсе, но пока не знает как это поправить, но сообщение здесь оказалось.

Вот, что с ней не так? ПКМ - перескакивает как вздумается.

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

Выделить код

Код:

/*Initialization Code*/
// Кнопка для управления масштабом страницы в адресной строке
(()=> {
    // Удалить из адресной строки FF51 стандартную кнопку масштаба ....                                                      
    var but = document.getElementById("urlbar-zoom-button");
    if (but) but.style.display = "none";
   
    // Создать в адресной строке кнопку масштаба ....
    var urlbarIcons = document.getElementById("urlbar-icons") || document.getElementById("page-action-buttons");
    if (!urlbarIcons) return;
    var zoomButton = document.createElement("statusbarpanel");
    urlbarIcons.insertBefore(zoomButton, urlbarIcons.firstChild); // перед последней кнопкой адресной строки
    addDestructor(()=> zoomButton.remove())
     
    updateZoomButton();  
    zoomButton.id = "ZoomButton";
    zoomButton.style.cssText = "-moz-appearance: none; margin-right: -5px !important; margin-left: 5px !important; border: 0 !important;"; // Css стиль для кнопки масштаба
  
     zoomButton.tooltipText = "Л: Сбросить масштаб \nП: Страница (A) - Текст (Р)";
 
    zoomButton.tooltipText = "Л: Сбросить масштаб \nП: Страница (A) - Текст (Р)";
 
    // Отслеживать клики на кнопке масштаба ....            
    addEventListener("click", e=> {                  
        if ( e.button == 2 ) ZoomManager.toggleZoom(); // переключить режим изминения масштаба
           
        
 
        if ( e.button == 0 ) {  // сбросить масштаб
            FullZoom.reset();  
        }
    }, false, zoomButton);
 
    addEventListener("contextmenu", e=> {                  
        e.preventDefault();
    }, true, zoomButton);
     
     
    // Следим за изменением масштаба и запускаем обновление кнопки ....
    var evalcode = () => {
        window.removeEventListener("MozAfterPaint", evalcode, false);
        var str = "{ setTimeout(()=> { updateZoomButton(); }, 50);";
        var array = [FullZoom.reset, FullZoom.reduce, FullZoom.enlarge, FullZoom.handleEvent];
        array.forEach(func=> { setTimeout(()=> { eval( (func.toString().replace("_", ".").match(/function ([^(]*)\(/)[1] + " = " + func.toString().replace("{", str)) );}, 50); });  
        addDestructor(()=> {  
            array.forEach(func=> { eval( (func.toString().replace("_", ".").match(/function ([^(]*)\(/)[1] + " = " + func.toString()).replace(str,"{") ); });  
        });    
    };
    window.addEventListener("MozAfterPaint", evalcode, false);
   
   // Показывать текущий масштаб страницы на кнопке ....
    function updateZoomButton() {
        zoomButton.label = Math.round(ZoomManager.zoom*100) + "%";
    }
 
    addEventListener("TabAttrModified", e=> {
        if ( e.target.linkedBrowser.currentURI.spec !== gBrowser.currentURI.spec ) return;
        setTimeout(()=> {
            updateZoomButton();    
        }, 100);  
    }, false, gBrowser.tabContainer);
     
    addEventListener("TabSelect", e=> {
        if ( e.target.linkedBrowser.currentURI.spec !== gBrowser.currentURI.spec ) return;
        setTimeout(()=> {
            updateZoomButton();    
        }, 100);  
    }, false, gBrowser.tabContainer);    
})(); 
// Настройка функций кликов мыши для кнопки ..............
this.onclick = this.oncontextmenu = e => {

     // действие при клике ЛКМ ....
     if ( e.button == 0 ) FullZoom.enlarge();
          
     // действие при клике СКМ ....    
     if ( e.button == 1 ) cbu.setPrefs(s, !cbu.getPrefs(s));
     
     // действие при клике ПКМ ....    
     if ( e.button == 2 && !e.ctrlKey && !e.shiftKey && !e.altKey && !e.metaKey ) { 
          e.preventDefault();
          FullZoom.reduce();           
          }
     
     showTooltip();         
};
this.setAttribute("ondblclick", "event.preventDefault()");

window.addEventListener("load", initZoomButtons, false);
// Подсказка для кнопки ..............
this.onmouseover =()=> {
   var value = Math.floor((ZoomManager.zoom + 0.005) * 100) + "%";                    
   this.tooltipText = "ЛКМ: увеличить масштаб \nПКМ: уменьшить масштаб ";                                                     
};
// Установить нужную иконку кнопки при старте браузера или при изменениях настроек 'about:config' ..............
var zoomFull = "browser.zoom.full";
function toggleImage() {
   self.image = cbu.getPrefs(zoomFull)
   ? 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACQklEQVQ4jaWSzUtUYRTGf+97rzM6V22YVBQJa1GbPjCiIMJFzaJNYosiiSAooV0ryWW7Nv0DiYXRJnAVtgqMaBEEFShJovmRM43jfDsfd+aO9973bWVIjBZ0ls/znIdzznPgP0vsRYxPvt/KFUqVRHLLS6RE36sXtxpqZSPwZP/A1aagdSBkRXqlGe7bTJcxgkev/LPB9ZsPxoslh0zOJpkqkUiWsLoHXzfSmo3AuhfsysYKxBNFFpezlIoFlG8DdADZfScYvv1oJpO1WVjK8PHTUj6+vpJWfhmUS0vn0Nu/rnDoyOmoXd0mnamQXH1+w9l69xAMhNGMGew5ta9B/5nLI0ppao6HXd0GJzbjVuafSLMVabQjDItg+OLTPQ0Gr41O2NVtsjmbjdiX6R3crS5PC9mMkEECbSfuNjTo7Dzc79Q98oUqyXSZaurl0A5XTU0NmaaJECZCGBjNx0Z2uN/PcX9sKleuycjc/CbLqzHUdg7QCCOENCyQAdAK7dsor0xl45mAXTEWSkS+LiRZWVnEq62h3C0QAmm0Icx2pBFCyABaK7SuA1Y/2LMC4PylsZlivScaj33HrXzDKX2+gxZ9SImUzSADKF/9DIXPTiAkWnto38k7+TcHTYB0qTOaSf/ArS5Ttxen8cuTAChQuw7m1rqGjUBHFHzQKgIgWiIXRptazz32amu4tTXcylwPsPln3jsVDA9orV3QPtqrfRBW772KcuIVt570lJtvVfX18F7NAKZ1fBbtd2vtOdKw+n4B6skL1gRzZQAAAAAASUVORK5CYII='
   : 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAwElEQVQ4jd3RMWpCQRSF4S/iBtyCELHW1sIV6ALiRnQH4hJ0ByF2Ym8aG1Ml8Ji3ArXRDZhUA+bx3qCWHjgw3Jn57+XcF1fq0JXQF7vUvYxw4bfKGWHO4mFA9AfLJCAjdOhG9+jPWVxDmrSSgLIGGz4jYMwEaslQCtqyLdbuAgwYxvOJM9SrHscRoUFjwLDFKwTy97Igb93CG6P4p3KCQF6sHdhPma1YJwGBvF22phLdFeKTAv6F+MP3gf2R462AP7hdbq8C1bDsAAAAAElFTkSuQmCC';
}
toggleImage();
Services.prefs.addObserver(zoomFull, toggleImage, false);
addDestructor(()=> Services.prefs.removeObserver(zoomFull, toggleImage) );
 


drage2 пишет:

Вот, что с ней не так? ПКМ - перескакивает как вздумается.

:/

Выделить код

Код:

// Настройка функций кликов мыши для кнопки ..............
this.onclick =e=> {

     // действие при клике ЛКМ ....
     if ( e.button == 0 ) FullZoom.enlarge();
          
     // действие при клике СКМ ....    
     if ( e.button == 1 ) cbu.setPrefs(s, !cbu.getPrefs(s));
     
     // действие при клике ПКМ ....    
     if ( e.button == 2 && !e.ctrlKey && !e.shiftKey && !e.altKey && !e.metaKey ) { 
          e.preventDefault();
          FullZoom.reduce();           
          }
};

07-03-2018 12:18:22
И кажется:

Выделить код

Код:

window.addEventListener("MozAfterPaint", evalcode, false);

и

Выделить код

Код:

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

там лишние.

bunda1
ОК! И меню убрать при ПКМ

Выделить код

Код:

// Настройка функций кликов мыши для кнопки ..............
this.onclick =e=> {

     // действие при клике ЛКМ ....
     if ( e.button == 0 ) FullZoom.enlarge();
          
     // действие при клике СКМ ....    
     if ( e.button == 1 ) cbu.setPrefs(s, !cbu.getPrefs(s));
     
     // действие при клике ПКМ ....    
     if ( e.button == 2 && !e.ctrlKey && !e.shiftKey && !e.altKey && !e.metaKey ) { 
             FullZoom.reduce();           
          }
};
this.oncontextmenu =e=> { e.button && !e.ctrlKey && e.preventDefault() };

59+ не отображается масштаб в адресной строке.

Мастер bunda1 почините кнопку на последней esr не работает.

На 66.03 код вроде бы как работает, но не запоминает настройки - единый масштаб, постоянно сбрасывает к 100%

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

Выделить код

Код:

// Кнопка для управления масштабом страницы в адресной строке. ..........................
(()=> {
   // Удалить из адресной строки FF51 стандартную кнопку масштаба ....
   var but = document.getElementById('urlbar-zoom-button');
   if (but) but.style.display = "none";
    
   // Создать в адресной строке кнопку масштаба ....
   var zoomButton = document.createElement("label");
   var urlbarIcons = document.getElementById("urlbar-icons") || document.getElementById("page-action-buttons"); // FF57
  // urlbarIcons.insertBefore(zoomButton, urlbarIcons.lastChild); // перед последней кнопкой адресной строки
  urlbarIcons.insertBefore(zoomButton, null);
  
   addDestructor(()=> zoomButton.remove());
      
   updateZoomButton(); 
   zoomButton.id = "zoomButton";
   zoomButton.setAttribute("context", "event.stopPropagation()");
   zoomButton.style.cssText = "-moz-appearance: none; border: 0; margin-right: -2px; margin-left: -1px;"; // Css стиль для кнопки масштаба   
   zoomButton.tooltipText = "Л: Менять масштаб страницы или только текста\n     Жирный - только текст\nС: Единый масштаб для всех страниц - Красный цвет\nП: Сбросить масштаб на 100% \nКолесиком: менять масштаб";
   
   
   // Показывать текущий масштаб страницы на кнопке и изменять цвет и шрифт отображения масштаба ....
   function updateZoomButton(e) {
      zoomButton.value = Math.round(ZoomManager.zoom*100) + "%"; 
       setTimeout(()=> {  
         zoomButton.style.fontWeight = ZoomManager.useFullZoom ? '' : 'bold';
         zoomButton.style.color = cbu.getPrefs("CB.zoom.allEvenly") ? "red" : "";
      }, 5);
      
      // запомнить текущий масштаб в 'about:config'
        if ( e == undefined ) { 
           try { window.clearTimeout(zoomButton.prefTimeout) } catch(e) {};
           zoomButton.prefTimeout = window.setTimeout(()=> {
              cbu.setPrefs("CB.zoom.Percent", ZoomManager.zoom.toFixed(2) )  
           }, 250);
           }   
   };
   
   
   // Отслеживать клики на кнопке масштаба ....           
   addEventListener("click", e=> {      
   
      if ( e.button == 0 ) ZoomManager.toggleZoom(); // переключить режим изминения масштаба
      
      if ( e.button == 1 ) { // единый масштаб для всех страниц
           cbu.isPref("CB.zoom.allEvenly", false);
           cbu.setPrefs("CB.zoom.allEvenly", !cbu.getPrefs("CB.zoom.allEvenly") );
           cbu.setPrefs("CB.zoom.Percent", ZoomManager.zoom.toFixed(2) );
           }

     if ( e.button == 2 ) FullZoom.reset(); // сбросить масштаб
               updateZoomButton(); 

   }, false, zoomButton);

         
   // Менять масштаб колесиком мыши на кнопке масштаба ....
   addEventListener("DOMMouseScroll", e=> {
      e.detail > 0 ? FullZoom.reduce() : FullZoom.enlarge();
   }, false, zoomButton);
           
 
   // Следим за изменением масштаба и запускаем обновление кнопки ....
   var hidden = Object.getOwnPropertyDescriptor(XULElement.prototype, "hidden");
    Object.defineProperty(but, "hidden", {
        configurable: true, enumerable: true, get: hidden.get.bind(but),
        set: val => {
            Components.stack.formattedStack.includes("LocationChange")
                || setTimeout(updateZoomButton, 50);
            return hidden.set.call(but, val);
        }
    });
    addDestructor(() => delete but.hidden);
   
    
   // Устанавливать единый масштаб для всех страниц если это разрешено в 'about:config' ....
   addEventListener("TabAttrModified", e=> {
      if ( e.target.linkedBrowser.currentURI.spec !== gBrowser.currentURI.spec ) return;
             
     // if ( cbu.getPrefs("CB.zoom.allEvenly") && content.location.protocol.startsWith("http") ) {
      if ( cbu.getPrefs("CB.zoom.allEvenly") ) {
           var value = cbu.getPrefs("CB.zoom.Percent");
           if ( ZoomManager.zoom.toFixed(2) == value ) return;

           setTimeout(()=> { 
              gBrowser.markupDocumentViewer[ZoomManager.useFullZoom ? 'fullZoom' : 'textZoom'] = value;
              updateZoomButton(e);   
           }, 0); 
           }      
      else 
           updateZoomButton(e);
                 
   }, true, gBrowser.tabContainer);   
})();  


Уважаемые bunda1, Dumby можете ли Вы починить для новых версий?