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

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

№1477626-06-2020 21:33:33

ruslaw
Участник
 
Группа: Members
Зарегистрирован: 22-11-2017
Сообщений: 34
UA: Firefox 52.0

Re: Custom Buttons

И все-таки продолжу еще:
1) как добавить путь к иконке, напр. "D:\\temp\\ico.dll" iconId=3  ?
2) как будет выглядеть код кнопки копирующей, перемещающей и удаляющей файл

Отредактировано ruslaw (27-06-2020 01:19:57)

Отсутствует

 

№1477727-06-2020 19:09:14

kokoss
Участник
 
Группа: Members
Зарегистрирован: 15-02-2018
Сообщений: 1739
UA: Firefox 52.0

Re: Custom Buttons

Dumby
Возможно ли сделать для [firefox] 68+ "в виде кнопки CB или скрипта для...", очистку хвостов -> (Profile/extensions/staged, trash; Profile/browser-extension-data; Profile/storage/default) после удаления расширения ?


Win7

Отсутствует

 

№1477828-06-2020 12:02:23

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

Re: Custom Buttons

ruslaw пишет

И все-таки продолжу еще:
1) как добавить путь к иконке, напр. "D:\\temp\\ico.dll" iconId=3  ?

А что, по ссылке что-то непонятное написано?
И «напр.» какой-то странный, у меня такой dll'ки нет.

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

Выделить код

Код:

var shortcut = FileUtils.File("D:\\Мое хранилище\\Тест.lnk")
	.QueryInterface(Ci.nsILocalFileWin);

var trg = FileUtils.File("C:\\Мой файл.txt");
var icon = Services.dirsvc.get("SysD", Ci.nsIFile);
icon.append("imageres.dll");

shortcut.setShortcut(trg, null, null, null, icon, 102);

ruslaw пишет

2) как будет выглядеть код кнопки копирующей, перемещающей и удаляющей файл

Если внимательно прочитать про nsIFile, и вдумчиво применить,
то код кнопки, скорее всего, будет выглядеть хорошо.

kokoss пишет

Возможно ли сделать для [firefox] 68+ "в виде кнопки CB или скрипта для...", очистку хвостов -> (Profile/extensions/staged, trash; Profile/browser-extension-data; Profile/storage/default) после удаления расширения ?

Звучит как малополезная и небезопасная затея.
Но если хочешь нахлобучить какой-нибудь тестовый
неповседневный браузер, тогда попробуй в custom_script.js
(trash не вписал, не знаю что надо сделать,
чтобы эта папка в extensions нарисовалась).

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

Выделить код

Код:

try {(g => g.AddonManager.addAddonListener({
	get staged() {
		var prof = this.storage = Services.dirsvc.get("ProfD", Ci.nsIFile);
		var staged = prof.clone();
		["extensions", "staged"].forEach(staged.append);
		(this.data = prof.clone()).append("browser-extension-data");
		["storage", "default"].forEach(prof.append);
		delete this.staged;
		return this.staged = staged;
	},
	onUninstalling(addon) {
		if (addon.type == "extension" && addon.isWebExtension) try {
			this.uuids = JSON.parse(Services.prefs.getStringPref(
				"extensions.webextensions.uuids", "{}"
			));
		} catch {this.uuids = {};}
	},
	onUninstalled(addon) {
		if (addon.type != "extension") return;
		var {id} = addon;
		this.remove(this.staged, id, true);
		if (!Array.from(this.staged.directoryEntries).length)
			try {this.staged.remove(false);} catch {}
		if (!addon.isWebExtension) return;
		this.remove(this.data, id, true);
		var uuid = this.uuids[id];
		uuid && this.remove(this.storage, "moz-extension+++" + uuid);
	},
	remove(dir, str, once) {
		if (!dir.exists()) return;
		var trg = once ? this.eq : this.sw;
		for(var entry of dir.directoryEntries)
			if (trg(entry.leafName, str))
				try {entry.remove(true);} finally {if (once) break;}
	},
	eq: (str1, str2) => str1 == str2,
	sw: (str1, str2) => str1.startsWith(str2)
}))(Cu.import("resource://gre/modules/AddonManager.jsm", {}));}
catch (ex) {Cu.reportError(ex);}

Отсутствует

 

№1477928-06-2020 14:14:47

ruslaw
Участник
 
Группа: Members
Зарегистрирован: 22-11-2017
Сообщений: 34
UA: Firefox 52.0

Re: Custom Buttons

Dumby, большущее спасибо. Попытаюсь с nsIFile, но если не получится все-так еще раз спрошу :D

Отсутствует

 

