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

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

№1427611-02-2020 19:27:42

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

Re: Custom Buttons

shadow_user пишет
vending_machine пишет

А paxmod.xpi установился, но не видно самой кнопки расширения.

У меня тоже только этот установился.  Так у Custom Buttons нет и никогда не было собственной кнопки для панели инструментов, если ты об этом. Но в списке расширений должен присутствовать и даже иметь собственный раздел с кнопками.

Присутствует, но и только. Нет окошка, какого-либо, куда вводить код.
VWMY0cT.png

Отсутствует

 

№1427711-02-2020 20:06:25

shadow_user
Участник
 
Группа: Members
Зарегистрирован: 14-02-2007
Сообщений: 244
UA: Firefox 68.0

Re: Custom Buttons

vending_machine пишет

Нет окошка, какого-либо, куда вводить код.

Не там смотришь. ПКМ на панели инструментов, панели вкладок, строке меню -> Добавить новую кнопку...

Отсутствует

 

№1427811-02-2020 20:15:45

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

Re: Custom Buttons

shadow_user пишет
vending_machine пишет

Нет окошка, какого-либо, куда вводить код.

Не там смотришь. ПКМ на панели инструментов, панели вкладок, строке меню -> Добавить новую кнопку...

Всё равно оно какое-то кривое. Не реагирует на клик:sick:

скрытый текст
cMzm3LI.gif

Отсутствует

 

№1427911-02-2020 20:40:05

shadow_user
Участник
 
Группа: Members
Зарегистрирован: 14-02-2007
Сообщений: 244
UA: Firefox 68.0

Re: Custom Buttons

Значит, не работает эта версия Custom Buttons на твоей версии Firefox. Попроси, чтобы тебе сгенерировали новую версию (9->10), может, поможет. Окно должно выглядеть так
https://jpegshare.net/d3/9f/d39f8e43e3e … a.png.html

Отсутствует

 

№1428011-02-2020 21:00:33

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

Re: Custom Buttons

shadow_user пишет

Значит, не работает эта версия Custom Buttons на твоей версии Firefox.

Она работает:

скрин
85c6c0237aba.png

видимо он что то не так сделал.


Win7

Отсутствует

 

№1428111-02-2020 22:00:26

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

Re: Custom Buttons

Andrey_Krropotkin пишет

подскажи насчет диалоговых окон для 73

В Firefox 73, всё связанное с XUL-документом уничтожено окончательно,
и не осталось ни одного документа с адресом, заканчивающимся на «.xul»

Поэтому, примерно так

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

Выделить код

Код:

//var url = "data:application/vnd.mozilla.xul+xml;text/plain," + encodeURIComponent(data);
//if (parseInt(Services.appinfo.platformVersion) >= 69 && Services.appinfo.browserTabsRemoteAutostart) {

