| // 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 |
| }; |
| }); |