№1478028-06-2020 18:07:32

kokoss
Участник
 
Группа: Members
Зарегистрирован: 15-02-2018
Сообщений: 1739
UA: Firefox 52.0

Re: Custom Buttons

Dumby
Спасибо!


Win7

Отсутствует

 

№1478129-06-2020 16:30:40

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

Re: Custom Buttons

«Merge Day»


custom_buttons-0.0.7.0.0.15-fx-paxmod.xpi
custom_buttons-0.0.7.0.0.15-fx-bootstrap.xpi


[?] Custom Buttons для Thunderbird 78
Только для TB, и только для 78.
custom_buttons-78.0-tb.xpi
Да, и DOMi 7.0.7 тоже можно
попробовать поставить (paxmod, разумеется).

Отсутствует

 

№1478229-06-2020 18:54:29

solombala
Забанен
 
Группа: Members
Зарегистрирован: 20-07-2019
Сообщений: 652
UA: Firefox 78.0

Re: Custom Buttons

Dumby
Этот код упал

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

Выделить код

Код:

// Проверка орфографии 
addEventListener('click', e=> {
   if ( e.target.tagName && (e.target.tagName == 'TEXTAREA'|| e.target.tagName == 'INPUT'))
        e.target.setAttribute('spellcheck', 'true');
}, content.document.body);

Отсутствует

 

№1478329-06-2020 22:11:49

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

Re: Custom Buttons

solombala пишет

Этот код упал

С чего бы ему упасть?
Разве что только однопроцессный режим слетел.


И что там за странный замысел, что третий аргумент
функции addEventListener() должен от чего-то зависеть,
да ещё и приколачивать ссылку на боди (if any) в _handlers?
Убери content.document.body

Отсутствует

 

№1478429-06-2020 23:24:16

solombala
Забанен
 
Группа: Members
Зарегистрирован: 20-07-2019
Сообщений: 652
UA: Firefox 78.0

Re: Custom Buttons

Dumby
Гуд...Не в курсе, что там с поисковиками понакрутили?  Вставляю от 77 search-extensions и не фига...Google и Mailru , а остальные не того...
И youtube - cходу запускается, автовоспроизведение - прибито (5) , что за мансы?

Отредактировано solombala (29-06-2020 23:27:54)

Отсутствует

 

№1478530-06-2020 09:24:58

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

Re: Custom Buttons

solombala пишет

Не в курсе, что там с поисковиками понакрутили?  Вставляю от 77 search-extensions и не фига...Google и Mailru , а остальные не того...

Откуда же, я таким не занимаюсь.
Дефолтное значение настройки browser.search.modernConfig изменили.
Если имеется в виду папка resource:///chrome/browser/search-extensions/
то, если её выложишь, тогда попробую подменить, посмотрю в консоль,
может что-нибудь обнаружится. Без эксперимента на практике никак.

Отсутствует

 

№1478630-06-2020 10:46:10

solombala
Забанен
 
Группа: Members
Зарегистрирован: 20-07-2019
Сообщений: 652
UA: Firefox 78.0

Re: Custom Buttons

Dumby

Dumby пишет

Дефолтное значение настройки browser.search.modernConfig изменили.

Уй, хвала!  Не постоje речи!

Отсутствует

 

№1478701-07-2020 09:27:05

Duche
Участник
 
Группа: Members
Зарегистрирован: 07-02-2016
Сообщений: 208
UA: Firefox 60.0

Re: Custom Buttons

Добрый день. Просьба починить код кнопки, под FF60.0 ESR . С тройной функцией кнопки 1-е, исходное-"Без прокси" , 2-е, нажатие-"Ручная настройка прокси", 3-е ,нажатие-"URL автоматической настройки прокси" . Сама кнопка работает ,но при нажатии не меняет отображение состояния на самой кнопке, там под каждое состояние своя иконка и сама иконка блёклая.
Заранее спасибо.

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

Выделить код

Код:

/*Initialization Code*/

// 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/png;base64,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'; break;
      case 2: icon.src = 'data:image/gif;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"));

Отсутствует

 

№1478801-07-2020 09:37:39

sonyas75
Участник
 
Группа: Members
Откуда: Ставрополь
Зарегистрирован: 22-03-2011
Сообщений: 557
UA: Firefox 78.0

Re: Custom Buttons

о, кстати, да. у меня тоже кнопка "прокси" не совсем работает. ну свои функции выполняет штатно, то есть переключает настройки прокси, а остальное так себе. при попытке открыть настройки прокси выводит вот такое
a80cc62290829ca4dd5d05a417ec1547.png
саму кнопку взял ессно из этой темы, она столько раз менялась, конкретную редакцию кнопки даже не помню, код такой

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

