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

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

№1340120-06-2019 22:36:00

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

Re: Custom Buttons

anywho пишет

В 67 не определяет ID места

А так?

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

Выделить код

Код:

((popup, {lastChild} = popup, pref = "CB.bookmark") =>
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 (e.target != popup || this.shouldHide()) return;
        var menuitem = document.createElementNS(xulns, "menuitem");
        menuitem.id = "context-addBookmark";
        menuitem.className = "menuitem-iconic";
        menuitem.setAttribute("image", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAOCAYAAAAmL5yKAAAB0UlEQVR42p2SS0gbURiFz73TcSUUXYi4EGLATRDSLnzgpqC4rLgXcVFo6TJY0AayURCtLtqK2G5sEd2LguIDF4W0mzaIbTVCxQcJihPzUJJ53/4ZJThNrOI/c5j7z9zz3TNzh9X7Wp/29L6YR4mafD/cET/8vYr/FBt6MyOCfd1FDzRDYOztbEnT+Eh/Q1KJ/XQBjmIKJM7BJU5XBkmSUFlRXhLQPzhzMBJ61gToJwVAQklAzpsLYhCQ0BSI3xh/d+F5pwvQHkoVTfoYqAWTZJxdCKfnjCGdUW0lJVJTi/HKAuDRyz/4/NqDrCZgWoBFornYPOTYjgloJvWCo+wBsBM9NTa+qd/9Pr3ZBfgU9GD1l42sCuQ05ig/zq/NBHMkcyC6c2qshXMRv99odAE+vPJgectGjkyqzmknAIOSgIwcFIdSyNRGtxVj7Us24m/5BzARqMPCDwuqxqGS2bwyOweZQfdkirO7dwNgfdSL47SgyOwytxMdl+O8bDotG+l0TuzHRWZs6eShCxCZ9OL2MiAsE8kLCW0DR3ABvr7zIpmhv5A+uW6QdJN2g95DCCeBZYur3kbivAwDcwmwquq6lpqulfAdli6qzeknj9l9jNfrL3fWCMvzB8ayAAAAAElFTkSuQmCC");
        menuitem.setAttribute("oncommand", "linkedObject.oncommand(event);");
        menuitem.linkedObject = this;
        menuitem.onauxclick = e => {
            if (e.button == 1) return;
            e.preventDefault();
            popup.hidePopup();
            this.pick();
        }
        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"],
    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 as() {
        delete this.as;
        return this.as = Cc["@mozilla.org/alerts-service;1"]
            .getService(Ci.nsIAlertsService);
    },
    notify(title, msg) {
        this.as.showAlertNotification("chrome://global/skin/icons/cpd_OK.png", title, msg);
        setTimeout(this.as.closeAlert, 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 = URL.createObjectURL(new Blob(
            [xul], {type: "application/vnd.mozilla.xul+xml"}
        ));
        addDestructor(() => URL.revokeObjectURL(url));
        delete this.url; return this.url = url;
    }
}, false, popup || 1))(document.getElementById("contentAreaContextMenu"));

Отсутствует

 

№1340221-06-2019 10:49:08

anywho
Забанен
 
Группа: Members
Зарегистрирован: 21-05-2019
Сообщений: 54
UA: Firefox 67.0

Re: Custom Buttons

Dumby
Колоссально! Еще бы кнопку "видео" с youtube.dll.exe  уделать  окончательно ...Эта фишка с ярлыком , что в скрипт сделали , не того...тоже круто, но не колоссально...

Отсутствует

 

№1340324-06-2019 18:23:11

Stkvsky
Участник
 
Группа: Members
Зарегистрирован: 26-06-2012
Сообщений: 1700
UA: Firefox 42.0

Re: Custom Buttons

Если можно, почините пожалуйста кнопку.
Отрытие сайта в боковой панели

Выделить код

Код:

(sidebarWindow => {
  addEventListener('click', e=> {
    var webPanel = sidebarWindow.contentDocument.getElementById("web-panels-browser");
    if (!webPanel) return;
    var sidebarDoc = webPanel.contentDocument;
    if (!(sidebarDoc
          && (sidebarDoc.location.protocol == "http:"
              || sidebarDoc.location.protocol == "https:"
              || sidebarDoc.location.protocol == "ftp:"
              || sidebarDoc.location.protocol == "ftps:"
              || sidebarDoc.location.protocol == "file:"))) return;
    let link = e.originalTarget;
    while (link && link.tagName.toLowerCase() != 'a' && link.src) link = link.parentNode;
    if (!(link && link.href && !(sidebarDoc.location.protocol == "file:" && link.className == 'file'))) return;
    link.target = "_self";
  }, true, sidebarWindow)
})(document.getElementById("sidebar"));

Отредактировано Stkvsky (24-06-2019 19:16:07)

Отсутствует

 

№1340424-06-2019 20:42:55

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

Re: Custom Buttons

Stkvsky для 63+ пост Dumby положить в Initialization Code

Отсутствует

 

№1340524-06-2019 23:30:02

Rango
Участник
 
Группа: Members
Зарегистрирован: 19-06-2019
Сообщений: 42
UA: Firefox 66.0

Re: Custom Buttons

Народ, подскажите, сабж работает на квантуме, конкретно для фф 66?
А то я смотрю тут мелькают упоминания. Хотя я был уверен, что после 57 уже не работает CB на квантуме.

Отсутствует

 

№1340625-06-2019 01:04:15

xrun1
Участник
 
Группа: Members
Зарегистрирован: 12-12-2013
Сообщений: 1160
UA: Firefox 67.0

Re: Custom Buttons

Rango
Работает. Пост Dumby с последними версиями CB.
Или как править omni.ja, пост Drage2.

Отсутствует

 

№1340725-06-2019 04:07:17

Rango
Участник
 
Группа: Members
Зарегистрирован: 19-06-2019
Сообщений: 42
UA: Firefox 66.0

Re: Custom Buttons

xrun1 пишет

Работает. Пост Dumby с последними версиями CB.
Или как править omni.ja, пост Drage2.

Спасибо конечно за ответ и за ссылки, но я обычный юзер ФФ и ничего там не понял, кроме того, что оно вроде бы работает. Что, конечно, радует.

Я просто хотел перенести 1-2 кнопки со старой версии, на которой сидел неск. лет, кнопки сделаны другим человеком (закрытые вкладки, например)
Думал, просто поставлю CB и из той сборки кнопки как-нибудь сумею скопировать. А тут целая история, нужно вначале закончить курсы программистов и сделать 33 раза "ку". :lol:

По первой ссылке оно не ставится, пишет что повреждено. Как я понимаю, что-то нужно поредактировать в установочном файле и оно установится?

Отсутствует

 

№1340825-06-2019 11:07:14

anywho
Забанен
 
Группа: Members
Зарегистрирован: 21-05-2019
Сообщений: 54
UA: Firefox 67.0

Re: Custom Buttons

Rango
Какая версия ? Завтра захочешь 67 , тогда надо сразу общие "костыли" ставить. Если готовую сборку, то разрядность надо знать...

Отсутствует

 

№1340925-06-2019 11:59:35

Stkvsky
Участник
 
Группа: Members
Зарегистрирован: 26-06-2012
Сообщений: 1700
UA: Firefox 42.0

Re: Custom Buttons

Andrey_Krropotkin
Жаль не заработала, мне до квантума нужно.
И Sidebar не работает

Отсутствует

 

№1341025-06-2019 12:24:13

anywho
Забанен
 
Группа: Members
Зарегистрирован: 21-05-2019
Сообщений: 54
UA: Firefox 67.0

Re: Custom Buttons

Dumby
Есть вопрос. 67 запускаю с пускача , плюс ini и т.д . Ключ реестра убирается при этом..
Пробую простой запуск , при выходе кн.СВ запускаю батник , через VBS

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

Выделить код

Код:

@echo off
reg delete HKEY_CURRENT_USER\Software\Mozilla\firefox /f


Вроде все ОК!, но другой бат с командой
скрытый текст

Выделить код

Код:

nircmd killprocess memreduct.exe
nircmd shexec "open" "D:\\fox\\nir\\trayupdate.exe"


Только наполовину, trayupdate.exe -никак , пишет памяти не хватат...Это зараза memreduct.exe не вырубается подругому, только killprocess, поэтому и trayupdate.exe нужен
Что можно сделать?

Отсутствует

 

№1341125-06-2019 14:18:09

Rango
Участник
 
Группа: Members
Зарегистрирован: 19-06-2019
Сообщений: 42
UA: Firefox 66.0

Re: Custom Buttons

anywho пишет

Какая версия ? Завтра захочешь 67 , тогда надо сразу общие "костыли" ставить. Если готовую сборку, то разрядность надо знать...

А общие костыли это какие?
Сейчас ФФ 66, поставил вместо 67, в которой неожиданно поломали работу дополнений в приватном режиме, поэтому я на 66. Обновлять пока не планировал, 66 устраивает.
Исходная борка была вот эта

Small_Z пишет

Кнопка восстановления закрытых вкладок взята отсюда https://infocatcher.github.io/Custom_Buttons/install/undoCloseTabs.html

Отсутствует

 

№1341225-06-2019 14:51:15

anywho
Забанен
 
Группа: Members
Зарегистрирован: 21-05-2019
Сообщений: 54
UA: Firefox 67.0

Re: Custom Buttons

Rango
Надеюсь не затупишь? Для 66
https://www.upload.ee/files/10136695/r.rar.html

Отсутствует

 

№1341325-06-2019 17:41:03

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

Re: Custom Buttons

anywho пишет

memreduct.exe не вырубается подругому, только killprocess, поэтому и trayupdate.exe нужен

Я без понятия что такое trayupdate.exe, и задача тоже непонятна.
Держать memreduct.exe запущенным мне кажется странным,
он же будет каждую секунду долбиться в закрытую дверь.

А если нужна очистка по нажатию кнопки, то вот, жму,
из трея вылезает тултип, что мол «Очистка памяти выполнена с результатом …»,
и процесс исчезает.

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

Выделить код

Код:

if (this.busy) return;
this.busy = true;

var process = Cc["@mozilla.org/process/util;1"].createInstance(Ci.nsIProcess);
process.init(FileUtils.File("C:\\fox\\nir\\memreduct.exe"));

process.run(false, null, 0);
setTimeout(() => this.busy = process.kill(), 700);


memreduct.ini

Выделить код

Код:

[memreduct]
AutoreductEnable=true
AutoreductIntervalEnable=false
IsShowReductConfirmation=false
IsStartMinimized=true
AutoreductValue=10

Отсутствует

 

№1341425-06-2019 18:18:44

anywho
Забанен
 
Группа: Members
Зарегистрирован: 21-05-2019
Сообщений: 54
UA: Firefox 67.0

Re: Custom Buttons

Dumby
Не в этом проблема. С функционалом все норм.При выходе из браузера иконка в трее не убирается сама, т.к killprocess !
Поэтому трей обновить приходится экзешником trayupdate.exe , автоматом при выходе из браузера....

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

Выделить код

Код:

var closer = {
    observe: function(subject, topic, data) {
       if ( data == "shutdown" ){
            var file = Services.dirsvc.get('ProfD', Ci.nsIFile); 
            
file.initWithPath("D:\\fox\\nir\\m.vbs");
file.launch();

      
}
}
};
Services.obs.addObserver(closer, "quit-application", false);


M.VBS - это батник
скрытый текст

Выделить код

Код:

nircmd killprocess memreduct.exe
nircmd shexec "open" "D:\\fox\\nir\\trayupdate.exe"


Все нет проблемы , но как только при выходе очистка ветви реестра ....Паузу делал, не помогает...Была бы команда трей обновить без EXE...? Другое дело...
скрытый текст

