Полезная информация

В мире Mozilla происходит много интересных событий. Но вам не нужно постоянно посещать новостные сайты, чтобы быть в курсе всех изменений. Зайдите на ленту новостей Mozilla Россия.

№1585125-08-2021 16:31:26

ВВП
Участник
 
Группа: Members
Зарегистрирован: 13-03-2021
Сообщений: 332
UA: Firefox 91.0

Re: Custom Buttons

Dumby

Dumby пишет

Но да, теперь вижу. Добавил такое, и discover не вылезает.

Вот это другой коленкор. Вставил это прямо в СВ и косяк пропал !

Отредактировано ВВП (26-08-2021 16:33:46)

Отсутствует

 

№1585225-08-2021 19:21:34

alur
Участник
 
Группа: Members
Зарегистрирован: 15-08-2021
Сообщений: 14
UA: Firefox 91.0

Re: Custom Buttons

Добрые люди мне много не надо :), подскажите как кнопочку или в пункте меню прикрутить  Перезапуск Firefox или about:restartrequired

Спасибо.

Отсутствует

 

№1585325-08-2021 21:12:16

vitalii201
Участник
 
Группа: Members
Зарегистрирован: 24-03-2011
Сообщений: 676
UA: Firefox 91.0

Re: Custom Buttons

alur

В Код

Выделить код

Код:

Services.startup.quit(Services.startup.eAttemptQuit | Services.startup.eRestart)


иконка

Выделить код

Код:

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)

Отсутствует

 

№1585426-08-2021 13:31:17

alur
Участник
 
Группа: Members
Зарегистрирован: 15-08-2021
Сообщений: 14
UA: Firefox 91.0

Re: Custom Buttons

vitalii201

Спасибо все работает.

Отсутствует

 

№1585526-08-2021 15:16:08

alur
Участник
 
Группа: Members
Зарегистрирован: 15-08-2021
Сообщений: 14
UA: Firefox 91.0

Re: Custom Buttons

Долго искал по форуму дополнение где качнуть, нашел, продублирую.

Дополнение cusstom_button 0.0.7.0.0.19+ инструкция по установке.

Работает на новой версии 91.0.2 (64-битный),

Отредактировано alur (26-08-2021 18:28:40)

Отсутствует

 

№1585626-08-2021 16:26:41

kokoss
Участник
 
Группа: Members
Зарегистрирован: 15-02-2018
Сообщений: 1728
UA: Firefox 52.0

Re: Custom Buttons

alur
Не совсем верная инструкция: config.js лучше использовать этот и CB есть более свежая версия 0.0.7.0.0.18

Отредактировано kokoss (26-08-2021 16:32:14)


Win7

Отсутствует

 

№1585726-08-2021 16:37:49

alur
Участник
 
Группа: Members
Зарегистрирован: 15-08-2021
Сообщений: 14
UA: Firefox 91.0

Re: Custom Buttons

kokoss

Сейчас и у себя поправлю и ссылку перезалью.

P.S поправил, теперь все свежее :)

Отредактировано alur (26-08-2021 16:46:20)

Отсутствует

 

№1585826-08-2021 17:54:14

unter_officer
Участник
 
Группа: Members
Откуда: Санкт-Петербург
Зарегистрирован: 27-03-2011
Сообщений: 537
UA: Firefox 52.0

Re: Custom Buttons

kokoss пишет

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»

Отсутствует

 

№1585926-08-2021 18:00:09

kokoss
Участник
 
Группа: Members
Зарегистрирован: 15-02-2018
Сообщений: 1728
UA: Firefox 52.0

Re: Custom Buttons

unter_officer
Спасибо за инфу :beer:


Win7

Отсутствует

 

№1586026-08-2021 18:29:53

alur
Участник
 
Группа: Members
Зарегистрирован: 15-08-2021
Сообщений: 14
UA: Firefox 91.0

Re: Custom Buttons

unter_officer
Поправил думаю теперь точно самая свежая :)

Отсутствует

 

№1586128-08-2021 13:44:32

dezhnev
Участник
 
Группа: Members
Зарегистрирован: 21-04-2016
Сообщений: 72
UA: Firefox 78.0

Re: Custom Buttons

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"];

Отсутствует

 

№1586228-08-2021 15:03:41

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2129
UA: Firefox 78.0

Re: Custom Buttons

dezhnev

скрытый текст

Выделить код

Код:

.......
	//var url = this.parentNode.dataset.currentUri;
	var url = this.closest("tab-item").dataset.currentUri;

Отсутствует

 

№1586328-08-2021 18:00:28

Stkvsky
Участник
 
Группа: Members
Зарегистрирован: 26-06-2012
Сообщений: 1700
UA: Firefox 78.0

Re: Custom Buttons

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)

Отсутствует

 

№1586428-08-2021 20:41:03

dezhnev
Участник
 
Группа: Members
Зарегистрирован: 21-04-2016
Сообщений: 72
UA: Firefox 78.0

Re: Custom Buttons

Dumby пишет

dezhnev

скрытый текст

Выделить код

Код:

.......
	//var url = this.parentNode.dataset.currentUri;
	var url = this.closest("tab-item").dataset.currentUri;

Cпасибо!
А можно еще куда-нибудь поставить, наподобие .replace(/^www\./, "")  , чтобы для доменов убирать -  www|forum|mail ?

