Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // ==UserScript==
- // @name countFavoritesInFolder.uc.js
- // @namespace countFavoritesInFolder@andrebernd.com
- // @description Count Favorites in Bookmark Folder
- // @include main
- // @include chrome://browser/content/places/places.xhtml
- // @include chrome://browser/content/places/bookmarksSidebar.xhtml
- // @include chrome://browser/content/places/bookmarksSidebar.xul
- // @compatibility Firefox 91
- // @author bernd
- // @version 2021/12/03
- // ==/UserScript==
- // based on openSidebarContextMenu.uc.js and acBookMarkTreeFolder_Fx37.uc.js and showParentFolder.uc.js : http://space.geocities.yahoo.co.jp/gl/alice0775 and http://www.sephiroth-j.de/mozilla/ and https://github.com/alice0775/userChrome.js/blob/master/88/showParentFolder.uc.js
- var countFavoritesInFolder = {
- init: function () {
- var placesContext = document.getElementById("placesContext");
- if (!placesContext)
- return;
- var afterNode = placesContext.firstChild;
- // create context menu item
- var menuitem = document.createXULElement("menuitem");
- menuitem.id = "placesContext_countFavFolder";
- menuitem.setAttribute("label", "Count Favorites In Folder");
- //menuitem.setAttribute("accesskey", "k");
- //menuitem.setAttribute("selectiontype", "single");
- menuitem.setAttribute("nodetype", "folder"); // link|folder|separator|query ... link_bookmark|livemark/feedURI
- //menuitem.setAttribute("hideifnodetype", ""); // link_bookmark|link_bookmark_tag|query_host|query_day|query_tag
- menuitem.setAttribute("selection", "folder"); // ?
- menuitem.setAttribute("oncommand", "countFavoritesInFolder.countAlert(this.parentNode.triggerNode);");
- placesContext.insertBefore(menuitem, afterNode);
- // create menu separator
- var menuseparator = document.createXULElement("menuseparator");
- menuseparator.id = "placesContext_countFavFolderSeparator";
- placesContext.insertBefore(menuseparator, menuitem.nextSibling); // insertAfter
- // create Context Menu event listener
- menuitem.parentNode.addEventListener("popupshowing", function () { // PlacesUIUtils.placesContextShowing
- countFavoritesInFolder.countContextMenu(this);
- });
- // create Context Menu Parent Folder Item
- var menuitem2 = document.createXULElement("menuitem");
- menuitem2.id = "placesContext_parentFolder";
- menuitem2.setAttribute("label", "[parent folder]");
- menuitem2.setAttribute("nodetype", "link|folder|separator|query|link_bookmark");
- menuitem2.setAttribute("hideifnodetype", "link_bookmark_tag|query_host|query_day|query_tag"); // link_bookmark
- menuitem2.setAttribute("oncommand", "countFavoritesInFolder.parentFolderAlert(this.parentNode.triggerNode);");
- //menuitem2.setAttribute("selection", "folder"); // ?
- placesContext.appendChild(menuitem2);
- // create Context Menu Parent Folder event listener
- menuitem2.parentNode.addEventListener("popupshowing", function () { // PlacesUIUtils.placesContextShowing
- countFavoritesInFolder.parentFolderContextMenu(this);
- });
- },
- parentFolderContextMenu: function (parentNode) {
- let view = PlacesUIUtils.getViewForNode(parentNode.triggerNode);
- if (!view)
- return;
- let node = view.selectedNode;
- /*let win = Services.wm.getMostRecentWindow("navigator:browser");
- let sidebarWin = win.SidebarUI.browser.contentWindow;
- */
- var pathFolder = /*sidebarWin.*/countFavoritesInFolder.returnParentFolder(node);
- var menuitem2 = parentNode.querySelector("#placesContext_parentFolder");
- if (!!menuitem2)
- menuitem2.setAttribute("label", pathFolder);
- },
- parentFolderAlert: function (atriggerNode) {
- let view = PlacesUIUtils.getViewForNode(atriggerNode); //_BTree = document.getElementById("bookmarks-view");
- if (!view)
- return;
- let node = view.selectedNode; //_BTree.selectedNode;
- let win = Services.wm.getMostRecentWindow("navigator:browser");
- win.SidebarUI._show("viewBookmarksSidebar").then(() => {
- let sidebarWin = win.SidebarUI.browser.contentWindow;
- var pathFolder = sidebarWin.countFavoritesInFolder.returnParentFolder(node);
- alert("Path: " + pathFolder);
- });
- },
- // Copied from showparentFolder.uc.js
- returnParentFolder: function(node) {
- if (PlacesUtils.nodeIsQuery(node.parent) && PlacesUtils.asQuery(node.parent).queryOptions.queryType == Ci.nsINavHistoryQueryOptions.QUERY_TYPE_HISTORY && node.uri)
- return '';
- try {
- var FolderId, txt, text, text2,
- bmsvc = PlacesUtils.bookmarks,
- rowId = node.itemId,
- parentFolderId = bmsvc.getFolderIdForItem(rowId),
- folderTitle = bmsvc.getItemTitle(parentFolderId),
- //xpref = Components.classes['@mozilla.org/preferences-service;1'].getService(Components.interfaces.nsIPrefService),
- reverse = true, // xpref.getBoolPref('ucjs.showParentFolder.reverseFolderHierarchy', true),
- showFolderHierarchy = true; //xpref.getBoolPref('ucjs.showParentFolder.showFolderHierarchy', true);;
- txt = (folderTitle + "____________").substr(0, 12);
- text2 = this.getLocalizedTitle2(txt);
- if (text2)
- folderTitle = text2;
- if (showFolderHierarchy) {
- while (1) {
- FolderId = bmsvc.getFolderIdForItem(parentFolderId);
- if (FolderId == parentFolderId)
- break;
- parentFolderId = FolderId;
- text = bmsvc.getItemTitle(parentFolderId);
- txt = (text + "____________").substr(0, 12);
- text2 = this.getLocalizedTitle2(txt);
- if (text2)
- text = text2;
- if (!text)
- break;
- folderTitle = !reverse ? text + ' /' + folderTitle : folderTitle + ' < ' + text;
- }
- folderTitle = folderTitle.replace(/^\s/, '');
- }
- } catch (ex) {
- folderTitle = '';
- }
- return folderTitle;
- },
- // Copied from showparentFolder.uc.js
- getLocalizedTitle2: function (guid) {
- switch (guid) {
- case PlacesUtils.bookmarks.toolbarGuid:
- return PlacesUtils.getString("BookmarksToolbarFolderTitle");
- case PlacesUtils.bookmarks.menuGuid:
- return PlacesUtils.getString("BookmarksMenuFolderTitle");
- case PlacesUtils.bookmarks.unfiledGuid:
- return PlacesUtils.getString("OtherBookmarksFolderTitle");
- case PlacesUtils.bookmarks.mobileGuid:
- return PlacesUtils.getString("MobileBookmarksFolderTitle");
- default:
- return null;
- }
- },
- countContextMenu: function (parentNode) {
- //console.log(parentNode.triggerNode);
- let view = PlacesUIUtils.getViewForNode(parentNode.triggerNode);
- if (!view)
- return;
- let node = view.selectedNode;
- /*let win = Services.wm.getMostRecentWindow("navigator:browser");
- let sidebarWin = win.SidebarUI.browser.contentWindow;
- sidebarWin.*/countFavoritesInFolder.returnCountNode(node).then(function (result) {
- var fav = String(result[0]);
- var menuitem = parentNode.querySelector("#placesContext_countFavFolder");
- if (!!menuitem)
- menuitem.setAttribute("label", fav + " favorites in folder");
- //browser.menus.refresh();
- });
- },
- countAlert: function (atriggerNode) {
- let view = PlacesUIUtils.getViewForNode(atriggerNode); //_BTree = document.getElementById("bookmarks-view");
- if (!view)
- return;
- let node = view.selectedNode; //_BTree.selectedNode;
- /*let aView = _BTree.view;
- for (var i = aView.rowCount-1; i>=0; i--) {
- if (aView.isContainer(i) && aView.isContainerOpen(i))
- aView.toggleOpenState(i);
- }*/
- //PlacesUtils.bookmarks.getFolderIdForItem(node.itemId); // get Id of Parent Folder
- let win = Services.wm.getMostRecentWindow("navigator:browser");
- win.SidebarUI._show("viewBookmarksSidebar").then(() => {
- let sidebarWin = win.SidebarUI.browser.contentWindow;
- sidebarWin.countFavoritesInFolder.returnCountNode(node).then(function (result) {
- alert("Favorites: " + result[0] + " ; Folders: " + result[2] + " ; Separators: " + result[1]);
- });
- });
- },
- returnCountNode: function (node) {
- let guid = node.bookmarkGuid;
- var countBookmarksOnFolder = function (folderG) {
- return new Promise(function (resolve, reject) {
- var folders = 0;
- var favorites = 0;
- var separators = 0;
- var folderGuids = [];
- var newPromises = [];
- //console.log(" " + folderG);
- PlacesUtils.bookmarks.fetch({ // TODO: use fetchTree (not yet implemented by Mozilla, see https://bugzilla.mozilla.org/show_bug.cgi?id=1671353)
- parentGuid: folderG
- }, function (ele) {
- ////console.log(ele)
- if (ele.type == 1)
- favorites++;
- else if (ele.type == 3)
- separators++;
- else if (ele.type == 2) {
- folders++;
- folderGuids.push(ele.guid);
- }
- }).then(function (valor) {
- //console.log(valor)
- //console.log("Total results:")
- //console.log(folders+favorites+separators)
- if (folders > 0) {
- //console.log("folders>0");
- ////console.log(folderGuids)
- for (var f of folderGuids) {
- newPromises.push(countBookmarksOnFolder(f));
- }
- Promise.all(newPromises).then(function (ress) {
- for (var r of ress) {
- favorites = favorites + r[0];
- separators = separators + r[1];
- folders = folders + r[2];
- }
- resolve([favorites, separators, folders]);
- })
- } else {
- resolve([favorites, separators, folders]);
- }
- });
- });
- };
- return new Promise(function (resolve, reject) {
- countBookmarksOnFolder(guid).then(function (result) {
- //console.log(ress);
- resolve(result);
- return result;
- });
- });
- }
- }
- countFavoritesInFolder.init();
Add Comment
Please, Sign In to add comment