Выделить код

Код:

@echo off
reg delete HKEY_CURRENT_USER\Software\Mozilla\firefox /f


То кранты  и nircmd shexec "open" "D:\\fox\\nir\\trayupdate.exe" не работает...

Отредактировано anywho (25-06-2019 18:22:52)

Отсутствует

 

№1341525-06-2019 20:20:39

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

Re: Custom Buttons

anywho пишет

nircmd shexec "open" "D:\\fox\\nir\\trayupdate.exe" не работает...

Ага, скачивал когда-то посмотреть твою сборку, нашёл там этот trayupdate.exe
Ну, запустил memreduct.exe, настроил для него «Показать значек и уведомления».
Набросал навскидку код для Инициализации.

Закрываю Firefox — процесс memreduct.exe исчез и иконка в трее тоже исчезла.

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

Выделить код

Код:

((g, id) => {
    addDestructor(reason => reason[5] == "e" && id in g && g[id].destroy());
    id in g || (g[id] = {
        init(topic) {
            Services.obs.addObserver(this, topic, false);
            this.destroy = () => {
                Services.obs.removeObserver(this, topic);
                delete g[id];
            }
        },
        observe() {
            this.destroy();

            var file = Services.dirsvc.get("SysD", Ci.nsIFile);
            file.append("taskkill.exe");
            var process = Cc["@mozilla.org/process/util;1"].createInstance(Ci.nsIProcess);
            process.init(file);
            process.startHidden = true;
            process.run(true, ["/F", "/IM", "memreduct.exe"], 3);

            var process = Cc["@mozilla.org/process/util;1"].createInstance(Ci.nsIProcess);
            process.init(FileUtils.File("C:\\fox\\nir\\trayupdate.exe"));
            process.run(false, null, 0);
        }
    }).init("quit-application-granted");
})(Cu.import("resource://gre/modules/Services.jsm", {}), "CBMemReductKiller");

Отсутствует

 

№1341625-06-2019 21:23:12

anywho
Забанен
 
Группа: Members
Зарегистрирован: 21-05-2019
Сообщений: 54
UA: Firefox 67.0

Re: Custom Buttons

Dumby
Все так...Но проблема с

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

Выделить код

Код:

reg delete HKEY_CURRENT_USER\Software\Mozilla\firefox /f


Так и осталась , хотя убрал лишний батник , но
скрытый текст

Выделить код

Код:

process.init(FileUtils.File("C:\\fox\\nir\\trayupdate.exe"));


Также не срабатывает....Удар по реестру и винда не может запустить trayupdate.exe
Все-равно, благодарочка.
А нельзя этот код использовать сразу после очистки памяти? Не на выходе , а после каждого срабатываня memreduct.exe ?
Пауза,наверное, нужна?
Впрочем , сделал , неграммотно немного...
скрытый текст

Выделить код

Код:

ping localhost -n 2 > nul
nircmd  killprocess  memreduct.exe
nircmd shexec "open" "D:\\fox\\nir\\trayupdate.exe"


Забыл , как в самом nircmd паузу делать...

Отредактировано anywho (25-06-2019 23:30:05)

Отсутствует

 

№1341726-06-2019 01:22:43

xrun1
Участник
 
Группа: Members
Зарегистрирован: 12-12-2013
Сообщений: 1160
UA: Firefox 67.0

Re: Custom Buttons

anywho
А что делает trayupdate.exe ? Убивает в трее призрачные иконки после закрытия процесса? Я делал для себя подобное, вдруг пригодится, посмотрите мой старый пост.

скрытый текст
И ещё по nircmd. Пауза nircmd  wait [milliseconds]
И почему у Вас shexec? Это для ассоциированных файлов (shell execute), а для .exe лучше (в батнике обратный слэш экранировать не надо)
nircmd exec "D:\fox\nir\trayupdate.exe"
nircmd help здесь

Отсутствует

 

№1341826-06-2019 08:54:20

grh1
Участник
 
Группа: Members
Зарегистрирован: 25-12-2016
Сообщений: 14
UA: Chrome 75.0

Re: Custom Buttons

доброго дня всем!
не могу установить Custom Buttons на FF67 портабле...
может есть у кого портабельная версия с установленным CB, поделитесь плиз.
спасибо

Отсутствует

 

№1341926-06-2019 09:10:43

Garalf
Участник
 
Группа: Members
Зарегистрирован: 19-09-2017
Сообщений: 313
UA: Firefox 66.0

Re: Custom Buttons

grh1
Вот здесь посмотри https://forum.mozilla-russia.org/viewto … 62#p768762

Отсутствует

 

№1342026-06-2019 09:13:51

grh1
Участник
 
Группа: Members
Зарегистрирован: 25-12-2016
Сообщений: 14
UA: Chrome 75.0

Re: Custom Buttons

Garalf
там только версия FF66

Отсутствует

 

№1342126-06-2019 14:48:39

anywho
Забанен
 
Группа: Members
Зарегистрирован: 21-05-2019
Сообщений: 54
UA: Firefox 67.0

Re: Custom Buttons

xrun1

xrun1 пишет

nircmd exec "D:\fox\nir\trayupdate.exe"

Это не сработает, только так.
nircmd exec hide(или show) "D:\fox\nir\trayupdate.exe"
Ключ реестра убрать через nircmd , тоже глючит...Врочем, итак нормально ,кн. "память" с memreduct уделана полностью ,как и хотелось.

Отсутствует

 

№1342228-06-2019 19:53:22

anywho
Забанен
 
Группа: Members
Зарегистрирован: 21-05-2019
Сообщений: 54
UA: Firefox 67.0

Re: Custom Buttons

Dumby
Как сделать кнопку , изменить команду /add, на игру из буфера обмена ...Просто команду сменить , не то...

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

Выделить код

Код:

/*Initialization Code*/

