| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 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 * This partially describes the network list entries passed to | 6 * This partially describes the network list entries passed to |
| 7 * refreshNetworkData. The contents of those lists actually match | 7 * refreshNetworkData. The contents of those lists actually match |
| 8 * CrOnc.NetworkConfigType with the addition of the policyManaged property. | 8 * CrOnc.NetworkConfigType with the addition of the policyManaged property. |
| 9 * TODO(stevenjb): Use networkingPrivate.getNetworks. | 9 * TODO(stevenjb): Use networkingPrivate.getNetworks. |
| 10 * @typedef {{ | 10 * @typedef {{ |
| (...skipping 357 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 368 Menu.decorate(menu); | 368 Menu.decorate(menu); |
| 369 for (var i = 0; i < this.data.menu.length; i++) { | 369 for (var i = 0; i < this.data.menu.length; i++) { |
| 370 var entry = this.data.menu[i]; | 370 var entry = this.data.menu[i]; |
| 371 createCallback_(menu, null, entry.label, entry.command); | 371 createCallback_(menu, null, entry.label, entry.command); |
| 372 } | 372 } |
| 373 return menu; | 373 return menu; |
| 374 } | 374 } |
| 375 return null; | 375 return null; |
| 376 }, | 376 }, |
| 377 | 377 |
| 378 /** | |
| 379 * Determines if a menu can be updated on the fly. Menus that cannot be | |
| 380 * updated are fully regenerated using createMenu. The advantage of | |
| 381 * updating a menu is that it can preserve ordering of networks avoiding | |
| 382 * entries from jumping around after an update. | |
| 383 * @return {boolean} Whether the menu can be updated on the fly. | |
| 384 */ | |
| 385 canUpdateMenu: function() { | 378 canUpdateMenu: function() { |
| 386 return false; | 379 return false; |
| 387 }, | 380 }, |
| 388 | 381 |
| 389 /** | 382 /** |
| 390 * Removes the current menu contents, causing it to be regenerated when the | |
| 391 * menu is shown the next time. If the menu is showing right now, its | |
| 392 * contents are regenerated immediately and the menu remains visible. | |
| 393 */ | |
| 394 refreshMenu: function() { | |
| 395 this.menu_ = null; | |
| 396 if (activeMenu_ == this.getMenuName()) | |
| 397 this.showMenu(); | |
| 398 }, | |
| 399 | |
| 400 /** | |
| 401 * Displays a popup menu. | 383 * Displays a popup menu. |
| 402 */ | 384 */ |
| 403 showMenu: function() { | 385 showMenu: function() { |
| 404 var rebuild = false; | 386 var rebuild = false; |
| 405 // Force a rescan if opening the menu for WiFi networks to ensure the | 387 // Force a rescan if opening the menu for WiFi networks to ensure the |
| 406 // list is up to date. Networks are periodically rescanned, but depending | 388 // list is up to date. Networks are periodically rescanned, but depending |
| 407 // on timing, there could be an excessive delay before the first rescan | 389 // on timing, there could be an excessive delay before the first rescan |
| 408 // unless forced. | 390 // unless forced. |
| 409 var rescan = !activeMenu_ && this.data_.key == 'WiFi'; | 391 var rescan = !activeMenu_ && this.data_.key == 'WiFi'; |
| 410 if (!this.menu_) { | 392 if (!this.menu_) { |
| 411 rebuild = true; | 393 rebuild = true; |
| 412 var existing = $(this.getMenuName()); | 394 var existing = $(this.getMenuName()); |
| 413 if (existing) { | 395 if (existing) { |
| 414 if (this.canUpdateMenu() && this.updateMenu()) | 396 if (this.updateMenu()) |
| 415 return; | 397 return; |
| 416 closeMenu_(); | 398 closeMenu_(); |
| 417 } | 399 } |
| 418 this.menu_ = this.createMenu(); | 400 this.menu_ = this.createMenu(); |
| 419 this.menu_.addEventListener('mousedown', function(e) { | 401 this.menu_.addEventListener('mousedown', function(e) { |
| 420 // Prevent blurring of list, which would close the menu. | 402 // Prevent blurring of list, which would close the menu. |
| 421 e.preventDefault(); | 403 e.preventDefault(); |
| 422 }); | 404 }); |
| 423 var parent = $('network-menus'); | 405 var parent = $('network-menus'); |
| 424 if (existing) | 406 if (existing) |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 508 createMenu: function() { | 490 createMenu: function() { |
| 509 var menu = this.ownerDocument.createElement('div'); | 491 var menu = this.ownerDocument.createElement('div'); |
| 510 menu.id = this.getMenuName(); | 492 menu.id = this.getMenuName(); |
| 511 menu.className = 'network-menu'; | 493 menu.className = 'network-menu'; |
| 512 menu.hidden = true; | 494 menu.hidden = true; |
| 513 Menu.decorate(menu); | 495 Menu.decorate(menu); |
| 514 var addendum = []; | 496 var addendum = []; |
| 515 if (this.data_.key == 'WiFi') { | 497 if (this.data_.key == 'WiFi') { |
| 516 addendum.push({ | 498 addendum.push({ |
| 517 label: loadTimeData.getString('joinOtherNetwork'), | 499 label: loadTimeData.getString('joinOtherNetwork'), |
| 518 command: createAddNonVPNConnectionCallback_('WiFi'), | 500 command: createAddConnectionCallback_('WiFi'), |
| 519 data: {} | 501 data: {} |
| 520 }); | 502 }); |
| 521 } else if (this.data_.key == 'Cellular') { | 503 } else if (this.data_.key == 'Cellular') { |
| 522 if (cellularEnabled_ && cellularSupportsScan_) { | 504 if (cellularEnabled_ && cellularSupportsScan_) { |
| 523 addendum.push({ | 505 addendum.push({ |
| 524 label: loadTimeData.getString('otherCellularNetworks'), | 506 label: loadTimeData.getString('otherCellularNetworks'), |
| 525 command: createAddNonVPNConnectionCallback_('Cellular'), | 507 command: createAddConnectionCallback_('Cellular'), |
| 526 addClass: ['other-cellulars'], | 508 addClass: ['other-cellulars'], |
| 527 data: {} | 509 data: {} |
| 528 }); | 510 }); |
| 529 } | 511 } |
| 530 | 512 |
| 531 var label = enableDataRoaming_ ? 'disableDataRoaming' : | 513 var label = enableDataRoaming_ ? 'disableDataRoaming' : |
| 532 'enableDataRoaming'; | 514 'enableDataRoaming'; |
| 533 var disabled = !loadTimeData.getValue('loggedInAsOwner'); | 515 var disabled = !loadTimeData.getValue('loggedInAsOwner'); |
| 534 var entry = {label: loadTimeData.getString(label), | 516 var entry = {label: loadTimeData.getString(label), |
| 535 data: {}}; | 517 data: {}}; |
| 536 if (disabled) { | 518 if (disabled) { |
| 537 entry.command = null; | 519 entry.command = null; |
| 538 entry.tooltip = | 520 entry.tooltip = |
| 539 loadTimeData.getString('dataRoamingDisableToggleTooltip'); | 521 loadTimeData.getString('dataRoamingDisableToggleTooltip'); |
| 540 } else { | 522 } else { |
| 541 var self = this; | 523 var self = this; |
| 542 entry.command = function() { | 524 entry.command = function() { |
| 543 options.Preferences.setBooleanPref( | 525 options.Preferences.setBooleanPref( |
| 544 'cros.signed.data_roaming_enabled', | 526 'cros.signed.data_roaming_enabled', |
| 545 !enableDataRoaming_, true); | 527 !enableDataRoaming_, true); |
| 546 // Force revalidation of the menu the next time it is displayed. | 528 // Force revalidation of the menu the next time it is displayed. |
| 547 self.menu_ = null; | 529 self.menu_ = null; |
| 548 }; | 530 }; |
| 549 } | 531 } |
| 550 addendum.push(entry); | 532 addendum.push(entry); |
| 551 } else if (this.data_.key == 'VPN') { | 533 } else if (this.data_.key == 'VPN') { |
| 552 addendum = addendum.concat(createAddVPNConnectionEntries_()); | 534 addendum.push({ |
| 535 label: loadTimeData.getString('joinOtherNetwork'), |
| 536 command: createAddConnectionCallback_('VPN'), |
| 537 data: {} |
| 538 }); |
| 553 } | 539 } |
| 554 | 540 |
| 555 var list = this.data.rememberedNetworks; | 541 var list = this.data.rememberedNetworks; |
| 556 if (list && list.length > 0) { | 542 if (list && list.length > 0) { |
| 557 var callback = function(list) { | 543 var callback = function(list) { |
| 558 $('remembered-network-list').clear(); | 544 $('remembered-network-list').clear(); |
| 559 var dialog = options.PreferredNetworks.getInstance(); | 545 var dialog = options.PreferredNetworks.getInstance(); |
| 560 PageManager.showPageByName('preferredNetworksPage', false); | 546 PageManager.showPageByName('preferredNetworksPage', false); |
| 561 dialog.update(list); | 547 dialog.update(list); |
| 562 sendChromeMetricsAction('Options_NetworkShowPreferred'); | 548 sendChromeMetricsAction('Options_NetworkShowPreferred'); |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 641 separator = false; | 627 separator = false; |
| 642 } else if (!separator) { | 628 } else if (!separator) { |
| 643 menu.appendChild(MenuItem.createSeparator()); | 629 menu.appendChild(MenuItem.createSeparator()); |
| 644 separator = true; | 630 separator = true; |
| 645 } | 631 } |
| 646 } | 632 } |
| 647 } | 633 } |
| 648 return menu; | 634 return menu; |
| 649 }, | 635 }, |
| 650 | 636 |
| 651 /** @override */ | 637 /** |
| 638 * Determines if a menu can be updated on the fly. Menus that cannot be |
| 639 * updated are fully regenerated using createMenu. The advantage of |
| 640 * updating a menu is that it can preserve ordering of networks avoiding |
| 641 * entries from jumping around after an update. |
| 642 */ |
| 652 canUpdateMenu: function() { | 643 canUpdateMenu: function() { |
| 653 return this.data_.key == 'WiFi' && activeMenu_ == this.getMenuName(); | 644 return this.data_.key == 'WiFi' && activeMenu_ == this.getMenuName(); |
| 654 }, | 645 }, |
| 655 | 646 |
| 656 /** | 647 /** |
| 657 * Updates an existing menu. Updated menus preserve ordering of prior | 648 * Updates an existing menu. Updated menus preserve ordering of prior |
| 658 * entries. During the update process, the ordering may differ from the | 649 * entries. During the update process, the ordering may differ from the |
| 659 * preferred ordering as determined by the network library. If the | 650 * preferred ordering as determined by the network library. If the |
| 660 * ordering becomes potentially out of sync, then the updated menu is | 651 * ordering becomes potentially out of sync, then the updated menu is |
| 661 * marked for disposal on close. Reopening the menu will force a | 652 * marked for disposal on close. Reopening the menu will force a |
| 662 * regeneration, which will in turn fix the ordering. This method must only | 653 * regeneration, which will in turn fix the ordering. |
| 663 * be called if canUpdateMenu() returned |true|. | |
| 664 * @return {boolean} True if successfully updated. | 654 * @return {boolean} True if successfully updated. |
| 665 */ | 655 */ |
| 666 updateMenu: function() { | 656 updateMenu: function() { |
| 657 if (!this.canUpdateMenu()) |
| 658 return false; |
| 667 var oldMenu = $(this.getMenuName()); | 659 var oldMenu = $(this.getMenuName()); |
| 668 var group = oldMenu.getElementsByClassName('network-menu-group')[0]; | 660 var group = oldMenu.getElementsByClassName('network-menu-group')[0]; |
| 669 if (!group) | 661 if (!group) |
| 670 return false; | 662 return false; |
| 671 var newMenu = this.createMenu(); | 663 var newMenu = this.createMenu(); |
| 672 var discardOnClose = false; | 664 var discardOnClose = false; |
| 673 var oldNetworkButtons = this.extractNetworkConnectButtons_(oldMenu); | 665 var oldNetworkButtons = this.extractNetworkConnectButtons_(oldMenu); |
| 674 var newNetworkButtons = this.extractNetworkConnectButtons_(newMenu); | 666 var newNetworkButtons = this.extractNetworkConnectButtons_(newMenu); |
| 675 for (var key in oldNetworkButtons) { | 667 for (var key in oldNetworkButtons) { |
| 676 if (newNetworkButtons[key]) { | 668 if (newNetworkButtons[key]) { |
| (...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 843 this.autoExpands = true; | 835 this.autoExpands = true; |
| 844 this.dataModel = new ArrayDataModel([]); | 836 this.dataModel = new ArrayDataModel([]); |
| 845 this.selectionModel = new ListSingleSelectionModel(); | 837 this.selectionModel = new ListSingleSelectionModel(); |
| 846 this.addEventListener('blur', this.onBlur_.bind(this)); | 838 this.addEventListener('blur', this.onBlur_.bind(this)); |
| 847 this.selectionModel.addEventListener('change', | 839 this.selectionModel.addEventListener('change', |
| 848 this.onSelectionChange_.bind(this)); | 840 this.onSelectionChange_.bind(this)); |
| 849 | 841 |
| 850 // Wi-Fi control is always visible. | 842 // Wi-Fi control is always visible. |
| 851 this.update({key: 'WiFi', networkList: []}); | 843 this.update({key: 'WiFi', networkList: []}); |
| 852 | 844 |
| 853 this.updateAddConnectionMenuEntries_(); | 845 var entryAddWifi = { |
| 846 label: loadTimeData.getString('addConnectionWifi'), |
| 847 command: createAddConnectionCallback_('WiFi') |
| 848 }; |
| 849 var entryAddVPN = { |
| 850 label: loadTimeData.getString('addConnectionVPN'), |
| 851 command: createAddConnectionCallback_('VPN') |
| 852 }; |
| 853 this.update({key: 'addConnection', |
| 854 iconType: 'add-connection', |
| 855 menu: [entryAddWifi, entryAddVPN] |
| 856 }); |
| 854 | 857 |
| 855 var prefs = options.Preferences.getInstance(); | 858 var prefs = options.Preferences.getInstance(); |
| 856 prefs.addEventListener('cros.signed.data_roaming_enabled', | 859 prefs.addEventListener('cros.signed.data_roaming_enabled', |
| 857 function(event) { | 860 function(event) { |
| 858 enableDataRoaming_ = event.value.value; | 861 enableDataRoaming_ = event.value.value; |
| 859 }); | 862 }); |
| 860 this.endBatchUpdates(); | 863 this.endBatchUpdates(); |
| 861 | |
| 862 options.VPNProviders.addObserver(this.onVPNProvidersChanged_.bind(this)); | |
| 863 }, | 864 }, |
| 864 | 865 |
| 865 /** | 866 /** |
| 866 * Called when the list of VPN providers changes. Refreshes the contents of | |
| 867 * menus that list VPN providers. | |
| 868 * @private | |
| 869 */ | |
| 870 onVPNProvidersChanged_() { | |
| 871 // Refresh the contents of the VPN menu. | |
| 872 var index = this.indexOf('VPN'); | |
| 873 if (index != undefined) | |
| 874 this.getListItemByIndex(index).refreshMenu(); | |
| 875 | |
| 876 // Refresh the contents of the "add connection" menu. | |
| 877 this.updateAddConnectionMenuEntries_(); | |
| 878 index = this.indexOf('addConnection'); | |
| 879 if (index != undefined) | |
| 880 this.getListItemByIndex(index).refreshMenu(); | |
| 881 }, | |
| 882 | |
| 883 /** | |
| 884 * Updates the entries in the "add connection" menu, based on the VPN | |
| 885 * providers currently enabled in the primary user's profile. | |
| 886 * @private | |
| 887 */ | |
| 888 updateAddConnectionMenuEntries_() { | |
| 889 var entries = [{ | |
| 890 label: loadTimeData.getString('addConnectionWifi'), | |
| 891 command: createAddNonVPNConnectionCallback_('WiFi') | |
| 892 }]; | |
| 893 entries = entries.concat(createAddVPNConnectionEntries_()); | |
| 894 this.update({key: 'addConnection', | |
| 895 iconType: 'add-connection', | |
| 896 menu: entries | |
| 897 }); | |
| 898 }, | |
| 899 | |
| 900 /** | |
| 901 * When the list loses focus, unselect all items in the list and close the | 867 * When the list loses focus, unselect all items in the list and close the |
| 902 * active menu. | 868 * active menu. |
| 903 * @private | 869 * @private |
| 904 */ | 870 */ |
| 905 onBlur_: function() { | 871 onBlur_: function() { |
| 906 this.selectionModel.unselectAll(); | 872 this.selectionModel.unselectAll(); |
| 907 closeMenu_(); | 873 closeMenu_(); |
| 908 }, | 874 }, |
| 909 | 875 |
| 910 /** | 876 /** |
| (...skipping 334 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1245 for (var i = 0; i < networkList.length; i++) { | 1211 for (var i = 0; i < networkList.length; i++) { |
| 1246 var entry = networkList[i]; | 1212 var entry = networkList[i]; |
| 1247 if (entry.ConnectionState == 'Connected' || | 1213 if (entry.ConnectionState == 'Connected' || |
| 1248 entry.ConnectionState == 'Connecting') | 1214 entry.ConnectionState == 'Connecting') |
| 1249 return entry; | 1215 return entry; |
| 1250 } | 1216 } |
| 1251 return null; | 1217 return null; |
| 1252 } | 1218 } |
| 1253 | 1219 |
| 1254 /** | 1220 /** |
| 1255 * Creates a callback function that adds a new connection of the given type. | 1221 * Create a callback function that adds a new connection of the given type. |
| 1256 * This method may be used for all network types except VPN. | |
| 1257 * @param {string} type An ONC network type | 1222 * @param {string} type An ONC network type |
| 1258 * @return {function()} The created callback. | 1223 * @return {function()} The created callback. |
| 1259 * @private | 1224 * @private |
| 1260 */ | 1225 */ |
| 1261 function createAddNonVPNConnectionCallback_(type) { | 1226 function createAddConnectionCallback_(type) { |
| 1262 return function() { | 1227 return function() { |
| 1263 if (type == 'WiFi') | 1228 if (type == 'WiFi') |
| 1264 sendChromeMetricsAction('Options_NetworkJoinOtherWifi'); | 1229 sendChromeMetricsAction('Options_NetworkJoinOtherWifi'); |
| 1265 chrome.send('addNonVPNConnection', [type]); | 1230 else if (type == 'VPN') |
| 1231 sendChromeMetricsAction('Options_NetworkJoinOtherVPN'); |
| 1232 chrome.send('addConnection', [type]); |
| 1266 }; | 1233 }; |
| 1267 } | 1234 } |
| 1268 | 1235 |
| 1269 /** | 1236 /** |
| 1270 * Creates a callback function that shows the "add network" dialog for the | |
| 1271 * built-in OpenVPN/L2TP VPN provider. | |
| 1272 * @return {function()} The created callback. | |
| 1273 * @private | |
| 1274 */ | |
| 1275 function createVPNConnectionWithAddBuiltInProviderCallback_() { | |
| 1276 return function() { | |
| 1277 sendChromeMetricsAction('Options_NetworkAddVPNBuiltIn'); | |
| 1278 chrome.send('addVPNConnection'); | |
| 1279 }; | |
| 1280 } | |
| 1281 | |
| 1282 /** | |
| 1283 * Creates a callback function that asks the third-party VPN provider | |
| 1284 * identified by |extensionID| to show its "add network" dialog. | |
| 1285 * @param {string} providerID The VPN provider's extension ID. | |
| 1286 * @return {function()} The created callback. | |
| 1287 * @private | |
| 1288 */ | |
| 1289 function createAddVPNConnectionWithThirdPartyProviderCallback_(extensionID) { | |
| 1290 return function() { | |
| 1291 sendChromeMetricsAction('Options_NetworkAddVPNThirdParty'); | |
| 1292 chrome.send('addVPNConnection', [extensionID]); | |
| 1293 }; | |
| 1294 } | |
| 1295 | |
| 1296 /** | |
| 1297 * Generates an "add network" entry for each VPN provider currently enabled in | |
| 1298 * the primary user's profile. | |
| 1299 * @return {!Array<{label: string, command: function(), data: !Object}>} The | |
| 1300 * list of entries. | |
| 1301 * @private | |
| 1302 */ | |
| 1303 function createAddVPNConnectionEntries_() { | |
| 1304 var entries = []; | |
| 1305 var providers = options.VPNProviders.getProviders(); | |
| 1306 for (var i = 0; i < providers.length; ++i) { | |
| 1307 entries.push({ | |
| 1308 label: loadTimeData.getStringF('addConnectionVPNTemplate', | |
| 1309 providers[i].name), | |
| 1310 command: providers[i].extensionID ? | |
| 1311 createAddVPNConnectionWithThirdPartyProviderCallback_( | |
| 1312 providers[i].extensionID) : | |
| 1313 createVPNConnectionWithAddBuiltInProviderCallback_(), | |
| 1314 data: {} | |
| 1315 }); | |
| 1316 } | |
| 1317 return entries; | |
| 1318 } | |
| 1319 | |
| 1320 /** | |
| 1321 * Whether the Network list is disabled. Only used for display purpose. | 1237 * Whether the Network list is disabled. Only used for display purpose. |
| 1322 */ | 1238 */ |
| 1323 cr.defineProperty(NetworkList, 'disabled', cr.PropertyKind.BOOL_ATTR); | 1239 cr.defineProperty(NetworkList, 'disabled', cr.PropertyKind.BOOL_ATTR); |
| 1324 | 1240 |
| 1325 // Export | 1241 // Export |
| 1326 return { | 1242 return { |
| 1327 NetworkList: NetworkList | 1243 NetworkList: NetworkList |
| 1328 }; | 1244 }; |
| 1329 }); | 1245 }); |
| OLD | NEW |