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

Юристы зарабатывают огромные деньги и славу, оперируя хорошим знанием законов. Правила форума — простой путь к успешному общению.

№2625-02-2016 08:28:01

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

Re: [CB]Proxy

voqabuhe пишет

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

А пример можно?

Отсутствует

 

№2725-02-2016 13:52:43

voqabuhe
Участник
 
Группа: Members
Зарегистрирован: 06-12-2011
Сообщений: 3231
UA: Firefox 47.0

Re: [CB]Proxy

bunda1 пишет

А пример можно?

Не понял, какой пример? Если где прокси брал, то хоть откуда не добавляются. Ну вот например №1, или Прокси Латвия (LV). Латвийские прокси. :)

Отредактировано voqabuhe (25-02-2016 13:53:07)

Отсутствует

 

№2825-02-2016 20:55:27

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

Re: [CB]Proxy

voqabuhe
Вот так вроде работает:

Выделить код

Код:

// Proxy, от 25.02.2016.


// Настройка функций кликов мыши для кнопки ...................
this.onmousedown =e=> {
   
   this.onmouseup =e=>{                  // левый клик
        if ( e.button ) return;
        clearTimeout(self.timer);           

        switch( cbu.getPrefs("network.proxy.type") ) {
           case 0:  var data = 1; break;            
           case 1:  var data = 2; break; 
           case 2:  var data = 0; break;
           default: var data = 0; 
        }
        cbu.setPrefs("network.proxy.type", data);  
   }

   if ( e.button == 0 )                  // длинный левый клик
        self.timer = setTimeout(()=>{     
           self.onmouseup = '';
           cbu.getPrefs("CB.Proxy.connectionsInTab") ? openConnectionsInTab() : openConnections();
        }, 500);
   
   if ( e.button == 2 )                  // правый клик
        menuPopup.showPopup(self, -1, -1, "popup", "bottomleft", "topleft");
};
self.onclick =e=> e.preventDefault();



// Подсказка для кнопки ...................
this.onmouseover =()=> {
   this.tooltipText = "Proxy \nЛ: Переключить прокси \nДЛ: Открыть настройки прокси"
                    + "\nП: Mеню кнопки \n\nТекущие настройки прокси: " 
                    + "\nIP: " + Services.prefs.getComplexValue("network.proxy.http", Ci.nsISupportsString).data
                    + "\nПорт: "+ cbu.getPrefs("network.proxy.http_port");                                                    
};



// Создать меню для кнопки ...................
var array = [
   { label: "Добавление прокси в контекстом меню", value: 'CB.Proxy.inContextMenu' },
   { label: "Открывать настройки прокси как вкладку", value: 'CB.Proxy.connectionsInTab' },
   { label: "Переключать на режим 'Без прокси' при закрытии браузера ", value: 'CB.Proxy.reset' }    
];

var menuPopup = document.getElementById('mainPopupSet').appendChild(document.createElement("menupopup"));
array.forEach((m)=> {
   var mItem = document.createElement("menuitem");
   mItem.setAttribute("label", m.label);
   mItem.setAttribute('type', 'checkbox');
   mItem.setAttribute('checked', cbu.getPrefs(m.value) );
   mItem.onclick =()=> cbu.setPrefs(m.value, !cbu.getPrefs(m.value));  
   menuPopup.appendChild(mItem);
});
addDestructor(()=> menuPopup.remove() );

// добавить стандартное контекстное меню 
menuPopup.appendChild(document.createElement("menuseparator"));
menuPopup.appendChild(document.createElement("menu")).setAttribute("label", "Меню кнопки");
var clone = menuPopup.lastChild.appendChild(document.getElementById("custombuttons-contextpopup").cloneNode(true));
clone.setAttribute("onpopupshowing", "document.popupNode = document.getElementById('" + _id + "')");



// Функция открывает настройки прокси в окне ...................
function openConnections() {
   for ( var win, nm = Services.wm.getEnumerator(null); win = nm.getNext(); ) 
         if ( win.name == 'Proxy') {
              win.focus();  
              break;
              }
   var win = openDialog("chrome://browser/content/preferences/connection.xul", "Proxy", "centerscreen");

   // добавить атрибут "prefwindow"
   win.addEventListener("load", function f(e) {
       this.removeEventListener("load", f, true); 
       e.target.documentElement.setAttribute("type", "prefwindow");
   }, true );
   
   // закрыть настройки прокси по клику на странице 
   gBrowser.addEventListener("click", function c() {
      this.removeEventListener("click", c );
      try { win.close() } catch(e) {}; 
   }, true );
};



// Функция открывает настройки прокси в вкладке ...................
function openConnectionsInTab() { 
   var connections = gBrowser.getBrowserForTab( gBrowser.selectedTab = gBrowser.addTab("chrome://browser/content/preferences/connection.xul") ); 
          
   // oбработчик ждет пока откроется прокси, удаляет себя и добавляет атрибут
   connections.addEventListener("pageshow", function c(e) {         
      this.removeEventListener(e.type, c);         
      e.originalTarget.documentElement.setAttribute("type", "prefwindow");
   })   
};



// Установливать нужную иконку кнопки при старте баузера или при изменениях в 'about:config' ...................
var s = "network.proxy.type";
function toggleImage() {
   var icon = self.ownerDocument.getAnonymousElementByAttribute(self, "class", "toolbarbutton-icon");
   switch( cbu.getPrefs(s) ) {
      case 0: icon.src = self.image; break;          
      case 1: icon.src = 'data:image/x-icon;base64,AAABAAEAEREAAAEAIADwBAAAFgAAACgAAAARAAAAIgAAAAEAIAAAAAAAyAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABAQAAAAAIAA4GQAAnFmkAHQ5fAAQAKAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEBAQECAgICAgICAgICAgMBAQEAAAQBJBFQOLQ+nX38ecev/mu6of8gfFvtAyUXewAAAAsAAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAEBAAAAAAMLUza7PKd//3S7oP2849X9zuvh/mW4mf4XiV7/AB4QZwAAAAAAAAAAAQEBAQAAAAAZGhgTKSwnLyYqJDErKCUnID8vXgaAUP9BlnH8b7ea/ojHrv+q2sf/a7CT+zGWbf8PakXGAAIAAAEBAQMHBwcbAAAAD2BiXn76/ff/4ebg/Onm4f+DtZ7/A31L/j2Wb/+Fwaj/ls23/7rh0v9+vaT+M5du/xKGWO0DIxIdAAAAAAEBAQEAAAABBgYFEaSmorbP08z239vX/4OwnP4ail3/RJlz/5HHsP/T7+X/ms64/3K2mP40k2r/D3tM7AUiExwhIx8meXt1mXt+eKJ3eXSce353n6esouDMysf/o7eq/kOdeP92uZv/vuPT/9Hs4P/C4tT/eLWa+juWbv8bcEq7AAYBAF1gWn7//////f39/P//////////////////////////lcKx/3i9pf/K7OD/2O/l/7ndzf6Fw6n/VK+I/AsxHj8AAAAAXF5bf+Ln2P+AnU/4fZ1N+4WiV/yKp13+jKlh/5CsZf+GpFj/Zpxh/4C5nf+i0L7+k8ex/1udf+UTOCZFAAAAAAEBAQJfYF5/3uXR/16IIPxciiH/Z5Iv/26YOP9ymz3/cpw+/3OcPf9wlzb/YI80/1mKNPu707X/YmZjiAAAAAAEBAQGAAAAAF9gXoDg5tT/cJU6/HGaPf9/pE3/hqtX/4uvXf+NsF7/iKxZ/4KoU/9+o0r/cpY6+9zjyf9ubm2JAAAAAAMEAwQAAAAAX2BegODm1P94nEX8e6JJ/4quXP+Vt2n/nb1z/6LBef+jwXz/ob96/527d/+NrGP71+HG/2praogAAAAABAQDBAAAAABfYF2A4ObU/4WlVvyPsmP/osB7/7HMj/+81J3/wdik/8DXo/+60pz/tc6X/6G6ffvY4sf/amtqiAAAAAAEBAMEAAAAAF9gXn/e5dL/n7l7/LLMk//B16X/zuG2/9jpwv/b68b/2enE/9Pkvv/Q4bv/uMud+9jhyP9qa2mHAAAAAAQEAwQAAAAAX2Bef97k0v+gt335sceT/LrNnfzC1Kj8ydmx/MzatfzK2bP8xtav/MbVr/ywwpL41+HH/2tsaokAAAAABAQDBAAAAABZW1Z3+fz1/+Dm1Pzj6db/5u3b/+nv3v/r8eD/6vDe/+ft2//k69j/4efT/9ngzPv7//b/ZGdhfwAAAAADBAMEAAAAABcZFRpZW1Z6YGFfgWBiYIBhYmGAYmJhgGJjYoBiY2KAYmJhgGFiYYBgYWCAX2BegF1fWoAbHRkeAAAAAAEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA='; break;
      case 2: icon.src = 'data:image/x-icon;base64,AAABAAEAEREAAAEAIADwBAAAFgAAACgAAAARAAAAIgAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABAQAAAAAIAAcHQAAYGGkAEBBfAAEBKAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAQEAAgICAAICAgACAgMBAQEAAAEBJAA6OrQAf3/8ALCw/gCiov8AXl7tABkZewAAAAsAAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAEBAAAAAAMAOTm7AIOD/wCjo/0A1tb9AOHh/gCcnP4AY2P/ABISZwAAAAAAAAAAAAEBAQAAAAAAGBgTACgoLwAmJjEAJiYnADIyXgBWVv8Adnb8AJ2d/gCxsf8Aycn/AJeX+wBycv8ASkrGAAACAAABAQMABwcbAAAADwBfX34A+fn/AOHh/ADj4/8AoaH/AFJS/gB1df8Aq6v/ALm5/wDT0/8Ap6f+AHNz/wBeXu0AFRUdAAAAAAABAQEAAAABAAUFEQCjo7YAzs72ANnZ/wCfn/4AY2P/AHl5/wCzs/8A5ub/ALu7/wCcnP4AcHD/AFNT7AAVFRwAICAmAHd3mQB6eqIAdXWcAHl5nwClpeAAyMj/AK2t/gB9ff8An5//ANXV/wDh4f8A1tb/AJ6e+gB0dP8AUFC7AAEGAABcXH4A////AP39/AD///8A////AP///wD///8A////ALOz/wCnp/8A4eH/AObm/wDPz/4ArKz/AI2N/AAhIT8AAAAAAFxcfwDd3f8Aa2v4AGpq+wBycvwAeHj+AHt7/wB/f/8Ac3P/AHNz/wCiov8AwMD+ALS0/wCEhOUAKSlFAAAAAAABAQIAXl5/ANjY/wBGRvwARkb/AFJS/wBaWv8AX1//AF9f/wBfX/8AWVn/AFRU/wBRUfsAvr7/AGNjiAAAAAAABAQGAAAAAABeXoAA2tr/AFtb/ABeXv8AbGz/AHV1/wB6ev8Ae3v/AHd3/wBxcf8Aamr/AFtb+wDS0v8AbW2JAAAAAAADAwQAAAAAAF5egADa2v8AZGT8AGlp/wB5ef8AhYX/AI2N/wCTk/8AlJT/AJKS/wCPj/8AfX37AM/P/wBqaogAAAAAAAMDBAAAAAAAXl6AANra/wBycvwAf3//AJOT/wClpf8AsLD/ALa2/wC1tf8Ar6//AKqq/wCTk/sA0ND/AGpqiAAAAAAAAwMEAAAAAABeXn8A2dn/AJGR/ACnp/8At7f/AMXF/wDQ0P8A09P/ANHR/wDLy/8AyMj/AK2t+wDR0f8AaWmHAAAAAAADAwQAAAAAAF5efwDY2P8AkpL5AKWl/ACurvwAuLj8AL+//ADCwvwAwMD8AL29/AC8vPwAo6P4ANDQ/wBqaokAAAAAAAMDBAAAAAAAV1d3APf3/wDa2vwA3d3/AOHh/wDk5P8A5ub/AOTk/wDh4f8A39//ANra/wDT0/sA+fn/AGNjfwAAAAAAAwMEAAAAAAAWFhoAV1d6AF9fgQBgYIAAYWGAAGFhgABiYoAAYmKAAGFhgABhYYAAYGCAAF5egABbW4AAGhoeAAAAAAABAQEAAAAA/oOAQeEAgEH6AIBBoACAQQAAAEGAAABBAACAQQAAgEEAAQBBAAKAQQACgEEAAoBBAAKAQQACgEEAAoBBAAKAQQACgEE='; break;
      default:icon.src = self.image; 
   }
};  
toggleImage();
gPrefService.addObserver(s, toggleImage, false);
addDestructor(()=> gPrefService.removeObserver(s, toggleImage) );



