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