bmm.js revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)cr.define('bmm', function() {
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  var Promise = cr.Promise;
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * Whether a node contains another node.
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   * TODO(yosin): Once JavaScript style guide is updated and linter follows
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   * that, we'll remove useless documentations for |parent| and |descendant|.
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   * TODO(yosin): bmm.contains() should be method of BookmarkTreeNode.
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   * @param {!BookmarkTreeNode} parent .
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   * @param {!BookmarkTreeNode} descendant .
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @return {boolean} Whether the parent contains the descendant.
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  function contains(parent, descendant) {
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (descendant.parentId == parent.id)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return true;
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // the bmm.treeLookup contains all folders
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var parentTreeItem = bmm.treeLookup[descendant.parentId];
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!parentTreeItem || !parentTreeItem.bookmarkNode)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return this.contains(parent, parentTreeItem.bookmarkNode);
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @param {!BookmarkTreeNode} node The node to test.
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @return {boolean} Whether a bookmark node is a folder.
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  function isFolder(node) {
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return !('url' in node);
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var loadingPromises = {};
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * Loads a subtree of the bookmark tree and returns a {@code cr.Promise} that
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * will be fulfilled when done. This reuses multiple loads so that we do not
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * load the same subtree more than once at the same time.
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @return {!cr.Promise} The future promise for the load.
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  function loadSubtree(id) {
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var p = new Promise;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!(id in loadingPromises)) {
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      loadingPromises[id] = new Promise;
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      loadingPromises[id].addListener(function(n) {
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        p.value = n;
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      });
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chrome.bookmarkManagerPrivate.getSubtree(id, false, function(nodes) {
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        loadingPromises[id].value = nodes && nodes[0];
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        delete loadingPromises[id];
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      });
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    } else {
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      loadingPromises[id].addListener(function(n) {
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        p.value = n;
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      });
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return p;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * Loads the entire bookmark tree and returns a {@code cr.Promise} that will
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * be fulfilled when done. This reuses multiple loads so that we do not load
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * the same tree more than once at the same time.
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @return {!cr.Promise} The future promise for the load.
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  function loadTree() {
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return loadSubtree('');
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var bookmarkCache = {
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Removes the cached item from both the list and tree lookups.
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    remove: function(id) {
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var treeItem = bmm.treeLookup[id];
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (treeItem) {
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        var items = treeItem.items; // is an HTMLCollection
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        for (var i = 0; i < items.length; ++i) {
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          var item = items[i];
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          var bookmarkNode = item.bookmarkNode;
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          delete bmm.treeLookup[bookmarkNode.id];
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        delete bmm.treeLookup[id];
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Updates the underlying bookmark node for the tree items and list items by
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * querying the bookmark backend.
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @param {string} id The id of the node to update the children for.
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @param {Function=} opt_f A funciton to call when done.
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    updateChildren: function(id, opt_f) {
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      function updateItem(bookmarkNode) {
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        var treeItem = bmm.treeLookup[bookmarkNode.id];
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (treeItem) {
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          treeItem.bookmarkNode = bookmarkNode;
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chrome.bookmarks.getChildren(id, function(children) {
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (children)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          children.forEach(updateItem);
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (opt_f)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          opt_f(children);
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      });
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * Called when the title of a bookmark changes.
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   * @param {string} id The id of changed bookmark node.
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   * @param {!Object} changeInfo The information about how the node changed.
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  function handleBookmarkChanged(id, changeInfo) {
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (bmm.tree)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bmm.tree.handleBookmarkChanged(id, changeInfo);
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (bmm.list)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bmm.list.handleBookmarkChanged(id, changeInfo);
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * Callback for when the user reorders by title.
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @param {string} id The id of the bookmark folder that was reordered.
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @param {!Object} reorderInfo The information about how the items where
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   *     reordered.
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  function handleChildrenReordered(id, reorderInfo) {
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (bmm.tree)
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bmm.tree.handleChildrenReordered(id, reorderInfo);
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (bmm.list)
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bmm.list.handleChildrenReordered(id, reorderInfo);
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bookmarkCache.updateChildren(id);
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * Callback for when a bookmark node is created.
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @param {string} id The id of the newly created bookmark node.
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @param {!Object} bookmarkNode The new bookmark node.
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  function handleCreated(id, bookmarkNode) {
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (bmm.list)
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bmm.list.handleCreated(id, bookmarkNode);
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (bmm.tree)
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bmm.tree.handleCreated(id, bookmarkNode);
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bookmarkCache.updateChildren(bookmarkNode.parentId);
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * Callback for when a bookmark node is moved.
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @param {string} id The id of the moved bookmark node.
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @param {!Object} moveInfo The information about move.
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  function handleMoved(id, moveInfo) {
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (bmm.list)
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bmm.list.handleMoved(id, moveInfo);
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (bmm.tree)
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bmm.tree.handleMoved(id, moveInfo);
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bookmarkCache.updateChildren(moveInfo.parentId);
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (moveInfo.parentId != moveInfo.oldParentId)
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bookmarkCache.updateChildren(moveInfo.oldParentId);
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * Callback for when a bookmark node is removed.
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @param {string} id The id of the removed bookmark node.
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @param {!Object} bookmarkNode The information about removed.
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  function handleRemoved(id, removeInfo) {
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (bmm.list)
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bmm.list.handleRemoved(id, removeInfo);
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (bmm.tree)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bmm.tree.handleRemoved(id, removeInfo);
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bookmarkCache.updateChildren(removeInfo.parentId);
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bookmarkCache.remove(id);
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * Callback for when importing bookmark is started.
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  function handleImportBegan() {
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    chrome.bookmarks.onCreated.removeListener(handleCreated);
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    chrome.bookmarks.onChanged.removeListener(handleBookmarkChanged);
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * Callback for when importing bookmark node is finished.
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  function handleImportEnded() {
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // When importing is done we reload the tree and the list.
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    function f() {
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bmm.tree.removeEventListener('load', f);
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chrome.bookmarks.onCreated.addListener(handleCreated);
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chrome.bookmarks.onChanged.addListener(handleBookmarkChanged);
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (!bmm.list)
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // TODO(estade): this should navigate to the newly imported folder, which
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // may be the bookmark bar if there were no previous bookmarks.
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bmm.list.reload();
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (bmm.tree) {
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bmm.tree.addEventListener('load', f);
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bmm.tree.reload();
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * Adds the listeners for the bookmark model change events.
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  function addBookmarkModelListeners() {
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    chrome.bookmarks.onChanged.addListener(handleBookmarkChanged);
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    chrome.bookmarks.onChildrenReordered.addListener(handleChildrenReordered);
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    chrome.bookmarks.onCreated.addListener(handleCreated);
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    chrome.bookmarks.onMoved.addListener(handleMoved);
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    chrome.bookmarks.onRemoved.addListener(handleRemoved);
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    chrome.bookmarks.onImportBegan.addListener(handleImportBegan);
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    chrome.bookmarks.onImportEnded.addListener(handleImportEnded);
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return {
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    contains: contains,
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    isFolder: isFolder,
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    loadSubtree: loadSubtree,
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    loadTree: loadTree,
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    addBookmarkModelListeners: addBookmarkModelListeners
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)});
238