var pv = parseInt(Services.appinfo.platformVersion);
var url = `data:application/${pv >= 73 ? "xhtm" : "vnd.mozilla.xu"}l+xml,${encodeURIComponent(data)}`;
if (pv >= 69 && Services.appinfo.browserTabsRemoteAutostart) {

Отсутствует

 

№1428211-02-2020 23:20:58

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

Re: Custom Buttons

Dumby спасибо работает и еще вопрос, вот есть код для менеджера паролей (для текущего сайта)

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

Выделить код

Код:

var eTLDsvc = Cc["@mozilla.org/network/effective-tld-service;1"].
              getService(Ci.nsIEffectiveTLDService);
var eTLD;
var uri = gBrowser.currentURI;
try {
  eTLD = eTLDsvc.getBaseDomain(uri);
} catch (e) {
  eTLD = uri.asciiHost;
}

var win = Cc["@mozilla.org/appshell/window-mediator;1"]
            .getService(Ci.nsIWindowMediator)
            .getMostRecentWindow("Browser:Cookies");
if (win) {
  win.gCookiesWindow.setFilter(domain);
} else {
  openDialog("chrome://passwordmgr/content/passwordManager.xhtml",
             "Toolkit:PasswordManager", "", {filterString: eTLD});
}


а как сделать то же самое для about:logins (Firefox Lockwise) в новой вкладке

Отредактировано Andrey_Krropotkin (11-02-2020 23:23:06)

Отсутствует

 

№1428312-02-2020 00:14:03

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

Re: Custom Buttons

Dumby
Где-то вопрос уже задавался, не найду. Со вставкой текста по СКМ можешь помочь? Чтобы вставляемый текст заменял  выделенный, а не во внутрь его.

Отсутствует

 

№1428412-02-2020 00:29:23

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

Re: Custom Buttons

Dumby
Добавить закладку кнопка того ...Xul/Xhtml , короче , черт те поймет..

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

Выделить код

Код:

/*Initialization Code*/
((popup, {lastChild} = popup, pref = "CB.bookmarks") =>
addDestructor(reason => reason == "delete" && Services.prefs.clearUserPref(pref)) +
addEventListener("popupshowing", {
    index: 0, // 0 - первой, PlacesUtils.bookmarks.DEFAULT_INDEX - последней
    width: 500,
    height: 640,
    nodePosition: .35,
    handleEvent(e) {
        if (this.shouldHide) return;
        var menuitem = document.createElementNS(xulns, "menuitem");
        menuitem.id = "context-addBookmark";
        menuitem.className = "menuitem-iconic";
        menuitem.setAttribute("image", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACD0lEQVR42oWTXUhTYRiAP89qziAYepG6TfAiyV1JsFojMJrVjf3dDOsmMoOwCwnSXLSJXgWDqAWBF7aGoFGGV0EUrL9FERoh1bQsqeiXfrzoB0N6es8528ncaC88fOfwnff53vN976eUUprafJk8lPIKS1XRkI8LRVayUVgmLBFsQklBwfhb8rAkRauSidQLDK49/zvqFKmqxBKcn4BzDzBGnU39BVZfTMOxQ6ZIXk6msdh7wUz+9IP/RraaLYYgfAUL73Fz8tJjs5rBh3B2HPrvQ/P+N8TvYJAVdBqCfRcxWH8aYm0dpCIRxvr6SG7bSWLrDsZ6e7ke7SESaiV61UoeFVoMwfYEBrGWNr6NjEAmY5JKmUxPw9QU35NJDq/ekBOcEqoNQSAOnh5Ih0IwPAwJsQ0MSP2DMDTEfDTKV7+f904nN12uBavr/SECZ6dZ1u11Aejqgu5u2ZAwv9vbmfP5mLXZeK0UrzSNGy53bnWXdYw6K47CEX8znwMB5oNBvtTX87G0lA+SmEueqazkYHWdLtgl1OVaybvwfPd41vLI42HGbicjiZPCy7IyntTUcKBqpZ58Iru61dZ6a64RwkJMmGi022dv1dbyrKKCp+XlpOW5yeH4KXPvhMbs3fgndJtDqDJ3VjX4NO3MqNs9J/xapWn3sv/dlJfcGr+rFbijunC5EBQ6hN2C27j6i+IP/uDMhPNYgHUAAAAASUVORK5CYII=");
        menuitem.setAttribute("oncommand", "linkedObject.oncommand(event);");
        menuitem.linkedObject = this;
        menuitem.oncontextmenu = e => this.pick(e.preventDefault());

        lastChild.after(menuitem);
        addDestructor(() => menuitem.remove());
        (this.handleEvent = e => e.target == popup
            && !(menuitem.hidden = this.shouldHide)
            && this.update(menuitem)
        )(e);
    },
    ons: ["isContentSelected", "onTextInput", "onImage", "onVideo", "onCanvas", "onAudio"],
    get shouldHide() {
        if (gContextMenu.onLink) return false;
        return this.ons.some(on => gContextMenu[on]);
    },
    oncommand(e) {
        this[e.ctrlKey || e.shiftKey ? "pick" : "bookmark"](e.target);
    },
    get guid() {
        return Services.prefs.getStringPref(pref, PlacesUtils.bookmarks.toolbarGuid);
    },
    async update(menuitem) {
        var info = await PlacesUtils.bookmarks.fetch(this.guid);
        var title = PlacesUtils.bookmarks.getLocalizedTitle(info);
        menuitem.label = "Добавить закладку в: " + (
            menuitem.folderName = title || "[без заголовка]"
        );
    },
    pick() {
        var features = "chrome,all,resizable,centerscreen,modal";
        window.openDialog(this.url, "_blank", features, this.guid);
    },
    bookmark({folderName}) {
        if (gContextMenu.onLink) {
            var url = gContextMenu.linkURL;
            var title = gContextMenu.linkText();
        } else {
            var url = gBrowser.currentURI.spec;
            var title = gBrowser.contentTitle || gBrowser.selectedTab.label;
        }
        var info = {url, title, parentGuid: this.guid, index: this.index};
        PlacesUtils.bookmarks.insert(info).then(
            () => this.notify(title, "Добавил закладку в папку: " + folderName),
            err => this.notify("Ошибка", err)
        );
    },
    get alert() {
        var as = this.as = Cc["@mozilla.org/alerts-service;1"]
            .getService(Ci.nsIAlertsService);
        this.alertName = _id + "-bookmark-alert";
        delete this.alert;
        return this.alert = as.showAlertNotification
            .bind(as, "chrome://global/skin/icons/warning.svg");
    },
    notify(title, msg) {
        this.alert(title, msg, false, null, null, this.alertName);
        setTimeout(() => this.as.closeAlert(this.alertName), 1800);
    },
    get url() {
        var xul =
            `<?xml version="1.0"?>
            <?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
            <?xml-stylesheet href="chrome://browser/content/places/places.css"?>
            <?xml-stylesheet href="chrome://browser/skin/places/places.css"?>
            <?xml-stylesheet href="chrome://browser/skin/places/tree-icons.css"?>
            <dialog xmlns="${xulns}"
                id="bookmark-folder-saver-dialog"
                windowtype="bookmark-folder-saver:dialog"
                title="Выберите папку"
                buttons="accept,cancel"
                onload="init();"
                width="${this.width}"
                height="${this.height}">

                <script type="application/javascript" src="chrome://global/content/globalOverlay.js"/>
                <script type="application/javascript" src="chrome://browser/content/utilityOverlay.js"/>
                <script type="application/javascript"><![CDATA[
                    ChromeUtils.defineModuleGetter(window, "PlacesUtils", "resource://gre/modules/PlacesUtils.jsm");
                    ChromeUtils.defineModuleGetter(window, "PlacesUIUtils", "resource:///modules/PlacesUIUtils.jsm");
                    ChromeUtils.defineModuleGetter(window, "PlacesTransactions", "resource://gre/modules/PlacesTransactions.jsm");
                    ChromeUtils.import("resource://gre/modules/XPCOMUtils.jsm");
                    XPCOMUtils.defineLazyScriptGetter(window, "PlacesTreeView", "chrome://browser/content/places/treeView.js");
                    XPCOMUtils.defineLazyScriptGetter(
                        window,
                        ["PlacesInsertionPoint", "PlacesController", "PlacesControllerDragHelper"],\n\
                        "chrome://browser/content/places/controller.js"\n\
                    );
                ]]></script>
                <script type="application/javascript" src="chrome://browser/content/places/places-tree.js"/>

                <tree id="tree" type="places" is="places-tree"
                    place="place:type=${
                        Ci.nsINavHistoryQueryOptions.RESULTS_AS_ROOTS_QUERY
                    }&amp;excludeItems=1&amp;excludeQueries=1"
                    hidecolumnpicker="true" seltype="single" flex="1">
                    <treecols>
                        <treecol id="title" flex="1" primary="true" hideheader="true" />
                    </treecols>
                    <treechildren />
                </tree>
                <script type="application/javascript"><![CDATA[
                    var tree = document.getElementById("tree");
                    function init() {
                        tree.selectItems([window.arguments[0]]);
                        var ind = tree.view.selection.currentIndex;
                        ind != -1 && setTimeout(() => {
                            if ("nsITreeBoxObject" in Ci) {
                                var tbo = tree.treeBoxObject;
                                var visibleRows = tbo.height/tbo.rowHeight;
                            } else {
                                var tbo = tree;
                                var visibleRows = tbo.getPageLength();
                            }
                            var cur = tbo.view.selection.currentIndex;
                            var first = tbo.getFirstVisibleRow();
                            var newFirst = cur - ${this.nodePosition}*visibleRows + 1;
                            tbo.scrollByLines(Math.round(newFirst - first));
                        }, 0);
                        var onKeydown = e => e.ctrlKey && e.key == "Enter" && !e.shiftKey
                            && document.documentElement.acceptDialog(e.stopPropagation());
                        addEventListener("keydown", onKeydown, true);
                        addEventListener("dialogaccept", dialogCallback);
                        window.onunload = () => {
                            removeEventListener("keydown", onKeydown, true);
                            removeEventListener("dialogaccept", dialogCallback);
                        }
                    }
                    function dialogCallback() {
                        var ind = tree.view.selection.currentIndex;
                        if (ind == -1) return;
                        var item = tree.view.nodeForTreeIndex(ind);
                        item && Services.prefs.setStringPref(
                            "${pref}", PlacesUtils.getConcreteItemGuid(item)
                        );
                    }
                ]]></script>
            </dialog>`;
        var url, type = "application/vnd.mozilla.xul+xml";
        if (parseInt(Services.appinfo.platformVersion) >= 69 && Services.appinfo.browserTabsRemoteAutostart) {
            url = `chrome://custombuttons/content/cbfolderpicker${Date.now()}.xul`;
            var ams = Cc["@mozilla.org/addons/addon-manager-startup;1"].getService(Ci.amIAddonManagerStartup);
            this.helper = ams.registerChrome(
                Services.io.newFileURI(Services.dirsvc.get("ProfD", Ci.nsIFile)),
                [["override", url, `data:${type},${encodeURIComponent(xul)}`]]
            );
            addDestructor(this.helper.destruct);
        } else {
            url = URL.createObjectURL(new Blob([xul], {type}));
            addDestructor(() => URL.revokeObjectURL(url));
        }
        delete this.url; return this.url = url;
    }
}, false, popup || 1))(document.getElementById("contentAreaContextMenu"));

Отсутствует

 

№1428512-02-2020 01:42:10

func4ptch4
Участник
 
Группа: Members
Зарегистрирован: 03-05-2018
Сообщений: 220
UA: Firefox 75.0

Re: Custom Buttons

Dumby, можете посмотреть №14256, пробовал через запятой и кавычки, походу там код написан на одно действие? и хотел сюда готовый пак залить config, только не понял как залить на put.re

Отсутствует

 

№1428612-02-2020 10:59:33

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

Re: Custom Buttons

Andrey_Krropotkin пишет

как сделать то же самое для about:logins (Firefox Lockwise) в новой вкладке

Сомневаюсь, что ты не знаешь как открыть
новую вкладку с адресом вида about:logins?filter=example.com
Значит давай код, и, может, ситуация прояснится.
С указанием того, что именно вызывает затруднение, разумеется.

voqabuhe пишет

Со вставкой текста по СКМ можешь помочь?

Нет, не думаю. Описание такой хотелки должно быть очень подробным и большим.
Выканючивать его, с моей стороны, было бы неправильно, ведь если распишешь,
а я всё равно не смогу сделать, то будет обидно, типа зря старался, объяснял.
Впрочем, может попробую что-нибудь сочинить под middlemouse.paste = true
и для user_chrome_files, если у тебя развёрнуто.

solombala пишет

Xul/Xhtml , короче , черт те поймет..

Неужели так тяжело заменить vnd.mozilla.xu на xhtm

func4ptch4 пишет

можете посмотреть №14256

Да, видел. Показалось, что я не понял что требуется.
Хотя, под это: «как сделать чтобы, несколько аддонов отключить?»
вроде должен подходить код типа

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

Выделить код

Код:

var opt = {allowSystemAddons: true};
var args = [addon => addon.disable(opt), Cu.reportError];
for(var id of [

    "{ae3cc3e4-1091-48d0-91e0-446601bc2e22}",
    "webcompat-reporter@mozilla.org",
    "{801ff3eb-b13e-4f18-86c7-da231710b8f5}",
    "{cdfc901b-b110-4086-8f14-b8a2966cb6b9}",
])
    AddonManager.getAddonByID(id).then(...args);

func4ptch4 пишет

хотел сюда готовый пак залить config, только не понял как залить на put.re

put.re перестал работать для меня, пишет «Uploading disabled»,
а то и сам бы воспользовался. Может на upload.ee попробуй,
он довольно популярен, и для скачивания дружественный.

Отсутствует

 

№1428712-02-2020 11:27:31

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

Re: Custom Buttons

voqabuhe пишет

Со вставкой текста по СКМ можешь помочь? Чтобы вставляемый текст заменял  выделенный, а не во внутрь его.

Я как раз тоже питаюсь сделать такой код, но пока застрял на блокировке по умолчанию для события click. Вот mousedown если его загрузить через loadFrameScript отлично блокируется, а click нет. Ну там и других проблем хватает. Вот может кому надо:

Выделить код

Код:

// Ставить текст в текстовое поле .............
function insertText(text) {
   var docShell = "docShell" in document
                  && document.docShell instanceof Ci.nsIDocShell
                  ? document.docShell : window.docShell;
                  
   function insert(text) {
      var params = "createCommandParams" in Components.utils
                    ? Cu.createCommandParams()
                    : Components.classes["@mozilla.org/embedcomp/command-params;1"].createInstance(Components.interfaces.nsICommandParams);
      params.setStringValue("state_data", text);
      docShell.doCommandWithParams("cmd_insertText", params);
   };

   var br = document.activeElement;
   !br || br.localName != "browser" || !br.isRemoteBrowser
   ? insert(text) 
   : br.messageManager.loadFrameScript(`data:,(${insert})(`+encodeURIComponent(text.toSource())+`)`, false, true);
};
insertText(gClipboard.read());

Добавлено 12-02-2020 11:31:27
Но без СКМ!

Отредактировано bunda1 (12-02-2020 11:31:27)

Отсутствует

 

№1428812-02-2020 11:40:01

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

Re: Custom Buttons

Dumby

Dumby пишет

Неужели так тяжело заменить vnd.mozilla.xu на xhtm

А то не менял...Никак. А, вот так заработало без гемморов.

скрытый текст
{type: "application/xhtml+xml"}

Отредактировано solombala (12-02-2020 12:18:49)

Отсутствует

 

№1428912-02-2020 20:21:29

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

Re: Custom Buttons

Dumby пишет

Описание такой хотелки должно быть очень подробным и большим.

Ну речь о том, что делала кнопка от bunda1 №14231

Dumby пишет

Впрочем, может попробую что-нибудь сочинить под middlemouse.paste = true
и для user_chrome_files, если у тебя развёрнуто.

Да любыми способами, я на всё согласен, лишь бы вставляла. :)

bunda1 пишет

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

Это радует, что работа кипит и даёт надежду.

bunda1 пишет

Вот может кому надо:

Что-то у меня ничего не изменилось, всё равно вставляет во внутрь существующего текста.

Отсутствует

 

№1429012-02-2020 21:53:46

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

Re: Custom Buttons

voqabuhe пишет

Что-то у меня ничего не изменилось, всё равно вставляет во внутрь существующего текста.

Это код для вставки текста из кнопки по клику или из меню кнопки, по СКМ он не должен работать. Пытался его запускать по СКМ:

Выделить код

Код:

(()=> {        
   var code = `
      function handleEvent(e) {
         if (e.button != 1) return;
         e.preventDefault();
         e.stopPropagation();          
          
         sendSyncMessage("response",{},{});
      }
      addEventListener('mousedown', handleEvent, false);
       
      function removeListener() {
         removeMessageListener("destroy", removeListener);
         removeEventListener("mousedown", handleEvent, false);
      }
      addMessageListener("destroy", removeListener);
   `;
    
    
   var url = "data:," + encodeURIComponent(code);
   var mm = window.getGroupMessageManager("browsers");
   mm.loadFrameScript(url, true);

   function run(message) {
      insertText(gClipboard.read());
      Services.console.logStringMessage(message.name);
   }
   mm.addMessageListener("response", run);


   addDestructor(() => {
      mm.removeDelayedFrameScript(url);
      mm.broadcastAsyncMessage("destroy");
      mm.removeMessageListener("response", run);
   });
})();


// Ставить текст в текстовое поле .............
function insertText(text) {
   var docShell = "docShell" in document
                  && document.docShell instanceof Ci.nsIDocShell
                  ? document.docShell : window.docShell;
                  
   function insert(text) {
      var params = "createCommandParams" in Components.utils
                    ? Cu.createCommandParams()
                    : Components.classes["@mozilla.org/embedcomp/command-params;1"].createInstance(Components.interfaces.nsICommandParams);
      params.setStringValue("state_data", text);
      docShell.doCommandWithParams("cmd_insertText", params);
   };

   var br = document.activeElement;
   !br || br.localName != "browser" || !br.isRemoteBrowser
   ? insert(text)
   : br.messageManager.loadFrameScript(`data:,(${insert})(`+encodeURIComponent(text.toSource())+`)`, false, true);
};;

Но не получается заблокировать действие СКМ по умолчанию. А с click вобще не работает. Не понятно в чём дело. Может кто подскажет?

Отсутствует

 

№1429113-02-2020 00:15:34

func4ptch4
Участник
 
Группа: Members
Зарегистрирован: 03-05-2018
Сообщений: 220
UA: Firefox 75.0

Re: Custom Buttons

FF72-3 CustomButtons
Сразу пак, чтобы не искать и не перепаковывать, просто разархивируйте и по папкам.
upload.ee/files/11121542/config.rar


Dumby, а этот код работает только в одну сторону? на откллючение, как сделать чтобы в обе нажал откючилось, снова включилась.
Сам виноват, написал только на отключение, но функций у того кода были в обе стороны.
addon.disable||addon.userDisabled?"enable":"disable|| пробовал эти параметры по разному, что-то не получается

Вроде сделал, можешь проверить на ошибки? все ли правильно? внутри [] может быть еще такая конструкция? [[]] как то меня это смущает.
var args=[addon=>addon[addon.userDisabled?"enable":"disable"]({allowSystemAddons:true}),Cu.reportError];
for(var id of["{cdfc901b-b110-4086-8f14-b8a2966cb6b9}","...","..."])AddonManager.getAddonByID(id).then(...args);

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

Выделить код

Код:

/*Initialization Code*/self.label="SwitchAddons[Fx]";self.image="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABy0lEQVQ4jbWTz2sUMRiGn2Qmmewy47LLzir0D1BaQYUea/EwBQ9OFNuoFF2x0kHwoKgnLwYsXr0LHvQgKhbBivSk0n8sXjYlXdijuX3J+7xf3vyA/zCuAB+Brq7rM13XKe99HkIQieYysJFCfeAB8Bq4CvwdDAarRVE8Vkq9zbKsBWpgF3gGXAJupKZPgArAey+Vyv8sLdUXrbWV914Cz4EjYBiBLMtuee/zWN+NsLW2Kgp9OJlMLsxggC3gfRR776UxZtp1nYpzt0MIwlpbNU0z0FofFkVxNom4CXxImxhjdtIdbDvnek3TDKy1lRDiF3AuMbgGfIlw0zQDY8zO8RkopXbbtu0nmX8Ay4lBK4T4HmFrbZVl2fR4VSnVOed6SeZPwEpyYK3W+iDCM9291OD+3D3vA+dj5rIsN4tCHyQwJwyAbU6Ob8BKzFyW5ZbWej+BAaYpMG/wWWu9HDNXVXVdSvl1TjNdVNRCiKOyLO/EzHmerwM/E80IeJrGfgisAq+klC/H4/HqcDhcM8bsSSlfzBr8Bm4Cb4BHo9HoVPoONoA17710zvXatu0753qzDqeBPeAdsA4QQhDOuV76EgkhCO99vuD3LdT9A4TPkK2vNlObAAAAAElFTkSuQmCC";
 this.onclick=e=>
{if(e.button==0&&!e.ctrlKey)AddP();                                                                //L
//if(e.button==0&& e.ctrlKey)f();                                                                   //Ctrl+L
//if(e.button==2&& e.ctrlKey){e.preventDefault();f();};                                             //Ctrl+R
 if(e.button==2&&!e.ctrlKey&&!e.shiftKey&&!e.altKey&&!e.metaKey){e.preventDefault();AddO();}};     //R
 this.tooltipText=self.label+"\nL: On/Off ProxyAddons\nR: On/Off OtherAddons";
////////////////////////////////////////////////////////////////////
//forum.mozilla-russia.org/viewtopic.php?pid=777986#p777986
function AddP(){var args=[addon=>addon[addon.userDisabled?"enable":"disable"]({allowSystemAddons:true}),Cu.reportError];
for(var id of["IDproxy1","IDproxy2"])AddonManager.getAddonByID(id).then(...args);};
function AddO(){var args=[addon=>addon[addon.userDisabled?"enable":"disable"]({allowSystemAddons:true}),Cu.reportError];
for(var id of["webscrapbook@danny0838.addons.mozilla.org","{561906d8-e22f-4a6c-a201-8097b48a7a63}"])AddonManager.getAddonByID(id).then(...args);};
////////////////////////////////////////////////////////////////////

Отредактировано func4ptch4 (13-02-2020 10:37:54)

Отсутствует

 

№1429213-02-2020 10:33:35

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

Re: Custom Buttons

voqabuhe пишет

на всё согласен

Ну, тогда вот набросок, добро пожаловать(ся).

скрытый текст
Задумано так: при включённом middlemouse.paste,
в текстовых полях <input> и <textarea> клик средней кнопкой мыши:

в границах выделенного — вставка с заменой, если ничего не выделено
или за границами выделенного — обычная вставка middlemouse.paste

Код для добавления в
%Папка_Профиля%\chrome\user_chrome_files\custom_scripts\custom_script.js

Напомню:

Readme.txt пишет

В папке custom_scripts находятся скрипты которые при необходимости можно подключить в настройках
и добавить свой код (после редактирования перезапустить кнопкой Перезагрузка - ПКМ: Отключить загрузку содержимого из кеша и перезапустить).

Множественное выделение даже не рассматривалось.
Не будет работать в Fission OOP-фреймах.

Выделить код

Код:

try {((id, code, gmon) => {

    var d = "data:,", ref = "globalThis." + id, dref = d + ref;
    var psi = `${dref} = ${encodeURIComponent(code)};`;
    var psd = `${d}delete ${ref};`;

    var e10s = Services.appinfo.browserTabsRemoteAutostart;
    if (e10s) var
        fsi = `${dref}.listen(this, "add");`,
        fsd = `${dref}.listen(this);`;

    var g = Cu.getGlobalForObject(Cu), pref = "middlemouse.paste";
    var obs = {
        pref: Services.prefs.getBoolPref.bind(null, pref),
        startup() {
            Services.prefs.addObserver(pref, this);
            Services.obs.addObserver(this, "quit-application-granted", false);
            this.pref() && this.init();
            this.gmon();
        },
        async gmon() {
            Cu.importGlobalProperties(["fetch"]);
            var url = "chrome://custombuttons/content/editExternal.js";
            try {var src = await (await fetch(url)).text();} catch(ex) {return;}
            src = src.replace(/function gmon_edit_mouseclick[^}]+?}/, gmon);
            var arr = [["override", url, "data:," + encodeURIComponent(src)]];
            url = Services.io.getProtocolHandler("resource").getSubstitution("gre");
            this.gmonHelper = Cc["@mozilla.org/addons/addon-manager-startup;1"]
                .getService(Ci.amIAddonManagerStartup).registerChrome(url, arr);
        },
        shutdown() {
            this.pref() && this.destroy();
            e10s && Services.ppmm.removeDelayedProcessScript(psi),
            Services.ppmm.loadProcessScript(psd, false);
            Services.prefs.removeObserver(pref, this);
            Services.obs.removeObserver(this, "quit-application-granted");
            this.gmonHelper && this.gmonHelper.destruct();
        },
        init() {
            e10s && Services.mm.loadFrameScript(fsi, true);
            Services.obs.addObserver(this, "widget-first-paint", false);
            this.wins("add");
        },
        destroy() {
            if (e10s)
                Services.mm.removeDelayedFrameScript(fsi),
                Services.mm.loadFrameScript(fsd, false);
            Services.obs.removeObserver(this, "widget-first-paint");
            this.wins();
        },
        observe(subj, topic) {
            var char = topic[0];
            if (char == "w") return this.call(subj, "add");
            if (char == "q") return this.shutdown();
            this[this.pref() ? "init" : "destroy"]();
        },
        wins(arg) {
            for(var win of Services.wm.getEnumerator(null)) this.call(win, arg);
        },
        listen() {}
    };
    Services.ppmm.loadProcessScript(psi, e10s);
    g[id].call = g[id].listen;
    Object.assign(g[id], obs).startup();

})("ucf_custom_script_js_MiddleMousePaste", `{

    listen(trg, prfx = "remove") {
        var meth = prfx + "EventListener";
        trg[meth]("auxclick", this, true);
        trg[meth]("unload", this);
    },
    handleEvent(e) {this[e.type](e);},
    unload(e) {this.listen(e.target);},
    sn: Ci.nsISelectionController.SELECTION_NORMAL,
    inRect: (r, x, y) => y > r.top && y < r.bottom && x < r.right && x > r.left,
    auxclick(e) {
        if (e.button != 1) return;
        var trg = (e.originalTarget || e.target).closest(
            "input:not([disabled]),textarea:not([disabled])"
        );
        if (!trg) return;
        var ed = trg.editor;
        if (!ed || ed.selection.isCollapsed || !ed.canPaste(this.sn)) return;

        var x = e.clientX, y = e.clientY, rng = ed.selection.getRangeAt(0);
        if (!this.inRect(rng.getBoundingClientRect(), x, y)) return;

        var list = rng.getClientRects();
        if (list.length == 1 || Array.from(list).some(
            rect => this.inRect(rect, x, y)
        ))
            ed.paste(this.sn, e.preventDefault());
    }
}`, `\
function gmon_edit_mouseclick(e) {
    var mmp = Cc["@mozilla.org/preferences-service;1"]
        .getService(Ci.nsIPrefBranch).getBoolPref.bind(null, "middlemouse.paste");
    (gmon_edit_mouseclick = e => e.button != 1 || mmp() || edittarget(e.target))(e);
}`);
} catch(ex) {Cu.reportError(ex);}

