Index: resources/bookmark_manager/js/bmm.js |
=================================================================== |
--- resources/bookmark_manager/js/bmm.js (revision 0) |
+++ resources/bookmark_manager/js/bmm.js (revision 0) |
@@ -0,0 +1,98 @@ |
+// 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 TreeIterator = bmm.TreeIterator; |
+ 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 loadingPromise; |
+ |
+ /** |
+ * Loads the entire bookmark tree and returns a {@code cr.Promise} that will |
+ * be fulfilled when done. This reuses multiple loads so that we never load |
+ * more than one tree at the same time. |
+ * @return {!cr.Promise} The future promise for the load. |
+ */ |
+ function loadTree() { |
+ var p = new Promise; |
+ if (!loadingPromise) { |
+ loadingPromise = new Promise; |
+ chrome.bookmarks.getTree(function(nodes) { |
+ loadingPromise.value = nodes[0]; |
+ loadingPromise = null; |
+ }); |
+ } |
+ loadingPromise.addListener(function(n) { |
+ p.value = n; |
+ }); |
+ return p; |
+ } |
+ |
+ /** |
+ * Helper function for {@code loadSubtree}. This does an in order search of |
+ * the tree. |
+ * @param {!BookmarkTreeNode} node The node to start searching at. |
+ * @param {string} id The ID of the node to find. |
+ * @return {BookmarkTreeNode} The found node or null if not found. |
+ */ |
+ function findNode(node, id) { |
+ var it = new TreeIterator(node); |
+ var n; |
+ while (it.moveNext()) { |
+ n = it.current; |
+ if (n.id == id) |
+ return n; |
+ } |
+ return null; |
+ } |
+ |
+ /** |
+ * 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 never |
+ * load more than one tree at the same time. (This actually loads the entire |
+ * tree but it will only return the relevant subtree in the value of the |
+ * future promise.) |
+ * @return {!cr.Promise} The future promise for the load. |
+ */ |
+ function loadSubtree(id) { |
+ var p = new Promise; |
+ var lp = loadTree(); |
+ lp.addListener(function(tree) { |
+ var node = findNode(tree, id); |
+ p.value = node || Error('Failed to load subtree ' + id); |
+ }); |
+ return p; |
+ } |
+ |
+ return { |
+ contains: contains, |
+ isFolder: isFolder, |
+ loadSubtree: loadSubtree, |
+ loadTree: loadTree |
+ }; |
+}); |