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

Mozilla Россия — свежие версии программ Mozilla, а также масса полезной информации по каждому продукту.

№1335107-06-2019 21:51:00

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

Re: Custom Buttons

Кнопка "переключить proxy.Pac "... Как  "self.tooltipText = val"  впаять? Не переключатся , хоть тресни...

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

Выделить код

Код:

/*Initialization Code*/
var idbut=this.id;
var urlbar = document.getElementById("page-action-buttons");
var button = document.getElementById(idbut);
urlbar.insertBefore(button, urlbar.lastChild);

this._handleClick =()=> {
   cbu.setPrefs(s, cbu.getPrefs(s) == "file:///D:/iceweasel/app/browser/Proxy.pac" ? "file:///D:/iceweasel/app/Proxy.pac" : "file:///D:/iceweasel/app/browser/Proxy.pac");
};

var s = "network.proxy.autoconfig_url";
var ps = Services.prefs;

function toggleImage() {
   var val = cbu.getPrefs(s);
   var icon = self.ownerDocument.getAnonymousElementByAttribute(self, "class", "toolbarbutton-icon");
   icon.src = cbu.getPrefs(s) == "file:///D:/iceweasel/app/Proxy.pac" 
   ? self.image
   : "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAOCAYAAAAmL5yKAAAAIElEQVR42mNkoBAw/t0p/H+kG8DQ7DPiDQDqHjWAQgMAp7kcXcBx0C0AAAAASUVORK5CYII="; 
   
};
this.oncontextmenu =e=> { e.button && !e.ctrlKey && e.preventDefault() };
toggleImage();
Services.prefs.addObserver( s, toggleImage, false );
addDestructor(function() { gPrefService.removeObserver( s, toggleImage, false ) }); 
var style = custombutton.buttonGetHelp(self).replace(/id/g, _id);
var uri = makeURI('data:text/css,'+ encodeURIComponent(style));
var sss = Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService);
sss.loadAndRegisterSheet(uri, 0); 
this.tooltipText="Л: Сменить прокси";

Отсутствует

 

№1335207-06-2019 22:28:04

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

Re: Custom Buttons

Положи self.tooltipText в toggleImage() и переключай так же как переключаешь icon.src

Отсутствует

 

№1335307-06-2019 22:49:57

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

Re: Custom Buttons

bunda1
self.tooltipText = val ? 'Автопрокси' : 'Без прокси';
Не переключает , только первое слово и все....

Отсутствует

 

№1335407-06-2019 23:58:17

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

Re: Custom Buttons

И не должно, потому что val у тебя отдает путь, а для переключения нужно что бы val отдавал true или false. Вот так:

Выделить код

Код:

function toggleImage() {
   var val = (cbu.getPrefs(s) == "file:///D:/iceweasel/app/Proxy.pac");
   
   var icon = self.ownerDocument.getAnonymousElementByAttribute(self, "class", "toolbarbutton-icon");
   icon.src = val ? self.image : "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAOCAYAAAAmL5yKAAAAIElEQVR42mNkoBAw/t0p/H+kG8DQ7DPiDQDqHjWAQgMAp7kcXcBx0C0AAAAASUVORK5CYII="; 
   
   self.tooltipText = val ? 'Автопрокси' : 'Без прокси'; 
};
toggleImage();
Services.prefs.addObserver(s, toggleImage, false);
addDestructor(()=> Services.prefs.removeObserver(s, toggleImage));

Отсутствует

 

№1335508-06-2019 00:40:37

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

Re: Custom Buttons