var path = 'C:\\Potplayer\\potplayer.exe'
var addToPlaylistKey = "/Add";

var sysPlayerName = "Potplayer";
var openIn = "Откыть в "+sysPlayerName;
var videoMoved = "Видео перенесено в "+sysPlayerName;
var noFound = "Не найдено видео на странице, доступное для переноса в "+sysPlayerName;

var Menu_n_TooltipTxts = [{
label: "Действие кнопки: Запустить видео сразу в "+sysPlayerName,
radio: '',
value: 'videotoplayer',
tooltipTxt: 'Запустить видео сразу в '+sysPlayerName
},
{
label: "Действие кнопки: Перенести видео в плейлист "+sysPlayerName,
radio: '',
value: 'videotoplaylist',
tooltipTxt: 'Перенести видео  в плейлист '+sysPlayerName
},
];

var YoutubeID = /(?:youtube(?:-nocookie)?\.com\/(?:[^\/\n\s]+\/\S+\/|(?:v|e(?:mbed)?)\/|\S*?[?&]v=)|youtu\.be\/)([a-zA-Z0-9_-]{11})(?:\W|$)/;



if(!(cbu.getPrefs("CB.video")) || cbu.getPrefs("CB.video").length < 9) cbu.setPrefs("CB.video", "videotoplayer");
var tmp = '',
tmpp = '',
innerA = '<div style="display:block!important;color:#00ff00!important;width:250px!important;font:bold 16px serif!important;z-index:999!important;opacity:1!important;visibility: visible!important;',
innerB = 'left:5px!important;position:absolute!important;height:auto!important;box-sizing:border-box!important;padding:5px!important;margin:5px!important;',
stopPl = "javascript:(function(){v=document.getElementById('movie_player');if(v){v.stopVideo()}else{v=document.getElementsByTagName('video');if(v){v[0].src='';try{v[0].load()}catch(e){}};}})();",
ytIMGouter = function(ytID) {return '<div width="100%"><br /><a target="_blank" href="https://www.youtube.com/watch?v=' + ytID + '"><img src="https://i.ytimg.com/vi/' + ytID + '/hqdefault.jpg"></a><br />' + innerA + 'background-color:black!important;position:relative!important;bottom:20px!important;">&nbsp;&nbsp;' + videoMoved + '</div><br /></div><br />'},
handlWin = function(currentWin) {
tmp = '';
var elem = currentWin.document.getElementsByTagName('video'), currLoc = currentWin.location;
if(elem.length > 0) {
if(currLoc.hostname.indexOf('youtu') != -1 && (tmp = currLoc.toString().match(YoutubeID)) && tmp[1].length == 11) {
play(cbu.getPrefs("CB.video") == "videotoplaylist" ? 'https://www.youtube.com/embed/' + tmp[1] : 'https://www.youtube.com/watch?v=' + tmp[1]);
videoMovedbox = currentWin.document.createElement('videoMoved');
videoMovedbox.innerHTML = innerA + innerB + 'top:-15px!important;"><b>' + videoMoved + '</b></div>';
loadURI(stopPl);
currentWin.document.getElementById('eow-title').appendChild(videoMovedbox);
return true;
};
for(i = 0; i < elem.length; i++) {
if(((tmp = getSrc(elem[i].parentNode, currLoc)) && tmp.length > 2) || (i == 0 && currentWin.document.body.innerHTML.substring(0, 7) == '<video ' && (tmp = currLoc.toString()))) {
videoMovedbox = currentWin.document.createElement('videoMoved');
videoMovedbox.innerHTML = innerA + innerB + 'top:20px!important;background-color:black!important;">' + videoMoved + '</div>';
play(tmp);                
if(currLoc.hostname == 'www.youtube.com') {
elem[i].parentNode.parentNode.appendChild(videoMovedbox);
} else {
elem[i].parentNode.appendChild(videoMovedbox);
};
elem[i].src = '';
try {
elem[i].load()
} catch(e) {};
return true;
}
}
};

currentWin._elems = currentWin.document.getElementsByTagName('iframe');
if(currentWin._elems.length > 0) {
for(currentWin._iCounter = 0; currentWin._iCounter < currentWin._elems.length; currentWin._iCounter++) {
if((currentWin._elems[currentWin._iCounter].src.indexOf('youtube.com') > -1) && (tmp = currentWin._elems[currentWin._iCounter].src.match(YoutubeID)) && (tmp[1].length == 11)) {
play(cbu.getPrefs("CB.video") == "videotoplaylist" ? 'https://www.youtube.com/embed/' + tmp[1] : 'https://www.youtube.com/watch?v=' + tmp[1]);
currentWin._elems[currentWin._iCounter].outerHTML = ytIMGouter(tmp[1]);
return true;
};
if(currentWin._elems[currentWin._iCounter].clientWidth > 80 && currentWin._elems[currentWin._iCounter].clientHeight > 40 && handlWin(currentWin._elems[currentWin._iCounter].contentWindow))return true;
}
};

elem = currentWin.document.getElementsByTagName('object');
currLoc = currentWin.location;
if(elem.length == 0) {
elem = currentWin.document.getElementsByTagName('embed')
};
if(elem.length > 0) {
for(i = 0; i < elem.length; i++) {
if(elem[i].innerHTML.indexOf('youtu') != -1 && (tmp = elem[i].innerHTML.match(YoutubeID)) && tmp[1].length == 11) {
play(cbu.getPrefs("CB.video") == "videotoplaylist" ? 'https://www.youtube.com/embed/' + tmp[1] : 'https://www.youtube.com/watch?v=' + tmp[1]);
elem[i].outerHTML = ytIMGouter(tmp[1]);
return true;
} else {
if(elem[i].clientWidth > 80 && elem[i].clientHeight > 40) {
if(((tmp = getSrc(elem[i].parentNode, currLoc)) || (tmp = getLink(elem[i], currLoc))) && tmp.length > 2) {
play(tmp);
elem[i].outerHTML = innerA + 'background-color:black!important;bottom:20px!important;">&nbsp;&nbsp;' + videoMoved + '</div>';
return true;
};
};
}
};
};
return false;
};