// Переключать на режим 'Без прокси' при закрытии браузера если это разрешено в 'about:config' ...................
var switchOffProxy = {
    observe: function(subject, topic, data) {
       if ( data == "shutdown" && cbu.getPrefs("CB.Proxy.reset") ) cbu.setPrefs("network.proxy.type", 0);  
    }
};
Services.obs.addObserver(switchOffProxy, "quit-application", false);



// Создаем меню для добавление прокси в контекстном меню выделенного текста на странице ...................
((contextMenu)=> {

  // создать новый пункт меню
  var menuitem = contextMenu.appendChild( document.createElement("menuitem") );      
  menuitem.setAttribute("label", "Добавить прокси"); 
  menuitem.setAttribute("class", "menuitem-iconic");
  menuitem.setAttribute("image", self.image);
  menuitem.onclick =()=> addNewProxy();
  addDestructor(()=> menuitem.remove() );
  
  // устанавливаем где показывать пункт меню 
  addEventListener("popupshowing", ()=>{
     menuitem.hidden = !cbu.getPrefs("CB.Proxy.inContextMenu") || !gContextMenu.isContentSelected; // !gContextMenu.isTextSelected;
  }, false, contextMenu);
  
  
  // добавление прокси
  function addNewProxy(sel) {  
     var selection = document.commandDispatcher.focusedWindow.getSelection().toString();
     var sel = ( sel == undefined ) ? selection : sel.toString();
     sel = sel.replace(/^\s+|\s+$/g, ""); // удалить пробелы, слева и справа от строки
     sel = sel.replace(/\s+/g,":"); // заменить пробелы внутри строки

     // если только порт ...
     if ( sel.length < 6 && isFinite(sel) ) { 
          sel = sel.replace(/:/g, "");
          var lab = 'порт';
          cbu.setPrefs("network.proxy.http_port", +sel);                    
          }
     
     // если только адрес ...
     if ( sel.length > 5 && !/:/.test(sel) && sel.split(".").length == 4 ) {   
          var lab = 'адрес';
          cbu.setPrefs("network.proxy.http", convertFromUnicode("UTF-8", sel));  
          }   
     
     // если адрес и порт ...    
     if ( sel.length > 5 && /:/.test(sel) && sel.split(":").length == 2 && sel.split(".").length == 4 ) {
          var lab = 'адрес и порт';
          var array = sel.split(":");  
          array.forEach((str)=> addNewProxy(str) );          
          }     

     if ( lab == undefined ) return;

     // всплывающая подсказка рядом с выделенным текстом ...     
     function showTooltip() {
        var tooltip = gBrowser.appendChild( document.createElement("tooltip") );
        tooltip.style.cssText = "color: red !important; font-weight: bold !important; font-size: 14px !important; -moz-box-orient: horizontal; text-align: center;";
   
        var image = tooltip.appendChild( document.createElement("image") );
        image.setAttribute("src", self.image);
   
        var label = tooltip.appendChild( document.createElement("label"));
        label.setAttribute("value", "Установлен " + lab + " прокси: " + sel);
    
        var focused = document.commandDispatcher.focusedWindow;
        var selection = focused.getSelection().getRangeAt(0).getBoundingClientRect();
        var posX = focused.mozInnerScreenX + selection.left;
        var posY = focused.mozInnerScreenY + selection.bottom - 5;   

        tooltip.showPopup(gBrowser, posX, posY);
        setTimeout(()=> gBrowser.removeChild(tooltip), 3000);
     };
     showTooltip();    
  };
   
})(document.getElementById("contentAreaContextMenu"));

А за Латвийские прокси спасибо, не знал что такие есть :)

Отсутствует

 

№2926-02-2016 00:21:40

voqabuhe
Участник
 
Группа: Members
Зарегистрирован: 06-12-2011
Сообщений: 3231
UA: Firefox 47.0

Re: [CB]Proxy

bunda1 пишет

Вот так вроде работает:

Ага, теперь всё как надо. Спасибо большое.

bunda1 пишет

А за Латвийские прокси спасибо, не знал что такие есть :)

yes.gif[email][/email]

Отсутствует

 

№3004-03-2016 12:19:40

vv07
Участник
 
Группа: Members
Зарегистрирован: 07-11-2007
Сообщений: 672
UA: Firefox 38.0

Re: [CB]Proxy

Спасибо bunda1 за хорошую кнопку. Не знаю возможно ли реализовать, но неплохо бы иметь вариант включения URL автоматической настройки, через клик по кнопке(ПКМ). Что бы не залезать каждый раз в настройки.

Отсутствует

 

№3104-03-2016 13:52:24

voqabuhe
Участник
 
Группа: Members
Зарегистрирован: 06-12-2011
Сообщений: 3231
UA: Firefox 47.0

Re: [CB]Proxy

vv07 пишет

но неплохо бы иметь вариант включения URL автоматической настройки, через клик по кнопке(ПКМ). Что бы не залезать каждый раз в настройки.

В теме всего две страницы, их трудно сначало прочитать, а потом просить? :dumb:

Отсутствует

 

№3204-03-2016 14:05:03

vv07
Участник
 
Группа: Members
Зарегистрирован: 07-11-2007
Сообщений: 672
UA: Firefox 38.0

Re: [CB]Proxy

voqabuhe
Прочитал, поэтому и спросил. Решения так и не увидел,кроме вашей переписки. Последний приведенный код не работает увы.
Кнопка не отключает прокси, при выходе из браузера.

Отредактировано vv07 (04-03-2016 14:08:24)

Отсутствует

 

№3304-03-2016 14:32:55

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

Re: [CB]Proxy

vv07 пишет

Кнопка не отключает прокси, при выходе из браузера.

Отключает прокси при выходе из браузера: 25-02-2016 20:55:27, я проверил. И URL автоматической настройки можно включить по ЛКМ - иконка будет жёлтой.

Отсутствует

 

№3404-03-2016 14:59:49

vv07
Участник
 
Группа: Members
Зарегистрирован: 07-11-2007
Сообщений: 672
UA: Firefox 38.0

Re: [CB]Proxy

bunda1 пишет

vv07 пишет: Кнопка не отключает прокси, при выходе из браузера.Отключает прокси при выходе из браузера: 25-02-2016 20:55:27, я проверил. И URL автоматической настройки можно включить по ЛКМ - иконка будет жёлтой.

FF 38.6 Снова попробовал дважды. Значек остается зеленым.

Отсутствует

 

№3504-03-2016 15:03:06

voqabuhe
Участник
 
Группа: Members
Зарегистрирован: 06-12-2011
Сообщений: 3231
UA: Firefox 47.0

Re: [CB]Proxy

vv07 пишет

Последний приведенный код не работает увы.

Дык ты так тогда и пиши, что она у тебя не работает.

Отсутствует

 

№3604-03-2016 18:35:15

Ultima2m
Участник
 
Группа: Members
Откуда: Россия
Зарегистрирован: 28-11-2013
Сообщений: 592
UA: Firefox 44.0

Re: [CB]Proxy

vv07 прав частично.
По основному функционалу кнопка работает.
Но "переключать на режим *без прокси* при закрытии" не работает в случае перезагрузки браузера.
В принципе, можно оставить так и просто иметь это ввиду.
Или добавить функционал и для перезагрузки.

Отредактировано Ultima2m (04-03-2016 18:36:18)

Отсутствует

 

№3704-03-2016 19:15:04

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

Re: [CB]Proxy

Ultima2m пишет

Но "переключать на режим *без прокси* при закрытии" не работает в случае перезагрузки браузера.

Ну так и задумано, перезагрузка и закрытие не одно и то.

Отсутствует

 

№3805-03-2016 04:09:13

vv07
Участник
 
Группа: Members
Зарегистрирован: 07-11-2007
Сообщений: 672
UA: Firefox 38.0

Re: [CB]Proxy

bunda1 Все отлично. Я только благодарен вам. Пусть будет так.

Отсутствует

 

№3902-06-2016 16:09:26

citehala
Участник
 
Группа: Members
Зарегистрирован: 07-05-2015
Сообщений: 63
UA: Firefox 46.0

Re: [CB]Proxy

Спасибо, это супер-кнопка !
Я Вам человечьи иконки принёс и менюшки чуть поправил.. :whistle:

Внешний вид
Bezymyannyj.1464871825.png

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

Выделить код

Код:

// Proxy, от 25.02.2016.


// Настройка функций кликов мыши для кнопки ...................
this.onmousedown =e=> {
   
   this.onmouseup =e=>{                  // левый клик
        if ( e.button ) return;
        clearTimeout(self.timer);           

        switch( cbu.getPrefs("network.proxy.type") ) {
           case 0:  var data = 1; break;            
           case 1:  var data = 2; break; 
           case 2:  var data = 0; break;
           default: var data = 0; 
        }
        cbu.setPrefs("network.proxy.type", data);  
   }

   if ( e.button == 0 )                  // длинный левый клик
        self.timer = setTimeout(()=>{     
           self.onmouseup = '';
           cbu.getPrefs("CB.Proxy.connectionsInTab") ? openConnectionsInTab() : openConnections();
        }, 500);
   
   if ( e.button == 2 )                  // правый клик
        menuPopup.showPopup(self, -1, -1, "popup", "bottomleft", "topleft");
};
self.onclick =e=> e.preventDefault();



// Подсказка для кнопки ...................
this.onmouseover =()=> {
   this.tooltipText = "Proxy"
+"\n● Без прокси"
+"\n● Ручная настройка"
+"\n● Автоматическая через URL\n"
+ "\nЛ: Переключить режим \nДЛ: Открыть настройки прокси"
+ "\nП: Mеню кнопки \n\nТекущие настройки прокси: " 
+ "\nIP: " + Services.prefs.getComplexValue("network.proxy.http", Ci.nsISupportsString).data
+ "\nПорт: "+ cbu.getPrefs("network.proxy.http_port");                                                    
};



// Создать меню для кнопки ...................
var array = [
   { label: "Добавление прокси через контекстное меню", value: 'CB.Proxy.inContextMenu' },
   { label: "Открывать настройки прокси как вкладку", value: 'CB.Proxy.connectionsInTab' },
   { label: "Переключать на режим 'Без прокси' при закрытии браузера ", value: 'CB.Proxy.reset' }    
];

var menuPopup = document.getElementById('mainPopupSet').appendChild(document.createElement("menupopup"));
array.forEach((m)=> {
   var mItem = document.createElement("menuitem");
   mItem.setAttribute("label", m.label);
   mItem.setAttribute('type', 'checkbox');
   mItem.setAttribute('checked', cbu.getPrefs(m.value) );
   mItem.onclick =()=> cbu.setPrefs(m.value, !cbu.getPrefs(m.value));  
   menuPopup.appendChild(mItem);
});
addDestructor(()=> menuPopup.remove() );

// добавить стандартное контекстное меню 
menuPopup.appendChild(document.createElement("menuseparator"));
menuPopup.appendChild(document.createElement("menu")).setAttribute("label", "Меню кнопки");
var clone = menuPopup.lastChild.appendChild(document.getElementById("custombuttons-contextpopup").cloneNode(true));
clone.setAttribute("onpopupshowing", "document.popupNode = document.getElementById('" + _id + "')");



// Функция открывает настройки прокси в окне ...................
function openConnections() {
   for ( var win, nm = Services.wm.getEnumerator(null); win = nm.getNext(); ) 
         if ( win.name == 'Proxy') {
              win.focus();  
              break;
              }
   var win = openDialog("chrome://browser/content/preferences/connection.xul", "Proxy", "centerscreen");

   // добавить атрибут "prefwindow"
   win.addEventListener("load", function f(e) {
       this.removeEventListener("load", f, true); 
       e.target.documentElement.setAttribute("type", "prefwindow");
   }, true );
   
   // закрыть настройки прокси по клику на странице 
   gBrowser.addEventListener("click", function c() {
      this.removeEventListener("click", c );
      try { win.close() } catch(e) {}; 
   }, true );
};



// Функция открывает настройки прокси в вкладке ...................
function openConnectionsInTab() { 
   var connections = gBrowser.getBrowserForTab( gBrowser.selectedTab = gBrowser.addTab("chrome://browser/content/preferences/connection.xul") ); 
          
   // oбработчик ждет пока откроется прокси, удаляет себя и добавляет атрибут
   connections.addEventListener("pageshow", function c(e) {         
      this.removeEventListener(e.type, c);         
      e.originalTarget.documentElement.setAttribute("type", "prefwindow");
   })   
};



