// Copyright (c) 2010 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
cr.define('bmm', function() {
const Promise = cr.Promise;
/**
* Whether a node contains another node.
* @param {!BookmarkTreeNode} parent
* @param {!BookmarkTreeNode} descendant
* @return {boolean} Whether the parent contains the descendant.
*/
function contains(parent, descendant) {
if (descendant.parentId == parent.id)
return true;
// the bmm.treeLookup contains all folders
var parentTreeItem = bmm.treeLookup[descendant.parentId];
if (!parentTreeItem || !parentTreeItem.bookmarkNode)
return false;
return this.contains(parent, parentTreeItem.bookmarkNode);
}
/**
* @param {!BookmarkTreeNode} node The node to test.
* @return {boolean} Whether a bookmark node is a folder.
*/
function isFolder(node) {
return !('url' in node);
}
var loadingPromises = {};
/**
* Loads a subtree of the bookmark tree and returns a {@code cr.Promise} that
* will be fulfilled when done. This reuses multiple loads so that we do not
* load the same subtree more than once at the same time.
* @return {!cr.Promise} The future promise for the load.
*/
function loadSubtree(id) {
var p = new Promise;
if (!(id in loadingPromises)) {
loadingPromises[id] = new Promise;
chrome.experimental.bookmarkManager.getSubtree(id, false,
function(nodes) {
loadingPromises[id].value = nodes && nodes[0];
delete loadingPromises[id];
});
}
loadingPromises[id].addListener(function(n) {
p.value = n;
});
return p;
}
/**
* Loads the entire bookmark tree and returns a {@code cr.Promise} that will
* be fulfilled when done. This reuses multiple loads so that we do not load
* the same tree more than once at the same time.
* @return {!cr.Promise} The future promise for the load.
*/
function loadTree() {
return loadSubtree('');
}
return {
contains: contains,
isFolder: isFolder,
loadSubtree: loadSubtree,
loadTree: loadTree
};
});