anao123

countFavoritesInFolder.uc.js

Dec 8th, 2021 (edited)
323
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // ==UserScript==
  2. // @name           countFavoritesInFolder.uc.js
  3. // @namespace      countFavoritesInFolder@andrebernd.com
  4. // @description    Count Favorites in Bookmark Folder
  5. // @include        main
  6. // @include        chrome://browser/content/places/places.xhtml
  7. // @include        chrome://browser/content/places/bookmarksSidebar.xhtml
  8. // @include        chrome://browser/content/places/bookmarksSidebar.xul
  9. // @compatibility  Firefox 91
  10. // @author         bernd
  11. // @version        2021/12/03
  12. // ==/UserScript==
  13.  
  14. // 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
  15.  
  16. var countFavoritesInFolder = {
  17.     init: function () {
  18.         var placesContext = document.getElementById("placesContext");
  19.         if (!placesContext)
  20.             return;
  21.         var afterNode = placesContext.firstChild;
  22.  
  23.         // create context menu item
  24.         var menuitem = document.createXULElement("menuitem");
  25.         menuitem.id = "placesContext_countFavFolder";
  26.         menuitem.setAttribute("label", "Count Favorites In Folder");
  27.         //menuitem.setAttribute("accesskey", "k");
  28.         //menuitem.setAttribute("selectiontype", "single");
  29.         menuitem.setAttribute("nodetype", "folder"); // link|folder|separator|query ...  link_bookmark|livemark/feedURI
  30.         //menuitem.setAttribute("hideifnodetype", ""); // link_bookmark|link_bookmark_tag|query_host|query_day|query_tag
  31.         menuitem.setAttribute("selection", "folder"); // ?
  32.         menuitem.setAttribute("oncommand", "countFavoritesInFolder.countAlert(this.parentNode.triggerNode);");
  33.         placesContext.insertBefore(menuitem, afterNode);
  34.  
  35.         // create menu separator
  36.         var menuseparator = document.createXULElement("menuseparator");
  37.         menuseparator.id = "placesContext_countFavFolderSeparator";
  38.         placesContext.insertBefore(menuseparator, menuitem.nextSibling); // insertAfter
  39.  
  40.         // create Context Menu event listener
  41.         menuitem.parentNode.addEventListener("popupshowing", function () { // PlacesUIUtils.placesContextShowing
  42.             countFavoritesInFolder.countContextMenu(this);
  43.         });
  44.  
  45.         // create Context Menu Parent Folder Item
  46.         var menuitem2 = document.createXULElement("menuitem");
  47.         menuitem2.id = "placesContext_parentFolder";
  48.         menuitem2.setAttribute("label", "[parent folder]");
  49.         menuitem2.setAttribute("nodetype", "link|folder|separator|query|link_bookmark");
  50.         menuitem2.setAttribute("hideifnodetype", "link_bookmark_tag|query_host|query_day|query_tag"); // link_bookmark
  51.         menuitem2.setAttribute("oncommand", "countFavoritesInFolder.parentFolderAlert(this.parentNode.triggerNode);");
  52.         //menuitem2.setAttribute("selection", "folder"); // ?
  53.         placesContext.appendChild(menuitem2);
  54.  
  55.         // create Context Menu Parent Folder event listener
  56.         menuitem2.parentNode.addEventListener("popupshowing", function () { // PlacesUIUtils.placesContextShowing
  57.             countFavoritesInFolder.parentFolderContextMenu(this);
  58.         });
  59.     },
  60.  
  61.     parentFolderContextMenu: function (parentNode) {
  62.         let view = PlacesUIUtils.getViewForNode(parentNode.triggerNode);
  63.         if (!view)
  64.             return;
  65.         let node = view.selectedNode;
  66.  
  67.         /*let win = Services.wm.getMostRecentWindow("navigator:browser");
  68.         let sidebarWin = win.SidebarUI.browser.contentWindow;
  69.         */
  70.         var pathFolder = /*sidebarWin.*/countFavoritesInFolder.returnParentFolder(node);
  71.  
  72.         var menuitem2 = parentNode.querySelector("#placesContext_parentFolder");
  73.         if (!!menuitem2)
  74.             menuitem2.setAttribute("label", pathFolder);
  75.     },
  76.  
  77.     parentFolderAlert: function (atriggerNode) {
  78.         let view = PlacesUIUtils.getViewForNode(atriggerNode); //_BTree = document.getElementById("bookmarks-view");
  79.         if (!view)
  80.             return;
  81.         let node = view.selectedNode; //_BTree.selectedNode;
  82.  
  83.         let win = Services.wm.getMostRecentWindow("navigator:browser");
  84.         win.SidebarUI._show("viewBookmarksSidebar").then(() => {
  85.             let sidebarWin = win.SidebarUI.browser.contentWindow;
  86.             var pathFolder = sidebarWin.countFavoritesInFolder.returnParentFolder(node);
  87.             alert("Path: " + pathFolder);
  88.         });
  89.     },
  90.    
  91.     // Copied from showparentFolder.uc.js
  92.     returnParentFolder: function(node) {
  93.         if (PlacesUtils.nodeIsQuery(node.parent) && PlacesUtils.asQuery(node.parent).queryOptions.queryType == Ci.nsINavHistoryQueryOptions.QUERY_TYPE_HISTORY && node.uri)
  94.             return '';
  95.         try {
  96.             var FolderId, txt, text, text2,
  97.                 bmsvc = PlacesUtils.bookmarks,
  98.                 rowId = node.itemId,
  99.                 parentFolderId = bmsvc.getFolderIdForItem(rowId),
  100.                 folderTitle = bmsvc.getItemTitle(parentFolderId),
  101.                 //xpref = Components.classes['@mozilla.org/preferences-service;1'].getService(Components.interfaces.nsIPrefService),
  102.                 reverse = true, // xpref.getBoolPref('ucjs.showParentFolder.reverseFolderHierarchy', true),
  103.                 showFolderHierarchy = true; //xpref.getBoolPref('ucjs.showParentFolder.showFolderHierarchy', true);;
  104.             txt = (folderTitle + "____________").substr(0, 12);
  105.             text2 = this.getLocalizedTitle2(txt);
  106.             if (text2)
  107.                 folderTitle = text2;
  108.  
  109.             if (showFolderHierarchy) {
  110.                 while (1) {
  111.                     FolderId = bmsvc.getFolderIdForItem(parentFolderId);
  112.                     if (FolderId == parentFolderId)
  113.                         break;
  114.                     parentFolderId = FolderId;
  115.                     text = bmsvc.getItemTitle(parentFolderId);
  116.                     txt = (text + "____________").substr(0, 12);
  117.                     text2 = this.getLocalizedTitle2(txt);
  118.                     if (text2)
  119.                         text = text2;
  120.                     if (!text)
  121.                         break;
  122.                     folderTitle = !reverse ? text + ' /' + folderTitle : folderTitle + ' < ' + text;
  123.                 }
  124.                 folderTitle = folderTitle.replace(/^\s/, '');
  125.             }
  126.         } catch (ex) {
  127.             folderTitle = '';
  128.         }
  129.         return folderTitle;
  130.     },
  131.  
  132.     // Copied from showparentFolder.uc.js
  133.     getLocalizedTitle2: function (guid) {
  134.         switch (guid) {
  135.             case PlacesUtils.bookmarks.toolbarGuid:
  136.                 return PlacesUtils.getString("BookmarksToolbarFolderTitle");
  137.             case PlacesUtils.bookmarks.menuGuid:
  138.                 return PlacesUtils.getString("BookmarksMenuFolderTitle");
  139.             case PlacesUtils.bookmarks.unfiledGuid:
  140.                 return PlacesUtils.getString("OtherBookmarksFolderTitle");
  141.             case PlacesUtils.bookmarks.mobileGuid:
  142.                 return PlacesUtils.getString("MobileBookmarksFolderTitle");
  143.             default:
  144.                 return null;
  145.             }
  146.     },
  147.  
  148.     countContextMenu: function (parentNode) {
  149.         //console.log(parentNode.triggerNode);
  150.         let view = PlacesUIUtils.getViewForNode(parentNode.triggerNode);
  151.         if (!view)
  152.             return;
  153.         let node = view.selectedNode;
  154.  
  155.         /*let win = Services.wm.getMostRecentWindow("navigator:browser");
  156.         let sidebarWin = win.SidebarUI.browser.contentWindow;
  157.         sidebarWin.*/countFavoritesInFolder.returnCountNode(node).then(function (result) {
  158.             var fav = String(result[0]);
  159.             var menuitem = parentNode.querySelector("#placesContext_countFavFolder");
  160.             if (!!menuitem)
  161.                 menuitem.setAttribute("label", fav + " favorites in folder");
  162.             //browser.menus.refresh();
  163.         });
  164.     },
  165.  
  166.     countAlert: function (atriggerNode) {
  167.         let view = PlacesUIUtils.getViewForNode(atriggerNode); //_BTree = document.getElementById("bookmarks-view");
  168.         if (!view)
  169.             return;
  170.         let node = view.selectedNode; //_BTree.selectedNode;
  171.  
  172.         /*let aView = _BTree.view;
  173.         for (var i = aView.rowCount-1; i>=0; i--) {
  174.         if (aView.isContainer(i) && aView.isContainerOpen(i))
  175.         aView.toggleOpenState(i);
  176.         }*/
  177.         //PlacesUtils.bookmarks.getFolderIdForItem(node.itemId); // get Id of Parent Folder
  178.  
  179.         let win = Services.wm.getMostRecentWindow("navigator:browser");
  180.         win.SidebarUI._show("viewBookmarksSidebar").then(() => {
  181.             let sidebarWin = win.SidebarUI.browser.contentWindow;
  182.             sidebarWin.countFavoritesInFolder.returnCountNode(node).then(function (result) {
  183.                 alert("Favorites: " + result[0] + " ; Folders: " + result[2] + " ; Separators: " + result[1]);
  184.             });
  185.         });
  186.     },
  187.  
  188.     returnCountNode: function (node) {
  189.         let guid = node.bookmarkGuid;
  190.  
  191.         var countBookmarksOnFolder = function (folderG) {
  192.             return new Promise(function (resolve, reject) {
  193.                 var folders = 0;
  194.                 var favorites = 0;
  195.                 var separators = 0;
  196.                 var folderGuids = [];
  197.                 var newPromises = [];
  198.                 //console.log(" " + folderG);
  199.  
  200.                 PlacesUtils.bookmarks.fetch({ // TODO: use fetchTree (not yet implemented by Mozilla, see https://bugzilla.mozilla.org/show_bug.cgi?id=1671353)
  201.                     parentGuid: folderG
  202.                 }, function (ele) {
  203.                     ////console.log(ele)
  204.                     if (ele.type == 1)
  205.                         favorites++;
  206.                     else if (ele.type == 3)
  207.                         separators++;
  208.                     else if (ele.type == 2) {
  209.                         folders++;
  210.                         folderGuids.push(ele.guid);
  211.                     }
  212.                 }).then(function (valor) {
  213.                     //console.log(valor)
  214.                     //console.log("Total results:")
  215.                     //console.log(folders+favorites+separators)
  216.                     if (folders > 0) {
  217.                         //console.log("folders>0");
  218.                         ////console.log(folderGuids)
  219.                         for (var f of folderGuids) {
  220.                             newPromises.push(countBookmarksOnFolder(f));
  221.                         }
  222.                         Promise.all(newPromises).then(function (ress) {
  223.                             for (var r of ress) {
  224.                                 favorites = favorites + r[0];
  225.                                 separators = separators + r[1];
  226.                                 folders = folders + r[2];
  227.                             }
  228.                             resolve([favorites, separators, folders]);
  229.                         })
  230.                     } else {
  231.                         resolve([favorites, separators, folders]);
  232.                     }
  233.                 });
  234.             });
  235.         };
  236.  
  237.         return new Promise(function (resolve, reject) {
  238.             countBookmarksOnFolder(guid).then(function (result) {
  239.                 //console.log(ress);
  240.                 resolve(result);
  241.                 return result;
  242.             });
  243.         });
  244.     }
  245.  
  246. }
  247.  
  248. countFavoritesInFolder.init();
  249.  
RAW Paste Data