| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // require: cr.js | 5 // require: cr.js |
| 6 // require: cr/ui.js | 6 // require: cr/ui.js |
| 7 // require: cr/ui/tree.js | 7 // require: cr/ui/tree.js |
| 8 | 8 |
| 9 cr.define('chrome.sync', function() { | 9 cr.define('chrome.sync', function() { |
| 10 // Allow platform specific CSS rules. | 10 // Allow platform specific CSS rules. |
| 11 // | 11 // |
| 12 // TODO(akalin): BMM and options page does something similar, too. | 12 // TODO(akalin): BMM and options page does something similar, too. |
| 13 // Move this to util.js. | 13 // Move this to util.js. |
| 14 if (cr.isWindows) | 14 if (cr.isWindows) |
| 15 document.documentElement.setAttribute('os', 'win'); | 15 document.documentElement.setAttribute('os', 'win'); |
| 16 | 16 |
| 17 // TODO(akalin): Create SyncNodeTree/SyncNodeTreeItem classes that | 17 // TODO(akalin): Create SyncNodeTree/SyncNodeTreeItem classes that |
| 18 // hide all these details. | 18 // hide all these details. |
| 19 | 19 |
| 20 /** | 20 /** |
| 21 * Returns an object which measures elapsed time. |
| 22 */ |
| 23 var makeTimer = function() { |
| 24 var start = new Date(); |
| 25 |
| 26 return { |
| 27 /** |
| 28 * @return {number} The number of seconds since the timer was |
| 29 * created. |
| 30 */ |
| 31 get elapsedSeconds() { |
| 32 return ((new Date()).getTime() - start.getTime()) / 1000.0; |
| 33 } |
| 34 }; |
| 35 }; |
| 36 |
| 37 /** |
| 21 * Gets all children of the given node and passes it to the given | 38 * Gets all children of the given node and passes it to the given |
| 22 * callback. | 39 * callback. |
| 23 * @param {Object} nodeInfo The info for the node whose children we | 40 * @param {Object} nodeInfo The info for the node whose children we |
| 24 * want. | 41 * want. |
| 25 * @param {Function} callback The callback to call with the list of | 42 * @param {Function} callback The callback to call with the list of |
| 26 * children. | 43 * children. |
| 27 */ | 44 */ |
| 28 function getSyncNodeChildren(nodeInfo, callback) { | 45 function getSyncNodeChildren(nodeInfo, callback) { |
| 29 var children = []; | 46 var timer = makeTimer(); |
| 30 function processChildInfo(childNodeInfo) { | 47 chrome.sync.getChildNodeIds(nodeInfo.id, function(childNodeIds) { |
| 31 if (!childNodeInfo) { | 48 console.debug('getChildNodeIds took ' + |
| 49 timer.elapsedSeconds + 's to retrieve ' + |
| 50 childNodeIds.length + ' ids'); |
| 51 timer = makeTimer(); |
| 52 chrome.sync.getNodesById(childNodeIds, function(children) { |
| 53 console.debug('getNodesById took ' + |
| 54 timer.elapsedSeconds + 's to retrieve ' + |
| 55 children.length + ' nodes'); |
| 32 callback(children); | 56 callback(children); |
| 33 return; | 57 }); |
| 34 } | 58 }); |
| 35 children.push(childNodeInfo); | |
| 36 chrome.sync.getNodeById(childNodeInfo.successorId, processChildInfo); | |
| 37 }; | |
| 38 chrome.sync.getNodeById(nodeInfo.firstChildId, processChildInfo); | |
| 39 } | 59 } |
| 40 | 60 |
| 41 /** | 61 /** |
| 42 * Makes a tree item from the given node info. | 62 * Makes a tree item from the given node info. |
| 43 * @param {dictionary} nodeInfo The node info to create the tree | 63 * @param {dictionary} nodeInfo The node info to create the tree |
| 44 * item from. | 64 * item from. |
| 45 * @return {cr.ui.TreeItem} The created tree item. | 65 * @return {cr.ui.TreeItem} The created tree item. |
| 46 */ | 66 */ |
| 47 function makeNodeTreeItem(nodeInfo) { | 67 function makeNodeTreeItem(nodeInfo) { |
| 48 var treeItem = new cr.ui.TreeItem({ | 68 var treeItem = new cr.ui.TreeItem({ |
| 49 label: nodeInfo.title, | 69 label: nodeInfo.title, |
| 50 detail: nodeInfo | 70 detail: nodeInfo |
| 51 }); | 71 }); |
| 52 | 72 |
| 53 if (nodeInfo.isFolder) { | 73 if (nodeInfo.isFolder) { |
| 54 treeItem.mayHaveChildren_ = true; | 74 treeItem.mayHaveChildren_ = true; |
| 55 | 75 |
| 56 // Load children asynchronously on expand. | 76 // Load children asynchronously on expand. |
| 57 // TODO(akalin): Add a throbber while loading? | 77 // TODO(akalin): Add a throbber while loading? |
| 58 treeItem.triggeredLoad_ = false; | 78 treeItem.triggeredLoad_ = false; |
| 59 treeItem.addEventListener('expand', function(event) { | 79 treeItem.addEventListener('expand', function(event) { |
| 60 if (!treeItem.triggeredLoad_) { | 80 if (!treeItem.triggeredLoad_) { |
| 61 getSyncNodeChildren(nodeInfo, function(children) { | 81 getSyncNodeChildren(nodeInfo, function(children) { |
| 82 var timer = makeTimer(); |
| 62 for (var i = 0; i < children.length; ++i) { | 83 for (var i = 0; i < children.length; ++i) { |
| 63 var childTreeItem = makeNodeTreeItem(children[i]); | 84 var childTreeItem = makeNodeTreeItem(children[i]); |
| 64 treeItem.add(childTreeItem); | 85 treeItem.add(childTreeItem); |
| 65 } | 86 } |
| 87 console.debug('adding ' + children.length + ' children took ' + |
| 88 timer.elapsedSeconds + 's'); |
| 66 }); | 89 }); |
| 67 treeItem.triggeredLoad_ = true; | 90 treeItem.triggeredLoad_ = true; |
| 68 } | 91 } |
| 69 }); | 92 }); |
| 70 } else { | 93 } else { |
| 71 treeItem.classList.add('leaf'); | 94 treeItem.classList.add('leaf'); |
| 72 } | 95 } |
| 73 return treeItem; | 96 return treeItem; |
| 74 } | 97 } |
| 75 | 98 |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 122 for (var i = 0; i < pendingSyncNodeBrowsers.length; ++i) { | 145 for (var i = 0; i < pendingSyncNodeBrowsers.length; ++i) { |
| 123 decorateSyncNodeBrowser(pendingSyncNodeBrowsers[i]); | 146 decorateSyncNodeBrowser(pendingSyncNodeBrowsers[i]); |
| 124 } | 147 } |
| 125 domLoaded = true; | 148 domLoaded = true; |
| 126 }); | 149 }); |
| 127 | 150 |
| 128 return { | 151 return { |
| 129 decorateSyncNodeBrowser: decorateSyncNodeBrowserAfterDOMLoad | 152 decorateSyncNodeBrowser: decorateSyncNodeBrowserAfterDOMLoad |
| 130 }; | 153 }; |
| 131 }); | 154 }); |
| OLD | NEW |