1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5/**
6 * @typedef {{
7 *   id: string,
8 *   name: string,
9 *   subnodes: Array.<{id: string, name: string, readonly: boolean,
10 *                     untrusted: boolean, extractable: boolean,
11 *                     policy: boolean}>
12 * }}
13 */
14var CertificateData;
15
16cr.define('options', function() {
17  /** @const */ var Tree = cr.ui.Tree;
18  /** @const */ var TreeItem = cr.ui.TreeItem;
19
20  /**
21   * Creates a new tree folder for certificate data.
22   * @param {Object=} data Data used to create a certificate tree folder.
23   * @constructor
24   * @extends {TreeItem}
25   */
26  function CertificateTreeFolder(data) {
27    data.isCert = false;
28    var treeFolder = new TreeItem({
29      label: data.name,
30      data: data
31    });
32    treeFolder.__proto__ = CertificateTreeFolder.prototype;
33
34    if (data.icon)
35      treeFolder.icon = data.icon;
36
37    return treeFolder;
38  }
39
40  CertificateTreeFolder.prototype = {
41    __proto__: TreeItem.prototype,
42
43    /**
44     * The tree path id/.
45     * @type {string}
46     */
47    get pathId() {
48      return this.data.id;
49    }
50  };
51
52  /**
53   * Creates a new tree item for certificate data.
54   * @param {Object=} data Data used to create a certificate tree item.
55   * @constructor
56   * @extends {TreeItem}
57   */
58  function CertificateTreeItem(data) {
59    data.isCert = true;
60    // TODO(mattm): other columns
61    var treeItem = new TreeItem({
62      label: data.name,
63      data: data
64    });
65    treeItem.__proto__ = CertificateTreeItem.prototype;
66
67    if (data.icon)
68      treeItem.icon = data.icon;
69
70    if (data.untrusted) {
71      var badge = document.createElement('span');
72      badge.classList.add('cert-untrusted');
73      badge.textContent = loadTimeData.getString('badgeCertUntrusted');
74      treeItem.labelElement.insertBefore(
75          badge, treeItem.labelElement.firstChild);
76    }
77
78    if (data.policy) {
79      var policyIndicator = new options.ControlledSettingIndicator();
80      policyIndicator.controlledBy = 'policy';
81      policyIndicator.setAttribute(
82          'textpolicy', loadTimeData.getString('certPolicyInstalled'));
83      policyIndicator.classList.add('cert-policy');
84      treeItem.labelElement.appendChild(policyIndicator);
85    }
86
87    return treeItem;
88  }
89
90  CertificateTreeItem.prototype = {
91    __proto__: TreeItem.prototype,
92
93    /**
94     * The tree path id/.
95     * @type {string}
96     */
97    get pathId() {
98      return this.parentItem.pathId + ',' + this.data.id;
99    }
100  };
101
102  /**
103   * Creates a new cookies tree.
104   * @param {Object=} opt_propertyBag Optional properties.
105   * @constructor
106   * @extends {Tree}
107   */
108  var CertificatesTree = cr.ui.define('tree');
109
110  CertificatesTree.prototype = {
111    __proto__: Tree.prototype,
112
113    /** @override */
114    decorate: function() {
115      Tree.prototype.decorate.call(this);
116      this.treeLookup_ = {};
117    },
118
119    /** @override */
120    addAt: function(child, index) {
121      Tree.prototype.addAt.call(this, child, index);
122      if (child.data && child.data.id)
123        this.treeLookup_[child.data.id] = child;
124    },
125
126    /** @override */
127    remove: function(child) {
128      Tree.prototype.remove.call(this, child);
129      if (child.data && child.data.id)
130        delete this.treeLookup_[child.data.id];
131    },
132
133    /**
134     * Clears the tree.
135     */
136    clear: function() {
137      // Remove all fields without recreating the object since other code
138      // references it.
139      for (var id in this.treeLookup_)
140        delete this.treeLookup_[id];
141      this.textContent = '';
142    },
143
144    /**
145     * Populate the tree.
146     * @param {Array.<CertificateData>} nodesData Nodes data array.
147     */
148    populate: function(nodesData) {
149      this.clear();
150
151      for (var i = 0; i < nodesData.length; ++i) {
152        var subnodes = nodesData[i].subnodes;
153        delete nodesData[i].subnodes;
154
155        var item = new CertificateTreeFolder(nodesData[i]);
156        this.addAt(item, i);
157
158        for (var j = 0; j < subnodes.length; ++j) {
159          var subitem = new CertificateTreeItem(subnodes[j]);
160          item.addAt(subitem, j);
161        }
162        // Make tree expanded by default.
163        item.expanded = true;
164      }
165
166      cr.dispatchSimpleEvent(this, 'change');
167    },
168  };
169
170  return {
171    CertificatesTree: CertificatesTree
172  };
173});
174
175