// Установливать нужную иконку кнопки при старте баузера или при изменениях в 'about:config' ...................
var s = "network.proxy.type";
function toggleImage() {
   var icon = self.ownerDocument.getAnonymousElementByAttribute(self, "class", "toolbarbutton-icon");
   switch( cbu.getPrefs(s) ) {
      case 0: icon.src = self.image; break;          
      case 1: icon.src = 'data:image/png;base64,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'; break;
      case 2: icon.src = 'data:image/png;base64,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'; break;
      default:icon.src = self.image; 
   }
};  
toggleImage();
gPrefService.addObserver(s, toggleImage, false);
addDestructor(()=> gPrefService.removeObserver(s, toggleImage) );



// Переключать на режим 'Без прокси' при закрытии браузера если это разрешено в 'about:config' ...................
var switchOffProxy = {
    observe: function(subject, topic, data) {
       if ( data == "shutdown" && cbu.getPrefs("CB.Proxy.reset") ) cbu.setPrefs("network.proxy.type", 0);  
    }
};
Services.obs.addObserver(switchOffProxy, "quit-application", false);



// Создаем меню для добавление прокси в контекстном меню выделенного текста на странице ...................
((contextMenu)=> {

  // создать новый пункт меню
  var menuitem = contextMenu.appendChild( document.createElement("menuitem") );      
  menuitem.setAttribute("label", "Добавить прокси"); 
  menuitem.setAttribute("class", "menuitem-iconic");
  menuitem.setAttribute("image", self.image);
  menuitem.onclick =()=> addNewProxy();
  addDestructor(()=> menuitem.remove() );
  
  // устанавливаем где показывать пункт меню 
  addEventListener("popupshowing", ()=>{
     menuitem.hidden = !cbu.getPrefs("CB.Proxy.inContextMenu") || !gContextMenu.isContentSelected; // !gContextMenu.isTextSelected;
  }, false, contextMenu);
  
  
  // добавление прокси
  function addNewProxy(sel) {  
     var selection = document.commandDispatcher.focusedWindow.getSelection().toString();
     var sel = ( sel == undefined ) ? selection : sel.toString();
     sel = sel.replace(/^\s+|\s+$/g, ""); // удалить пробелы, слева и справа от строки
     sel = sel.replace(/\s+/g,":"); // заменить пробелы внутри строки

     // если только порт ...
     if ( sel.length < 6 && isFinite(sel) ) { 
          sel = sel.replace(/:/g, "");
          var lab = 'порт';
          cbu.setPrefs("network.proxy.http_port", +sel);                    
          }
     
     // если только адрес ...
     if ( sel.length > 5 && !/:/.test(sel) && sel.split(".").length == 4 ) {   
          var lab = 'адрес';
          cbu.setPrefs("network.proxy.http", convertFromUnicode("UTF-8", sel));  
          }   
     
     // если адрес и порт ...    
     if ( sel.length > 5 && /:/.test(sel) && sel.split(":").length == 2 && sel.split(".").length == 4 ) {
          var lab = 'адрес и порт';
          var array = sel.split(":");  
          array.forEach((str)=> addNewProxy(str) );          
          }     

     if ( lab == undefined ) return;

     // всплывающая подсказка рядом с выделенным текстом ...     
     function showTooltip() {
        var tooltip = gBrowser.appendChild( document.createElement("tooltip") );
        tooltip.style.cssText = "color: red !important; font-weight: bold !important; font-size: 14px !important; -moz-box-orient: horizontal; text-align: center;";
   
        var image = tooltip.appendChild( document.createElement("image") );
        image.setAttribute("src", self.image);
   
        var label = tooltip.appendChild( document.createElement("label"));
        label.setAttribute("value", "Установлен " + lab + " прокси: " + sel);
    
        var focused = document.commandDispatcher.focusedWindow;
        var selection = focused.getSelection().getRangeAt(0).getBoundingClientRect();
        var posX = focused.mozInnerScreenX + selection.left;
        var posY = focused.mozInnerScreenY + selection.bottom - 5;   

        tooltip.showPopup(gBrowser, posX, posY);
        setTimeout(()=> gBrowser.removeChild(tooltip), 3000);
     };
     showTooltip();    
  };
   
})(document.getElementById("contentAreaContextMenu"));


Подскажите пожалуйста насчёт иконок, какого размера их лучше делать ? Пробовал 16х16 это ппц, 32х32 как будто кто откусывает кусочек, остановился на 64х64..
Может есть какой мануал по СВ ?

Отсутствует

 

№4020-08-2016 00:05:46

broker
Участник
 
Группа: Members
Зарегистрирован: 23-06-2015
Сообщений: 103
UA: unknown 0.0

Re: [CB]Proxy

Посмотрите, не работает открыть настройки прокси если ДЛ [firefox]48 или ето у меня так.

Отсутствует

 

№4120-08-2016 17:00:54

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

Re: [CB]Proxy

broker пишет

Посмотрите, не работает открыть настройки прокси если ДЛ [firefox]48 или ето у меня так.

Действително на Firefox48 появился такой глюк. Вот вроде исправил: Proxy

Отсутствует

 

№4220-08-2016 17:07:53

voqabuhe
Участник
 
Группа: Members
Зарегистрирован: 06-12-2011
Сообщений: 3231
UA: Firefox 51.0

Re: [CB]Proxy

bunda1
А в [nightly] открывает. :)

Отсутствует

 

№4320-08-2016 17:23:55

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

Re: [CB]Proxy

voqabuhe пишет

bunda1
А в [nightly] открывает. :)

Нет, в [nightly] настройки прокси в окне старая версия кнопки тоже не открывет.

Отсутствует

 

№4420-08-2016 18:47:01

Ultima2m
Участник
 
Группа: Members
Откуда: Россия
Зарегистрирован: 28-11-2013
Сообщений: 592
UA: Firefox 48.0

Re: [CB]Proxy

У меня в обновленной кнопке не включается режим "url авт. настройки" А старая работает нормально

Отсутствует

 

№4520-08-2016 18:58:39

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

Re: [CB]Proxy

Ultima2m пишет

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

А как ты включаешь режим "url авт. настройки"?

Отсутствует

 

№4620-08-2016 20:36:55

voqabuhe
Участник
 
Группа: Members
Зарегистрирован: 06-12-2011
Сообщений: 3231
UA: Firefox 51.0

Re: [CB]Proxy

bunda1 пишет

Нет, в [nightly] настройки прокси в окне старая версия кнопки тоже не открывет.

Но у меня открывает, кнопку не обновлял, установлена версия Proxy, от 25.02.2016.

Отсутствует

 

№4720-08-2016 22:01:46

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

Re: [CB]Proxy

voqabuhe пишет
bunda1 пишет

Нет, в [nightly] настройки прокси в окне старая версия кнопки тоже не открывет.

Но у меня открывает, кнопку не обновлял, установлена версия Proxy, от 25.02.2016.

Настройки прокси в окошке а не в вкладке?

Отсутствует

 

№4821-08-2016 00:52:49

voqabuhe
Участник
 
Группа: Members
Зарегистрирован: 06-12-2011
Сообщений: 3231
UA: Firefox 51.0

Re: [CB]Proxy

bunda1 пишет

Настройки прокси в окошке а не в вкладке?

Да.

Отсутствует

 

№4921-08-2016 04:37:35

Ultima2m
Участник
 
Группа: Members
Откуда: Россия
Зарегистрирован: 28-11-2013
Сообщений: 592
UA: Firefox 48.0

Re: [CB]Proxy

bunda1 пишет

А как ты включаешь режим "url авт. настройки"?

Там последовательный перебор - 3 положения.
кнопка

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

Выделить код

