Dumby
Спасибо. Наконец то эта кнопочка вернулась, а то мучился с локальным конвертером, который какой-то мусор в код добавлял.
Иконка для темной темы - data:image/png;base64,iVBORw0KGgoAAAANS … VORK5CYII=
Отсутствует
Dumby
Непонятно. Клонируешь кнопок сколько угодно,
Я сам уже понял это, хотя изначально почему то дублировалось содержимое.
Поэтому и убрал коммент, но вы успели прочитать.
По
проблемы при работе Compact Menu
причина ясна
Я ваш код вписал, а старый из секции код
/*CODE*/
const ids = ["file-menu",
"edit-menu",
"view-menu",
"bookmarksMenu",
"history-menu",
"tools-menu",
"helpMenu"
];
const id = "Compact-Menu-menupopup";
var popup = document.getElementById(id);
if (!popup) {
popup = this.appendChild(document.createElement("menupopup"));
const attrs = {
id: id,
position: "after_start",
oncontextmenu: "event.preventDefault()",
oncommand: "event.stopPropagation()",
};
for (var attr in attrs) popup.setAttribute(attr, attrs[attr]);ids.forEach(function(id) {
var clonedMenu = document.getElementById(id).cloneNode(true);
clonedMenu.hidden = false;
popup.appendChild(clonedMenu);
});
}
popup.openPopup(this);
Отредактировано vv07 (16-06-2021 11:42:06)
Отсутствует
Отсутствует
Не подскажете, как определять ID для других категорий меню и как их вписывать?
Не, для других категорий меню ничего не предусмотрено,
только те, что есть.
ID можно кнопкой Attributes Inspector посмотреть.
Или с помощью Browser Toolbox, но для такой задачи
это как из пушки по воробьям.
А раз есть стойкое предпочтение видеть пункты меню с иконками,
тогда можно специальный стиль составить (пример).
В author : #editBMPanel_folderMenuList::part(dropmarker) {margin-right: -2px !important;} И ни фига...
У меня это работает.
Ну, в два пикселя, конечно, вглядываться не захотел,
поставил сразу -18px и дропмаркер наглядно уехал вправо. Скриншот:
data:image/png;base64,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
Отсутствует
Dumby
Косяк был: влепил по умолчанию
Отсутствует
Помогите, пожалуйста, создать кнопку для проматывания страницы сайта до конца вниз с необходимой периодичностью, например, раз в 10 мин. Для определённости, адрес страницы - https://babushkina.by/news/%d0%b2%d1%80%d0%b5%d0%bc%d1%8f-%d0%b2%d1%8b%d0%b1%d0%b8%d1%80%d0%b0%d1%82%d1%8c-%d0%bb%d1%83%d1%87%d1%88%d1%83%d1%8e/
Важно срабатывание без нажатия на кнопку.
Здесь есть варианты решения - https://techarks.ru/general/brauzeri/kak-avtomaticheski-prokrutit-veb-straniczu-vniz-ili-vverh-v-chrome-ili-firefox/
только я не очень в этом понимаю Будет ли работать приведенный вариант с консолью, и что означают числовые параметры:
Помогите, пожалуйста Спасибо
Отсутствует
Отсутствует
Если popup окошко открыто с помощью window.open()
Можно каким то образом заставить ссылки в нем открываться в новых вкладках этого же окошка?
Сейчас я кликаю по ссылке и она открывается в текущей вкладке popup'а. А если выбираю в контекстном меню ссылки "Открыть в новой вкладке", то открывается во вкладке основного окна.
Отсутствует
Будет ли работать приведенный вариант с консолью, и что означают числовые параметры
Вот прямо так, в кавычках «», — не будет,
а без кавычек — будет, если скроллер это window.
Числовые параметры означают:
первый (1000) — на сколько пикселей прокрутить,
положительное число — вниз, отрицательное — вверх,
но лучше использовать window.scrollTo(0, window.scrollMaxY)
второй (2000) — с какой периодичностью в миллисекундах прокручивать,
в данном случае, каждые две секунды.
Десять минут это 10 * 60 * 1000 = 600000 миллисекунд.
А на этом скрине чем навели на drpomarker ? У меня atributes не показывает...
Сначала навёл на <menulist>, далее кнопками стрелок клавиатуры:
Ctrl+ArrowDown (Контрол и стрелка вниз) — переход к дочерним узлам,
первый будет, соответственно, <html:link>
Затем Ctrl+ArrowRight — переход к следующему соседнему узлу,
первый следующий будет <hbox>, а второй — уже тот самый <dropmarker>
Вообще, наверно, полезно будет перечитать имеющиеся
в кнопке сочетания клавиш (ссылки на страницы кнопки есть в начале кода).
Историю , желательно...Т.е , открываю сидебар сразу пусть папки истории раскроются.
(url => addEventListener("pageshow", e => { if (e.target.documentURI != url) return; var rn = e.target.getElementById("historyTree").view._rootNode; var ind = rn.childCount; while(ind--) { var node = rn.getChild(ind); if (node.containerOpen) continue; node.containerOpen = true; Services.xulStore.setValue(url, node.uri, "open", "true"); } }, false, document.getElementById("sidebar") || 1))( "chrome://browser/content/places/historySidebar.xhtml" );
Отсутствует
Dumby
Да, теперь вкурил . Кстати, этот дроп только так : (он и в другом месте есть,типа, добавить закладку из контекста...) Короче, работает, но нет ли тут принципиального косяка?
vbox.panel-subview-body > vbox#editBookmarkPanelContent > vbox#editBookmarkPanelRows > vbox#editBMPanel_folderRow > hbox > menulist#editBMPanel_folderMenuList::part(dropmarker){margin-right: 4px !important;}
Отсутствует
Dumby, пожалуйста помогите, самостоятельно решить задачу не удается.
В вашем коде шаблона для поисковиков,
Services.search.addPolicyEngine({ iconURL: "", chrome_settings_overrides: { search_provider: { name: "", search_url: "", search_form: "", search_url_get_params: "tt=mzl&q={searchTerms}", suggest_url: "", suggest_url_get_params: "type=list&q={searchTerms}" } } });
вписать эти два поисковика,
При выделении текста и поиске из контекстного меню, открываются страницы поисковиков,
без результатов поиска.
Отсутствует
Dumby
Последнее вроде.Хочу чтобы кнопка Undo не реагировала на закрытые или открытые окна...
// http://infocatcher.ucoz.net/js/cb/undoCloseTabs.js // https://forum.mozilla-russia.org/viewtopic.php?id=56267 // https://github.com/Infocatcher/Custom_Buttons/tree/master/Undo_Close_Tabs // Undo Close Tabs button for Custom Buttons // (code for "initialization" section) // (c) Infocatcher 2009-2015, 2017-2018 // version 0.3.3.1 - 2018-08-01 var options = { menuTemplate: [ "closedWindows", "separator", "restoreClosedWindows", "clearClosedWindows", "separator", "closedTabs", "separator", "restoreClosedTabs", "clearClosedTabs", "separator", "clearAll", "separator", "restoreLastSession", "separator" ], showInTabContextMenu: false, /* menuTemplateTabContext: [ // like menuTemplate "closedTabs", "separator", "restoreClosedTabs", "clearClosedTabs" ], */ windowItemTemplate: "(%count) %title", windowSelectedTabPrefix: "*", buttonTipTemplate: ["header", "title", "url", "closedAt"], itemTipTemplate: ["title", "url", "closedAt"], hideRestoreAllForSingleEntry: false, allowDeleteEntries: true, accesskeys: { // Empty string ("") to disable or string with possible values ("0123...", "abcd...") closedTabs: "", closedWindows: "" }, accesskeyPostfix: " ", // <accesskey><postfix><label> openMenuOnMouseover: false, useMenu: false, rightClickToUndoCloseTab: false // Useful with "useMenu: true" }; function _localize(sid) { var strings = { en: { restoreTab: "Restore the most recently closed tab", restoreAllTabs: "Restore all tabs", restoreAllTabsAccesskey: "t", clearTabsHistory: "Clear history of closed tabs", clearTabsHistoryAccesskey: "b", restoreAllWindows: "Restore all windows", restoreAllWindowsAccesskey: "w", clearWindowsHistory: "Clear history of closed windows", clearWindowsHistoryAccesskey: "d", clearAllHistory: "Clear all history", clearAllHistoryAccesskey: "C", restoreLastSession: "Restore last session", restoreLastSessionAccesskey: "s", deleteUndoEntry: "Delete", tabContextMenu: "Recently Closed Tabs", tabContextMenuAccesskey: "y", itemTip: "%ago ago, %date", day: "d" }, ru: { restoreTab: "Восстановить последнюю закрытую вкладку", restoreAllTabs: "Восстановить все вкладки", restoreAllTabsAccesskey: "л", clearTabsHistory: "Очистить историю закрытых вкладок", clearTabsHistoryAccesskey: "д", restoreAllWindows: "Восстановить все окна", restoreAllWindowsAccesskey: "о", clearWindowsHistory: "Очистить историю закрытых окон", clearWindowsHistoryAccesskey: "н", clearAllHistory: "Очистить всю историю", clearAllHistoryAccesskey: "ч", restoreLastSession: "Восстановить последнюю сессию", restoreLastSessionAccesskey: "с", deleteUndoEntry: "Удалить", tabContextMenu: "Недавно закрытые вкладки", tabContextMenuAccesskey: "о", itemTip: "%ago назад, %date", day: "д" } }; var locale = (function() { if("Services" in window && "locale" in Services) { var locales = Services.locale.requestedLocales // Firefox 64+ || Services.locale.getRequestedLocales && Services.locale.getRequestedLocales(); if(locales) return locales[0]; } var prefs = "Services" in window && Services.prefs || Components.classes["@mozilla.org/preferences-service;1"] .getService(Components.interfaces.nsIPrefBranch); function pref(name, type) { return prefs.getPrefType(name) != prefs.PREF_INVALID ? prefs["get" + type + "Pref"](name) : undefined; } if(!pref("intl.locale.matchOS", "Bool")) { // Also see https://bugzilla.mozilla.org/show_bug.cgi?id=1414390 var locale = pref("general.useragent.locale", "Char"); if(locale && locale.substr(0, 9) != "chrome://") return locale; } return Components.classes["@mozilla.org/chrome/chrome-registry;1"] .getService(Components.interfaces.nsIXULChromeRegistry) .getSelectedLocale("global"); })().match(/^[a-z]*/)[0]; _localize = function(sid) { return strings[locale] && strings[locale][sid] || strings.en[sid] || sid; }; return _localize.apply(this, arguments); } var JSON = "JSON" in window ? window.JSON : "nsIJSON" in Components.interfaces ? { parse: function(s) { return Components.classes["@mozilla.org/dom/json;1"] .createInstance(Components.interfaces.nsIJSON) .decode(s); } } : { parse: function(s) { return Components.utils.evalInSandbox("(" + s + ")", new Components.utils.Sandbox("about:blank")); } }; this.onclick = function(e) { if(e.target != this) return; if(e.button == 1 || e.button == 0 && (e.ctrlKey || e.shiftKey || e.altKey || e.metaKey)) this.undoCloseTabsList.clearAllLists(); else if( e.button == 0 || e.button == 2 && !e.ctrlKey && !e.shiftKey && !e.altKey && !e.metaKey && this.undoCloseTabsList.options.rightClickToUndoCloseTab ) { if( e.button == 0 && !this.undoCloseTabsList.options.useMenu || e.button == 2 && this.undoCloseTabsList.options.rightClickToUndoCloseTab ) { if(this.undoCloseTabsList.closedTabCount) this.undoCloseTabsList.undoCloseTab(); else this.undoCloseTabsList.drawUndoList() && this.undoCloseTabsList.showMenu(e); } // Allow use "command" section only from hotkey: e.preventDefault(); e.stopPropagation(); } }; if(!this.hasOwnProperty("defaultContextId")) this.defaultContextId = this.getAttribute("context") || "custombuttons-contextpopup"; this.onmousedown = function(e) { if(e.target != this) return; if(this.undoCloseTabsList.options.useMenu) { if(e.button == 0) this.undoCloseTabsList.drawUndoList(); } else if(e.button == 2) { var showCbMenu = e.ctrlKey || e.shiftKey || e.altKey || e.metaKey || !this.undoCloseTabsList.drawUndoList(); this.setAttribute( "context", showCbMenu ? this.defaultContextId : this.undoCloseTabsList.mpId ); } }; this.onmouseover = function(e) { if(e.target != this) return; if(!this.disabled) this.undoCloseTabsList.updUI(); this.undoCloseTabsList.options.useMenu && Array.prototype.some.call( this.parentNode.getElementsByTagName("*"), function(node) { if( node != this && node.namespaceURI == xulns // See https://github.com/Infocatcher/Custom_Buttons/issues/28 //&& node.boxObject //&& node.boxObject instanceof Components.interfaces.nsIMenuBoxObject && "open" in node && node.open && node.getElementsByTagName("menupopup").length && this.undoCloseTabsList.drawUndoList() ) { node.open = false; this.open = true; return true; } return false; }, this ); if( this.undoCloseTabsList.options.openMenuOnMouseover && this.undoCloseTabsList.drawUndoList() ) this.undoCloseTabsList.openMenu(); }; this.undoCloseTabsList = { button: this, options: options, mpId: this.id + "-context", cmId: this.id + "-contextSub", tcmId: this.id + "-tabContextMenu", tipId: this.id + "-tooltip", errPrefix: "[Custom Buttons :: Undo Close Tabs List]: ", get mp() { var btn = this.button; var mp = btn.getElementsByTagName("menupopup"); mp = mp.length && mp[0]; mp && mp.parentNode.removeChild(mp); mp = this.createElement("menupopup", { id: this.mpId, onclick: "this.parentNode.undoCloseTabsList.checkForMiddleClick(event);", onpopupshowing: "if(event.target == this) document.popupNode = this.parentNode;", onpopuphidden: "if(event.target == this) document.popupNode = null;" }); if(this.cm) mp.setAttribute("context", this.cmId); var tb = btn.parentNode; if( this.options.useMenu && tb.getAttribute("orient") == "vertical" ) { // https://addons.mozilla.org/firefox/addon/vertical-toolbar/ var isRight = tb.parentNode.getAttribute("placement") == "right"; mp.setAttribute("position", isRight ? "start_before" : "end_before"); } delete this.mp; return this.mp = btn.appendChild(mp); }, get useCentextMenu() { delete this.useCentextMenu; return this.useCentextMenu = this.options.allowDeleteEntries && ("forgetClosedTab" in this.ss || "forgetClosedWindow" in this.ss); }, get cm() { delete this.cm; if(!this.useCentextMenu) return this.cm = null; var cm = document.getElementById(this.cmId); cm && cm.parentNode.removeChild(cm); cm = this.createElement("menupopup", { id: this.cmId, onpopupshowing: "return this.undoCloseTabsList.canDeleteUndoEntry(this.triggerNode || document.popupNode);" }); var mi = this.createElement("menuitem", { oncommand: "this.parentNode.undoCloseTabsList.deleteUndoEntry(this.parentNode.triggerNode || document.popupNode);", label: _localize("deleteUndoEntry"), closemenu: "single" }); cm.appendChild(mi); cm.undoCloseTabsList = this; return this.cm = document.getElementById("mainPopupSet").appendChild(cm); }, get cbMenu() { var cbPopup = document.getElementById(this.button.defaultContextId); if(!cbPopup) { Components.utils.reportError(this.errPrefix + "cb menu not found"); return this.cbMenu = null; } cbPopup = cbPopup.cloneNode(true); var id = "-" + this.button.id.match(/\d*$/)[0] + "-cloned"; cbPopup.id += id; Array.prototype.slice.call(cbPopup.getElementsByAttribute("id", "*")).forEach(function(node) { node.id += id; }); menu.appendChild(cbPopup); cbPopup.setAttribute( "onpopupshowing", '\ var btn = document.popupNode = this.parentNode.parentNode.parentNode\n\ .undoCloseTabsList.button;\n\ custombutton.setContextMenuVisibility(btn);' ); delete this.cbMenu; return this.cbMenu = menu; }, get ss() { delete this.ss; return this.ss = "nsISessionStore" in Components.interfaces ? ( Components.classes["@mozilla.org/browser/sessionstore;1"] || Components.classes["@mozilla.org/suite/sessionstore;1"] ).getService(Components.interfaces.nsISessionStore) : SessionStore; // Firefox 61+ https://bugzilla.mozilla.org/show_bug.cgi?id=1450559 }, get appInfo() { delete this.appInfo; return this.appInfo = Components.classes["@mozilla.org/xre/app-info;1"] .getService(Components.interfaces.nsIXULAppInfo); }, get appVersion() { delete this.appVersion; return this.appVersion = parseFloat(this.appInfo.version); }, get appName() { delete this.appName; return this.appName = this.appInfo.name; }, init: function() { window.addEventListener("TabClose", this, false); window.addEventListener("SSTabRestoring", this, false); window.addEventListener("unload", this, false); if(this.appName == "SeaMonkey") // No SSTab* events in SeaMonkey window.addEventListener("TabOpen", this, false); setTimeout(function(_this) { _this.mp.addEventListener("DOMMenuItemActive", _this, false); _this.mp.addEventListener("DOMMenuItemInactive", _this, false); _this.initTooltip(); }, 50, this); this.addPbExitObserver(true); this.updUIGlobal(); if(this.options.showInTabContextMenu) setTimeout(function(_this) { _this.initTabContext(); }, 100, this); }, initTabContext: function() { var origMi = this.tabContextUndoClose; if(!origMi) { LOG("Can't find \"Undo Close Tab\" item in tab context menu"); return; } var menu = document.getElementById(this.tcmId); menu && menu.parentNode.removeChild(menu); // For SeaMonkey menu = this.createElement("menu", { id: this.tcmId, label: _localize("tabContextMenu"), accesskey: _localize("tabContextMenuAccesskey"), tooltip: this.tipId, popupsinherittooltip: "true" }); menu.undoCloseTabsList = this; menu.onclick = function(e) { if(e.target != this) return; if(e.button == 1 || e.button == 0 && (e.ctrlKey || e.shiftKey || e.altKey || e.metaKey)) { if(this.undoCloseTabsList.closedTabCount) { this.undoCloseTabsList.undoCloseTab(); closeMenus(this); } } }; var origMp = this.mp; var mp = origMp.cloneNode(true); mp.id = this.button.id + "-tabContext"; var _this = this; function drawUndoList() { var ok = false; var opts = _this.options; var origTemplate = opts.menuTemplate; opts.menuTemplate = opts.menuTemplateTabContext || origTemplate; _this.mp = mp; try { ok = _this.drawUndoList(); } catch(e) { Components.utils.reportError(e); } opts.menuTemplate = origTemplate; _this.mp = origMp; return ok; } function updMenu() { if(drawUndoList()) menu.removeAttribute("disabled"); else menu.setAttribute("disabled", "true"); } mp._updatePopup = function(e) { if(e.target != this) return; document.popupNode = _this.button; drawUndoList(); }; mp.setAttribute("onpopupshowing", "this._updatePopup(event);"); mp.onclick = function(e) { _this.checkForMiddleClick(e, updMenu); }; menu.appendChild(mp); addEventListener("popupshown", function(e) { if(e.target == e.currentTarget) setTimeout(updMenu, 0); // Pseudo async }, false, origMi.parentNode); addEventListener("DOMMenuItemActive", this, false, mp); addEventListener("DOMMenuItemInactive", this, false, mp); origMi.parentNode.insertBefore(menu, origMi.nextSibling); origMi.setAttribute("hidden", "true"); }, initTooltip: function() { var tip = document.getElementById(this.tipId); tip && tip.parentNode.removeChild(tip); tip = this.tip = this.createElement("tooltip", { id: this.tipId, orient: "vertical", onpopupshowing: "return this.undoCloseTabsList.updTooltip(this, document.tooltipNode);", onpopuphiding: "this.cancelUpdateTimer();", style: "padding: 0;" }); tip.undoCloseTabsList = this; tip._updateTimer = 0; tip.initUpdateTimer = function(fn, context) { if(this._updateTimer) clearInterval(this._updateTimer); this._updateTimer = setInterval(function() { fn.call(context); }, 1000); }; tip.cancelUpdateTimer = function() { if(this._updateTimer) { clearInterval(this._updateTimer); this._updateTimer = 0; } }; var btn = this.button; btn.removeAttribute("tooltiptext"); btn.setAttribute("tooltip", this.tipId); btn.setAttribute("popupsinherittooltip", "true"); document.getElementById("mainPopupSet").appendChild(tip); if(this.appVersion >= 61 && "getAnonymousElementByAttribute" in document) { var label = document.getAnonymousElementByAttribute(tip, "class", "tooltip-label"); label && label.remove(); } }, _hasPbExitObserver: false, addPbExitObserver: function(add) { if(add == this._hasPbExitObserver || !("Services" in window)) return; this._hasPbExitObserver = add; if(add) Services.obs.addObserver(this, "last-pb-context-exited", false); else Services.obs.removeObserver(this, "last-pb-context-exited"); }, destroy: function() { window.removeEventListener("TabClose", this, false); window.removeEventListener("SSTabRestoring", this, false); window.removeEventListener("unload", this, false); if(this.appName == "SeaMonkey") window.removeEventListener("TabOpen", this, false); this.mp.removeEventListener("DOMMenuItemActive", this, false); this.mp.removeEventListener("DOMMenuItemInactive", this, false); this.addPbExitObserver(false); var menu = document.getElementById(this.tcmId); if(menu) { menu.parentNode.removeChild(menu); this.tabContextUndoClose.removeAttribute("hidden"); } var tip = this.tip; tip && tip.parentNode && tip.parentNode.removeChild(tip); }, handleEvent: function(e) { switch(e.type) { case "TabClose": case "SSTabRestoring": case "TabOpen": setTimeout(function(_this) { _this.updUI(); }, 0, this); break; case "DOMMenuItemActive": case "DOMMenuItemInactive": if(!("XULBrowserWindow" in window)) break; XULBrowserWindow.setOverLink( e.type == "DOMMenuItemActive" ? (e.target.getAttribute("cb_urlDecoded") || "") .replace(/ \n/g, ", ") : "", null ); break; case "unload": this.updUIGlobal(); this.destroy(); } }, observe: function(subject, topic, data) { if(topic == "last-pb-context-exited") { setTimeout(function(_this) { _this.updUI(); }, 25, this); } }, createElement: function(name, attrs) { var node = document.createElementNS(xulns, name); if(attrs) for(var attrName in attrs) if(attrs.hasOwnProperty(attrName)) node.setAttribute(attrName, attrs[attrName]); return node; }, get tabContextUndoClose() { return document.getElementById("context_undoCloseTab") || document.getElementById("tabContextUndoCloseTab") // Firefox 2.0 || document.getAnonymousElementByAttribute(gBrowser, "tbattr", "tabbrowser-undoclosetab"); // SeaMonkey }, get closedWindowCount() { if(!("getClosedWindowCount" in this.ss)) { delete this.closedWindowCount; return this.closedWindowCount = 0; } this.__defineGetter__("closedWindowCount", function() { return this.ss.getClosedWindowCount(); }); return this.closedWindowCount; }, get closedTabCount() { return this.ss.getClosedTabCount(window); }, undoCloseTab: function(i) { if("undoCloseTab" in window) // Firefox 2.0+ undoCloseTab(i); else // SeaMonkey gBrowser.undoCloseTab(i); }, clearUndoTabsList: function() { var closedTabCount = this.closedTabCount; if(!closedTabCount) return; if("forgetClosedTab" in this.ss) // Gecko 1.9.2+ while(closedTabCount--) this.ss.forgetClosedTab(window, 0); else { // Doesn't work in SeaMonkey const pName = "browser.sessionstore.max_tabs_undo"; let val = cbu.getPrefs(pName); cbu.setPrefs(pName, 0); cbu.setPrefs(pName, val); } this.updUIGlobal(); }, clearUndoWindowsList: function() { var closedWindowCount = this.closedWindowCount; if(!closedWindowCount) return; if("forgetClosedWindow" in this.ss) // Gecko 1.9.2+ while(closedWindowCount--) this.ss.forgetClosedWindow(0); else this.ss.setWindowState(window, '{"windows":[{}],"_closedWindows":[]}', false); this.updUIGlobal(); }, clearAllLists: function() { this.clearUndoTabsList(); this.clearUndoWindowsList(); }, canDeleteUndoEntry: function(mi) { switch(mi.getAttribute("cb_type")) { case "tab": return "forgetClosedTab" in this.ss; case "window": return "forgetClosedWindow" in this.ss; } return false; }, deleteUndoEntry: function(mi) { var i = +mi.getAttribute("cb_index"); if(mi.getAttribute("cb_type") == "window") { this.ss.forgetClosedWindow(i); this.updUIGlobal(); } else { this.ss.forgetClosedTab(window, i); this.updUI(); } this.drawUndoList(); }, showMenu: function(e, isContext, mp) { var btn = this.button; document.popupNode = btn.ownerDocument.popupNode = btn; if(!mp) mp = this.mp; if("openPopupAtScreen" in mp) mp.openPopupAtScreen(e.screenX, e.screenY, isContext); else mp.showPopup(btn, e.screenX, e.screenY, isContext ? "context" : "popup", null, null); }, openMenu: function() { var mp = this.mp; if("openPopup" in mp) mp.openPopup(this.button, "after_start"); else mp.showPopup(this.button, -1, -1, "popup", "bottomleft", "topleft"); }, drawUndoList: function() { var mp = this.mp; var wc = this.closedWindowCount; var tc = this.closedTabCount; var ss = this.ss; var canRestoreLastSession = "restoreLastSession" in ss && ss.canRestoreLastSession if(!wc && !tc && !canRestoreLastSession) { mp.textContent = ""; mp.hidePopup(); return false; } this._undoWindowItems = wc && JSON.parse(ss.getClosedWindowData()); this._undoTabItems = tc && JSON.parse(ss.getClosedTabData(window)); var df = document.createDocumentFragment(); this.options.menuTemplate.forEach(function(sid, indx, arr) { switch(sid) { case "closedWindows": wc && this.addUndoWindowsList(df); break; case "restoreClosedWindows": wc > this.options.hideRestoreAllForSingleEntry && df.appendChild(this.createElement("menuitem", { label: _localize("restoreAllWindows"), accesskey: _localize("restoreAllWindowsAccesskey"), oncommand: "for(var i = 0; i < " + this._undoWindowItems.length + "; ++i) undoCloseWindow();" })); break; case "clearClosedWindows": wc && df.appendChild(this.createElement("menuitem", { label: _localize("clearWindowsHistory"), accesskey: _localize("clearWindowsHistoryAccesskey"), oncommand: "this.parentNode.parentNode.undoCloseTabsList.clearUndoWindowsList();" })); break; case "closedTabs": tc && this.addUndoTabsList(df); break; case "restoreClosedTabs": tc > this.options.hideRestoreAllForSingleEntry && df.appendChild(this.createElement("menuitem", { label: _localize("restoreAllTabs"), accesskey: _localize("restoreAllTabsAccesskey"), oncommand: "for(var i = 0; i < " + this._undoTabItems.length + "; ++i) this.parentNode.parentNode.undoCloseTabsList.undoCloseTab();" })); break; case "clearClosedTabs": tc && df.appendChild(this.createElement("menuitem", { label: _localize("clearTabsHistory"), accesskey: _localize("clearTabsHistoryAccesskey"), oncommand: "this.parentNode.parentNode.undoCloseTabsList.clearUndoTabsList();" })); break; case "clearAll": ( wc && tc || wc && arr.indexOf("clearClosedWindows") == -1 || tc && arr.indexOf("clearClosedTabs") == -1 ) && df.appendChild(this.createElement("menuitem", { label: _localize("clearAllHistory"), accesskey: _localize("clearAllHistoryAccesskey"), oncommand: "this.parentNode.parentNode.undoCloseTabsList.clearAllLists();" })); break; case "restoreLastSession": // Gecko 2.0+ canRestoreLastSession && df.appendChild(this.createElement("menuitem", { label: _localize("restoreLastSession"), accesskey: _localize("restoreLastSessionAccesskey"), oncommand: "this.parentNode.parentNode.undoCloseTabsList.ss.restoreLastSession();" })); break; case "separator": if(df.hasChildNodes() && df.lastChild.localName != "menuseparator") df.appendChild(document.createElementNS(xulns, "menuseparator")); break; default: Components.utils.reportError(this.errPrefix + 'Invalid template entry: "' + sid + '"'); } }, this); while(df.hasChildNodes() && df.lastChild.localName == "menuseparator") df.removeChild(df.lastChild); this._undoWindowItems = this._undoTabItems = null; mp.textContent = ""; if(!df.hasChildNodes()) { mp.hidePopup(); return false; } mp.appendChild(df); return true; }, addUndoWindowsList: function(undoPopup) { // Based on code from chrome://browser/content/browser.js // Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.3a1pre) Gecko/20090824 Minefield/3.7a1pre var keys = this.options.accesskeys.closedWindows; this._undoWindowItems.forEach(function(undoItem, i) { var tabs = undoItem.tabs; var [key, keyPrefix] = this.getKey(keys, i); var title = undoItem.title; var selectedTab = tabs[undoItem.selected - 1]; var urls = []; tabs.forEach(function(tab) { if(!tab.entries || !tab.entries.length) // Can be [] for about:blank return; var url = this.convertURI(tab.entries[tab.index - 1].url, 120); var selectedPrefix = tab == selectedTab && tabs.length > 1 ? this.options.windowSelectedTabPrefix : ""; urls.push(selectedPrefix + url); }, this); var url = urls.join(" \n"); var mi = this.createElement("menuitem", { label: keyPrefix + this.options.windowItemTemplate .replace("%title", title) .replace("%count", tabs.length), accesskey: key, "class": "menuitem-iconic bookmark-item menuitem-with-favicon", oncommand: "undoCloseWindow(" + i + ");", cb_url: url, cb_urlDecoded: this.convertURI(url), cb_closedAt: undoItem.closedAt || 0, cb_index: i, cb_type: "window" }); if(this.cm) mi.setAttribute("context", this.cmId); var icon = selectedTab.image || selectedTab.attributes && selectedTab.attributes.image; if(icon) mi.setAttribute("image", this.cachedIcon(icon)); if(i == 0) mi.setAttribute("key", "key_undoCloseWindow"); undoPopup.appendChild(mi); }, this); }, addUndoTabsList: function(undoPopup) { // Based on code from chrome://browser/content/browser.js // Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.3a1pre) Gecko/20090824 Minefield/3.7a1pre var keys = this.options.accesskeys.closedTabs; this._undoTabItems.forEach(function(undoItem, i) { var state = undoItem.state; var [key, keyPrefix] = this.getKey(keys, i); var title = undoItem.title; var url = state && state.entries && state.entries[state.index - 1].url || ""; var mi = this.createElement("menuitem", { label: keyPrefix + title, accesskey: key, class: "menuitem-iconic bookmark-item menuitem-with-favicon", oncommand: "this.parentNode.parentNode.undoCloseTabsList.undoCloseTab(" + i + ");", cb_url: url, cb_urlDecoded: this.convertURI(url), cb_closedAt: undoItem.closedAt || 0, cb_index: i, cb_type: "tab" }); if( state && "attributes" in state && "privateTab-isPrivate" in state.attributes ) // https://addons.mozilla.org/addon/private-tab/ mi.setAttribute("privateTab-isPrivate", "true"); if(this.cm) mi.setAttribute("context", this.cmId); var image = undoItem.image // Firefox || state && state.attributes && state.attributes.image // SeaMonkey || state && state.xultab && /(?:^| )image=(\S+)/.test(state.xultab) && decodeURI(RegExp.$1); // Only Firefox 2.0 ? if(image) mi.setAttribute("image", this.cachedIcon(image)); if(i == 0) mi.setAttribute("key", "key_undoCloseTab"); undoPopup.appendChild(mi); }, this); }, getKey: function(keys, i) { var key = keys && keys.charAt(i % keys.length); var keyPrefix = keys && (key + this.options.accesskeyPostfix); return [key, keyPrefix]; }, checkForMiddleClick: function(e, upd) { var mi = e.target; if( "doCommand" in mi && e.button == 1 && mi.parentNode == e.currentTarget ) { mi.doCommand(); if(upd) upd(); else this.drawUndoList(); } }, crop: function(s, crop) { if(crop == undefined) crop = 500; if(s.length <= crop) return s; var start = Math.round(crop*0.6); return s.substr(0, start) + "…" + s.substr(start - crop); }, convertURI: function(uri, crop) { if(!uri || uri.indexOf("\n") != -1) return uri; try { uri = "losslessDecodeURI" in window ? losslessDecodeURI(makeURI(uri)) : decodeURI(uri); } catch(e) { Components.utils.reportError(e); } return this.crop(uri, crop); }, cachedIcon: function(src) { src = src.replace(/[&#]-moz-resolution=\d+,\d+$/, ""); // Firefox 22+ if( !/^https?:/.test(src) // IDN, see https://bugzilla.mozilla.org/show_bug.cgi?id=311045 || /^https?:\/\/[^.:\/]+\.[^a-z0-9-]+(?:\/|$)/.test(src) || this.appName == "SeaMonkey" && this.appVersion <= 2 || this.appName == "Firefox" && this.appVersion <= 3.5 ) return src; return "moz-anno:favicon:" + src; // https://bugzilla.mozilla.org/show_bug.cgi?id=467828 }, updUI: function() { var tabsCount = this.closedTabCount; var dis = !tabsCount && !this.closedWindowCount; if( dis && this.options.useMenu && this.options.menuTemplate.indexOf("restoreLastSession") != -1 && "restoreLastSession" in this.ss && this.ss.canRestoreLastSession ) dis = false; this.button.disabled = dis; }, updTooltip: function(tip, tn) { var template, header, title, url, closedAt; if(tn == this.button) { template = this.options.buttonTipTemplate; header = _localize("restoreTab"); let undoTabItems = JSON.parse(this.ss.getClosedTabData(window)); if(undoTabItems.length) { let lastItem = undoTabItems[0]; title = lastItem.title; url = lastItem.state && lastItem.state.entries && lastItem.state.entries[lastItem.state.index - 1].url; closedAt = lastItem.closedAt || 0; } } else if(tn.hasAttribute("cb_index")) { template = this.options.itemTipTemplate; title = tn.getAttribute("label"); url = tn.getAttribute("cb_url"); closedAt = +tn.getAttribute("cb_closedAt"); } else { return false; } var tipData = this.getTooltipData(template, header, title, url, closedAt); tip.textContent = ""; tip.appendChild(tipData); if(closedAt && template.indexOf("closedAt") != -1) { tip.initUpdateTimer(function() { var tipData = this.getTooltipData(template, header, title, url, closedAt); if(tipData.textContent != tip.textContent) { tip.textContent = ""; tip.appendChild(tipData); } }, this); } return tip.hasChildNodes(); }, getTooltipData: function(template, header, title, url, closedAt) { var df = document.createDocumentFragment(); var hasHeader = header && template.indexOf("header") != -1; function item(key, val) { var lbl = document.createElementNS(xulns, "label"); lbl.className = "cb-" + key; //lbl.setAttribute("value", val); lbl.textContent = val; lbl.setAttribute("maxwidth", "450"); // Trick to restore right border for long lines if(key == "closedAt" || hasHeader && key != "header") lbl.style.color = "grayText"; return df.appendChild(lbl); } template.forEach(function(key) { switch(key) { case "header": if(header) item(key, header); break; case "title": if(title && title != url) item(key, title); break; case "url": if(url) item(key, this.convertURI(url)); break; case "closedAt": if(!closedAt) break; let dt = Math.round(Math.max(0, Date.now() - closedAt)/1000); let days = Math.floor(dt/24/3600); dt -= days*24*3600; let d = new Date((dt + new Date(dt).getTimezoneOffset()*60)*1000); let m = d.getMinutes(); let ts = d.getHours() + ":" + (m > 9 ? m : "0" + m); if(days) ts = days + _localize("day") + " " + ts; let tsTip = _localize("itemTip") .replace("%ago", ts) .replace("%date", new Date(closedAt).toLocaleString()); item(key, tsTip); } }, this); return df; }, get wm() { delete this.wm; return this.wm = Components.classes["@mozilla.org/appshell/window-mediator;1"] .getService(Components.interfaces.nsIWindowMediator); }, updUIGlobal: function() { var isSeaMonkey = this.appName == "SeaMonkey"; var ws = this.wm.getEnumerator(isSeaMonkey ? null : "navigator:browser"); const id = this.button.id; while(ws.hasMoreElements()) { let win = ws.getNext(); if(!isSeaMonkey || this.isBrowserWindow(win)) { let btn = win.document.getElementById(id); if(btn && "undoCloseTabsList" in btn) { let ucl = btn.undoCloseTabsList; ucl.ensureSessionsInitialized(ucl.updUI, ucl); } } } }, isBrowserWindow: function(win) { var loc = window.location.href; return loc == "chrome://browser/content/browser.xul" || loc == "chrome://navigator/content/navigator.xul"; }, ensureSessionsInitialized: function(callback, context) { var _this = this; var stopTime = Date.now() + 3e3; (function ensureInitialized() { try { _this.ss.getClosedTabCount(window); callback.call(context); return; } catch(e) { if(Date.now() > stopTime) { Components.utils.reportError( _this.errPrefix + "Can't initialize: nsISessionStore.getClosedTabCount() failed" ); Components.utils.reportError(e); return; } } setTimeout(ensureInitialized, 50); })(); } }; if(!this.undoCloseTabsList.options.useMenu && this.undoCloseTabsList.useCentextMenu) { this.oncontextmenu = function(e) { if( e.target != this || e.ctrlKey || e.shiftKey || e.altKey || e.metaKey || !this.undoCloseTabsList.mp.hasChildNodes() ) return; e.preventDefault(); this.undoCloseTabsList.showMenu(e); // Show menu without "context" flag }; } if(this.undoCloseTabsList.options.rightClickToUndoCloseTab) { this.oncontextmenu = function(e) { if(e.target == this && !e.ctrlKey && !e.shiftKey && !e.altKey && !e.metaKey) e.preventDefault(); }; } this.disabled = true; setTimeout(function(_this) { _this.undoCloseTabsList.init(); }, 0, this); //=================== // Styles // Used icons from Undo Closed Tabs Button extension // Styles can't override hardcoded icon if( // Remove icon only if nsIStyleSheetService works on-the-fly (Firefox 3.0+) !Components.ID("{41d979dc-ea03-4235-86ff-1e3c090c5630}") .equals(Components.interfaces.nsIStyleSheetService) ) { let icon = this.icon || this.ownerDocument.getAnonymousElementByAttribute(this, "class", "toolbarbutton-icon"); if(icon) icon.src = ""; else this.image = ""; } var cssStr = '\ @namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul");\n\ @-moz-document url("%windowURL%") {\n\ %button% {\n\ list-style-image: url("data:image/png;base64,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") !important;\n\ -moz-image-region: rect(0, 24px, 24px, 0) !important;\n\ }\n\ %button%:hover {\n\ -moz-image-region: rect(0, 48px, 24px, 24px) !important;\n\ }\n\ %button%[disabled="true"] {\n\ -moz-image-region: rect(0, 72px, 24px, 48px) !important;\n\ }\n\ toolbar[iconsize="small"] %button% {\n\ -moz-image-region: rect(24px, 16px, 40px, 0) !important;\n\ }\n\ toolbar[iconsize="small"] %button%:hover {\n\ -moz-image-region: rect(24px, 32px, 40px, 16px) !important;\n\ }\n\ toolbar[iconsize="small"] %button%[disabled="true"] {\n\ -moz-image-region: rect(24px, 48px, 40px, 32px) !important;\n\ }\n\ }' .replace(/%windowURL%/g, window.location.href) .replace(/%button%/g, "#" + this.id); var cssURI = this.cssURI = Components.classes["@mozilla.org/network/io-service;1"] .getService(Components.interfaces.nsIIOService) .newURI("data:text/css," + encodeURIComponent(cssStr), null, null); var sss = this.sss = Components.classes["@mozilla.org/content/style-sheet-service;1"] .getService(Components.interfaces.nsIStyleSheetService); if(!sss.sheetRegistered(cssURI, sss.USER_SHEET)) sss.loadAndRegisterSheet(cssURI, sss.USER_SHEET); this.onDestroy = function(reason) { this.undoCloseTabsList.destroy(); if(reason == "update" || reason == "delete") { let sss = this.sss; let cssURI = this.cssURI; if(sss.sheetRegistered(cssURI, sss.USER_SHEET)) sss.unregisterSheet(cssURI, sss.USER_SHEET); } }; if(this.undoCloseTabsList.options.useMenu) { this.type = "menu"; this.orient = "horizontal"; } 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); addEventListener("contextmenu", e => !this.disabled || e.ctrlKey || e.shiftKey || e.preventDefault(), false, this);
Отсутствует
Есть у меня кнопка, которая по ЛКМ открывает текстовый редактор, установленный в системе Akelpad. По СКМ эмулирует редактор в браузере, по ПКМ CB меню. Можно сделать тоже самое для ucf, тоько для ПКМ сделать эмуляцию, как СКМ с вставкой из буфера? Может, такое уже кто и просил, ткните носом.
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%u0422%u0435%u043A%u0441%u0442%u043E%u0432%u044B%u0439%20%u0440%u0435%u0434%u0430%u043A%u0442%u043E%u0440%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/x-icon%3Bbase64%2CAAABAAEAEREAAAEAIADwBAAAFgAAACgAAAARAAAAIgAAAAEAIAAAAAAAyAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAgAAAAApKSlRRkZGh0BAQHxBQUF+QUFBfkFBQX5BQUF+QEBAfEZGRogaGho1AAAAAAABAAECAgICAgICAgQEBAUAAAAAMTEwWeLi4f//////+vr6//r6+v/6+vr//Pz8//v7+//5+fn++/v7/7CwsPdNTU2hAQEBAgAAAAAAAAAAAwMDBAAAAABvbm+x8vHy/+Df4Pfi4+P76ubr++Lh4vvk5OT7/f39+/////v////77/Dv/aysrP8BEAElKngnxDCDLdEvgSzOLX8qy0GTPu1Zq1b/WatW/lasU/9op2f/xcPF/8PEw//i5+L/8vfx//H27//p6+n/qqqq/ESaQOS67a7/teip/rbpqv+36qv/suSm/6zfoP+s36D/teOo/4bNfP93s3b/39bf/9XY1f/5/Pj/+Pv2/+vs6/+qqar/T6RK8bvjsP6t2qT8sNym/LDcpvyx3af+st6o/7LeqP+w3ab/vuaz/1mqVP+2w7b/3dvd//D07//4+/f/6+zr/6qqqv8BNwFvndiU/8Djt/y34a//ueGw/7nhsP+54bD/ueGw/7jgr//B5Lj/mtSS/3q1ev/WzNb/4ufh//f79f/p6+n/qqqq/wAAAANHk0Pbzu/F/73gtP3A47f/wOO3/8Djt//A47f/wOO4/73itf/D5rn/Y7Je/7/MwP/k4eP/+f35/+vs6/+qqqr/AAAAAAAzAGap4KP/zebG+8Tkvv/G5b//xuS//8blv//F5b7/vuK2/8LkuP+U0Yv/ZaBl/97W3v/u9e3/6+3r/6qqqv8DAQMAAAAABE6XS+Db8dT/yuPD/czmxv/N5sf/zObG/8blv//A47j/t+Cu/7vjsP9nuWP/uMW5/+zr6//s7+z/qamq/wACAAQAAAAAATQBZrTir//a6dX70ufN/9Pozv/N5sf/xuS//8Djt/+44K//u+Ow/4zNgv9uqW7/6+Tr/+ru6v+qqar/AAAAAQMBAwAAAAAHVJhS2Or25v/W59L91OjP/8zmxv/G5b//wOO3/7rhsP+w3ab/tuSp/1isU/+vva//6+rq/6qqqv8AAAAAAQIBAwAAAAAENQRkv+S7/+Pr3vvR58z/zObG/8bkv/+/4rf/ueCw/7Hep/+z4Kf/h818/3Kucv/r4uv/qKqo/gAAAAAAAAABAwEDAAAAAApVl1TU7Pbo/9HlzP3P58j/xuS//8Ljuf+64bH/s9+p/6vcoP+t4KD/Wq5U/8bSx/23tLf9AAAAAAAAAAABAgEDAAAAAAk3CWaq36b/1unR+cLjvPzF5r78t+Cv/LXgrP2w36b8odmW/Kzgn/1yxGf7gLKA/52Sne0AAAAAAAAAAAAAAAECAQIAAAEADUOCQcdwt23/Zati82GrXvVjrWD4XKlY9FqpVvZaqlX3UqZN81OnTvxYbFndGxcbNAAAAAAAAAAAAAAAAAABAQEAAAAAFBAUHTAzMGcqKipRJSclUS8wL14nJyZNKCspVy4uLlsiJCJKNjU2aQQABAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B//%20%u041D%u0430%u0441%u0442%u0440%u043E%u0439%u043A%u0430%20%u0444%u0443%u043D%u043A%u0446%u0438%u0439%20%u043A%u043B%u0438%u043A%u043E%u0432%20%u043C%u044B%u0448%u0438%20%u0434%u043B%u044F%20%u043A%u043D%u043E%u043F%u043A%u0438%20...........%0Athis.onclick%20%3De%3D%3E%20%7B%0A%20%20%20if%20%28%20e.button%20%3D%3D%3D%201%20%29%20gBrowser.selectedTab%20%3D%20gBrowser.addTab%28notepad%2C%20%7B%0A%20%20%20%20triggeringPrincipal%3A%20Services.scriptSecurityManager.getSystemPrincipal%28%29%0A%20%20%20%20%7D%29%3B%20//%20%u043E%u0442%u043A%u0440%u044B%u0442%u044C%20%u0431%u043B%u043E%u043A%u043D%u043E%u0442%20%20%20%20%0A%7D%3B%0A%0A//%20%u041E%u0431%u043D%u043E%u0432%u0438%u0442%u044C%20%u0431%u043B%u043E%u043A%u043D%u043E%u0442%20%u0432%20%u0442%u0435%u043A%u0443%u0449%u0435%u0439%20%u0432%u043A%u043B%u0430%u0434%u043A%u0435%20%u043F%u043E%u0441%u043B%u0435%20%u043E%u0431%u043D%u043E%u0432%u043B%u0435%u043D%u0438%u044F%20%u043A%u043D%u043E%u043F%u043A%u0438%20...........%0Aif%20%28%20gBrowser.currentURI.spec%20%3D%3D%20notepad%20%29%20%7B%0A%20%20%20%20%20var%20val%20%3D%20content.document.getElementsByTagName%28%22textarea%22%29%5B0%5D.value%3B%0A%20%20%20%20%20loadURI%28notepad%29%3B%0A%20%20%20%20%20setTimeout%28%28%29%3D%3E%20content.document.getElementsByTagName%28%22textarea%22%29%5B0%5D.value%20%3D%20val%2C%20500%29%3B%20%20%20%20%20%0A%20%20%20%20%20%7D%3B%0A%20%20%20%20%20%20%20%20%0A//%20%u041E%u0447%u0438%u0441%u0442%u0438%u0442%u044C%20%u0430%u0434%u0440%u0435%u0441%u043D%u0443%u044E%20%u0441%u0442%u0440%u043E%u043A%u0443%20%u0432%20%u043A%u043B%u0430%u0434%u043A%u0435%20%u0431%u043B%u043E%u043A%u043D%u043E%u0442%u0430%20...........%0AaddEventListener%28%22TabAttrModified%22%2C%20%28%29%3D%3E%20gBrowser.currentURI.spec%20%3D%3D%20notepad%20%26%26%20gURLBar.reset%28%29%29%3B%0A%0A//%20%u041F%u043E%u043B%u0443%u0447%u0430%u0435%u043C%20%u0430%u0434%u0440%u0435%u0441%20%u0431%u043B%u043E%u043A%u043D%u043E%u0442%u0430%20%u043A%u0430%u043A%20base64%20%u0438%u0437%20%u0432%u043A%u043B%u0430%u0434%u043A%u0438%20%u0421%u043F%u0440%u0430%u0432%u043A%u0430%20%u0438%20%u0434%u043E%u0431%u0430%u0432%u043B%u044F%u0435%u043C%20%u0438%u043A%u043E%u043D%u043A%u0443%20%u0434%u043B%u044F%20%u0432%u043A%u043B%u0430%u0434%u043A%u0438%20%u0431%u043B%u043E%u043A%u043D%u043E%u0442%u0430%20...........%0Avar%20notepad%20%3D%20%22data%3Atext/html%3Bbase64%2C%22%20+%20window.btoa%28self.getAttribute%28%27Help%27%29.replace%28%27selfImage%27%2C%20self.image%29%29%3B%0A%0A//%20%u041F%u043E%u0434%u0441%u043A%u0430%u0437%u043A%u0430%20%u0443%20%u043A%u043D%u043E%u043F%u043A%u0438%20...........%0Athis.tooltipText%20%3D%20%22%u0422%u0435%u043A%u0441%u0442%u043E%u0432%u044B%u0439%20%u0440%u0435%u0434%u0430%u043A%u0442%u043E%u0440%20%5Cn%u041B%u041A%u041C%3A%20Akelpad%20%5Cn%u0421%u041A%u041C%3A%20%u041E%u0442%u043A%u0440%u044B%u0442%u044C%20%u0431%u043B%u043E%u043A%u043D%u043E%u0442%20%5Cn%u041F%u041A%u041C%3A%20CB%20%u043C%u0435%u043D%u044E%22%3B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5Bvar%20file%20%3D%20Cc%5B%22@mozilla.org/file/local%3B1%22%5D.createInstance%28Ci.nsIFile%29%3B%0Afile.initWithPath%28%20%22c%3A%5C%5CProgram%20Files%5C%5CAkelPad%5C%5CAkelPad.exe%22%20%29%3B%0Afile.launch%28%29%3B%0A%0A%0A//%20%u0432%u0441%u043F%u043B%u044B%u0432%u0430%u044E%u0449%u0435%u0435%20%u0441%u043E%u043E%u0431%u0449%u0435%u043D%u0438%u0435%20....%0Avar%20alertsService%20%3D%20Cc%5B%22@mozilla.org/alerts-service%3B1%22%5D.getService%28Ci.nsIAlertsService%29%3B%0AalertsService.showAlertNotification%28self.image%2C%20%22Akelpad%22%2C%20%22%u0417%u0430%u043F%u0443%u0441%u043A%u0430%u0435%u043C%20Akelpad%21%22%2C%20false%2C%20%22%22%2C%20null%2C%20%22%22%29%3B%0AsetTimeout%28%28%29%3D%3E%20alertsService.closeAlert%28%29%2C%202000%29%3B%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%3Cmeta%20http-equiv%3D%22Content-Type%22%20content%3D%22text/html%3B%20charset%3Dutf-8%22/%3E%3Ctitle%3ENotepad%3C/title%3E%0A%3Chead%3E%0A%20%3Clink%20rel%3D%22shortcut%20icon%22%20href%3D%22data%3Aimage/x-icon%3Bbase64%2CAAABAAEAEREAAAEAIADwBAAAFgAAACgAAAARAAAAIgAAAAEAIAAAAAAAyAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAgAAAAApKSlRRkZGh0BAQHxBQUF+QUFBfkFBQX5BQUF+QEBAfEZGRogaGho1AAAAAAABAAECAgICAgICAgQEBAUAAAAAMTEwWeLi4f//////+vr6//r6+v/6+vr//Pz8//v7+//5+fn++/v7/7CwsPdNTU2hAQEBAgAAAAAAAAAAAwMDBAAAAABvbm+x8vHy/+Df4Pfi4+P76ubr++Lh4vvk5OT7/f39+/////v////77/Dv/aysrP8BEAElKngnxDCDLdEvgSzOLX8qy0GTPu1Zq1b/WatW/lasU/9op2f/xcPF/8PEw//i5+L/8vfx//H27//p6+n/qqqq/ESaQOS67a7/teip/rbpqv+36qv/suSm/6zfoP+s36D/teOo/4bNfP93s3b/39bf/9XY1f/5/Pj/+Pv2/+vs6/+qqar/T6RK8bvjsP6t2qT8sNym/LDcpvyx3af+st6o/7LeqP+w3ab/vuaz/1mqVP+2w7b/3dvd//D07//4+/f/6+zr/6qqqv8BNwFvndiU/8Djt/y34a//ueGw/7nhsP+54bD/ueGw/7jgr//B5Lj/mtSS/3q1ev/WzNb/4ufh//f79f/p6+n/qqqq/wAAAANHk0Pbzu/F/73gtP3A47f/wOO3/8Djt//A47f/wOO4/73itf/D5rn/Y7Je/7/MwP/k4eP/+f35/+vs6/+qqqr/AAAAAAAzAGap4KP/zebG+8Tkvv/G5b//xuS//8blv//F5b7/vuK2/8LkuP+U0Yv/ZaBl/97W3v/u9e3/6+3r/6qqqv8DAQMAAAAABE6XS+Db8dT/yuPD/czmxv/N5sf/zObG/8blv//A47j/t+Cu/7vjsP9nuWP/uMW5/+zr6//s7+z/qamq/wACAAQAAAAAATQBZrTir//a6dX70ufN/9Pozv/N5sf/xuS//8Djt/+44K//u+Ow/4zNgv9uqW7/6+Tr/+ru6v+qqar/AAAAAQMBAwAAAAAHVJhS2Or25v/W59L91OjP/8zmxv/G5b//wOO3/7rhsP+w3ab/tuSp/1isU/+vva//6+rq/6qqqv8AAAAAAQIBAwAAAAAENQRkv+S7/+Pr3vvR58z/zObG/8bkv/+/4rf/ueCw/7Hep/+z4Kf/h818/3Kucv/r4uv/qKqo/gAAAAAAAAABAwEDAAAAAApVl1TU7Pbo/9HlzP3P58j/xuS//8Ljuf+64bH/s9+p/6vcoP+t4KD/Wq5U/8bSx/23tLf9AAAAAAAAAAABAgEDAAAAAAk3CWaq36b/1unR+cLjvPzF5r78t+Cv/LXgrP2w36b8odmW/Kzgn/1yxGf7gLKA/52Sne0AAAAAAAAAAAAAAAECAQIAAAEADUOCQcdwt23/Zati82GrXvVjrWD4XKlY9FqpVvZaqlX3UqZN81OnTvxYbFndGxcbNAAAAAAAAAAAAAAAAAABAQEAAAAAFBAUHTAzMGcqKipRJSclUS8wL14nJyZNKCspVy4uLlsiJCJKNjU2aQQABAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA%3D%22type%3D%22image/x-icon%22%3E%0A%3C/head%3E%0A%0A%3CTEXTAREA%3E%3C/TEXTAREA%3E%0A%3Cstyle%3E%0A%0Ahtml%20%7B%0A%20%20background-color%3A%20black%3B%0A%20%20overflow%3A%20hidden%3B%0A%7D%0Atextarea%20%7B%0A%20%20background%3A%20%23383838%3B%0A%20%20overflow-y%3A%20auto%3B%0A%20%20width%3A%20100%25%3B%0A%20%20height%3A%20100%25%3B%0A%20%20border-radius%3A%202px%3B%0A%20%20border%3A%202px%20inset%20white%3B%0A%20%20color%3A%20white%3B%0A%7D%0A%3C/style%3E%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E
Отсутствует
https://cs.majento.ru/
Может так
Services.search.addPolicyEngine({ iconURL: "data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAABM2///TNv//0zb//9M2///TNv//0zb//9M2///TNv//0zb//9M2///TNv//0zb//9M2///TNv//0zb//9M2///TNv//0zb//9M2///TNv//0zb//9M2///TNv//0zb//9M2///TNv//0zb//9M2///TNv//0zb//9M2///TNv//0zb//9M2///TNv//0zb//9M2///TNv//0zb//9M2///TNv//0zb//9M2///TNv//0zb//9M2///TNv//0zb//9M2///TNv//0zb//9M2///TNv//0zb//9M2///TNv//0zb//9M2///TNv//0zb//9M2///TNv//0zb//9M2///TNv//0zb//9M2///LYKY/wAAAP8AAAD/AAAA/w8rMv8AAAD/AAAA/wAAAP8AAAD/BQ8R/0K93f9M2///TNv//0zb//9M2///Qr3d/wAAAP8AAAD/I2V2/yh0h/8odIf/LYKY/xlIVP8odIf/I2V2/wAAAP8KHCH/TNv//0zb//9M2///TNv//x5XZf8AAAD/KHSH/0zb//9M2///TNv//0zb//9M2///TNv//0K93f8AAAD/AAAA/0zb//9M2///TNv//0zb//8UOUP/AAAA/0zb//9M2///TNv//0zb//9M2///Qr3d/xQ5Q/8AAAD/AAAA/yNldv9M2///TNv//0zb//9M2///FDlD/wAAAP9M2///TNv//0zb//9M2///Qr3d/wAAAP8AAAD/Dysy/zeguv9M2///TNv//0zb//9M2///TNv//yh0h/8AAAD/Hldl/0zb//9M2///TNv//yh0h/8AAAD/I2V2/0zb//9M2///TNv//0zb//9M2///TNv//0zb//9M2///AAAA/wAAAP8PKzL/FDlD/yNldv83oLr/AAAA/wAAAP8UOUP/AAAA/y2CmP9M2///TNv//0zb//9M2///TNv//0K93f8ZSFT/AAAA/wAAAP8ZSFT/TNv//yh0h/8FDxH/AAAA/wocIf8odIf/TNv//0zb//9M2///TNv//0zb//9M2///TNv//0zb//9M2///TNv//0zb//9M2///TNv//0zb//9M2///TNv//0zb//9M2///TNv//0zb//9M2///TNv//0zb//9M2///TNv//0zb//9M2///TNv//0zb//9M2///TNv//0zb//9M2///TNv//0zb//9M2///TNv//0zb//9M2///TNv//0zb//9M2///TNv//0zb//9M2///TNv//0zb//9M2///TNv//0zb//9M2///TNv//0zb//9M2///TNv//0zb//9M2///TNv//0zb//9M2///TNv//0zb//9M2///TNv//0zb//9M2///AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==", chrome_settings_overrides: { search_provider: { name: "ClearSearch – поиск в Яндексе без рекламы", search_url: "https://cs.majento.ru/search/", search_url_post_params: "phrase={searchTerms}" } } });
Хочу чтобы кнопка Undo не реагировала на закрытые или открытые окна...
В каком смысле «не реагировала»? Можно попродробнее?
Можно сделать тоже самое для ucf, тоько для ПКМ сделать эмуляцию, как СКМ с вставкой из буфера?
(async (html, self) => CustomizableUI.createWidget(self = { label: "Текстовый редактор", tooltiptext: [ "Текстовый редактор", "ЛКМ: AkelPad", "ПКМ: Открыть блокнот" ].join("\n"), akelpadPath: "C:\\Program Files\\AkelPad\\AkelPad.exe", image: "data:image/x-icon;base64,AAABAAEAEREAAAEAIADwBAAAFgAAACgAAAARAAAAIgAAAAEAIAAAAAAAyAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAgAAAAApKSlRRkZGh0BAQHxBQUF+QUFBfkFBQX5BQUF+QEBAfEZGRogaGho1AAAAAAABAAECAgICAgICAgQEBAUAAAAAMTEwWeLi4f//////+vr6//r6+v/6+vr//Pz8//v7+//5+fn++/v7/7CwsPdNTU2hAQEBAgAAAAAAAAAAAwMDBAAAAABvbm+x8vHy/+Df4Pfi4+P76ubr++Lh4vvk5OT7/f39+/////v////77/Dv/aysrP8BEAElKngnxDCDLdEvgSzOLX8qy0GTPu1Zq1b/WatW/lasU/9op2f/xcPF/8PEw//i5+L/8vfx//H27//p6+n/qqqq/ESaQOS67a7/teip/rbpqv+36qv/suSm/6zfoP+s36D/teOo/4bNfP93s3b/39bf/9XY1f/5/Pj/+Pv2/+vs6/+qqar/T6RK8bvjsP6t2qT8sNym/LDcpvyx3af+st6o/7LeqP+w3ab/vuaz/1mqVP+2w7b/3dvd//D07//4+/f/6+zr/6qqqv8BNwFvndiU/8Djt/y34a//ueGw/7nhsP+54bD/ueGw/7jgr//B5Lj/mtSS/3q1ev/WzNb/4ufh//f79f/p6+n/qqqq/wAAAANHk0Pbzu/F/73gtP3A47f/wOO3/8Djt//A47f/wOO4/73itf/D5rn/Y7Je/7/MwP/k4eP/+f35/+vs6/+qqqr/AAAAAAAzAGap4KP/zebG+8Tkvv/G5b//xuS//8blv//F5b7/vuK2/8LkuP+U0Yv/ZaBl/97W3v/u9e3/6+3r/6qqqv8DAQMAAAAABE6XS+Db8dT/yuPD/czmxv/N5sf/zObG/8blv//A47j/t+Cu/7vjsP9nuWP/uMW5/+zr6//s7+z/qamq/wACAAQAAAAAATQBZrTir//a6dX70ufN/9Pozv/N5sf/xuS//8Djt/+44K//u+Ow/4zNgv9uqW7/6+Tr/+ru6v+qqar/AAAAAQMBAwAAAAAHVJhS2Or25v/W59L91OjP/8zmxv/G5b//wOO3/7rhsP+w3ab/tuSp/1isU/+vva//6+rq/6qqqv8AAAAAAQIBAwAAAAAENQRkv+S7/+Pr3vvR58z/zObG/8bkv/+/4rf/ueCw/7Hep/+z4Kf/h818/3Kucv/r4uv/qKqo/gAAAAAAAAABAwEDAAAAAApVl1TU7Pbo/9HlzP3P58j/xuS//8Ljuf+64bH/s9+p/6vcoP+t4KD/Wq5U/8bSx/23tLf9AAAAAAAAAAABAgEDAAAAAAk3CWaq36b/1unR+cLjvPzF5r78t+Cv/LXgrP2w36b8odmW/Kzgn/1yxGf7gLKA/52Sne0AAAAAAAAAAAAAAAECAQIAAAEADUOCQcdwt23/Zati82GrXvVjrWD4XKlY9FqpVvZaqlX3UqZN81OnTvxYbFndGxcbNAAAAAAAAAAAAAAAAAABAQEAAAAAFBAUHTAzMGcqKipRJSclUS8wL14nJyZNKCspVy4uLlsiJCJKNjU2aQQABAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=", id: "ucf-noteAkelPad", localized: false, onCreated(btn) { btn._handleClick = this.akelpad; btn.oncontextmenu = this.context; btn.setAttribute("image", this.image); }, get akelpad() { delete this.akelpad; return this.akelpad = Components.Constructor( "@mozilla.org/file/local;1", "nsIFile", "initWithPath" )(self.akelpadPath).launch; }, get url() { var u = (code, mime) => `data:${mime};charset=utf-8,${ encodeURIComponent(code) }`; this.fs = u(`addEventListener("pageshow", e => { var ta = e.target.getElementById("ta"); ta.focus(); docShell.doCommand("cmd_paste"); ta.editor.beginningOfDocument(); }, {once: true});`, ""); delete this.url; return this.url = u(html.replace("ICON", self.image), "text/html"); }, context(e) { if (e.ctrlKey || e.shiftKey) return; e.preventDefault(); var gb = this.ownerGlobal.gBrowser; (gb.selectedTab = gb.addTrustedTab(self.url)) .linkedBrowser.messageManager.loadFrameScript(self.fs, false); } }))( // <!DOCTYPE HTML> breaks the style :( `<html> <head> <title>Notepad</title> <link rel="shortcut icon" href="ICON"> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <style> html { overflow: hidden; background-color: black; } textarea { width: 100%; height: 100%; color: white; outline: none; padding: 2px 4px; /*resize: none;*/ overflow-y: auto; border-radius: 2px; background: #383838; border: 2px inset white; } </style> </head> <body> <textarea id="ta"></textarea> </body> </html>`);
Отсутствует
Dumby
В каком смысле «не реагировала»? Можно попродробнее?
В смысле, undoclose.window не надо. Только вкладки закрытые, без закр.окон. Иногда окно выскочит(при авторизации,к примеру) ,а кнопка целую простынь показывает в popup
Пункты я убираю, но сама кнопка ярко горит...Короче, как бы не реагировать на undoclose.Window
Отсутствует
Иногда окно выскочит(при авторизации,к примеру) ,а кнопка целую простынь показывает в popup
Пункты я убираю, но сама кнопка ярко горит...
Да, так понятнее, спасибо.
Даже не знаю, вот смотри — горит или не горит,
вроде, должно проходить через метод updUI()
… updUI: function() { var tabsCount = this.closedTabCount; var dis = !tabsCount && !this.closedWindowCount; if( dis && this.options.useMenu && this.options.menuTemplate.indexOf("restoreLastSession") != -1 && "restoreLastSession" in this.ss && this.ss.canRestoreLastSession ) dis = false; this.button.disabled = dis; },
Отсутствует
Если popup окошко открыто с помощью window.open()
Можно каким то образом заставить ссылки в нем открываться в новых вкладках этого же окошка?
Сейчас я кликаю по ссылке и она открывается в текущей вкладке popup'а. А если выбираю в контекстном меню ссылки "Открыть в новой вкладке", то открывается во вкладке основного окна.
Никто не ответит?
Отсутствует
Никто не ответит?
Ну, если вопрос адресован тем, у кого нередко
popup окошко открыто с помощью window.open()
то, скорее всего, нет. Если бы ответ был, то уже запостили бы, наверно.
А если вопрос адресован более широкой аудитории,
то шансов ещё меньше. Ведь тогда, как бы, просматривается предложение
переспрашивать что-то типа: «а что за window?», «а какие аргументы
передаются в его метод open()», иначе говоря — «как этот попап можно увидеть?».
Но выканючивать то, что и так должно быть в вопросе, странно же.
Впрочем, дело такое, «под настроение».
Отсутствует