Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(471)

Side by Side Diff: chrome/browser/resources/settings/internet_page/network_summary.js

Issue 2167473002: MD Settings: Internet: Reduce use of hidden for complex sections. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: . Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 /** 5 /**
6 * @fileoverview Polymer element for displaying a summary of network states 6 * @fileoverview Polymer element for displaying a summary of network states
7 * by type: Ethernet, WiFi, Cellular, WiMAX, and VPN. 7 * by type: Ethernet, WiFi, Cellular, WiMAX, and VPN.
8 */ 8 */
9 9
10 /** @typedef {chrome.networkingPrivate.DeviceStateProperties} */ 10 /** @typedef {chrome.networkingPrivate.DeviceStateProperties} */
11 var DeviceStateProperties; 11 var DeviceStateProperties;
12 12
13 /** 13 /**
14 * @typedef {{ 14 * @typedef {{
15 * Ethernet: (DeviceStateProperties|undefined), 15 * Ethernet: (DeviceStateProperties|undefined),
16 * WiFi: (DeviceStateProperties|undefined), 16 * WiFi: (DeviceStateProperties|undefined),
17 * Cellular: (DeviceStateProperties|undefined), 17 * Cellular: (DeviceStateProperties|undefined),
18 * WiMAX: (DeviceStateProperties|undefined), 18 * WiMAX: (DeviceStateProperties|undefined),
19 * VPN: (DeviceStateProperties|undefined) 19 * VPN: (DeviceStateProperties|undefined)
20 * }} 20 * }}
21 */ 21 */
22 var DeviceStateObject; 22 var DeviceStateObject;
23 23
24 /** 24 /**
25 * @typedef {{ 25 * @typedef {{
26 * Ethernet: (!CrOnc.NetworkStateProperties|undefined),
27 * WiFi: (!CrOnc.NetworkStateProperties|undefined),
28 * Cellular: (!CrOnc.NetworkStateProperties|undefined),
29 * WiMAX: (!CrOnc.NetworkStateProperties|undefined),
30 * VPN: (!CrOnc.NetworkStateProperties|undefined)
31 * }}
32 */
33 var NetworkStateObject;
34
35 /**
36 * @typedef {{
37 * Ethernet: (Array<CrOnc.NetworkStateProperties>|undefined), 26 * Ethernet: (Array<CrOnc.NetworkStateProperties>|undefined),
38 * WiFi: (Array<CrOnc.NetworkStateProperties>|undefined), 27 * WiFi: (Array<CrOnc.NetworkStateProperties>|undefined),
39 * Cellular: (Array<CrOnc.NetworkStateProperties>|undefined), 28 * Cellular: (Array<CrOnc.NetworkStateProperties>|undefined),
40 * WiMAX: (Array<CrOnc.NetworkStateProperties>|undefined), 29 * WiMAX: (Array<CrOnc.NetworkStateProperties>|undefined),
41 * VPN: (Array<CrOnc.NetworkStateProperties>|undefined) 30 * VPN: (Array<CrOnc.NetworkStateProperties>|undefined)
42 * }} 31 * }}
43 */ 32 */
44 var NetworkStateListObject; 33 var NetworkStateListObject;
45 34
46 (function() {
47
48 /** @const {!Array<chrome.networkingPrivate.NetworkType>} */
49 var NETWORK_TYPES = [
50 CrOnc.Type.ETHERNET,
51 CrOnc.Type.WI_FI,
52 CrOnc.Type.CELLULAR,
53 CrOnc.Type.WI_MAX,
54 CrOnc.Type.VPN
55 ];
56
57 Polymer({ 35 Polymer({
58 is: 'network-summary', 36 is: 'network-summary',
59 37
60 properties: { 38 properties: {
61 /** 39 /**
62 * Highest priority connected network or null. 40 * Highest priority connected network or null.
63 * @type {?CrOnc.NetworkStateProperties} 41 * @type {?CrOnc.NetworkStateProperties}
64 */ 42 */
65 defaultNetwork: { 43 defaultNetwork: {
66 type: Object, 44 type: Object,
67 value: null, 45 value: null,
68 notify: true 46 notify: true,
69 }, 47 },
70 48
71 /** 49 /**
72 * The device state for each network device type. 50 * The device state for each network device type.
73 * @type {DeviceStateObject} 51 * @type {DeviceStateObject}
74 */ 52 */
75 deviceStates: { 53 deviceStates: {
76 type: Object, 54 type: Object,
77 value: function() { return {}; }, 55 value: function() { return {}; },
78 }, 56 },
79 57
80 /** 58 /**
81 * Network state data for each network type. 59 * Array of active network states, one per device type.
82 * @type {NetworkStateObject} 60 * @type {!Array<!CrOnc.NetworkStateProperties>}
83 */ 61 */
84 networkStates: { 62 activeNetworkStates: {
85 type: Object, 63 type: Array,
86 value: function() { return {}; }, 64 value: function() { return []; },
87 }, 65 },
88 66
89 /** 67 /**
90 * List of network state data for each network type. 68 * List of network state data for each network type.
91 * @type {NetworkStateListObject} 69 * @type {NetworkStateListObject}
92 */ 70 */
93 networkStateLists: { 71 networkStateLists: {
94 type: Object, 72 type: Object,
95 value: function() { return {}; }, 73 value: function() { return {}; },
96 }, 74 },
97 75
98 /** 76 /**
99 * Interface for networkingPrivate calls, passed from internet_page. 77 * Interface for networkingPrivate calls, passed from internet_page.
100 * @type {NetworkingPrivate} 78 * @type {NetworkingPrivate}
101 */ 79 */
102 networkingPrivate: { 80 networkingPrivate: {
103 type: Object, 81 type: Object,
104 } 82 },
105 }, 83 },
106 84
107 /** 85 /**
108 * Listener function for chrome.networkingPrivate.onNetworkListChanged event. 86 * Listener function for chrome.networkingPrivate.onNetworkListChanged event.
109 * @type {function(!Array<string>)} 87 * @type {function(!Array<string>)}
110 * @private 88 * @private
111 */ 89 */
112 networkListChangedListener_: function() {}, 90 networkListChangedListener_: function() {},
113 91
114 /** 92 /**
115 * Listener function for chrome.networkingPrivate.onDeviceStateListChanged 93 * Listener function for chrome.networkingPrivate.onDeviceStateListChanged
116 * event. 94 * event.
117 * @type {function(!Array<string>)} 95 * @type {function(!Array<string>)}
118 * @private 96 * @private
119 */ 97 */
120 deviceStateListChangedListener_: function() {}, 98 deviceStateListChangedListener_: function() {},
121 99
122 /** 100 /**
123 * Listener function for chrome.networkingPrivate.onNetworksChanged event. 101 * Listener function for chrome.networkingPrivate.onNetworksChanged event.
124 * @type {function(!Array<string>)} 102 * @type {function(!Array<string>)}
125 * @private 103 * @private
126 */ 104 */
127 networksChangedListener_: function() {}, 105 networksChangedListener_: function() {},
128 106
129 /** 107 /**
130 * Dictionary of GUIDs identifying primary (active) networks for each type. 108 * Set of GUIDs identifying active networks, one for each type.
131 * @type {?Object} 109 * @type {?Set<string>}
132 * @private 110 * @private
133 */ 111 */
134 networkIds_: null, 112 activeNetworkIds_: null,
135 113
136 /** @override */ 114 /** @override */
137 attached: function() { 115 attached: function() {
138 this.networkIds_ = {};
139
140 this.getNetworkLists_(); 116 this.getNetworkLists_();
141 117
142 this.networkListChangedListener_ = 118 this.networkListChangedListener_ =
143 this.onNetworkListChangedEvent_.bind(this); 119 this.onNetworkListChangedEvent_.bind(this);
144 this.networkingPrivate.onNetworkListChanged.addListener( 120 this.networkingPrivate.onNetworkListChanged.addListener(
145 this.networkListChangedListener_); 121 this.networkListChangedListener_);
146 122
147 this.deviceStateListChangedListener_ = 123 this.deviceStateListChangedListener_ =
148 this.onDeviceStateListChangedEvent_.bind(this); 124 this.onDeviceStateListChangedEvent_.bind(this);
149 this.networkingPrivate.onDeviceStateListChanged.addListener( 125 this.networkingPrivate.onDeviceStateListChanged.addListener(
(...skipping 10 matching lines...) Expand all
160 this.networkListChangedListener_); 136 this.networkListChangedListener_);
161 137
162 this.networkingPrivate.onDeviceStateListChanged.removeListener( 138 this.networkingPrivate.onDeviceStateListChanged.removeListener(
163 this.deviceStateListChangedListener_); 139 this.deviceStateListChangedListener_);
164 140
165 this.networkingPrivate.onNetworksChanged.removeListener( 141 this.networkingPrivate.onNetworksChanged.removeListener(
166 this.networksChangedListener_); 142 this.networksChangedListener_);
167 }, 143 },
168 144
169 /** 145 /**
170 * Event triggered when the WiFi network-summary-item is expanded. 146 * Event triggered when the network-summary-item is expanded.
171 * @param {!{detail: {expanded: boolean, type: string}}} event 147 * @param {!{detail: {expanded: boolean, type: string}}} event
172 * @private 148 * @private
173 */ 149 */
174 onWiFiExpanded_: function(event) { 150 onExpanded_: function(event) {
175 if (!event.detail.expanded) 151 if (!event.detail.expanded)
176 return; 152 return;
177 // Get the latest network states (only). 153 // Get the latest network states.
178 this.getNetworkStates_(); 154 this.getNetworkStates_();
179 this.networkingPrivate.requestNetworkScan(); 155 if (event.detail.type == CrOnc.Type.WI_FI)
156 this.networkingPrivate.requestNetworkScan();
180 }, 157 },
181 158
182 /** 159 /**
183 * Event triggered when a network-summary-item is selected. 160 * Event triggered when a network-summary-item is selected.
184 * @param {!{detail: !CrOnc.NetworkStateProperties}} event 161 * @param {!{detail: !CrOnc.NetworkStateProperties}} event
185 * @private 162 * @private
186 */ 163 */
187 onSelected_: function(event) { 164 onSelected_: function(event) {
188 var state = event.detail; 165 var state = event.detail;
189 if (this.canConnect_(state)) { 166 if (this.canConnect_(state)) {
(...skipping 28 matching lines...) Expand all
218 * @private 195 * @private
219 */ 196 */
220 onDeviceStateListChangedEvent_: function() { this.getNetworkLists_(); }, 197 onDeviceStateListChangedEvent_: function() { this.getNetworkLists_(); },
221 198
222 /** 199 /**
223 * networkingPrivate.onNetworksChanged event callback. 200 * networkingPrivate.onNetworksChanged event callback.
224 * @param {!Array<string>} networkIds The list of changed network GUIDs. 201 * @param {!Array<string>} networkIds The list of changed network GUIDs.
225 * @private 202 * @private
226 */ 203 */
227 onNetworksChangedEvent_: function(networkIds) { 204 onNetworksChangedEvent_: function(networkIds) {
205 if (!this.activeNetworkIds_)
206 return; // Initial list of networks not received yet.
228 networkIds.forEach(function(id) { 207 networkIds.forEach(function(id) {
229 if (id in this.networkIds_) { 208 if (this.activeNetworkIds_.has(id)) {
230 this.networkingPrivate.getState( 209 this.networkingPrivate.getState(
231 id, this.getStateCallback_.bind(this, id)); 210 id, this.getActiveStateCallback_.bind(this, id));
232 } 211 }
233 }, this); 212 }, this);
234 }, 213 },
235 214
236 /** 215 /**
237 * Determines whether or not a network state can be connected to. 216 * Determines whether or not a network state can be connected to.
238 * @param {!CrOnc.NetworkStateProperties} state The network state. 217 * @param {!CrOnc.NetworkStateProperties} state The network state.
239 * @private 218 * @private
240 */ 219 */
241 canConnect_: function(state) { 220 canConnect_: function(state) {
242 if (state.Type == CrOnc.Type.ETHERNET || 221 if (state.Type == CrOnc.Type.ETHERNET ||
243 state.Type == CrOnc.Type.VPN && !this.defaultNetwork) { 222 state.Type == CrOnc.Type.VPN && !this.defaultNetwork) {
244 return false; 223 return false;
245 } 224 }
246 return state.ConnectionState == CrOnc.ConnectionState.NOT_CONNECTED; 225 return state.ConnectionState == CrOnc.ConnectionState.NOT_CONNECTED;
247 }, 226 },
248 227
249 /** 228 /**
250 * networkingPrivate.getState event callback. 229 * networkingPrivate.getState event callback for an active state.
251 * @param {string} id The id of the requested state. 230 * @param {string} id The id of the requested state.
252 * @param {!chrome.networkingPrivate.NetworkStateProperties} state 231 * @param {!chrome.networkingPrivate.NetworkStateProperties} state
253 * @private 232 * @private
254 */ 233 */
255 getStateCallback_: function(id, state) { 234 getActiveStateCallback_: function(id, state) {
256 if (chrome.runtime.lastError) { 235 if (chrome.runtime.lastError) {
257 var message = chrome.runtime.lastError.message; 236 var message = chrome.runtime.lastError.message;
258 if (message != 'Error.NetworkUnavailable') { 237 if (message != 'Error.NetworkUnavailable') {
259 console.error( 238 console.error(
260 'Unexpected networkingPrivate.getState error: ' + message + 239 'Unexpected networkingPrivate.getState error: ' + message +
261 ' For: ' + id); 240 ' For: ' + id);
262 } 241 }
263 return; 242 return;
264 } 243 }
265 // Async call, ensure id still exists. 244 // Async call, ensure id still exists.
266 if (!this.networkIds_[id]) 245 if (!this.activeNetworkIds_.has(id))
267 return; 246 return;
268 if (!state) { 247 if (!state) {
269 this.networkIds_[id] = undefined; 248 this.activeNetworkIds_.delete(id);
270 return; 249 return;
271 } 250 }
272 this.updateNetworkState_(state.Type, state); 251 // Find the active state for the type and update it.
252 for (let i = 0; i < this.activeNetworkStates.length; ++i) {
253 if (this.activeNetworkStates[i].type == state.type) {
254 this.activeNetworkStates[i] = state;
255 return;
256 }
257 }
258 // Not found
259 console.error('Active state not found: ' + state.Name);
273 }, 260 },
274 261
275 /** 262 /**
276 * Handles UI requests to connect to a network. 263 * Handles UI requests to connect to a network.
277 * TODO(stevenjb): Handle Cellular activation, etc. 264 * TODO(stevenjb): Handle Cellular activation, etc.
278 * @param {!CrOnc.NetworkStateProperties} state The network state. 265 * @param {!CrOnc.NetworkStateProperties} state The network state.
279 * @private 266 * @private
280 */ 267 */
281 connectToNetwork_: function(state) { 268 connectToNetwork_: function(state) {
282 this.networkingPrivate.startConnect(state.GUID, function() { 269 this.networkingPrivate.startConnect(state.GUID, function() {
283 if (chrome.runtime.lastError) { 270 if (chrome.runtime.lastError) {
284 var message = chrome.runtime.lastError.message; 271 var message = chrome.runtime.lastError.message;
285 if (message != 'connecting') { 272 if (message != 'connecting') {
286 console.error( 273 console.error(
287 'Unexpected networkingPrivate.startConnect error: ' + message + 274 'Unexpected networkingPrivate.startConnect error: ' + message +
288 'For: ' + state.GUID); 275 'For: ' + state.GUID);
289 } 276 }
290 } 277 }
291 }); 278 });
292 }, 279 },
293 280
294 /** 281 /**
295 * Requests the list of device states and network states from Chrome. 282 * Requests the list of device states and network states from Chrome.
296 * Updates deviceStates, networkStates, and networkStateLists once the 283 * Updates deviceStates, activeNetworkStates, and networkStateLists once the
297 * results are returned from Chrome. 284 * results are returned from Chrome.
298 * @private 285 * @private
299 */ 286 */
300 getNetworkLists_: function() { 287 getNetworkLists_: function() {
301 // First get the device states. 288 // First get the device states.
302 this.networkingPrivate.getDeviceStates( 289 this.networkingPrivate.getDeviceStates(function(deviceStates) {
303 function(deviceStates) { 290 // Second get the network states.
304 // Second get the network states. 291 this.getNetworkStates_(deviceStates);
305 this.getNetworkStates_(deviceStates); 292 }.bind(this));
306 }.bind(this));
307 }, 293 },
308 294
309 /** 295 /**
310 * Requests the list of network states from Chrome. Updates networkStates and 296 * Requests the list of network states from Chrome. Updates
311 * networkStateLists once the results are returned from Chrome. 297 * activeNetworkStates and networkStateLists once the results are returned
298 * from Chrome.
312 * @param {!Array<!DeviceStateProperties>=} opt_deviceStates 299 * @param {!Array<!DeviceStateProperties>=} opt_deviceStates
313 * Optional list of state properties for all available devices. 300 * Optional list of state properties for all available devices.
314 * @private 301 * @private
315 */ 302 */
316 getNetworkStates_: function(opt_deviceStates) { 303 getNetworkStates_: function(opt_deviceStates) {
317 var filter = { 304 var filter = {
318 networkType: chrome.networkingPrivate.NetworkType.ALL, 305 networkType: chrome.networkingPrivate.NetworkType.ALL,
319 visible: true, 306 visible: true,
320 configured: false 307 configured: false
321 }; 308 };
322 this.networkingPrivate.getNetworks(filter, function(networkStates) { 309 this.networkingPrivate.getNetworks(filter, function(networkStates) {
323 this.updateNetworkStates_(networkStates, opt_deviceStates); 310 this.updateNetworkStates_(networkStates, opt_deviceStates);
324 }.bind(this)); 311 }.bind(this));
325 }, 312 },
326 313
327 /** 314 /**
328 * Called after network states are received from getNetworks. 315 * Called after network states are received from getNetworks.
329 * @param {!Array<!CrOnc.NetworkStateProperties>} networkStates The state 316 * @param {!Array<!CrOnc.NetworkStateProperties>} networkStates The state
330 * properties for all visible networks. 317 * properties for all visible networks.
331 * @param {!Array<!DeviceStateProperties>=} opt_deviceStates 318 * @param {!Array<!DeviceStateProperties>=} opt_deviceStates
332 * Optional list of state properties for all available devices. If not 319 * Optional list of state properties for all available devices. If not
333 * defined the existing list of device states will be used. 320 * defined the existing list of device states will be used.
334 * @private 321 * @private
335 */ 322 */
336 updateNetworkStates_: function(networkStates, opt_deviceStates) { 323 updateNetworkStates_: function(networkStates, opt_deviceStates) {
337 var newDeviceStates; 324 var newDeviceStates;
338 if (opt_deviceStates) { 325 if (opt_deviceStates) {
339 newDeviceStates = /** @type {!DeviceStateObject} */({}); 326 newDeviceStates = /** @type {!DeviceStateObject} */ ({});
340 opt_deviceStates.forEach(function(state) { 327 for (let state of opt_deviceStates)
341 newDeviceStates[state.Type] = state; 328 newDeviceStates[state.Type] = state;
342 });
343 } else { 329 } else {
344 newDeviceStates = this.deviceStates; 330 newDeviceStates = this.deviceStates;
345 } 331 }
346 332
347 // Clear any current networks. 333 // Clear any current networks.
348 this.networkIds_ = {}; 334 var activeNetworkStatesByType =
349 335 /** @type {!Map<string, !CrOnc.NetworkStateProperties>} */ (new Map);
350 // Track the first (active) state for each type.
351 var foundTypes = {};
352 336
353 // Complete list of states by type. 337 // Complete list of states by type.
354 /** @type {!NetworkStateListObject} */ var networkStateLists = { 338 /** @type {!NetworkStateListObject} */ var newNetworkStateLists = {
355 Ethernet: [], 339 Ethernet: [],
356 WiFi: [], 340 WiFi: [],
357 Cellular: [], 341 Cellular: [],
358 WiMAX: [], 342 WiMAX: [],
359 VPN: [] 343 VPN: [],
360 }; 344 };
361 345
362 var firstConnectedNetwork = null; 346 var firstConnectedNetwork = null;
363 networkStates.forEach(function(state) { 347 networkStates.forEach(function(state) {
364 var type = state.Type; 348 let type = state.Type;
365 if (!foundTypes[type]) { 349 if (!activeNetworkStatesByType.has(type)) {
366 foundTypes[type] = true; 350 activeNetworkStatesByType.set(type, state);
367 this.updateNetworkState_(type, state);
368 if (!firstConnectedNetwork && state.Type != CrOnc.Type.VPN && 351 if (!firstConnectedNetwork && state.Type != CrOnc.Type.VPN &&
369 state.ConnectionState == CrOnc.ConnectionState.CONNECTED) { 352 state.ConnectionState == CrOnc.ConnectionState.CONNECTED) {
370 firstConnectedNetwork = state; 353 firstConnectedNetwork = state;
371 } 354 }
372 } 355 }
373 networkStateLists[type].push(state); 356 newNetworkStateLists[type].push(state);
374 }, this); 357 }, this);
375 358
376 this.defaultNetwork = firstConnectedNetwork; 359 this.defaultNetwork = firstConnectedNetwork;
377 360
378 // Set any types with a deviceState and no network to a default state,
379 // and any types not found to undefined.
380 NETWORK_TYPES.forEach(function(type) {
381 if (!foundTypes[type]) {
382 var defaultState = undefined;
383 if (newDeviceStates[type])
384 defaultState = {GUID: '', Type: type};
385 this.updateNetworkState_(type, defaultState);
386 }
387 }, this);
388
389 this.networkStateLists = networkStateLists;
390
391 // Create a VPN entry in deviceStates if there are any VPN networks. 361 // Create a VPN entry in deviceStates if there are any VPN networks.
392 if (networkStateLists.VPN && networkStateLists.VPN.length > 0) { 362 if (newNetworkStateLists.VPN && newNetworkStateLists.VPN.length > 0) {
393 newDeviceStates.VPN = /** @type {DeviceStateProperties} */ ({ 363 newDeviceStates.VPN = /** @type {DeviceStateProperties} */ ({
394 Type: CrOnc.Type.VPN, 364 Type: CrOnc.Type.VPN,
395 State: chrome.networkingPrivate.DeviceStateType.ENABLED 365 State: chrome.networkingPrivate.DeviceStateType.ENABLED
396 }); 366 });
397 } 367 }
398 368
369 // Push the active networks onto newActiveNetworkStates in device order,
370 // creating an empty state for devices with no networks.
371 var newActiveNetworkStates = [];
372 this.activeNetworkIds_ = new Set;
373 for (let type in newDeviceStates) {
374 var state = activeNetworkStatesByType.get(type) || {GUID: '', Type: type};
375 newActiveNetworkStates.push(state);
376 this.activeNetworkIds_.add(state.GUID);
377 }
378
399 this.deviceStates = newDeviceStates; 379 this.deviceStates = newDeviceStates;
400 }, 380 this.networkStateLists = newNetworkStateLists;
401 381 // Set activeNetworkStates last to rebuild the dom-repeat.
402 /** 382 this.activeNetworkStates = newActiveNetworkStates;
403 * Sets 'networkStates[type]' which will update the
404 * cr-network-list-network-item associated with 'type'.
405 * @param {string} type The network type.
406 * @param {!CrOnc.NetworkStateProperties|undefined} state The state properties
407 * for the network to associate with |type|. May be undefined if there are
408 * no networks matching |type|.
409 * @private
410 */
411 updateNetworkState_: function(type, state) {
412 this.set('networkStates.' + type, state);
413 if (state)
414 this.networkIds_[state.GUID] = true;
415 }, 383 },
416 }); 384 });
417 })();
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698