| OLD | NEW |
| (Empty) |
| 1 // Copyright (c) 2011 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 cr.define('options.internet', function() { | |
| 6 | |
| 7 /** | |
| 8 * Network settings constants. These enums usually match their C++ | |
| 9 * counterparts. | |
| 10 */ | |
| 11 function Constants() {} | |
| 12 // Minimum length for wireless network password. | |
| 13 Constants.MIN_WIRELESS_PASSWORD_LENGTH = 5; | |
| 14 // Minimum length for SSID name. | |
| 15 Constants.MIN_WIRELESS_SSID_LENGTH = 1; | |
| 16 // Cellular activation states: | |
| 17 Constants.ACTIVATION_STATE_UNKNOWN = 0; | |
| 18 Constants.ACTIVATION_STATE_ACTIVATED = 1; | |
| 19 Constants.ACTIVATION_STATE_ACTIVATING = 2; | |
| 20 Constants.ACTIVATION_STATE_NOT_ACTIVATED = 3; | |
| 21 Constants.ACTIVATION_STATE_PARTIALLY_ACTIVATED = 4; | |
| 22 // Network types: | |
| 23 Constants.TYPE_UNKNOWN = 0; | |
| 24 Constants.TYPE_ETHERNET = 1; | |
| 25 Constants.TYPE_WIFI = 2; | |
| 26 Constants.TYPE_WIMAX = 3; | |
| 27 Constants.TYPE_BLUETOOTH = 4; | |
| 28 Constants.TYPE_CELLULAR = 5; | |
| 29 | |
| 30 /** | |
| 31 * Creates a new network list div. | |
| 32 * @param {Object=} opt_propertyBag Optional properties. | |
| 33 * @constructor | |
| 34 * @extends {HTMLDivElement} | |
| 35 */ | |
| 36 var NetworkElement = cr.ui.define('div'); | |
| 37 | |
| 38 NetworkElement.prototype = { | |
| 39 __proto__: HTMLDivElement.prototype, | |
| 40 | |
| 41 /** @inheritDoc */ | |
| 42 decorate: function() { | |
| 43 this.addEventListener('click', this.handleClick_); | |
| 44 }, | |
| 45 | |
| 46 /** | |
| 47 * Loads given network list. | |
| 48 * @param {Array} networks An array of network object. | |
| 49 */ | |
| 50 load: function(networks) { | |
| 51 this.textContent = ''; | |
| 52 | |
| 53 for (var i = 0; i < networks.length; ++i) { | |
| 54 this.appendChild(new NetworkItem(networks[i])); | |
| 55 } | |
| 56 }, | |
| 57 | |
| 58 /** | |
| 59 * Handles click on network list and triggers actions when clicked on | |
| 60 * a NetworkListItem button. | |
| 61 * @private | |
| 62 * @param {!Event} e The click event object. | |
| 63 */ | |
| 64 handleClick_: function(e) { | |
| 65 // We shouldn't respond to click events selecting an input, | |
| 66 // so return on those. | |
| 67 if (e.target.tagName == 'INPUT') { | |
| 68 return; | |
| 69 } | |
| 70 // Handle left button click | |
| 71 if (e.button == 0) { | |
| 72 var el = e.target; | |
| 73 // If click is on action buttons of a network item. | |
| 74 if (!(el.buttonType && el.networkType && el.servicePath)) { | |
| 75 if (el.buttonType) { | |
| 76 return; | |
| 77 } | |
| 78 // If click is on a network item or its label, walk up the DOM tree | |
| 79 // to find the network item. | |
| 80 var item = el; | |
| 81 while (item && !item.data) { | |
| 82 item = item.parentNode; | |
| 83 } | |
| 84 if (item.connecting) | |
| 85 return; | |
| 86 | |
| 87 if (item) { | |
| 88 var data = item.data; | |
| 89 // Don't try to connect to Ethernet or unactivated Cellular. | |
| 90 if (data && (data.networkType == 1 || | |
| 91 (data.networkType == 5 && data.activation_state != 1))) | |
| 92 return; | |
| 93 for (var i = 0; i < this.childNodes.length; i++) { | |
| 94 if (this.childNodes[i] != item) | |
| 95 this.childNodes[i].hidePassword(); | |
| 96 } | |
| 97 InternetOptions.unlockUpdates(); | |
| 98 // If clicked on other networks item. | |
| 99 if (data && data.servicePath == '?') { | |
| 100 if (InternetOptions.useSettingsUI && | |
| 101 data.type != options.internet.Constants.TYPE_CELLULAR) { | |
| 102 item.showOtherLogin(); | |
| 103 } else { | |
| 104 chrome.send('buttonClickCallback', | |
| 105 [String(data.networkType), | |
| 106 data.servicePath, | |
| 107 'connect']); | |
| 108 } | |
| 109 } | |
| 110 } | |
| 111 } | |
| 112 } | |
| 113 } | |
| 114 }; | |
| 115 | |
| 116 /** | |
| 117 * Creates a new network item. | |
| 118 * @param {Object} network The network this represents. | |
| 119 * @constructor | |
| 120 * @extends {HTMLDivElement} | |
| 121 */ | |
| 122 function NetworkItem(network) { | |
| 123 var el = cr.doc.createElement('div'); | |
| 124 el.data = { | |
| 125 servicePath: network[0], | |
| 126 networkName: network[1], | |
| 127 networkStatus: network[2], | |
| 128 networkType: network[3], | |
| 129 connected: network[4], | |
| 130 connecting: network[5], | |
| 131 iconURL: network[6], | |
| 132 remembered: network[7], | |
| 133 activation_state: network[8], | |
| 134 needs_new_plan: network[9], | |
| 135 connectable: network[10] | |
| 136 }; | |
| 137 NetworkItem.decorate(el); | |
| 138 return el; | |
| 139 } | |
| 140 | |
| 141 | |
| 142 /** | |
| 143 * Decorates an element as a network item. | |
| 144 * @param {!HTMLElement} el The element to decorate. | |
| 145 */ | |
| 146 NetworkItem.decorate = function(el) { | |
| 147 el.__proto__ = NetworkItem.prototype; | |
| 148 el.decorate(); | |
| 149 }; | |
| 150 | |
| 151 NetworkItem.prototype = { | |
| 152 __proto__: HTMLDivElement.prototype, | |
| 153 | |
| 154 /** @inheritDoc */ | |
| 155 decorate: function() { | |
| 156 this.className = 'network-item'; | |
| 157 this.connected = this.data.connected; | |
| 158 this.connectable = this.data.connectable; | |
| 159 this.other = this.data.servicePath == '?'; | |
| 160 this.id = this.data.servicePath; | |
| 161 // textDiv holds icon, name and status text. | |
| 162 var textDiv = this.ownerDocument.createElement('div'); | |
| 163 textDiv.className = 'network-item-text'; | |
| 164 if (this.data.iconURL) { | |
| 165 textDiv.style.backgroundImage = url(this.data.iconURL); | |
| 166 } | |
| 167 | |
| 168 var nameEl = this.ownerDocument.createElement('div'); | |
| 169 nameEl.className = 'network-name-label'; | |
| 170 nameEl.textContent = this.data.networkName; | |
| 171 textDiv.appendChild(nameEl); | |
| 172 | |
| 173 if (this.other) { | |
| 174 // No status and buttons for "Other..." | |
| 175 this.appendChild(textDiv); | |
| 176 return; | |
| 177 } | |
| 178 | |
| 179 // Only show status text for networks other than "remembered". | |
| 180 if (!this.data.remembered) { | |
| 181 var statusEl = this.ownerDocument.createElement('div'); | |
| 182 statusEl.className = 'network-status-label'; | |
| 183 statusEl.textContent = this.data.networkStatus; | |
| 184 textDiv.appendChild(statusEl); | |
| 185 } | |
| 186 | |
| 187 this.appendChild(textDiv); | |
| 188 | |
| 189 var spacerDiv = this.ownerDocument.createElement('div'); | |
| 190 spacerDiv.className = 'network-item-box-spacer'; | |
| 191 this.appendChild(spacerDiv); | |
| 192 | |
| 193 var buttonsDiv = this.ownerDocument.createElement('div'); | |
| 194 var self = this; | |
| 195 if (!this.data.remembered) { | |
| 196 var no_plan = | |
| 197 this.data.networkType == Constants.TYPE_CELLULAR && | |
| 198 this.data.needs_new_plan; | |
| 199 var show_activate = | |
| 200 (this.data.networkType == Constants.TYPE_CELLULAR && | |
| 201 this.data.activation_state != | |
| 202 Constants.ACTIVATION_STATE_ACTIVATED && | |
| 203 this.data.activation_state != | |
| 204 Constants.ACTIVATION_STATE_ACTIVATING); | |
| 205 | |
| 206 // Show [Activate] button for non-activated Cellular network. | |
| 207 if (show_activate || no_plan) { | |
| 208 var button_name = no_plan ? 'buyplan_button' : 'activate_button'; | |
| 209 buttonsDiv.appendChild( | |
| 210 this.createButton_(button_name, 'activate', | |
| 211 function(e) { | |
| 212 chrome.send('buttonClickCallback', | |
| 213 [String(self.data.networkType), | |
| 214 self.data.servicePath, | |
| 215 'activate']); | |
| 216 })); | |
| 217 } | |
| 218 // Show disconnect button if not ethernet. | |
| 219 if (this.data.networkType != Constants.TYPE_ETHERNET && | |
| 220 this.data.connected) { | |
| 221 buttonsDiv.appendChild( | |
| 222 this.createButton_('disconnect_button', 'disconnect', | |
| 223 function(e) { | |
| 224 chrome.send('buttonClickCallback', | |
| 225 [String(self.data.networkType), | |
| 226 self.data.servicePath, | |
| 227 'disconnect']); | |
| 228 })); | |
| 229 } | |
| 230 if (!this.data.connected && !this.data.connecting) { | |
| 231 // connect button (if not ethernet and not showing activate button) | |
| 232 if (this.data.networkType != Constants.TYPE_ETHERNET && | |
| 233 !show_activate && !no_plan) { | |
| 234 buttonsDiv.appendChild( | |
| 235 this.createButton_('connect_button', 'connect', | |
| 236 function(e) { | |
| 237 chrome.send('buttonClickCallback', | |
| 238 [String(self.data.networkType), | |
| 239 self.data.servicePath, | |
| 240 'connect']); | |
| 241 })); | |
| 242 } | |
| 243 } | |
| 244 if (this.data.connected || | |
| 245 this.data.networkType == Constants.TYPE_CELLULAR) { | |
| 246 buttonsDiv.appendChild( | |
| 247 this.createButton_('options_button', 'options', | |
| 248 function(e) { | |
| 249 chrome.send('buttonClickCallback', | |
| 250 [String(self.data.networkType), | |
| 251 self.data.servicePath, | |
| 252 'options']); | |
| 253 })); | |
| 254 } | |
| 255 } else { | |
| 256 // Put "Forget this network" button. | |
| 257 var button = this.createButton_('forget_button', 'forget', | |
| 258 function(e) { | |
| 259 chrome.send('buttonClickCallback', | |
| 260 [String(self.data.networkType), | |
| 261 self.data.servicePath, | |
| 262 'forget']); | |
| 263 }); | |
| 264 if (!AccountsOptions.currentUserIsOwner()) { | |
| 265 // Disable this for guest non-Owners. | |
| 266 button.disabled = true; | |
| 267 } | |
| 268 | |
| 269 buttonsDiv.appendChild(button); | |
| 270 } | |
| 271 this.appendChild(buttonsDiv); | |
| 272 }, | |
| 273 | |
| 274 showPassword: function() { | |
| 275 if (this.connecting) | |
| 276 return; | |
| 277 | |
| 278 InternetOptions.lockUpdates(); | |
| 279 | |
| 280 var passwordDiv = this.ownerDocument.createElement('div'); | |
| 281 passwordDiv.className = 'network-password'; | |
| 282 var passInput = this.ownerDocument.createElement('input'); | |
| 283 passwordDiv.appendChild(passInput); | |
| 284 passInput.placeholder = localStrings.getString('inetPassPrompt'); | |
| 285 passInput.type = 'password'; | |
| 286 var buttonEl = this.ownerDocument.createElement('button'); | |
| 287 buttonEl.textContent = localStrings.getString('inetLogin'); | |
| 288 buttonEl.addEventListener('click', this.handleLogin_); | |
| 289 buttonEl.servicePath = this.data.servicePath; | |
| 290 buttonEl.style.right = '0'; | |
| 291 buttonEl.style.position = 'absolute'; | |
| 292 buttonEl.style.visibility = 'visible'; | |
| 293 buttonEl.disabled = true; | |
| 294 | |
| 295 var togglePassLabel = this.ownerDocument.createElement('label'); | |
| 296 togglePassLabel.style.display = 'inline'; | |
| 297 var togglePassSpan = this.ownerDocument.createElement('span'); | |
| 298 var togglePassCheckbox = this.ownerDocument.createElement('input'); | |
| 299 togglePassCheckbox.type = 'checkbox'; | |
| 300 togglePassCheckbox.checked = false; | |
| 301 togglePassCheckbox.target = passInput; | |
| 302 togglePassCheckbox.addEventListener('change', this.handleShowPass_); | |
| 303 togglePassSpan.textContent = localStrings.getString('inetShowPass'); | |
| 304 togglePassLabel.appendChild(togglePassCheckbox); | |
| 305 togglePassLabel.appendChild(togglePassSpan); | |
| 306 passwordDiv.appendChild(togglePassLabel); | |
| 307 | |
| 308 // Disable login button if there is no password. | |
| 309 passInput.addEventListener('keyup', function(e) { | |
| 310 buttonEl.disabled = | |
| 311 passInput.value.length < Constants.MIN_WIRELESS_PASSWORD_LENGTH; | |
| 312 }); | |
| 313 | |
| 314 passwordDiv.appendChild(buttonEl); | |
| 315 this.connecting = true; | |
| 316 this.appendChild(passwordDiv); | |
| 317 }, | |
| 318 | |
| 319 handleShowPass_: function(e) { | |
| 320 var target = e.target; | |
| 321 if (target.checked) { | |
| 322 target.target.type = 'text'; | |
| 323 } else { | |
| 324 target.target.type = 'password'; | |
| 325 } | |
| 326 }, | |
| 327 | |
| 328 hidePassword: function() { | |
| 329 this.connecting = false; | |
| 330 var children = this.childNodes; | |
| 331 // Remove all password divs starting from the end. | |
| 332 for (var i = children.length-1; i >= 0; i--) { | |
| 333 if (children[i].className == 'network-password') { | |
| 334 this.removeChild(children[i]); | |
| 335 } | |
| 336 } | |
| 337 }, | |
| 338 | |
| 339 showOtherLogin: function() { | |
| 340 if (this.connecting) | |
| 341 return; | |
| 342 | |
| 343 InternetOptions.lockUpdates(); | |
| 344 | |
| 345 var ssidDiv = this.ownerDocument.createElement('div'); | |
| 346 ssidDiv.className = 'network-password'; | |
| 347 var ssidInput = this.ownerDocument.createElement('input'); | |
| 348 ssidInput.placeholder = localStrings.getString('inetSsidPrompt'); | |
| 349 ssidDiv.appendChild(ssidInput); | |
| 350 | |
| 351 var securityDiv = this.ownerDocument.createElement('div'); | |
| 352 securityDiv.className = 'network-password'; | |
| 353 var securityInput = this.ownerDocument.createElement('select'); | |
| 354 var securityNoneOption = this.ownerDocument.createElement('option'); | |
| 355 securityNoneOption.value = 'none'; | |
| 356 securityNoneOption.label = localStrings.getString('inetSecurityNone'); | |
| 357 securityInput.appendChild(securityNoneOption); | |
| 358 var securityWEPOption = this.ownerDocument.createElement('option'); | |
| 359 securityWEPOption.value = 'wep'; | |
| 360 securityWEPOption.label = localStrings.getString('inetSecurityWEP'); | |
| 361 securityInput.appendChild(securityWEPOption); | |
| 362 var securityWPAOption = this.ownerDocument.createElement('option'); | |
| 363 securityWPAOption.value = 'wpa'; | |
| 364 securityWPAOption.label = localStrings.getString('inetSecurityWPA'); | |
| 365 securityInput.appendChild(securityWPAOption); | |
| 366 var securityRSNOption = this.ownerDocument.createElement('option'); | |
| 367 securityRSNOption.value = 'rsn'; | |
| 368 securityRSNOption.label = localStrings.getString('inetSecurityRSN'); | |
| 369 securityInput.appendChild(securityRSNOption); | |
| 370 securityDiv.appendChild(securityInput); | |
| 371 | |
| 372 var passwordDiv = this.ownerDocument.createElement('div'); | |
| 373 passwordDiv.className = 'network-password'; | |
| 374 var passInput = this.ownerDocument.createElement('input'); | |
| 375 passInput.placeholder = localStrings.getString('inetPassPrompt'); | |
| 376 passInput.type = 'password'; | |
| 377 passInput.disabled = true; | |
| 378 passwordDiv.appendChild(passInput); | |
| 379 | |
| 380 var togglePassLabel = this.ownerDocument.createElement('label'); | |
| 381 togglePassLabel.style.display = 'inline'; | |
| 382 var togglePassSpan = this.ownerDocument.createElement('span'); | |
| 383 var togglePassCheckbox = this.ownerDocument.createElement('input'); | |
| 384 togglePassCheckbox.type = 'checkbox'; | |
| 385 togglePassCheckbox.checked = false; | |
| 386 togglePassCheckbox.target = passInput; | |
| 387 togglePassCheckbox.addEventListener('change', this.handleShowPass_); | |
| 388 togglePassSpan.textContent = localStrings.getString('inetShowPass'); | |
| 389 togglePassLabel.appendChild(togglePassCheckbox); | |
| 390 togglePassLabel.appendChild(togglePassSpan); | |
| 391 passwordDiv.appendChild(togglePassLabel); | |
| 392 | |
| 393 var buttonEl = | |
| 394 this.createButton_('inetLogin', true, this.handleOtherLogin_); | |
| 395 buttonEl.style.right = '0'; | |
| 396 buttonEl.style.position = 'absolute'; | |
| 397 buttonEl.style.visibility = 'visible'; | |
| 398 buttonEl.disabled = true; | |
| 399 passwordDiv.appendChild(buttonEl); | |
| 400 | |
| 401 this.appendChild(ssidDiv); | |
| 402 this.appendChild(securityDiv); | |
| 403 this.appendChild(passwordDiv); | |
| 404 | |
| 405 securityInput.addEventListener('change', function(e) { | |
| 406 // If changed to None, then disable passInput and clear it out. | |
| 407 // Otherwise enable it. | |
| 408 if (securityInput.value == 'none') { | |
| 409 passInput.disabled = true; | |
| 410 passInput.value = ''; | |
| 411 } else { | |
| 412 passInput.disabled = false; | |
| 413 } | |
| 414 }); | |
| 415 | |
| 416 var keyup_listener = function(e) { | |
| 417 // Disable login button if ssid is not long enough or | |
| 418 // password is not long enough (unless no security) | |
| 419 var ssid_good = | |
| 420 ssidInput.value.length >= Constants.MIN_WIRELESS_SSID_LENGTH; | |
| 421 var pass_good = | |
| 422 securityInput.value == 'none' || | |
| 423 passInput.value.length >= Constants.MIN_WIRELESS_PASSWORD_LENGTH; | |
| 424 buttonEl.disabled = !ssid_good || !pass_good; | |
| 425 }; | |
| 426 ssidInput.addEventListener('keyup', keyup_listener); | |
| 427 securityInput.addEventListener('change', keyup_listener); | |
| 428 passInput.addEventListener('keyup', keyup_listener); | |
| 429 this.connecting = true; | |
| 430 }, | |
| 431 | |
| 432 handleLogin_: function(e) { | |
| 433 // The user has clicked on the Login button. It's now safe to | |
| 434 // unclock UI updates. | |
| 435 InternetOptions.unlockUpdates(); | |
| 436 var el = e.target; | |
| 437 var parent = el.parentNode; | |
| 438 el.disabled = true; | |
| 439 var input = parent.firstChild; | |
| 440 input.disabled = true; | |
| 441 chrome.send('loginToNetwork', [el.servicePath, input.value]); | |
| 442 }, | |
| 443 | |
| 444 handleOtherLogin_: function(e) { | |
| 445 // See comments in handleLogin_(). | |
| 446 InternetOptions.unlockUpdates(); | |
| 447 var el = e.target; | |
| 448 var parent = el.parentNode.parentNode; | |
| 449 el.disabled = true; | |
| 450 var ssid = parent.childNodes[1].firstChild; | |
| 451 var sec = parent.childNodes[2].firstChild; | |
| 452 var pass = parent.childNodes[3].firstChild; | |
| 453 sec.disabled = true; | |
| 454 ssid.disabled = true; | |
| 455 pass.disabled = true; | |
| 456 chrome.send('loginToOtherNetwork', [sec.value, ssid.value, pass.value]); | |
| 457 }, | |
| 458 | |
| 459 /** | |
| 460 * Creates a button for interacting with a network. | |
| 461 * @param {Object} name The name of the localStrings to use for the text. | |
| 462 * @param {Object} type The type of button. | |
| 463 */ | |
| 464 createButton_: function(name, type, callback) { | |
| 465 var buttonEl = this.ownerDocument.createElement('button'); | |
| 466 buttonEl.buttonType = type; | |
| 467 buttonEl.textContent = localStrings.getString(name); | |
| 468 buttonEl.addEventListener('click', callback); | |
| 469 return buttonEl; | |
| 470 } | |
| 471 }; | |
| 472 | |
| 473 /** | |
| 474 * Whether the underlying network is connected. Only used for display purpose. | |
| 475 * @type {boolean} | |
| 476 */ | |
| 477 cr.defineProperty(NetworkItem, 'connected', cr.PropertyKind.BOOL_ATTR); | |
| 478 | |
| 479 /** | |
| 480 * Whether the underlying network is currently connecting. | |
| 481 * Only used for display purpose. | |
| 482 * @type {boolean} | |
| 483 */ | |
| 484 cr.defineProperty(NetworkItem, 'connecting', cr.PropertyKind.BOOL_ATTR); | |
| 485 | |
| 486 /** | |
| 487 * Whether the underlying network is an other network for adding networks. | |
| 488 * Only used for display purpose. | |
| 489 * @type {boolean} | |
| 490 */ | |
| 491 cr.defineProperty(NetworkItem, 'other', cr.PropertyKind.BOOL_ATTR); | |
| 492 | |
| 493 /** | |
| 494 * Whether the underlying network is connectable. | |
| 495 * @type {boolean} | |
| 496 */ | |
| 497 cr.defineProperty(NetworkItem, 'connectable', cr.PropertyKind.BOOL_ATTR); | |
| 498 | |
| 499 return { | |
| 500 Constants: Constants, | |
| 501 NetworkElement: NetworkElement | |
| 502 }; | |
| 503 }); | |
| OLD | NEW |