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