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 5cr.exportPath('options'); 6 7/** 8 * @typedef {{Name: string, Type: string, servicePath: string}} 9 */ 10options.PreferredNetwork; 11 12cr.define('options', function() { 13 14 var Page = cr.ui.pageManager.Page; 15 var PageManager = cr.ui.pageManager.PageManager; 16 var ArrayDataModel = cr.ui.ArrayDataModel; 17 var DeletableItem = options.DeletableItem; 18 var DeletableItemList = options.DeletableItemList; 19 20 ///////////////////////////////////////////////////////////////////////////// 21 // NetworkPreferences class: 22 23 /** 24 * Encapsulated handling of ChromeOS network preferences page. 25 * @constructor 26 * @extends {cr.ui.pageManager.Page} 27 */ 28 function PreferredNetworks(model) { 29 Page.call(this, 'preferredNetworksPage', '', 'preferredNetworksPage'); 30 } 31 32 cr.addSingletonGetter(PreferredNetworks); 33 34 PreferredNetworks.prototype = { 35 __proto__: Page.prototype, 36 37 /** @override */ 38 initializePage: function() { 39 Page.prototype.initializePage.call(this); 40 PreferredNetworkList.decorate($('remembered-network-list')); 41 $('preferred-networks-confirm').onclick = 42 PageManager.closeOverlay.bind(PageManager); 43 }, 44 45 update: function(rememberedNetworks) { 46 var list = $('remembered-network-list'); 47 list.clear(); 48 for (var i = 0; i < rememberedNetworks.length; i++) { 49 list.append(rememberedNetworks[i]); 50 } 51 list.redraw(); 52 } 53 54 }; 55 56 /** 57 * Creates a list entry for a remembered network. 58 * @param {options.PreferredNetwork} data Description of the network. 59 * @constructor 60 * @extends {options.DeletableItem} 61 */ 62 function PreferredNetworkListItem(data) { 63 var el = cr.doc.createElement('div'); 64 el.__proto__ = PreferredNetworkListItem.prototype; 65 el.data = {}; 66 for (var key in data) 67 el.data[key] = data[key]; 68 el.decorate(); 69 return el; 70 } 71 72 PreferredNetworkListItem.prototype = { 73 __proto__: DeletableItem.prototype, 74 75 /** 76 * Description of the network. 77 * @type {?options.PreferredNetwork} 78 */ 79 data: null, 80 81 /** @override */ 82 decorate: function() { 83 DeletableItem.prototype.decorate.call(this); 84 var label = this.ownerDocument.createElement('div'); 85 label.textContent = this.data.Name; 86 if (this.data.policyManaged) 87 this.deletable = false; 88 this.contentElement.appendChild(label); 89 } 90 }; 91 92 /** 93 * Class for displaying a list of preferred networks. 94 * @constructor 95 * @extends {options.DeletableItemList} 96 */ 97 var PreferredNetworkList = cr.ui.define('list'); 98 99 PreferredNetworkList.prototype = { 100 __proto__: DeletableItemList.prototype, 101 102 /** @override */ 103 decorate: function() { 104 DeletableItemList.prototype.decorate.call(this); 105 this.addEventListener('blur', this.onBlur_); 106 this.clear(); 107 }, 108 109 /** 110 * When the list loses focus, unselect all items in the list. 111 * @private 112 */ 113 onBlur_: function() { 114 this.selectionModel.unselectAll(); 115 }, 116 117 /** 118 * @override 119 * @param {options.PreferredNetwork} entry 120 */ 121 createItem: function(entry) { 122 return new PreferredNetworkListItem(entry); 123 }, 124 125 /** @override */ 126 deleteItemAtIndex: function(index) { 127 var item = this.dataModel.item(index); 128 if (item) { 129 // Inform the network library that we are forgetting this network. 130 chrome.send('networkCommand', 131 [item.Type, 132 item.servicePath, 133 'forget']); 134 } 135 this.dataModel.splice(index, 1); 136 // Invalidate the list since it has a stale cache after a splice 137 // involving a deletion. 138 this.invalidate(); 139 this.redraw(); 140 }, 141 142 /** 143 * Purges all networks from the list. 144 */ 145 clear: function() { 146 this.dataModel = new ArrayDataModel([]); 147 this.redraw(); 148 }, 149 150 /** 151 * Adds a remembered network to the list. 152 * @param {options.PreferredNetwork} data Description of the network. 153 */ 154 append: function(data) { 155 this.dataModel.push(data); 156 } 157 }; 158 159 // Export 160 return { 161 PreferredNetworks: PreferredNetworks 162 }; 163 164}); 165