Отсутствует

 

№1586528-08-2021 21:23:24

ВВП
Участник
 
Группа: Members
Зарегистрирован: 13-03-2021
Сообщений: 332
UA: Firefox 91.0

Re: Custom Buttons

Dumby
Вопрос . эта фишка TmpDataPath= ...В портаблах не всегда работает?  С tmemutil.dll , к примеру, вроде никак. Dll - последняя.

Отсутствует

 

№1586629-08-2021 21:29:02

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2129
UA: Firefox 78.0

Re: Custom Buttons

Stkvsky пишет

при открытии закладки в контейнере, если контейнер с таким именем уже существует, то открывать в нем же, а не создавать новый

скрытый текст

Выделить код

Код:

/*
						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;
		}

dezhnev пишет

куда-нибудь поставить, наподобие .replace(/^www\./, "")

Да там же, неподалёку. Тут hostname и реплейсить: `${hostname} | ${val}`


ВВП пишет

фишка TmpDataPath= ...В портаблах не всегда работает?

У меня всегда работает. Но это ничего не значит,
поскольку моё использование разнообразием не блещет.
portable32.dll, не последняя, TmpDataPath совпадает с PortableDataPath,
то есть папка LocalAppData в профиле.

Отредактировано Dumby (29-08-2021 21:29:48)

Отсутствует

 

№1586730-08-2021 08:23:14

Stkvsky
Участник
 
Группа: Members
Зарегистрирован: 26-06-2012
Сообщений: 1700
UA: Firefox 78.0

Re: Custom Buttons

Dumby
Класс, спасибо большое

Отсутствует

 

№1586830-08-2021 13:44:04

ВВП
Участник
 
Группа: Members
Зарегистрирован: 13-03-2021
Сообщений: 332
UA: Firefox 91.0

Re: Custom Buttons

_zt

_zt пишет

Эпатаж!? Это просто риторический вопрос.

. С tmemutil.dll -  PortableDataPath= не катит.


амечание п. 3.3
Sergeys

Отредактировано ВВП (30-08-2021 18:20:51)

Отсутствует

 

№1586930-08-2021 21:44:36

_zt
Участник
 
Группа: Members
Зарегистрирован: 10-11-2014
Сообщений: 1417
UA: Firefox 78.0

Re: Custom Buttons

ВВП
:) Да не напрягайся. Зачем tmemutil?

Отсутствует

 

№1587001-09-2021 11:00:33

Senflex
Участник
 
Группа: Members
Зарегистрирован: 18-07-2021
Сообщений: 29
UA: Chrome 92.0

Re: Custom Buttons

Подскажите пожалуйста. Как программно узнать, закреплённая ли активная вкладка? Если закреплена true, иначе false.

Отредактировано Senflex (01-09-2021 11:05:42)

Отсутствует

 

№1587101-09-2021 13:24:46

unter_officer
Участник
 
Группа: Members
Откуда: Санкт-Петербург
Зарегистрирован: 27-03-2011
Сообщений: 537
UA: Firefox 52.0

Re: Custom Buttons

Senflex пишет

Подскажите пожалуйста. Как программно узнать, закреплённая ли активная вкладка? Если закреплена 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»

Отсутствует

 

№1587201-09-2021 22:48:05

Senflex
Участник
 
Группа: Members
Зарегистрирован: 18-07-2021
Сообщений: 29
UA: Chrome 92.0

Re: Custom Buttons

unter_officer пишет
Senflex пишет

Подскажите пожалуйста. Как программно узнать, закреплённая ли активная вкладка? Если закреплена true, иначе false.

Может как-то так :/

Выделить код

Код:

addEventListener("TabSelect", (e, tab = e.target)=> {
  if ( tab.pinned == true ) {
    alert('pinned');
  }
  else {
    alert('not pinned');
  }
}, true, gBrowser.tabContainer);

Благодарю!

Отсутствует

 

№1587302-09-2021 20:38:00

Senflex
Участник
 
Группа: Members
Зарегистрирован: 18-07-2021
Сообщений: 29
UA: Chrome 93.0

Re: Custom Buttons

unter_officer пишет
Senflex пишет

Подскажите пожалуйста. Как программно узнать, закреплённая ли активная вкладка? Если закреплена true, иначе false.

Может как-то так :/

Выделить код

Код:

addEventListener("TabSelect", (e, tab = e.target)=> {
  if ( tab.pinned == true ) {
    alert('pinned');
  }
  else {
    alert('not pinned');
  }
}, true, gBrowser.tabContainer);

Сегодня попробовал, что-то не работает, можно ли без addEventListener?

Отсутствует

 

№1587403-09-2021 21:02:32

ВВП
Участник
 
Группа: Members
Зарегистрирован: 13-03-2021
Сообщений: 332
UA: Firefox 91.0

Re: Custom Buttons

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)

Отсутствует

 

№1587504-09-2021 10:29:36

kaktusok
Участник
 
Группа: Members
Зарегистрирован: 22-02-2021
Сообщений: 2
UA: Firefox 91.0

Re: Custom Buttons

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)

Отсутствует

 

Board footer

Powered by PunBB
Modified by Mozilla Russia
Copyright © 2004–2020 Mozilla Russia GitHub mark
Язык отображения форума: [Русский] [English]