Код:

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%3EProxy%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/x-icon%3Bbase64%2CAAABAAEAEREAAAEAIADwBAAAFgAAACgAAAARAAAAIgAAAAEAIAAAAAAAyAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABAQAAAAAIAAYOQAAWJ2kADh1fAAAEKAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAEBAQECAgICAgICAgICAgMBAQEAAAEEJBE4ULQ+fZ38ea/H/muhuv8gW3ztAxclewAAAAsAAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAEBAAAAAAMLNlO7PH+n/3Sgu/281eP9zuHr/mWZuP4XXon/ABAeZwAAAAAAAAAAAQEBAQAAAAAZGBoTKScsLyYkKjErJSgnIC8/XgZQgP9BcZb8b5q3/oiux/+qx9r/a5Ow+zFtlv8PRWrGAAACAAEBAQMHBwcbAAAAD2BeYn769/3/4eDm/Onh5v+DnrX/A0t9/j1vlv+FqMH/lrfN/7rS4f9+pL3+M26X/xJYhu0DEiMdAAAAAAEBAQEAAAABBgUGEaSiprbPzNP239fb/4OcsP4aXYr/RHOZ/5Gwx//T5e//mrjO/3KYtv40apP/D0x77AUTIhwhHyMmeXV7mXt4fqJ3dHmce3d+n6eirODMx8r/o6q3/kN4nf92m7n/vtPj/9Hg7P/C1OL/eJq1+jtulv8bSnC7AAEGAF1aYH7//////f39/P//////////////////////////lbHC/3ilvf/K4Oz/2OXv/7nN3f6FqcP/VIiv/AseMT8AAAAAXFtef+LY5/+AT534fU2d+4VXovyKXaf+jGGp/5BlrP+GWKT/ZmGc/4Cduf+ivtD+k7HH/1t/neUTJjhFAAAAAAEBAQJfXmB/3tHl/14giPxcIYr/Zy+S/244mP9yPZv/cj6c/3M9nP9wNpf/YDSP/1k0ivu7tdP/YmNmiAAAAAAEBAQGAAAAAF9eYIDg1Ob/cDqV/HE9mv9/TaT/hler/4tdr/+NXrD/iFms/4JTqP9+SqP/cjqW+9zJ4/9ubW6JAAAAAAMDBAQAAAAAX15ggODU5v94RZz8e0mi/4pcrv+Vabf/nXO9/6J5wf+jfMH/oXq//513u/+NY6z718bh/2pqa4gAAAAABAMEBAAAAABfXWCA4NTm/4VWpfyPY7L/onvA/7GPzP+8ndT/waTY/8Cj1/+6nNL/tZfO/6F9uvvYx+L/ampriAAAAAAEAwQEAAAAAF9eYH/e0uX/n3u5/LKTzP/Bpdf/zrbh/9jC6f/bxuv/2cTp/9O+5P/Qu+H/uJ3L+9jI4f9qaWuHAAAAAAQDBAQAAAAAX15gf97S5P+gfbf5sZPH/LqdzfzCqNT8ybHZ/My12vzKs9n8xq/W/Mav1fywksL418fh/2tqbIkAAAAABAMEBAAAAABZVlt3+fX8/+DU5vzj1un/5tvt/+ne7//r4PH/6t7w/+fb7f/k2Ov/4dPn/9nM4Pv79v//ZGFnfwAAAAADAwQEAAAAABcVGRpZVlt6YF9hgWBgYoBhYWKAYmFigGJiY4BiYmOAYmFigGFhYoBgYGGAX15ggF1aX4AbGR0eAAAAAAEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B//%20Proxy%2C%20%u043E%u0442%2025.02.2016.%0A%0A%0A//%20%u041D%u0430%u0441%u0442%u0440%u043E%u0439%u043A%u0430%20%u0444%u0443%u043D%u043A%u0446%u0438%u0439%20%u043A%u043B%u0438%u043A%u043E%u0432%20%u043C%u044B%u0448%u0438%20%u0434%u043B%u044F%20%u043A%u043D%u043E%u043F%u043A%u0438%20...................%0Athis.onmousedown%20%3De%3D%3E%20%7B%0A%20%20%20%0A%20%20%20this.onmouseup%20%3De%3D%3E%7B%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20%u043B%u0435%u0432%u044B%u0439%20%u043A%u043B%u0438%u043A%0A%20%20%20%20%20%20%20%20if%20%28%20e.button%20%29%20return%3B%0A%20%20%20%20%20%20%20%20clearTimeout%28self.timer%29%3B%20%20%20%20%20%20%20%20%20%20%20%0A%0A%20%20%20%20%20%20%20%20switch%28%20cbu.getPrefs%28%22network.proxy.type%22%29%20%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20case%200%3A%20%20var%20data%20%3D%201%3B%20break%3B%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20case%201%3A%20%20var%20data%20%3D%202%3B%20break%3B%20%0A%20%20%20%20%20%20%20%20%20%20%20case%202%3A%20%20var%20data%20%3D%200%3B%20break%3B%0A%20%20%20%20%20%20%20%20%20%20%20default%3A%20var%20data%20%3D%200%3B%20%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20cbu.setPrefs%28%22network.proxy.type%22%2C%20data%29%3B%20%20%0A%20%20%20%7D%0A%0A%20%20%20if%20%28%20e.button%20%3D%3D%200%20%29%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20%u0434%u043B%u0438%u043D%u043D%u044B%u0439%20%u043B%u0435%u0432%u044B%u0439%20%u043A%u043B%u0438%u043A%0A%20%20%20%20%20%20%20%20self.timer%20%3D%20setTimeout%28%28%29%3D%3E%7B%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20self.onmouseup%20%3D%20%27%27%3B%0A%20%20%20%20%20%20%20%20%20%20%20cbu.getPrefs%28%22CB.Proxy.connectionsInTab%22%29%20%3F%20openConnectionsInTab%28%29%20%3A%20openConnections%28%29%3B%0A%20%20%20%20%20%20%20%20%7D%2C%20500%29%3B%0A%20%20%20%0A%20%20%20if%20%28%20e.button%20%3D%3D%202%20%29%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20%u043F%u0440%u0430%u0432%u044B%u0439%20%u043A%u043B%u0438%u043A%0A%20%20%20%20%20%20%20%20menuPopup.showPopup%28self%2C%20-1%2C%20-1%2C%20%22popup%22%2C%20%22bottomleft%22%2C%20%22topleft%22%29%3B%0A%7D%3B%0Aself.onclick%20%3De%3D%3E%20e.preventDefault%28%29%3B%0A%0A%0A%0A//%20%u041F%u043E%u0434%u0441%u043A%u0430%u0437%u043A%u0430%20%u0434%u043B%u044F%20%u043A%u043D%u043E%u043F%u043A%u0438%20...................%0Athis.onmouseover%20%3D%28%29%3D%3E%20%7B%0A%20%20%20this.tooltipText%20%3D%20%22Proxy%20%5Cn%u041B%3A%20%u041F%u0435%u0440%u0435%u043A%u043B%u044E%u0447%u0438%u0442%u044C%20%u043F%u0440%u043E%u043A%u0441%u0438%20%5Cn%u0414%u041B%3A%20%u041E%u0442%u043A%u0440%u044B%u0442%u044C%20%u043D%u0430%u0441%u0442%u0440%u043E%u0439%u043A%u0438%20%u043F%u0440%u043E%u043A%u0441%u0438%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20+%20%22%5Cn%u041F%3A%20M%u0435%u043D%u044E%20%u043A%u043D%u043E%u043F%u043A%u0438%20%5Cn%5Cn%u0422%u0435%u043A%u0443%u0449%u0438%u0435%20%u043D%u0430%u0441%u0442%u0440%u043E%u0439%u043A%u0438%20%u043F%u0440%u043E%u043A%u0441%u0438%3A%20%22%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20+%20%22%5CnIP%3A%20%22%20+%20Services.prefs.getComplexValue%28%22network.proxy.http%22%2C%20Ci.nsISupportsString%29.data%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20+%20%22%5Cn%u041F%u043E%u0440%u0442%3A%20%22+%20cbu.getPrefs%28%22network.proxy.http_port%22%29%3B%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%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%7D%3B%0A%0A%0A%0A//%20%u0421%u043E%u0437%u0434%u0430%u0442%u044C%20%u043C%u0435%u043D%u044E%20%u0434%u043B%u044F%20%u043A%u043D%u043E%u043F%u043A%u0438%20...................%0Avar%20array%20%3D%20%5B%0A%20%20%20%7B%20label%3A%20%22%u0414%u043E%u0431%u0430%u0432%u043B%u0435%u043D%u0438%u0435%20%u043F%u0440%u043E%u043A%u0441%u0438%20%u0432%20%u043A%u043E%u043D%u0442%u0435%u043A%u0441%u0442%u043E%u043C%20%u043C%u0435%u043D%u044E%22%2C%20value%3A%20%27CB.Proxy.inContextMenu%27%20%7D%2C%0A%20%20%20%7B%20label%3A%20%22%u041E%u0442%u043A%u0440%u044B%u0432%u0430%u0442%u044C%20%u043D%u0430%u0441%u0442%u0440%u043E%u0439%u043A%u0438%20%u043F%u0440%u043E%u043A%u0441%u0438%20%u043A%u0430%u043A%20%u0432%u043A%u043B%u0430%u0434%u043A%u0443%22%2C%20value%3A%20%27CB.Proxy.connectionsInTab%27%20%7D%2C%0A%20%20%20%7B%20label%3A%20%22%u041F%u0435%u0440%u0435%u043A%u043B%u044E%u0447%u0430%u0442%u044C%20%u043D%u0430%20%u0440%u0435%u0436%u0438%u043C%20%27%u0411%u0435%u0437%20%u043F%u0440%u043E%u043A%u0441%u0438%27%20%u043F%u0440%u0438%20%u0437%u0430%u043A%u0440%u044B%u0442%u0438%u0438%20%u0431%u0440%u0430%u0443%u0437%u0435%u0440%u0430%20%22%2C%20value%3A%20%27CB.Proxy.reset%27%20%7D%20%20%20%20%0A%5D%3B%0A%0Avar%20menuPopup%20%3D%20document.getElementById%28%27mainPopupSet%27%29.appendChild%28document.createElement%28%22menupopup%22%29%29%3B%0Aarray.forEach%28%28m%29%3D%3E%20%7B%0A%20%20%20var%20mItem%20%3D%20document.createElement%28%22menuitem%22%29%3B%0A%20%20%20mItem.setAttribute%28%22label%22%2C%20m.label%29%3B%0A%20%20%20mItem.setAttribute%28%27type%27%2C%20%27checkbox%27%29%3B%0A%20%20%20mItem.setAttribute%28%27checked%27%2C%20cbu.getPrefs%28m.value%29%20%29%3B%0A%20%20%20mItem.onclick%20%3D%28%29%3D%3E%20cbu.setPrefs%28m.value%2C%20%21cbu.getPrefs%28m.value%29%29%3B%20%20%0A%20%20%20menuPopup.appendChild%28mItem%29%3B%0A%7D%29%3B%0AaddDestructor%28%28%29%3D%3E%20menuPopup.remove%28%29%20%29%3B%0A%0A//%20%u0434%u043E%u0431%u0430%u0432%u0438%u0442%u044C%20%u0441%u0442%u0430%u043D%u0434%u0430%u0440%u0442%u043D%u043E%u0435%20%u043A%u043E%u043D%u0442%u0435%u043A%u0441%u0442%u043D%u043E%u0435%20%u043C%u0435%u043D%u044E%20%0AmenuPopup.appendChild%28document.createElement%28%22menuseparator%22%29%29%3B%0AmenuPopup.appendChild%28document.createElement%28%22menu%22%29%29.setAttribute%28%22label%22%2C%20%22%u041C%u0435%u043D%u044E%20%u043A%u043D%u043E%u043F%u043A%u0438%22%29%3B%0Avar%20clone%20%3D%20menuPopup.lastChild.appendChild%28document.getElementById%28%22custombuttons-contextpopup%22%29.cloneNode%28true%29%29%3B%0Aclone.setAttribute%28%22onpopupshowing%22%2C%20%22document.popupNode%20%3D%20document.getElementById%28%27%22%20+%20_id%20+%20%22%27%29%22%29%3B%0A%0A%0A%0A//%20%u0424%u0443%u043D%u043A%u0446%u0438%u044F%20%u043E%u0442%u043A%u0440%u044B%u0432%u0430%u0435%u0442%20%u043D%u0430%u0441%u0442%u0440%u043E%u0439%u043A%u0438%20%u043F%u0440%u043E%u043A%u0441%u0438%20%u0432%20%u043E%u043A%u043D%u0435%20...................%0Afunction%20openConnections%28%29%20%7B%0A%20%20%20for%20%28%20var%20win%2C%20nm%20%3D%20Services.wm.getEnumerator%28null%29%3B%20win%20%3D%20nm.getNext%28%29%3B%20%29%20%0A%20%20%20%20%20%20%20%20%20if%20%28%20win.name%20%3D%3D%20%27Proxy%27%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20win.focus%28%29%3B%20%20%0A%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%7D%0A%20%20%20var%20win%20%3D%20openDialog%28%22chrome%3A//browser/content/preferences/connection.xul%22%2C%20%22Proxy%22%2C%20%22centerscreen%22%29%3B%0A%0A%20%20%20//%20%u0434%u043E%u0431%u0430%u0432%u0438%u0442%u044C%20%u0430%u0442%u0440%u0438%u0431%u0443%u0442%20%22prefwindow%22%0A%20%20%20win.addEventListener%28%22load%22%2C%20function%20f%28e%29%20%7B%0A%20%20%20%20%20%20%20this.removeEventListener%28%22load%22%2C%20f%2C%20true%29%3B%20%0A%20%20%20%20%20%20%20e.target.documentElement.setAttribute%28%22type%22%2C%20%22prefwindow%22%29%3B%0A%20%20%20%7D%2C%20true%20%29%3B%0A%20%20%20%0A%20%20%20//%20%u0437%u0430%u043A%u0440%u044B%u0442%u044C%20%u043D%u0430%u0441%u0442%u0440%u043E%u0439%u043A%u0438%20%u043F%u0440%u043E%u043A%u0441%u0438%20%u043F%u043E%20%u043A%u043B%u0438%u043A%u0443%20%u043D%u0430%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%u0435%20%0A%20%20%20gBrowser.addEventListener%28%22click%22%2C%20function%20c%28%29%20%7B%0A%20%20%20%20%20%20this.removeEventListener%28%22click%22%2C%20c%20%29%3B%0A%20%20%20%20%20%20try%20%7B%20win.close%28%29%20%7D%20catch%28e%29%20%7B%7D%3B%20%0A%20%20%20%7D%2C%20true%20%29%3B%0A%7D%3B%0A%0A%0A%0A//%20%u0424%u0443%u043D%u043A%u0446%u0438%u044F%20%u043E%u0442%u043A%u0440%u044B%u0432%u0430%u0435%u0442%20%u043D%u0430%u0441%u0442%u0440%u043E%u0439%u043A%u0438%20%u043F%u0440%u043E%u043A%u0441%u0438%20%u0432%20%u0432%u043A%u043B%u0430%u0434%u043A%u0435%20...................%0Afunction%20openConnectionsInTab%28%29%20%7B%20%0A%20%20%20var%20connections%20%3D%20gBrowser.getBrowserForTab%28%20gBrowser.selectedTab%20%3D%20gBrowser.addTab%28%22chrome%3A//browser/content/preferences/connection.xul%22%29%20%29%3B%20%0A%20%20%20%20%20%20%20%20%20%20%0A%20%20%20//%20o%u0431%u0440%u0430%u0431%u043E%u0442%u0447%u0438%u043A%20%u0436%u0434%u0435%u0442%20%u043F%u043E%u043A%u0430%20%u043E%u0442%u043A%u0440%u043E%u0435%u0442%u0441%u044F%20%u043F%u0440%u043E%u043A%u0441%u0438%2C%20%u0443%u0434%u0430%u043B%u044F%u0435%u0442%20%u0441%u0435%u0431%u044F%20%u0438%20%u0434%u043E%u0431%u0430%u0432%u043B%u044F%u0435%u0442%20%u0430%u0442%u0440%u0438%u0431%u0443%u0442%0A%20%20%20connections.addEventListener%28%22pageshow%22%2C%20function%20c%28e%29%20%7B%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20this.removeEventListener%28e.type%2C%20c%29%3B%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20e.originalTarget.documentElement.setAttribute%28%22type%22%2C%20%22prefwindow%22%29%3B%0A%20%20%20%7D%29%20%20%20%0A%7D%3B%0A%0A%0A%0A//%20%u0423%u0441%u0442%u0430%u043D%u043E%u0432%u043B%u0438%u0432%u0430%u0442%u044C%20%u043D%u0443%u0436%u043D%u0443%u044E%20%u0438%u043A%u043E%u043D%u043A%u0443%20%u043A%u043D%u043E%u043F%u043A%u0438%20%u043F%u0440%u0438%20%u0441%u0442%u0430%u0440%u0442%u0435%20%u0431%u0430%u0443%u0437%u0435%u0440%u0430%20%u0438%u043B%u0438%20%u043F%u0440%u0438%20%u0438%u0437%u043C%u0435%u043D%u0435%u043D%u0438%u044F%u0445%20%u0432%20%27about%3Aconfig%27%20...................%0Avar%20s%20%3D%20%22network.proxy.type%22%3B%0Afunction%20toggleImage%28%29%20%7B%0A%20%20%20var%20icon%20%3D%20self.ownerDocument.getAnonymousElementByAttribute%28self%2C%20%22class%22%2C%20%22toolbarbutton-icon%22%29%3B%0A%20%20%20switch%28%20cbu.getPrefs%28s%29%20%29%20%7B%0A%20%20%20%20%20%20case%200%3A%20icon.src%20%3D%20self.image%3B%20break%3B%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20case%201%3A%20icon.src%20%3D%20%27data%3Aimage/x-icon%3Bbase64%2CAAABAAEAEREAAAEAIADwBAAAFgAAACgAAAARAAAAIgAAAAEAIAAAAAAAyAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABAQAAAAAIAA4GQAAnFmkAHQ5fAAQAKAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEBAQECAgICAgICAgICAgMBAQEAAAQBJBFQOLQ+nX38ecev/mu6of8gfFvtAyUXewAAAAsAAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAEBAAAAAAMLUza7PKd//3S7oP2849X9zuvh/mW4mf4XiV7/AB4QZwAAAAAAAAAAAQEBAQAAAAAZGhgTKSwnLyYqJDErKCUnID8vXgaAUP9BlnH8b7ea/ojHrv+q2sf/a7CT+zGWbf8PakXGAAIAAAEBAQMHBwcbAAAAD2BiXn76/ff/4ebg/Onm4f+DtZ7/A31L/j2Wb/+Fwaj/ls23/7rh0v9+vaT+M5du/xKGWO0DIxIdAAAAAAEBAQEAAAABBgYFEaSmorbP08z239vX/4OwnP4ail3/RJlz/5HHsP/T7+X/ms64/3K2mP40k2r/D3tM7AUiExwhIx8meXt1mXt+eKJ3eXSce353n6esouDMysf/o7eq/kOdeP92uZv/vuPT/9Hs4P/C4tT/eLWa+juWbv8bcEq7AAYBAF1gWn7//////f39/P//////////////////////////lcKx/3i9pf/K7OD/2O/l/7ndzf6Fw6n/VK+I/AsxHj8AAAAAXF5bf+Ln2P+AnU/4fZ1N+4WiV/yKp13+jKlh/5CsZf+GpFj/Zpxh/4C5nf+i0L7+k8ex/1udf+UTOCZFAAAAAAEBAQJfYF5/3uXR/16IIPxciiH/Z5Iv/26YOP9ymz3/cpw+/3OcPf9wlzb/YI80/1mKNPu707X/YmZjiAAAAAAEBAQGAAAAAF9gXoDg5tT/cJU6/HGaPf9/pE3/hqtX/4uvXf+NsF7/iKxZ/4KoU/9+o0r/cpY6+9zjyf9ubm2JAAAAAAMEAwQAAAAAX2BegODm1P94nEX8e6JJ/4quXP+Vt2n/nb1z/6LBef+jwXz/ob96/527d/+NrGP71+HG/2praogAAAAABAQDBAAAAABfYF2A4ObU/4WlVvyPsmP/osB7/7HMj/+81J3/wdik/8DXo/+60pz/tc6X/6G6ffvY4sf/amtqiAAAAAAEBAMEAAAAAF9gXn/e5dL/n7l7/LLMk//B16X/zuG2/9jpwv/b68b/2enE/9Pkvv/Q4bv/uMud+9jhyP9qa2mHAAAAAAQEAwQAAAAAX2Bef97k0v+gt335sceT/LrNnfzC1Kj8ydmx/MzatfzK2bP8xtav/MbVr/ywwpL41+HH/2tsaokAAAAABAQDBAAAAABZW1Z3+fz1/+Dm1Pzj6db/5u3b/+nv3v/r8eD/6vDe/+ft2//k69j/4efT/9ngzPv7//b/ZGdhfwAAAAADBAMEAAAAABcZFRpZW1Z6YGFfgWBiYIBhYmGAYmJhgGJjYoBiY2KAYmJhgGFiYYBgYWCAX2BegF1fWoAbHRkeAAAAAAEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA%3D%27%3B%20break%3B%0A%20%20%20%20%20%20case%202%3A%20icon.src%20%3D%20%27data%3Aimage/x-icon%3Bbase64%2CAAABAAEAEREAAAEAIADwBAAAFgAAACgAAAARAAAAIgAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABAQAAAAAIAAcHQAAYGGkAEBBfAAEBKAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAQEAAgICAAICAgACAgMBAQEAAAEBJAA6OrQAf3/8ALCw/gCiov8AXl7tABkZewAAAAsAAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAEBAAAAAAMAOTm7AIOD/wCjo/0A1tb9AOHh/gCcnP4AY2P/ABISZwAAAAAAAAAAAAEBAQAAAAAAGBgTACgoLwAmJjEAJiYnADIyXgBWVv8Adnb8AJ2d/gCxsf8Aycn/AJeX+wBycv8ASkrGAAACAAABAQMABwcbAAAADwBfX34A+fn/AOHh/ADj4/8AoaH/AFJS/gB1df8Aq6v/ALm5/wDT0/8Ap6f+AHNz/wBeXu0AFRUdAAAAAAABAQEAAAABAAUFEQCjo7YAzs72ANnZ/wCfn/4AY2P/AHl5/wCzs/8A5ub/ALu7/wCcnP4AcHD/AFNT7AAVFRwAICAmAHd3mQB6eqIAdXWcAHl5nwClpeAAyMj/AK2t/gB9ff8An5//ANXV/wDh4f8A1tb/AJ6e+gB0dP8AUFC7AAEGAABcXH4A////AP39/AD///8A////AP///wD///8A////ALOz/wCnp/8A4eH/AObm/wDPz/4ArKz/AI2N/AAhIT8AAAAAAFxcfwDd3f8Aa2v4AGpq+wBycvwAeHj+AHt7/wB/f/8Ac3P/AHNz/wCiov8AwMD+ALS0/wCEhOUAKSlFAAAAAAABAQIAXl5/ANjY/wBGRvwARkb/AFJS/wBaWv8AX1//AF9f/wBfX/8AWVn/AFRU/wBRUfsAvr7/AGNjiAAAAAAABAQGAAAAAABeXoAA2tr/AFtb/ABeXv8AbGz/AHV1/wB6ev8Ae3v/AHd3/wBxcf8Aamr/AFtb+wDS0v8AbW2JAAAAAAADAwQAAAAAAF5egADa2v8AZGT8AGlp/wB5ef8AhYX/AI2N/wCTk/8AlJT/AJKS/wCPj/8AfX37AM/P/wBqaogAAAAAAAMDBAAAAAAAXl6AANra/wBycvwAf3//AJOT/wClpf8AsLD/ALa2/wC1tf8Ar6//AKqq/wCTk/sA0ND/AGpqiAAAAAAAAwMEAAAAAABeXn8A2dn/AJGR/ACnp/8At7f/AMXF/wDQ0P8A09P/ANHR/wDLy/8AyMj/AK2t+wDR0f8AaWmHAAAAAAADAwQAAAAAAF5efwDY2P8AkpL5AKWl/ACurvwAuLj8AL+//ADCwvwAwMD8AL29/AC8vPwAo6P4ANDQ/wBqaokAAAAAAAMDBAAAAAAAV1d3APf3/wDa2vwA3d3/AOHh/wDk5P8A5ub/AOTk/wDh4f8A39//ANra/wDT0/sA+fn/AGNjfwAAAAAAAwMEAAAAAAAWFhoAV1d6AF9fgQBgYIAAYWGAAGFhgABiYoAAYmKAAGFhgABhYYAAYGCAAF5egABbW4AAGhoeAAAAAAABAQEAAAAA/oOAQeEAgEH6AIBBoACAQQAAAEGAAABBAACAQQAAgEEAAQBBAAKAQQACgEEAAoBBAAKAQQACgEEAAoBBAAKAQQACgEE%3D%27%3B%20break%3B%0A%20%20%20%20%20%20default%3Aicon.src%20%3D%20self.image%3B%20%0A%20%20%20%7D%0A%7D%3B%20%20%0AtoggleImage%28%29%3B%0AgPrefService.addObserver%28s%2C%20toggleImage%2C%20false%29%3B%0AaddDestructor%28%28%29%3D%3E%20gPrefService.removeObserver%28s%2C%20toggleImage%29%20%29%3B%0A%0A%0A%0A//%20%u041F%u0435%u0440%u0435%u043A%u043B%u044E%u0447%u0430%u0442%u044C%20%u043D%u0430%20%u0440%u0435%u0436%u0438%u043C%20%27%u0411%u0435%u0437%20%u043F%u0440%u043E%u043A%u0441%u0438%27%20%u043F%u0440%u0438%20%u0437%u0430%u043A%u0440%u044B%u0442%u0438%u0438%20%u0431%u0440%u0430%u0443%u0437%u0435%u0440%u0430%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...................%0Avar%20switchOffProxy%20%3D%20%7B%0A%20%20%20%20observe%3A%20function%28subject%2C%20topic%2C%20data%29%20%7B%0A%20%20%20%20%20%20%20if%20%28%20data%20%3D%3D%20%22shutdown%22%20%26%26%20cbu.getPrefs%28%22CB.Proxy.reset%22%29%20%29%20cbu.setPrefs%28%22network.proxy.type%22%2C%200%29%3B%20%20%0A%20%20%20%20%7D%0A%7D%3B%0AServices.obs.addObserver%28switchOffProxy%2C%20%22quit-application%22%2C%20false%29%3B%0A%0A%0A%0A//%20%u0421%u043E%u0437%u0434%u0430%u0435%u043C%20%u043C%u0435%u043D%u044E%20%u0434%u043B%u044F%20%u0434%u043E%u0431%u0430%u0432%u043B%u0435%u043D%u0438%u0435%20%u043F%u0440%u043E%u043A%u0441%u0438%20%u0432%20%u043A%u043E%u043D%u0442%u0435%u043A%u0441%u0442%u043D%u043E%u043C%20%u043C%u0435%u043D%u044E%20%u0432%u044B%u0434%u0435%u043B%u0435%u043D%u043D%u043E%u0433%u043E%20%u0442%u0435%u043A%u0441%u0442%u0430%20%u043D%u0430%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%u0435%20...................%0A%28%28contextMenu%29%3D%3E%20%7B%0A%0A%20%20//%20%u0441%u043E%u0437%u0434%u0430%u0442%u044C%20%u043D%u043E%u0432%u044B%u0439%20%u043F%u0443%u043D%u043A%u0442%20%u043C%u0435%u043D%u044E%0A%20%20var%20menuitem%20%3D%20contextMenu.appendChild%28%20document.createElement%28%22menuitem%22%29%20%29%3B%20%20%20%20%20%20%0A%20%20menuitem.setAttribute%28%22label%22%2C%20%22%u0414%u043E%u0431%u0430%u0432%u0438%u0442%u044C%20%u043F%u0440%u043E%u043A%u0441%u0438%22%29%3B%20%0A%20%20menuitem.setAttribute%28%22class%22%2C%20%22menuitem-iconic%22%29%3B%0A%20%20menuitem.setAttribute%28%22image%22%2C%20self.image%29%3B%0A%20%20menuitem.onclick%20%3D%28%29%3D%3E%20addNewProxy%28%29%3B%0A%20%20addDestructor%28%28%29%3D%3E%20menuitem.remove%28%29%20%29%3B%0A%20%20%0A%20%20//%20%u0443%u0441%u0442%u0430%u043D%u0430%u0432%u043B%u0438%u0432%u0430%u0435%u043C%20%u0433%u0434%u0435%20%u043F%u043E%u043A%u0430%u0437%u044B%u0432%u0430%u0442%u044C%20%u043F%u0443%u043D%u043A%u0442%20%u043C%u0435%u043D%u044E%20%0A%20%20addEventListener%28%22popupshowing%22%2C%20%28%29%3D%3E%7B%0A%20%20%20%20%20menuitem.hidden%20%3D%20%21cbu.getPrefs%28%22CB.Proxy.inContextMenu%22%29%20%7C%7C%20%21gContextMenu.isContentSelected%3B%20//%20%21gContextMenu.isTextSelected%3B%0A%20%20%7D%2C%20false%2C%20contextMenu%29%3B%0A%20%20%0A%20%20%0A%20%20//%20%u0434%u043E%u0431%u0430%u0432%u043B%u0435%u043D%u0438%u0435%20%u043F%u0440%u043E%u043A%u0441%u0438%0A%20%20function%20addNewProxy%28sel%29%20%7B%20%20%0A%20%20%20%20%20var%20selection%20%3D%20document.commandDispatcher.focusedWindow.getSelection%28%29.toString%28%29%3B%0A%20%20%20%20%20var%20sel%20%3D%20%28%20sel%20%3D%3D%20undefined%20%29%20%3F%20selection%20%3A%20sel.toString%28%29%3B%0A%20%20%20%20%20sel%20%3D%20sel.replace%28/%5E%5Cs+%7C%5Cs+%24/g%2C%20%22%22%29%3B%20//%20%u0443%u0434%u0430%u043B%u0438%u0442%u044C%20%u043F%u0440%u043E%u0431%u0435%u043B%u044B%2C%20%u0441%u043B%u0435%u0432%u0430%20%u0438%20%u0441%u043F%u0440%u0430%u0432%u0430%20%u043E%u0442%20%u0441%u0442%u0440%u043E%u043A%u0438%0A%20%20%20%20%20sel%20%3D%20sel.replace%28/%5Cs+/g%2C%22%3A%22%29%3B%20//%20%u0437%u0430%u043C%u0435%u043D%u0438%u0442%u044C%20%u043F%u0440%u043E%u0431%u0435%u043B%u044B%20%u0432%u043D%u0443%u0442%u0440%u0438%20%u0441%u0442%u0440%u043E%u043A%u0438%0A%0A%20%20%20%20%20//%20%u0435%u0441%u043B%u0438%20%u0442%u043E%u043B%u044C%u043A%u043E%20%u043F%u043E%u0440%u0442%20...%0A%20%20%20%20%20if%20%28%20sel.length%20%3C%206%20%26%26%20isFinite%28sel%29%20%29%20%7B%20%0A%20%20%20%20%20%20%20%20%20%20sel%20%3D%20sel.replace%28/%3A/g%2C%20%22%22%29%3B%0A%20%20%20%20%20%20%20%20%20%20var%20lab%20%3D%20%27%u043F%u043E%u0440%u0442%27%3B%0A%20%20%20%20%20%20%20%20%20%20cbu.setPrefs%28%22network.proxy.http_port%22%2C%20+sel%29%3B%20%20%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%7D%0A%20%20%20%20%20%0A%20%20%20%20%20//%20%u0435%u0441%u043B%u0438%20%u0442%u043E%u043B%u044C%u043A%u043E%20%u0430%u0434%u0440%u0435%u0441%20...%0A%20%20%20%20%20if%20%28%20sel.length%20%3E%205%20%26%26%20%21/%3A/.test%28sel%29%20%26%26%20sel.split%28%22.%22%29.length%20%3D%3D%204%20%29%20%7B%20%20%20%0A%20%20%20%20%20%20%20%20%20%20var%20lab%20%3D%20%27%u0430%u0434%u0440%u0435%u0441%27%3B%0A%20%20%20%20%20%20%20%20%20%20cbu.setPrefs%28%22network.proxy.http%22%2C%20convertFromUnicode%28%22UTF-8%22%2C%20sel%29%29%3B%20%20%0A%20%20%20%20%20%20%20%20%20%20%7D%20%20%20%0A%20%20%20%20%20%0A%20%20%20%20%20//%20%u0435%u0441%u043B%u0438%20%u0430%u0434%u0440%u0435%u0441%20%u0438%20%u043F%u043E%u0440%u0442%20...%20%20%20%20%0A%20%20%20%20%20if%20%28%20sel.length%20%3E%205%20%26%26%20/%3A/.test%28sel%29%20%26%26%20sel.split%28%22%3A%22%29.length%20%3D%3D%202%20%26%26%20sel.split%28%22.%22%29.length%20%3D%3D%204%20%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20var%20lab%20%3D%20%27%u0430%u0434%u0440%u0435%u0441%20%u0438%20%u043F%u043E%u0440%u0442%27%3B%0A%20%20%20%20%20%20%20%20%20%20var%20array%20%3D%20sel.split%28%22%3A%22%29%3B%20%20%0A%20%20%20%20%20%20%20%20%20%20array.forEach%28%28str%29%3D%3E%20addNewProxy%28str%29%20%29%3B%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%7D%20%20%20%20%20%0A%0A%20%20%20%20%20if%20%28%20lab%20%3D%3D%20undefined%20%29%20return%3B%0A%0A%20%20%20%20%20//%20%u0432%u0441%u043F%u043B%u044B%u0432%u0430%u044E%u0449%u0430%u044F%20%u043F%u043E%u0434%u0441%u043A%u0430%u0437%u043A%u0430%20%u0440%u044F%u0434%u043E%u043C%20%u0441%20%u0432%u044B%u0434%u0435%u043B%u0435%u043D%u043D%u044B%u043C%20%u0442%u0435%u043A%u0441%u0442%u043E%u043C%20...%20%20%20%20%20%0A%20%20%20%20%20function%20showTooltip%28%29%20%7B%0A%20%20%20%20%20%20%20%20var%20tooltip%20%3D%20gBrowser.appendChild%28%20document.createElement%28%22tooltip%22%29%20%29%3B%0A%20%20%20%20%20%20%20%20tooltip.style.cssText%20%3D%20%22color%3A%20red%20%21important%3B%20font-weight%3A%20bold%20%21important%3B%20font-size%3A%2014px%20%21important%3B%20-moz-box-orient%3A%20horizontal%3B%20text-align%3A%20center%3B%22%3B%0A%20%20%20%0A%20%20%20%20%20%20%20%20var%20image%20%3D%20tooltip.appendChild%28%20document.createElement%28%22image%22%29%20%29%3B%0A%20%20%20%20%20%20%20%20image.setAttribute%28%22src%22%2C%20self.image%29%3B%0A%20%20%20%0A%20%20%20%20%20%20%20%20var%20label%20%3D%20tooltip.appendChild%28%20document.createElement%28%22label%22%29%29%3B%0A%20%20%20%20%20%20%20%20label.setAttribute%28%22value%22%2C%20%22%u0423%u0441%u0442%u0430%u043D%u043E%u0432%u043B%u0435%u043D%20%22%20+%20lab%20+%20%22%20%u043F%u0440%u043E%u043A%u0441%u0438%3A%20%22%20+%20sel%29%3B%0A%20%20%20%20%0A%20%20%20%20%20%20%20%20var%20focused%20%3D%20document.commandDispatcher.focusedWindow%3B%0A%20%20%20%20%20%20%20%20var%20selection%20%3D%20focused.getSelection%28%29.getRangeAt%280%29.getBoundingClientRect%28%29%3B%0A%20%20%20%20%20%20%20%20var%20posX%20%3D%20focused.mozInnerScreenX%20+%20selection.left%3B%0A%20%20%20%20%20%20%20%20var%20posY%20%3D%20focused.mozInnerScreenY%20+%20selection.bottom%20-%205%3B%20%20%20%0A%0A%20%20%20%20%20%20%20%20tooltip.showPopup%28gBrowser%2C%20posX%2C%20posY%29%3B%0A%20%20%20%20%20%20%20%20setTimeout%28%28%29%3D%3E%20gBrowser.removeChild%28tooltip%29%2C%203000%29%3B%0A%20%20%20%20%20%7D%3B%0A%20%20%20%20%20showTooltip%28%29%3B%20%20%20%20%0A%20%20%7D%3B%0A%20%20%20%0A%7D%29%28document.getElementById%28%22contentAreaContextMenu%22%29%29%3B%20%0A%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B/*CODE*/%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E


