alur
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAABJ0AAASdAHeZh94AAAAB3RJTUUH4AMCChAIfrcczAAAAAd0RVh0QXV0aG9yAKmuzEgAAAAMdEVYdERlc2NyaXB0aW9uABMJISMAAAAKdEVYdENvcHlyaWdodACsD8w6AAAADnRFWHRDcmVhdGlvbiB0aW1lADX3DwkAAAAJdEVYdFNvZnR3YXJlAF1w/zoAAAALdEVYdERpc2NsYWltZXIAt8C0jwAAAAh0RVh0V2FybmluZwDAG+aHAAAAB3RFWHRTb3VyY2UA9f+D6wAAAAh0RVh0Q29tbWVudAD2zJa/AAAABnRFWHRUaXRsZQCo7tInAAAB1klEQVQ4jaWTP2tUQRTFf/e+IaIgRCEg0TLdggoWCsnbV4iF5eYriIVg/IdY7VZbKhILv4PVro2NwSJutLJJsZ1WkohkEbVIFHbmWDhv2dV0GbjcmTt37sw5c65J4igjHBY0s0VgBTibQzvAQNKXf3M9H1gOIVwBKIpiDVgHSmAeOJ3n62a21ul0bOYySZjZI+Ckux+klM4Dz4BtSfv5ghPABeB+fs1DSRGAzMFN4DPwFAiSqK3dbls9BxaAvjt361jNQQGcA44Bt0II2+Px+O3q6qoDNJtNr6oqSdoLITyJMT4wsxeSvnousOHua8And5+PMdLpdKzf72s0GtlgMNBwODSAGOMH4DtwfQLhMAO81Wr5lLcajpldBcoJBDMrzWwupfQmr60sS2s0Gmk0Gnmj0Ui9Xm8imDpvWgdLklbMbEvS77IsvaqqtLm56VVVpW63K7PQdFcT2E8p/QJeS/pYc/Aq//klgBrzNHazZJB+ppSWgOfAtRkOgDvAS2DhsC/MOSFrZAe4IemvkDJuzzpYzH5b0kHeO14UxcUY4z1gCMwBPyQ9nhSoyXPndkosA3vAt7x1CjgDvJe0bmaXs+DezRSYKlQ302IO7QJbknb/yz1qO/8B30AQVyWwBXEAAAAASUVORK5CYII=
Отредактировано vitalii201 (25-08-2021 21:14:11)
Отсутствует
Долго искал по форуму дополнение где качнуть, нашел, продублирую.
Дополнение cusstom_button 0.0.7.0.0.19+ инструкция по установке.
Работает на новой версии 91.0.2 (64-битный),
Отредактировано alur (26-08-2021 18:28:40)
Отсутствует
alur
Не совсем верная инструкция: config.js лучше использовать этот и CB есть более свежая версия 0.0.7.0.0.18
Отредактировано kokoss (26-08-2021 16:32:14)
Win7
Отсутствует
alur
и CB есть более свежая версия 0.0.7.0.0.18
Есть ещё свежее версия.
0.0.7.0.0.19: https://forum.mozilla-russia.org/viewto … 88#p793488
«The Truth Is Out There»
Отсутствует
Dumby,
Слетел url2title для TST последней версии 3.8.12
Скриншот работает
TreeStyleTabPreviewPopup.jsm
var timeout = 100; if (!ChromeUtils.domProcessChild.childID) { var popupWidth = 1000; //big one var label = "ucf_tst_preview_popup"; var tooltiptext = "Some Tooltip Text"; var imgEnabled = "chrome://browser/skin/preferences/face-smile.svg"; var imgDisabled = "chrome://browser/skin/preferences/face-sad.svg"; var btnImage, popupPosition, enabled, addonUUID, registeredUUID; var mo = (p, r = "gre") => ChromeUtils.import(`resource://${r}/modules/${p}.jsm`)[p]; //-------[ Addon ]------------------------------------------------------ var addonId = "treestyletab@piro.sakura.ne.jp"; var manager = mo("ExtensionParent").apiManager; var tt = manager.global.tabTracker; var waitAddon = (e, isAppShutdown) => isAppShutdown || ( addonUUID = null, manager.on("ready", onReady) ); var onReady = (e, addon) => { if (addon.id != addonId) return; manager.off("ready", onReady); addon.once("shutdown", waitAddon); addonUUID = addon.uuid; checkRegistration(); } waitAddon(); //-------[ Actor registration ]------------------------------------------------------ var name = "TreeStyleTabPreviewPopup"; var reg = () => ChromeUtils.registerWindowActor(name, { parent: {moduleURI: __URI__}, messageManagerGroups: ["webext-browsers"], //dezhnev - Url2Title (DOMDocElementInserted) child: {moduleURI: __URI__, events: {DOMDocElementInserted: {}, mouseover: {}}}, matches: [`moz-extension://${registeredUUID = addonUUID}/sidebar/sidebar.html*`] }); var unreg = () => { registeredUUID = null; ChromeUtils.unregisterWindowActor(name); } var checkRegistration = () => { if (enabled) { if (registeredUUID) { if (registeredUUID == addonUUID) return; addonUUID && unreg(); } addonUUID && reg(); } else if (registeredUUID && addonUUID) unreg(); } //------[ Observer ]------------------------------------------------------ var {prefs, obs} = mo("Services"); var pref = "ucf_tst_preview_popup"; var branch = prefs.getBranch("sidebar."); var prefObs = { observe(b, t, data) { this[data]?.(branch.getBoolPref(data, true)); }, position_start: val => popupPosition = val ? "end_before" : "start_before", [pref](val) { btnImage = (enabled = val) ? imgEnabled : imgDisabled; this.setBtnsImg(); checkRegistration(); }, setBtnsImg: () => prefObs.setBtnsImg = () => { var widget = cui.getWidget(btnId); for(var win of cui.windows) widget.forWindow(win).node?.setAttribute("image", btnImage); } }; for (let p of [pref, "position_start"]) prefObs.observe(null, null, p); branch.addObserver("", prefObs); obs.addObserver(function quit(s, topic) { obs.removeObserver(quit, topic); branch.removeObserver("", prefObs); }, "quit-application-granted"); //-------[ Widget ]------------------------------------------------------ var popupId = "ucf-tst-preview-popup"; var btnId = popupId + "-button"; var cui = mo("CustomizableUI", ""); var toggle = () => branch.setBoolPref(pref, !enabled); cui.createWidget({ id: btnId, label, tooltiptext, localized: false, onCreated(btn) { btn.render = this.render; btn._handleClick = toggle; btn.setAttribute("image", btnImage); }, render() { delete this.render; this.render(); this.firstChild.style.setProperty("min-height", "16px", "important"); } }); //-------[ Actor ]------------------------------------------------------ var TreeStyleTabPreviewPopupParent = class extends JSWindowActorParent { actorCreated() { var doc = this.browsingContext.topChromeWindow.document; var popup = doc.getElementById(popupId); if (!popup) { popup = doc.createXULElement("menupopup"); popup.id = popupId; popup.setAttribute("ignorekeys", true); popup.setAttribute("rolluponmousewheel", true); popup.setAttribute("consumeoutsideclicks", "never"); popup.shadowRoot.querySelector("style").append(` :host { padding: 0 !important; -moz-appearance: none !important; } arrowscrollbox::part(scrollbutton-up), arrowscrollbox::part(scrollbutton-down) { display: none !important; } `); (popup.canvas = popup.appendChild(doc.createElement("canvas"))) .width = popupWidth; popup.context = popup.canvas.getContext("2d", {alpha: false}); doc.getElementById("mainPopupSet").append(popup); } this.popup = popup; } receiveMessage(msg) { var id = msg.data; if (!id) return this.popup.hidePopup(); var tab = tt.getTab(+id.slice(4)); if (tab/* && !tab.selected*/) { var cwg = tab.linkedBrowser.browsingContext?.currentWindowGlobal; cwg && this.drawSnapshot(tab.ownerDocument, cwg, id); } } async drawSnapshot(doc, cwg, id) { var {width, height} = await cwg.getActor("Thumbnails") .sendQuery("Browser:Thumbnail:ContentInfo"); if (width < 200) return; var k = popupWidth / width; try {var bitmap = await cwg.drawSnapshot( new DOMRect(0, 0, width, height), k, "white" );} catch {} if (bitmap) { var data = await this.sendQuery(id); if (data) { this.popup.canvas.height = k * height; this.popup.context.drawImage(bitmap, 0, 0); bitmap.close(); this.popup.openPopupAtScreenRect(popupPosition, ...data); } } } didDestroy() { this.popup.hidePopup(); this.popup = null; } } } //Url2Title function updateTextContent() { var span = this.firstElementChild; if (!span) return; var val = this.getAttribute("value"); var url = this.parentNode.dataset.currentUri; if (url?.startsWith("http")) try { var {hostname} = new URL(url); if (hostname) val = `${hostname} | ${val}`; } catch {} span.textContent = val || ""; } class TreeStyleTabPreviewPopupChild extends JSWindowActorChild { actorCreated() { this.args = ["mouseleave", () => { this.tab = null; this.tid || this.sendAsyncMessage(""); this.tid = this.clearTimeout(); }, {once: true}]; } mult(val) { return this * val; } receiveMessage(msg) { var tab = this.document.getElementById(msg.name); var res = tab?.matches(":hover"); if (res) { var {x, y, width, height} = tab.getBoundingClientRect(); var win = tab.ownerGlobal; res = [ x + win.mozInnerScreenX, y + win.mozInnerScreenY, width, height ]; var z = win.windowUtils.screenPixelsPerCSSPixel; if (z != 1) res = res.map(this.mult, z); } return res; } //Url2Title labDefined(lab) { lab.wrappedJSObject.prototype .updateTextContent = updateTextContent; } handleEvent(e) { //Url2Title e.target.ownerGlobal.customElements .whenDefined("tab-label").then(this.labDefined); this.handleEvent = this.mouseover; } mouseover(e) { var tab = e.target.closest("tab-item"); if (!tab || tab == this.tab) return; this.clearTimeout(); this.tid = this.contentWindow .setTimeout(this.onTab, timeout, this.tab = tab, this); tab.addEventListener(...this.args); } clearTimeout() { this.tid && this.contentWindow.clearTimeout(this.tid); } onTab(tab, self) { self.tid = null; tab.wrappedJSObject.apiTab.discarded || self.sendAsyncMessage("", tab.id); } didDestroy() { this.tab = null; } } var EXPORTED_SYMBOLS = ["TreeStyleTabPreviewPopupChild", "TreeStyleTabPreviewPopupParent"];
Отсутствует
dezhnev
....... //var url = this.parentNode.dataset.currentUri; var url = this.closest("tab-item").dataset.currentUri;
Отсутствует
Dumby
Вы бы не могли пожалуйста еще добавить, чтобы при открытии закладки в контейнере, если контейнер с таким именем уже существует, то открывать в нем же, а не создавать новый?
(async (sel, self) => ({ icon: "circle", colors: [ "#FF9800", "#03A9F4", "#FFC107", "#00BCD4", "#FFEB3B", "#009688", "#CDDC39", "#4CAF50", "#8BC34A", "#D32F2F", "#4949ff", "#C2185B", "#607D8B", "#7B1FA2", "#9E9E9E", "#673AB7", "#795548", "#3F51B5", "#FF5722", "#2196F3", ], initColors() { var colorName = "ucf-gen"; var css = "@-moz-document url(about:preferences#containers)," + " url-prefix(chrome://browser/content/browser.x) {\n"; this.colors.forEach((color, ind) => { var [ic, tc] = color.split(/\s*\|\s*/); css += `\t.identity-color-${colorName}${ind} {\n` + `\t\t--identity-tab-color: ${tc || ic};\n` + `\t\t--identity-icon-color: ${ic};\n\t}\n` }); var url = "data:text/css;charset=utf-8," + encodeURIComponent(css + "}"); var sss = Cc["@mozilla.org/content/style-sheet-service;1"] .getService(Ci.nsIStyleSheetService); sss.loadAndRegisterSheet(Services.io.newURI(url), sss.USER_SHEET); var len = this.colors.length; var pref = "ucf.openInGeneratedContainer.lastColor"; var ind = Math.min(Services.prefs.getIntPref(pref, -1), len - 1); this.nextColor = () => { var next = ind + 1; Services.prefs.setIntPref(pref, ind = next == len ? 0 : next); return colorName + ind; } }, quit: false, init(topic) { Services.obs.addObserver(self = this, topic); var lt = "browser-lastwindow-close-granted"; var lw = () => this.quit = true; Services.obs.addObserver(lw, lt); Services.obs.addObserver(function quit(s, t) { self.quit = true; Services.obs.removeObserver(self, topic); Services.obs.removeObserver(lw, lt); Services.obs.removeObserver(quit, t); }, "quit-application-granted"); this.initColors(); this.newUsercontext = name => { var id = this.cis.create( name || `[ ${this.cis._lastUserContextId + 1} ]`, this.icon, this.nextColor() ).userContextId; this.saveGens(this.gens.add(id)); return id; } var cpref = "ucf.openInGeneratedContainer.containers"; var arr = Services.prefs.getStringPref(cpref, "").split(",").map(Number).filter(Boolean); if (arr.length) { var ids = this.cis.getPublicIdentities().map(i => i.userContextId); arr = arr.filter(id => ids.includes(id)); } this.gens = new Set(arr); (this.saveGens = () => Services.prefs.setStringPref(cpref, Array.from(this.gens).join(",")))(); var {PlacesUtils} = ChromeUtils.import("resource://gre/modules/PlacesUtils.jsm"); var {PrivateBrowsingUtils} = ChromeUtils.import("resource://gre/modules/PrivateBrowsingUtils.jsm"); ChromeUtils.import( "resource:///modules/PlacesUIUtils.jsm" ).PlacesUIUtils._openNodeIn = function PUIU__openNodeIn(node, where, win, priv) { if (node && PlacesUtils.nodeIsURI(node) && this.checkURLSecurity(node, win)) { var {uri} = node; var isBookmark = PlacesUtils.nodeIsBookmark(node); if (!PrivateBrowsingUtils.isWindowPrivate(win)) isBookmark ? this.markPageAsFollowedBookmark(uri) : this.markPageAsTyped(uri); var params = {private: priv, inBackground: this.loadBookmarksInBackground}; if (uri.startsWith("javascript:")) params.allowPopups = params.allowInheritPrincipal = true; else if (isBookmark) { var e = win.event; if ( e && !e.button && e.detail <= 1 && !e.ctrlKey && !e.shiftKey && !e.altKey && (e.type == "command" || e.type == "click") && e.target.matches(".bookmark-item, treechildren") ) { if (where == "current") where = "tab"; var title, {parent} = node, {type} = parent; var folder = type == node.RESULT_TYPE_FOLDER || type == node.RESULT_TYPE_FOLDER_SHORTCUT; if (folder) title = PlacesUtils.bookmarks.getLocalizedTitle({ guid: parent.bookmarkGuid, title: parent.title }); var id = params.userContextId = self.newUsercontext(title); folder || updateTitle(id, node.bookmarkGuid); } } win.openTrustedLinkIn(uri, where, params); } } var updateTitle = async (id, guid) => { var {parentGuid} = await PlacesUtils.bookmarks.fetch(guid); var title = PlacesUtils.bookmarks.getLocalizedTitle( await PlacesUtils.bookmarks.fetch(parentGuid) ); var {icon, color} = this.cis.getPublicIdentityFromId(id); this.cis.update(id, title, icon, color); } }, observe(doc) { var list = doc.querySelectorAll(sel); if (!list.length) return; var menuitem = doc.createXULElement("menuitem"); for(var args of Object.entries({ selectiontype: "single", oncommand: "cmd(window)", nodetype: "folder|query", selection: "folder|query", label: "Открыть всё в контейнере", id: "placesContext_openContainer:tabs:newUsercontext" })) menuitem.setAttribute(...args); menuitem.cmd = this.cmd; menuitem.rnd = menuitem.constructor.prototype.render; menuitem.render = this.render; var [m1, m2] = menuitem.list = Array.from(list); (m2 || m1).after(menuitem); if (doc.documentElement.getAttribute("windowtype") != "navigator:browser") return; for(var btn of [ doc.getElementById("tabs-newtab-button"), doc.getElementById("new-tab-button") || doc.ownerGlobal.gNavToolbox.palette.querySelector("#new-tab-button") ]) if (btn) btn.checkForMiddleClick = this.click; var win = doc.ownerGlobal; this.redefDoSearch(win, win.customElements.get("searchbar").prototype); win.gBrowser.tabContainer.addEventListener("TabClose", this.tabClose); win.addEventListener("unload", this.winUnload, {once: true}); this.quit = false; var tuc = "gBrowser.selectedTab.userContextId"; win.BrowserOpenTab = win.eval(`(${win.BrowserOpenTab})`.replace( "resolve,", `$&\n userContextId: ${tuc},` )); var bdw = win.browserDOMWindow.wrappedJSObject; win.Object.assign(bdw, win.eval( `({${bdw.getContentWindowOrOpenURI}})` .replace("userContextId,", `isExternal ? ${tuc} : $&`) .replace( /null,\s+null,\s+null,\s+aTriggeringPrincipal/, `isExternal ? ${tuc} : $&` ) )); }, winUnload(e) { var win = e.target.ownerGlobal; win.removeEventListener("TabClose", self.tabClose); if (self.quit) return; var gb = win.gBrowser; if (gb) for(var tab of gb.tabs) self.tabClose(null, tab); }, closed: new Set(), cis: ChromeUtils.import("resource://gre/modules/ContextualIdentityService.jsm") .ContextualIdentityService, tabClose(e, tab = e.target) { var id = +tab.getAttribute("usercontextid"); id && self.gens.has(id) && self.closed.add(id); self.closed.size == 1 && ChromeUtils.idleDispatch(self.maybeRemove); }, maybeRemove() { var ids = Array.from(self.closed); self.closed.clear(); for(var id of ids) self.maybeRemoveById(id); }, maybeRemoveById(id) { for(var win of CustomizableUI.windows) if (win.document.querySelector(`tab.tabbrowser-tab[usercontextid="${id}"]`)) return; this.saveGens(this.gens.delete(id)); this.cis.remove(id); }, redefDoSearch(win, proto) { var code = `(openTrustedLinkIn => [ {${proto.doSearch}}, openTrustedLinkIn ])( function otl(url, where, params) { if (where != "current") params.resolveOnNewTabCreated = br => { var tab = gBrowser.getTabForBrowser(br); gBrowser.moveTabTo(tab, Infinity); gBrowser.addTrustedTab("about:blank", { index: tab._tPos, userContextId: tab.userContextId }); }, params.userContextId = otl.newUsercontext( document.getElementById("searchbar").value ); openTrustedLinkIn(url, where, params); } );`; (this.redefDoSearch = (win, proto) => { var [obj, func] = win.eval(code); Object.assign(proto, obj); func.newUsercontext = this.newUsercontext; })(win, proto); }, click(btn, e) { if (!(e.button != 2 || e.ctrlKey || e.shiftKey)) { var txt = e.view.readFromClipboard(); if (txt) { var urls = txt.split("\n").map(self.map).filter(Boolean); if (urls.length) return e.preventDefault(), self.openFromClipboard(e.view, urls); } } e.view.checkForMiddleClick(btn, e); }, eo: Object.create(null), map(str) { str = str.trim(); try { var scheme = Services.io.extractScheme(str); var ph = Services.io.getProtocolHandler(scheme); if (ph.scheme == scheme) return Services.io.newURI(str) && {uri: str}; } catch {} }, openFromClipboard(win, urls) { if (win.OpenInTabsUtils.confirmOpenInTabs(urls.length, win)) urls.load = true, this.open(win, this.eo, urls); }, async render() { this.rnd(); await new Promise(this.ownerGlobal.requestAnimationFrame); this.hidden || (this.hidden = this.list.every(self.every)); }, every: node => node.disabled || node.hidden, cmd(win) { var {_view, triggerNode} = this.parentNode; var node = triggerNode._placesView && triggerNode._placesView.result.root; self.open(win, node || _view.selectedNode || _view.result.root); }, open(win, node, list) { var gbw = Cu.import("resource:///modules/PlacesUIUtils.jsm", {}).getBrowserWindow; var w = gbw(win); this.pu = w.PlacesUIUtils; this.fs = w.PlacesUtils.favicons; this.sysp = w.E10SUtils.SERIALIZED_SYSTEMPRINCIPAL; (this.open = (win, node, list) => { var {bookmarkGuid: guid, title} = node; if (guid && title) title = win.PlacesUtils.bookmarks.getLocalizedTitle({guid, title}); this.openURLs(gbw(win), list || win.PlacesUtils.getURLsForContainerNode(node), title); guid && this.pu.doCommand(win, "placesCmd_delete"); })(win, node, list); }, async openURLs(win, urls, title) { var userContextId = this.newUsercontext(title); var mark = !win.PrivateBrowsingUtils.isWindowPrivate(win); var {load} = urls, gb = win.gBrowser, pos = gb.selectedTab._tPos; for(var {uri, title, isBookmark} of urls) try { if (mark) isBookmark ? this.pu.markPageAsFollowedBookmark(uri) : this.pu.markPageAsTyped(uri); if (load) { gb.addTrustedTab(uri, {index: ++pos, userContextId}); continue; } var state = {userContextId, entries: [{ url: uri, title: title || uri, triggeringPrincipal_base64: this.sysp }]}; var [,, data, mime] = await new Promise( resolve => this.fs.getFaviconDataForPage( Services.io.newURI(uri), (...args) => resolve(args), 16 ) ); if (data.length) state.image = `data:${ mime || "image/x-icon" };base64,${ btoa(String.fromCharCode(...data)) }`; var tab = gb.addTrustedTab(null, {index: ++pos, userContextId}); win.SessionStore.setTabState(tab, state); } catch {}; } }).init("chrome-document-loaded"))( "#placesContext_openBookmarkContainer\\:tabs,#placesContext_openContainer\\:tabs" );
Отредактировано Stkvsky (28-08-2021 18:03:52)
Отсутствует
dezhnev
скрытый текстВыделить кодКод:
....... //var url = this.parentNode.dataset.currentUri; var url = this.closest("tab-item").dataset.currentUri;
Cпасибо!
А можно еще куда-нибудь поставить, наподобие .replace(/^www\./, "") , чтобы для доменов убирать - www|forum|mail ?
Отсутствует
при открытии закладки в контейнере, если контейнер с таким именем уже существует, то открывать в нем же, а не создавать новый
/* var folder = type == node.RESULT_TYPE_FOLDER || type == node.RESULT_TYPE_FOLDER_SHORTCUT; if (folder) title = PlacesUtils.bookmarks.getLocalizedTitle({ guid: parent.bookmarkGuid, title: parent.title }); var id = params.userContextId = self.newUsercontext(title); folder || updateTitle(id, node.bookmarkGuid); } } win.openTrustedLinkIn(uri, where, params); } } var updateTitle = async (id, guid) => { var {parentGuid} = await PlacesUtils.bookmarks.fetch(guid); var title = PlacesUtils.bookmarks.getLocalizedTitle( await PlacesUtils.bookmarks.fetch(parentGuid) ); var {icon, color} = this.cis.getPublicIdentityFromId(id); this.cis.update(id, title, icon, color); } */ if ( type == node.RESULT_TYPE_FOLDER || type == node.RESULT_TYPE_FOLDER_SHORTCUT ) title = PlacesUtils.bookmarks.getLocalizedTitle({ guid: parent.bookmarkGuid, title: parent.title }); else { var quit = false; var until = () => quit; var stop = () => quit = true; var guid, info; PlacesUtils.bookmarks.fetch(node.bookmarkGuid) .then(info => guid = info.parentGuid) .finally(stop); spin(until); quit = false; PlacesUtils.bookmarks.fetch(guid) .then(res => info = res) .finally(stop); spin(until); if (info) title = PlacesUtils.bookmarks.getLocalizedTitle(info); } title = title || "\u200b"; // ZWSP var id = self.cis.getPublicIdentities() .find(find, title)?.userContextId; params.userContextId = id || self.newUsercontext(title); } } win.openTrustedLinkIn(uri, where, params); } } var spin = arg => { var {tm} = Services; spin = tm.spinEventLoopUntilOrShutdown || tm.spinEventLoopUntilOrQuit; var bargs = [tm]; spin.length == 2 && bargs.push("Fetch bookmark folder title sync"); (spin = spin.bind(...bargs))(arg); } var find = function(uc) { return uc.name == this; }
куда-нибудь поставить, наподобие .replace(/^www\./, "")
Да там же, неподалёку. Тут hostname и реплейсить: `${hostname} | ${val}`
фишка TmpDataPath= ...В портаблах не всегда работает?
У меня всегда работает. Но это ничего не значит,
поскольку моё использование разнообразием не блещет.
portable32.dll, не последняя, TmpDataPath совпадает с PortableDataPath,
то есть папка LocalAppData в профиле.
Отредактировано Dumby (29-08-2021 21:29:48)
Отсутствует
Подскажите пожалуйста. Как программно узнать, закреплённая ли активная вкладка? Если закреплена true, иначе false.
Может как-то так
addEventListener("TabSelect", (e, tab = e.target)=> { if ( tab.pinned == true ) { alert('pinned'); } else { alert('not pinned'); } }, true, gBrowser.tabContainer);
«The Truth Is Out There»
Отсутствует
Senflex пишетПодскажите пожалуйста. Как программно узнать, закреплённая ли активная вкладка? Если закреплена true, иначе false.
Может как-то так
Выделить кодКод:
addEventListener("TabSelect", (e, tab = e.target)=> { if ( tab.pinned == true ) { alert('pinned'); } else { alert('not pinned'); } }, true, gBrowser.tabContainer);
Благодарю!
Отсутствует
Senflex пишетПодскажите пожалуйста. Как программно узнать, закреплённая ли активная вкладка? Если закреплена true, иначе false.
Может как-то так
Выделить кодКод:
addEventListener("TabSelect", (e, tab = e.target)=> { if ( tab.pinned == true ) { alert('pinned'); } else { alert('not pinned'); } }, true, gBrowser.tabContainer);
Сегодня попробовал, что-то не работает, можно ли без addEventListener?
Отсутствует
Dumby
Не посмотрите, где тут лажа? Это миниплеер прибить на ютуб. Может другое есть средство?
Вроде заделал скрипт. Как бы в свои вставить , а не в обезьяну ?
function fuckthatshit(a) { a.classList.remove('yt-simple-endpoint'); } new MutationObserver(function(_,self) { for (let link of document.links) { if (!link.classList.contains('')) { fuckthatshit(link); } } }).observe(document, {childList:true, subtree:true})
Отредактировано ВВП (04-09-2021 20:39:10)
Отсутствует
dumby может это поможет
кнопка
data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZ2cASEhIAKs+PgC9Pz8AvEFBALxCQgC8REQAvEREALxDQwC8QUEAvD8/ALw/PwC9RkYAsV9fAFoAAAAAbm4AQjMzAP8TEwD/FRUA/xkZAP8eHgD/IiIA/yMjAP8jIwD/IiIA/x8fAP8aGgD/FxcA/xMTAP8vLwD/X18AX0xMAKgbGwD/GxsA/yQkAP8rKwD/JiYA/xsbAP8XFwD/FxcA/x0dAP8oKAD/LS0A/yQkAP8fHwD/FxcA/0VFAMhLSwCyKCgA/ywsAP82NgD/IyMA/w8PAP8NDQD/Dw8A/w8PAP8NDQD/EBAA/yYmAP84OAD/Ly8A/yYmAP9GRgDPVVUArzk5AP9AQAD/KysA/w4OAP8TEwD/EBAA/xAQAP8VFQD/FhYA/xQUAP8PDwD/Li4A/0REAP83NwD/UFAAzV9fAK9NTQD/REQA/xUVAP8WFgD/HBwA/1BQAP86OgD/FRUA/xUVAP8aGgD/GBgA/xcXAP9JSQD/S0sA/1tbAM1paQCvYWEA/zk5AP8VFQD/GxsA/ycnAP+CggD/jY0A/2trAP8zMwD/FRUA/xwcAP8VFQD/Pz8A/2FhAP9nZwDNdHQAr3R0AP81NQD/GxsA/yAgAP8tLQD/kpIA/6CgAP+kpAD/nJwA/21tAP8qKgD/GRkA/zs7AP91dQD/c3MAzYCAAK+IiAD/PDwA/yAgAP8lJQD/MzMA/6ioAP+2tgD/trYA/8DAAP+kpAD/NzcA/xoaAP9DQwD/iYkA/4CAAM2JiQCvnp4A/1hYAP8gIAD/KSkA/z09AP/GxgD/4+MA/9bWAP+NjQD/QEAA/y8vAP8eHgD/XFwA/5ycAP+KigDNk5MAr6urAP+SkgD/LCwA/zc3AP9QUAD/5OQA/9DQAP97ewD/X18A/21tAP9tbQD/YmIA/7a2AP+wsAD/k5MAzZubAK+zswD/yMgA/4ODAP86OgD/VlYA/3h4AP9tbQD/dHQA/4SEAP+GhgD/fX0A/87OAP///wn/8PAA/7CwAM2iogCywsIA/9LSAP/x8QD/qKgA/2RkAP9lZQD/e3sA/4iIAP+NjQD/nZ0A/+rqAP///y3///8f////If/KygDPqqoAqdXVAP/e3gD//v4A////If///wv/3NwA/8zMAP/Y2AD//PwA////N////1H///9J////kv///5b/wsIAyZiYAEbV1QD///8D////Hf///zv///9e////cf///3n///+A////hf///4L///90////cf///4j///89/5qaAGMAAAAAnp4ATdvbALHp6QC/9/cAvv//B77//xS+//8fvv//I77//x6+//8Xvv//D77//wW/7u4AtpiYAGAAAAAAgAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAEAAA==
Добавлено 04-09-2021 10:31:18
инициализация
var path = "C:\\Program Files\\DAUM\\PotPlayer\\PotPlayerMini.exe"; this.onclick =e=> { if ( e.button == 0 ) play(gBrowser.currentURI.spec, ""); if ( e.button == 1 ) gShowPopup(self); if ( e.button == 2 && !e.ctrlKey && !e.shiftKey && !e.altKey && !e.metaKey ) { e.preventDefault(); play(gBrowser.currentURI.spec, "/add"); } }; this.oncontextmenu =e=> { e.button && !e.ctrlKey && e.preventDefault() }; function play(link, param) { var file = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile); var process = Cc["@mozilla.org/process/util;1"].createInstance(Ci.nsIProcess); file.initWithPath(path); process.init(file); process.run(false, [link, param], 2); }; self.tooltipText = "Л: Открыть видео в " + playerName + "\nС: CB Меню \nП: Добавить видео в плейлист " + playerName;
Добавлено 04-09-2021 10:32:24
и поставь potplayer
Добавлено 04-09-2021 10:35:05
или поставь аддон potplayer youtube shortcut
Отредактировано kaktusok (04-09-2021 10:35:05)
Отсутствует