this.onclick = this.oncontextmenu = e => {
if (e.target != this) return;
if(e.button == 0) {
if(cbu.getPrefs("CB.video").substring(0,6) == "videom"){
elem = content.document.getElementsByTagName('object');
if(elem.length == 0) {
elem = content.document.getElementsByTagName('embed')
};

resizeObjs(elem);
resizeObjs(content.document.getElementsByTagName('iframe'));
resizeObjs(content.document.getElementsByTagName('video'));
} else {
if(!handlWin(content))custombuttons.alertSlide1(noFound);
}
};

if(e.button == 1)
gShowPopup(self);


};
this.oncontextmenu = e => e.target != this ? menu.hasAttribute("context")
    : e.ctrlKey || e.shiftKey || e.altKey || e.metaKey || (
        e.detail != 1 ? menu.hidePopup() : !!menu.openPopup(this, "after_start")
    );
custombuttons.alertSlide1 = function(sTitle) {
var as = Components.classes["@mozilla.org/alerts-service;1"].getService(Components.interfaces.nsIAlertsService);
as.showAlertNotification('chrome://global/skin/icons/information-32-XP.png', "", sTitle, false, "", null);
setTimeout(() => as.closeAlert(), 2000);
};

function resizeObjs(objs) {
if(!objs) return;
LEVELS = 3;
dir = (cbu.getPrefs("CB.video") == "videomaximize") ? 1 : -1;
for(i = 0; i < objs.length; i++) {
var Width = new Array(LEVELS)
var Height = new Array(LEVELS)
Width[0] = objs[i].clientWidth;
Height[0] = objs[i].clientHeight;
if((Width[0] > (-20 * dir + 100)) && (Height[0] > (-20 * dir + 60))) {
obj = objs[i];
for(var k = 1;
((k < LEVELS) && (obj.parentNode)); k++) {
obj = obj.parentNode
Width[k] = obj.clientWidth;
Height[k] = obj.clientHeight;
};
Width[0] = Width[0] + dir * (Width[0] / 5 | 0);
Height[0] = Height[0] + dir * (Height[0] / 5 | 0);
objs[i].style.width = Width[0] + "px";
objs[i].width = Width[0];
objs[i].style.height = Height[0] + "px";
objs[i].height = Height[0];
obj = objs[i];
for(var k = 1;
((k < LEVELS) && !(objs[i].tagName == 'IFRAME') && (obj.parentNode) && (Width[k]) && (Height[k]) && (Width[k] > (-20 * dir + 100)) && (Height[k] > (-20 * dir + 60))); k++) {
obj = obj.parentNode
Width[k] = Width[k] + dir * (Width[k] / 5 | 0);
Height[k] = Height[k] + dir * (Height[k] / 5 | 0);
obj.style.width = Width[k] + "px";
obj.width = Width[k];
obj.style.height = Height[k] + "px";
obj.height = Height[k];
}
}
};
};