инициализация
скрытый текст

Выделить код

Код:

// Proxy, от 25.02.2016.


// Настройка функций кликов мыши для кнопки ...................
this.onmousedown =e=> {
   
   this.onmouseup =e=>{                  // левый клик
        if ( e.button ) return;
        clearTimeout(self.timer);           

        switch( cbu.getPrefs("network.proxy.type") ) {
           case 0:  var data = 1; break;            
           case 1:  var data = 2; break; 
           case 2:  var data = 0; break;
           default: var data = 0; 
        }
        cbu.setPrefs("network.proxy.type", data);  
   }

   if ( e.button == 0 )                  // длинный левый клик
        self.timer = setTimeout(()=>{     
           self.onmouseup = '';
           cbu.getPrefs("CB.Proxy.connectionsInTab") ? openConnectionsInTab() : openConnections();
        }, 500);
   
   if ( e.button == 2 )                  // правый клик
        menuPopup.showPopup(self, -1, -1, "popup", "bottomleft", "topleft");
};
self.onclick =e=> e.preventDefault();



// Подсказка для кнопки ...................
this.onmouseover =()=> {
   this.tooltipText = "Proxy \nЛ: Переключить прокси \nДЛ: Открыть настройки прокси"
                    + "\nП: Mеню кнопки \n\nТекущие настройки прокси: " 
                    + "\nIP: " + Services.prefs.getComplexValue("network.proxy.http", Ci.nsISupportsString).data
                    + "\nПорт: "+ cbu.getPrefs("network.proxy.http_port");                                                    
};



