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() {
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * Whether a node contains another node.
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   * TODO(yosin): Once JavaScript style guide is updated and linter follows
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   * that, we'll remove useless documentations for |parent| and |descendant|.
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   * TODO(yosin): bmm.contains() should be method of BookmarkTreeNode.
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   * @param {!BookmarkTreeNode} parent .
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   * @param {!BookmarkTreeNode} descendant .
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @return {boolean} Whether the parent contains the descendant.
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  function contains(parent, descendant) {
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (descendant.parentId == parent.id)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return true;
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // the bmm.treeLookup contains all folders
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var parentTreeItem = bmm.treeLookup[descendant.parentId];
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!parentTreeItem || !parentTreeItem.bookmarkNode)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return this.contains(parent, parentTreeItem.bookmarkNode);
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @param {!BookmarkTreeNode} node The node to test.
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @return {boolean} Whether a bookmark node is a folder.
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  function isFolder(node) {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return !('url' in node);
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var loadingPromises = {};
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   * Promise version of chrome.bookmarkManagerPrivate.getSubtree.
375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   * @param {string} id .
385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   * @param {boolean} foldersOnly .
395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   * @return {!Promise.<!Array.<!BookmarkTreeNode>>} .
405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   */
415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  function getSubtreePromise(id, foldersOnly) {
425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return new Promise(function(resolve) {
435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      chrome.bookmarkManagerPrivate.getSubtree(id, foldersOnly, resolve);
445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    });
455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  /**
485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   * Loads a subtree of the bookmark tree and returns a {@code Promise} that
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * will be fulfilled when done. This reuses multiple loads so that we do not
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * load the same subtree more than once at the same time.
515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   * @return {!Promise.<!BookmarkTreeNode>} The future promise for the load.
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  function loadSubtree(id) {
545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (!loadingPromises[id]) {
555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      loadingPromises[id] = getSubtreePromise(id, false).then(function(nodes) {
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        delete loadingPromises[id];
575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        return nodes && nodes[0];
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      });
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return loadingPromises[id];
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   * Loads the entire bookmark tree and returns a {@code Promise} that will
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * be fulfilled when done. This reuses multiple loads so that we do not load
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * the same tree more than once at the same time.
675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   * @return {!Promise.<Node>} The future promise for the load.
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  function loadTree() {
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return loadSubtree('');
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var bookmarkCache = {
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Removes the cached item from both the list and tree lookups.
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    remove: function(id) {
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var treeItem = bmm.treeLookup[id];
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (treeItem) {
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        var items = treeItem.items; // is an HTMLCollection
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        for (var i = 0; i < items.length; ++i) {
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          var item = items[i];
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          var bookmarkNode = item.bookmarkNode;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          delete bmm.treeLookup[bookmarkNode.id];
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        delete bmm.treeLookup[id];
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Updates the underlying bookmark node for the tree items and list items by
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * querying the bookmark backend.
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @param {string} id The id of the node to update the children for.
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @param {Function=} opt_f A funciton to call when done.
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    updateChildren: function(id, opt_f) {
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      function updateItem(bookmarkNode) {
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        var treeItem = bmm.treeLookup[bookmarkNode.id];
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (treeItem) {
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          treeItem.bookmarkNode = bookmarkNode;
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chrome.bookmarks.getChildren(id, function(children) {
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (children)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          children.forEach(updateItem);
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (opt_f)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          opt_f(children);
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      });
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * Called when the title of a bookmark changes.
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   * @param {string} id The id of changed bookmark node.
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   * @param {!Object} changeInfo The information about how the node changed.
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  function handleBookmarkChanged(id, changeInfo) {
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (bmm.tree)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bmm.tree.handleBookmarkChanged(id, changeInfo);
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (bmm.list)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bmm.list.handleBookmarkChanged(id, changeInfo);
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * Callback for when the user reorders by title.
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @param {string} id The id of the bookmark folder that was reordered.
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @param {!Object} reorderInfo The information about how the items where
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   *     reordered.
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  function handleChildrenReordered(id, reorderInfo) {
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (bmm.tree)
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bmm.tree.handleChildrenReordered(id, reorderInfo);
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (bmm.list)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bmm.list.handleChildrenReordered(id, reorderInfo);
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bookmarkCache.updateChildren(id);
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * Callback for when a bookmark node is created.
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @param {string} id The id of the newly created bookmark node.
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @param {!Object} bookmarkNode The new bookmark node.
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  function handleCreated(id, bookmarkNode) {
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (bmm.list)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bmm.list.handleCreated(id, bookmarkNode);
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (bmm.tree)
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bmm.tree.handleCreated(id, bookmarkNode);
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bookmarkCache.updateChildren(bookmarkNode.parentId);
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * Callback for when a bookmark node is moved.
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @param {string} id The id of the moved bookmark node.
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @param {!Object} moveInfo The information about move.
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  function handleMoved(id, moveInfo) {
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (bmm.list)
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bmm.list.handleMoved(id, moveInfo);
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (bmm.tree)
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bmm.tree.handleMoved(id, moveInfo);
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bookmarkCache.updateChildren(moveInfo.parentId);
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (moveInfo.parentId != moveInfo.oldParentId)
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bookmarkCache.updateChildren(moveInfo.oldParentId);
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * Callback for when a bookmark node is removed.
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @param {string} id The id of the removed bookmark node.
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @param {!Object} bookmarkNode The information about removed.
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  function handleRemoved(id, removeInfo) {
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (bmm.list)
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bmm.list.handleRemoved(id, removeInfo);
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (bmm.tree)
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bmm.tree.handleRemoved(id, removeInfo);
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bookmarkCache.updateChildren(removeInfo.parentId);
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bookmarkCache.remove(id);
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   * Callback for when all bookmark nodes have been deleted.
186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   */
187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  function handleRemoveAll() {
188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Reload the list and the tree.
189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (bmm.list)
190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      bmm.list.reload();
191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (bmm.tree)
192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      bmm.tree.reload();
193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  /**
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * Callback for when importing bookmark is started.
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  function handleImportBegan() {
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    chrome.bookmarks.onCreated.removeListener(handleCreated);
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    chrome.bookmarks.onChanged.removeListener(handleBookmarkChanged);
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * Callback for when importing bookmark node is finished.
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  function handleImportEnded() {
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // When importing is done we reload the tree and the list.
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    function f() {
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bmm.tree.removeEventListener('load', f);
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chrome.bookmarks.onCreated.addListener(handleCreated);
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chrome.bookmarks.onChanged.addListener(handleBookmarkChanged);
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (!bmm.list)
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // TODO(estade): this should navigate to the newly imported folder, which
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // may be the bookmark bar if there were no previous bookmarks.
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bmm.list.reload();
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (bmm.tree) {
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bmm.tree.addEventListener('load', f);
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bmm.tree.reload();
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * Adds the listeners for the bookmark model change events.
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  function addBookmarkModelListeners() {
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    chrome.bookmarks.onChanged.addListener(handleBookmarkChanged);
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    chrome.bookmarks.onChildrenReordered.addListener(handleChildrenReordered);
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    chrome.bookmarks.onCreated.addListener(handleCreated);
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    chrome.bookmarks.onMoved.addListener(handleMoved);
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    chrome.bookmarks.onRemoved.addListener(handleRemoved);
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    chrome.bookmarks.onImportBegan.addListener(handleImportBegan);
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    chrome.bookmarks.onImportEnded.addListener(handleImportEnded);
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return {
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    contains: contains,
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    isFolder: isFolder,
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    loadSubtree: loadSubtree,
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    loadTree: loadTree,
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    addBookmarkModelListeners: addBookmarkModelListeners
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)});
250