function restProtHost(lnkR, curLoc) {
if(lnkR.length==0)return '';
let tr = lnkR.replace(/^:\/\//, curLoc.protocol + "//");
if(!tr.match(/^https?:\/\//i)){
lnkR = tr.replace(/^\/+/, '');
if(lnkR.split('/')[0].split('?')[0].split('#')[0].toLowerCase().match(/^(?:[-a-z\d]+\.)+[a-z\d]{2,6}$/)){
tr = curLoc.protocol + '//' + lnkR;
}else{
tr = curLoc.protocol + '//' + curLoc.host + "/" + lnkR;
}
};
return tr;
};

function getSrc(vobj, currentLoc) {
var t = '',
tt = '';
if((((t = vobj.innerHTML.match(/<video.*?\ssrc=(?:(?:'([^']*)')|(?:"([^"]*)")|([^\s]*))/i)) && (t) && (tt = t[1] || t[2] || t[3]) && tt.indexOf('blob:') == -1 ) || ((t = vobj.innerHTML.match(/<source.*?\ssrc=(?:(?:'([^']*)')|(?:"([^"]*)")|([^\s]*)).*?\stype=['"]?video\//i)) && (t) && (tt = t[1] || t[2] || t[3]))) && tt.length > 2 && tt.indexOf('blob:') == -1 ) {
if(tt.indexOf(".mp4/?") == -1) {
tt = tt.replace(/&amp;/g, "&")
};
t = restProtHost(tt, currentLoc);
return t;
};
return '';
};

function getLink(obj, curLocation) {


if(!obj || !obj.tagName) return '';
var flashvars = '',
//        src = '',
q = obj.tagName.toLowerCase();

var getParam = function(e, n) {
var v = '',
r = new RegExp('^(' + n + ')$', 'i'),
param = e.getElementsByTagName('param');
for(var igp = 0, p; p = param[igp]; igp++) {
if(p.hasAttribute('name') && p.getAttribute('name').match(r)) {
v = p.getAttribute('value');
break
};
};
return v;
};


if(q == 'object') {
//        src = obj.getAttribute('data') || obj.getAttribute('src') || getParam(obj, 'movie|data|src|code|filename|url') || (obj.getElementsByTagName('embed').length > 0 ? obj.getElementsByTagName('embed')[0].getAttribute('src') : '');
flashvars = getParam(obj, 'flashvars');
} else if(q == 'embed') {
//        src = obj.getAttribute('src');
flashvars = obj.getAttribute('flashvars');
} else return '';


if(!flashvars) return '';
//   src = restProtHost(src, curLocation);

var restPath = function(f, s) {
return(f.substring(0, 4) == 'http') ? f : s.replace(/[#?].*$/, '').replace(/[^\/]*$/, f)
};

function videoLinkExtract(fl) {
//alert(fl);
var linkArr = [],
outLinks = [],
jj = 0,
lba = '',
lbb = '',
decodeURL = function(s) {
try {
return decodeURIComponent(s)
} catch(e) {
return unescape(s)
}
};

for(var ij = 0; ij < 3; ij++) {
lba = lba + String.fromCharCode(parseInt((Math.random() * 15 + 1) + '', 10));
lbb = lbb + String.fromCharCode(parseInt((Math.random() * 15 + 16) + '', 10));
};

function pushWithMerit(lnk) {

var merit = -11;
if(lnk.match(/^https?:\/\//i)) merit = merit + 40;
if(outLinks.length == 0) merit = merit + 1;
if(lnk.match(/^\//)) merit = merit + 7;
if(lnk.match(/^\/\//)) merit = merit + 30;
if(lnk.match(/240p([^a-z]|$)/i)) merit = merit + 1;
if(lnk.match(/[^a-z]240([^a-z0-9]|$)/i)) merit = merit + 1;
if(lnk.match(/360p([^a-z]|$)/i)) merit = merit + 3;
if(lnk.match(/[^a-z]360([^a-z0-9]|$)/i)) merit = merit + 3;
if(lnk.match(/480p([^a-z]|$)/i)) merit = merit + 5;
if(lnk.match(/[^a-z]480([^a-z0-9]|$)/i)) merit = merit + 5;
if(lnk.match(/720p([^a-z]|$)/i)) merit = merit + 7;
if(lnk.match(/[^a-z]720([^a-z0-9]|$)/i)) merit = merit + 7;
if(lnk.match(/\.mp4([^a-z]|$)/i)) merit = merit + 8;
if(lnk.match(/_hd([^a-z]|$)/i)) merit = merit + 6;
if(lnk.match(/\.(jpg|xml)([^a-z]|$)/i)) merit = merit - 40;
if(merit > 0) outLinks.push(merit + lba + lnk);
Services.console.logStringMessage('merit:'+merit+' lnk->'+lnk);
};

linkArr.push(fl);
while(linkArr.length > jj && jj < 30) {

var testPaths = [];
testPaths = linkArr[jj].split(/(\.(?:flv|mp4|m3u8))/i);
if(testPaths[testPaths.length - 1] == '') testPaths.pop();

for(k = 1; k < testPaths.length; k = k + 2) {

if(testPaths[k - 1].indexOf(lba) > -1) {
pref = testPaths[k - 1];
} else {
var testAboutDom = testPaths[k - 1].toLowerCase().split(/(https?:\/\/)/); 
if(testAboutDom[testAboutDom.length - 1]=='') testAboutDom.pop();
var pTest = testAboutDom[testAboutDom.length - 1].split(/(\?[^\?]*?&)/);
if(pTest.length>2){
pTest.pop();
pTest.pop();
};
testAboutDom[testAboutDom.length - 1] = pTest.join('');
pref = testPaths[k - 1].substring(testAboutDom.join('').lastIndexOf("&") + 1);
};

t2 = pref.lastIndexOf(lbb);
if(t2 > -1) {
pref = pref.substring(t2 + 3);
} else {

t2 = pref.lastIndexOf('{"');
if(t2 > -1) pref = pref.substring(t2 + 2);
t2 = pref.lastIndexOf('["');
if(t2 > -1) pref = pref.substring(t2 + 2);
t2 = pref.lastIndexOf(',"');
if(t2 > -1) pref = pref.substring(t2 + 2);
t2 = pref.toLowerCase().lastIndexOf('"http://');
if(t2 > -1) pref = pref.substring(t2 + 1);
t2 = pref.toLowerCase().lastIndexOf('"https://');
if(t2 > -1) pref = pref.substring(t2 + 1);
t2 = pref.toLowerCase().lastIndexOf(',http://');
if(t2 > -1) pref = pref.substring(t2 + 1);
t2 = pref.toLowerCase().lastIndexOf(',https://');
if(t2 > -1) pref = pref.substring(t2 + 1);
t2 = pref.toLowerCase().lastIndexOf(';http');
if(t2 > -1) pref = pref.substring(t2 + 1);
t2 = pref.toLowerCase().lastIndexOf('*https://');
if(t2 > -1) pref = pref.substring(t2 + 1);
t2 = pref.toLowerCase().lastIndexOf(' or ');
if(t2 > -1) pref = pref.substring(t2 + 4);

pref = pref.substring(pref.split('/')[0].toLowerCase().split('%2f')[0].lastIndexOf('=') + 1);

}

if(pref.length > 0) {

if(pref.split('?')[0].toLowerCase().match(/%[2-3][0-9a-f]/)) {

t2 = pref.indexOf('"')
if(t2 > -1) pref = pref.substring(t2 + 1);
suff = testPaths[k + 1] ? testPaths[k + 1].split('&')[0].split('"')[0].split(';')[0].split(/,http/i)[0] : '';
if((suff != testPaths[k + 1]) || (testPaths.length < k + 3)) {
if(testPaths.length > k + 1) {
testPaths[k + 1] = ((pref == testPaths[k - 1]) ? '' : '&') + testPaths[k + 1].substr(suff.length)
};
t2 = pref.lastIndexOf(lba);
if(t2 > -1) pref = pref.substring(t2 + 3)
linkArr.push(decodeURL(pref + testPaths[k] + suff));

} else {
testPaths[k + 1] = (pref == testPaths[k - 1] ? '' : lbb) + pref + testPaths[k] + suff
}
} else {
suff = testPaths[k + 1] ? testPaths[k + 1].split(';')[0].split('"]')[0].split('"}')[0].split('",')[0].split(/,https?:\/\//i)[0].split('*https://')[0].split(' or ')[0] : '';
t2 = suff.indexOf('&');
if((t2 > -1) && (pref != testPaths[k - 1])) {
if(t2 == 0) suff = '';
if(suff.charAt(0) != '?') suff = suff.split(/(&[^&]+=https?:\/\/)/i)[0];
};
if((suff != testPaths[k + 1]) || (testPaths.length < k + 3)) {
if(testPaths.length > k + 1) {
testPaths[k + 1] = ((pref == testPaths[k - 1]) ? '' : '&') + testPaths[k + 1].substr(suff.length)
};
t2 = pref.lastIndexOf(lba);
if(t2 > -1) pref = pref.substring(t2 + 3);
pushWithMerit(pref + testPaths[k] + suff);

} else {
testPaths[k + 1] = lba + (pref == testPaths[k - 1] ? '' : lbb) + pref + testPaths[k] + suff
}
}
}
};
jj = jj + 1;
};

if(outLinks.length == 0) return '';
function srt(a, b) {
a = parseInt(a.substr(0, a.indexOf(lba)), 10);
b = parseInt(b.substr(0, b.indexOf(lba)), 10);
if(a < b) return 1;
if(a > b) return -1;
return 0
};
outLinks.sort(srt);
outLinks[0] = outLinks[0].substr(outLinks[0].indexOf(lba) + 3)
if(outLinks[0].indexOf('_hq.mp4/?time=') > 0) outLinks[0] = outLinks[0].replace(/&/g, '&amp;');
return outLinks[0];
};
ol = videoLinkExtract(flashvars);
if(!ol) return '';
//    ol = ol.replace(/^:?\/\//, curLocation.protocol + "//");
//    return restPath(ol, src);
return restProtHost(ol, curLocation);
};


var menu = self.appendChild(document.createElement("menupopup"));
self.image = "moz-icon://file://" + path;
var playerName = path.split("\\").pop().replace(".exe","");
self.label = "Открыть видео в " +sysPlayerName;
setTimeout(() => {
Menu_n_TooltipTxts.forEach((m) => {
if("separator" in m) {
menu.appendChild(document.createElement("menuseparator"));
return
};
var mItem = document.createElement("menuitem");
mItem.setAttribute("label", m.label);

if("radio" in m) {
mItem.setAttribute("type", "radio");
mItem.setAttribute('checked', cbu.getPrefs("CB.video") == m.value);
if(cbu.getPrefs("CB.video") == m.value) {
self.tooltipText = m.tooltipTxt;
}
mItem.onclick = () => {
cbu.setPrefs("CB.video", m.value);
tmp = (self.image == imgFlashToPlayer || self.image == imgFlashMinimize ||  self.image == imgFlashMaximize);
if(m.value.substring(0,9)=='videotopl'){
self.image = tmp ? imgFlashToPlayer : imgHTML5ToPlayer;
} else if(m.value=='videominimize') {
self.image = tmp ? imgFlashMinimize : imgHTML5Minimize;
} else self.image = tmp ? imgFlashMaximize : imgHTML5Maximize;
self.tooltipText = m.tooltipTxt;
};
}
if("checkbox" in m) {
mItem.setAttribute('type', 'checkbox');
mItem.setAttribute('checked', (self.image == imgFlashToPlayer || self.image == imgFlashMinimize ||  self.image == imgFlashMaximize ));
mItem.onclick = function(e) {
e.stopPropagation();
e.preventDefault();
if(e.button == 0) toggleFlash();
}
}
menu.appendChild(mItem);
});
menu.onclick = function(e) {
e.stopPropagation();
if(e.button > 0) e.preventDefault();
};
}, 100);
var contextMenu = document.getElementById("contentAreaContextMenu"); 
var menuitem = contextMenu.insertBefore(document.createElement("menuitem"), document.getElementById("context-sep-open"));
menuitem.setAttribute("label", "Открыть в " +sysPlayerName);      
menuitem.setAttribute("class", "menuitem-iconic");
menuitem.setAttribute("image", "moz-icon://file://" + path); 
menuitem.onclick = () => play(gContextMenu.linkURL);
addEventListener("popupshowing", ()=> menuitem.hidden = !gContextMenu.onLink, false, contextMenu);
addDestructor(()=> menuitem.remove() );
var contextMenu = document.getElementById("contentAreaContextMenu");
var mItem = contextMenu.insertBefore(document.createElement("menuitem"), document.getElementById("context-copyvideourl"));
mItem.setAttribute("label", openIn);
mItem.onclick = () => {
var vurl = gContextMenu.mediaURL, videoelem = gContextMenu.target;
if(videoelem && videoelem.nodeName.toLowerCase() == 'video') {
if(content.location.hostname.indexOf('youtu') != -1 && (tmp = content.location.toString().match(YoutubeID)) && tmp[1].length == 11) {
play(vurl);
videoMovedbox = content.document.createElement('videoMoved');
videoMovedbox.innerHTML = innerA + innerB + 'top:-15px!important;"><b>' + videoMoved + '</b></div>';
loadURI(stopPl);
content.document.getElementById('eow-title').appendChild(videoMovedbox);
return;
};

if(content.location.hostname == 'www.youtube.com') {
videoelem.parentNode.parentNode.appendChild(videoMovedbox);
} else {
var inFrameHref = inFrameWin.location.href, found = false;
if(inFrameWin.location.hostname == 'www.youtube.com' && (tmp = inFrameHref.match(YoutubeID)) && tmp[1].length == 11){//и значит во фрейме
elem = inFrameWin.parent.document.getElementsByTagName('iframe');
if(elem.length > 0) {
for(i = 0; i < elem.length; i++) {
if(elem[i].contentWindow == inFrameWin) {
elem[i].outerHTML = ytIMGouter(tmp[1]);
found = true;
break;
};
};
};
if(!found)inFrameWin.document.body.innerHTML = ytIMGouter(tmp[1]);
return;
};
videoelem.parentNode.appendChild(videoMovedbox);
};
videoelem.src = '';
try {
videoelem.load()
} catch(e) {};
} else play(vurl);
};


addEventListener("popupshowing", () => {
mItem.hidden = !gContextMenu.onVideo || !gContextMenu.mediaURL;
mItem2.hidden = !gContextMenu.linkURL;
mItem3.hidden = framItem.hidden || gContextMenu.target.ownerDocument.location.hostname.indexOf('youtube.com') == -1;
}, false, contextMenu);
addDestructor(() => {mItem.remove();mItem2.remove();mItem3.remove()});

function play(link) {
var file = Services.dirsvc.get('CurProcD', Ci.nsIFile);
var MozExeDir = file.path.split('\\').slice(0,-1).join('\\');
file.initWithPath(path);
if(!file.exists()) {
custombuttons.alertBox("File not found!", MozExeDir + Path);
return;
};
var process = Cc["@mozilla.org/process/util;1"].createInstance(Ci.nsIProcess);

process.init(file);
process.run(false, [link, cbu.getPrefs("CB.vid") == "videotoplaylist" ? addToPlaylistKey : ""], 2);
};

Отсутствует

 

№1342328-06-2019 23:16:02

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

Re: Custom Buttons

Dumby подскажите, есть ли способ обойти ограничение браузера на запуск в новой вкладке или сайдбаре XUL (из вкадки CB "справка")
типа  this.xurl = "data:application/vnd.mozilla.xul+xml;base64," +
encodeURIComponent(btoa(unescape(encodeURIComponent(this.Help))));
И еще на 69 во вкладке дополнения изменили оформление. Как добавить в контекстное меню дополнений свой пункт?

Отредактировано Andrey_Krropotkin (28-06-2019 23:26:12)

Отсутствует

 

№1342429-06-2019 09:58:00

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

Re: Custom Buttons

anywho пишет

изменить команду /add, на игру из буфера обмена ...Просто команду сменить , не то...

Почему не то?
Запускай с одной единственной командой "/clipboard"
Или с одной единственной командой gClipboard.read()

Andrey_Krropotkin пишет

есть ли способ обойти ограничение браузера на запуск в новой вкладке или сайдбаре XUL (из вкадки CB "справка")
типа  this.xurl = "data:application/vnd.mozilla.xul+xml;base64," +
encodeURIComponent(btoa(unescape(encodeURIComponent(this.Help))));

Если именно как data:…, то, полагаю что нельзя.
Можно попробовать открывать как chrome://…

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

Выделить код

Код:

((g, name) => {
    var obj = g[name] || (g[name] = ({
        topic: "quit-application-granted",
        init() {
            this.url = `chrome://custombuttons/content/${name}.xul`;
            var dataURL = "data:application/vnd.mozilla.xul+xml," + encodeURIComponent(self.Help);

            this.helper = Cc["@mozilla.org/addons/addon-manager-startup;1"]
                .getService(Ci.amIAddonManagerStartup).registerChrome(
                    Services.io.newFileURI(Services.dirsvc.get("ProfD", Ci.nsIFile)),
                    [["override", this.url, dataURL]]
                );
            (this.obs = Services.obs).addObserver(this, this.topic, false);
            return this;
        },
        observe() {
            delete g[name];
            this.obs.removeObserver(this, this.topic);
            this.helper.destruct();
        }
    }).init());

    this._handleClick = () => gBrowser.selectedTab = gBrowser.addTrustedTab(obj.url);
    addDestructor(reason => reason[5] == "e" && name in g && g[name].observe());
    for(var tab of gBrowser.tabs) {
        if (!tab.linkedPanel || tab.closing) continue;
        var br = tab.linkedBrowser;
        !br.isRemoteBrowser && br.currentURI.spec == obj.url &&
        br.contentDocument.documentURI.startsWith("about:neterror?e=fileNotFound") && br.reload();
    }
})(Cu.import("resource://gre/modules/Services.jsm", {}), "some-unique-name");

Andrey_Krropotkin пишет

И еще на 69 во вкладке дополнения изменили оформление. Как добавить в контекстное меню дополнений свой пункт?

Так обычное контекстное меню страниц, вроде ничего особенного.
Но переделка с их стороны ещё не закончена.

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

Выделить код

Код:

((popup, url) => addEventListener("popupshowing", {
    handleEvent(e) {
        if (this.shouldHide) return;
        var menuitem = document.createXULElement("menuitem");
        menuitem.setAttribute("label", "addon menuitem");
        menuitem.setAttribute("oncommand", "handleCommand(event)");
        menuitem.handleCommand = this.handleCommand.bind(this);
        document.getElementById("context-sep-navigation").after(menuitem);
        addDestructor(() => menuitem.remove());
        this.handleEvent = e => {
            if (e.target == popup) menuitem.hidden = this.shouldHide;
        }
    },
    get shouldHide() {
        if (!gContextMenu.inFrame || gContextMenuContentData.docLocation != url)
            return true;
        var card = content.document.getElementById("html-view-browser")
            .contentDocument.querySelector(
                gContextMenuContentData.popupNodeSelectors[1]
            ).closest("addon-card");
        if (!card) return true;
        this.addon = card.addon;
    },
    handleCommand(e) {
        alert(this.addon.id);
        
    }
}, false, popup || 1))(
    document.getElementById("contentAreaContextMenu"),
    "chrome://mozapps/content/extensions/aboutaddons.html"
);

Отсутствует

 

№1342529-06-2019 10:23:31

anywho
Забанен
 
Группа: Members
Зарегистрирован: 21-05-2019
Сообщений: 54
UA: Firefox 67.0

Re: Custom Buttons

Dumby

Dumby пишет

Почему не то?

Было бы то, стал бы я обращаться?  Конечно, не то...Не так она работает....Да,черт с ней ...В код это и все дела...

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

Выделить код

Код:

var file = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsIFile);
file.initWithPath('C:\\Potplayer\\potplayer.exe');
var process = Cc["@mozilla.org/process/util;1"].createInstance(Ci.nsIProcess);
var link = gClipboard.read();
var args = [link,"/play"];
process.init( file );
process.run( false, args, args.length );

Отсутствует

 

Board footer

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