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

Многие проблемы быстрее решаются поиском по форуму и чтением FAQ, чем созданием новой темы и томительным ожиданием ответа.

№2616-04-2020 21:29:48

Infocatcher
Not found
 
Группа: Extensions
Зарегистрирован: 24-05-2007
Сообщений: 4339
UA: Firefox 56.0

Re: [CB]Bookmarks Folder

Bookmarks Folder 0.2b1 (2020-04-16)
Вместо утонувшего диалога выбора папки теперь надо кликать по закладочному меню в окне браузера (средней кнопкой или левой с любым модификатором). Если вместо выбора долго никуда не кликать (или кликнуть по самой кнопке) – выберется корневая папка.
Перетаскивание будто бы ожило (как минимум в Firefox 74-75), но не работает в сверхновых версиях.


Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела

Отсутствует

 

№2716-04-2020 23:09:10

voqabuhe
Участник
 
Группа: Members
Зарегистрирован: 06-12-2011
Сообщений: 3231
UA: Firefox 75.0

Re: [CB]Bookmarks Folder

Infocatcher
Спасибо, вроде всё работает замечательно.

Перетаскивание будто бы ожило (как минимум в Firefox 74-75), но не работает в сверхновых версиях.

Т.е. на 76 [firefox] уже сломается перетаскивание?

Отредактировано voqabuhe (16-04-2020 23:09:32)

Отсутствует

 

№2816-04-2020 23:20:40

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

Re: [CB]Bookmarks Folder

Infocatcher пишет

утонувшего диалога выбора папки

Он не совсем прям безнадёжен, скорее есть провал в каком-то диапазоне версий.
Я когда-то брал его себе из этой кнопки, теперь вот недавно захотелось
попробовать прикрутить обратно (в разумных пределах — Firefox 68+).
̣
Практического смысла в этом наверно нет, selectFolderNoUI() весьма симпатичен.
В смысле, если работает, то просто посмотреть на окошко диалога, каким оно могло бы было быть.

Выделить код

Код:

selectFolder: function() {
		//if(parseFloat(Services.appinfo.platformVersion) >= 59)
		//	return this.selectFolderNoUI();
		var pv = parseFloat(Services.appinfo.platformVersion);
		if(pv >= 59)
			return pv >= 68
				? this.selectFolder68(pv)
				: this.selectFolderNoUI();
		...
	},
	selectFolder68: function(pv) {
		var winType = this.button.id + ":dialog";
		var rootFolder = "place:type=" + Ci.nsINavHistoryQueryOptions.RESULTS_AS_ROOTS_QUERY;

		var persist = options.dialogPersist;
		if(persist)
			persist = '\n\
				persist="' + persist + '"';
		var winSrc =
			'<?xml version="1.0"?>\n\
			<?xml-stylesheet href="chrome://global/skin/global.css" type="text/css"?>\n\
			<?xml-stylesheet href="chrome://browser/content/places/places.css"?>\n\
			<?xml-stylesheet href="chrome://browser/skin/places/places.css"?>\n\
			<?xml-stylesheet href="chrome://browser/skin/places/tree-icons.css"?>\n\
			<dialog xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"\n\
				id="' + this.button.id + '-dialog"\n\
				windowtype="' + winType + '"\n\
				title="' + _localize("Select folder") + '"\n\
				buttons="accept,cancel"\n\
				onload="init();"\n\
				ondialogaccept="return dialogCallback();"\n\
				width="' + options.dialogWidth + '"\n\
				height="' + options.dialogHeight + '"' + persist + '>\n\
\n\
				<script type="application/javascript" src="chrome://global/content/globalOverlay.js"/>\n\
				<script type="application/javascript" src="chrome://browser/content/utilityOverlay.js"/>\n\
				<script type="application/javascript"><![CDATA[\n\
					ChromeUtils.defineModuleGetter(window, "PlacesUtils", "resource://gre/modules/PlacesUtils.jsm");\n\
					ChromeUtils.defineModuleGetter(window, "PlacesUIUtils", "resource:///modules/PlacesUIUtils.jsm");\n\
					ChromeUtils.defineModuleGetter(window, "PlacesTransactions", "resource://gre/modules/PlacesTransactions.jsm");\n\
					var {XPCOMUtils} = ChromeUtils.import("resource://gre/modules/XPCOMUtils.jsm");\n\
					XPCOMUtils.defineLazyScriptGetter(window, "PlacesTreeView", "chrome://browser/content/places/treeView.js");\n\
					XPCOMUtils.defineLazyScriptGetter(\n\
						window,\n\
						["PlacesInsertionPoint", "PlacesController", "PlacesControllerDragHelper"],\n\
						"chrome://browser/content/places/controller.js"\n\
					);\n\
				]]></script>\n\
				<script type="application/javascript" src="chrome://browser/content/places/places-tree.js"/>\n\
\n\
				<tree id="tree" type="places" is="places-tree"\n\
					place="' + rootFolder + '&amp;excludeItems=1"\n\
					hidecolumnpicker="true" seltype="single" flex="1"\n\
					onselect="onSelect();">\n\
					<treecols>\n\
						<treecol id="title" flex="1" primary="true" hideheader="true"/>\n\
					</treecols>\n\
					<treechildren/>\n\
				</tree>\n\
				<checkbox id="root" label="' + _localize("Root folder") + '" oncommand="onSelect();"/>\n\
				<script type="application/javascript"><![CDATA[\n\
					var [folderId, rootFolder, callback, context] = window.arguments;\n\
					var tree = document.getElementById("tree");\n\
					var root = document.getElementById("root");\n\
					var [treechildren] = tree.getElementsByTagName("treechildren");\n\
					function init() {\n\
						if(folderId == rootFolder)\n\
							root.checked = true;\n\
						else if(folderId != undefined) {\n\
							tree.selectItems([folderId]);\n\
							var ind = tree.view.selection.currentIndex;\n\
							ind != -1 && setTimeout(() => {\n\
								var visibleRows = tree.getPageLength();\n\
								var first = tree.getFirstVisibleRow();\n\
								var newFirst = ind - .4*visibleRows + 1;\n\
								tree.scrollByLines(Math.round(newFirst - first));\n\
							}, 0);\n\
						}\n\
						var onKeydown = e => e.ctrlKey && e.key == "Enter" && !e.shiftKey\n\
							&& document.documentElement.acceptDialog(e.stopPropagation());\n\
						addEventListener("keydown", onKeydown, true);\n\
						addEventListener("dialogaccept", dialogCallback);\n\
						window.onunload = () => {\n\
							removeEventListener("keydown", onKeydown, true);\n\
							removeEventListener("dialogaccept", dialogCallback);\n\
						}\n\
						onSelect();\n\
					}\n\
					function onSelect(dis) {\n\
						if(!arguments.length)\n\
							dis = !root.checked && !tree.view.selection.getRangeCount();\n\
						document.documentElement.getButton("accept").disabled = dis;\n\
						disableTree(root.checked);\n\
					}\n\
					function disableTree(dis) {\n\
						if(dis)\n\
							treechildren.style.opacity = "0.6",\n\
							tree.setAttribute("disabled", "true");\n\
						else\n\
							treechildren.style.opacity = "",\n\
							tree.removeAttribute("disabled");\n\
					}\n\
					function dialogCallback() {\n\
						var result;\n\
						if(root.checked)\n\
							result = {\n\
								folder: rootFolder,\n\
								title: root.label\n\
							};\n\
						else {\n\
							var i = tree.view.selection.currentIndex;\n\
							if(i == -1)\n\
								return false;\n\
							var item = tree.view.nodeForTreeIndex(i);\n\
							if(item)\n\
								result = {\n\
									folder: item.uri,\n\
									title: PlacesUIUtils.getBestTitle(item)\n\
								};\n\
						}\n\
						callback(result);\n\
						return true;\n\
					}\n\
					Object.defineProperty(window, "moveToAlertPosition", {\n\
						configurable: true, set(val) {\n\
							delete window.moveToAlertPosition;\n\
							window.moveToAlertPosition = val;\n\
							onSelect(false);\n\
						}\n\
					});\n\
				]]></script>\n\
			</dialog>';

		var g = Cu.getGlobalForObject(Cu);
		var dialogURL = "chrome://custombuttons/content/" + this.button.id + "-folderpickerdialog.xul";

		var gReg = g[dialogURL];
		var shouldReg = !gReg;

		if(gReg && gReg.winSrc != winSrc) {
			shouldReg = true;
			gReg.helper.destruct();
			Services.obs.notifyObservers(null, "chrome-flush-caches", null);
		}
		if(shouldReg) {
			var type = "application/" + (pv >= 73 ? "xhtm" : "vnd.mozilla.xu") + "l+xml";
			var ams = Cc["@mozilla.org/addons/addon-manager-startup;1"].getService(Ci.amIAddonManagerStartup);
			var o = g[dialogURL] = g.Object.create(null);
			o.helper = ams.registerChrome(
				Services.io.newFileURI(Services.dirsvc.get("ProfD", Ci.nsIFile)),
				[["override", dialogURL, "data:" + type + "," + encodeURIComponent(o.winSrc = winSrc)]]
			);
		}
		delete this.selectFolder68;
		return (this.selectFolder = function() {
			var win = Services.wm.getMostRecentWindow(winType);
			if(win) {
				win.focus();
				return null;
			}
			var result;
			var callback = function(res) {
				result = res;
			}
			window.openDialog(
				dialogURL, "_blank", "chrome,all,resizable,centerscreen,modal",
				this.folder.replace(/^place:parent=/, ""), rootFolder, callback, this
			);
			var folder = result && result.folder;
			options.useFolderTitle && folder && this.setButtonTitle(result.title);
			return folder;
		}).call(this);
	},

Отсутствует

 

№2917-04-2020 21:29:38

Infocatcher
Not found
 
Группа: Extensions
Зарегистрирован: 24-05-2007
Сообщений: 4339
UA: Firefox 56.0

Re: [CB]Bookmarks Folder

voqabuhe пишет

Т.е. на 76 [firefox] уже сломается перетаскивание?

Или я не так смотрел... В обычных папках все же таскается, но теперь стало проще назначать папки типа недавно добавленных, вот внутри них, конечно, не работает перетаскивание.


Dumby
Ого! Занятный amIAddonManagerStartup.registerChrome().
Вот в Session Bookmarks точно надо будет подобное внедрить, когда руки дойдут.
Спасибо!


И еще печалит отсутствие документации для сверхновых браузерных внутренностей:
https://www.google.com/search?q=amIAddo … 8&oe=utf-8

Отредактировано Infocatcher (17-04-2020 21:30:10)


Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела

Отсутствует

 

Board footer

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