// Создать меню для кнопки ...................
var array = [
   { label: "Добавление прокси в контекстом меню", value: 'CB.Proxy.inContextMenu' },
   { label: "Открывать настройки прокси как вкладку", value: 'CB.Proxy.connectionsInTab' },
   { label: "Переключать на режим 'Без прокси' при закрытии браузера ", value: 'CB.Proxy.reset' }    
];

var menuPopup = document.getElementById('mainPopupSet').appendChild(document.createElement("menupopup"));
array.forEach((m)=> {
   var mItem = document.createElement("menuitem");
   mItem.setAttribute("label", m.label);
   mItem.setAttribute('type', 'checkbox');
   mItem.setAttribute('checked', cbu.getPrefs(m.value) );
   mItem.onclick =()=> cbu.setPrefs(m.value, !cbu.getPrefs(m.value));  
   menuPopup.appendChild(mItem);
});
addDestructor(()=> menuPopup.remove() );

// добавить стандартное контекстное меню 
menuPopup.appendChild(document.createElement("menuseparator"));
menuPopup.appendChild(document.createElement("menu")).setAttribute("label", "Меню кнопки");
var clone = menuPopup.lastChild.appendChild(document.getElementById("custombuttons-contextpopup").cloneNode(true));
clone.setAttribute("onpopupshowing", "document.popupNode = document.getElementById('" + _id + "')");



// Функция открывает настройки прокси в окне ...................
function openConnections() {
   for ( var win, nm = Services.wm.getEnumerator(null); win = nm.getNext(); ) 
         if ( win.name == 'Proxy') {
              win.focus();  
              break;
              }
   var win = openDialog("chrome://browser/content/preferences/connection.xul", "Proxy", "centerscreen");

   // добавить атрибут "prefwindow"
   win.addEventListener("load", function f(e) {
       this.removeEventListener("load", f, true); 
       e.target.documentElement.setAttribute("type", "prefwindow");
   }, true );
   
   // закрыть настройки прокси по клику на странице 
   gBrowser.addEventListener("click", function c() {
      this.removeEventListener("click", c );
      try { win.close() } catch(e) {}; 
   }, true );
};



// Функция открывает настройки прокси в вкладке ...................
function openConnectionsInTab() { 
   var connections = gBrowser.getBrowserForTab( gBrowser.selectedTab = gBrowser.addTab("chrome://browser/content/preferences/connection.xul") ); 
          
   // oбработчик ждет пока откроется прокси, удаляет себя и добавляет атрибут
   connections.addEventListener("pageshow", function c(e) {         
      this.removeEventListener(e.type, c);         
      e.originalTarget.documentElement.setAttribute("type", "prefwindow");
   })   
};