bunda1 пишет

А с click вобще не работает.

Странно, я попробовал проверить на 74.0b1, заменив mousedown на click.
И response есть, и вставка есть, и вставка не в точке клика СКМ,
а там же, где если бы вставилось по Ctrl+V. То есть работает.

func4ptch4 пишет

все ли правильно?

Выглядит нормально. Непонятно зачем {allowSystemAddons:true}
переместил, но это, разумеется, не ошибка, дело хозяйское.

Отредактировано Dumby (13-02-2020 10:35:31)

Отсутствует

 

№1429313-02-2020 12:53:29

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

Re: Custom Buttons

Dumby
Да, похоже старая сборка была сломлена. Я проверил код с на другой сборке и он заработал. Спасибо.

Выделить код

Код:

(()=> {        
   var code = `
      function handleEvent(e) {
         if (e.button != 1) return;
         e.preventDefault();
         e.stopPropagation();          
          
         sendSyncMessage("response",{},{});
      }
      addEventListener('click', handleEvent, false);
       
      function removeListener() {
         removeMessageListener("destroy", removeListener);
         removeEventListener("click", handleEvent, false);
      }
      addMessageListener("destroy", removeListener);
   `;
    
    
   var url = "data:," + encodeURIComponent(code);
   var mm = window.getGroupMessageManager("browsers");
   mm.loadFrameScript(url, true);

   function run(message) {
      insertText(gClipboard.read());
      Services.console.logStringMessage(message.name);
   }
   mm.addMessageListener("response", run);


   addDestructor(() => {
      mm.removeDelayedFrameScript(url);
      mm.broadcastAsyncMessage("destroy");
      mm.removeMessageListener("response", run);
   });
})();


