1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2010 The Chromium Authors. All rights reserved. 2ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Use of this source code is governed by a BSD-style license that can be 3ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// found in the LICENSE file. 4ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 5ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsencr.define('ui', function() { 6ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const Tree = cr.ui.Tree; 7ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const TreeItem = cr.ui.TreeItem; 8ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 9ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen /** 10ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * Creates a new tree item for sites data. 11ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * @param {Object=} data Data used to create a cookie tree item. 12ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * @constructor 13ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * @extends {TreeItem} 14ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen */ 15ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen function CookiesTreeItem(data) { 16ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen var treeItem = new TreeItem({ 17ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen label: data.title, 18ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen data: data 19ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen }); 20ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen treeItem.__proto__ = CookiesTreeItem.prototype; 21ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 22ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (data.icon) 23ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen treeItem.icon = data.icon; 24ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 25ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen treeItem.decorate(); 26ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return treeItem; 27ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 28ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 29ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen CookiesTreeItem.prototype = { 30ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen __proto__: TreeItem.prototype, 31ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 32ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen /** @inheritDoc */ 33ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen decorate: function() { 34ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen this.hasChildren = this.data.hasChildren; 35ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen }, 36ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 37ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen /** @inheritDoc */ 38ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen addAt: function(child, index) { 39ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen TreeItem.prototype.addAt.call(this, child, index); 40ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (child.data && child.data.id) 41ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen this.tree.treeLookup[child.data.id] = child; 42ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen }, 43ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 44ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen /** @inheritDoc */ 45ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen remove: function(child) { 46ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen TreeItem.prototype.remove.call(this, child); 47ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (child.data && child.data.id) 48ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen delete this.tree.treeLookup[child.data.id]; 49ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen }, 50ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 51ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen /** 52ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * Clears all children. 53ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen */ 54ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen clear: function() { 55ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // We might leave some garbage in treeLookup for removed children. 56ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // But that should be okay because treeLookup is cleared when we 57ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // reload the tree. 58ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen this.lastElementChild.textContent = ''; 59ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen }, 60ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 61ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen /** 62ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * The tree path id. 63ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * @type {string} 64ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen */ 65ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen get pathId() { 66ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen var parent = this.parentItem; 67ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (parent instanceof CookiesTreeItem) 68ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return parent.pathId + ',' + this.data.id; 69ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen else 70ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return this.data.id; 71ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen }, 72ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 73ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen /** @inheritDoc */ 74ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen get expanded() { 75ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return TreeItem.prototype.__lookupGetter__('expanded').call(this); 76ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen }, 77ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen set expanded(b) { 78ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (b && this.expanded != b) 79ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen chrome.send(this.tree.requestChildrenMessage, [this.pathId]); 80ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 81ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen TreeItem.prototype.__lookupSetter__('expanded').call(this, b); 82ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 83ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen }; 84ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 85ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen /** 86ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * Creates a new cookies tree. 87ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * @param {Object=} opt_propertyBag Optional properties. 88ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * @constructor 89ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * @extends {Tree} 90ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen */ 91ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen var CookiesTree = cr.ui.define('tree'); 92ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 93ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen CookiesTree.prototype = { 94ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen __proto__: Tree.prototype, 95ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 96ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen /** 97ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * Per-tree dict to map from data.id to tree node. 98ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen */ 99ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen treeLookup_: null, 100ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen get treeLookup() { 101ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!this.treeLookup_) 102ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen this.treeLookup_ = {}; 103ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return this.treeLookup_; 104ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen }, 105ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 106ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen /** @inheritDoc */ 107ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen addAt: function(child, index) { 108ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen Tree.prototype.addAt.call(this, child, index); 109ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (child.data && child.data.id) 110ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen this.treeLookup[child.data.id] = child; 111ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen }, 112ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 113ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen /** @inheritDoc */ 114ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen remove: function(child) { 115ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen Tree.prototype.remove.call(this, child); 116ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (child.data && child.data.id) 117ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen delete this.treeLookup[child.data.id]; 118ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen }, 119ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 120ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen /** 121ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * Add tree nodes by given parent. 122ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * @param {Object} parent Parent node. 123ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * @param {number} start Start index of where to insert nodes. 124ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * @param {Array} nodesData Nodes data array. 125ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen */ 126ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen addByParent: function(parent, start, nodesData) { 127ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen for (var i = 0; i < nodesData.length; ++i) { 128ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen parent.addAt(new CookiesTreeItem(nodesData[i]), start + i); 129ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 130ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 131ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen cr.dispatchSimpleEvent(this, 'change'); 132ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen }, 133ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 134ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen /** 135ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * Add tree nodes by parent id. 136ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * @param {string} parentId Id of the parent node. 137ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * @param {int} start Start index of where to insert nodes. 138ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * @param {Array} nodesData Nodes data array. 139ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen */ 140ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen addByParentId: function(parentId, start, nodesData) { 141ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen var parent = parentId ? this.treeLookup[parentId] : this; 142ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen this.addByParent(parent, start, nodesData); 143ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen }, 144ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 145ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen /** 146ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * Removes tree nodes by parent id. 147ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * @param {string} parentId Id of the parent node. 148ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * @param {int} start Start index of nodes to remove. 149ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * @param {int} count Number of nodes to remove. 150ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen */ 151ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen removeByParentId: function(parentId, start, count) { 152ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen var parent = parentId ? this.treeLookup[parentId] : this; 153ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 154ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen for (; count > 0 && parent.items.length; --count) { 155ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen parent.remove(parent.items[start]); 156ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 157ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 158ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen cr.dispatchSimpleEvent(this, 'change'); 159ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen }, 160ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 161ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen /** 162ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * Clears the tree. 163ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen */ 164ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen clear: function() { 165ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Remove all fields without recreating the object since other code 166ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // references it. 167ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen for (var id in this.treeLookup){ 168ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen delete this.treeLookup[id]; 169ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 170ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen this.textContent = ''; 171ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen }, 172ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 173ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen /** 174ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * Unique 'requestChildren' callback message name to send request to 175ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * underlying CookiesTreeModelAdapter. 176ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * @type {string} 177ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen */ 178ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen requestChildrenMessage_ : null, 179ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen get requestChildrenMessage() { 180ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return this.requestChildrenMessage_; 181ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen }, 182ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 183ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen /** 184ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * Set callback message name. 185ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * @param {string} loadChildren Message name for 'loadChildren' request. 186ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen */ 187ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen doSetCallback: function(loadChildren) { 188ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen this.requestChildrenMessage_ = loadChildren; 189ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen }, 190ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 191ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen /** 192ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * Sets the immediate children of given parent node. 193ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * @param {string} parentId Id of the parent node. 194ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * @param {Array} children The immediate children of parent node. 195ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen */ 196ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen doSetChildren: function(parentId, children) { 197ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen var parent = parentId ? this.treeLookup[parentId] : this; 198ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 199ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen parent.clear(); 200ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen this.addByParent(parent, 0, children); 201ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 202ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen }; 203ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 204ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // CookiesTreeModelAdapter callbacks. 205ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen CookiesTree.setCallback = function(treeId, message) { 206ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen $(treeId).doSetCallback(message); 207ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 208ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 209ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen CookiesTree.onTreeItemAdded = function(treeId, parentId, start, children) { 210ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen $(treeId).addByParentId(parentId, start, children); 211ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 212ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 213ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen CookiesTree.onTreeItemRemoved = function(treeId, parentId, start, count) { 214ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen $(treeId).removeByParentId(parentId, start, count); 215ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 216ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 217ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen CookiesTree.setChildren = function(treeId, parentId, children) { 218ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen $(treeId).doSetChildren(parentId, children); 219ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 220ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 221ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return { 222ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen CookiesTree: CookiesTree 223ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen }; 224ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}); 225