diff --git a/browser/components/places/content/places.js b/browser/components/places/content/places.js index 7b50a2368a81..d11fb91c4f8c 100755 --- a/browser/components/places/content/places.js +++ b/browser/components/places/content/places.js @@ -270,7 +270,7 @@ var PlacesOrganizer = { if (window.fromFile) this.importFromFile(); }, - + /** * Open a file-picker and import the selected file into the bookmarks store */ @@ -307,6 +307,141 @@ var PlacesOrganizer = { } }, + /** + * Populates the restore menu with the dates of the backups available. + */ + populateRestoreMenu: function PO_populateRestoreMenu() { + var restorePopup = document.getElementById("fileRestorePopup"); + + // remove existing menu items + // last item is the restoreFromFile item + while (restorePopup.childNodes.length > 1) + restorePopup.removeChild(restorePopup.firstChild); + + // get bookmarks backup dir + var dirSvc = Cc["@mozilla.org/file/directory_service;1"]. + getService(Ci.nsIProperties); + var bookmarksBackupDir = dirSvc.get("ProfD", Ci.nsIFile); + bookmarksBackupDir.append("bookmarkbackups"); + if (!bookmarksBackupDir.exists()) + return; // no backup files + + // get list of files + var fileList = []; + var files = bookmarksBackupDir.directoryEntries; + while (files.hasMoreElements()) { + var f = files.getNext().QueryInterface(Ci.nsIFile); + if (!f.isHidden() && f.leafName.match(/\.html?$/)) + fileList.push(f); + } + + fileList.sort(function PO_fileList_compare(a, b) { + return b.lastModifiedTime - a.lastModifiedTime; + }); + + if (fileList.length == 0) + return; + + // populate menu + for (var i = 0; i < fileList.length; i++) { + var m = restorePopup.insertBefore + (document.createElement("menuitem"), + document.getElementById("restoreFromFile")); + var dateStr = fileList[i].leafName.replace("bookmarks-", ""). + replace(".html", ""); + if (!dateStr.length) + dateStr = fileList[i].leafName; + m.setAttribute("label", dateStr); + m.setAttribute("value", fileList[i].leafName); + m.setAttribute("oncommand", + "PlacesOrganizer.onRestoreMenuItemClick(this);"); + } + restorePopup.insertBefore(document.createElement("menuseparator"), + document.getElementById("restoreFromFile")); + }, + + /** + * Called when a menuitem is selected from the restore menu. + */ + onRestoreMenuItemClick: function PO_onRestoreMenuItemClick(aMenuItem) { + var dirSvc = Cc["@mozilla.org/file/directory_service;1"]. + getService(Ci.nsIProperties); + var bookmarksFile = dirSvc.get("ProfD", Ci.nsIFile); + bookmarksFile.append("bookmarkbackups"); + bookmarksFile.append(aMenuItem.getAttribute("value")); + if (!bookmarksFile.exists()) + return; + + var prompts = Cc["@mozilla.org/embedcomp/prompt-service;1"]. + getService(Ci.nsIPromptService); + if (!prompts.confirm(null, + PlacesUtils.getString("bookmarksRestoreAlertTitle"), + PlacesUtils.getString("bookmarksRestoreAlert"))) + return; + + var ieSvc = Cc["@mozilla.org/browser/places/import-export-service;1"]. + getService(Ci.nsIPlacesImportExportService); + ieSvc.importHTMLFromFile(bookmarksFile, true); + }, + + /** + * Backup bookmarks to desktop, auto-generate a filename with a date + */ + backupBookmarks: function PO_backupBookmarks() { + var fp = Cc["@mozilla.org/filepicker;1"].createInstance(Ci.nsIFilePicker); + fp.init(window, PlacesUtils.getString("bookmarksBackupTitle"), + Ci.nsIFilePicker.modeSave); + fp.appendFilters(Ci.nsIFilePicker.filterHTML); + + var dirSvc = Cc["@mozilla.org/file/directory_service;1"]. + getService(Ci.nsIProperties); + var backupsDir = dirSvc.get("Desk", Ci.nsILocalFile); + fp.displayDirectory = backupsDir; + + var dateService = Cc["@mozilla.org/intl/scriptabledateformat;1"]. + getService(Ci.nsIScriptableDateFormat); + + var d = new Date(); + var date = dateService.FormatDate("", dateService.dateFormatShort, + d.getFullYear(), d.getMonth(), d.getDate()); + fp.defaultString = PlacesUtils.getFormattedString("bookmarksBackupFilename", + [date]); + + if (fp.show() != Ci.nsIFilePicker.returnCancel) { + var ieSvc = Cc["@mozilla.org/browser/places/import-export-service;1"]. + getService(Ci.nsIPlacesImportExportService); + ieSvc.exportHTMLToFile(fp.file); + } + }, + + /** + * Called when 'Choose File...' is selected from the Revert menupopup + * Prompts for a file and reverts bookmarks to those in the file + */ + restoreFromFile: function PO_restoreFromFile() { + var prompts = Cc["@mozilla.org/embedcomp/prompt-service;1"]. + getService(Ci.nsIPromptService); + if (!prompts.confirm(null, PlacesUtils.getString("bookmarksRestoreAlertTitle"), + PlacesUtils.getString("bookmarksRestoreAlert"))) + return; + + var fp = Cc["@mozilla.org/filepicker;1"].createInstance(Ci.nsIFilePicker); + fp.init(window, PlacesUtils.getString("bookmarksRestoreTitle"), + Ci.nsIFilePicker.modeOpen); + fp.appendFilters(Ci.nsIFilePicker.filterHTML); + + var dirSvc = Cc["@mozilla.org/file/directory_service;1"]. + getService(Ci.nsIProperties); + var backupsDir = dirSvc.get("Desk", Ci.nsILocalFile); + fp.displayDirectory = backupsDir; + + if (fp.show() != Ci.nsIFilePicker.returnCancel) { + var ieSvc = Cc["@mozilla.org/browser/places/import-export-service;1"]. + getService(Ci.nsIPlacesImportExportService); + ieSvc.importHTMLFromFile(fp.file, true); + } + }, + updateStatusBarForView: function PO_updateStatusBarForView(aView) { var statusText = ""; var selectedNode = aView.selectedNode; diff --git a/browser/components/places/content/places.xul b/browser/components/places/content/places.xul index ddbb7773500c..984ce2fc1bbe 100755 --- a/browser/components/places/content/places.xul +++ b/browser/components/places/content/places.xul @@ -86,6 +86,10 @@ oncommand="PlacesOrganizer.exportBookmarks();"/> + + + + + + + + + + + + + + +