// Ставить текст в текстовое поле .............
function insertText(text) {
   var docShell = "docShell" in document
                  && document.docShell instanceof Ci.nsIDocShell
                  ? document.docShell : window.docShell;
                  
   function insert(text) {
      var params = "createCommandParams" in Components.utils
                    ? Cu.createCommandParams()
                    : Components.classes["@mozilla.org/embedcomp/command-params;1"].createInstance(Components.interfaces.nsICommandParams);
      params.setStringValue("state_data", text);
      docShell.doCommandWithParams("cmd_insertText", params);
   };

   var br = document.activeElement;
   !br || br.localName != "browser" || !br.isRemoteBrowser
   ? insert(text)
   : br.messageManager.loadFrameScript(`data:,(${insert})(`+encodeURIComponent(text.toSource())+`)`, false, true);
};

Отсутствует

 

№1429413-02-2020 13:05:17

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

Re: Custom Buttons

Dumby пишет

Ну, тогда вот набросок, добро пожаловать

Вот спасибо, вот порадовал. Всё просто великолепно работает. :beer:

Добавлено 13-02-2020 13:10:30
bunda1

bunda1 пишет

Я проверил код с на другой сборке и он заработал. Спасибо.

Как я понимаю, теперь у нас два рабочих варианта образовалось. То ни одного, а теперь..., просто праздник какой-то. :music:
bunda1, у тебя, если не ошибаюсь, ещё была очень полезная кнопка - очистка текстовых полей прокруткой колесом. Можешь её востановить.