bunda1
Теперь класс! Кнопка бледная была при запуске , малость допилил. Окончательный вариант. Url кнопки - сменить прокси.пак

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

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3E%u0410%u0432%u0442%u043E%20Proxy.pac%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/bmp%3Bbase64%2CQk22AwAAAAAAADYAAAAoAAAAEAAAAA4AAAABACAAAAAAAIADAAAAAAAAAAAAAAAAAAAAAAAAPkOm8ZpXFvJzGwDybycA8m4nAvJzHwDyyOHv8gAAffLL5/fyZgcA8nEsCfJpIQDyXgUA8oBBFfLIzb3ydnjA32l68/8zSvz/roqL/6xMCv+ePQD/pD8A//////8AALX//////5AdAP+UNgj/mz4H/+jBm///////X2ni/1xizf/67cz/wdX//zVJ7v9dT63/n00b/5ATAP/w////AACf//H///9qAAD/plck//Xlx/+ouv//Jjrt/1pInP+YUyD/kTQA/925k///////bH/9/yswzf/GilT//////wAAo//w////yoVC//////90h///O1f//6Z9hf+gQAD/fCcA/4MFAP9xAAD/pDwA////7/+ttfD/AADC/////v8AAKr/8vj5//////8UHNP/MjHC/7JIAP+GAAD/fwIA/2oBAP////////////b////z/P/////0////9P/h4ev/AAC2/8zM6f////L////0//////////////////n////p////AACr/wAAsf8AALP/AACy/wAAsv8AALT/AAC8/wAAvv8AALz/AAC0/wAAsv8AALL/AACz/wAAsf8AALf/AACG//n///////////////////////T////y/8zM6f8AALb/4eHr////9P////T/8/z///b//////////////9Dt//9/AgD/hgAA/7JIAP8yMcL/FBzT///////y+Pn/AACq/////v8AAML/rbXw////7/+kPAD/cQAA/4MFAP9kAAD/oEAA/6Z9hf87V///dIf////////KhUL/8P///wAAo///////xopU/yswzf9sf/3//////925k/+RNAD/YQwA/1pInP8mOu3/qLr///Xlx/+mVyT/agAA//H///8AAJ//8P///5ATAP+fTRv/XU+t/zVJ7v/B1f//+u3M/4NAEv9faeL//////+jBm/+bPgf/lDYI/5AdAP//////AAC1//////+kPwD/nj0A/6xMCv+uiov/M0r8/2l68//e483/yM298oBBFfJeBQDyaSEA8nEsCfJmBwDyy+f38gAAffLI4e/ycx8A8m4nAvJvJwDycxsA8ppXFvI+Q6bxPD6d8cjNvfKAQRXyXgUA8mkhAPJxLAnyZgcA8svn9/IAAH3yyOHv8nMfAPJuJwLybycA8nMbAPKaVxbyPkOm8Tw+nfE%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5Bvar%20idbut%3Dthis.id%3B%0Avar%20urlbar%20%3D%20document.getElementById%28%22page-action-buttons%22%29%3B%0Avar%20button%20%3D%20document.getElementById%28idbut%29%3B%0Aurlbar.insertBefore%28button%2C%20urlbar.lastChild%29%3B%0A%0Athis._handleClick%20%3D%28%29%3D%3E%20%7B%0A%20%20%20cbu.setPrefs%28s%2C%20cbu.getPrefs%28s%29%20%3D%3D%20%22file%3A///D%3A/iceweasel/app/Proxy2.pac%22%20%3F%20%22file%3A///D%3A/iceweasel/app/Proxy1.pac%22%20%3A%20%22file%3A///D%3A/iceweasel/app/Proxy2.pac%22%29%3B%0A%7D%3B%0A%0Avar%20s%20%3D%20%22network.proxy.autoconfig_url%22%3B%0Avar%20ps%20%3D%20Services.prefs%3B%0A%0Afunction%20toggleImage%28%29%20%7B%0A%20%20%20var%20val%20%3D%20%28cbu.getPrefs%28s%29%20%3D%3D%20%22file%3A///D%3A/iceweasel/app/Proxy1.pac%22%29%3B%0A%20%20%20%0A%20%20%20var%20icon%20%3D%20self.ownerDocument.getAnonymousElementByAttribute%28self%2C%20%22class%22%2C%20%22toolbarbutton-icon%22%29%3B%0A%20%20%20icon.src%20%3D%20val%20%3F%20self.image%20%3A%20%22data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAOCAYAAAAmL5yKAAAAIElEQVR42mNkoBAw/t0p/H+kG8DQ7DPiDQDqHjWAQgMAp7kcXcBx0C0AAAAASUVORK5CYII%3D%22%3B%20%0A%20%20%20%0A%20%20%20self.tooltipText%20%3D%20val%20%3F%20%27Proxy1.Pac%27%20%3A%20%27Proxy2.Pac%27%3B%20%0A%7D%3B%0AtoggleImage%28%29%3B%0AServices.prefs.addObserver%28s%2C%20toggleImage%2C%20false%29%3B%0AaddDestructor%28%28%29%3D%3E%20Services.prefs.removeObserver%28s%2C%20toggleImage%29%29%3B%0Avar%20style%20%3D%20custombutton.buttonGetHelp%28self%29.replace%28/id/g%2C%20_id%29%3B%0Avar%20uri%20%3D%20makeURI%28%27data%3Atext/css%2C%27+%20encodeURIComponent%28style%29%29%3B%0Avar%20sss%20%3D%20Cc%5B%22@mozilla.org/content/style-sheet-service%3B1%22%5D.getService%28Ci.nsIStyleSheetService%29%3B%0Asss.loadAndRegisterSheet%28uri%2C%200%29%3B%20%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B/*CODE*/%0A%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%23id%20%7B%0Amargin-left%3A%201px%20%21important%3B%20%20%20%0A%20%0A%0A%29%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