// Установливать нужную иконку кнопки при старте баузера или при изменениях в 'about:config' ...................
var s = "network.proxy.type";
function toggleImage() {
   var icon = self.ownerDocument.getAnonymousElementByAttribute(self, "class", "toolbarbutton-icon");
   switch( cbu.getPrefs(s) ) {
      case 0: icon.src = self.image; break;          
      case 1: icon.src = 'data:image/x-icon;base64,AAABAAEAEREAAAEAIADwBAAAFgAAACgAAAARAAAAIgAAAAEAIAAAAAAAyAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABAQAAAAAIAA4GQAAnFmkAHQ5fAAQAKAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEBAQECAgICAgICAgICAgMBAQEAAAQBJBFQOLQ+nX38ecev/mu6of8gfFvtAyUXewAAAAsAAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAEBAAAAAAMLUza7PKd//3S7oP2849X9zuvh/mW4mf4XiV7/AB4QZwAAAAAAAAAAAQEBAQAAAAAZGhgTKSwnLyYqJDErKCUnID8vXgaAUP9BlnH8b7ea/ojHrv+q2sf/a7CT+zGWbf8PakXGAAIAAAEBAQMHBwcbAAAAD2BiXn76/ff/4ebg/Onm4f+DtZ7/A31L/j2Wb/+Fwaj/ls23/7rh0v9+vaT+M5du/xKGWO0DIxIdAAAAAAEBAQEAAAABBgYFEaSmorbP08z239vX/4OwnP4ail3/RJlz/5HHsP/T7+X/ms64/3K2mP40k2r/D3tM7AUiExwhIx8meXt1mXt+eKJ3eXSce353n6esouDMysf/o7eq/kOdeP92uZv/vuPT/9Hs4P/C4tT/eLWa+juWbv8bcEq7AAYBAF1gWn7//////f39/P//////////////////////////lcKx/3i9pf/K7OD/2O/l/7ndzf6Fw6n/VK+I/AsxHj8AAAAAXF5bf+Ln2P+AnU/4fZ1N+4WiV/yKp13+jKlh/5CsZf+GpFj/Zpxh/4C5nf+i0L7+k8ex/1udf+UTOCZFAAAAAAEBAQJfYF5/3uXR/16IIPxciiH/Z5Iv/26YOP9ymz3/cpw+/3OcPf9wlzb/YI80/1mKNPu707X/YmZjiAAAAAAEBAQGAAAAAF9gXoDg5tT/cJU6/HGaPf9/pE3/hqtX/4uvXf+NsF7/iKxZ/4KoU/9+o0r/cpY6+9zjyf9ubm2JAAAAAAMEAwQAAAAAX2BegODm1P94nEX8e6JJ/4quXP+Vt2n/nb1z/6LBef+jwXz/ob96/527d/+NrGP71+HG/2praogAAAAABAQDBAAAAABfYF2A4ObU/4WlVvyPsmP/osB7/7HMj/+81J3/wdik/8DXo/+60pz/tc6X/6G6ffvY4sf/amtqiAAAAAAEBAMEAAAAAF9gXn/e5dL/n7l7/LLMk//B16X/zuG2/9jpwv/b68b/2enE/9Pkvv/Q4bv/uMud+9jhyP9qa2mHAAAAAAQEAwQAAAAAX2Bef97k0v+gt335sceT/LrNnfzC1Kj8ydmx/MzatfzK2bP8xtav/MbVr/ywwpL41+HH/2tsaokAAAAABAQDBAAAAABZW1Z3+fz1/+Dm1Pzj6db/5u3b/+nv3v/r8eD/6vDe/+ft2//k69j/4efT/9ngzPv7//b/ZGdhfwAAAAADBAMEAAAAABcZFRpZW1Z6YGFfgWBiYIBhYmGAYmJhgGJjYoBiY2KAYmJhgGFiYYBgYWCAX2BegF1fWoAbHRkeAAAAAAEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA='; break;
      case 2: icon.src = 'data:image/x-icon;base64,AAABAAEAEREAAAEAIADwBAAAFgAAACgAAAARAAAAIgAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABAQAAAAAIAAcHQAAYGGkAEBBfAAEBKAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAQEAAgICAAICAgACAgMBAQEAAAEBJAA6OrQAf3/8ALCw/gCiov8AXl7tABkZewAAAAsAAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAEBAAAAAAMAOTm7AIOD/wCjo/0A1tb9AOHh/gCcnP4AY2P/ABISZwAAAAAAAAAAAAEBAQAAAAAAGBgTACgoLwAmJjEAJiYnADIyXgBWVv8Adnb8AJ2d/gCxsf8Aycn/AJeX+wBycv8ASkrGAAACAAABAQMABwcbAAAADwBfX34A+fn/AOHh/ADj4/8AoaH/AFJS/gB1df8Aq6v/ALm5/wDT0/8Ap6f+AHNz/wBeXu0AFRUdAAAAAAABAQEAAAABAAUFEQCjo7YAzs72ANnZ/wCfn/4AY2P/AHl5/wCzs/8A5ub/ALu7/wCcnP4AcHD/AFNT7AAVFRwAICAmAHd3mQB6eqIAdXWcAHl5nwClpeAAyMj/AK2t/gB9ff8An5//ANXV/wDh4f8A1tb/AJ6e+gB0dP8AUFC7AAEGAABcXH4A////AP39/AD///8A////AP///wD///8A////ALOz/wCnp/8A4eH/AObm/wDPz/4ArKz/AI2N/AAhIT8AAAAAAFxcfwDd3f8Aa2v4AGpq+wBycvwAeHj+AHt7/wB/f/8Ac3P/AHNz/wCiov8AwMD+ALS0/wCEhOUAKSlFAAAAAAABAQIAXl5/ANjY/wBGRvwARkb/AFJS/wBaWv8AX1//AF9f/wBfX/8AWVn/AFRU/wBRUfsAvr7/AGNjiAAAAAAABAQGAAAAAABeXoAA2tr/AFtb/ABeXv8AbGz/AHV1/wB6ev8Ae3v/AHd3/wBxcf8Aamr/AFtb+wDS0v8AbW2JAAAAAAADAwQAAAAAAF5egADa2v8AZGT8AGlp/wB5ef8AhYX/AI2N/wCTk/8AlJT/AJKS/wCPj/8AfX37AM/P/wBqaogAAAAAAAMDBAAAAAAAXl6AANra/wBycvwAf3//AJOT/wClpf8AsLD/ALa2/wC1tf8Ar6//AKqq/wCTk/sA0ND/AGpqiAAAAAAAAwMEAAAAAABeXn8A2dn/AJGR/ACnp/8At7f/AMXF/wDQ0P8A09P/ANHR/wDLy/8AyMj/AK2t+wDR0f8AaWmHAAAAAAADAwQAAAAAAF5efwDY2P8AkpL5AKWl/ACurvwAuLj8AL+//ADCwvwAwMD8AL29/AC8vPwAo6P4ANDQ/wBqaokAAAAAAAMDBAAAAAAAV1d3APf3/wDa2vwA3d3/AOHh/wDk5P8A5ub/AOTk/wDh4f8A39//ANra/wDT0/sA+fn/AGNjfwAAAAAAAwMEAAAAAAAWFhoAV1d6AF9fgQBgYIAAYWGAAGFhgABiYoAAYmKAAGFhgABhYYAAYGCAAF5egABbW4AAGhoeAAAAAAABAQEAAAAA/oOAQeEAgEH6AIBBoACAQQAAAEGAAABBAACAQQAAgEEAAQBBAAKAQQACgEEAAoBBAAKAQQACgEEAAoBBAAKAQQACgEE='; break;
      default:icon.src = self.image; 
   }
};  
toggleImage();
gPrefService.addObserver(s, toggleImage, false);
addDestructor(()=> gPrefService.removeObserver(s, toggleImage) );



// Переключать на режим 'Без прокси' при закрытии браузера если это разрешено в 'about:config' ...................
var switchOffProxy = {
    observe: function(subject, topic, data) {
       if ( data == "shutdown" && cbu.getPrefs("CB.Proxy.reset") ) cbu.setPrefs("network.proxy.type", 0);  
    }
};
Services.obs.addObserver(switchOffProxy, "quit-application", false);



// Создаем меню для добавление прокси в контекстном меню выделенного текста на странице ...................
((contextMenu)=> {

  // создать новый пункт меню
  var menuitem = contextMenu.appendChild( document.createElement("menuitem") );      
  menuitem.setAttribute("label", "Добавить прокси"); 
  menuitem.setAttribute("class", "menuitem-iconic");
  menuitem.setAttribute("image", self.image);
  menuitem.onclick =()=> addNewProxy();
  addDestructor(()=> menuitem.remove() );
  
  // устанавливаем где показывать пункт меню 
  addEventListener("popupshowing", ()=>{
     menuitem.hidden = !cbu.getPrefs("CB.Proxy.inContextMenu") || !gContextMenu.isContentSelected; // !gContextMenu.isTextSelected;
  }, false, contextMenu);
  
  
  // добавление прокси
  function addNewProxy(sel) {  
     var selection = document.commandDispatcher.focusedWindow.getSelection().toString();
     var sel = ( sel == undefined ) ? selection : sel.toString();
     sel = sel.replace(/^\s+|\s+$/g, ""); // удалить пробелы, слева и справа от строки
     sel = sel.replace(/\s+/g,":"); // заменить пробелы внутри строки

     // если только порт ...
     if ( sel.length < 6 && isFinite(sel) ) { 
          sel = sel.replace(/:/g, "");
          var lab = 'порт';
          cbu.setPrefs("network.proxy.http_port", +sel);                    
          }
     
     // если только адрес ...
     if ( sel.length > 5 && !/:/.test(sel) && sel.split(".").length == 4 ) {   
          var lab = 'адрес';
          cbu.setPrefs("network.proxy.http", convertFromUnicode("UTF-8", sel));  
          }   
     
     // если адрес и порт ...    
     if ( sel.length > 5 && /:/.test(sel) && sel.split(":").length == 2 && sel.split(".").length == 4 ) {
          var lab = 'адрес и порт';
          var array = sel.split(":");  
          array.forEach((str)=> addNewProxy(str) );          
          }     

     if ( lab == undefined ) return;

     // всплывающая подсказка рядом с выделенным текстом ...     
     function showTooltip() {
        var tooltip = gBrowser.appendChild( document.createElement("tooltip") );
        tooltip.style.cssText = "color: red !important; font-weight: bold !important; font-size: 14px !important; -moz-box-orient: horizontal; text-align: center;";
   
        var image = tooltip.appendChild( document.createElement("image") );
        image.setAttribute("src", self.image);
   
        var label = tooltip.appendChild( document.createElement("label"));
        label.setAttribute("value", "Установлен " + lab + " прокси: " + sel);
    
        var focused = document.commandDispatcher.focusedWindow;
        var selection = focused.getSelection().getRangeAt(0).getBoundingClientRect();
        var posX = focused.mozInnerScreenX + selection.left;
        var posY = focused.mozInnerScreenY + selection.bottom - 5;   

        tooltip.showPopup(gBrowser, posX, posY);
        setTimeout(()=> gBrowser.removeChild(tooltip), 3000);
     };
     showTooltip();    
  };
   
})(document.getElementById("contentAreaContextMenu"));

Отсутствует

 

№5021-08-2016 19:31:38

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

Re: [CB]Proxy

Ultima2m пишет
bunda1 пишет

А как ты включаешь режим "url авт. настройки"?

Там последовательный перебор - 3 положения.

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

Выделить код

Код:

// Proxy, от 21.08.2016.


// Настройка функций кликов мыши для кнопки ...................
this.onmousedown =e=> {
   
   this.onmouseup =e=>{                  // левый клик
        if ( e.button ) return;
        clearTimeout(self.timer);           

        switch( cbu.getPrefs("network.proxy.type") ) {
           case 0:  var data = 1; break;            
           case 1:  var data = 2; break; 
           case 2:  var data = 0; break;
           default: var data = 0; 
        }
        cbu.setPrefs("network.proxy.type", data);  
   }

   if ( e.button == 0 )                  // длинный левый клик
        self.timer = setTimeout(()=>{     
           self.onmouseup = '';
           cbu.getPrefs("CB.Proxy.connectionsInTab") ? openConnectionsInTab() : openConnections();
        }, 500);
   
   if ( e.button == 2 )                  // правый клик
        menuPopup.showPopup(self, -1, -1, "popup", "bottomleft", "topleft");
};
self.onclick =e=> e.preventDefault();



// Подсказка для кнопки ...................
this.onmouseover =()=> {
   this.tooltipText = "Proxy \nЛ: Переключить прокси \nДЛ: Открыть настройки прокси"
                    + "\nП: Mеню кнопки \n\nТекущие настройки прокси: " 
                    + "\nIP: " + Services.prefs.getComplexValue("network.proxy.http", Ci.nsISupportsString).data
                    + "\nПорт: "+ cbu.getPrefs("network.proxy.http_port");                                                    
};



// Создать меню для кнопки ...................
var array = [
   { label: "Добавление прокси в контекстом меню", value: 'CB.Proxy.inContextMenu' },
   { label: "Открывать настройки прокси как вкладку", value: 'CB.Proxy.connectionsInTab' },
   { label: "Переключать на режим 'Без прокси' при закрытии браузера ", value: 'CB.Proxy.reset' }    
];

var menuPopup = document.getElementById('mainPopupSet').appendChild(document.createElement("menupopup"));
array.forEach((m)=> {
   var mItem = document.createElement("menuitem");
   mItem.setAttribute("label", m.label);
   mItem.setAttribute('type', 'checkbox');
   mItem.setAttribute('checked', cbu.getPrefs(m.value) );
   mItem.onclick =()=> cbu.setPrefs(m.value, !cbu.getPrefs(m.value));  
   menuPopup.appendChild(mItem);
});
addDestructor(()=> menuPopup.remove() );

// добавить стандартное контекстное меню 
menuPopup.appendChild(document.createElement("menuseparator"));
menuPopup.appendChild(document.createElement("menu")).setAttribute("label", "Меню кнопки");
var clone = menuPopup.lastChild.appendChild(document.getElementById("custombuttons-contextpopup").cloneNode(true));
clone.setAttribute("onpopupshowing", "document.popupNode = document.getElementById('" + _id + "')");



