gecko/browser/metro/base/content/bookmarks.js

77 lines
2.4 KiB
JavaScript

/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
'use strict';
/**
* Utility singleton for manipulating bookmarks.
*/
var Bookmarks = {
get metroRoot() {
return PlacesUtils.annotations.getItemsWithAnnotation('metro/bookmarksRoot', {})[0];
},
logging: false,
log: function(msg) {
if (this.logging) {
Services.console.logStringMessage(msg);
}
},
addForURI: function bh_addForURI(aURI, aTitle, callback) {
this.isURIBookmarked(aURI, function (isBookmarked) {
if (isBookmarked)
return;
let bookmarkTitle = aTitle || aURI.spec;
let bookmarkService = PlacesUtils.bookmarks;
let bookmarkId = bookmarkService.insertBookmark(Bookmarks.metroRoot,
aURI,
bookmarkService.DEFAULT_INDEX,
bookmarkTitle);
// XXX Used for browser-chrome tests
let event = document.createEvent("Events");
event.initEvent("BookmarkCreated", true, false);
window.dispatchEvent(event);
if (callback)
callback(bookmarkId);
});
},
_isMetroBookmark: function(aItemId) {
return PlacesUtils.bookmarks.getFolderIdForItem(aItemId) == Bookmarks.metroRoot;
},
isURIBookmarked: function bh_isURIBookmarked(aURI, callback) {
if (!callback)
return;
PlacesUtils.asyncGetBookmarkIds(aURI, aItemIds => {
callback(aItemIds && aItemIds.length > 0 && aItemIds.some(this._isMetroBookmark));
});
},
removeForURI: function bh_removeForURI(aURI, callback) {
// XXX blargle xpconnect! might not matter, but a method on
// nsINavBookmarksService that takes an array of items to
// delete would be faster. better yet, a method that takes a URI!
PlacesUtils.asyncGetBookmarkIds(aURI, (aItemIds) => {
aItemIds.forEach((aItemId) => {
if (this._isMetroBookmark(aItemId)) {
PlacesUtils.bookmarks.removeItem(aItemId);
}
});
if (callback)
callback();
// XXX Used for browser-chrome tests
let event = document.createEvent("Events");
event.initEvent("BookmarkRemoved", true, false);
window.dispatchEvent(event);
});
}
};