Отредактировано voqabuhe (13-02-2020 13:10:30)

Отсутствует

 

№1429513-02-2020 13:39:07

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

Re: Custom Buttons

voqabuhe пишет

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

Сделаем, вроде это не трудно.

Отсутствует

 

№1429613-02-2020 14:07:22

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

Re: Custom Buttons

bunda1 пишет

Сделаем, вроде это не трудно.

Вот и замечательно будет. Только не пропадай надолго. ;)

Отсутствует

 

№1429713-02-2020 19:34:34

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

Re: Custom Buttons

voqabuhe пишет

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

Забыл спросить. Каких именно текстовых полей?

Отсутствует

 

№1429813-02-2020 21:28:41

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

Re: Custom Buttons

bunda1 пишет

Забил спросить. Каких именно текстовых полей?

Ну для меня желательно в адресной строке, панели закладок и в окне Редактирования закладки это которое при нажатие на звёздочку, там Имя и Адрес.

Отсутствует

 

№1429913-02-2020 21:45:10

egorsemenov06
Участник
 
Группа: Members
Зарегистрирован: 12-06-2018
Сообщений: 378
UA: Firefox 73.0

Re: Custom Buttons

Господа форумчане поправте пожалуйста кнопку Proxy

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

Выделить код

Код:

// Proxy, от 13.05.2019.


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

   if ( e.button == 0 )                  // длинный левый клик
        self.timer = setTimeout(()=> {     
           self.onmouseup = '';           
           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);  
   }
   
   if ( e.button == 2 )                  // правый клик
        menuPopup.openPopup(this, "after_start");   
};
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() );