Выделить код

Код:

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

    if (e.button == 0) // длинный левый клик
        self.timer = setTimeout(() => {
            self.onmouseup = null;
            cbu.getPrefs("CB.Proxy.connectionsInTab")
                ? openConnectionsInTab() : openConnections();
        }, 500);

    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);
    }
}
// правый клик
this.oncontextmenu = e => e.detail == 2 && !menuPopup.hidePopup()
    || e.ctrlKey || !!menuPopup.openPopup(this, "after_start");


// Подсказка для кнопки ...................
this.onmouseover = () => this.tooltipText =
    "Proxy \nЛ:  Переключить прокси \nДЛ: Открыть настройки прокси" +
    "\nП:  Mеню кнопки \nДП: CB меню \n\nТекущие настройки прокси: " +
    "\nIP: " + cbu.getPrefs("network.proxy.http") + "\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.createElementNS(xulns, "menupopup"));
array.forEach(m => {
    var mItem = document.createElementNS(xulns, "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());


var listenClick = win => {
    var args = ["click", win.close.bind(win), true];
    var unload = () => gBrowser.removeEventListener(...args);
    gBrowser.addEventListener(...args);
    win.addEventListener("unload", unload, {once: true});
}
var version = parseInt(Services.appinfo.platformVersion);
var url = `chrome://browser/content/preferences/connection.x${version >= 72 ? "htm" : "u"}l`;

var fox73 = version >= 73, noop = () => {};
if (fox73) var grid = win => {
    var url = "data:text/css;charset=utf-8," + encodeURIComponent(`
        #proxy-grid, #dnsOverHttps-grid {
            display: grid;
            grid-template-columns: auto 1fr;
            align-items: center;
        }
        #proxy-grid > .thin {
            grid-column-end: 3;
            height: 20px;
        }
        #dnsOverHttps-grid.custom-container-hidden #networkCustomDnsOverHttpsInput,
        #dnsOverHttps-grid.custom-container-hidden #networkCustomDnsOverHttpsInputLabelContainer {
            display: none;
        }
    `);
    (grid = win => win.windowUtils.loadSheetUsingURIString(url, win.windowUtils.AUTHOR_SHEET))(win);
}
var winOpen = win => win.addEventListener("readystatechange", winReady, {once: true, capture: true});
var winReady = e => {
    var win = e.target.ownerGlobal, cw = win.isChromeWindow;
    if (cw || (win.location == url && !win.docShell.name)) winPatch(win, cw);
}
var winPatch = (win, cw) => {
    win.opener = {gSubDialog: {_dialogs: [{
        _frame: {get contentDocument() {
            cw && listenClick(win);
            delete this.contentDocument;
            return this.contentDocument = win.document;
        }},
        resizeVertically: cw ? () => win.sizeToContent() : noop
    }]}};
    fox73 && grid(win);
}
addEventListener("MozBeforeInitialXULLayout", winReady, false, gBrowser.tabpanels || 1);

for(var {contentWindow: win} of gBrowser.browsers)
    win && win.location == url && !win.opener && winPatch(win);


// Функция открывает настройки прокси в окне ...................  
function openConnections() {
    var win = [...Services.wm.getEnumerator(null)].find(w => w.location == url);
    win ? win.focus() : winOpen(openDialog(url, "Proxy", "centerscreen"));
}

// Функция открывает настройки прокси в вкладке ...................
function openConnectionsInTab() {
    var connections = gBrowser.getBrowserForTab(
        gBrowser.selectedTab = gBrowser.addTrustedTab(url)
    );

    // oбработчик ждет пока откроется прокси, удаляет себя и добавляет атрибут
    connections.addEventListener("pageshow",
        e => e.target.documentElement.setAttribute("type", "prefwindow")
    , {once: true});
}


// Установливать нужную иконку кнопки при старте баузера или при изменениях в 'about:config' ...................
var s = "network.proxy.type";
function toggleImage() {
    var {icon} = self;
    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();
Services.prefs.addObserver(s, toggleImage, false);
addDestructor(() => Services.prefs.removeObserver(s, toggleImage));


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


// Создаем меню для добавление прокси в контекстном меню выделенного текста на странице ...................
var contextMenu = document.getElementById("contentAreaContextMenu");
var menuitem = document.createElementNS(xulns,"menuitem");
menuitem.setAttribute("label", "Добавить прокси");
menuitem.setAttribute("class", "menuitem-iconic");
menuitem.setAttribute("image", self.image);
menuitem.onclick =()=> addNewProxy(menuitem);
contextMenu.appendChild(menuitem); // как последний пункт меню
addDestructor(() => menuitem.remove());
addEventListener("popupshowing", () => {
    menuitem.hidden = !cbu.getPrefs("CB.Proxy.inContextMenu") || !gContextMenu.isContentSelected; // !gContextMenu.isTextSelected;
}, false, contextMenu);


// добавление прокси ...................
function addNewProxy(menuitem) {
    var sel = gBrowser.contentDocument
        ? gBrowser.contentDocument.defaultView.getSelection().toString() // Pale Moon  
        : gContextMenu.selectionInfo.fullText; // Firefox

    sel = sel.replace(/^\s+|\s+$/g, ""); // удалить пробелы, слева и справа от строки
    sel = sel.replace(/\s+/g, ":");      // заменить пробелы внутри строки

    // если только порт ...
    if (sel.length < 6 && isFinite(sel)) { 
        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 arr = sel.split(":"), IP = arr[0], port = arr[1];
        cbu.setPrefs("network.proxy.http_port", +port);
        cbu.setPrefs("network.proxy.http", convertFromUnicode("UTF-8", IP));
    }

    // всплывающая подсказка рядом с выделенным текстом ...
    var mainPopupSet = document.getElementById('mainPopupSet');
    var tooltip = mainPopupSet.appendChild(document.createElementNS(xulns,"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.createElementNS(xulns, "image"));
    image.setAttribute("src", self.image);

    var label = tooltip.appendChild(document.createElementNS(xulns, "label"));
    label.setAttribute("value", "Установлен " + lab + " прокси: " + sel);

    tooltip.openPopup(menuitem.parentNode, "before_start");
    setTimeout(() => mainPopupSet.removeChild(tooltip), 3000);
};


// Конвертировать текст в юникод .............  
function convertFromUnicode(charset, str) {
    var converter = Cc["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(Ci.nsIScriptableUnicodeConverter);
    converter.charset = charset;
    str = converter.ConvertFromUnicode(str);
    return str + converter.Finish();
}

FF 78 ESR

Отредактировано sonyas75 (01-07-2020 09:38:42)

Отсутствует

 

№1478901-07-2020 09:43:35

Black_Monk
Участник
 
Группа: Members
Зарегистрирован: 18-02-2012
Сообщений: 195
UA: Firefox 78.0

Re: Custom Buttons

На 78 версии перестал работать Custom Buttons (custom_buttons-0.0.7.0.0.9-fx-paxmod). Хотя в дополнениях значится. Все кнопки исчезли. На попытку добавить новую кнопку выходит вот это:
5a85a8c42bc7t.jpg
Может кто знает как исправить?


Windows 10 LTSC

Отсутствует

 

№1479001-07-2020 09:47:18

vending_machine
Участник
 
Группа: Members
Зарегистрирован: 10-01-2020
Сообщений: 549
UA: Firefox 78.0

Re: Custom Buttons

Black_Monk пишет

Может кто знает как исправить?

https://forum.mozilla-russia.org/viewto … 38#p782238

Отсутствует

 

№1479101-07-2020 09:56:27

Black_Monk
Участник
 
Группа: Members
Зарегистрирован: 18-02-2012
Сообщений: 195
UA: Firefox 78.0

Re: Custom Buttons

vending_machine пишет

https://forum.mozilla-russia.org/viewto … 38#p782238

Не помогло... Всё по прежнему не работает...:(


Windows 10 LTSC

Отсутствует

 

№1479201-07-2020 10:19:38

vending_machine
Участник
 
Группа: Members
Зарегистрирован: 10-01-2020
Сообщений: 549
UA: Firefox 78.0

Re: Custom Buttons

Black_Monk пишет
vending_machine пишет

https://forum.mozilla-russia.org/viewto … 38#p782238

Не помогло... Всё по прежнему не работает...:(

Надо очистить startupCache из локального каталога и перегрузить [firefox]

Отредактировано vending_machine (01-07-2020 10:20:07)

Отсутствует

 

№1479301-07-2020 10:49:15

Black_Monk
Участник
 
Группа: Members
Зарегистрирован: 18-02-2012
Сообщений: 195
UA: Firefox 78.0

Re: Custom Buttons

vending_machine пишет

Надо очистить startupCache из локального каталога и перегрузить

Ура, заработало! Сенькаю! :cool:

p.s. Как же надоело всё налаживать при переходе на новую версию. :mad: Иногда начинаешь понимать тех знакомых, которые ненавидят Мозиллу...:lol:


Windows 10 LTSC

Отсутствует

 

№1479401-07-2020 12:00:31

thrower
Участник
 
Группа: Members
Зарегистрирован: 28-11-2013
Сообщений: 207
UA: Firefox 68.0

Re: Custom Buttons

del

Отредактировано thrower (01-07-2020 12:27:13)

Отсутствует

 

№1479501-07-2020 15:57:08

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

Re: Custom Buttons

Duche пишет

Сама кнопка работает ,но при нажатии не меняет отображение состояния на самой кнопке, там под каждое состояние своя иконка и сама иконка блёклая.

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

Выделить код

Код:

...
                    //+ "\nIP: " + Services.prefs.getComplexValue("network.proxy.http", Ci.nsISupportsString).data
                    + `\nIP: ${Services.prefs.getStringPref("network.proxy.http") || "< empty string >"}`
...

//gPrefService.addObserver(s, toggleImage, false);
//addDestructor(()=> gPrefService.removeObserver(s, toggleImage) );
Services.prefs.addObserver(s, toggleImage);
addDestructor(() => Services.prefs.removeObserver(s, toggleImage));

sonyas75 пишет

при попытке открыть настройки прокси выводит вот такое

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

Выделить код

Код:

//var url = `chrome://browser/content/preferences/connection.x${version >= 72 ? "htm" : "u"}l`;
var url = `chrome://browser/content/preferences/${version >= 77 ? "dialogs/" : ""}connection.x${version >= 72 ? "htm" : "u"}l`;

Отсутствует

 

№1479601-07-2020 15:59:55

sonyas75
Участник
 
Группа: Members
Откуда: Ставрополь
Зарегистрирован: 22-03-2011
Сообщений: 557
UA: Firefox 78.0

Re: Custom Buttons

Dumby пишет

sonyas75 пишет

заработало! спасибо большое :)

Отсутствует

 

№1479701-07-2020 18:00:53

Duche
Участник
 
Группа: Members
Зарегистрирован: 07-02-2016
Сообщений: 208
UA: Firefox 38.0

Re: Custom Buttons

Dumby пишет

Сама кнопка работае


Работает. Dumby  примите искреннюю благодарность.

Отсутствует

 

№1479801-07-2020 21:14:48

unter_officer
Участник
 
Группа: Members
Откуда: Санкт-Петербург
Зарегистрирован: 27-03-2011
Сообщений: 596
UA: Firefox 52.0

Re: Custom Buttons

Вопрос не совсем по теме.
Возможность назначать для определенных сайтов свой UserAgent в крайних версиях [firefox] выпилили окончательно?
Теперь для этого придется использовать только дополнения или все-таки возможно как-то реализовать это с помощью СВ?


«The Truth Is Out There»

Отсутствует

 

№1479901-07-2020 22:40:50

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

Re: Custom Buttons

Dumby что-то на 78 кнопка - консоль браузера не хочет работать.
Выдает ошибку:   Uncaught (in promise) TypeError: Cu.isCrossProcessWrapper is not a function)        в строчке         if (!doc || Cu.isCrossProcessWrapper(doc) || doc.documentURI != this.url) return;

Отсутствует

 

№1480002-07-2020 21:32:46

solombala
Забанен
 
Группа: Members
Зарегистрирован: 20-07-2019
Сообщений: 652
UA: Firefox 78.0

Re: Custom Buttons

Dumby
Недьзя код рестарта подрихтовать? папки создаются при перезапуске в user/администратор , как будто это не портабл...

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

Выделить код

Код:

var appStartup = Components.classes["@mozilla.org/toolkit/app-startup;1"]
.getService(Components.interfaces.nsIAppStartup);
var num = gBrowser.browsers.length;
var dlg = "Есть открытые вкладки !"  + "\nПерезапустить браузер ?";
if (num > 0) {
var prompts = Components.classes["@mozilla.org/embedcomp/prompt-service;1"]
.getService(Components.interfaces.nsIPromptService);

Services.appinfo.invalidateCachesOnRestart();

var RestartProceed = prompts.confirm(null, "", dlg);
if (RestartProceed) {
appStartup.quit(appStartup.eForceQuit | appStartup.eRestart);
 
}
}
else
appStartup.quit(appStartup.eForceQuit | appStartup.eRestart);


может рестарт это не учитывает? MOZ_LEGACY_PROFILES=1
Можно батником, как запустить с восстановлением вкладок?
И еще, как наэтот код предупредиловку сделать?
var file = Services.dirsvc.get('ProfD', Ci.nsIFile);
         file.initWithPath(file.path + "\\memreduct\\del.vbs");
file.launch();

Отредактировано solombala (02-07-2020 23:48:09)

Отсутствует

 

Board footer

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