addon-card:not([expanded]) .addon-description
Считаю CSS для себя непостижимым,
но чуть поднять глаза от этой строки наверх вполне возможно.
.card-contents { width: 1px !important; white-space: nowrap !important; } .addon-description { overflow-x: hidden !important; text-overflow: ellipsis !important; }
Отсутствует
Ещё бы, перфекционизма ради, в контекстном меню два пункта было - для ЛКМ и ПКМ.
Предложу попробовать так: пункт один, но, при ПКМ на нём,
параметр /add в командную строку добавлен не будет (симилярно раскликовке самой кнопки).
Код на замену, от начала и до строки var notify = () => {
(func => { var sysPlayerName = "Pot Player"; var path = "R:\\PotPlayer\\PotPlayerMini.exe"; var videoMoved = "Видео перенесено в " + sysPlayerName; var noFound = "Не найдено видео на странице, доступное для переноса в " + sysPlayerName; this.label = "Открыть видео в " + sysPlayerName; this.tooltipText = "Л: Видео в плейлист"; var rmb; this._handleClick = arg => { var msgName = _id + ":Player"; var listener = ({data}) => data ? run([data]) : notify(); messageManager.addMessageListener(msgName, listener); addDestructor(() => messageManager.removeMessageListener(msgName, listener)); var url = "data:charset=utf-8," + encodeURIComponent( `(${func})()`.replace("MSG_NAME", msgName) .replace("VIDEO_MOVED", encodeURIComponent(videoMoved)) .replace("CONFIRM", encodeURIComponent("Открыть ссылку в плеере ?")) ); (this._handleClick = arg => { rmb = arg; gBrowser.selectedBrowser.messageManager.loadFrameScript(url, false); })(arg); } this.oncontextmenu = e => { if (e.ctrlKey || e.shiftKey || e.altKey) return; e.preventDefault(); this._handleClick(true); } var popup = document.getElementById("contentAreaContextMenu"); addEventListener("popupshowing", { get hidden() { return !(gContextMenu.onLink || gContextMenu.onVideo || gContextMenu.onPlainTextLink); }, handleEvent() { if (this.hidden) return; var menuitem = document.createXULElement("menuitem"); for(var args of Object.entries({ image: self.image, oncommand: "play(event)", class: "menuitem-iconic", label: " В плейлист " + sysPlayerName })) menuitem.setAttribute(...args); menuitem.play = e => { rmb = e.button == 2; play(gContextMenu.linkURL || gContextMenu.mediaURL); } document.getElementById("context-savelink").before(menuitem); addDestructor(() => menuitem.remove()); this.handleEvent = e => { if (e.target == popup) menuitem.hidden = this.hidden; } } }, false, popup || 1); var play = link => custombuttons.confirmBox(null, "Открыть ссылку в плеере ?", "Да", "Отмена") && run([link]); var run = args => { var file = FileUtils.File(path); (run = args => { if (!file.exists()) return custombuttons.alertBox("File not exists!", path); var process = Cc["@mozilla.org/process/util;1"].createInstance(Ci.nsIProcess); process.init(file); rmb || args.push("/add"); process.runwAsync(args, args.length); })(args); }
Отсутствует
Сейчас приходится использовать для поиска по сайту в гугл букмарклет:
javascript:%20if%20(window.getSelection)%20selected%20=%20window.getSelection();%20else%20if%20(document.getSelection)%20selected%20=%20document.getSelection();%20else%20selected%20=%20document.selection.createRange().text;%20$s=%20''+selected;%20if(!$s)void%20($s=prompt('%D0%A7%D1%82%D0%BE%20%D0%B8%D1%81%D0%BA%D0%B0%D1%82%D1%8C-%D1%82%D0%BE%20%D0%B1%D1%83%D0%B4%D0%B5%D0%BC?','???'));if($s!=null)void(open('http://www.google.com/search?num=100&q=site:'+%20document.location.hostname+%20'+%20%22'+$s+'%22'))
// Настройка функций кликов мыши для кнопки .................. this.onclick =e=> { if ( e.button == 0 ) { var text = getSelect() || custombuttons.promptBox('Поиск по сайту в Google', 'Bведите текст ....')[1]; text !== '' && searchInWebsite(text); } e.button == 1 && searchInWebsite(gClipboard.read()); }; // Поиск по сайту в Google .................. function searchInWebsite(text) { var text = escape( convertFromUnicode("UTF-8", text) ); //var domain = Services.eTLD.getBaseDomain( gBrowser.currentURI ); var domain = encodeURIComponent(content.document.domain); var url = "http://www.google.com/search?as_q=" + text + "&as_sitesearch=" + domain; gBrowser.selectedTab = gBrowser.addTab(url); }; // Конвертировать текст в юникод .................. 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(); }; // Получить выделенный текст из страницы или false .................. function getSelect() { var sel = gBrowser.contentDocument.defaultView.getSelection().toString() return (sel == '') ? false : sel.toString().replace(/^\s+|\s+$/g,""); }; // Подсказка для кнопки .................. this.tooltipText = "Поиск по сайту \nЛ: Поиск выделенного или введённого текста \nС: Поиск текста из буфера обмена \nП: CB меню";
Отсутствует
Как размеры этих значков рихтануть ?
Как-то так, наверно
categories-box#categories > button.category {
background-size: 12px !important;
background-position: 16px 19px !important;
}
Отсутствует
Как открыть заданную папку?
this.onclick =e=> { e.button == 0 && runApp(); // ЛКМ }; function runApp() { var file = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile); file.initWithPath( getPath() ); file.launch(); }; function getPath() { try { return Services.prefs.getComplexValue(s, Ci.nsIPrefLocalizedString).data; } catch(e) { return "F:\\папка"; }; };
Win7
Отсутствует
kokoss
Еще бы знать, что менять
В файле config, что в папке с программой, вот это
// try {(code => { var {classes: Cc, interfaces: Ci, utils: Cu} = Components; var jsval, evl = true, re = e => Cu.reportError(e), imp = name => {try { return Cu.import(`resource://gre/modules/addons/${name}.jsm`, {}); } catch(ex) {}} if ((jsval = imp("AddonSettings"))) { jsval.AddonSettings = {ADDON_SIGNING: false, REQUIRE_SIGNING: false, ALLOW_LEGACY_EXTENSIONS: true}; try {evl = jsval.eval("this") === jsval;} catch(ex) {evl = false;} } var jsvals = ["XPIProvider", "XPIInstall"].map(imp).filter(i => i); jsvals[0].AddonSettings && lockPref("extensions.allow-non-mpc-extensions", true); jsvals[0].signaturesNotRequired = true; if (evl) return jsvals.forEach(jsval => {try {jsval.eval(code);} catch(ex) {re(ex);}}); var sl = Cc["@mozilla.org/moz/jssubscript-loader;1"].getService(Ci.mozIJSSubScriptLoader); Cu.importGlobalProperties(["URL", "Blob"]); var url = URL.createObjectURL(new Blob([(code)])); jsvals.forEach(jsval => {try {sl.loadSubScript(url, jsval);} catch(ex) {re(ex);}}); })(String.raw`((vzss, pckg) => { var trueDesc = {enumerable: true, value: true}; typeof Extension == "function" && Object.defineProperty(Extension.prototype, "experimentsAllowed", trueDesc); "AddonInternal" in this && Object.defineProperty(AddonInternal.prototype, "providesUpdatesSecurely", trueDesc); this.isDisabledLegacy = () => false; if ("XPIDatabase" in this) this.XPIDatabase.isDisabledLegacy = () => false; try {SIGNED_TYPES.clear();} catch(ex) {}; if (!vzss && !pckg) return; var re = /\x06\x03U\x04\x03..(\{[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\}|[a-z0-9-\._]*\@[a-z0-9-\._]+)0\x82\x02"0\r\x06\t/i; var getUUID = () => { var gen = Cc["@mozilla.org/uuid-generator;1"].getService(Ci.nsIUUIDGenerator); return (getUUID = () => gen.generateUUID().toString())(); } var getIdFromString = str => { var match = str && str.match(re); return match ? match[1] : getUUID(); } var getState = arg => ({ signedState: AddonManager.SIGNEDSTATE_NOT_REQUIRED, cert: typeof arg == "object" ? arg : {commonName: arg} }); var checkAddon = addon => { if (addon.id || ( "_installLocation" in addon ? addon._installLocation.name == KEY_APP_TEMPORARY : addon.location.isTemporary )) return getState(null); } var getRoot = () => !AppConstants.MOZ_REQUIRE_SIGNING && Services.prefs.getBoolPref(PREF_XPI_SIGNATURES_DEV_ROOT, false) ? Ci.nsIX509CertDB.AddonsStageRoot : Ci.nsIX509CertDB.AddonsPublicRoot; if (vzss) { var getURI = file => { var jsval = Cu.import("resource://gre/modules/addons/XPIProvider.jsm", {}); return (getURI = file => jsval.getURIForResourceInFile(file, "META-INF/mozilla.rsa"))(file); } var getIdFromFile = file => { var str, is = {close() {}}, sis = {close() {}}; try { is = Services.io.newChannelFromURIWithLoadInfo(getURI(file), null).open(); sis = Cc["@mozilla.org/scriptableinputstream;1"].createInstance(Ci.nsIScriptableInputStream); sis.init(is); str = sis.readBytes(sis.available()); } catch(ex) {} sis.close(); is.close(); return getIdFromString(str); } this.verifyZipSignedState = function verifyZipSignedState(aFile, aAddon) { var res = checkAddon(aAddon); return res ? Promise.resolve(res) : new Promise(resolve => { var callback = {openSignedAppFileFinished(rv, zipReader, cert) { zipReader && zipReader.close(); resolve(getState(cert || getIdFromFile(aFile))); }}; gCertDB.openSignedAppFileAsync(getRoot(), aFile, callback.wrappedJSObject = callback); }); } } if (pckg) Package.prototype.verifySignedState = function verifySignedState(addon) { var res = checkAddon(addon); return res ? Promise.resolve(res) : new Promise(resolve => this.verifySignedStateForRoot(addon, getRoot()).then(({cert}) => { if (cert) resolve(getState(cert)); else this.readBinary("META-INF", "mozilla.rsa").then( buffer => resolve(getState( getIdFromString(String.fromCharCode(...new Uint8Array(buffer))) )), () => resolve(getState(getUUID())) ); }, Cu.reportError) ); } })( "verifyZipSignedState" in this, typeof Package == "function" );`)} catch(err) { err.message != "Components is not defined" && Components.utils.reportError(err); }
Отредактировано vv07 (17-05-2022 16:54:50)
Отсутствует
Иногда при запуске открываются ненужные окна/вкладки, появляющиеся из-за какого-то сбоя. Помогает только удаление sessionstore.jsonlz4 при закрытом браузере.
Подскажите код, чтобы при следующем запуске сессия однократно не восстанавливалась. Снятие флажка настроек не помогает: «Открыть предыдущие окна и вкладки»
Например, такой сбой будет, если попробовать печатать фотку с почты, отправленную с Андроида. Такие фото даже в штатном Windows просмотрщике не открываются, пишет: Недостаточно памяти. Помогает только замена профиля цвета, например на Agfa: Swop Standart.
Возвращаясь к скрипту Менеджер сессий (+ мои правки тултипа): эту доработку удобнее в нём сделать, например добавить пункт меню: "Не восстанавливать сессию браузера при следующем запуске".
Отсутствует
Dobrov
Кнопка "Нет псевдосессиям".
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%u041D%u0435%u0442%20%u043F%u0441%u0435%u0432%u0434%u043E-%u0441%u0435%u0441%u0441%u0438%u0438%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAACNElEQVR42nWTXWiOYRjH78cwX832MlqMxDZy9kaa0hTlI5laUmhqO1CyKLZx5GArdjIHDnyVEyUn42BMmUhZsmWtlYRR1A7mY6YtNPvw+9f/1bu9j6d+3Xf3dd3/5/q6o/CfbzIkI5ZZkAOb4CDcjkJ3O+tv7DNZt0ALDERxIhxGEyG5jO1u2A9rYSFU++Ik7IErMCa/KCaSgpYwtLci5EpgDSyFOb78Au7AIqiwyGGifBknlM9yDM5YIFhE3zj0w1z4BPWIPHYWGULKPQlH4QDMt9B03044O0WIy7NZxAwVEuMoZ+vZn7KYIuuFFZCw0Ag8gOPwJXIEO6DQYt0I6W8SK2ZtgDJ4BqWwwBGq+B9cgrsSkuERbIAsaEZIl4ewKcKVUOv2f4ensBy2ycddrEkJqRvrnGqDhf447SynpDTq4SGcgzp3rUsZSUjFvAebndolaETss4eywJdXwT4NJOcn2Td5YF9rYCWkQl6AQ7AYOuTEhVZsqsllKHFq7ZyPcK66nHfRX6l2qWLvVG2gCIbh/o0w+LwqJCo9Cu81yYi8cbrbWXZ5rj7C9cjhJzzuehLz4Cv8gNUwAd/0zpQ2Yu+4o47l2fZL/v+GDKNG4LQfYnbME1THbsE1xHqnG9OFFM0J2Oqix32jcNGR9WcIIbLR0RTaWSEvgWJ3JhXRALTBTYR6pgghovm5aqGutB+U+1xzNAhPXKdOdS4jNYT0HI7AWxzG01JVJxuh1fTBT3zG4nL+CzymsTl1OvV4AAAAAElFTkSuQmCC%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B/*Initialization%20Code*/%0A/*Initialization%20Code*/%0A%28%28topic%2C%20id%29%20%3D%3E%20%7B%0A%20%20%20%20var%20obs%2C%20getObserver%20%3D%20%28%29%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20for%28var%20o%20of%20Services.obs.enumerateObservers%28topic%29%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20var%20res%20%3D%20o.wrappedJSObject%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20%28res%20%26%26%20id%20in%20res%29%20return%20res%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%20%20addDestructor%28reason%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20if%20%28reason%5B5%5D%20%21%3D%20%22e%22%29%20return%3B%0A%20%20%20%20%20%20%20%20var%20obs%20%3D%20getObserver%28%29%3B%0A%20%20%20%20%20%20%20%20obs%20%26%26%20obs.destroy%28%29%3B%0A%20%20%20%20%7D%29%3B%0A%20%20%20%20%28obs%20%3D%20getObserver%28%29%29%20%7C%7C%20Services.obs.addObserver%28obs%20%3D%20%7B%0A%20%20%20%20%20%20%20%20%5Bid%5D%3A%20true%2C%20__proto__%3A%20null%2C%20destroyed%3A%20false%2C%0A%20%20%20%20%20%20%20%20destroy%28%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20Services.obs.removeObserver%28this%2C%20topic%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20this.destroyed%20%3D%20true%3B%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20get%20wins%28%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20Array.from%28Services.wm.getEnumerator%28%22navigator%3Abrowser%22%29%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.filter%28win%20%3D%3E%20win.toolbar.visible%29%3B%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20observe%28cancelQuit%2C%20t%2C%20data%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20data%20%21%3D%20%22restart%22%20%26%26%20%21cancelQuit.data%20%26%26%20this.onQuit%28true%29%3B%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20handleEvent%28%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20this.destroyed%20%7C%7C%20this.onQuit%28%29%3B%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20onQuit%28fromObs%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20var%20%7Bwins%7D%20%3D%20this%2C%20multi%20%3D%20wins.length%20%3E%201%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20%28multi%29%20return%20fromObs%20%26%26%20this.destroy%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20this.destroy%28%29%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20var%20%7Btabs%7D%20%3D%20wins%5B0%5D.gBrowser%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20%28tabs.length%20%3E%201%20%29%20return%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20var%20es%20%3D%20JSON.parse%28SessionStore.getTabState%28tabs%5B0%5D%29%29.entries%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20es.length%20%3D%3D%201%20%26%26%20wins%5B0%5D.isBlankPageURL%28es%5B0%5D.url%29%20%26%26%20this.erase%28%29%3B%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20erase%28%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20Services.obs.notifyObservers%28null%2C%20%22browser%3Apurge-session-history%22%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20Cu.import%28%22resource%3A///modules/sessionstore/SessionFile.jsm%22%2C%20%7B%7D%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.SessionFileInternal.write%20%3D%20%28%29%20%3D%3E%20%7B%7D%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%2C%20topic%2C%20false%29%3B%0A%20%20%20%20addEventListener%28%22DOMWindowClose%22%2C%20obs%29%3B%0A%7D%29%28%22quit-application-requested%22%2C%20%60%24%7B_id%7D%3AquitApplicationRequestedObserver1%60%29%3B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B/*CODE*/%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E
Отсутствует
Кнопка запуска программы.
Посмотрите плз, где-то ошибка?
Никак не хочет запускаться программа.
91.8.0esr
startProcess("C:\\Program Files\\Psiphon\\psiphon3.exe",[""]); function startProcess(path, args) { var file = Components.classes["@mozilla.org/file/local;1"] .createInstance(Components.interfaces.nsIFile); file.initWithPath(path); if(file.exists()) { var process = Components.classes["@mozilla.org/process/util;1"] .createInstance(Components.interfaces.nsIProcess); process.init(file); process.run(false, args, args.length); } else custombuttons. alertBox ("Файл не найден", path); };
Отсутствует