2009-10-14: 稍作修改,新版比較親切好用,請參考 PlacesCleaner bookmarklet (更新)

原創想法&程式碼取自 Irvin Chen 的貢獻,詳見:

這支 bookmarklet 會跑原文所述的幾行 SQL,可指定刪除瀏覽次數(不超過)多少的紀錄,且刪除前可備份 places.sqlite。
※請於 Chrome URL 中執行(例: chrome://browser/content/places/places.xul )否則沒效。

將 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.   var PIPlacesDatabase = Components.classes["@mozilla.org/browser/nav-history-service;1"].getService(Components.interfaces.nsPIPlacesDatabase).DBConnection;  
  10.   var fp = Components.classes["@mozilla.org/filepicker;1"].createInstance(Components.interfaces.nsIFilePicker);  
  11.     
  12.   var intViewTime = parseInt(prompt('清除瀏覽次數不超過「幾次」的歷史紀錄?'),10);  
  13.   if(intViewTime+''=='NaN') { alert('輸入值非數字,已停止操作。'); return; }  
  14.   
  15.   if(confirm('若要備份 places.sqlite,請選擇儲存檔案的位置:')) {  
  16.     fp.init(window, null, fp.modeSave);  
  17.     fp.defaultString='places';  
  18.     fp.defaultExtension='sqlite';  
  19.     fp.appendFilter(".sqlite","*.sqlite");  
  20.     if (fp.show() != fp.returnCancel) {  
  21.       if (fp.file.exists()) fp.file.remove(true);  
  22.       var oldFile = Components.classes["@mozilla.org/file/directory_service;1"].getService(Components.interfaces.nsIProperties).get("ProfD", Components.interfaces.nsIFile);  
  23.       oldFile = oldFile.clone();  
  24.       oldFile.append("places.sqlite");  
  25.       try {  
  26.         oldFile.copyTo( fp.file.parent, fp.file.leafName );  
  27.       }  
  28.       catch(e) {  
  29.         alert('操作失敗:無法儲存備份檔案。');  
  30.         return;  
  31.       }  
  32.     }  
  33.   }  
  34.     
  35.   if(!confirm('確定要開始清除了嗎?\n也許會花上一點時間……')) return;  
  36.   try {  
  37.     // 取自 https://addons.mozilla.org/firefox/addon/13860/  原始碼授權條款: MPL 1.1  
  38.     PIPlacesDatabase.executeSimpleSQL("DELETE FROM moz_historyvisits WHERE place_id IN (SELECT id FROM moz_places WHERE visit_count <=" + intViewTime + ");");  
  39.     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));");  
  40.     PIPlacesDatabase.executeSimpleSQL("DELETE FROM moz_inputhistory WHERE place_id NOT IN (SELECT id FROM moz_places);");  
  41.     PIPlacesDatabase.executeSimpleSQL("DELETE FROM moz_favicons WHERE id NOT IN (SELECT favicon_id FROM moz_places);");  
  42.     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');");  
  43.     PIPlacesDatabase.executeSimpleSQL("VACUUM");  
  44.   }  
  45.   catch(e) {  
  46.     alert('操作失敗:清除中出了狀況……');  
  47.     alert('Places Cleaner bookmarklet 錯誤訊息:\n '+e);  
  48.     return;  
  49.   }  
  50.   alert('清除完畢。');  
  51.   
  52. }  
  53.   
  54. };  
  55.   
  56. PlacesCleaner.clean();