Dumby, solombala,
№13841, №13844, вроде так легче? чем расширение, если я правильно понял, там перемещает не недавнее при клике на саму кнопку?
//Flip - forum.mozilla-russia.org/viewtopic.php?pid=773298#p773298 (dummy=>{var getTab=()=>{ var tab=dummy;for(var t of gBrowser.tabs)if(!t.closing&&!t.selected&&t.lastAccessed>tab.lastAccessed)tab=t;return tab==dummy?gBrowser.selectedTab:tab;} var tabToSelect=dummy;addDestructor(()=>tabToSelect=null);this._handleClick=()=>gBrowser.selectedTab=tabToSelect.parentNode&&!tabToSelect.closing?tabToSelect:getTab(); addEventListener("TabSelect",e=>tabToSelect=e.detail.previousTab,false,gBrowser.tabContainer||1);})({lastAccessed:0}); /**/
Посмотрел интересно сделано, я как то на одной кнопки примерное сделал, но там топорно автопопап вылазит и другое меню, ну как смог).. (ну как сделал скопипастил).
Реально зачем плодить 100 кнопок если можно в одном все реализовать.
С другой стороны тогда зачем CB, когда можно через .uc.js файлы, или расширения типа AddToolbarButtons. В плане отваливания от версий к версий наверно меньше и не надо ждать фикса CB. Хотя это просто размышления, не все ведь умеют с кодом, я к примеру тоже не умею но полазив немного подумал это как-то удобнее чем отдельный нестабильный фикс,фикс,фикс. А так спс еще раз Dumby, что не бросает нас но вечно ли это.. кто потом придет?) + я не знаю, может с CB какие-та функций берутся для самих кнопок или еще что.
Просто размышления! ничего не имею против и т.д. пока что многие кнопки у меня на CB, и наврятли я смог бы сам перенести все на что-то новое.
Отредактировано func4ptch4 (09-11-2019 20:51:09)
Отсутствует
в ярлык пихать , не того...не эстетично
Не только, ключ не подхватывается после рестарта,
не работает с ключём -p (в смысле с окном выбора профиля),
и при запуске из внешних приложений ключу тоже неотуда взяться.
Поэтому, только в about:config, вручную, переключить
browser.launcherProcess.enabled, закрыть браузер, запустить браузер.
Ну, или скажем так: другой способ мне не известен.
Отсутствует
solombala
батник = start Firefox.exe -no-deelevate -profile .\profileTest
но наверно это тоже самое что и с ярлыка, или вот видел такой старый код, по идее можно наверно как-то в config.js...
//forum.mozilla-russia.org/viewtopic.php?pid=568343#p568343 //путь до папки с firefox.exe, в данном случае Aurora var profileDir=Cc["@mozilla.org/file/directory_service;1"] .getService(Ci.nsIProperties) .get("CurProcD",Ci.nsIFile).path; //путь до firefox.exe var firefox=profileDir+"\\..\\Aurora\\firefox.exe"; startProcess(firefox,["-no-remote","-P","Test",url]);
Отредактировано func4ptch4 (11-11-2019 22:59:03)
Отсутствует
Браузер по умолчанию не возможно с ключом -no-deelevate , но рестарт получилось , аж два рестарта. С восстановлением вкладок и с полной очисткой профиля ...
Ключ работает.
Отредактировано solombala (14-11-2019 23:08:16)
Отсутствует
Dumby подскажи если вариант сделать в about:addons на главной странице в каждом дополнении копии кнопок Отключить, Включить, Обновить как в старых версиях Лисы?
Отсутствует
Возможно ли поправить кнопки "Удалить куки текущего сайта" и "Переключить текущий поисковик" под 68?
«The Truth Is Out There»
Отсутствует
вариант сделать в about:addons на главной странице в каждом дополнении копии кнопок Отключить, Включить, Обновить
Похоже, нормально клонируются, только стиль к ним нужен.
Поклевал немного правил из чужих стилей, мне, вроде, подходяще.
Кстати, баг уже в autoland пошёл, так что ...
((cn, flag, css) => addEventListener("update", ({ btnActions: ["preferences", "toggle-disabled", "remove", "install-update"], every(reason) { reason || addDestructor(this.every, this); var g = this.g || (this.g = Cu.import( "resource://gre/modules/AddonManager.jsm", {} )); var has = flag in g; if (reason) { if (!has || reason[5] != "e") return; } else if (has) return this; var method, wins = Array.from( g.AddonManagerInternal.addonListeners, Cu.getGlobalForObject ).filter( w => w.docShell && w.docShell.name == "html-view-browser" ); if (reason) method = "destroyDoc", delete g[flag]; else method = "initDoc", g[flag] = true; for(var win of new Set(wins)) this[method](win.document); return this; }, initDoc(doc, onlyStyle) { if (doc[flag]) return; doc[flag] = true; doc.ownerGlobal.windowUtils.loadSheetUsingURIString(this.url, this.type); if (onlyStyle) return; for(var card of doc.getElementsByTagName("addon-card")) this.onCard(card); }, destroyDoc(doc) { if (!doc[flag]) return; delete doc[flag]; for(var span of Array.from(doc.getElementsByClassName(cn))) span.remove(); doc.ownerGlobal.windowUtils.removeSheetUsingURIString(this.url, this.type); }, get url() { this.type = windowUtils.USER_SHEET; this.btnActions = this.btnActions.map( action => `panel-list > panel-item[action="${action}"]` ); delete this.url; return this.url = "data:text/css;charset=utf-8," + encodeURIComponent(css.replace(/;/g, " !important;")); }, handleEvent(e) { var card = e.target; card.nodeName == "ADDON-CARD" && this.onCard(card); }, onCard(card, again) { var div = card.querySelector("div.more-options-menu"); if (!div) return again || card.ownerGlobal.requestAnimationFrame( () => this.onCard(card, true) ); var [span] = card.getElementsByClassName(cn); if (span) span.textContent = ""; else { var doc = card.ownerDocument; doc[flag] || this.initDoc(doc, true); div.before(span = doc.createElement("span")); span.className = cn; span.onclick = this.onclick; } var btns = this.btnActions.map(sel => { var item = div.querySelector(sel); return item && item.cloneNode(true); }); var {addon} = card, cbbtn = addon.type == "custombuttons"; for(var item of btns) if (item) { span.append(item); item.shadowRoot.querySelector("button").classList.add("cb-cloned-button"); if (cbbtn) item.closest = this.closest; } if (addon.id != "custombuttons@xsms.org") return; var item = span.querySelector("[action=preferences]"); if (item) item.removeAttribute("hidden"), item.onclick = this.cbprefs; }, onclick(e) { InspectorUtils.removeContentState(e.target, 4, true); Services.focus.clearFocus(e.target.ownerGlobal); }, closest(sel) { return sel == ".more-options-menu" || this.ownerGlobal .Element.prototype.closest.call(this, sel); }, cbprefs(e) { var url = "chrome://custombuttons/content/prefs.xul"; for(var win of Services.wm.getEnumerator(null)) if (!win.closed && win.document.documentURI == url) return win.focus(); e.view.requestAnimationFrame(() => openDialog( url, "", "chrome,titlebar,toolbar,centerscreen,modal" )); } }).every(), true))("cb-cloned-buttons-container", "AAcbButtonizedFlag", ` addon-card:not([expanded]) .card-contents { width: 1px; } span.cb-cloned-buttons-container { display: flex; } button.cb-cloned-button { width: auto; padding: 1px 6px 3px 6px; margin: 0 1px; background-image: none; border: 1px solid var(--in-content-box-border-color); border-radius: 0px; font-size: 13px; font-family: Segoe UI; } button.cb-cloned-button:after { display: none; } `);
В 72 CB будет работать?
Это почти невозможно знать заранее.
"Переключить текущий поисковик" под
68?
(obj => { obj.observe(); this._handleClick = () => obj.menupopup.openPopup(this); var topic = "browser-search-engine-modified"; Services.obs.addObserver(obj, topic, false); addDestructor(() => Services.obs.removeObserver(obj, topic)); if (!obj.excludeHiddenOneOffs) return; var obs = () => obj.upd = true; Services.prefs.addObserver(obj.pref, obs); addDestructor(() => Services.prefs.removeObserver(obj.pref, obs)); })({ excludeHiddenOneOffs: false, get menupopup() { this.upd && this.rebuild(); return this.popup; }, get popup() { var popup = self.appendChild(document.createXULElement("menupopup")); popup.setAttribute("context", ""); popup.setAttribute("position", "after_start"); popup.setAttribute("oncommand", "Services.search.defaultEngine = event.target.engine"); delete this.popup; return this.popup = popup; }, async rebuild() { this.popup.textContent = ""; var df = document.createDocumentFragment(); var de = Services.search.defaultEngine.wrappedJSObject, jsde = this.json(de); if (this.excludeHiddenOneOffs) var ex = Services.prefs.getStringPref(this.pref, "").split(","); var check = true; for(var engine of await Services.search.getVisibleEngines()) { if (check && engine.name == de.name && this.json(engine) == jsde) { check = false; continue; } if (this.excludeHiddenOneOffs && ex.includes(engine.name)) continue; var menuitem = df.appendChild(document.createXULElement("menuitem")); menuitem.engine = engine; menuitem.label = engine.name; menuitem.image = this.img(engine); menuitem.className = "menuitem-iconic"; } this.upd = this.popup.append(df); }, observe() { var engine = Services.search.defaultEngine; (self.icon || document.getAnonymousElementByAttribute( self, "class", "toolbarbutton-icon" )).src = this.img(engine); self.tooltipText = engine.name; this.upd = true; }, pref: "browser.search.hiddenOneOffs", json: e => JSON.stringify(e.toJSON()), img: e => e.iconURI ? e.iconURI.spec : "chrome://browser/skin/search-engine-placeholder.png" });
Отсутствует
Dumby спасибо, то что нужно
Отсутствует
Всем привет. Помогите сделать кнопку со следующим функционалом:
- Копирование в буфер обмена названия активной вкладки
- Замена по регулярным (изменение буфера)
(.+) (\(.+\)) \[(\d{4})[^\]]+\] (.+) (.+) (.+)
$1 $2 ($4) ($3)
Название вкладки Как чокнутые / Безумное веселье / La pazza gioia (Паоло Вирдзи / Paolo Virzì) [2016, Италия, Франция, драма, комедия, BDRip] MVO (СВ Студия) :: RuTracker.org
Результат (в буфере) Как чокнутые - Безумное веселье - La pazza gioia (Паоло Вирдзи - Paolo Virzì) (MVO (СВ Студия)) (2016)
Отсутствует
unter_officer пишет"Переключить текущий поисковик" под
68?
скрытый текстВыделить кодКод:
(obj => { obj.observe(); this._handleClick = () => obj.menupopup.openPopup(this); var topic = "browser-search-engine-modified"; Services.obs.addObserver(obj, topic, false); addDestructor(() => Services.obs.removeObserver(obj, topic)); if (!obj.excludeHiddenOneOffs) return; var obs = () => obj.upd = true; Services.prefs.addObserver(obj.pref, obs); addDestructor(() => Services.prefs.removeObserver(obj.pref, obs)); })({ excludeHiddenOneOffs: false, get menupopup() { this.upd && this.rebuild(); return this.popup; }, get popup() { var popup = self.appendChild(document.createXULElement("menupopup")); popup.setAttribute("context", ""); popup.setAttribute("position", "after_start"); popup.setAttribute("oncommand", "Services.search.defaultEngine = event.target.engine"); delete this.popup; return this.popup = popup; }, async rebuild() { this.popup.textContent = ""; var df = document.createDocumentFragment(); var de = Services.search.defaultEngine.wrappedJSObject, jsde = this.json(de); if (this.excludeHiddenOneOffs) var ex = Services.prefs.getStringPref(this.pref, "").split(","); var check = true; for(var engine of await Services.search.getVisibleEngines()) { if (check && engine.name == de.name && this.json(engine) == jsde) { check = false; continue; } if (this.excludeHiddenOneOffs && ex.includes(engine.name)) continue; var menuitem = df.appendChild(document.createXULElement("menuitem")); menuitem.engine = engine; menuitem.label = engine.name; menuitem.image = this.img(engine); menuitem.className = "menuitem-iconic"; } this.upd = this.popup.append(df); }, observe() { var engine = Services.search.defaultEngine; (self.icon || document.getAnonymousElementByAttribute( self, "class", "toolbarbutton-icon" )).src = this.img(engine); self.tooltipText = engine.name; this.upd = true; }, pref: "browser.search.hiddenOneOffs", json: e => JSON.stringify(e.toJSON()), img: e => e.iconURI ? e.iconURI.spec : "chrome://browser/skin/search-engine-placeholder.png" });
Dumby, после перезапуска браузера кнопка перестает работать.
P.S. В консоли пишет: "Something tried to use the search service before it's been properly intialized. Please examine the stack trace to figure out what and where to fix it"
Как временное решение пока сделал задержку, обернув ваш код: setTimeout (()=> { ..... }, 5000);
Отредактировано unter_officer (23-11-2019 18:57:33)
«The Truth Is Out There»
Отсутствует
Mrakobes666
Т.к. ты зажал адресс сайта(для чего вы это делаете, люди??), то чеерз переменную будет. Т.е. либо засылай в ф-цию текст, либо нет. Тогба будет браццо название открытого документа.
let url = "Как чокнутые / Безумное веселье / La pazza gioia (Паоло Вирдзи / Paolo Virzì) [2016, Италия, Франция, драма, комедия, BDRip] MVO (СВ Студия) :: RuTracker.org"; function getCurTitle(text){ let title, titleRe, badSymbols = new RegExp(/(\w+) (\(.+\)) \[(\d{4})[^\]]+\] (.+) (.+) (.+)/gi), rSym = "$1$2($4)($3)"; if(text) { title = text; } else { title = content.document.title; }; titleRe = title.replace(badSymbols, rSym); return titleRe.replace(/\//g, "-"); }; alert(getCurTitle(url)); // или без передачи alert(getCurTitle());
...программисты словно войну какую-то ведут за свои обновления. Блин, почему сейчас повсюду мания ухудшать интерфейсы и делать их максимально неудобными?! Radiation
Отсутствует
mokujin сейчас постараюсь объяснить, качаю кино, соответственно с рутрекера (в оконцовке первой строки есть), задача такая, жмакнул на кнопку - попало в буфер обмена не адовая строка со слэшами и мусорной инфой, а красивенькое наименования кинца, которое я сразу ввожу из буфера по ctrl+V в utorrent, помоги пожалуста, друже
а адрес страницы https://rutracker.org/forum/viewtopic.php?t=5751922 для экспериментов
в общем название фильма всегда соответствует названию вкладки, ПКМ на табе - скопировать название вкладки - копирует именно название кино, намного удобнее конечно, чем выделять курсором
и еще, сабжем я пользовался до квантума, сейчас лиса 70.1, как впилить то сюда, подписи цифровые отключил по методу https://forum.mozilla-russia.org/viewtopic.php?id=70326 все равно пишет "не могу установить, поврежден ваш кастомбаттон"
Отредактировано Mrakobes666 (23-11-2019 21:26:53)
Отсутствует
В консоли пишет: "Something tried to use the search service before it's been properly intialized.
Что-то не получается это воспроизвести. Но, вообще, вещь знакомая.
Попробуй заменить первую строку на эти две
Отсутствует
Mrakobes666: ну ф-цию мы тебе сделали по составленной тобой регулярке.
Алертит нужный тебе формат, соттв-но твоему RegEx-у. Вот пруф с той ссылки что ты дал
Просто вставляй эту ф-ция в свою кнопку и пиши куда хочешь. В буфер если, то вместо alert() делай
gClipboard.write( getCurTitle() ); function getCurTitle(text){ let title, titleRe, badSymbols = new RegExp(/(\w+) (\(.+\)) \[(\d{4})[^\]]+\] (.+) (.+) (.+)/gi), rSym = "$1$2($4)($3)"; if(text) { title = text; } else { title = content.document.title; }; titleRe = title.replace(badSymbols, rSym); return titleRe.replace(/\//g, "-"); }; // alert(getCurTitle());
/* Код */ gt(); function gt(){ if(getDom() == "rutracker.org") {gClipboard.write( getCurTitle() );} else { alert("Только для сайта RuTracker.org"); }; function getCurTitle(text){ let title, titleRe, badSymbols = new RegExp(/(\w+) (\(.+\)) \[(\d{4})[^\]]+\] (.+) (.+) (.+)/gi), rSym = "$1$2($4)($3)"; if(text) { title = text; } else { title = content.document.title; }; titleRe = title.replace(badSymbols, rSym); return titleRe.replace(/\//g, "-"); }; function getDom(){ return Services.eTLD.getBaseDomain(Services.io.newURI(content.location, null, null)); } };
... а как прикручивать CB это уж сам смотри. Здесь есть все инструкции и даже два, помойму, варианта есть. благодарочка Dumby
Отредактировано mokujin (23-11-2019 22:08:25)
...программисты словно войну какую-то ведут за свои обновления. Блин, почему сейчас повсюду мания ухудшать интерфейсы и делать их максимально неудобными?! Radiation
Отсутствует
Что-то не получается это воспроизвести. Но, вообще, вещь знакомая.
Попробуй заменить первую строку на эти двескрытый текст
Так всё отлично. Спасибо.
А возможно ли ещё поправить кнопку Удалить куки текущего сайта под 68?
«The Truth Is Out There»
Отсутствует
Отсутствует
Значит в "квантумах" нету gClipboard.write() или заменено на что-то другое. Звиняй, не знаю. Пусть подскажут другие кто.
Замени на alert() , смотри в Консоль какие ошибки, подсказки тама есть.
...программисты словно войну какую-то ведут за свои обновления. Блин, почему сейчас повсюду мания ухудшать интерфейсы и делать их максимально неудобными?! Radiation
Отсутствует
mokujin консоль при нажатии на кнопку молчит((
посоны, помогите страждующему, поджимаю ногу и прищуриваю глаз для жалолсти
Отсутствует
А возможно ли ещё поправить кнопку Удалить куки текущего сайта
Возможно, наверное, но я для этого совсем неподходящ.
Может Cookies Permissions поставь, или WebExtensions какой-нибудь поищи.
А то как бы с меня чего плохого не приключилось.
(obj => { this.setAttribute("context", ""); this.onclick = e => obj[e.button < 2](e); })({ true(e) { var domain = this.domain(); if (!domain) return; this.cookies(domain); this.webappstore(domain); this.macromedia(); if (e.button) for(var br of gBrowser.browsers) try { this.domain(br) == domain && br.reload(); } catch(ex) {} }, false(e) { e.ctrlKey || e.shiftKey ? gShowPopup(self) : this.window(); }, domain(br = gBrowser.selectedBrowser, res) { try { res = new URL(br.currentURI.spec).hostname; res = res.includes(".") ? Services.eTLD.getBaseDomainFromHost(res) : undefined; } finally {return res;} }, remove(...args) { (this.remove = Services.cookies.remove.length == 4 ? Services.cookies.remove : (h, n, p, a) => Services.cookies.remove(h, n, p, false, a) )(...args); }, cookies(domain, has) { for(var {host, name, path, originAttributes, rawHost} of ( Services.cookies.enumerator || Services.cookies.cookies )) Services.eTLD.hasRootDomain(rawHost, domain) && this.remove(host, name, path, originAttributes); }, webappstore(domain) { var db = FileUtils.getFile("ProfD", ["webappsstore.sqlite"]); var conn = Services.storage.openDatabase(db); conn.executeSimpleSQL(`DELETE FROM webappsstore2 WHERE scope LIKE "%${ domain.split("").reverse().join("") + "." }%"`); conn.close(); }, macromedia() { var dir = Services.dirsvc.get("AppData", Ci.nsIFile); dir.append("Macromedia"); dir.exists() && dir.isDirectory() && dir.remove(true); dir.create(dir.DIRECTORY_TYPE, 0o755); }, get sdm() { this.url = "chrome://browser/content/preferences/siteDataSettings.x" + (parseInt(Services.appinfo.platformVersion) <= 71 ? "ul" : "html"); delete this.sdm; return this.sdm = ChromeUtils.import( "resource:///modules/SiteDataManager.jsm" ).SiteDataManager; }, async window() { var domain = this.domain(); var win = Services.wm.getMostRecentWindow("Browser:SiteDataSettings"); win && win.close(); await this.sdm.updateSites(); win = openDialog(this.url, "_blank", ""); if (!domain) return; await new Promise(resolve => win.addEventListener("DOMContentLoaded", resolve, {once: true}) ); var list = win.document.getElementById("sitesList"); list.clearSelection = () => { delete list.clearSelection; list.selectedIndex = 0; list.focus(); } win.document.getElementById("searchBox").inputField.editor .QueryInterface(Ci.nsIPlaintextEditor).insertText(domain); } });
Значит в "квантумах" нету gClipboard.write()
gClipboard не лисий, а от Custom Buttons.
А вот content в "постквантумах" да, не слишком полезен.
Лучше бы так предложил
var {label} = gBrowser.selectedTab; var re = /(.+) (\(.+\)) \[(\d{4})[^\]]+\] (.+) (.+) (.+)/; re.test(label) && gClipboard.write( label.replace(re, "$1 $2 ($4) ($3)").replace(/ \/ /g, " - ") );
Отсутствует
Dumby спасибо, милый друг! Как то по педристически, но я очень рад, сколько я мучался с фоксреплейсом и прочими автозаменялками, пока меня не осенило, такая простая кнопка, я очень рад!
Отсутствует
Возможно, наверное, но я для этого совсем неподходящ.
Может Cookies Permissions поставь, или WebExtensions какой-нибудь поищи.
А то как бы с меня чего плохого не приключилось.скрытый текстВыделить кодКод:
(obj => { this.setAttribute("context", ""); this.onclick = e => obj[e.button < 2](e); })({ true(e) { var domain = this.domain(); if (!domain) return; this.cookies(domain); this.webappstore(domain); this.macromedia(); if (e.button) for(var br of gBrowser.browsers) try { this.domain(br) == domain && br.reload(); } catch(ex) {} }, false(e) { e.ctrlKey || e.shiftKey ? gShowPopup(self) : this.window(); }, domain(br = gBrowser.selectedBrowser, res) { try { res = new URL(br.currentURI.spec).hostname; res = res.includes(".") ? Services.eTLD.getBaseDomainFromHost(res) : undefined; } finally {return res;} }, remove(...args) { (this.remove = Services.cookies.remove.length == 4 ? Services.cookies.remove : (h, n, p, a) => Services.cookies.remove(h, n, p, false, a) )(...args); }, cookies(domain, has) { for(var {host, name, path, originAttributes, rawHost} of ( Services.cookies.enumerator || Services.cookies.cookies )) Services.eTLD.hasRootDomain(rawHost, domain) && this.remove(host, name, path, originAttributes); }, webappstore(domain) { var db = FileUtils.getFile("ProfD", ["webappsstore.sqlite"]); var conn = Services.storage.openDatabase(db); conn.executeSimpleSQL(`DELETE FROM webappsstore2 WHERE scope LIKE "%${ domain.split("").reverse().join("") + "." }%"`); conn.close(); }, macromedia() { var dir = Services.dirsvc.get("AppData", Ci.nsIFile); dir.append("Macromedia"); dir.exists() && dir.isDirectory() && dir.remove(true); dir.create(dir.DIRECTORY_TYPE, 0o755); }, get sdm() { this.url = "chrome://browser/content/preferences/siteDataSettings.x" + (parseInt(Services.appinfo.platformVersion) <= 71 ? "ul" : "html"); delete this.sdm; return this.sdm = ChromeUtils.import( "resource:///modules/SiteDataManager.jsm" ).SiteDataManager; }, async window() { var domain = this.domain(); var win = Services.wm.getMostRecentWindow("Browser:SiteDataSettings"); win && win.close(); await this.sdm.updateSites(); win = openDialog(this.url, "_blank", ""); if (!domain) return; await new Promise(resolve => win.addEventListener("DOMContentLoaded", resolve, {once: true}) ); var list = win.document.getElementById("sitesList"); list.clearSelection = () => { delete list.clearSelection; list.selectedIndex = 0; list.focus(); } win.document.getElementById("searchBox").inputField.editor .QueryInterface(Ci.nsIPlaintextEditor).insertText(domain); } });
Dumby, ну почему же сразу плохого.
Протестировал на пяти-шести сайтах, пока всё нормально работает. Посмотрим, как будет дальше.
Большое спасибо.
«The Truth Is Out There»
Отсутствует
Dumby, поздравляю с || Сообщений: 1000 || -_-
Отсутствует