Bookmarks Folder 0.2b1 (2020-04-16)
Вместо утонувшего диалога выбора папки теперь надо кликать по закладочному меню в окне браузера (средней кнопкой или левой с любым модификатором). Если вместо выбора долго никуда не кликать (или кликнуть по самой кнопке) – выберется корневая папка.
Перетаскивание будто бы ожило (как минимум в Firefox 74-75), но не работает в сверхновых версиях.
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
Infocatcher
Спасибо, вроде всё работает замечательно.
Перетаскивание будто бы ожило (как минимум в Firefox 74-75), но не работает в сверхновых версиях.
Т.е. на 76 уже сломается перетаскивание?
Отредактировано voqabuhe (16-04-2020 23:09:32)
Отсутствует
утонувшего диалога выбора папки
Он не совсем прям безнадёжен, скорее есть провал в каком-то диапазоне версий.
Я когда-то брал его себе из этой кнопки, теперь вот недавно захотелось
попробовать прикрутить обратно (в разумных пределах — 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 + '&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); },
Отсутствует
Т.е. на 76 уже сломается перетаскивание?
Или я не так смотрел... В обычных папках все же таскается, но теперь стало проще назначать папки типа недавно добавленных, вот внутри них, конечно, не работает перетаскивание.
Dumby
Ого! Занятный amIAddonManagerStartup.registerChrome().
Вот в Session Bookmarks точно надо будет подобное внедрить, когда руки дойдут.
Спасибо!
И еще печалит отсутствие документации для сверхновых браузерных внутренностей:
https://www.google.com/search?q=amIAddo … 8&oe=utf-8
Отредактировано Infocatcher (17-04-2020 21:30:10)
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует