зеркало из https://github.com/mozilla/pjs.git
Bug 384370 - use JSON as the on disk, lossless format for our bookmark backup (r=mano)
This commit is contained in:
Родитель
cc8021c233
Коммит
0056d5f1e8
|
@ -322,9 +322,10 @@ pref("browser.tabs.selectOwnerOnClose", true);
|
|||
pref("browser.bookmarks.sort.direction", "descending");
|
||||
pref("browser.bookmarks.sort.resource", "rdf:http://home.netscape.com/NC-rdf#Name");
|
||||
|
||||
// By default, do not overwrite bookmarks.html in the profile directory
|
||||
// See bug #381216 for details
|
||||
pref("browser.bookmarks.overwrite", false);
|
||||
// By default, do not export HTML at shutdown.
|
||||
// If true, at shutdown the bookmarks in your menu and toolbar will
|
||||
// be exported as HTML to the bookmarks.html file.
|
||||
pref("browser.bookmarks.autoExportHTML", false);
|
||||
|
||||
// Scripts & Windows prefs
|
||||
pref("dom.disable_open_during_load", true);
|
||||
|
|
|
@ -343,7 +343,7 @@
|
|||
</menu>
|
||||
|
||||
<menu id="history-menu"
|
||||
oncommand="var url = event.target.getAttribute('statustext'); if (url) { PlacesUtils.markPageAsTyped(url); openUILink(url, event, false, true); }"
|
||||
oncommand="var url = event.target.getAttribute('statustext'); if (url) { PlacesUIUtils.markPageAsTyped(url); openUILink(url, event, false, true); }"
|
||||
onclick="checkForMiddleClick(this, event);"
|
||||
label="&historyMenu.label;"
|
||||
accesskey="&historyMenu.accesskey;">
|
||||
|
|
|
@ -105,7 +105,7 @@ var StarUI = {
|
|||
this._itemId = -1;
|
||||
this._uri = null;
|
||||
if (this._batching) {
|
||||
PlacesUtils.ptm.endBatch();
|
||||
PlacesUIUtils.ptm.endBatch();
|
||||
this._batching = false;
|
||||
}
|
||||
}
|
||||
|
@ -188,11 +188,11 @@ var StarUI = {
|
|||
// Otherwise, if no changes were done in the edit-item panel, the last
|
||||
// transaction on the undo stack may be the initial createItem transaction,
|
||||
// or worse, the batched editing of some other item.
|
||||
PlacesUtils.ptm.doTransaction({ doTransaction: function() { },
|
||||
undoTransaction: function() { },
|
||||
redoTransaction: function() { },
|
||||
isTransient: false,
|
||||
merge: function() { return false; } });
|
||||
PlacesUIUtils.ptm.doTransaction({ doTransaction: function() { },
|
||||
undoTransaction: function() { },
|
||||
redoTransaction: function() { },
|
||||
isTransient: false,
|
||||
merge: function() { return false; } });
|
||||
|
||||
if (this.panel.state == "closed") {
|
||||
// Consume dismiss clicks, see bug 400924
|
||||
|
@ -271,7 +271,7 @@ var StarUI = {
|
|||
|
||||
cancelButtonOnCommand: function SU_cancelButtonOnCommand() {
|
||||
this.endBatch();
|
||||
PlacesUtils.ptm.undoTransaction();
|
||||
PlacesUIUtils.ptm.undoTransaction();
|
||||
this.panel.hidePopup();
|
||||
},
|
||||
|
||||
|
@ -282,8 +282,8 @@ var StarUI = {
|
|||
// a "Bookmark Removed" notification along with an Undo button is
|
||||
// shown
|
||||
if (this._batching) {
|
||||
PlacesUtils.ptm.endBatch();
|
||||
PlacesUtils.ptm.beginBatch(); // allow undo from within the notification
|
||||
PlacesUIUtils.ptm.endBatch();
|
||||
PlacesUIUtils.ptm.beginBatch(); // allow undo from within the notification
|
||||
var bundle = this._element("bundle_browser");
|
||||
|
||||
// "Bookmark Removed" title (the description field is already empty in
|
||||
|
@ -308,8 +308,8 @@ var StarUI = {
|
|||
// the tags for the url
|
||||
var itemIds = PlacesUtils.getBookmarksForURI(this._uri);
|
||||
for (var i=0; i < itemIds.length; i++) {
|
||||
var txn = PlacesUtils.ptm.removeItem(itemIds[i]);
|
||||
PlacesUtils.ptm.doTransaction(txn);
|
||||
var txn = PlacesUIUtils.ptm.removeItem(itemIds[i]);
|
||||
PlacesUIUtils.ptm.doTransaction(txn);
|
||||
}
|
||||
|
||||
#ifdef ADVANCED_STARRING_UI
|
||||
|
@ -324,21 +324,21 @@ var StarUI = {
|
|||
// restore the bookmark by undoing the last transaction and go back
|
||||
// to the edit state
|
||||
this.endBatch();
|
||||
PlacesUtils.ptm.undoTransaction();
|
||||
PlacesUIUtils.ptm.undoTransaction();
|
||||
this._itemId = PlacesUtils.getMostRecentBookmarkForURI(this._uri);
|
||||
this.showEditBookmarkPopup();
|
||||
},
|
||||
|
||||
beginBatch: function SU_beginBatch() {
|
||||
if (!this._batching) {
|
||||
PlacesUtils.ptm.beginBatch();
|
||||
PlacesUIUtils.ptm.beginBatch();
|
||||
this._batching = true;
|
||||
}
|
||||
},
|
||||
|
||||
endBatch: function SU_endBatch() {
|
||||
if (this._batching) {
|
||||
PlacesUtils.ptm.endBatch();
|
||||
PlacesUIUtils.ptm.endBatch();
|
||||
this._batching = false;
|
||||
}
|
||||
}
|
||||
|
@ -372,7 +372,7 @@ var PlacesCommandHook = {
|
|||
var description;
|
||||
try {
|
||||
title = webNav.document.title || url.spec;
|
||||
description = PlacesUtils.getDescriptionFromDocument(webNav.document);
|
||||
description = PlacesUIUtils.getDescriptionFromDocument(webNav.document);
|
||||
}
|
||||
catch (e) { }
|
||||
|
||||
|
@ -386,9 +386,9 @@ var PlacesCommandHook = {
|
|||
var parent = aParent != undefined ?
|
||||
aParent : PlacesUtils.unfiledBookmarksFolderId;
|
||||
var descAnno = { name: DESCRIPTION_ANNO, value: description };
|
||||
var txn = PlacesUtils.ptm.createItem(uri, parent, -1,
|
||||
title, null, [descAnno]);
|
||||
PlacesUtils.ptm.doTransaction(txn);
|
||||
var txn = PlacesUIUtils.ptm.createItem(uri, parent, -1,
|
||||
title, null, [descAnno]);
|
||||
PlacesUIUtils.ptm.doTransaction(txn);
|
||||
itemId = PlacesUtils.getMostRecentBookmarkForURI(uri);
|
||||
}
|
||||
|
||||
|
@ -432,8 +432,8 @@ var PlacesCommandHook = {
|
|||
var itemId = PlacesUtils.getMostRecentBookmarkForURI(linkURI);
|
||||
if (itemId == -1) {
|
||||
StarUI.beginBatch();
|
||||
var txn = PlacesUtils.ptm.createItem(linkURI, aParent, -1, aTitle);
|
||||
PlacesUtils.ptm.doTransaction(txn);
|
||||
var txn = PlacesUIUtils.ptm.createItem(linkURI, aParent, -1, aTitle);
|
||||
PlacesUIUtils.ptm.doTransaction(txn);
|
||||
itemId = PlacesUtils.getMostRecentBookmarkForURI(linkURI);
|
||||
}
|
||||
|
||||
|
@ -474,7 +474,7 @@ var PlacesCommandHook = {
|
|||
*/
|
||||
bookmarkCurrentPages: function PCH_bookmarkCurrentPages() {
|
||||
var tabURIs = this._getUniqueTabInfo();
|
||||
PlacesUtils.showMinimalAddMultiBookmarkUI(tabURIs);
|
||||
PlacesUIUtils.showMinimalAddMultiBookmarkUI(tabURIs);
|
||||
},
|
||||
|
||||
|
||||
|
@ -500,12 +500,12 @@ var PlacesCommandHook = {
|
|||
if (arguments.length > 2)
|
||||
description = feedSubtitle;
|
||||
else
|
||||
description = PlacesUtils.getDescriptionFromDocument(doc);
|
||||
description = PlacesUIUtils.getDescriptionFromDocument(doc);
|
||||
|
||||
var toolbarIP =
|
||||
new InsertionPoint(PlacesUtils.bookmarks.toolbarFolder, -1);
|
||||
PlacesUtils.showMinimalAddLivemarkUI(feedURI, gBrowser.currentURI,
|
||||
title, description, toolbarIP, true);
|
||||
PlacesUIUtils.showMinimalAddLivemarkUI(feedURI, gBrowser.currentURI,
|
||||
title, description, toolbarIP, true);
|
||||
},
|
||||
|
||||
/**
|
||||
|
@ -581,7 +581,7 @@ var BookmarksEventHandler = {
|
|||
return;
|
||||
|
||||
var target = aEvent.originalTarget;
|
||||
var view = PlacesUtils.getViewForNode(target);
|
||||
var view = PlacesUIUtils.getViewForNode(target);
|
||||
if (target.node && PlacesUtils.nodeIsFolder(target.node)) {
|
||||
// Don't open the root folder in tabs when the empty area on the toolbar
|
||||
// is middle-clicked or when a non-bookmark item except for Open in Tabs)
|
||||
|
@ -625,7 +625,7 @@ var BookmarksEventHandler = {
|
|||
onCommand: function BM_onCommand(aEvent) {
|
||||
var target = aEvent.originalTarget;
|
||||
if (target.node)
|
||||
PlacesUtils.openNodeWithEvent(target.node, aEvent);
|
||||
PlacesUIUtils.openNodeWithEvent(target.node, aEvent);
|
||||
},
|
||||
|
||||
/**
|
||||
|
@ -703,7 +703,7 @@ var BookmarksEventHandler = {
|
|||
target._endOptOpenSiteURI.setAttribute("onclick",
|
||||
"checkForMiddleClick(this, event); event.stopPropagation();");
|
||||
target._endOptOpenSiteURI.setAttribute("label",
|
||||
PlacesUtils.getFormattedString("menuOpenLivemarkOrigin.label",
|
||||
PlacesUIUtils.getFormattedString("menuOpenLivemarkOrigin.label",
|
||||
[target.parentNode.getAttribute("label")]));
|
||||
target.appendChild(target._endOptOpenSiteURI);
|
||||
}
|
||||
|
@ -713,7 +713,7 @@ var BookmarksEventHandler = {
|
|||
// at least two menuitems with places result nodes.
|
||||
target._endOptOpenAllInTabs = document.createElement("menuitem");
|
||||
target._endOptOpenAllInTabs.setAttribute("oncommand",
|
||||
"PlacesUtils.openContainerNodeInTabs(this.parentNode._resultNode, event);");
|
||||
"PlacesUIUtils.openContainerNodeInTabs(this.parentNode._resultNode, event);");
|
||||
target._endOptOpenAllInTabs.setAttribute("label",
|
||||
gNavigatorBundle.getString("menuOpenAllInTabs.label"));
|
||||
target.appendChild(target._endOptOpenAllInTabs);
|
||||
|
|
|
@ -2640,7 +2640,7 @@ var bookmarksButtonObserver = {
|
|||
var split = aXferData.data.split("\n");
|
||||
var url = split[0];
|
||||
if (url != aXferData.data) // do nothing if it's not a valid URL
|
||||
PlacesUtils.showMinimalAddBookmarkUI(makeURI(url), split[1]);
|
||||
PlacesUIUtils.showMinimalAddBookmarkUI(makeURI(url), split[1]);
|
||||
},
|
||||
|
||||
onDragOver: function (aEvent, aFlavour, aDragSession)
|
||||
|
@ -3115,7 +3115,7 @@ function addToUrlbarHistory(aUrlToAdd)
|
|||
|
||||
try {
|
||||
if (aUrlToAdd.indexOf(" ") == -1) {
|
||||
PlacesUtils.markPageAsTyped(aUrlToAdd);
|
||||
PlacesUIUtils.markPageAsTyped(aUrlToAdd);
|
||||
}
|
||||
}
|
||||
catch(ex) {
|
||||
|
@ -4780,9 +4780,9 @@ function asyncOpenWebPanel(event)
|
|||
// This is the Opera convention for a special link that - when clicked - allows
|
||||
// you to add a sidebar panel. We support the Opera convention here. The link's
|
||||
// title attribute contains the title that should be used for the sidebar panel.
|
||||
PlacesUtils.showMinimalAddBookmarkUI(makeURI(wrapper.href),
|
||||
wrapper.getAttribute("title"),
|
||||
null, null, true, true);
|
||||
PlacesUIUtils.showMinimalAddBookmarkUI(makeURI(wrapper.href),
|
||||
wrapper.getAttribute("title"),
|
||||
null, null, true, true);
|
||||
event.preventDefault();
|
||||
return false;
|
||||
}
|
||||
|
@ -5746,9 +5746,9 @@ function AddKeywordForSearchField()
|
|||
else
|
||||
spec += "?" + formData.join("&");
|
||||
|
||||
var description = PlacesUtils.getDescriptionFromDocument(node.ownerDocument);
|
||||
PlacesUtils.showMinimalAddBookmarkUI(makeURI(spec), "", description, null,
|
||||
null, null, "", postData);
|
||||
var description = PlacesUIUtils.getDescriptionFromDocument(node.ownerDocument);
|
||||
PlacesUIUtils.showMinimalAddBookmarkUI(makeURI(spec), "", description, null,
|
||||
null, null, "", postData);
|
||||
}
|
||||
|
||||
function SwitchDocumentDirection(aWindow) {
|
||||
|
|
|
@ -1191,13 +1191,13 @@ nsContextMenu.prototype = {
|
|||
var itemId = PlacesUtils.getMostRecentBookmarkForURI(uri);
|
||||
if (itemId == -1) {
|
||||
var title = doc.title;
|
||||
var description = PlacesUtils.getDescriptionFromDocument(doc);
|
||||
var description = PlacesUIUtils.getDescriptionFromDocument(doc);
|
||||
|
||||
var descAnno = { name: DESCRIPTION_ANNO, value: description };
|
||||
var txn = PlacesUtils.ptm.createItem(uri,
|
||||
var txn = PlacesUIUtils.ptm.createItem(uri,
|
||||
PlacesUtils.bookmarksMenuFolderId,
|
||||
-1, title, null, [descAnno]);
|
||||
PlacesUtils.ptm.doTransaction(txn);
|
||||
PlacesUIUtils.ptm.doTransaction(txn);
|
||||
itemId = PlacesUtils.getMostRecentBookmarkForURI(uri);
|
||||
StarUI.beginBatch();
|
||||
}
|
||||
|
|
|
@ -47,6 +47,13 @@ Cu.import("resource:///modules/distribution.js");
|
|||
|
||||
const PREF_EM_NEW_ADDONS_LIST = "extensions.newAddons";
|
||||
|
||||
// Check to see if bookmarks need backing up once per
|
||||
// day on 1 hour idle.
|
||||
const BOOKMARKS_ARCHIVE_IDLE_TIME = 60 * 60;
|
||||
|
||||
// Backup bookmarks once every 24 hours.
|
||||
const BOOKMARKS_ARCHIVE_INTERVAL = 86400 * 1000;
|
||||
|
||||
// Factory object
|
||||
const BrowserGlueServiceFactory = {
|
||||
_instance: null,
|
||||
|
@ -108,15 +115,23 @@ BrowserGlue.prototype = {
|
|||
if (this._saveSession) {
|
||||
this._setPrefToSaveSession();
|
||||
}
|
||||
this._shutdownPlaces();
|
||||
this.idleService.removeIdleObserver(this, BOOKMARKS_ARCHIVE_IDLE_TIME);
|
||||
break;
|
||||
case "session-save":
|
||||
this._setPrefToSaveSession();
|
||||
subject.QueryInterface(Ci.nsISupportsPRBool);
|
||||
subject.data = true;
|
||||
break;
|
||||
case "idle":
|
||||
if (this.idleService.idleTime > BOOKMARKS_ARCHIVE_IDLE_TIME * 1000) {
|
||||
// Back up bookmarks.
|
||||
this._archiveBookmarks();
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
,
|
||||
},
|
||||
|
||||
// initialization (called on application startup)
|
||||
_init: function()
|
||||
{
|
||||
|
@ -357,6 +372,14 @@ BrowserGlue.prototype = {
|
|||
return Sanitizer;
|
||||
},
|
||||
|
||||
_idleService: null,
|
||||
get idleService() {
|
||||
if (!this._idleService)
|
||||
this._idleService = Cc["@mozilla.org/widget/idleservice;1"].
|
||||
getService(Ci.nsIIdleService);
|
||||
return this._idleService;
|
||||
},
|
||||
|
||||
/**
|
||||
* Initialize Places
|
||||
* - imports the bookmarks html file if bookmarks datastore is empty
|
||||
|
@ -369,10 +392,11 @@ BrowserGlue.prototype = {
|
|||
var histsvc = Cc["@mozilla.org/browser/nav-history-service;1"].
|
||||
getService(Ci.nsINavHistoryService);
|
||||
|
||||
var prefBranch = Cc["@mozilla.org/preferences-service;1"].
|
||||
getService(Ci.nsIPrefBranch);
|
||||
|
||||
var importBookmarks = false;
|
||||
try {
|
||||
var prefBranch = Cc["@mozilla.org/preferences-service;1"].
|
||||
getService(Ci.nsIPrefBranch);
|
||||
importBookmarks = prefBranch.getBoolPref("browser.places.importBookmarksHTML");
|
||||
} catch(ex) {}
|
||||
|
||||
|
@ -380,55 +404,86 @@ BrowserGlue.prototype = {
|
|||
// Call it here for Fx3 profiles created before the Places folder
|
||||
// has been added, otherwise it's called during import.
|
||||
this.ensurePlacesDefaultQueriesInitialized();
|
||||
return;
|
||||
}
|
||||
else {
|
||||
// get latest backup
|
||||
Cu.import("resource://gre/modules/utils.js");
|
||||
var bookmarksFile = PlacesUtils.getMostRecentBackup();
|
||||
|
||||
var dirService = Cc["@mozilla.org/file/directory_service;1"].
|
||||
getService(Ci.nsIProperties);
|
||||
|
||||
var bookmarksFile = dirService.get("BMarks", Ci.nsILocalFile);
|
||||
|
||||
if (bookmarksFile.exists()) {
|
||||
// import the file
|
||||
try {
|
||||
var importer =
|
||||
Cc["@mozilla.org/browser/places/import-export-service;1"].
|
||||
getService(Ci.nsIPlacesImportExportService);
|
||||
importer.importHTMLFromFile(bookmarksFile, true);
|
||||
} catch(ex) {
|
||||
} finally {
|
||||
prefBranch.setBoolPref("browser.places.importBookmarksHTML", false);
|
||||
if (bookmarksFile && bookmarksFile.leafName.match("\.json$")) {
|
||||
// restore a JSON backup
|
||||
PlacesUtils.restoreBookmarksFromJSONFile(bookmarksFile);
|
||||
}
|
||||
else {
|
||||
// if there's no json backup use bookmarks.html
|
||||
|
||||
// only back up pre-places bookmarks.html if we plan on overwriting it
|
||||
if (prefBranch.getBoolPref("browser.bookmarks.overwrite")) {
|
||||
// backup pre-places bookmarks.html
|
||||
// XXXtodo remove this before betas, after import/export is solid
|
||||
var profDir = dirService.get("ProfD", Ci.nsILocalFile);
|
||||
var bookmarksBackup = profDir.clone();
|
||||
bookmarksBackup.append("bookmarks.preplaces.html");
|
||||
if (!bookmarksBackup.exists()) {
|
||||
// save old bookmarks.html file as bookmarks.preplaces.html
|
||||
try {
|
||||
bookmarksFile.copyTo(profDir, "bookmarks.preplaces.html");
|
||||
} catch(ex) {
|
||||
dump("nsBrowserGlue::_initPlaces(): copy of bookmarks.html to bookmarks.preplaces.html failed: " + ex + "\n");
|
||||
}
|
||||
var dirService = Cc["@mozilla.org/file/directory_service;1"].
|
||||
getService(Ci.nsIProperties);
|
||||
var bookmarksFile = dirService.get("BMarks", Ci.nsILocalFile);
|
||||
|
||||
// import the file
|
||||
try {
|
||||
var importer = Cc["@mozilla.org/browser/places/import-export-service;1"].
|
||||
getService(Ci.nsIPlacesImportExportService);
|
||||
importer.importHTMLFromFile(bookmarksFile, true /* overwrite existing */);
|
||||
} finally {
|
||||
prefBranch.setBoolPref("browser.places.importBookmarksHTML", false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Initialize bookmark archiving on idle.
|
||||
// Once a day, either on idle or shutdown, bookmarks are backed up.
|
||||
this.idleService.addIdleObserver(this, BOOKMARKS_ARCHIVE_IDLE_TIME);
|
||||
},
|
||||
|
||||
/**
|
||||
* Places shut-down tasks
|
||||
* - back up and archive bookmarks
|
||||
* - export bookmarks as HTML, if so configured
|
||||
*
|
||||
* Note: quit-application-granted notification is received twice
|
||||
* so replace this method with a no-op when first called.
|
||||
*/
|
||||
_shutdownPlaces: function bg__shutdownPlaces() {
|
||||
// backup bookmarks to bookmarks.html
|
||||
var importer =
|
||||
// Backup and archive Places bookmarks.
|
||||
this._archiveBookmarks();
|
||||
|
||||
// Backup bookmarks to bookmarks.html to support apps that depend
|
||||
// on the legacy format.
|
||||
var autoExportHTML = false;
|
||||
try {
|
||||
autoExportHTML = prefs.getIntPref("browser.bookmarks.autoExportHTML");
|
||||
} catch(ex) {}
|
||||
|
||||
if (autoExportHTML) {
|
||||
Cc["@mozilla.org/browser/places/import-export-service;1"].
|
||||
getService(Ci.nsIPlacesImportExportService);
|
||||
importer.backupBookmarksFile();
|
||||
getService(Ci.nsIPlacesImportExportService).
|
||||
backupBookmarksFile();
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Back up and archive bookmarks
|
||||
*/
|
||||
_archiveBookmarks: function nsBrowserGlue__archiveBookmarks() {
|
||||
Cu.import("resource://gre/modules/utils.js");
|
||||
|
||||
var lastBackup = PlacesUtils.getMostRecentBackup();
|
||||
|
||||
// Backup bookmarks if there aren't any backups or
|
||||
// they haven't been backed up in the last 24 hrs.
|
||||
if (!lastBackup ||
|
||||
Date.now() - lastBackup.lastModifiedTime > BOOKMARKS_ARCHIVE_INTERVAL) {
|
||||
var maxBackups = 5;
|
||||
var prefs = Cc["@mozilla.org/preferences-service;1"].
|
||||
getService(Ci.nsIPrefBranch);
|
||||
try {
|
||||
maxBackups = prefs.getIntPref("browser.bookmarks.max_backups");
|
||||
} catch(ex) {}
|
||||
|
||||
PlacesUtils.archiveBookmarksFile(maxBackups, false /* don't force */);
|
||||
}
|
||||
},
|
||||
|
||||
_migrateUI: function bg__migrateUI() {
|
||||
|
|
|
@ -567,8 +567,8 @@ var BookmarkPropertiesPanel = {
|
|||
var itemToSelect = userEnteredNameField;
|
||||
try {
|
||||
this._microsummaries =
|
||||
PlacesUtils.microsummaries.getMicrosummaries(this._bookmarkURI,
|
||||
this._bookmarkId);
|
||||
PlacesUIUtils.microsummaries.getMicrosummaries(this._bookmarkURI,
|
||||
this._bookmarkId);
|
||||
}
|
||||
catch(ex) {
|
||||
// getMicrosummaries will throw an exception if the page to which the URI
|
||||
|
@ -590,8 +590,8 @@ var BookmarkPropertiesPanel = {
|
|||
var menuItem = this._createMicrosummaryMenuItem(microsummary);
|
||||
|
||||
if (this._action == ACTION_EDIT &&
|
||||
PlacesUtils.microsummaries
|
||||
.isMicrosummary(this._bookmarkId, microsummary))
|
||||
PlacesUIUtils.microsummaries
|
||||
.isMicrosummary(this._bookmarkId, microsummary))
|
||||
itemToSelect = menuItem;
|
||||
|
||||
menupopup.appendChild(menuItem);
|
||||
|
@ -713,7 +713,7 @@ var BookmarkPropertiesPanel = {
|
|||
try {
|
||||
var value = this._element(aTextboxID).value;
|
||||
if (value) {
|
||||
var uri = PlacesUtils.createFixedURI(value);
|
||||
var uri = PlacesUIUtils.createFixedURI(value);
|
||||
return true;
|
||||
}
|
||||
} catch (e) { }
|
||||
|
@ -725,7 +725,7 @@ var BookmarkPropertiesPanel = {
|
|||
*/
|
||||
_getEditTitleTransaction:
|
||||
function BPP__getEditTitleTransaction(aItemId, aNewTitle) {
|
||||
return PlacesUtils.ptm.editItemTitle(aItemId, aNewTitle);
|
||||
return PlacesUIUtils.ptm.editItemTitle(aItemId, aNewTitle);
|
||||
},
|
||||
|
||||
/**
|
||||
|
@ -813,21 +813,21 @@ var BookmarkPropertiesPanel = {
|
|||
// description
|
||||
var description = this._element("descriptionTextfield").value;
|
||||
if (description != this._itemDescription) {
|
||||
transactions.push(PlacesUtils.ptm.
|
||||
transactions.push(PlacesUIUtils.ptm.
|
||||
editItemDescription(itemId, description,
|
||||
this._itemType != BOOKMARK_ITEM));
|
||||
}
|
||||
|
||||
if (this._itemType == BOOKMARK_ITEM) {
|
||||
// location
|
||||
var url = PlacesUtils.createFixedURI(this._element("editURLBar").value);
|
||||
var url = PlacesUIUtils.createFixedURI(this._element("editURLBar").value);
|
||||
if (!this._bookmarkURI.equals(url))
|
||||
transactions.push(PlacesUtils.ptm.editBookmarkURI(itemId, url));
|
||||
transactions.push(PlacesUIUtils.ptm.editBookmarkURI(itemId, url));
|
||||
|
||||
// keyword transactions
|
||||
var newKeyword = this._element("keywordTextfield").value;
|
||||
if (newKeyword != this._bookmarkKeyword) {
|
||||
transactions.push(PlacesUtils.ptm.
|
||||
transactions.push(PlacesUIUtils.ptm.
|
||||
editBookmarkKeyword(itemId, newKeyword));
|
||||
}
|
||||
|
||||
|
@ -841,39 +841,39 @@ var BookmarkPropertiesPanel = {
|
|||
// selected a microsummary which is not the one the bookmark previously
|
||||
// had.
|
||||
if ((newMicrosummary == null &&
|
||||
PlacesUtils.microsummaries.hasMicrosummary(itemId)) ||
|
||||
PlacesUIUtils.microsummaries.hasMicrosummary(itemId)) ||
|
||||
(newMicrosummary != null &&
|
||||
!PlacesUtils.microsummaries
|
||||
.isMicrosummary(itemId, newMicrosummary))) {
|
||||
!PlacesUIUtils.microsummaries
|
||||
.isMicrosummary(itemId, newMicrosummary))) {
|
||||
transactions.push(
|
||||
PlacesUtils.ptm.editBookmarkMicrosummary(itemId, newMicrosummary));
|
||||
PlacesUIUtils.ptm.editBookmarkMicrosummary(itemId, newMicrosummary));
|
||||
}
|
||||
|
||||
// load in sidebar
|
||||
var loadInSidebarChecked = this._element("loadInSidebarCheckbox").checked;
|
||||
if (loadInSidebarChecked != this._loadBookmarkInSidebar) {
|
||||
transactions.push(
|
||||
PlacesUtils.ptm.setLoadInSidebar(itemId, loadInSidebarChecked));
|
||||
PlacesUIUtils.ptm.setLoadInSidebar(itemId, loadInSidebarChecked));
|
||||
}
|
||||
}
|
||||
else if (this._itemType == LIVEMARK_CONTAINER) {
|
||||
var feedURIString = this._element("feedLocationTextfield").value;
|
||||
var feedURI = PlacesUtils.createFixedURI(feedURIString);
|
||||
var feedURI = PlacesUIUtils.createFixedURI(feedURIString);
|
||||
if (!this._feedURI.equals(feedURI)) {
|
||||
transactions.push(
|
||||
PlacesUtils.ptm.editLivemarkFeedURI(this._folderId, feedURI));
|
||||
PlacesUIUtils.ptm.editLivemarkFeedURI(this._folderId, feedURI));
|
||||
}
|
||||
|
||||
// Site Location is empty, we can set its URI to null
|
||||
var newSiteURIString = this._element("feedSiteLocationTextfield").value;
|
||||
var newSiteURI = null;
|
||||
if (newSiteURIString)
|
||||
newSiteURI = PlacesUtils.createFixedURI(newSiteURIString);
|
||||
newSiteURI = PlacesUIUtils.createFixedURI(newSiteURIString);
|
||||
|
||||
if ((!newSiteURI && this._siteURI) ||
|
||||
(newSiteURI && (!this._siteURI || !this._siteURI.equals(newSiteURI)))) {
|
||||
transactions.push(
|
||||
PlacesUtils.ptm.editLivemarkSiteURI(this._folderId, newSiteURI));
|
||||
PlacesUIUtils.ptm.editLivemarkSiteURI(this._folderId, newSiteURI));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -882,8 +882,8 @@ var BookmarkPropertiesPanel = {
|
|||
if (transactions.length > 0) {
|
||||
window.arguments[0].performed = true;
|
||||
var aggregate =
|
||||
PlacesUtils.ptm.aggregateTransactions(this._getDialogTitle(), transactions);
|
||||
PlacesUtils.ptm.doTransaction(aggregate);
|
||||
PlacesUIUtils.ptm.aggregateTransactions(this._getDialogTitle(), transactions);
|
||||
PlacesUIUtils.ptm.doTransaction(aggregate);
|
||||
}
|
||||
},
|
||||
|
||||
|
@ -912,7 +912,7 @@ var BookmarkPropertiesPanel = {
|
|||
*/
|
||||
_getCreateNewBookmarkTransaction:
|
||||
function BPP__getCreateNewBookmarkTransaction(aContainer, aIndex) {
|
||||
var uri = PlacesUtils.createFixedURI(this._element("editURLBar").value);
|
||||
var uri = PlacesUIUtils.createFixedURI(this._element("editURLBar").value);
|
||||
var title = this._element("userEnteredName").label;
|
||||
var keyword = this._element("keywordTextfield").value;
|
||||
var annotations = [];
|
||||
|
@ -928,20 +928,20 @@ var BookmarkPropertiesPanel = {
|
|||
var microsummary = this._element("namePicker").selectedItem.microsummary;
|
||||
if (microsummary) {
|
||||
childTransactions.push(
|
||||
PlacesUtils.ptm.editBookmarkMicrosummary(-1, microsummary));
|
||||
PlacesUIUtils.ptm.editBookmarkMicrosummary(-1, microsummary));
|
||||
}
|
||||
|
||||
if (this._postData) {
|
||||
childTransactions.push(
|
||||
PlacesUtils.ptm.editBookmarkPostData(-1, this._postData));
|
||||
PlacesUIUtils.ptm.editBookmarkPostData(-1, this._postData));
|
||||
}
|
||||
|
||||
var transactions = [PlacesUtils.ptm.createItem(uri, aContainer, aIndex,
|
||||
title, keyword,
|
||||
annotations,
|
||||
childTransactions)];
|
||||
var transactions = [PlacesUIUtils.ptm.createItem(uri, aContainer, aIndex,
|
||||
title, keyword,
|
||||
annotations,
|
||||
childTransactions)];
|
||||
|
||||
return PlacesUtils.ptm.aggregateTransactions(this._getDialogTitle(), transactions);
|
||||
return PlacesUIUtils.ptm.aggregateTransactions(this._getDialogTitle(), transactions);
|
||||
},
|
||||
|
||||
/**
|
||||
|
@ -953,7 +953,7 @@ var BookmarkPropertiesPanel = {
|
|||
for (var i = 0; i < this._URIList.length; ++i) {
|
||||
var uri = this._URIList[i];
|
||||
var title = this._getURITitleFromHistory(uri);
|
||||
transactions.push(PlacesUtils.ptm.createItem(uri, -1, -1, title));
|
||||
transactions.push(PlacesUIUtils.ptm.createItem(uri, -1, -1, title));
|
||||
}
|
||||
return transactions;
|
||||
},
|
||||
|
@ -973,8 +973,8 @@ var BookmarkPropertiesPanel = {
|
|||
if (description)
|
||||
annotations.push(this._getDescriptionAnnotation(description));
|
||||
|
||||
return PlacesUtils.ptm.createFolder(folderName, aContainer, aIndex,
|
||||
annotations, childItemsTransactions);
|
||||
return PlacesUIUtils.ptm.createFolder(folderName, aContainer, aIndex,
|
||||
annotations, childItemsTransactions);
|
||||
},
|
||||
|
||||
/**
|
||||
|
@ -984,16 +984,16 @@ var BookmarkPropertiesPanel = {
|
|||
_getCreateNewLivemarkTransaction:
|
||||
function BPP__getCreateNewLivemarkTransaction(aContainer, aIndex) {
|
||||
var feedURIString = this._element("feedLocationTextfield").value;
|
||||
var feedURI = PlacesUtils.createFixedURI(feedURIString);
|
||||
var feedURI = PlacesUIUtils.createFixedURI(feedURIString);
|
||||
|
||||
var siteURIString = this._element("feedSiteLocationTextfield").value;
|
||||
var siteURI = null;
|
||||
if (siteURIString)
|
||||
siteURI = PlacesUtils.createFixedURI(siteURIString);
|
||||
siteURI = PlacesUIUtils.createFixedURI(siteURIString);
|
||||
|
||||
var name = this._element("namePicker").value;
|
||||
return PlacesUtils.ptm.createLivemark(feedURI, siteURI, name,
|
||||
aContainer, aIndex);
|
||||
return PlacesUIUtils.ptm.createLivemark(feedURI, siteURI, name,
|
||||
aContainer, aIndex);
|
||||
},
|
||||
|
||||
/**
|
||||
|
@ -1018,7 +1018,7 @@ var BookmarkPropertiesPanel = {
|
|||
// perfrom our transaction do via the transaction manager passed by the
|
||||
// opener so it can be undone.
|
||||
window.arguments[0].performed = true;
|
||||
PlacesUtils.ptm.doTransaction(createTxn);
|
||||
PlacesUIUtils.ptm.doTransaction(createTxn);
|
||||
},
|
||||
|
||||
onNamePickerInput: function BPP_onNamePickerInput() {
|
||||
|
@ -1049,7 +1049,7 @@ var BookmarkPropertiesPanel = {
|
|||
if (!this._folderTree.place) {
|
||||
const FOLDER_TREE_PLACE_URI =
|
||||
"place:excludeItems=1&excludeQueries=1&excludeReadOnlyFolders=1&folder=" +
|
||||
PlacesUtils.allBookmarksFolderId;
|
||||
PlacesUIUtils.allBookmarksFolderId;
|
||||
this._folderTree.place = FOLDER_TREE_PLACE_URI;
|
||||
}
|
||||
|
||||
|
|
|
@ -37,7 +37,7 @@
|
|||
|
||||
function init() {
|
||||
document.getElementById("bookmarks-view").place =
|
||||
"place:queryType=1&folder=" + window.top.PlacesUtils.allBookmarksFolderId;
|
||||
"place:queryType=1&folder=" + window.top.PlacesUIUtils.allBookmarksFolderId;
|
||||
}
|
||||
|
||||
function searchBookmarks(aSearchString) {
|
||||
|
|
|
@ -103,9 +103,9 @@ PlacesController.prototype = {
|
|||
isCommandEnabled: function PC_isCommandEnabled(aCommand) {
|
||||
switch (aCommand) {
|
||||
case "cmd_undo":
|
||||
return PlacesUtils.ptm.numberOfUndoItems > 0;
|
||||
return PlacesUIUtils.ptm.numberOfUndoItems > 0;
|
||||
case "cmd_redo":
|
||||
return PlacesUtils.ptm.numberOfRedoItems > 0;
|
||||
return PlacesUIUtils.ptm.numberOfRedoItems > 0;
|
||||
case "cmd_cut":
|
||||
case "cmd_delete":
|
||||
return this._hasRemovableSelection(false);
|
||||
|
@ -152,7 +152,7 @@ PlacesController.prototype = {
|
|||
case "placesCmd_reloadMicrosummary":
|
||||
var selectedNode = this._view.selectedNode;
|
||||
return selectedNode && PlacesUtils.nodeIsBookmark(selectedNode) &&
|
||||
PlacesUtils.microsummaries.hasMicrosummary(selectedNode.itemId);
|
||||
PlacesUIUtils.microsummaries.hasMicrosummary(selectedNode.itemId);
|
||||
case "placesCmd_reload":
|
||||
// Livemark containers
|
||||
var selectedNode = this._view.selectedNode;
|
||||
|
@ -192,10 +192,10 @@ PlacesController.prototype = {
|
|||
doCommand: function PC_doCommand(aCommand) {
|
||||
switch (aCommand) {
|
||||
case "cmd_undo":
|
||||
PlacesUtils.ptm.undoTransaction();
|
||||
PlacesUIUtils.ptm.undoTransaction();
|
||||
break;
|
||||
case "cmd_redo":
|
||||
PlacesUtils.ptm.redoTransaction();
|
||||
PlacesUIUtils.ptm.redoTransaction();
|
||||
break;
|
||||
case "cmd_cut":
|
||||
this.cut();
|
||||
|
@ -213,13 +213,13 @@ PlacesController.prototype = {
|
|||
this.selectAll();
|
||||
break;
|
||||
case "placesCmd_open":
|
||||
PlacesUtils.openNodeIn(this._view.selectedNode, "current");
|
||||
PlacesUIUtils.openNodeIn(this._view.selectedNode, "current");
|
||||
break;
|
||||
case "placesCmd_open:window":
|
||||
PlacesUtils.openNodeIn(this._view.selectedNode, "window");
|
||||
PlacesUIUtils.openNodeIn(this._view.selectedNode, "window");
|
||||
break;
|
||||
case "placesCmd_open:tab":
|
||||
PlacesUtils.openNodeIn(this._view.selectedNode, "tab");
|
||||
PlacesUIUtils.openNodeIn(this._view.selectedNode, "tab");
|
||||
break;
|
||||
case "placesCmd_new:folder":
|
||||
this.newItem("folder");
|
||||
|
@ -337,8 +337,8 @@ PlacesController.prototype = {
|
|||
// if the clipboard contains TYPE_X_MOZ_PLACE_* data, it is definitely
|
||||
// pasteable, with no need to unwrap all the nodes.
|
||||
|
||||
var flavors = PlacesUtils.placesFlavors;
|
||||
var clipboard = PlacesUtils.clipboard;
|
||||
var flavors = PlacesUIUtils.placesFlavors;
|
||||
var clipboard = PlacesUIUtils.clipboard;
|
||||
var hasPlacesData =
|
||||
clipboard.hasDataMatchingFlavors(flavors, flavors.length,
|
||||
Ci.nsIClipboard.kGlobalClipboard);
|
||||
|
@ -442,7 +442,7 @@ PlacesController.prototype = {
|
|||
uri = PlacesUtils._uri(node.uri);
|
||||
if (PlacesUtils.nodeIsBookmark(node)) {
|
||||
nodeData["bookmark"] = true;
|
||||
var mss = PlacesUtils.microsummaries;
|
||||
var mss = PlacesUIUtils.microsummaries;
|
||||
if (mss.hasMicrosummary(node.itemId))
|
||||
nodeData["microsummary"] = true;
|
||||
else if (node.parent &&
|
||||
|
@ -628,9 +628,9 @@ PlacesController.prototype = {
|
|||
return;
|
||||
|
||||
if (PlacesUtils.nodeIsFolder(node))
|
||||
PlacesUtils.showFolderProperties(node.itemId);
|
||||
PlacesUIUtils.showFolderProperties(node.itemId);
|
||||
else if (PlacesUtils.nodeIsBookmark(node))
|
||||
PlacesUtils.showBookmarkProperties(node.itemId);
|
||||
PlacesUIUtils.showBookmarkProperties(node.itemId);
|
||||
},
|
||||
|
||||
/**
|
||||
|
@ -656,7 +656,7 @@ PlacesController.prototype = {
|
|||
*/
|
||||
reloadSelectedMicrosummary: function PC_reloadSelectedMicrosummary() {
|
||||
var selectedNode = this._view.selectedNode;
|
||||
var mss = PlacesUtils.microsummaries;
|
||||
var mss = PlacesUIUtils.microsummaries;
|
||||
if (mss.hasMicrosummary(selectedNode.itemId))
|
||||
mss.refreshMicrosummary(selectedNode.itemId);
|
||||
},
|
||||
|
@ -688,14 +688,14 @@ PlacesController.prototype = {
|
|||
GetStringFromName("brandShortName");
|
||||
|
||||
var buttonPressed = promptService.confirmEx(window,
|
||||
PlacesUtils.getString("tabs.openWarningTitle"),
|
||||
PlacesUtils.getFormattedString(messageKey,
|
||||
PlacesUIUtils.getString("tabs.openWarningTitle"),
|
||||
PlacesUIUtils.getFormattedString(messageKey,
|
||||
[numTabsToOpen, brandShortName]),
|
||||
(promptService.BUTTON_TITLE_IS_STRING * promptService.BUTTON_POS_0)
|
||||
+ (promptService.BUTTON_TITLE_CANCEL * promptService.BUTTON_POS_1),
|
||||
PlacesUtils.getString(openKey),
|
||||
PlacesUIUtils.getString(openKey),
|
||||
null, null,
|
||||
PlacesUtils.getFormattedString("tabs.openWarningPromptMeBranded",
|
||||
PlacesUIUtils.getFormattedString("tabs.openWarningPromptMeBranded",
|
||||
[brandShortName]),
|
||||
warnOnOpen);
|
||||
|
||||
|
@ -714,9 +714,9 @@ PlacesController.prototype = {
|
|||
openSelectionInTabs: function PC_openLinksInTabs(aEvent) {
|
||||
var node = this._view.selectedNode;
|
||||
if (node && PlacesUtils.nodeIsContainer(node))
|
||||
PlacesUtils.openContainerNodeInTabs(this._view.selectedNode, aEvent);
|
||||
PlacesUIUtils.openContainerNodeInTabs(this._view.selectedNode, aEvent);
|
||||
else
|
||||
PlacesUtils.openURINodesInTabs(this._view.getSelectionNodes(), aEvent);
|
||||
PlacesUIUtils.openURINodesInTabs(this._view.getSelectionNodes(), aEvent);
|
||||
},
|
||||
|
||||
/**
|
||||
|
@ -732,11 +732,11 @@ PlacesController.prototype = {
|
|||
|
||||
var performed = false;
|
||||
if (aType == "bookmark")
|
||||
performed = PlacesUtils.showAddBookmarkUI(null, null, null, ip);
|
||||
performed = PlacesUIUtils.showAddBookmarkUI(null, null, null, ip);
|
||||
else if (aType == "livemark")
|
||||
performed = PlacesUtils.showAddLivemarkUI(null, null, null, null, ip);
|
||||
performed = PlacesUIUtils.showAddLivemarkUI(null, null, null, null, ip);
|
||||
else // folder
|
||||
performed = PlacesUtils.showAddFolderUI(null, ip);
|
||||
performed = PlacesUIUtils.showAddFolderUI(null, ip);
|
||||
|
||||
if (performed) {
|
||||
// select the new item
|
||||
|
@ -757,7 +757,7 @@ PlacesController.prototype = {
|
|||
throw Cr.NS_ERROR_NOT_AVAILABLE;
|
||||
|
||||
var performed = false;
|
||||
performed = PlacesUtils.showAddFolderUI(null, ip);
|
||||
performed = PlacesUIUtils.showAddFolderUI(null, ip);
|
||||
if (performed) {
|
||||
// select the new item
|
||||
var insertedNodeId = PlacesUtils.bookmarks
|
||||
|
@ -773,8 +773,8 @@ PlacesController.prototype = {
|
|||
var ip = this._view.insertionPoint;
|
||||
if (!ip)
|
||||
throw Cr.NS_ERROR_NOT_AVAILABLE;
|
||||
var txn = PlacesUtils.ptm.createSeparator(ip.itemId, ip.index);
|
||||
PlacesUtils.ptm.doTransaction(txn);
|
||||
var txn = PlacesUIUtils.ptm.createSeparator(ip.itemId, ip.index);
|
||||
PlacesUIUtils.ptm.doTransaction(txn);
|
||||
// select the new item
|
||||
var insertedNodeId = PlacesUtils.bookmarks
|
||||
.getIdForItemAt(ip.itemId, ip.index);
|
||||
|
@ -795,8 +795,8 @@ PlacesController.prototype = {
|
|||
*/
|
||||
sortFolderByName: function PC_sortFolderByName() {
|
||||
var itemId = PlacesUtils.getConcreteItemId(this._view.selectedNode);
|
||||
var txn = PlacesUtils.ptm.sortFolderByName(itemId);
|
||||
PlacesUtils.ptm.doTransaction(txn);
|
||||
var txn = PlacesUIUtils.ptm.sortFolderByName(itemId);
|
||||
PlacesUIUtils.ptm.doTransaction(txn);
|
||||
},
|
||||
|
||||
/**
|
||||
|
@ -856,7 +856,7 @@ PlacesController.prototype = {
|
|||
if (PlacesUtils.nodeIsFolder(node))
|
||||
removedFolders.push(node);
|
||||
|
||||
transactions.push(PlacesUtils.ptm.removeItem(node.itemId));
|
||||
transactions.push(PlacesUIUtils.ptm.removeItem(node.itemId));
|
||||
}
|
||||
},
|
||||
|
||||
|
@ -873,8 +873,8 @@ PlacesController.prototype = {
|
|||
for (var i = ranges.length - 1; i >= 0 ; --i)
|
||||
this._removeRange(ranges[i], transactions);
|
||||
if (transactions.length > 0) {
|
||||
var txn = PlacesUtils.ptm.aggregateTransactions(txnName, transactions);
|
||||
PlacesUtils.ptm.doTransaction(txn);
|
||||
var txn = PlacesUIUtils.ptm.aggregateTransactions(txnName, transactions);
|
||||
PlacesUIUtils.ptm.doTransaction(txn);
|
||||
}
|
||||
},
|
||||
|
||||
|
@ -997,7 +997,7 @@ PlacesController.prototype = {
|
|||
|
||||
var data = new TransferData();
|
||||
function addData(type, overrideURI) {
|
||||
data.addDataForFlavour(type, PlacesUtils._wrapString(
|
||||
data.addDataForFlavour(type, PlacesUIUtils._wrapString(
|
||||
PlacesUtils.wrapNode(node, type, overrideURI)));
|
||||
}
|
||||
|
||||
|
@ -1075,7 +1075,7 @@ PlacesController.prototype = {
|
|||
|
||||
function addData(type, data) {
|
||||
xferable.addDataFlavor(type);
|
||||
xferable.setTransferData(type, PlacesUtils._wrapString(data), data.length * 2);
|
||||
xferable.setTransferData(type, PlacesUIUtils._wrapString(data), data.length * 2);
|
||||
}
|
||||
// This order is _important_! It controls how this and other applications
|
||||
// select data to be inserted based on type.
|
||||
|
@ -1089,7 +1089,7 @@ PlacesController.prototype = {
|
|||
addData(PlacesUtils.TYPE_HTML, htmlString);
|
||||
|
||||
if (placeString || unicodeString || htmlString || mozURLString) {
|
||||
PlacesUtils.clipboard.setData(xferable, null, Ci.nsIClipboard.kGlobalClipboard);
|
||||
PlacesUIUtils.clipboard.setData(xferable, null, Ci.nsIClipboard.kGlobalClipboard);
|
||||
}
|
||||
}
|
||||
finally {
|
||||
|
@ -1133,7 +1133,7 @@ PlacesController.prototype = {
|
|||
return xferable;
|
||||
}
|
||||
|
||||
var clipboard = PlacesUtils.clipboard;
|
||||
var clipboard = PlacesUIUtils.clipboard;
|
||||
|
||||
var ip = this._view.insertionPoint;
|
||||
if (!ip)
|
||||
|
@ -1161,9 +1161,9 @@ PlacesController.prototype = {
|
|||
// transactions insert differently if index == -1
|
||||
if (ip.index > -1)
|
||||
index = ip.index + i;
|
||||
transactions.push(PlacesUtils.makeTransaction(items[i], type.value,
|
||||
ip.itemId, index,
|
||||
true));
|
||||
transactions.push(PlacesUIUtils.makeTransaction(items[i], type.value,
|
||||
ip.itemId, index,
|
||||
true));
|
||||
}
|
||||
return transactions;
|
||||
}
|
||||
|
@ -1182,8 +1182,8 @@ PlacesController.prototype = {
|
|||
var transactions = getTransactions([PlacesUtils.TYPE_X_MOZ_PLACE,
|
||||
PlacesUtils.TYPE_X_MOZ_URL,
|
||||
PlacesUtils.TYPE_UNICODE]);
|
||||
var txn = PlacesUtils.ptm.aggregateTransactions("Paste", transactions);
|
||||
PlacesUtils.ptm.doTransaction(txn);
|
||||
var txn = PlacesUIUtils.ptm.aggregateTransactions("Paste", transactions);
|
||||
PlacesUIUtils.ptm.doTransaction(txn);
|
||||
|
||||
// select the pasted items, they should be consecutive
|
||||
var insertedNodeIds = [];
|
||||
|
@ -1243,7 +1243,7 @@ var PlacesControllerDragHelper = {
|
|||
canDrop: function PCDH_canDrop() {
|
||||
var session = this.getSession();
|
||||
if (session) {
|
||||
var types = PlacesUtils.GENERIC_VIEW_DROP_TYPES;
|
||||
var types = PlacesUIUtils.GENERIC_VIEW_DROP_TYPES;
|
||||
for (var i = 0; i < types.length; ++i) {
|
||||
if (session.isDataFlavorSupported(types[i]))
|
||||
return true;
|
||||
|
@ -1263,7 +1263,7 @@ var PlacesControllerDragHelper = {
|
|||
_initTransferable: function PCDH__initTransferable(session) {
|
||||
var xferable = Cc["@mozilla.org/widget/transferable;1"].
|
||||
createInstance(Ci.nsITransferable);
|
||||
var types = PlacesUtils.GENERIC_VIEW_DROP_TYPES;
|
||||
var types = PlacesUIUtils.GENERIC_VIEW_DROP_TYPES;
|
||||
for (var i = 0; i < types.length; ++i) {
|
||||
if (session.isDataFlavorSupported(types[i]))
|
||||
xferable.addDataFlavor(types[i]);
|
||||
|
@ -1306,13 +1306,13 @@ var PlacesControllerDragHelper = {
|
|||
movedCount++;
|
||||
}
|
||||
|
||||
transactions.push(PlacesUtils.makeTransaction(unwrapped,
|
||||
transactions.push(PlacesUIUtils.makeTransaction(unwrapped,
|
||||
flavor.value, insertionPoint.itemId,
|
||||
index, copy));
|
||||
}
|
||||
|
||||
var txn = PlacesUtils.ptm.aggregateTransactions("DropItems", transactions);
|
||||
PlacesUtils.ptm.doTransaction(txn);
|
||||
var txn = PlacesUIUtils.ptm.aggregateTransactions("DropItems", transactions);
|
||||
PlacesUIUtils.ptm.doTransaction(txn);
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
@ -157,7 +157,7 @@ var gEditItemOverlay = {
|
|||
|
||||
// description field
|
||||
this._initTextField("descriptionField",
|
||||
PlacesUtils.getItemDescription(this._itemId));
|
||||
PlacesUIUtils.getItemDescription(this._itemId));
|
||||
|
||||
this._showHideRows();
|
||||
|
||||
|
@ -336,8 +336,8 @@ var gEditItemOverlay = {
|
|||
try {
|
||||
if (this._itemType == Ci.nsINavBookmarksService.TYPE_BOOKMARK &&
|
||||
!this._readOnly)
|
||||
this._microsummaries = PlacesUtils.microsummaries
|
||||
.getMicrosummaries(this._uri, -1);
|
||||
this._microsummaries = PlacesUIUtils.microsummaries
|
||||
.getMicrosummaries(this._uri, -1);
|
||||
}
|
||||
catch(ex) {
|
||||
// getMicrosummaries will throw an exception in at least two cases:
|
||||
|
@ -358,8 +358,8 @@ var gEditItemOverlay = {
|
|||
var microsummary = enumerator.getNext()
|
||||
.QueryInterface(Ci.nsIMicrosummary);
|
||||
var menuItem = this._createMicrosummaryMenuItem(microsummary);
|
||||
if (PlacesUtils.microsummaries
|
||||
.isMicrosummary(this._itemId, microsummary))
|
||||
if (PlacesUIUtils.microsummaries
|
||||
.isMicrosummary(this._itemId, microsummary))
|
||||
itemToSelect = menuItem;
|
||||
|
||||
menupopup.appendChild(menuItem);
|
||||
|
@ -461,12 +461,12 @@ var gEditItemOverlay = {
|
|||
}
|
||||
|
||||
if (tagsToAdd.length > 0) {
|
||||
var tagTxn = PlacesUtils.ptm.tagURI(this._uri, tagsToAdd);
|
||||
PlacesUtils.ptm.doTransaction(tagTxn);
|
||||
var tagTxn = PlacesUIUtils.ptm.tagURI(this._uri, tagsToAdd);
|
||||
PlacesUIUtils.ptm.doTransaction(tagTxn);
|
||||
}
|
||||
if (tagsToRemove.length > 0) {
|
||||
var untagTxn = PlacesUtils.ptm.untagURI(this._uri, tagsToRemove);
|
||||
PlacesUtils.ptm.doTransaction(untagTxn);
|
||||
var untagTxn = PlacesUIUtils.ptm.untagURI(this._uri, tagsToRemove);
|
||||
PlacesUIUtils.ptm.doTransaction(untagTxn);
|
||||
}
|
||||
}
|
||||
},
|
||||
|
@ -482,12 +482,12 @@ var gEditItemOverlay = {
|
|||
|
||||
var namePicker = this._element("namePicker")
|
||||
var txns = [];
|
||||
const ptm = PlacesUtils.ptm;
|
||||
const ptm = PlacesUIUtils.ptm;
|
||||
|
||||
// Here we update either the item title or its cached static title
|
||||
var newTitle = this._element("userEnteredName").label;
|
||||
if (this._getItemStaticTitle() != newTitle) {
|
||||
if (PlacesUtils.microsummaries.hasMicrosummary(this._itemId)) {
|
||||
if (PlacesUIUtils.microsummaries.hasMicrosummary(this._itemId)) {
|
||||
// Note: this implicitly also takes care of the microsummary->static
|
||||
// title case, the removeMicorosummary method in the service will set
|
||||
// the item-title to the value of this annotation.
|
||||
|
@ -508,10 +508,10 @@ var gEditItemOverlay = {
|
|||
// bookmark previously had one, or the user selected a microsummary which
|
||||
// is not the one the bookmark previously had
|
||||
if ((newMicrosummary == null &&
|
||||
PlacesUtils.microsummaries.hasMicrosummary(this._itemId)) ||
|
||||
PlacesUIUtils.microsummaries.hasMicrosummary(this._itemId)) ||
|
||||
(newMicrosummary != null &&
|
||||
!PlacesUtils.microsummaries
|
||||
.isMicrosummary(this._itemId, newMicrosummary))) {
|
||||
!PlacesUIUtils.microsummaries
|
||||
.isMicrosummary(this._itemId, newMicrosummary))) {
|
||||
txns.push(ptm.editBookmarkMicrosummary(this._itemId, newMicrosummary));
|
||||
}
|
||||
|
||||
|
@ -522,67 +522,67 @@ var gEditItemOverlay = {
|
|||
onDescriptionFieldBlur: function EIO_onDescriptionFieldInput() {
|
||||
var description = this._element("descriptionField").value;
|
||||
if (description != PlacesUtils.getItemDescription(this._itemId)) {
|
||||
var txn = PlacesUtils.ptm
|
||||
.editItemDescription(this._itemId, description);
|
||||
PlacesUtils.ptm.doTransaction(txn);
|
||||
var txn = PlacesUIUtils.ptm
|
||||
.editItemDescription(this._itemId, description);
|
||||
PlacesUIUtils.ptm.doTransaction(txn);
|
||||
}
|
||||
},
|
||||
|
||||
onLocationFieldBlur: function EIO_onLocationFieldBlur() {
|
||||
var uri;
|
||||
try {
|
||||
uri = PlacesUtils.createFixedURI(this._element("locationField").value);
|
||||
uri = PlacesUIUtils.createFixedURI(this._element("locationField").value);
|
||||
}
|
||||
catch(ex) { return; }
|
||||
|
||||
if (!this._uri.equals(uri)) {
|
||||
var txn = PlacesUtils.ptm.editBookmarkURI(this._itemId, uri);
|
||||
PlacesUtils.ptm.doTransaction(txn);
|
||||
var txn = PlacesUIUtils.ptm.editBookmarkURI(this._itemId, uri);
|
||||
PlacesUIUtils.ptm.doTransaction(txn);
|
||||
}
|
||||
},
|
||||
|
||||
onKeywordFieldBlur: function EIO_onKeywordFieldBlur() {
|
||||
var keyword = this._element("keywordField").value;
|
||||
if (keyword != PlacesUtils.bookmarks.getKeywordForBookmark(this._itemId)) {
|
||||
var txn = PlacesUtils.ptm.editBookmarkKeyword(this._itemId, keyword);
|
||||
PlacesUtils.ptm.doTransaction(txn);
|
||||
var txn = PlacesUIUtils.ptm.editBookmarkKeyword(this._itemId, keyword);
|
||||
PlacesUIUtils.ptm.doTransaction(txn);
|
||||
}
|
||||
},
|
||||
|
||||
onFeedLocationFieldBlur: function EIO_onFeedLocationFieldBlur() {
|
||||
var uri;
|
||||
try {
|
||||
uri = PlacesUtils.createFixedURI(this._element("feedLocationField").value);
|
||||
uri = PlacesUIUtils.createFixedURI(this._element("feedLocationField").value);
|
||||
}
|
||||
catch(ex) { return; }
|
||||
|
||||
var currentFeedURI = PlacesUtils.livemarks.getFeedURI(this._itemId);
|
||||
if (!currentFeedURI.equals(uri)) {
|
||||
var txn = PlacesUtils.ptm.editLivemarkFeedURI(this._itemId, uri);
|
||||
PlacesUtils.ptm.doTransaction(txn);
|
||||
var txn = PlacesUIUtils.ptm.editLivemarkFeedURI(this._itemId, uri);
|
||||
PlacesUIUtils.ptm.doTransaction(txn);
|
||||
}
|
||||
},
|
||||
|
||||
onSiteLocationFieldBlur: function EIO_onSiteLocationFieldBlur() {
|
||||
var uri = null;
|
||||
try {
|
||||
uri = PlacesUtils.createFixedURI(this._element("siteLocationField").value);
|
||||
uri = PlacesUIUtils.createFixedURI(this._element("siteLocationField").value);
|
||||
}
|
||||
catch(ex) { }
|
||||
|
||||
var currentSiteURI = PlacesUtils.livemarks.getSiteURI(this._itemId);
|
||||
if (!uri || !currentSiteURI.equals(uri)) {
|
||||
var txn = PlacesUtils.ptm.editLivemarkSiteURI(this._itemId, uri);
|
||||
PlacesUtils.ptm.doTransaction(txn);
|
||||
var txn = PlacesUIUtils.ptm.editLivemarkSiteURI(this._itemId, uri);
|
||||
PlacesUIUtils.ptm.doTransaction(txn);
|
||||
}
|
||||
},
|
||||
|
||||
onLoadInSidebarCheckboxCommand:
|
||||
function EIO_onLoadInSidebarCheckboxCommand() {
|
||||
var loadInSidebarChecked = this._element("loadInSidebarCheckbox").checked;
|
||||
var txn = PlacesUtils.ptm.setLoadInSidebar(this._itemId,
|
||||
loadInSidebarChecked);
|
||||
PlacesUtils.ptm.doTransaction(txn);
|
||||
var txn = PlacesUIUtils.ptm.setLoadInSidebar(this._itemId,
|
||||
loadInSidebarChecked);
|
||||
PlacesUIUtils.ptm.doTransaction(txn);
|
||||
},
|
||||
|
||||
toggleFolderTreeVisibility: function EIO_toggleFolderTreeVisibility() {
|
||||
|
@ -603,7 +603,7 @@ var gEditItemOverlay = {
|
|||
if (!this._folderTree.place) {
|
||||
const FOLDER_TREE_PLACE_URI =
|
||||
"place:excludeItems=1&excludeQueries=1&excludeReadOnlyFolders=1&folder=" +
|
||||
window.top.PlacesUtils.allBookmarksFolderId;
|
||||
window.top.PlacesUIUtils.allBookmarksFolderId;
|
||||
this._folderTree.place = FOLDER_TREE_PLACE_URI;
|
||||
}
|
||||
|
||||
|
@ -663,8 +663,8 @@ var gEditItemOverlay = {
|
|||
// Move the item
|
||||
var container = this._getFolderIdFromMenuList();
|
||||
if (PlacesUtils.bookmarks.getFolderIdForItem(this._itemId) != container) {
|
||||
var txn = PlacesUtils.ptm.moveItem(this._itemId, container, -1);
|
||||
PlacesUtils.ptm.doTransaction(txn);
|
||||
var txn = PlacesUIUtils.ptm.moveItem(this._itemId, container, -1);
|
||||
PlacesUIUtils.ptm.doTransaction(txn);
|
||||
|
||||
// Mark the containing folder as recently-used if it isn't in the
|
||||
// static list
|
||||
|
|
|
@ -102,7 +102,7 @@ function historyAddBookmarks()
|
|||
// or if the selected item is not a URI node
|
||||
var node = gHistoryTree.selectedNode;
|
||||
if (node && PlacesUtils.nodeIsURI(node))
|
||||
PlacesUtils.showMinimalAddBookmarkUI(PlacesUtils._uri(node.uri), node.title);
|
||||
PlacesUIUtils.showMinimalAddBookmarkUI(PlacesUtils._uri(node.uri), node.title);
|
||||
}
|
||||
|
||||
function searchHistory(aInput)
|
||||
|
|
|
@ -76,7 +76,7 @@
|
|||
<field name="_endMarker">-1</field>
|
||||
|
||||
<!-- This is the view that manage the popup -->
|
||||
<field name="_rootView">PlacesUtils.getViewForNode(this);</field>
|
||||
<field name="_rootView">PlacesUIUtils.getViewForNode(this);</field>
|
||||
|
||||
<field name="_built">false</field>
|
||||
|
||||
|
@ -217,7 +217,7 @@
|
|||
<method name="getSupportedFlavours">
|
||||
<body><![CDATA[
|
||||
var flavourSet = new FlavourSet();
|
||||
var acceptedDropFlavours = PlacesUtils.GENERIC_VIEW_DROP_TYPES;
|
||||
var acceptedDropFlavours = PlacesUIUtils.GENERIC_VIEW_DROP_TYPES;
|
||||
acceptedDropFlavours.forEach(flavourSet.appendFlavour, flavourSet);
|
||||
return flavourSet;
|
||||
]]></body>
|
||||
|
@ -580,7 +580,7 @@
|
|||
<parameter name="aBefore"/>
|
||||
<body><![CDATA[
|
||||
var element =
|
||||
PlacesUtils.createMenuItemForNode(aChild, this._containerNodesMap);
|
||||
PlacesUIUtils.createMenuItemForNode(aChild, this._containerNodesMap);
|
||||
|
||||
if (aBefore)
|
||||
aParentPopup.insertBefore(element, aBefore);
|
||||
|
@ -605,7 +605,7 @@
|
|||
return;
|
||||
}
|
||||
|
||||
var label = PlacesUtils.getString("bookmarksMenuEmptyFolder");
|
||||
var label = PlacesUIUtils.getString("bookmarksMenuEmptyFolder");
|
||||
aPopup._emptyMenuItem = document.createElement("menuitem");
|
||||
aPopup._emptyMenuItem.setAttribute("label", label);
|
||||
aPopup._emptyMenuItem.setAttribute("disabled", true);
|
||||
|
@ -616,7 +616,7 @@
|
|||
<method name="_rebuild">
|
||||
<parameter name="aPopup"/>
|
||||
<body><![CDATA[
|
||||
PlacesUtils.cleanPlacesPopup(aPopup);
|
||||
PlacesUIUtils.cleanPlacesPopup(aPopup);
|
||||
|
||||
var cc = aPopup._resultNode.childCount;
|
||||
if (cc > 0) {
|
||||
|
@ -756,7 +756,7 @@
|
|||
else
|
||||
menuitem.removeAttribute("image");
|
||||
|
||||
var title = PlacesUtils.getBestTitle(aNode);
|
||||
var title = PlacesUIUtils.getBestTitle(aNode);
|
||||
if (menuitem.getAttribute("label") != title)
|
||||
menuitem.setAttribute("label", title);
|
||||
|
||||
|
|
|
@ -52,7 +52,7 @@ var gMoveBookmarksDialog = {
|
|||
|
||||
this.foldersTree.place =
|
||||
"place:excludeItems=1&excludeQueries=1&excludeReadOnlyFolders=1&folder=" +
|
||||
PlacesUtils.allBookmarksFolderId;
|
||||
PlacesUIUtils.allBookmarksFolderId;
|
||||
},
|
||||
|
||||
onOK: function MBD_onOK(aEvent) {
|
||||
|
@ -68,12 +68,12 @@ var gMoveBookmarksDialog = {
|
|||
continue;
|
||||
|
||||
transactions.push(new
|
||||
PlacesUtils.ptm.moveItem(this._nodes[i].itemId, selectedFolderID, -1));
|
||||
PlacesUIUtils.ptm.moveItem(this._nodes[i].itemId, selectedFolderID, -1));
|
||||
}
|
||||
|
||||
if (transactions.length != 0) {
|
||||
var txn = PlacesUtils.ptm.aggregateTransactions("Move Items", transactions);
|
||||
PlacesUtils.ptm.doTransaction(txn);
|
||||
var txn = PlacesUIUtils.ptm.aggregateTransactions("Move Items", transactions);
|
||||
PlacesUIUtils.ptm.doTransaction(txn);
|
||||
}
|
||||
},
|
||||
|
||||
|
|
|
@ -43,12 +43,12 @@ var PlacesOrganizer = {
|
|||
_content: null,
|
||||
|
||||
_initFolderTree: function() {
|
||||
var leftPaneRoot = PlacesUtils.leftPaneFolderId;
|
||||
var leftPaneRoot = PlacesUIUtils.leftPaneFolderId;
|
||||
this._places.place = "place:excludeItems=1&expandQueries=0&folder=" + leftPaneRoot;
|
||||
},
|
||||
|
||||
selectLeftPaneQuery: function PO_selectLeftPaneQuery(aQueryName) {
|
||||
var itemId = PlacesUtils.leftPaneQueries[aQueryName];
|
||||
var itemId = PlacesUIUtils.leftPaneQueries[aQueryName];
|
||||
this._places.selectItems([itemId]);
|
||||
// Forcefully expand all-bookmarks
|
||||
if (aQueryName == "AllBookmarks")
|
||||
|
@ -225,7 +225,7 @@ var PlacesOrganizer = {
|
|||
// the search box in the toolbar if the active collection is the current
|
||||
// collection.
|
||||
var findCommand = document.getElementById("OrganizerCommand_find:current");
|
||||
var findLabel = PlacesUtils.getFormattedString("findInPrefix", [node.title]);
|
||||
var findLabel = PlacesUIUtils.getFormattedString("findInPrefix", [node.title]);
|
||||
findCommand.setAttribute("label", findLabel);
|
||||
if (PlacesSearchBox.filterCollection == "collection")
|
||||
PlacesSearchBox.updateCollectionTitle(node.title);
|
||||
|
@ -246,7 +246,7 @@ var PlacesOrganizer = {
|
|||
var selectedNode = currentView.selectedNode;
|
||||
if (selectedNode && aEvent.button == 1) {
|
||||
if (PlacesUtils.nodeIsURI(selectedNode))
|
||||
PlacesUtils.openNodeWithEvent(selectedNode, aEvent);
|
||||
PlacesUIUtils.openNodeWithEvent(selectedNode, aEvent);
|
||||
else if (PlacesUtils.nodeIsContainer(selectedNode)) {
|
||||
// The command execution function will take care of seeing the
|
||||
// selection is a folder/container and loading its contents in
|
||||
|
@ -264,7 +264,7 @@ var PlacesOrganizer = {
|
|||
},
|
||||
|
||||
openSelectedNode: function PU_openSelectedNode(aEvent) {
|
||||
PlacesUtils.openNodeWithEvent(this._content.selectedNode, aEvent);
|
||||
PlacesUIUtils.openNodeWithEvent(this._content.selectedNode, aEvent);
|
||||
},
|
||||
|
||||
/**
|
||||
|
@ -305,7 +305,7 @@ var PlacesOrganizer = {
|
|||
importFromFile: function PO_importFromFile() {
|
||||
var fp = Cc["@mozilla.org/filepicker;1"].
|
||||
createInstance(Ci.nsIFilePicker);
|
||||
fp.init(window, PlacesUtils.getString("SelectImport"),
|
||||
fp.init(window, PlacesUIUtils.getString("SelectImport"),
|
||||
Ci.nsIFilePicker.modeOpen);
|
||||
fp.appendFilters(Ci.nsIFilePicker.filterHTML | Ci.nsIFilePicker.filterAll);
|
||||
if (fp.show() != Ci.nsIFilePicker.returnCancel) {
|
||||
|
@ -324,7 +324,7 @@ var PlacesOrganizer = {
|
|||
exportBookmarks: function PO_exportBookmarks() {
|
||||
var fp = Cc["@mozilla.org/filepicker;1"].
|
||||
createInstance(Ci.nsIFilePicker);
|
||||
fp.init(window, PlacesUtils.getString("EnterExport"),
|
||||
fp.init(window, PlacesUIUtils.getString("EnterExport"),
|
||||
Ci.nsIFilePicker.modeSave);
|
||||
fp.appendFilters(Ci.nsIFilePicker.filterHTML);
|
||||
fp.defaultString = "bookmarks.html";
|
||||
|
@ -359,13 +359,13 @@ var PlacesOrganizer = {
|
|||
var files = bookmarksBackupDir.directoryEntries;
|
||||
while (files.hasMoreElements()) {
|
||||
var f = files.getNext().QueryInterface(Ci.nsIFile);
|
||||
if (!f.isHidden() && f.leafName.match(/\.html?$/))
|
||||
if (!f.isHidden() && f.leafName.match(/^bookmarks-.+(html|json)?$/))
|
||||
fileList.push(f);
|
||||
}
|
||||
|
||||
fileList.sort(function PO_fileList_compare(a, b) {
|
||||
return b.lastModifiedTime - a.lastModifiedTime;
|
||||
});
|
||||
return b.lastModifiedTime - a.lastModifiedTime;
|
||||
});
|
||||
|
||||
if (fileList.length == 0)
|
||||
return;
|
||||
|
@ -376,7 +376,7 @@ var PlacesOrganizer = {
|
|||
(document.createElement("menuitem"),
|
||||
document.getElementById("restoreFromFile"));
|
||||
var dateStr = fileList[i].leafName.replace("bookmarks-", "").
|
||||
replace(".html", "");
|
||||
replace(/\.(html|json)$/, "");
|
||||
if (!dateStr.length)
|
||||
dateStr = fileList[i].leafName;
|
||||
m.setAttribute("label", dateStr);
|
||||
|
@ -399,27 +399,58 @@ var PlacesOrganizer = {
|
|||
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);
|
||||
this.restoreBookmarksFromFile(bookmarksFile);
|
||||
},
|
||||
|
||||
/**
|
||||
* Backup bookmarks to desktop, auto-generate a filename with a date
|
||||
* Called when 'Choose File...' is selected from the restore menu.
|
||||
* Prompts for a file and restores bookmarks to those in the file.
|
||||
*/
|
||||
onRestoreBookmarksFromFile: function PO_onRestoreBookmarksFromFile() {
|
||||
var fp = Cc["@mozilla.org/filepicker;1"].createInstance(Ci.nsIFilePicker);
|
||||
fp.init(window, PlacesUIUtils.getString("bookmarksRestoreTitle"),
|
||||
Ci.nsIFilePicker.modeOpen);
|
||||
|
||||
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)
|
||||
PlacesUtils.restoreBookmarksFromFile(fp.file);
|
||||
},
|
||||
|
||||
/**
|
||||
* Restores bookmarks from an HTML or JSON file.
|
||||
*/
|
||||
restoreBookmarksFromFile: function PO_restoreBookmarksFromFile(aFile) {
|
||||
var prompts = Cc["@mozilla.org/embedcomp/prompt-service;1"].
|
||||
getService(Ci.nsIPromptService);
|
||||
if (!prompts.confirm(null,
|
||||
PlacesUIUtils.getString("bookmarksRestoreAlertTitle"),
|
||||
PlacesUIUtils.getString("bookmarksRestoreAlert")))
|
||||
return;
|
||||
|
||||
if (aFile.leafName.match("\.json$")) {
|
||||
// restore a JSON backup
|
||||
PlacesUtils.restoreBookmarksFromJSONFile(aFile);
|
||||
}
|
||||
else {
|
||||
var importer = Cc["@mozilla.org/browser/places/import-export-service;1"].
|
||||
getService(Ci.nsIPlacesImportExportService);
|
||||
importer.importHTMLFromFile(aFile, true /* overwrite existing */);
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Backup bookmarks to desktop, auto-generate a filename with a date.
|
||||
* The file is a JSON serialization of bookmarks, tags and any annotations
|
||||
* of those items.
|
||||
*/
|
||||
backupBookmarks: function PO_backupBookmarks() {
|
||||
var fp = Cc["@mozilla.org/filepicker;1"].createInstance(Ci.nsIFilePicker);
|
||||
fp.init(window, PlacesUtils.getString("bookmarksBackupTitle"),
|
||||
fp.init(window, PlacesUIUtils.getString("bookmarksBackupTitle"),
|
||||
Ci.nsIFilePicker.modeSave);
|
||||
fp.appendFilters(Ci.nsIFilePicker.filterHTML);
|
||||
|
||||
var dirSvc = Cc["@mozilla.org/file/directory_service;1"].
|
||||
getService(Ci.nsIProperties);
|
||||
|
@ -430,41 +461,10 @@ var PlacesOrganizer = {
|
|||
// and makes the alphabetical order of multiple backup files more useful.
|
||||
var date = (new Date).toLocaleFormat("%Y-%m-%d");
|
||||
fp.defaultString = PlacesUtils.getFormattedString("bookmarksBackupFilename",
|
||||
[date]);
|
||||
[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);
|
||||
}
|
||||
if (fp.show() != Ci.nsIFilePicker.returnCancel)
|
||||
PlacesUtils.backupBookmarksToFile(fp.file);
|
||||
},
|
||||
|
||||
_paneDisabled: false,
|
||||
|
@ -567,16 +567,16 @@ var PlacesOrganizer = {
|
|||
var rowCount = this._content.treeBoxObject.view.rowCount;
|
||||
if (rowCount == 0) {
|
||||
selectItemDesc.hidden = true;
|
||||
itemsCountLabel.value = PlacesUtils.getString("detailsPane.noItems");
|
||||
itemsCountLabel.value = PlacesUIUtils.getString("detailsPane.noItems");
|
||||
}
|
||||
else {
|
||||
selectItemDesc.hidden = false;
|
||||
if (rowCount == 1)
|
||||
itemsCountLabel.value = PlacesUtils.getString("detailsPane.oneItem");
|
||||
itemsCountLabel.value = PlacesUIUtils.getString("detailsPane.oneItem");
|
||||
else {
|
||||
itemsCountLabel.value =
|
||||
PlacesUtils.getFormattedString("detailsPane.multipleItems",
|
||||
[rowCount]);
|
||||
PlacesUIUtils.getFormattedString("detailsPane.multipleItems",
|
||||
[rowCount]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -661,9 +661,9 @@ var PlacesOrganizer = {
|
|||
// Prompt the user for a name for the query.
|
||||
// XXX - using prompt service for now; will need to make
|
||||
// a real dialog and localize when we're sure this is the UI we want.
|
||||
var title = PlacesUtils.getString("saveSearch.title");
|
||||
var inputLabel = PlacesUtils.getString("saveSearch.inputLabel");
|
||||
var defaultText = PlacesUtils.getString("saveSearch.defaultText");
|
||||
var title = PlacesUIUtils.getString("saveSearch.title");
|
||||
var inputLabel = PlacesUIUtils.getString("saveSearch.inputLabel");
|
||||
var defaultText = PlacesUIUtils.getString("saveSearch.defaultText");
|
||||
|
||||
var prompts = Cc["@mozilla.org/embedcomp/prompt-service;1"].
|
||||
getService(Ci.nsIPromptService);
|
||||
|
@ -676,11 +676,11 @@ var PlacesOrganizer = {
|
|||
return;
|
||||
|
||||
// Add the place: uri as a bookmark under the bookmarks root.
|
||||
var txn = PlacesUtils.ptm.createItem(placeURI,
|
||||
PlacesUtils.bookmarksMenuFolderId,
|
||||
PlacesUtils.bookmarks.DEFAULT_INDEX,
|
||||
input.value);
|
||||
PlacesUtils.ptm.doTransaction(txn);
|
||||
var txn = PlacesUIUtils.ptm.createItem(placeURI,
|
||||
PlacesUtils.bookmarksMenuFolderId,
|
||||
PlacesUtils.bookmarks.DEFAULT_INDEX,
|
||||
input.value);
|
||||
PlacesUIUtils.ptm.doTransaction(txn);
|
||||
|
||||
// select and load the new query
|
||||
this._places.selectPlaceURI(placeSpec);
|
||||
|
@ -793,8 +793,8 @@ var PlacesSearchBox = {
|
|||
updateCollectionTitle: function PSB_updateCollectionTitle(title) {
|
||||
this.searchFilter.emptyText =
|
||||
title ?
|
||||
PlacesUtils.getFormattedString("searchCurrentDefault", [title]) :
|
||||
PlacesUtils.getString("searchBookmarks");
|
||||
PlacesUIUtils.getFormattedString("searchCurrentDefault", [title]) :
|
||||
PlacesUIUtils.getString("searchBookmarks");
|
||||
},
|
||||
|
||||
/**
|
||||
|
@ -1352,7 +1352,7 @@ var PlacesQueryBuilder = {
|
|||
var selectedFolder = PlacesOrganizer._places.selectedNode.itemId;
|
||||
// note "all bookmarks" isn't the concrete parent of the top-level
|
||||
// bookmark folders
|
||||
if (selectedFolder != PlacesUtils.allBookmarksFolderId) {
|
||||
if (selectedFolder != PlacesUIUtils.allBookmarksFolderId) {
|
||||
PlacesSearchBox.filterCollection = "collection";
|
||||
folders.push(PlacesOrganizer._places.selectedNode.itemId);
|
||||
break;
|
||||
|
@ -1464,8 +1464,8 @@ var ViewMenu = {
|
|||
// see bug #386287 for details
|
||||
var columnId = column.getAttribute("anonid");
|
||||
menuitemPrefix += columnId == "title" ? "name" : columnId;
|
||||
label = PlacesUtils.getString(menuitemPrefix + ".label");
|
||||
var accesskey = PlacesUtils.getString(menuitemPrefix + ".accesskey");
|
||||
label = PlacesUIUtils.getString(menuitemPrefix + ".label");
|
||||
var accesskey = PlacesUIUtils.getString(menuitemPrefix + ".accesskey");
|
||||
menuitem.setAttribute("accesskey", accesskey);
|
||||
}
|
||||
menuitem.setAttribute("label", label);
|
||||
|
|
|
@ -109,7 +109,7 @@
|
|||
<command id="OrganizerCommand_backup"
|
||||
oncommand="PlacesOrganizer.backupBookmarks();"/>
|
||||
<command id="OrganizerCommand_restoreFromFile"
|
||||
oncommand="PlacesOrganizer.restoreFromFile();"/>
|
||||
oncommand="PlacesOrganizer.onRestoreBookmarksFromFile();"/>
|
||||
<command id="OrganizerCommand_search:save"
|
||||
oncommand="PlacesOrganizer.saveSearch();"/>
|
||||
<command id="OrganizerCommand_search:moreCriteria"
|
||||
|
|
|
@ -94,7 +94,7 @@
|
|||
</commandset>
|
||||
|
||||
<popup id="placesContext"
|
||||
onpopupshowing="this._view = PlacesUtils.getViewForNode(document.popupNode);
|
||||
onpopupshowing="this._view = PlacesUIUtils.getViewForNode(document.popupNode);
|
||||
return this._view.buildContextMenu(this);"
|
||||
onpopuphiding="this._view.destroyContextMenu();">
|
||||
<menuitem id="placesContext_open"
|
||||
|
@ -117,7 +117,7 @@
|
|||
selectiontype="single"
|
||||
selection="link"/>
|
||||
<menuitem id="placesContext_openContainer:tabs"
|
||||
oncommand="var view = PlacesUtils.getViewForNode(document.popupNode);
|
||||
oncommand="var view = PlacesUIUtils.getViewForNode(document.popupNode);
|
||||
view.controller.openSelectionInTabs(event);"
|
||||
onclick="checkForMiddleClick(this, event);"
|
||||
label="&cmd.open_all_in_tabs.label;"
|
||||
|
@ -125,7 +125,7 @@
|
|||
selectiontype="single"
|
||||
selection="folder|host|query"/>
|
||||
<menuitem id="placesContext_openLinks:tabs"
|
||||
oncommand="var view = PlacesUtils.getViewForNode(document.popupNode);
|
||||
oncommand="var view = PlacesUIUtils.getViewForNode(document.popupNode);
|
||||
view.controller.openSelectionInTabs(event);"
|
||||
onclick="checkForMiddleClick(this, event);"
|
||||
label="&cmd.open_all_in_tabs.label;"
|
||||
|
|
|
@ -67,13 +67,13 @@ var SidebarUtils = {
|
|||
// do this *before* attempting to load the link since openURL uses
|
||||
// selection as an indication of which link to load.
|
||||
tbo.view.selection.select(row.value);
|
||||
PlacesUtils.openNodeWithEvent(aTree.selectedNode, aEvent);
|
||||
PlacesUIUtils.openNodeWithEvent(aTree.selectedNode, aEvent);
|
||||
}
|
||||
},
|
||||
|
||||
handleTreeKeyPress: function SU_handleTreeKeyPress(aEvent) {
|
||||
if (aEvent.keyCode == KeyEvent.DOM_VK_RETURN)
|
||||
PlacesUtils.openNodeWithEvent(aEvent.target.selectedNode, aEvent);
|
||||
PlacesUIUtils.openNodeWithEvent(aEvent.target.selectedNode, aEvent);
|
||||
},
|
||||
|
||||
/**
|
||||
|
|
|
@ -558,7 +558,7 @@
|
|||
break;
|
||||
}
|
||||
}
|
||||
var title = PlacesUtils.getBestTitle(aNode);
|
||||
var title = PlacesUIUtils.getBestTitle(aNode);
|
||||
}
|
||||
|
||||
if (PlacesUtils.nodeIsSeparator(aNode)) {
|
||||
|
@ -909,7 +909,7 @@
|
|||
|
||||
getSupportedFlavours: function TBV_DO_getSupportedFlavours() {
|
||||
var flavorSet = new FlavourSet();
|
||||
var types = PlacesUtils.GENERIC_VIEW_DROP_TYPES;
|
||||
var types = PlacesUIUtils.GENERIC_VIEW_DROP_TYPES;
|
||||
for (var i = 0; i < types.length; ++i)
|
||||
flavorSet.appendFlavour(types[i]);
|
||||
return flavorSet;
|
||||
|
@ -968,7 +968,7 @@
|
|||
return;
|
||||
}
|
||||
|
||||
var label = PlacesUtils.getString("bookmarksMenuEmptyFolder");
|
||||
var label = PlacesUIUtils.getString("bookmarksMenuEmptyFolder");
|
||||
aPopup._emptyMenuItem = document.createElement("menuitem");
|
||||
aPopup._emptyMenuItem.setAttribute("label", label);
|
||||
aPopup._emptyMenuItem.setAttribute("disabled", true);
|
||||
|
@ -982,7 +982,7 @@
|
|||
<parameter name="aBefore"/>
|
||||
<body><![CDATA[
|
||||
var element =
|
||||
PlacesUtils.createMenuItemForNode(aChild, this._containerNodesMap);
|
||||
PlacesUIUtils.createMenuItemForNode(aChild, this._containerNodesMap);
|
||||
|
||||
if (aBefore)
|
||||
aParentPopup.insertBefore(element, aBefore);
|
||||
|
|
|
@ -711,7 +711,7 @@
|
|||
<method name="getSupportedFlavours">
|
||||
<body><![CDATA[
|
||||
var flavorSet = new FlavourSet();
|
||||
var types = PlacesUtils.GENERIC_VIEW_DROP_TYPES;
|
||||
var types = PlacesUIUtils.GENERIC_VIEW_DROP_TYPES;
|
||||
for (var i = 0; i < types.length; ++i)
|
||||
flavorSet.appendFlavour(types[i]);
|
||||
return flavorSet;
|
||||
|
|
|
@ -192,8 +192,8 @@ PlacesTreeView.prototype = {
|
|||
if (!aContainer.containerOpen)
|
||||
return; // nothing to do
|
||||
|
||||
const openLiteral = PlacesUtils.RDF.GetResource("http://home.netscape.com/NC-rdf#open");
|
||||
const trueLiteral = PlacesUtils.RDF.GetLiteral("true");
|
||||
const openLiteral = PlacesUIUtils.RDF.GetResource("http://home.netscape.com/NC-rdf#open");
|
||||
const trueLiteral = PlacesUIUtils.RDF.GetLiteral("true");
|
||||
|
||||
var cc = aContainer.childCount;
|
||||
for (var i=0; i < cc; i++) {
|
||||
|
@ -219,8 +219,8 @@ PlacesTreeView.prototype = {
|
|||
|
||||
var resource = this._getResourceForNode(curChild);
|
||||
var isopen = resource != null &&
|
||||
PlacesUtils.localStore.HasAssertion(resource, openLiteral,
|
||||
trueLiteral, true);
|
||||
PlacesUIUtils.localStore.HasAssertion(resource, openLiteral,
|
||||
trueLiteral, true);
|
||||
if (isopen != curChild.containerOpen)
|
||||
aToOpen.push(curChild);
|
||||
else if (curChild.containerOpen && curChild.childCount > 0)
|
||||
|
@ -834,7 +834,7 @@ PlacesTreeView.prototype = {
|
|||
{
|
||||
var uri = aNode.uri;
|
||||
NS_ASSERT(uri, "if there is no uri, we can't persist the open state");
|
||||
return uri ? PlacesUtils.RDF.GetResource(uri) : null;
|
||||
return uri ? PlacesUIUtils.RDF.GetResource(uri) : null;
|
||||
},
|
||||
|
||||
// nsITreeView
|
||||
|
@ -1131,7 +1131,7 @@ PlacesTreeView.prototype = {
|
|||
// if they go through the "result" API.
|
||||
if (PlacesUtils.nodeIsSeparator(node))
|
||||
return "";
|
||||
return PlacesUtils.getBestTitle(node);
|
||||
return PlacesUIUtils.getBestTitle(node);
|
||||
case this.COLUMN_TYPE_TAGS:
|
||||
return node.tags;
|
||||
case this.COLUMN_TYPE_URI:
|
||||
|
@ -1205,13 +1205,13 @@ PlacesTreeView.prototype = {
|
|||
|
||||
var resource = this._getResourceForNode(node);
|
||||
if (resource) {
|
||||
const openLiteral = PlacesUtils.RDF.GetResource("http://home.netscape.com/NC-rdf#open");
|
||||
const trueLiteral = PlacesUtils.RDF.GetLiteral("true");
|
||||
const openLiteral = PlacesUIUtils.RDF.GetResource("http://home.netscape.com/NC-rdf#open");
|
||||
const trueLiteral = PlacesUIUtils.RDF.GetLiteral("true");
|
||||
|
||||
if (node.containerOpen)
|
||||
PlacesUtils.localStore.Unassert(resource, openLiteral, trueLiteral);
|
||||
PlacesUIUtils.localStore.Unassert(resource, openLiteral, trueLiteral);
|
||||
else
|
||||
PlacesUtils.localStore.Assert(resource, openLiteral, trueLiteral, true);
|
||||
PlacesUIUtils.localStore.Assert(resource, openLiteral, trueLiteral, true);
|
||||
}
|
||||
|
||||
node.containerOpen = !node.containerOpen;
|
||||
|
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -383,10 +383,10 @@ protected:
|
|||
// importing bookmarks.html files.
|
||||
PRBool mAllowRootChanges;
|
||||
|
||||
// if set, this is an import of initial bookmarks.html content,
|
||||
// If set, this is an import of initial bookmarks.html content,
|
||||
// so we don't want to kick off HTTP traffic
|
||||
// and we want the imported personal toolbar folder
|
||||
// to be set as the personal toolbar folder. (if not set
|
||||
// to be set as the personal toolbar folder. (If not set
|
||||
// we will treat it as a normal folder.)
|
||||
PRBool mIsImportDefaults;
|
||||
|
||||
|
@ -2448,9 +2448,7 @@ nsPlacesImportExportService::ExportHTMLToFile(nsILocalFile* aBookmarksFile)
|
|||
return rv;
|
||||
}
|
||||
|
||||
#define BROWSER_BOOKMARKS_OVERWRITE_PREF "browser.bookmarks.overwrite"
|
||||
#define BROWSER_BOOKMARKS_MAX_BACKUPS_PREF "browser.bookmarks.max_backups"
|
||||
#define POSTPLACES_BOOKMARKS_FILE "bookmarks.postplaces.html"
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsPlacesImportExportService::BackupBookmarksFile()
|
||||
|
@ -2466,15 +2464,6 @@ nsPlacesImportExportService::BackupBookmarksFile()
|
|||
rv = NS_GetSpecialDirectory(NS_APP_BOOKMARKS_50_FILE,
|
||||
getter_AddRefs(bookmarksFileDir));
|
||||
|
||||
PRBool overwriteBookmarks;
|
||||
rv = prefs->GetBoolPref(BROWSER_BOOKMARKS_OVERWRITE_PREF, &overwriteBookmarks);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
if (!overwriteBookmarks) {
|
||||
rv = bookmarksFileDir->SetLeafName(NS_LITERAL_STRING(POSTPLACES_BOOKMARKS_FILE));
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
}
|
||||
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
nsCOMPtr<nsILocalFile> bookmarksFile(do_QueryInterface(bookmarksFileDir));
|
||||
|
||||
|
@ -2491,17 +2480,6 @@ nsPlacesImportExportService::BackupBookmarksFile()
|
|||
rv = ExportHTMLToFile(bookmarksFile);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
// archive if needed
|
||||
PRInt32 numberOfBackups;
|
||||
rv = prefs->GetIntPref(BROWSER_BOOKMARKS_MAX_BACKUPS_PREF, &numberOfBackups);
|
||||
if (NS_FAILED(rv))
|
||||
numberOfBackups = 5;
|
||||
|
||||
if (numberOfBackups > 0) {
|
||||
rv = ArchiveBookmarksFile(numberOfBackups, PR_FALSE);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
@ -2517,7 +2495,7 @@ nsPlacesImportExportService::BackupBookmarksFile()
|
|||
*/
|
||||
nsresult
|
||||
nsPlacesImportExportService::ArchiveBookmarksFile(PRInt32 numberOfBackups,
|
||||
PRBool forceArchive)
|
||||
PRBool forceArchive)
|
||||
{
|
||||
nsCOMPtr<nsIFile> bookmarksBackupDir;
|
||||
nsresult rv = NS_GetSpecialDirectory(NS_APP_USER_PROFILE_50_DIR,
|
||||
|
@ -2538,7 +2516,7 @@ nsPlacesImportExportService::ArchiveBookmarksFile(PRInt32 numberOfBackups,
|
|||
}
|
||||
|
||||
// construct the new leafname
|
||||
PRTime now64 = PR_Now();
|
||||
PRTime now64 = PR_Now();
|
||||
PRExplodedTime nowInfo;
|
||||
PR_ExplodeTime(now64, PR_LocalTimeParameters, &nowInfo);
|
||||
PR_NormalizeTime(&nowInfo, PR_LocalTimeParameters);
|
||||
|
@ -2549,8 +2527,6 @@ nsPlacesImportExportService::ArchiveBookmarksFile(PRInt32 numberOfBackups,
|
|||
// and makes the alphabetical order of multiple backup files more useful.
|
||||
PR_FormatTime(timeString, 128, "bookmarks-%Y-%m-%d.html", &nowInfo);
|
||||
|
||||
//nsCAutoString backupFilenameCString(timeString);
|
||||
//nsAutoString backupFilenameString = NS_ConvertUTF8toUTF16(backupFilenameCString);
|
||||
nsAutoString backupFilenameString = NS_ConvertUTF8toUTF16((timeString));
|
||||
|
||||
nsCOMPtr<nsIFile> backupFile;
|
||||
|
@ -2617,18 +2593,6 @@ nsPlacesImportExportService::ArchiveBookmarksFile(PRInt32 numberOfBackups,
|
|||
getter_AddRefs(bookmarksFile));
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
nsCOMPtr<nsIPrefBranch> prefs(do_GetService(NS_PREFSERVICE_CONTRACTID, &rv));
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
PRBool overwriteBookmarks;
|
||||
rv = prefs->GetBoolPref(BROWSER_BOOKMARKS_OVERWRITE_PREF, &overwriteBookmarks);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
if (!overwriteBookmarks) {
|
||||
rv = bookmarksFile->SetLeafName(NS_LITERAL_STRING(POSTPLACES_BOOKMARKS_FILE));
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
}
|
||||
|
||||
rv = bookmarksFile->CopyTo(bookmarksBackupDir, backupFilenameString);
|
||||
// at least dump something out in case this fails in a debug build
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
|
|
@ -37,18 +37,24 @@
|
|||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
|
||||
let Ci = Components.interfaces;
|
||||
let Cc = Components.classes;
|
||||
let Cr = Components.results;
|
||||
|
||||
const loadInSidebarAnno = "bookmarkProperties/loadInSidebar";
|
||||
const descriptionAnno = "bookmarkProperties/description";
|
||||
const CLASS_ID = Components.ID("c0844a84-5a12-4808-80a8-809cb002bb4f");
|
||||
const CONTRACT_ID = "@mozilla.org/browser/placesTransactionsService;1";
|
||||
|
||||
var loader = Components.classes["@mozilla.org/moz/jssubscript-loader;1"].
|
||||
getService(Components.interfaces.mozIJSSubScriptLoader);
|
||||
loader.loadSubScript("chrome://global/content/debug.js");
|
||||
loader.loadSubScript("chrome://browser/content/places/utils.js");
|
||||
|
||||
Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
|
||||
|
||||
__defineGetter__("PlacesUtils", function() {
|
||||
delete this.PlacesUtils
|
||||
var tmpScope = {};
|
||||
Components.utils.import("resource://gre/modules/utils.js", tmpScope);
|
||||
return this.PlacesUtils = tmpScope.PlacesUtils;
|
||||
});
|
||||
|
||||
// The minimum amount of transactions we should tell our observers to begin
|
||||
// batching (rather than letting them do incremental drawing).
|
||||
const MIN_TRANSACTIONS_FOR_BATCH = 5;
|
||||
|
@ -442,11 +448,9 @@ placesCreateLivemarkTransactions.prototype = {
|
|||
};
|
||||
|
||||
function placesMoveItemTransactions(aItemId, aNewContainer, aNewIndex) {
|
||||
NS_ASSERT(aNewIndex >= -1, "invalid insertion index");
|
||||
this._id = aItemId;
|
||||
this._oldContainer = PlacesUtils.bookmarks.getFolderIdForItem(this._id);
|
||||
this._oldIndex = PlacesUtils.bookmarks.getItemIndex(this._id);
|
||||
NS_ASSERT(this._oldContainer > 0 && this._oldIndex >= 0, "invalid item");
|
||||
this._newContainer = aNewContainer;
|
||||
this._newIndex = aNewIndex;
|
||||
this.redoTransaction = this.doTransaction;
|
||||
|
|
|
@ -37,6 +37,8 @@
|
|||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
|
||||
version(170);
|
||||
|
||||
const NS_APP_USER_PROFILE_50_DIR = "ProfD";
|
||||
var Ci = Components.interfaces;
|
||||
var Cc = Components.classes;
|
||||
|
|
|
@ -36,7 +36,278 @@
|
|||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
|
||||
const LOAD_IN_SIDEBAR_ANNO = "bookmarkProperties/loadInSidebar";
|
||||
const DESCRIPTION_ANNO = "bookmarkProperties/description";
|
||||
const POST_DATA_ANNO = "bookmarkProperties/POSTData";
|
||||
const LAST_CHARSET_ANNO = "URIProperties/characterSet";
|
||||
|
||||
Components.utils.import("resource://gre/modules/utils.js");
|
||||
do_check_eq(typeof PlacesUtils, "object");
|
||||
|
||||
// main
|
||||
function run_test() {
|
||||
// XXX test disabled due to backout of bug 384370
|
||||
return;
|
||||
/*
|
||||
HTML+FEATURES SUMMARY:
|
||||
- import legacy bookmarks
|
||||
- export as json, import, test (tests integrity of html > json)
|
||||
- export as html, import, test (tests integrity of json > html)
|
||||
|
||||
BACKUP/RESTORE SUMMARY:
|
||||
- create a bookmark in each root
|
||||
- tag multiple URIs with multiple tags
|
||||
- export as json, import, test
|
||||
*/
|
||||
|
||||
// get places import/export service
|
||||
var importer = Cc["@mozilla.org/browser/places/import-export-service;1"].getService(Ci.nsIPlacesImportExportService);
|
||||
|
||||
// avoid creating the places smart folder during tests
|
||||
Cc["@mozilla.org/preferences-service;1"].getService(Ci.nsIPrefBranch).
|
||||
setBoolPref("browser.places.createdSmartBookmarks", true);
|
||||
|
||||
// file pointer to legacy bookmarks file
|
||||
//var bookmarksFileOld = do_get_file("browser/components/places/tests/unit/bookmarks.large.html");
|
||||
var bookmarksFileOld = do_get_file("browser/components/places/tests/unit/bookmarks.preplaces.html");
|
||||
// file pointer to a new places-exported json file
|
||||
var jsonFile = dirSvc.get("ProfD", Ci.nsILocalFile);
|
||||
jsonFile.append("bookmarks.exported.json");
|
||||
|
||||
// create bookmarks.exported.json
|
||||
if (jsonFile.exists())
|
||||
jsonFile.remove(false);
|
||||
jsonFile.create(Ci.nsILocalFile.NORMAL_FILE_TYPE, 0600);
|
||||
if (!jsonFile.exists())
|
||||
do_throw("couldn't create file: bookmarks.exported.json");
|
||||
|
||||
// Test importing a pre-Places canonical bookmarks file.
|
||||
// 1. import bookmarks.preplaces.html
|
||||
// 2. run the test-suite
|
||||
// Note: we do not empty the db before this import to catch bugs like 380999
|
||||
try {
|
||||
importer.importHTMLFromFile(bookmarksFileOld, true);
|
||||
} catch(ex) { do_throw("couldn't import legacy bookmarks file: " + ex); }
|
||||
populate();
|
||||
validate();
|
||||
|
||||
// Test exporting a Places canonical json file.
|
||||
// 1. export to bookmarks.exported.json
|
||||
// 2. empty bookmarks db
|
||||
// 3. import bookmarks.exported.json
|
||||
// 4. run the test-suite
|
||||
try {
|
||||
PlacesUtils.backupBookmarksToFile(jsonFile);
|
||||
} catch(ex) { do_throw("couldn't export to file: " + ex); }
|
||||
LOG("exported json");
|
||||
try {
|
||||
PlacesUtils.restoreBookmarksFromFile(jsonFile);
|
||||
} catch(ex) { do_throw("couldn't import the exported file: " + ex); }
|
||||
LOG("imported json");
|
||||
validate();
|
||||
LOG("validated import");
|
||||
}
|
||||
|
||||
var tagData = [
|
||||
{ uri: uri("http://slint.us"), tags: ["indie", "kentucky", "music"] },
|
||||
{ uri: uri("http://en.wikipedia.org/wiki/Diplodocus"), tags: ["dinosaur", "dj", "rad word"] }
|
||||
];
|
||||
|
||||
var bookmarkData = [
|
||||
{ uri: uri("http://slint.us"), title: "indie, kentucky, music" },
|
||||
{ uri: uri("http://en.wikipedia.org/wiki/Diplodocus"), title: "dinosaur, dj, rad word" }
|
||||
];
|
||||
|
||||
/*
|
||||
populate data in each folder
|
||||
(menu is populated via the html import)
|
||||
*/
|
||||
function populate() {
|
||||
// add tags
|
||||
for each(let {uri: u, tags: t} in tagData)
|
||||
PlacesUtils.tagging.tagURI(u, t);
|
||||
|
||||
// add unfiled bookmarks
|
||||
for each(let {uri: u, title: t} in bookmarkData) {
|
||||
PlacesUtils.bookmarks.insertBookmark(PlacesUtils.bookmarks.unfiledBookmarksFolder,
|
||||
u, PlacesUtils.bookmarks.DEFAULT_INDEX, t);
|
||||
}
|
||||
|
||||
// add to the toolbar
|
||||
for each(let {uri: u, title: t} in bookmarkData) {
|
||||
PlacesUtils.bookmarks.insertBookmark(PlacesUtils.bookmarks.toolbarFolder,
|
||||
u, PlacesUtils.bookmarks.DEFAULT_INDEX, t);
|
||||
}
|
||||
}
|
||||
|
||||
function validate() {
|
||||
testCanonicalBookmarks(PlacesUtils.bookmarks.bookmarksMenuFolder);
|
||||
testToolbarFolder();
|
||||
testUnfiledBookmarks();
|
||||
testTags();
|
||||
}
|
||||
|
||||
// Tests a bookmarks datastore that has a set of bookmarks, etc
|
||||
// that flex each supported field and feature.
|
||||
function testCanonicalBookmarks() {
|
||||
// query to see if the deleted folder and items have been imported
|
||||
var query = PlacesUtils.history.getNewQuery();
|
||||
query.setFolders([PlacesUtils.bookmarks.bookmarksMenuFolder], 1);
|
||||
var result = PlacesUtils.history.executeQuery(query, PlacesUtils.history.getNewQueryOptions());
|
||||
var rootNode = result.root;
|
||||
rootNode.containerOpen = true;
|
||||
|
||||
// 6-2: the toolbar contents are imported to the places-toolbar folder,
|
||||
// the separator above it is removed.
|
||||
do_check_eq(rootNode.childCount, 4);
|
||||
|
||||
// get test folder
|
||||
var testFolder = rootNode.getChild(3);
|
||||
do_check_eq(testFolder.type, testFolder.RESULT_TYPE_FOLDER);
|
||||
do_check_eq(testFolder.title, "test");
|
||||
|
||||
/*
|
||||
// add date
|
||||
do_check_eq(PlacesUtils.bookmarks.getItemDateAdded(testFolder.itemId)/1000000, 1177541020);
|
||||
// last modified
|
||||
do_check_eq(PlacesUtils.bookmarks.getItemLastModified(testFolder.itemId)/1000000, 1177541050);
|
||||
*/
|
||||
|
||||
testFolder = testFolder.QueryInterface(Ci.nsINavHistoryQueryResultNode);
|
||||
do_check_eq(testFolder.hasChildren, true);
|
||||
// folder description
|
||||
do_check_true(PlacesUtils.annotations.itemHasAnnotation(testFolder.itemId,
|
||||
DESCRIPTION_ANNO));
|
||||
do_check_eq("folder test comment",
|
||||
PlacesUtils.annotations.getItemAnnotation(testFolder.itemId, DESCRIPTION_ANNO));
|
||||
// open test folder, and test the children
|
||||
testFolder.containerOpen = true;
|
||||
var cc = testFolder.childCount;
|
||||
// XXX Bug 380468
|
||||
// do_check_eq(cc, 2);
|
||||
do_check_eq(cc, 1);
|
||||
|
||||
// test bookmark 1
|
||||
var testBookmark1 = testFolder.getChild(0);
|
||||
// url
|
||||
do_check_eq("http://test/post", testBookmark1.uri);
|
||||
// title
|
||||
do_check_eq("test post keyword", testBookmark1.title);
|
||||
// keyword
|
||||
do_check_eq("test", PlacesUtils.bookmarks.getKeywordForBookmark(testBookmark1.itemId));
|
||||
// sidebar
|
||||
do_check_true(PlacesUtils.annotations.itemHasAnnotation(testBookmark1.itemId,
|
||||
LOAD_IN_SIDEBAR_ANNO));
|
||||
/*
|
||||
// add date
|
||||
do_check_eq(testBookmark1.dateAdded/1000000, 1177375336);
|
||||
|
||||
// last modified
|
||||
do_check_eq(testBookmark1.lastModified/1000000, 1177375423);
|
||||
*/
|
||||
|
||||
// post data
|
||||
do_check_true(PlacesUtils.annotations.itemHasAnnotation(testBookmark1.itemId, POST_DATA_ANNO));
|
||||
do_check_eq("hidden1%3Dbar&text1%3D%25s",
|
||||
PlacesUtils.annotations.getItemAnnotation(testBookmark1.itemId, POST_DATA_ANNO));
|
||||
|
||||
// last charset
|
||||
do_check_true(PlacesUtils.annotations.itemHasAnnotation(testBookmark1.itemId, LAST_CHARSET_ANNO));
|
||||
do_check_eq("ISO-8859-1", PlacesUtils.annotations.getItemAnnotation(testBookmark1.itemId,
|
||||
LAST_CHARSET_ANNO));
|
||||
// description
|
||||
do_check_true(PlacesUtils.annotations.itemHasAnnotation(testBookmark1.itemId,
|
||||
DESCRIPTION_ANNO));
|
||||
do_check_eq("item description",
|
||||
PlacesUtils.annotations.getItemAnnotation(testBookmark1.itemId,
|
||||
DESCRIPTION_ANNO));
|
||||
|
||||
/*
|
||||
// XXX Bug 380468
|
||||
// test bookmark 2
|
||||
var testBookmark2 = testFolder.getChild(1);
|
||||
// url
|
||||
do_check_eq("http://test/micsum", testBookmark2.uri);
|
||||
// title
|
||||
do_check_eq("test microsummary", testBookmark2.title);
|
||||
// check that it's a microsummary
|
||||
var micsum = mssvc.getMicrosummary(testBookmark2.itemId);
|
||||
if (!micsum)
|
||||
do_throw("Could not import microsummary");
|
||||
// check generator uri
|
||||
var generator = micsum.generator;
|
||||
do_check_eq("urn:source:http://dietrich.ganx4.com/mozilla/test-microsummary.xml", generator.uri.spec);
|
||||
// expiration and generated title can change, so don't test them
|
||||
*/
|
||||
|
||||
// clean up
|
||||
testFolder.containerOpen = false;
|
||||
rootNode.containerOpen = false;
|
||||
}
|
||||
|
||||
function testToolbarFolder() {
|
||||
var query = PlacesUtils.history.getNewQuery();
|
||||
query.setFolders([PlacesUtils.bookmarks.toolbarFolder], 1);
|
||||
var result = PlacesUtils.history.executeQuery(query, PlacesUtils.history.getNewQueryOptions());
|
||||
|
||||
var toolbar = result.root;
|
||||
toolbar.containerOpen = true;
|
||||
|
||||
// child count (add 2 for pre-existing items)
|
||||
do_check_eq(toolbar.childCount, bookmarkData.length + 2);
|
||||
|
||||
// livemark
|
||||
var livemark = toolbar.getChild(1);
|
||||
// title
|
||||
do_check_eq("Latest Headlines", livemark.title);
|
||||
// livemark check
|
||||
do_check_true(PlacesUtils.livemarks.isLivemark(livemark.itemId));
|
||||
// site url
|
||||
do_check_eq("http://en-us.fxfeeds.mozilla.com/en-US/firefox/livebookmarks/",
|
||||
PlacesUtils.livemarks.getSiteURI(livemark.itemId).spec);
|
||||
// feed url
|
||||
do_check_eq("http://en-us.fxfeeds.mozilla.com/en-US/firefox/headlines.xml",
|
||||
PlacesUtils.livemarks.getFeedURI(livemark.itemId).spec);
|
||||
|
||||
// test added bookmark data
|
||||
var child = toolbar.getChild(2);
|
||||
do_check_eq(child.uri, bookmarkData[0].uri.spec);
|
||||
do_check_eq(child.title, bookmarkData[0].title);
|
||||
child = toolbar.getChild(3);
|
||||
do_check_eq(child.uri, bookmarkData[1].uri.spec);
|
||||
do_check_eq(child.title, bookmarkData[1].title);
|
||||
|
||||
toolbar.containerOpen = false;
|
||||
}
|
||||
|
||||
function testUnfiledBookmarks() {
|
||||
var query = PlacesUtils.history.getNewQuery();
|
||||
query.setFolders([PlacesUtils.bookmarks.unfiledBookmarksFolder], 1);
|
||||
var result = PlacesUtils.history.executeQuery(query, PlacesUtils.history.getNewQueryOptions());
|
||||
var rootNode = result.root;
|
||||
rootNode.containerOpen = true;
|
||||
do_check_eq(rootNode.childCount, bookmarkData.length);
|
||||
for (var i = 0; i < rootNode.childCount; i++) {
|
||||
var child = rootNode.getChild(i);
|
||||
dump(bookmarkData[i].uri.spec + " == " + child.uri + "?\n");
|
||||
do_check_true(bookmarkData[i].uri.equals(uri(child.uri)));
|
||||
do_check_eq(child.title, bookmarkData[i].title);
|
||||
/* WTF
|
||||
if (child.tags)
|
||||
do_check_eq(child.tags, bookmarkData[i].title);
|
||||
*/
|
||||
}
|
||||
rootNode.containerOpen = false;
|
||||
}
|
||||
|
||||
function testTags() {
|
||||
for each(let {uri: u, tags: t} in tagData) {
|
||||
var i = 0;
|
||||
dump("test tags for " + u.spec + ": " + t + "\n");
|
||||
var tt = PlacesUtils.tagging.getTagsForURI(u, {});
|
||||
dump("true tags for " + u.spec + ": " + tt + "\n");
|
||||
do_check_true(t.every(function(el) {
|
||||
i++;
|
||||
return tt.indexOf(el) > -1;
|
||||
}));
|
||||
do_check_eq(i, t.length);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -36,12 +36,7 @@
|
|||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
|
||||
version(170);
|
||||
|
||||
var loader = Cc["@mozilla.org/moz/jssubscript-loader;1"].
|
||||
getService(Ci.mozIJSSubScriptLoader);
|
||||
loader.loadSubScript("chrome://global/content/debug.js");
|
||||
loader.loadSubScript("chrome://browser/content/places/utils.js");
|
||||
Components.utils.import("resource://gre/modules/utils.js");
|
||||
|
||||
const bmsvc = PlacesUtils.bookmarks;
|
||||
const testFolderId = PlacesUtils.bookmarksMenuFolderId;
|
||||
|
|
|
@ -78,7 +78,6 @@ try {
|
|||
do_throw("Could not get io service\n");
|
||||
}
|
||||
|
||||
|
||||
const DESCRIPTION_ANNO = "bookmarkProperties/description";
|
||||
const LOAD_IN_SIDEBAR_ANNO = "bookmarkProperties/loadInSidebar";
|
||||
const POST_DATA_ANNO = "bookmarkProperties/POSTData";
|
||||
|
|
|
@ -129,7 +129,7 @@ function (aTitle, aContentURL, aCustomizeURL, aPersist)
|
|||
}
|
||||
catch(ex) { return; }
|
||||
|
||||
win.PlacesUtils.showMinimalAddBookmarkUI(uri, aTitle, null, null, true, true);
|
||||
win.PlacesUIUtils.showMinimalAddBookmarkUI(uri, aTitle, null, null, true, true);
|
||||
}
|
||||
|
||||
nsSidebar.prototype.validateSearchEngine =
|
||||
|
|
|
@ -105,4 +105,8 @@ EXTRA_PP_COMPONENTS = nsLivemarkService.js \
|
|||
nsTaggingService.js \
|
||||
$(NULL)
|
||||
|
||||
EXTRA_JS_MODULES = utils.js
|
||||
|
||||
EXTRA_PP_JS_MODULES = utils.js
|
||||
|
||||
include $(topsrcdir)/config/rules.mk
|
||||
|
|
|
@ -194,13 +194,14 @@ TaggingService.prototype = {
|
|||
* the item-id of the tag element under the tags root
|
||||
*/
|
||||
_removeTagIfEmpty: function TS__removeTagIfEmpty(aTagId) {
|
||||
var options = this._history.getNewQueryOptions();
|
||||
var query = this._history.getNewQuery();
|
||||
query.setFolders([aTagId], 1);
|
||||
var result = this._history.executeQuery(query, options);
|
||||
var rootNode = result.root;
|
||||
rootNode.containerOpen = true;
|
||||
if (rootNode.childCount == 0)
|
||||
var node = this._getTagNode(aTagId).QueryInterface(Ci.nsINavHistoryContainerResultNode);
|
||||
var wasOpen = node.containerOpen;
|
||||
if (!wasOpen)
|
||||
node.containerOpen = true;
|
||||
var cc = node.childCount;
|
||||
if (wasOpen)
|
||||
node.containerOpen = false;
|
||||
if (cc == 0)
|
||||
this._bms.removeFolder(aTagId);
|
||||
},
|
||||
|
||||
|
|
|
@ -49,7 +49,12 @@ var Ci = Components.interfaces;
|
|||
var Cc = Components.classes;
|
||||
var Cr = Components.results;
|
||||
|
||||
Components.utils.import("resource://gre/modules/debug.js");
|
||||
__defineGetter__("NS_ASSERT", function() {
|
||||
delete this.NS_ASSERT;
|
||||
var tmpScope = {};
|
||||
Components.utils.import("resource://gre/modules/debug.js", tmpScope);
|
||||
return this.NS_ASSERT = tmpScope.NS_ASSERT;
|
||||
});
|
||||
|
||||
const POST_DATA_ANNO = "bookmarkProperties/POSTData";
|
||||
const LMANNO_FEEDURI = "livemark/feedURI";
|
||||
|
@ -1320,10 +1325,23 @@ var PlacesUtils = {
|
|||
return; // XXX
|
||||
|
||||
// init stream
|
||||
var stream = Cc["@mozilla.org/network/safe-file-output-stream;1"].
|
||||
var stream = Cc["@mozilla.org/network/file-output-stream;1"].
|
||||
createInstance(Ci.nsIFileOutputStream);
|
||||
stream.init(aFile, 0x02 | 0x08 | 0x20, 0600, 0);
|
||||
|
||||
// utf-8 converter stream
|
||||
var converter = Cc["@mozilla.org/intl/converter-output-stream;1"].
|
||||
createInstance(Ci.nsIConverterOutputStream);
|
||||
converter.init(stream, "UTF-8", 0, 0x0000);
|
||||
|
||||
// weep over stream interface variance
|
||||
var streamProxy = {
|
||||
converter: converter,
|
||||
write: function(aData, aLen) {
|
||||
this.converter.writeString(aData);
|
||||
}
|
||||
};
|
||||
|
||||
// query places root
|
||||
var options = this.history.getNewQueryOptions();
|
||||
options.expandQueries = false;
|
||||
|
@ -1332,14 +1350,12 @@ var PlacesUtils = {
|
|||
var result = this.history.executeQuery(query, options);
|
||||
result.root.containerOpen = true;
|
||||
// serialize as JSON, write to stream
|
||||
this.serializeNodeAsJSONToOutputStream(result.root, stream);
|
||||
this.serializeNodeAsJSONToOutputStream(result.root, streamProxy);
|
||||
result.root.containerOpen = false;
|
||||
|
||||
// close stream
|
||||
if (stream instanceof Ci.nsISafeOutputStream)
|
||||
stream.finish();
|
||||
else
|
||||
stream.close();
|
||||
// close converter and stream
|
||||
converter.close();
|
||||
stream.close();
|
||||
},
|
||||
|
||||
/**
|
||||
|
|
|
@ -51,6 +51,9 @@ ifdef ENABLE_TESTS
|
|||
DIRS += tests
|
||||
endif
|
||||
|
||||
EXTRA_JS_MODULES = debug.js
|
||||
EXTRA_PP_JS_MODULES = debug.js
|
||||
|
||||
include $(topsrcdir)/config/rules.mk
|
||||
|
||||
distclean::
|
||||
|
|
|
@ -42,6 +42,8 @@
|
|||
# This file contains functions that are useful for debugging purposes from
|
||||
# within JavaScript code.
|
||||
|
||||
var EXPORTED_SYMBOLS = ["NS_ASSERT"];
|
||||
|
||||
var gTraceOnAssert = true;
|
||||
|
||||
/**
|
||||
|
|
|
@ -196,4 +196,9 @@ function FillInTooltip ( tipElement )
|
|||
return retVal;
|
||||
}
|
||||
|
||||
#include debug.js
|
||||
__defineGetter__("NS_ASSERT", function() {
|
||||
delete this.NS_ASSERT;
|
||||
var tmpScope = {};
|
||||
Components.utils.import("resource://gre/modules/debug.js", tmpScope);
|
||||
return this.NS_ASSERT = tmpScope.NS_ASSERT;
|
||||
});
|
||||
|
|
|
@ -11,7 +11,6 @@ toolkit.jar:
|
|||
* content/global/about.xhtml (about.xhtml)
|
||||
content/global/plugins.html
|
||||
content/global/plugins.css
|
||||
* content/global/debug.js (debug.js)
|
||||
+ content/global/buildconfig.html (buildconfig.html)
|
||||
+ content/global/charsetOverlay.js (charsetOverlay.js)
|
||||
+ content/global/charsetOverlay.xul (charsetOverlay.xul)
|
||||
|
|
Загрузка…
Ссылка в новой задаче