15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 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)// require: cr.js
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// require: cr/ui.js
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// require: cr/ui/tree.js
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)(function() {
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   * A helper function to determine if a node is the root of its type.
125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   *
135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   * @param {!Object} node The node to check.
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  var isTypeRootNode = function(node) {
165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return node.PARENT_ID == 'r' && node.UNIQUE_SERVER_TAG != '';
175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  /**
205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   * A helper function to determine if a node is a child of the given parent.
215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   *
225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   * @param {string} parentId The ID of the parent.
235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   * @param {!Object} node The node to check.
245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   */
255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  var isChildOf = function(parentId, node) {
265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return node.PARENT_ID == parentId;
275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  /**
305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   * A helper function to sort sync nodes.
315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   *
325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   * Sorts by position index if possible, falls back to sorting by name, and
335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   * finally sorting by METAHANDLE.
345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   *
355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   * If this proves to be slow and expensive, we should experiment with moving
365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   * this functionality to C++ instead.
375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   */
385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  var nodeComparator = function(nodeA, nodeB) {
395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (nodeA.hasOwnProperty('positionIndex') &&
405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        nodeB.hasOwnProperty('positionIndex')) {
415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return nodeA.positionIndex - nodeB.positionIndex;
425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    } else if (nodeA.NON_UNIQUE_NAME != nodeB.NON_UNIQUE_NAME) {
435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return nodeA.NON_UNIQUE_NAME.localeCompare(nodeB.NON_UNIQUE_NAME);
445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    } else {
455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return nodeA.METAHANDLE - nodeB.METAHANDLE;
465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  /**
505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   * Updates the node detail view with the details for the given node.
515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   * @param {!Object} node The struct representing the node we want to display.
525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   */
535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  function updateNodeDetailView(node) {
545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    var nodeDetailsView = $('node-details');
555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    nodeDetailsView.hidden = false;
565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    jstProcess(new JsEvalContext(node.entry_), nodeDetailsView);
575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  /**
605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   * Updates the 'Last refresh time' display.
615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   * @param {string} The text to display.
625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   */
635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  function setLastRefreshTime(str) {
645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    $('node-browser-refresh-time').textContent = str;
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * Creates a new sync node tree item.
695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   *
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @constructor
715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   * @param {!Object} node The nodeDetails object for the node as returned by
725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   *     chrome.sync.getAllNodes().
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @extends {cr.ui.TreeItem}
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  var SyncNodeTreeItem = function(node) {
765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    var treeItem = new cr.ui.TreeItem();
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    treeItem.__proto__ = SyncNodeTreeItem.prototype;
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    treeItem.entry_ = node;
805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    treeItem.label = node.NON_UNIQUE_NAME;
815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (node.IS_DIR) {
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      treeItem.mayHaveChildren_ = true;
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      // Load children on expand.
855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      treeItem.expanded_ = false;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      treeItem.addEventListener('expand',
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                treeItem.handleExpand_.bind(treeItem));
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      treeItem.classList.add('leaf');
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return treeItem;
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SyncNodeTreeItem.prototype = {
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    __proto__: cr.ui.TreeItem.prototype,
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)     * Finds the children of this node and appends them to the tree.
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    handleExpand_: function(event) {
1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      var treeItem = this;
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      if (treeItem.expanded_) {
1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        return;
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      treeItem.expanded_ = true;
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      var children = treeItem.tree.allNodes.filter(
1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          isChildOf.bind(undefined, treeItem.entry_.ID));
1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      children.sort(nodeComparator);
1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      children.forEach(function(node) {
1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        treeItem.add(new SyncNodeTreeItem(node));
1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      });
1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    },
1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  };
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   * Creates a new sync node tree.  Technically, it's a forest since it each
1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   * type has its own root node for its own tree, but it still looks and acts
1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   * mostly like a tree.
1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   *
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @param {Object=} opt_propertyBag Optional properties.
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @constructor
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @extends {cr.ui.Tree}
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var SyncNodeTree = cr.ui.define('tree');
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SyncNodeTree.prototype = {
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    __proto__: cr.ui.Tree.prototype,
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    decorate: function() {
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      cr.ui.Tree.prototype.decorate.call(this);
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.addEventListener('change', this.handleChange_.bind(this));
1355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      this.allNodes = [];
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    populate: function(nodes) {
1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      var tree = this;
1405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      // We store the full set of nodes in the SyncNodeTree object.
1425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      tree.allNodes = nodes;
1435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      var roots = tree.allNodes.filter(isTypeRootNode);
1455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      roots.sort(nodeComparator);
1465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      roots.forEach(function(typeRoot) {
1485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        tree.add(new SyncNodeTreeItem(typeRoot));
1495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      });
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    handleChange_: function(event) {
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (this.selectedItem) {
1545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        updateNodeDetailView(this.selectedItem);
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  /**
1605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   * Clears any existing UI state.  Useful prior to a refresh.
1615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   */
1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  function clear() {
1635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    var treeContainer = $('sync-node-tree-container');
1645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    while (treeContainer.firstChild) {
1655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      treeContainer.removeChild(treeContainer.firstChild);
1665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
1675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    var nodeDetailsView = $('node-details');
1695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    nodeDetailsView.hidden = true;
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  /**
1735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   * Fetch the latest set of nodes and refresh the UI.
1745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   */
1755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  function refresh() {
1765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    $('node-browser-refresh-button').disabled = true;
1775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    clear();
1795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    setLastRefreshTime('In progress since ' + (new Date()).toLocaleString());
1805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
181c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    chrome.sync.getAllNodes(function(nodeMap) {
182c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      // Put all nodes into one big list that ignores the type.
183c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      var nodes = nodeMap.
184c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch          map(function(x) { return x.nodes; }).
185c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch          reduce(function(a, b) { return a.concat(b); });
186c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      var treeContainer = $('sync-node-tree-container');
1885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      var tree = document.createElement('tree');
1895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      tree.setAttribute('id', 'sync-node-tree');
1905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      tree.setAttribute('icon-visibility', 'parent');
1915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      treeContainer.appendChild(tree);
1925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      cr.ui.decorate(tree, SyncNodeTree);
1945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      tree.populate(nodes);
1955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      setLastRefreshTime((new Date()).toLocaleString());
1975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      $('node-browser-refresh-button').disabled = false;
1985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    });
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  document.addEventListener('DOMContentLoaded', function(e) {
2025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    $('node-browser-refresh-button').addEventListener('click', refresh);
2035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    cr.ui.decorate('#sync-node-splitter', cr.ui.Splitter);
2045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Automatically trigger a refresh the first time this tab is selected.
2065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    $('sync-browser-tab').addEventListener('selectedChange', function f(e) {
2075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      if (this.selected) {
2085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        $('sync-browser-tab').removeEventListener('selectedChange', f);
2095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        refresh();
2105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      }
2115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    });
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  });
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)})();
215