// Функция открывает настройки прокси в окне ...................  
function openConnections() {

    var win = [...Services.wm.getEnumerator(null)].find(w => w.location == url);
    if (win) return win.focus();
    var url = "chrome://browser/content/preferences/connection.xhtml";
    win = openDialog(url, "Proxy", "centerscreen");
    win.opener = {gSubDialog: {_dialogs: [{
        _frame: {get contentDocument() {
            var args = ["click", win.close.bind(win), true];
            var unload = () => gBrowser.removeEventListener(...args);
            gBrowser.addEventListener(...args);
            win.addEventListener("unload", unload, {once: true});

            delete this.contentDocument;
            return this.contentDocument = win.document;
        }},
        resizeVertically: () => win.sizeToContent()
    }]}};
}

// Функция открывает настройки прокси в вкладке ...................
function openConnectionsInTab() {
   var connections = gBrowser.getBrowserForTab(gBrowser.selectedTab = gBrowser.addTrustedTab("chrome://browser/content/preferences/connection.xhtml", {
                                               triggeringPrincipal: Services.scriptSecurityManager.getSystemPrincipal(),})); 
          
   // 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;
   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:(subject, topic, 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  
                 : gContextMenuContentData.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();
};


а то открывает настройки в непотребном виде
скрытый текст
773557a7464bc74911724fd27d985cb9.jpg

[firefox] 73.0

Отредактировано egorsemenov06 (13-02-2020 21:49:37)

Отсутствует

 

№1430013-02-2020 21:47:54

func4ptch4
Участник
 
Группа: Members
Зарегистрирован: 03-05-2018
Сообщений: 220
UA: Firefox 75.0

Re: Custom Buttons

pastebin.com/drQYPDF8 QuickOpen.uc.js понемногу разгребаю код, пару мелких добавок.
Почему ссылки не ссылки, так как тут вроде нельзя, так что не рискую... /**/ это то что я добавлял.
Ах да, добавил автопопап там снизу, если не хотите можете удалить, так то сам код у меня в другом файле, может пригодиться.

Отредактировано func4ptch4 (13-02-2020 21:49:55)

Отсутствует

 

Board footer

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