原版如前文,縮小的感覺真好,如今再改得稍微親切一點: 1)不在 chrome url 的話會提示, 2)顯示 sqlite 檔案前後大小。

若不在 chrome url 內,會提示你問題。 指定次數。 現在會算出檔案大小了。 動手前,還是要問一下。 縮減比率,看了開心。

將 bookmarklet 加入書籤 → Places Cleaner


原始碼拆開如下:

  1. // 原創想法&程式碼來自 Irvin Chen 的 PlacesCleaner 收藏庫清潔工  
  2. // https://addons.mozilla.org/firefox/addon/13860/  (以 MPL 1.1 釋出)  
  3. // http://irvin.sto.tw/2009/08/firefox-3.html  
  4. // 請於 chrome url (例: chrome://browser/content/places/places.xul ) 中執行  
  5. var PlacesCleaner = {  
  6.   
  7. clean: function(){  
  8.   
  9.   // 測試是否有 XPConnect 權限  
  10.   if( ! netscape.security.PrivilegeManager.isPrivilegeEnabled('UniversalXPConnect') ) {  
  11.     alert('操作失敗:\n請於 chrome url 中執行這支 bookmarklet。\n例: chrome://browser/content/places/places.xul');  
  12.     return;  
  13.   }  
  14.   
  15.   var PIPlacesDatabase = Components.classes["@mozilla.org/browser/nav-history-service;1"].getService(Components.interfaces.nsPIPlacesDatabase).DBConnection;  
  16.   var ProfD = Components.classes["@mozilla.org/file/directory_service;1"].getService(Components.interfaces.nsIProperties).get("ProfD", Components.interfaces.nsIFile);  
  17.   var sqliteFile = ProfD.clone();  
  18.       sqliteFile.append("places.sqlite");  
  19.   var originalSize = sqliteFile.fileSize;  
  20.   
  21.   var intViewTime = parseInt(prompt('清除瀏覽次數不超過「幾次」的歷史紀錄?'),10);  
  22.   if(intViewTime+''=='NaN') { alert('輸入值非數字,已停止操作。'); return; }  
  23.   
  24.   if(confirm('目前 places.sqlite 檔案大小為 ' + Math.round(originalSize/10.24)/100 + ' KB。\n若要備份,請選擇儲存檔案的位置:')) {  
  25.     var fp = Components.classes["@mozilla.org/filepicker;1"].createInstance(Components.interfaces.nsIFilePicker);  
  26.     fp.init(window, null, fp.modeSave);  
  27.     fp.defaultString='places';  
  28.     fp.defaultExtension='sqlite';  
  29.     fp.appendFilter(".sqlite","*.sqlite");  
  30.     if (fp.show() != fp.returnCancel) {  
  31.       if (fp.file.exists()) fp.file.remove(true);  
  32.   
  33.       try {  
  34.         sqliteFile.copyTo( fp.file.parent, fp.file.leafName );  
  35.       }  
  36.       catch(e) {  
  37.         alert('操作失敗:無法儲存備份檔案。');  
  38.         return;  
  39.       }  
  40.     }  
  41.   }  
  42.   
  43.   if(!confirm('確定要開始清除了嗎?\n也許會花上一點時間……')) return;  
  44.   try {  
  45.     // 取自 https://addons.mozilla.org/firefox/addon/13860/  原始碼授權條款: MPL 1.1  
  46.     PIPlacesDatabase.executeSimpleSQL("DELETE FROM moz_historyvisits WHERE place_id IN (SELECT id FROM moz_places WHERE visit_count <=" + intViewTime + ");");  
  47.     PIPlacesDatabase.executeSimpleSQL("DELETE FROM moz_places WHERE (visit_count <=" + intViewTime + " AND hidden <> 1 AND id NOT IN (SELECT place_id FROM moz_annos UNION SELECT fk FROM moz_bookmarks));");  
  48.     PIPlacesDatabase.executeSimpleSQL("DELETE FROM moz_inputhistory WHERE place_id NOT IN (SELECT id FROM moz_places);");  
  49.     PIPlacesDatabase.executeSimpleSQL("DELETE FROM moz_favicons WHERE id NOT IN (SELECT favicon_id FROM moz_places);");  
  50.     PIPlacesDatabase.executeSimpleSQL("DELETE FROM moz_annos WHERE anno_attribute_id IN (SELECT id FROM moz_anno_attributes WHERE name = 'google-toolbar/thumbnail-score' OR name = 'google-toolbar/thumbnail');");  
  51.     PIPlacesDatabase.executeSimpleSQL("VACUUM");  
  52.   }  
  53.   catch(e) {  
  54.     alert('操作失敗:清除中出了狀況……');  
  55.     alert('Places Cleaner bookmarklet 錯誤訊息:\n '+e);  
  56.     return;  
  57.   }  
  58.   
  59.   // 重新取得 fileSize  
  60.   sqliteFile = ProfD.clone();  
  61.   sqliteFile.append("places.sqlite");  
  62.   
  63.   var ratio = Math.round( (originalSize-sqliteFile.fileSize)*10000/originalSize )/100;  
  64.   alert('清除完畢。\n\n檔案大小:' + Math.round(originalSize/10.24)/100 + ' KB → ' + Math.round(sqliteFile.fileSize/10.24)/100 + ' KB(已縮減 ' + ratio  + ' %)');  
  65.   
  66. }  
  67.   
  68. };  
  69.   
  70. PlacesCleaner.clean();