Отредактировано anywho (08-06-2019 00:43:29)

Отсутствует

 

№1335608-06-2019 09:44:02

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

Re: Custom Buttons

anywho пишет

bunda1
Теперь класс! Кнопка бледная была при запуске , малость допилил. Окончательный вариант. Url кнопки - сменить прокси.пак

Там у тебя лишний код.

Выделить код

Код:

var idbut=this.id;
var urlbar = document.getElementById("page-action-buttons");
var button = document.getElementById(idbut);

можно заменить на

Выделить код

Код:

var urlbar = document.getElementById("page-action-buttons");
var button = document.getElementById(_id);

и

Выделить код

Код:

var ps = Services.prefs;

вообще ненужен.

Отсутствует

 

№1335708-06-2019 12:57:19

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

Re: Custom Buttons

bunda1
Хвала, убрал  отовсюду...

Отсутствует

 

№1335808-06-2019 15:27:29

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

Re: Custom Buttons

leex пишет

Единственное пожелание, можно ли убрать из стандартного пункта поиска название движка по умолчанию и реакцию на эту кнопку?

Если для русской локали и название пункту
устанавливает только лиса, то вот вариант

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

Выделить код

Код:

(ss => {
    ss.setAttribute("closemenu", "none");
    ss.BrowserSearch = {loadSearchFromContext() {}};
    Object.defineProperty(ss, "label", {
        configurable: true, enumerable: true,
        get: () => ss.getAttribute("label"),
        set(val) {
            var {length} = Services.search.defaultEngine.name;
            ss.setAttribute("label", val = val.slice(0, -length));
            return val;
        }
    });
    addDestructor(() => {
        delete ss.label;
        delete ss.BrowserSearch;
        ss.removeAttribute("closemenu");
    });
})(document.getElementById("context-searchselect"));

ifln пишет

Нужна кнопка, а лучше пункт в меню вкладок, "Обновить другие вкладки".

Ну да, в FF 60 же нет multiselect tabs,
можно и без описания. Тогда по-минимуму

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

Выделить код

Код:

(menuitem => {
    menuitem.setAttribute("label", "Обновить другие вкладки");
    menuitem.setAttribute("oncommand", "reloadOtherTabs();");
    menuitem.reloadOtherTabs = () => {
        var tab = TabContextMenu.contextTab;
        for(var t of gBrowser.visibleTabs) if (t != tab) try {
            gBrowser.getBrowserForTab(t).reload();
        } catch(ex) {}
    }
    document.getElementById("context_reloadAllTabs").after(menuitem);
    addDestructor(() => menuitem.remove());
})(document.createElementNS(xulns, "menuitem"));

Отсутствует

 

№1335908-06-2019 16:24:45

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

Re: Custom Buttons

Dumby
Работает как часы!
Большое спасибо :beer:

Отсутствует

 

№1336008-06-2019 16:35:13

ifln
Участник
 
Группа: Members
Зарегистрирован: 20-09-2013
Сообщений: 231
UA: Firefox 60.0

Re: Custom Buttons

Dumby, спасибо!

Отсутствует

 

№1336109-06-2019 09:33:33

bezuma
Участник
 
Группа: Members
Откуда: Москва
Зарегистрирован: 26-01-2014
Сообщений: 256
UA: Firefox 67.0

Re: Custom Buttons

Друзья, возможно ли исправить кнопку "активация таба наведением мыши"?

скрытый текст
((lst, trg) => trg && addEventListener("mouseover", lst, false, trg))({
    id: 0, tab: null,
    handleEvent({target: tab}) {
        if (tab.matches("tab:not([selected])") && this.tab != tab) clearTimeout(this.id),
            this.id = setTimeout(this.onTimeout, 450, this.tab = tab, tab.boxObject.screenX);
    },
    get onTimeout() {
        delete this.onTimeout; return this.onTimeout = (tab, x) => {
            if (tab.matches(":hover") && Math.abs(x - tab.boxObject.screenX) < 50)
                gBrowser.selectedTab = tab;
            this.tab = null;
        }
    }
}, gBrowser.tabs[0].boxObject.parentBox);

UP  Вопрос снят - нашел рабочий код

Отредактировано bezuma (09-06-2019 12:32:26)

Отсутствует

 

№1336212-06-2019 18:56:38

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

Re: Custom Buttons

проверьте пожалуйста у себя...... это кнопка реагирует на ПКМ?
https://imgur.com/zRIFZ8h
https://anonfile.com/Ua79acvdnd/CB_buttons_01.05.2019._5_18_16_html
а должно быть так
https://imgur.com/hpNUzJV

Отсутствует

 

№1336312-06-2019 21:42:13

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

Re: Custom Buttons

sannin22 пишет

проверьте пожалуйста у себя...... это кнопка реагирует на ПКМ?
https://imgur.com/zRIFZ8h
https://anonfile.com/Ua79acvdnd/CB_buttons_01.05.2019._5_18_16_html[url][/url]
а должно быть так
https://imgur.com/hpNUzJV

Да, кнопка не реагирует на ПКМ. Замени в коде Инициализации:

Выделить код

Код:

menu.showPopup(self, -1, -1, "popup", "bottomleft", "topleft");

на

Выделить код

Код:

menu.openPopup(this, "after_start");

Отсутствует

 

№1336413-06-2019 00:01:05

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

Re: Custom Buttons

Dumby
У меня вопрос по поводу вашей кнопки "Отправить в youtube-dl" https://forum.mozilla-russia.org/viewto … 78#p765178
Юзер eddiezato предложил способ передачи ссылки с youtube-dl в Potplayer. http://forum.ru-board.com/topic.cgi?for … tart=760#5. Можно ли изменить код кнопки так, чтобы по нажатию кнопки в контекстном меню ссылки происходило ее копирование в clipboard, и запуск файла ярлыка, выполняющего отправку ссылки в Potplayer. (Там запускается powershell со скриптом, выбирает ссылку на видео, запускает youtube-dl и PotPlayer и передает ему ссылку).

Отредактировано Garalf (13-06-2019 19:36:13)

Отсутствует

 

№1336513-06-2019 13:45:27

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

Re: Custom Buttons

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

Отсутствует

 

№1336613-06-2019 13:57:37

Vitaliy V.
Участник
 
Группа: Members
Зарегистрирован: 19-09-2014
Сообщений: 2074
UA: Firefox 68.0

Re: Custom Buttons

Garalf
SMPlayer

скрытый текст
SNIMOK-EKRANA-V-2019-06-13-13-59-32.png

и не нужен никакой Pot который на [linux] не может

Отредактировано Vitaliy V. (13-06-2019 14:00:24)

Отсутствует

 

№1336713-06-2019 15:12:50

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

Re: Custom Buttons

Vitaliy V.
Спасибо за информацию. Буду пользоваться. Но как-то уже к Potу привык. А эту кнопочку поправить для спеца особого труда не составит, я думаю.

Отредактировано Garalf (13-06-2019 18:23:21)

Отсутствует

 

№1336813-06-2019 19:46:26

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

Re: Custom Buttons

Garalf
Что тут за проблема? Есть три вида кнопок "в плеер" и Youtube.dll  и даром не надо.
Тем более из буфера

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

Выделить код

Код:

/*CODE*/
var file = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsIFile);
file.initWithPath('C:\\Program Files\\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 );


Или в плейлист var args = [link,"/Add"];

Отсутствует

 

№1336913-06-2019 20:43:00

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

Re: Custom Buttons

anywho
Дело в том, что некоторые ссылки с Youtube, переданные напрямую  не воспроизводятся на Potplayer, например:
https://www.youtube.com/watch?v=i_M0BOx7Cok, а через Youtube-dl работают влет. Просто хочется упростить работу. Сейчас я сначала копирую ссылку в буфер, а затем запускаю выполнение скрипта (ярлыка) кнопкой Open with.... Поэтому возникла идея совместить это в одной кнопке Отправить в youtube-dl, заменив скачивание видео на перенос его в Potplayer.

зы А разве плохо, если будет еще одна кнопка типа Видео в плеер.

Отредактировано Garalf (13-06-2019 21:34:28)

Отсутствует

 

№1337013-06-2019 23:43:31

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

Re: Custom Buttons

Garalf
У меня показывает. Сходу. Без этих гемморов
MediaPlayParse - YouTube.as - сменить на новый.   На ru-Borde
ссылка "extension"

Отредактировано anywho (14-06-2019 09:38:20)

Отсутствует

 

№1337114-06-2019 01:59:10

Dobrov
Участник
 
Группа: Members
Зарегистрирован: 04-10-2011
Сообщений: 395
UA: Firefox 60.0

Re: Custom Buttons

Как открывать на панели Закладок Журнал за текущий месяц? т.е добавить папку: Журнал за месяц?
Перетаскиваю на панель закладок папку журнала «Этот месяц» из Библиотеки. Через месяц папка становится пустой.

Подскажите кнопку: открывающую меню: "Журнал за этот месяц" - и всегда за текущий месяц.
Кнопка открытия журнала History в боковой панели не нужна. Удобнее открыть подменю: Журнал за месяц (неделю) из панели Закладок

Отсутствует

 

№1337214-06-2019 08:52:27

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

Re: Custom Buttons

Подскажите пожалуйста рабочий код для "Копировать ссылку в буфер".

Отсутствует

 

№1337314-06-2019 12:13:33

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

Re: Custom Buttons

Garalf пишет

Подскажите пожалуйста рабочий код для "Копировать ссылку в буфер".

А как ты собираешься копировать ссылку?

Отсутствует

 

№1337414-06-2019 12:56:37

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

Re: Custom Buttons

bunda1
Посмотрите этот код

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

Выделить код

Код:

(popup => addEventListener("popupshowing", {
    handleEvent(e) {
        if (e.target != popup || this.shouldHide) return;
        var menuitem = document.createElement("menuitem");
        for(var args of Object.entries({
            class: "menuitem-iconic",
            id: "context-sendlinktoytdl",
            label: "Отправить в youtube-dl",
            oncommand: "linkedObject.oncommand();",
            image: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAc0lEQVQ4jWNgGB7gvqdtwANP+y8PvOz/E4Pve9m/v+9pG4AwwMv+PLGakQw5DzcAm4Ifty//f5IQhtcQvAb8/fP1/++Pr/6/bKog3wAY/rBuKWUGfNq5kXwvvO5tJs8LP25f/v80O5G4QKQ4GilOSEMbAAAJoGH0pNGWEwAAAABJRU5ErkJggg=="
        }))
            menuitem.setAttribute(...args);
        menuitem.linkedObject = this;
        popup.insertBefore(menuitem, popup.querySelector("#context-sep-open"));
        addDestructor(() => menuitem.remove());
        this.handleEvent = e => {
            if (e.target == popup) menuitem.hidden = this.shouldHide;
        }
        menuitem.onauxclick = e => {
            e.preventDefault();
            var link = gContextMenu.linkURL;
            var fp = makeFilePicker();
            fp.init(window, null, fp.modeGetFolder);
            fp.open(res => {
                if (res != fp.returnOK) return;
                fp.file.append("%(title)s.%(ext)s");
                this.oncommand(fp.file.path, link);
            });
        }
    },
    get shouldHide() {
        return !(gContextMenu.onLink || gContextMenu.onPlainTextLink)
            || !/^https?:\/\//.test(gContextMenu.linkURL);
    },
    args: ["--no-check-certificate", "--no-call-home", "-o"],
    oncommand(path = String.raw`D:\YouTube\%(title)s.%(ext)s`, link = gContextMenu.linkURL) {

        var process = Cc["@mozilla.org/process/util;1"].createInstance(Ci.nsIProcess);
        process.init(FileUtils.File(String.raw`D:\YouTube\youtube-dl.exe`));

        var args = this.args.concat(path, link);
        process.runwAsync(args, args.length);
    }
}, false, popup || 1))(document.getElementById("contentAreaContextMenu"));


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

Отсутствует

 

№1337514-06-2019 19:01:11

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

Re: Custom Buttons

Заделал кнопку "Скачать с youtube.dl.exe" Закачивает почти все , кроме HLS/TS , но в каталог браузера, а хочу в папку TUBE, где сам  youtube.dl.exe....

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

Выделить код

Код:

/*Initialization Code*/

var path = 'D:\\tube\\youtube-dl.exe.lnk'
var addToPlaylistKey = "/add";

var sysPlayerName = "youtube-dl.exe";
var openIn = "Скачать с "+sysPlayerName;
var videoMoved = "Видео перенесено в "+sysPlayerName;
var noFound = "Не найдено видео на странице, доступное для переноса в "+sysPlayerName;

var Menu_n_TooltipTxts = [{
label: "Действие кнопки: Загрузить видео c "+sysPlayerName,
radio: '',
value: 'videotoplayer',
tooltipTxt: 'Загрузить видео c '+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);

if(e.button == 2 && !e.ctrlKey && !e.shiftKey && !e.altKey && !e.metaKey) {
e.preventDefault();
menu.showPopup(self, -1, -1, "popup", "bottomleft", "topleft");
}
};
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-16.png', "", sTitle, false, "", null);
setTimeout(() => as.closeAlert(), 999);
};

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.video") == "videotoplaylist" ? addToPlaylistKey : ""], 2);
};

Отсутствует

 

Board footer

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