// Функция открывает настройки прокси в окне ...................  
function openConnections() {
   self.win && self.win.close();
   self.win = openDialog("chrome://browser/content/preferences/connection.xul", "Proxy", "centerscreen");
   
   // добавить атрибут "prefwindow"
   self.win.addEventListener("load", function f(e) {
       this.removeEventListener("load", f, true); 
       e.target.documentElement.setAttribute("type", "prefwindow");
   }, true);

   // закрыть настройки прокси по клику на странице 
   gBrowser.addEventListener("click", function c() {
      this.removeEventListener("click", c);
      try { self.win.close() } catch(e) {}; 
   }, true);
};



// Функция открывает настройки прокси в вкладке ...................
function openConnectionsInTab() { 
   var connections = gBrowser.getBrowserForTab( gBrowser.selectedTab = gBrowser.addTab("chrome://browser/content/preferences/connection.xul") ); 
          
   // oбработчик ждет пока откроется прокси, удаляет себя и добавляет атрибут
   connections.addEventListener("pageshow", function c(e) {         
      this.removeEventListener(e.type, c);         
      e.originalTarget.documentElement.setAttribute("type", "prefwindow");
   })   
};



// Установливать нужную иконку кнопки при старте баузера или при изменениях в 'about:config' ...................
var s = "network.proxy.type";
function toggleImage() {
   var icon = self.ownerDocument.getAnonymousElementByAttribute(self, "class", "toolbarbutton-icon");
   switch( cbu.getPrefs(s) ) {
      case 0: icon.src = self.image; break;          
      case 1: icon.src = 'data:image/x-icon;base64,AAABAAEAEREAAAEAIADwBAAAFgAAACgAAAARAAAAIgAAAAEAIAAAAAAAyAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABAQAAAAAIAA4GQAAnFmkAHQ5fAAQAKAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEBAQECAgICAgICAgICAgMBAQEAAAQBJBFQOLQ+nX38ecev/mu6of8gfFvtAyUXewAAAAsAAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAEBAAAAAAMLUza7PKd//3S7oP2849X9zuvh/mW4mf4XiV7/AB4QZwAAAAAAAAAAAQEBAQAAAAAZGhgTKSwnLyYqJDErKCUnID8vXgaAUP9BlnH8b7ea/ojHrv+q2sf/a7CT+zGWbf8PakXGAAIAAAEBAQMHBwcbAAAAD2BiXn76/ff/4ebg/Onm4f+DtZ7/A31L/j2Wb/+Fwaj/ls23/7rh0v9+vaT+M5du/xKGWO0DIxIdAAAAAAEBAQEAAAABBgYFEaSmorbP08z239vX/4OwnP4ail3/RJlz/5HHsP/T7+X/ms64/3K2mP40k2r/D3tM7AUiExwhIx8meXt1mXt+eKJ3eXSce353n6esouDMysf/o7eq/kOdeP92uZv/vuPT/9Hs4P/C4tT/eLWa+juWbv8bcEq7AAYBAF1gWn7//////f39/P//////////////////////////lcKx/3i9pf/K7OD/2O/l/7ndzf6Fw6n/VK+I/AsxHj8AAAAAXF5bf+Ln2P+AnU/4fZ1N+4WiV/yKp13+jKlh/5CsZf+GpFj/Zpxh/4C5nf+i0L7+k8ex/1udf+UTOCZFAAAAAAEBAQJfYF5/3uXR/16IIPxciiH/Z5Iv/26YOP9ymz3/cpw+/3OcPf9wlzb/YI80/1mKNPu707X/YmZjiAAAAAAEBAQGAAAAAF9gXoDg5tT/cJU6/HGaPf9/pE3/hqtX/4uvXf+NsF7/iKxZ/4KoU/9+o0r/cpY6+9zjyf9ubm2JAAAAAAMEAwQAAAAAX2BegODm1P94nEX8e6JJ/4quXP+Vt2n/nb1z/6LBef+jwXz/ob96/527d/+NrGP71+HG/2praogAAAAABAQDBAAAAABfYF2A4ObU/4WlVvyPsmP/osB7/7HMj/+81J3/wdik/8DXo/+60pz/tc6X/6G6ffvY4sf/amtqiAAAAAAEBAMEAAAAAF9gXn/e5dL/n7l7/LLMk//B16X/zuG2/9jpwv/b68b/2enE/9Pkvv/Q4bv/uMud+9jhyP9qa2mHAAAAAAQEAwQAAAAAX2Bef97k0v+gt335sceT/LrNnfzC1Kj8ydmx/MzatfzK2bP8xtav/MbVr/ywwpL41+HH/2tsaokAAAAABAQDBAAAAABZW1Z3+fz1/+Dm1Pzj6db/5u3b/+nv3v/r8eD/6vDe/+ft2//k69j/4efT/9ngzPv7//b/ZGdhfwAAAAADBAMEAAAAABcZFRpZW1Z6YGFfgWBiYIBhYmGAYmJhgGJjYoBiY2KAYmJhgGFiYYBgYWCAX2BegF1fWoAbHRkeAAAAAAEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA='; break;
      case 2: icon.src = 'data:image/x-icon;base64,AAABAAEAEREAAAEAIADwBAAAFgAAACgAAAARAAAAIgAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABAQAAAAAIAAcHQAAYGGkAEBBfAAEBKAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAQEAAgICAAICAgACAgMBAQEAAAEBJAA6OrQAf3/8ALCw/gCiov8AXl7tABkZewAAAAsAAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAEBAAAAAAMAOTm7AIOD/wCjo/0A1tb9AOHh/gCcnP4AY2P/ABISZwAAAAAAAAAAAAEBAQAAAAAAGBgTACgoLwAmJjEAJiYnADIyXgBWVv8Adnb8AJ2d/gCxsf8Aycn/AJeX+wBycv8ASkrGAAACAAABAQMABwcbAAAADwBfX34A+fn/AOHh/ADj4/8AoaH/AFJS/gB1df8Aq6v/ALm5/wDT0/8Ap6f+AHNz/wBeXu0AFRUdAAAAAAABAQEAAAABAAUFEQCjo7YAzs72ANnZ/wCfn/4AY2P/AHl5/wCzs/8A5ub/ALu7/wCcnP4AcHD/AFNT7AAVFRwAICAmAHd3mQB6eqIAdXWcAHl5nwClpeAAyMj/AK2t/gB9ff8An5//ANXV/wDh4f8A1tb/AJ6e+gB0dP8AUFC7AAEGAABcXH4A////AP39/AD///8A////AP///wD///8A////ALOz/wCnp/8A4eH/AObm/wDPz/4ArKz/AI2N/AAhIT8AAAAAAFxcfwDd3f8Aa2v4AGpq+wBycvwAeHj+AHt7/wB/f/8Ac3P/AHNz/wCiov8AwMD+ALS0/wCEhOUAKSlFAAAAAAABAQIAXl5/ANjY/wBGRvwARkb/AFJS/wBaWv8AX1//AF9f/wBfX/8AWVn/AFRU/wBRUfsAvr7/AGNjiAAAAAAABAQGAAAAAABeXoAA2tr/AFtb/ABeXv8AbGz/AHV1/wB6ev8Ae3v/AHd3/wBxcf8Aamr/AFtb+wDS0v8AbW2JAAAAAAADAwQAAAAAAF5egADa2v8AZGT8AGlp/wB5ef8AhYX/AI2N/wCTk/8AlJT/AJKS/wCPj/8AfX37AM/P/wBqaogAAAAAAAMDBAAAAAAAXl6AANra/wBycvwAf3//AJOT/wClpf8AsLD/ALa2/wC1tf8Ar6//AKqq/wCTk/sA0ND/AGpqiAAAAAAAAwMEAAAAAABeXn8A2dn/AJGR/ACnp/8At7f/AMXF/wDQ0P8A09P/ANHR/wDLy/8AyMj/AK2t+wDR0f8AaWmHAAAAAAADAwQAAAAAAF5efwDY2P8AkpL5AKWl/ACurvwAuLj8AL+//ADCwvwAwMD8AL29/AC8vPwAo6P4ANDQ/wBqaokAAAAAAAMDBAAAAAAAV1d3APf3/wDa2vwA3d3/AOHh/wDk5P8A5ub/AOTk/wDh4f8A39//ANra/wDT0/sA+fn/AGNjfwAAAAAAAwMEAAAAAAAWFhoAV1d6AF9fgQBgYIAAYWGAAGFhgABiYoAAYmKAAGFhgABhYYAAYGCAAF5egABbW4AAGhoeAAAAAAABAQEAAAAA/oOAQeEAgEH6AIBBoACAQQAAAEGAAABBAACAQQAAgEEAAQBBAAKAQQACgEEAAoBBAAKAQQACgEEAAoBBAAKAQQACgEE='; break;
      default:icon.src = self.image; 
   }
};  
toggleImage();
gPrefService.addObserver(s, toggleImage, false);
addDestructor(()=> gPrefService.removeObserver(s, toggleImage) );



// Переключать на режим 'Без прокси' при закрытии браузера если это разрешено в 'about:config' ...................
var switchOffProxy = {
    observe: function(subject, topic, data) {
       if ( data == "shutdown" && cbu.getPrefs("CB.Proxy.reset") ) cbu.setPrefs("network.proxy.type", 0);  
    }
};
Services.obs.addObserver(switchOffProxy, "quit-application", false);



// Создаем меню для добавление прокси в контекстном меню выделенного текста на странице ...................
((contextMenu)=> {

  // создать новый пункт меню
  var menuitem = document.createElement("menuitem");      
  menuitem.setAttribute("label", "Добавить прокси"); 
  menuitem.setAttribute("class", "menuitem-iconic");
  menuitem.setAttribute("image", self.image);
  menuitem.onclick =()=> addNewProxy();
  contextMenu.appendChild(menuitem); // как последний пункт меню
  addDestructor(()=> menuitem.remove() );
  
  // устанавливаем где показывать пункт меню 
  addEventListener("popupshowing", ()=>{
     menuitem.hidden = !cbu.getPrefs("CB.Proxy.inContextMenu") || !gContextMenu.isContentSelected; // !gContextMenu.isTextSelected;
  }, false, contextMenu);
  
  
  // добавление прокси
  function addNewProxy(sel) {  
     var selection = gBrowser.contentDocument.defaultView.getSelection().toString();
     var sel = ( sel == undefined ) ? selection : sel.toString();
     sel = sel.replace(/^\s+|\s+$/g, ""); // удалить пробелы, слева и справа от строки
     sel = sel.replace(/\s+/g,":"); // заменить пробелы внутри строки

     // если только порт ...
     if ( sel.length < 6 && isFinite(sel) ) { 
          sel = sel.replace(/:/g, "");
          var lab = 'порт';
          cbu.setPrefs("network.proxy.http_port", +sel);                    
          }
     
     // если только адрес ...
     if ( sel.length > 5 && !/:/.test(sel) && sel.split(".").length == 4 ) {   
          var lab = 'адрес';
          cbu.setPrefs("network.proxy.http", convertFromUnicode("UTF-8", sel));  
          }   
     
     // если адрес и порт ...    
     if ( sel.length > 5 && /:/.test(sel) && sel.split(":").length == 2 && sel.split(".").length == 4 ) {
          var lab = 'адрес и порт';
          var array = sel.split(":");  
          array.forEach((str)=> addNewProxy(str) );          
          }     

     if ( lab == undefined ) return;

     // всплывающая подсказка рядом с выделенным текстом ...     
     function showTooltip() {
        var tooltip = gBrowser.appendChild( document.createElement("tooltip") );
        tooltip.style.cssText = "color: red !important; font-weight: bold !important; font-size: 14px !important; -moz-box-orient: horizontal; text-align: center;";
   
        var image = tooltip.appendChild( document.createElement("image") );
        image.setAttribute("src", self.image);
   
        var label = tooltip.appendChild( document.createElement("label"));
        label.setAttribute("value", "Установлен " + lab + " прокси: " + sel);

        var focused = document.commandDispatcher.focusedWindow;
        var selection = focused.content.document.getSelection().getRangeAt(0).getBoundingClientRect();
        var posX = focused.mozInnerScreenX + selection.left;
        var posY = focused.mozInnerScreenY + selection.bottom - 5;   

        tooltip.showPopup(gBrowser, posX, posY);
        setTimeout(()=> gBrowser.removeChild(tooltip), 3000);
     };
     showTooltip();    
  };
   
})(document.getElementById("contentAreaContextMenu"));

Отсутствует

 

Board footer

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