rubel
Advanced Member | Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору // Открывать ссылки в новой вкладке длинным кликом, от 03.12.2013. ................................ (code => { var delay = 300; // время удержания в мс var inBackground = true; // открывать в фоновой вкладке var relatedToCurrent = false; // открывать рядом с related вкладкой var p = "CB" + _id.slice(20) + ":LongPressHandler:"; var msgDestroy = p + "Destroy", msgResponse = p + "Response"; code = code.replace(/%MD%/g, msgDestroy).replace("%MR%", msgResponse) .replace("%DL%", delay).replace("%BG%", inBackground); var url = "data:," + encodeURIComponent(code); var mm = window.getGroupMessageManager("browsers"); mm.loadFrameScript(url, true); function handleLongPress(msg) { var [link, ref, ctrl] = msg.data; var bg = inBackground != null ? inBackground : Services.prefs.getBoolPref("browser.tabs.loadInBackground"); gBrowser.loadOneTab(link, { relatedToCurrent, inBackground: ctrl != bg, //referrerURI: makeURI(ref) }); } mm.addMessageListener(msgResponse, handleLongPress); addDestructor(() => { mm.removeDelayedFrameScript(url); mm.broadcastAsyncMessage(msgDestroy); mm.removeMessageListener(msgResponse, handleLongPress); }); })(`({ init() { addEventListener("mousedown", this, false); addMessageListener("%MD%", this); }, receiveMessage() { removeEventListener("mousedown", this, false); removeMessageListener("%MD%", this); }, handleEvent(e) { if (e.type == "mousedown") { if (e.button || e.shiftKey || e.altKey || e.detail != 1) return; var a = e.originalTarget.closest("a[href]"); if (!a || a.href.startsWith("javascript:")) return; this.ctrl = e.ctrlKey; this.initLongPress(a); } else { if (e.type == "click" && !this.link) e.preventDefault(); this.destroyLongPress(); } }, get timer() { delete this.timer; return this.timer = Components.classes["@mozilla.org/timer;1"] .createInstance(Components.interfaces.nsITimer); }, notify() { sendSyncMessage("%MR%", [this.link.href, this.link.ownerDocument.URL, this.ctrl]); this.link = null; if (!%BG%) this.destroyLongPress(); }, initLongPress(a) { addEventListener("click", this, true); addEventListener("dragstart", this, false); this.timer.initWithCallback(this, %DL%, this.timer.TYPE_ONE_SHOT); this.link = a; }, destroyLongPress() { removeEventListener("click", this, true); removeEventListener("dragstart", this, false); this.link && this.timer.cancel(); this.link = null; } }).init();`); // Открывать всё в новых вкладках, от 16.12.2013. ...................................... (function () { // открывать всё из ниже перечисленного в новых вкладках, если пустая страница открывать в текущей .... const where = whereToOpenLink; eval("whereToOpenLink = " + where.toString() .replace('return "current";\n}', (function() { switch ( e.originalTarget.id ) { case "bookmarksMenuPopup": case "goPopup": case "appmenu_bookmarksPopup": case "appmenu_historyMenupopup": case "personal-bookmarks": case "bookmarks-menu-button": case "historymenu_history": case "home-button": case "page-proxy-stack": case "go-button": case "urlbar-go-button": case "PopupAutoCompleteRichResult": case "searchbar": case "PopupAutoComplete": return "tab"; default: return "current"; } }).toString().replace(/^.*{|}$/g, "")+"}")); // открывать закладки и историю в новых вкладках, если букмарклети или пустая страница в текущей .... const openNode = PlacesUIUtils._openNodeIn; eval("PlacesUIUtils._openNodeIn = " + openNode.toString().replace(') {', '){\n if (["about:newtab", "about:blank"].indexOf(content.location.href)!= -1 ) aWhere = "current";\n aWhere = (aWhere == "tab" || aNode.uri.startsWith("javascript:") ) ? "current" : "tab";\n') ); // если JavaScript ссылка или пустая страница открывать в текущей .... const linkIn = openLinkIn; eval("openLinkIn = " + linkIn.toString().replace(';', ';;\n if ( url.startsWith("javascript:") ) where = "current";\n if (["about:newtab", "about:blank"].indexOf(content.location.href)!= -1 ) where = "current";') ); // команды адресной строки открывают всё связанное с адресной строкой в новых вкладках, если alt+ в текущей .... const handle = gURLBar.handleCommand; eval("gURLBar.handleCommand = " + handle.toString().replace('aTriggeringEvent.altKey;', 'aTriggeringEvent.altKey == false;')); // 'Вставить и перейти' из адресной строки открывает в новых вкладках .... addEventListener("popupshowing", function(e) { var menupopup = e.originalTarget; var pasteAndGo = menupopup.getElementsByAttribute("anonid", "paste-and-go")[0]; if ( !pasteAndGo ) return; pasteAndGo.setAttribute("oncommand", "event.preventDefault(); gURLBar.select(); goDoCommand('cmd_paste'); gURLBar.handleCommand(event);") }, false, document.getElementById("urlbar") ); // удалять изменения из внутренних функций Firefox .... addDestructor(function() { eval("whereToOpenLink = " + where); eval("PlacesUIUtils._openNodeIn = " + openNode); eval("openLinkIn = " + linkIn); eval("gURLBar.handleCommand = " + handle); }); })(); // при закрытии вкладки - переход тоже на последнюю посещенную.... const tc = gBrowser.tabContainer; let tabs = []; function onTabSelect(e) { for (let i = 0; i < tabs.length; i++) { if (e.target.linkedPanel != tabs[i]) continue; tabs.splice(i, 1); break; } tabs.push(e.target.linkedPanel); } function onTabClose(e) { let allTabs = Array.slice(tc.childNodes); let allTabsLP = allTabs.map(function(tab) { return tab.linkedPanel; }); if (e.target == gBrowser.selectedTab && tabs.length >= 1) { let tab; let lp = tabs[tabs.length - (tabs.length == 1 ? 1 : 2)]; for (let i = 0; i < allTabsLP.length; i++) { if (lp != allTabsLP[i]) continue; tab = allTabs[i]; break; } if (tab) gBrowser.selectedTab = tab; } if (tabs.length != 0) { tabs = tabs.filter(function(tab) { return allTabsLP.indexOf(tab) != -1 ? true : false; }); tabs.splice(tabs.length - (tabs.length == 1 ? 1 : 2), 1); } } addEventListener("TabSelect", onTabSelect, false, tc); addEventListener("TabClose", onTabClose, false, tc); |