Здравствуйте, уважаемые кнопкоделы!
¿ Не могли бы вы посмотреть кнопку Открыть страницу в другом браузере( Firefox ) от 20.05.2019., и как-нибудь её адаптировать к актуальным версиям. В ней уже сразу не работает ЛКМ => Открыть меню с браузерами.
Заранее спасибо.
Или может у кого есть уже готовая похожая кнопка ?
May be someone can port this script (https://github.com/benzBrake/FirefoxCustomize/tree/master/userChromeJS/OpenWithHelper) to CB
Отсутствует
На 126 перестал работать код Вставить и перейти, можно ли поправить?
addEventListener("keydown", e => e.ctrlKey && e.code=="KeyB" && e.preventDefault() + BrowserOpenTab() + gURLBar.select() + goDoCommand("cmd_paste") + gURLBar.handleCommand());
Farby
Чётко!
Отредактировано momo2000 (15-05-2024 16:02:05)
Отсутствует
А есть возможность скачать рабочий Custom Buttons?
Отсутствует
Есть ли какое-либо руководство по современным версиям CB?
Такое же как и по реликтовым.
Готовые кнопки для Custom Buttons | Форум Mozilla Россия
Первый пост. Как добавить кнопку, как удалить.
Отсутствует
Dumby Посмотри пожалуйста, на 127 не работает "Консоль браузера в сайдбаре", есть ли у тебя для этой версии кнопка?
Отредактировано Andrey_Krropotkin (12-06-2024 21:54:05)
Отсутствует
"Консоль браузера в сайдбаре"
как-то для себя делал UCF кнопку по мотивам Dumby, проверял на 115 - 127, наверное должно работать и на 78
Работает только одна кнопка, либо из CustomButtons либо UCF, иначе конфликт.
// try {CustomizableUI.createWidget({ label: "Browser Console in Sidebar-Tab", id: "ucf-cbbtn-BrowserConsole", tooltipText: "Консоль браузера" +"\n"+"\n"+ "ЛКМ: В боковой панели" +"\n"+ "СКМ: В новой вкладке" +"\n"+ "ПКМ: Стандартное меню ", localized: false, get initCode() { this.event = Object.create(null); delete this.initCode; return this.initCode = Cu.readUTF8URI(Services.io.newURI( // "chrome://widget/content/BrowserConsole/BrowserConsole.js" "chrome://user_chrome_files/content/custom_scripts/BrowserConsole.js" )); }, cbu: { types: { 128: "Bool", boolean: "Bool", 64: "Int", number: "Int", 32: "String", string: "String" }, getPrefs(pref) { try { return Services.prefs[`get${ this.types[Services.prefs.getPrefType(pref)] }Pref`](pref); } catch {return null;} }, setPrefs(pref, val) { Services.prefs[`set${this.types[typeof val]}Pref`](pref, val); } }, addDestructor(destructor, context) { this._destructors.push({destructor, context}); }, addEventListener(...args) { var trg = args[3]; if (!trg) trg = args[3] = this.ownerGlobal; trg.addEventListener(...args); this._handlers.push(args); }, async onCreated(btn) { await btn.delayedStartupPromise; btn.setAttribute("image", "chrome://devtools/skin/images/tool-webconsole.svg"); var win = btn.ownerGlobal; btn._handlers = new win.Array(); btn._destructors = new win.Array(); win.addEventListener("unload", this, {once: true}); new win.Function("self,_id,cbu,addDestructor,addEventListener,event,_phase", this.initCode) .call(btn, btn, this.id, this.cbu, this.addDestructor.bind(btn), this.addEventListener.bind(btn), this.event, "init"); }, handleEvent(e) { var btn = e.target.getElementById(this.id); for(var args of btn._handlers) args.pop().removeEventListener(...args); delete btn._handlers; for(var {destructor, context} of btn._destructors) try {destructor.call(context, "destructor");} catch(ex) {Cu.reportError(ex);} delete btn._destructors; } });} catch(ex) {Cu.reportError(ex);}
/*Initialization Code*/ ({ title: "Browser Console", url: "chrome://devtools/content/webconsole/index.html", icon: "chrome://devtools/skin/images/tool-webconsole.svg", init() { var trg = document.getElementById("browser"); trg && addEventListener("DOMContentLoaded", this, false, trg); var id = "viewBrowserConsoleSidebar"; var menuitem = this.element("menuitem", { type: "checkbox", label: this.title, id: "menu_browserConsoleSidebar", oncommand: `(globalThis.SidebarController || globalThis.SidebarUI).toggle("${id}");` }, document.getElementById("viewSidebarMenu")); var btn = this.element("toolbarbutton", { type: "checkbox", label: this.title, id: "sidebar-switcher-browserConsole", oncommand: `(globalThis.SidebarController || globalThis.SidebarUI).show("${id}");`, class: "subviewbutton subviewbutton-iconic" }); document.querySelector( parseInt(Services.appinfo.platformVersion) >= 116 ? 'menuitem[id^="sidebar-switcher-"] + menuseparator' : 'toolbarbutton[id^="sidebar-switcher-"] + toolbarseparator' ).before(btn); (globalThis.SidebarController || globalThis.SidebarUI).sidebars.set(id, { url: this.url, buttonId: btn.id, title: this.title, menuId: menuitem.id }); (globalThis.SidebarController || globalThis.SidebarUI).isOpen && (globalThis.SidebarController || globalThis.SidebarUI).currentID == id && (globalThis.SidebarController || globalThis.SidebarUI).selectMenuItem(id); var popupset = this.popupset = this.element("popupset", { id: `CB${_id.slice(20)}-browserConsole-popupset` }, document.documentElement); var css = `\ #${btn.id} > .toolbarbutton-icon, #sidebar-box[sidebarcommand="${id}"] > #sidebar-header > #sidebar-switcher-target > #sidebar-icon { list-style-image: url(${this.icon}); }`; var str = (cbu.cb || "") + "data:text/css," + encodeURIComponent(css), type = windowUtils.USER_SHEET; windowUtils.loadSheetUsingURIString(str, type); addDestructor(() => { (globalThis.SidebarController || globalThis.SidebarUI).sidebars.delete(id); btn.remove(); menuitem.remove(); popupset.remove(); windowUtils.removeSheetUsingURIString(str, type); }); parseInt(Services.appinfo.platformVersion) < 73 && "insertFTLIfNeeded" in MozXULElement && MozXULElement.insertFTLIfNeeded("toolkit/main-window/editmenu.ftl"); self.onclick = e => { if (e.button == 2) return; if (!e.button && !e.shiftKey) return (globalThis.SidebarController || globalThis.SidebarUI).toggle(id); var st = gBrowser.selectedTab, tab; if (!e.ctrlKey) tab = gBrowser.visibleTabs.find(tab => { var br = gBrowser.getBrowserForTab(tab); return br.currentURI.spec == this.url || ( "_cachedCurrentURI" in br && br._cachedCurrentURI.spec == this.url ) }); if (tab == st) return; if (!tab) tab = gBrowser.addTrustedTab(this.url); gBrowser.moveTabTo(tab, st._tPos + 1); gBrowser.selectedTab = tab; } for(var br of gBrowser.browsers) { if (br.currentURI.spec != this.url) continue; var doc = br.contentDocument; if (doc && ( doc.readyState == "complete" || doc.readyState == "interactive" )) doc.querySelector( "main#app-wrapper,div#output-container" ).childElementCount ? this.defineDocPopupset(doc) : this.handleEvent({target: doc}); } if (!btn.hasAttribute("checked")) return; var doc = (globalThis.SidebarController || globalThis.SidebarUI).browser.contentDocument; if (doc.documentURI != this.url) btn.doCommand(); else if (doc.readyState == "complete") this.defineDocPopupset(doc); }, defineDocPopupset(doc) { this.definePopupset( doc.querySelector("popupset") || doc.documentElement.appendChild(doc.createXULElement("popupset")) ); }, get definePopupset() { var append = customElements.get("menuitem") ? popup => { this.popupset.appendChild(popup); popup.setAttribute("oncommand", "event.target.cmd()"); for(var node of [...popup.querySelectorAll("menuitem")]) { var menuitem = document.importNode(node, true); menuitem.cmd = Services.els.getListenerInfoFor(node) .find(inf => inf.type == "command").listenerObject; popup.replaceChild(menuitem, node); } return popup; } : this.popupset.appendChild.bind(this.popupset); delete this.definePopupset; return this.definePopupset = popupset => popupset.appendChild = append; }, lss: Services.scriptloader.loadSubScript, async handleEvent({target: doc}) { if (!doc || doc.documentURI != this.url) return; var win = doc.defaultView; if ( win.docShell.name == "toolbox-panel-iframe-webconsole" || doc.DOMContentLoadedEventHandled ) return; doc.DOMContentLoadedEventHandled = true; if (this instanceof XULElement) // Custom Buttons "custombuttonsConsole" in win || this.lss( "chrome://custombuttons/content/consoleOverlay.js", win ); var cw = win.isChromeWindow, bc; if (!cw) { if (doc.visibilityState == "hidden") { var {focus} = win; win.focus = () => win.focus = focus; } doc.title = this.title; var link = doc.createElement("link"); link.setAttribute("rel", "shortcut icon"); link.setAttribute("href", this.icon); doc.head.prepend(link); var br = win.docShell.chromeEventHandler; var cmAttr = br.getAttribute("contextmenu"); cmAttr && br.removeAttribute("contextmenu"); win.onbeforeunload = () => { if (bc) bc.chromeWindow = {close() {}}; cmAttr && br.setAttribute("contextmenu", cmAttr); } } bc = await this.console(win); }, get console() { // Bug 1579090 - WebConsole should handle ObjectFront when needed (for non-primitive Console API args + Evaluation results) (Firefox 73+) https://bugzilla.mozilla.org/show_bug.cgi?id=1579090 var vers = parseInt(Services.appinfo.platformVersion); this.bug1579090 = vers > 73 || (vers == 73 && !( "_setCurrentURI" in gBrowser.selectedBrowser // https://bugzil.la/1431214 )); delete this.console; return this.console = this.bug1579090 ? async win => { //await this.loader.bcm._browserConsoleInitializing; var key = "CBBrowserConsolePromise", {wins} = this.loader; win[key] = win.Object.create(null); win[key].promise = new win.Promise(resolve => win[key].resolve = resolve); win[key].destroy = () => { win[key].resolve(); delete win[key]; wins.splice(wins.indexOf(win), 1); } wins.unshift(win); wins.length > 1 && await wins[1][key].promise; var bc = await new this.loader.console(win).toggleBrowserConsole(); win[key].destroy(); return bc; } : async win => { this.loader.Services.ww.wins.push(win); return await new this.loader.HUDService().toggleBrowserConsole(); } }, get loader() { delete this.loader; var url = parseInt(Services.appinfo.platformVersion) >= 96 ? "resource://devtools/shared/loader/Loader.jsm" : "resource://devtools/shared/Loader.jsm"; if (this.bug1579090) { var g = Cu.import(url, {}), key = "CBBrowserConsoleLoader"; addDestructor(reason => reason[5] == e && key in g && g[key].destroy()); if (key in g) return this.loader = g[key]; var {BrowserConsoleManager} = g.require( "devtools/client/webconsole/browser-console-manager" ); return this.loader = g[key] = { wins: [], bcm: BrowserConsoleManager, console: class extends BrowserConsoleManager.constructor { constructor(win) { super(); this.win = win; } openWindow() { var {win} = this; win.addEventListener("unload", () => { win.CBBrowserConsolePromise && win.CBBrowserConsolePromise.destroy(); this.closeBrowserConsole.call(this); }, {once: true}); delete this.win; return win; } }, destroy() { this.wins = null; delete g[key]; } }; } var id = _id + "-browser-console"; url += "?" + id; var loader = {exports: {}}, nsvo = Cu.import(url, loader); addDestructor(reason => reason[5] == "e" && Cu.unload(url)); if (id in nsvo) return this.loader = nsvo[id]; var dir = "resource://devtools/client/webconsole/"; try { this.lss(dir + "hudservice.js", loader); } catch(ex) { // Bug 1570320 - Rename hudservice.js into browser-console-manager.js (Firefox 70+) // https://bugzilla.mozilla.org/show_bug.cgi?id=1570320 this.lss(dir + "browser-console-manager.js", loader); this.lss("data:,this.HUDService=BrowserConsoleManager", loader); } var e = new CustomEvent("DOMContentLoaded", {bubbles: false}), ww = loader.Services.ww; loader.Services.ww = Cu.getGlobalForObject(nsvo).Object.create(ww, { wins: {value: []}, openWindow: {value: function() { var win = this.wins.shift(); win.setTimeout(() => win.dispatchEvent(e), 0); return win; }} }); return this.loader = nsvo[id] = loader; }, element(name, attrs, parent) { var node = document.createXULElement(name); for(var attr in attrs) node.setAttribute(attr, attrs[attr]); parent && parent.append(node); return node; } }).init(); this.tooltipText = "Консоль браузера" +"\n"+"\n"+ "ЛКМ: В боковой панели" +"\n"+ "СКМ: В новой вкладке" +"\n"+ "ПКМ: Стандартное меню "
Жизнь иногда такое выкидывает, что хочется подобрать...
Отсутствует
Farby спасибо работает
Отсутствует
Еще один скрипт "Browser Toolbox"
if (location != 'chrome://browser/content/browser.xhtml')
return;
try {
CustomizableUI.createWidget({
id: 'browser-toolbox-button',
type: 'custom',
defaultArea: CustomizableUI.AREA_NAVBAR,
onBuild: function(aDocument) {
var toolbaritem = aDocument.createElementNS('http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul', 'toolbarbutton');
var props = {
id: 'browser-toolbox-button',
class: 'toolbarbutton-1 chromeclass-toolbar-additional',
label: 'Browser Toolbox',
tooltiptext: 'Open\n"Browser Toolbox"',
style: 'list-style-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAdUlEQVQokZVSwRHAIAgLPYfoXs7RCTpG53Avt7APrhaFU8gLMEEJAkEQgFbc7IxkVjt0r6Sp7VIVITumBpKt00FA2ThmjXzkfMMWO8EZFSj8LrUyjsG9b9DaJXq+qAIVxEUxtLHpaXE95dj1NcK2rmbwaGJ4Af0tIg00j/6iAAAAAElFTkSuQmCC)',
oncommand: '(' + onCommand.toString() + ')()'
};
for (var p in props)
toolbaritem.setAttribute(p, props[p]);
return toolbaritem;
}
});
CustomizableUI.registerToolbarNode(tb);
} catch(e) { };
function onCommand() {
var document = event.target.ownerDocument;
if (!document.getElementById('menu_browserToolbox')) {
let { require } = Cu.import("resource://devtools/shared/loader/Loader.jsm", {});
require("devtools/client/framework/devtools-browser");
};
document.getElementById('menu_browserToolbox').click();
};
})();
Отсутствует
Не просто «при открытии закладки», а при открытии закладки в новой вкладке (не в текущей).
Не могу подключить select_open_bookmark ! Его надо в scriptschrome: [ChromeOnly] ?
На версии 97 ничего не происходит, на 124 ошибка в консоли: gBrowser is undefined
Как я понял - открываю закладку, выбираю другую вкладку, снова открываю эту же закладку и ранее открытая не выбирается…
Отсутствует
Его надо в
Код CB-кнопок исполняется в окнах браузера.
На версии 97 ничего не происходит
Ага, на 3.6.28 тоже не работает.
На 97 наверно нужен loadURI вместо fixupAndLoadURIString
на 124 ошибка в консоли: gBrowser is undefined
Значит код исполняется слишком рано.
Можно сделать обёртку асинхронной, и второй строкой написать
await delayedStartupPromise;
Как я понял - открываю закладку, выбираю другую вкладку, снова открываю эту же закладку
Да, в новой вкладке, и только через некоторые стандартные действия.
Отсутствует
Зд. Установил форк Firefox под названием r3dfox https://github.com/Eclipse-Community/r3 … ses/latest
Нужно подправить кнопку:
function openAddonsManager(view) { var openAddonsMgr = window.BrowserOpenAddonsMgr // Firefox || window.openAddonsMgr // Thunderbird || window.toEM; // SeaMonkey openAddonsMgr(view);
Как найти команду для запуска AddonsMgr "Управление расширениями"?
Отсутствует
manuk У меня выглядит так
function openAddonsManager(view) { var openAddonsMgr = window.BrowserAddonUI.openAddonsMgr //firefox 127+ || window.BrowserOpenAddonsMgr // Firefox || window.openAddonsMgr // Thunderbird || window.toEM; // SeaMonkey openAddonsMgr(view); }
Жизнь иногда такое выкидывает, что хочется подобрать...
Отсутствует
manuk
Да просто методом научного тыка. В ESR 115 искал в omni.ja BrowserOpenAddonsMgr и затем в 127 похожий код, в консоли Crtl+Shift+J проверил BrowserAddonUI.openAddonsMgr("addons://list/extension"); работает, значит правильно.
Жизнь иногда такое выкидывает, что хочется подобрать...
Отсутствует
Farby, ещё с одной кнопкой в r3dfox проблема. Кусок нужного кода:
else { // LMB Click var bar = trg.ownerDocument.getElementById("add-additional-vertical-bar"); if (bar) { win.setToolbarVisibility(bar, bar.collapsed); bar.collapsed ? win.SidebarUI.hide() : window.SidebarUI.show("viewHistorySidebar"); } else window.SidebarUI.toggle("viewHistorySidebar"); } return;
Отредактировано manuk (24-06-2024 14:29:42)
Отсутствует
ещё с одной кнопкой
Везде по тексту можете заменить
Жизнь иногда такое выкидывает, что хочется подобрать...
Отсутствует
Может тему с r3dfox на форуме создать?
В принципе, для этого на форуме есть отдельный раздел: https://forum.mozilla-russia.org/viewforum.php?id=25. Можно там создать тему.
Только я не уверен, что обсуждать в том разделе стили и скрипты будет правильным.
P.S. Я тестировал у себя r3dfox. Правда до крайней версии пока не добрался, сейчас у меня стоит v126.0.1.
Есть, конечно, небольшие вопросики к этому форку, но в целом работает стабильно.
Отредактировано unter_officer (24-06-2024 15:38:15)
«The Truth Is Out There»
Отсутствует