home *** CD-ROM | disk | FTP | other *** search
/ Chip 2011 March / Chip_2011.03_CD.iso / Tools / yabar.msi / filA832FDCDC392E4342F2960667EFF9E7F < prev    next >
Encoding:
Text File  |  2010-04-16  |  10.7 KB  |  355 lines

  1. var YaBookmarksUtils = {
  2.   get stringBundleSet() {
  3.     if (!this._strBS)
  4.       this._strBS = document.getElementById("yasearch-string-bundle-bookmarks");
  5.     return this._strBS;
  6.   },
  7.   
  8.   __IOService: null,
  9.   get _IOService() {
  10.     if (!this.__IOService)
  11.       this.__IOService = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService);
  12.     
  13.     return this.__IOService;
  14.   },
  15.   
  16.   __missedIconCache: null,
  17.   
  18.   _openCacheEntry: function(aKey, aAccess) {
  19.     try {
  20.       if (!this.__missedIconCache) {
  21.         const CACHE_SERVICE = Cc["@mozilla.org/network/cache-service;1"].getService(Ci.nsICacheService);
  22.         this.__missedIconCache = CACHE_SERVICE.createSession("YandexMissedFaviconCache", Ci.nsICache.STORE_ANYWHERE, true);
  23.         
  24.         if (!this.__missedIconCache)
  25.           return null;
  26.       }
  27.       
  28.       return this.__missedIconCache.openCacheEntry(aKey, aAccess, true);
  29.       
  30.     } catch(e) {}
  31.     
  32.     return null;
  33.   },
  34.   
  35.   __httpCacheSession: null,
  36.   get httpCacheSession() {
  37.     if (!this.__httpCacheSession) {
  38.       const CACHE_SERVICE = Cc["@mozilla.org/network/cache-service;1"].getService(Ci.nsICacheService);
  39.       this.__httpCacheSession = CACHE_SERVICE.createSession("HTTP", Ci.nsICache.STORE_ANYWHERE, true);
  40.       this.__httpCacheSession.doomEntriesIfExpired = false;
  41.     }
  42.     
  43.     return this.__httpCacheSession;
  44.   },
  45.   
  46.   checkExpirationTime: function(aKey) {
  47.     try {
  48.       var cacheEntryDescriptor = this.httpCacheSession.openCacheEntry(aKey, Ci.nsICacheEntryDescriptor, false);
  49.       var expired = false;
  50.       var expirationTime = cacheEntryDescriptor.lastModified + 2592000;
  51.       
  52.       if (cacheEntryDescriptor.expirationTime < expirationTime) {
  53.         cacheEntryDescriptor.setExpirationTime(expirationTime);
  54.         cacheEntryDescriptor.markValid();
  55.         expired = true;
  56.       }
  57.       
  58.       cacheEntryDescriptor.close();
  59.       
  60.       if (expired) {
  61.         try {
  62.           cacheEntryDescriptor = this.httpCacheSession.openCacheEntry(aKey, Ci.nsICache.ACCESS_READ, false);
  63.         } catch(ex) {}
  64.       }
  65.     } catch(e) { }
  66.   },
  67.   
  68.   addToMissedIconCache: function(aKey, aError) {
  69.     var entry = this._openCacheEntry(aKey, Ci.nsICache.ACCESS_READ_WRITE);
  70.     if (!entry)
  71.       return;
  72.     
  73.     if (entry.accessGranted == Ci.nsICache.ACCESS_WRITE) {
  74.       entry.setMetaDataElement("Icon", "Missed");
  75.       entry.setExpirationTime(parseInt((new Date().getTime())/1000) + (aError ? 86400 : 3600));
  76.     }
  77.     
  78.     entry.markValid();
  79.     entry.close();
  80.   },
  81.   
  82.   _isIconKnownMissing: function(aKey) {
  83.     let e = this._openCacheEntry(aKey, Ci.nsICache.ACCESS_READ);
  84.     if (e) {
  85.       e.close();
  86.       return true;
  87.     }
  88.     
  89.     return false;
  90.   },
  91.   
  92.   _makeURI: function(aURL) {
  93.     let uri = null;
  94.     
  95.     try {
  96.       uri = this._IOService.newURI(aURL, null, null);
  97.     } catch(e) {
  98.       return false;
  99.     }
  100.     
  101.     return uri;
  102.   },
  103.   
  104.   _getHttpURIForURL: function(aURL) {
  105.     let uri = this._makeURI(aURL);
  106.     return (uri && /^https?$/.test(uri.scheme)) ? uri : false;
  107.   },
  108.   
  109.   getFaviconURL: function(aURL) {
  110.     if (!aURL)
  111.       return false;
  112.     
  113.     let uri = this._getHttpURIForURL(aURL);
  114.     if (!uri)
  115.       return false;
  116.     
  117.     let url = uri.prePath + "/favicon.ico";
  118.     
  119.     return this._isIconKnownMissing(url) ? false : url;
  120.   },
  121.   
  122.   getFaviconURI: function(aURL) {
  123.     let url = this.getFaviconURL(aURL);
  124.     return url ? this._getHttpURIForURL(url) : false;
  125.   },
  126.   
  127.   setFaviconForURL: function(aURL, aItem) {
  128.     return false;
  129.   },
  130.   
  131.   onDragStart: function(aEvent, aXferData, aDragAction) {
  132.     var target = aEvent.target;
  133.     
  134.     if (!/bookmark\-item/.test(target.getAttribute("class")))
  135.       return false;
  136.     
  137.     switch (target.localName) {
  138.       case "menuitem":
  139.         let mozUrlData = target.getAttribute("statustext") + "\n" + target.getAttribute("label");
  140.         
  141.         if ("dataTransfer" in aEvent) {//fx35+ only
  142.           aEvent.dataTransfer.setData("text/x-moz-url", mozUrlData);
  143.           aEvent.dataTransfer.effectAllowed = "copyLink";
  144.         } else {//fx30
  145.           aXferData.data = new TransferData();
  146.           aXferData.data.addDataForFlavour("text/x-moz-url", mozUrlData);
  147.         }
  148.         
  149.         break;
  150.       
  151.       case "menu":
  152.         if (!("dataTransfer" in aEvent))//fx35+ only
  153.           return false;
  154.         
  155.         let folderId = target.getAttribute("yafolderid");
  156.         let bookmarkFolder = Ya.nsIYa.bookmarksRawXml.bookmarks..folder.(@id == folderId)[0];
  157.         if (!bookmarkFolder)
  158.           return false;
  159.         
  160.         function createLink(linkElement) {
  161.           return {
  162.             title: linkElement.@name.toString(),
  163.             type: "text/x-moz-place",
  164.             uri: linkElement.@url.toString()
  165.           }
  166.         }
  167.         
  168.         function createFolder(folderElement) {
  169.           let data = {
  170.             title: folderElement.@name.toString(),
  171.             type: "text/x-moz-place-container",
  172.             children: []
  173.           };
  174.           
  175.           for each (var folder in folderElement.folder)
  176.             data.children.push(createFolder(folder));
  177.           
  178.           for each (var link in folderElement.links.link)
  179.             data.children.push(createLink(link));
  180.           
  181.           return data;
  182.         }
  183.         
  184.         let dt = aEvent.dataTransfer;
  185.         dt.setData("text/x-moz-place-container", YaUtils.JSON.stringify(createFolder(bookmarkFolder)));
  186.         dt.effectAllowed = "copy";
  187.         break;
  188.       
  189.       default:
  190.         return false;
  191.     }
  192.     
  193.     return true;
  194.   },
  195.   
  196.   hidePopups: function() {
  197.     [document.getElementById("yasearch-bookmarks-menupopup"),
  198.      document.getElementById("yasearch-bar")._chevronPopup]
  199.     .forEach(function(popup) {
  200.       if (popup && popup.hidePopup)
  201.         popup.hidePopup();
  202.     });
  203.   },
  204.   
  205.   bookmarksPopupHidden: function(aEvent) {
  206.     delete this.popupTarget;
  207.   },
  208.   
  209.   bookmarksPopupShow: function(aPopup) {
  210.     this.popupTarget = /bookmark\-item/.test(document.popupNode.getAttribute("class")) ? document.popupNode : null;
  211.     
  212.     if (!this.popupTarget)
  213.       return false;
  214.     
  215.     let menuItems = aPopup.getElementsByTagName("menuitem"),
  216.         menuItemsLength = menuItems.length,
  217.         targetIsFolder = (this.popupTarget.localName == "menu");
  218.     
  219.     for (var i = 0; i < 3; i++)
  220.       menuItems[i].hidden = targetIsFolder;
  221.     
  222.     menuItems[3].hidden = !targetIsFolder;
  223.     
  224.     menuItems[menuItemsLength - 2].hidden = targetIsFolder;
  225.     menuItems[menuItemsLength - 1].hidden = !targetIsFolder;
  226.     
  227.     if (targetIsFolder) {
  228.       let lastChild = this.popupTarget.firstChild.lastChild;
  229.       menuItems[3].setAttribute("disabled", !(lastChild && lastChild.localName == "menuitem"));
  230.     }
  231.     
  232.     return true;
  233.   },
  234.   
  235.   getFolderId: function(aEvent) {
  236.     var target = aEvent ? aEvent.target : this.popupTarget;
  237.     target = target.localName == "menu" ? target : target.parentNode.parentNode;
  238.     return target.hasAttribute("yafolderid") ? target.getAttribute("yafolderid") : null;
  239.   },
  240.   
  241.   getItemID: function(aItem) {
  242.     return aItem.getAttribute("yafolderid") || aItem.getAttribute("yalinkid") || null;
  243.   },
  244.   
  245.   addBookmark: function() {
  246.     Ya.addBookmark(this.getFolderId());
  247.   },
  248.   
  249.   deleteBookmark: function() {
  250.     var target = this.popupTarget;
  251.     
  252.     this.hidePopups();
  253.     
  254.     var type = target.localName == "menu" ? "folder" : "link",
  255.         name = target.getAttribute("label") || "";
  256.     
  257.     var rv = Ya.nsIYa.promptService.confirm(window,
  258.                         this.stringBundleSet.getString("ConfirmDelete" + type + "Title"),
  259.                         this.stringBundleSet.getFormattedString("ConfirmDelete" + type + "Msg", [name]));
  260.     if (rv)
  261.       Ya.nsIYa.bookmarksDeleteItem({ type: type,
  262.                                      id: this.getItemID(target),
  263.                                      callback: this.deleteBookmarkCallback });
  264.   },
  265.   
  266.   deleteBookmarkCallback: function(aErrorType) {
  267.     if (!aErrorType)
  268.       return;
  269.     
  270.     let t1 = [YaBookmarksUtils.stringBundleSet.getString("Action_delete_InTitle")];
  271.     let t2 = [YaBookmarksUtils.stringBundleSet.getString("Action_delete_InMessage")];
  272.     
  273.     if (aErrorType == "input")
  274.       t2.unshift(t1);
  275.     
  276.     let errorType = "Error_" + aErrorType + "_";
  277.     
  278.     Ya.nsIYa.promptService.alert(window,
  279.         YaBookmarksUtils.stringBundleSet.getFormattedString(errorType + "Title", t1),
  280.         YaBookmarksUtils.stringBundleSet.getFormattedString(errorType + "Message", t2)
  281.     );
  282.   },
  283.   
  284.   get _bmsvc() {
  285.     delete this._bmsvc;
  286.     return this._bmsvc = Components.classes["@mozilla.org/browser/nav-bookmarks-service;1"]
  287.                                    .getService(Components.interfaces.nsINavBookmarksService);
  288.   },
  289.   
  290.   copyFolderToPersonalPanel: function(aBookmarkFolderId) {
  291.     let bookmarkFolder = Ya.nsIYa.bookmarksRawXml.bookmarks..folder.(@id == aBookmarkFolderId)[0];
  292.     if (!bookmarkFolder)
  293.       return null;
  294.     
  295.     return this._createFolder(this._bmsvc.toolbarFolder, bookmarkFolder);
  296.   },
  297.   
  298.   _createFolder: function(aPlacesFolderId, aBookmarkFolder) {
  299.     let bmsvc = this._bmsvc;
  300.     let newFolderId = bmsvc.createFolder(aPlacesFolderId, aBookmarkFolder.@name.toString(), bmsvc.DEFAULT_INDEX);
  301.     
  302.     for each (var folder in aBookmarkFolder.folder)
  303.       this._createFolder(newFolderId, folder);
  304.     
  305.     for each (var link in aBookmarkFolder.links.link)
  306.       this._createLink(newFolderId, link);
  307.     
  308.     return newFolderId;
  309.   },
  310.   
  311.   copyLinkToPersonalPanel: function(aBookmarkLinkId) {
  312.     let bookmarkLink = Ya.nsIYa.bookmarksRawXml.bookmarks..link.(@id == aBookmarkLinkId)[0];
  313.     if (!bookmarkLink)
  314.       return null;
  315.     
  316.     return this._createLink(this._bmsvc.toolbarFolder, bookmarkLink);
  317.   },
  318.   
  319.   _createLink: function(aPlacesFolderId, aBookmarkLink) {
  320.     //? let uri = this._makeURI(NormalizedURL(aBookmarkLink.@url.toString()));
  321.     let uri = this._makeURI(aBookmarkLink.@url.toString());
  322.     if (!uri)
  323.       return null;
  324.     
  325.     let name = aBookmarkLink.@name.toString();
  326.     let bmsvc = this._bmsvc;
  327.     
  328.     return bmsvc.insertBookmark(aPlacesFolderId, uri, bmsvc.DEFAULT_INDEX, name);
  329.   },
  330.   
  331.   copyBookmarkToPersonalPanel: function() {
  332.     var target = this.popupTarget;
  333.     
  334.     if (target.localName === "menu" && target.hasAttribute("yafolderid"))
  335.       return this.copyFolderToPersonalPanel(target.getAttribute("yafolderid"));
  336.     
  337.     if (target.localName === "menuitem" && target.hasAttribute("yalinkid"))
  338.       return this.copyLinkToPersonalPanel(target.getAttribute("yalinkid"));
  339.     
  340.     return null;
  341.   },
  342.   
  343.   editBookmark: function() {
  344.     Ya.addBookmark(this.getFolderId(), this.getItemID(this.popupTarget));
  345.   },
  346.   
  347.   openBookmark: function(aPlace) {
  348.     Ya.loadURI(this.popupTarget.getAttribute("statustext"), aPlace);
  349.   },
  350.   
  351.   openAllInTabs: function(aEvent) {
  352.     Ya.loadURIsInTabs(Ya.nsIYa.bookmarksGetLinksInFolder(this.getFolderId(aEvent)));
  353.     this.hidePopups();
  354.   }
  355. };