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 5cr.define('options', function() { 6 var OptionsPage = options.OptionsPage; 7 8 ///////////////////////////////////////////////////////////////////////////// 9 // InternetOptions class: 10 11 /** 12 * Encapsulated handling of ChromeOS internet options page. 13 * @constructor 14 */ 15 function InternetOptions() { 16 OptionsPage.call(this, 'internet', templateData.internetPageTabTitle, 17 'internetPage'); 18 } 19 20 cr.addSingletonGetter(InternetOptions); 21 22 // Inherit InternetOptions from OptionsPage. 23 InternetOptions.prototype = { 24 __proto__: OptionsPage.prototype, 25 26 /** 27 * Initializes InternetOptions page. 28 * Calls base class implementation to starts preference initialization. 29 */ 30 initializePage: function() { 31 OptionsPage.prototype.initializePage.call(this); 32 33 if (templateData.accessLocked) { 34 var page = $('internetPage'); 35 page.setAttribute('accesslocked', true); 36 } 37 38 options.internet.NetworkElement.decorate($('wired-list')); 39 $('wired-list').load(templateData.wiredList); 40 options.internet.NetworkElement.decorate($('wireless-list')); 41 $('wireless-list').load(templateData.wirelessList); 42 options.internet.NetworkElement.decorate($('remembered-list')); 43 $('remembered-list').load(templateData.rememberedList); 44 45 options.internet.CellularPlanElement.decorate($('planList')); 46 47 $('wired-section').hidden = (templateData.wiredList.length == 0); 48 $('wireless-section').hidden = (templateData.wirelessList.length == 0); 49 $('remembered-section').hidden = 50 (templateData.rememberedList.length == 0); 51 InternetOptions.setupAttributes(templateData); 52 $('detailsInternetDismiss').addEventListener('click', function(event) { 53 InternetOptions.setDetails(); 54 }); 55 $('detailsInternetLogin').addEventListener('click', function(event) { 56 InternetOptions.loginFromDetails(); 57 }); 58 $('activateDetails').addEventListener('click', function(event) { 59 InternetOptions.activateFromDetails(); 60 }); 61 $('enable-wifi').addEventListener('click', function(event) { 62 event.target.disabled = true; 63 chrome.send('enableWifi', []); 64 }); 65 $('disable-wifi').addEventListener('click', function(event) { 66 event.target.disabled = true; 67 chrome.send('disableWifi', []); 68 }); 69 $('enable-cellular').addEventListener('click', function(event) { 70 event.target.disabled = true; 71 chrome.send('enableCellular', []); 72 }); 73 $('disable-cellular').addEventListener('click', function(event) { 74 event.target.disabled = true; 75 chrome.send('disableCellular', []); 76 }); 77 $('buyplanDetails').addEventListener('click', function(event) { 78 chrome.send('buyDataPlan', []); 79 OptionsPage.closeOverlay(); 80 }); 81 $('cellularApnClear').addEventListener('click', function(event) { 82 $('cellularApn').value = ""; 83 $('cellularApnUsername').value = ""; 84 $('cellularApnPassword').value = ""; 85 var data = $('inetAddress').data; 86 chrome.send('setApn', [String(data.servicePath), 87 String($('cellularApn').value), 88 String($('cellularApnUsername').value), 89 String($('cellularApnPassword').value)]); 90 }); 91 $('cellularApnSet').addEventListener('click', function(event) { 92 var data = $('inetAddress').data; 93 chrome.send('setApn', [String(data.servicePath), 94 String($('cellularApn').value), 95 String($('cellularApnUsername').value), 96 String($('cellularApnPassword').value)]); 97 }); 98 $('sim-card-lock-enabled').addEventListener('click', function(event) { 99 var newValue = $('sim-card-lock-enabled').checked; 100 // Leave value as is because user needs to enter PIN code first. 101 // When PIN will be entered and value changed, 102 // we'll update UI to reflect that change. 103 $('sim-card-lock-enabled').checked = !newValue; 104 InternetOptions.enableSecurityTab(false); 105 chrome.send('setSimCardLock', [newValue]); 106 }); 107 $('change-pin').addEventListener('click', function(event) { 108 chrome.send('changePin'); 109 }); 110 this.showNetworkDetails_(); 111 }, 112 113 showNetworkDetails_: function() { 114 var params = parseQueryParams(window.location); 115 var servicePath = params.servicePath; 116 var networkType = params.networkType; 117 if (!servicePath || !servicePath.length || 118 !networkType || !networkType.length) 119 return; 120 chrome.send('buttonClickCallback', 121 [networkType, servicePath, "options"]); 122 } 123 }; 124 125 // A boolean flag from InternerOptionsHandler to indicate whether to use 126 // inline WebUI for ethernet/wifi login/options. 127 InternetOptions.useSettingsUI = false; 128 129 // Network status update will be blocked while typing in WEP password etc. 130 InternetOptions.updateLocked = false; 131 InternetOptions.updatePending = false; 132 InternetOptions.updataData = null; 133 134 InternetOptions.loginFromDetails = function () { 135 var data = $('inetAddress').data; 136 var servicePath = data.servicePath; 137 if (data.type == options.internet.Constants.TYPE_WIFI) { 138 if (data.certInPkcs) { 139 chrome.send('loginToCertNetwork',[String(servicePath), 140 String(data.certPath), 141 String(data.ident)]); 142 } else { 143 chrome.send('loginToCertNetwork',[String(servicePath), 144 String($('inetCert').value), 145 String($('inetIdent').value), 146 String($('inetCertPass').value)]); 147 } 148 } else if (data.type == options.internet.Constants.TYPE_CELLULAR) { 149 chrome.send('buttonClickCallback', [String(data.type), 150 servicePath, 151 'connect']); 152 } 153 OptionsPage.closeOverlay(); 154 }; 155 156 InternetOptions.activateFromDetails = function () { 157 var data = $('inetAddress').data; 158 var servicePath = data.servicePath; 159 if (data.type == options.internet.Constants.TYPE_CELLULAR) { 160 chrome.send('buttonClickCallback', [String(data.type), 161 String(servicePath), 162 'activate']); 163 } 164 OptionsPage.closeOverlay(); 165 }; 166 167 InternetOptions.setDetails = function () { 168 var data = $('inetAddress').data; 169 var servicePath = data.servicePath; 170 if (data.type == options.internet.Constants.TYPE_WIFI) { 171 chrome.send('setDetails',[String(servicePath), 172 $('autoConnectNetwork').checked ? 173 "true" : "false"]); 174 } 175 OptionsPage.closeOverlay(); 176 }; 177 178 InternetOptions.enableSecurityTab = function(enabled) { 179 $('sim-card-lock-enabled').disabled = !enabled; 180 $('change-pin').disabled = !enabled; 181 }; 182 183 InternetOptions.setupAttributes = function(data) { 184 var buttons = $('wireless-buttons'); 185 if (data.wifiEnabled) { 186 $('disable-wifi').disabled = false; 187 $('disable-wifi').hidden = false; 188 $('enable-wifi').hidden = true; 189 } else { 190 $('enable-wifi').disabled = false; 191 $('enable-wifi').hidden = false; 192 $('disable-wifi').hidden = true; 193 } 194 if (data.cellularAvailable) { 195 if (data.cellularEnabled) { 196 $('disable-cellular').disabled = false; 197 $('disable-cellular').hidden = false; 198 $('enable-cellular').hidden = true; 199 } else { 200 $('enable-cellular').disabled = false; 201 $('enable-cellular').hidden = false; 202 $('disable-cellular').hidden = true; 203 } 204 if (!AccountsOptions.currentUserIsOwner()) 205 $('internet-owner-only-warning').hidden = false; 206 } else { 207 $('enable-cellular').hidden = true; 208 $('disable-cellular').hidden = true; 209 $('data-roaming').hidden = true; 210 } 211 212 InternetOptions.useSettingsUI = data.networkUseSettingsUI; 213 }; 214 215 // Prevent clobbering of password input field. 216 InternetOptions.lockUpdates = function () { 217 InternetOptions.updateLocked = true; 218 }; 219 220 InternetOptions.unlockUpdates = function () { 221 InternetOptions.updateLocked = false; 222 if (InternetOptions.updatePending) { 223 InternetOptions.refreshNetworkData(InternetOptions.updateData); 224 } 225 }; 226 227 // 228 //Chrome callbacks 229 // 230 InternetOptions.refreshNetworkData = function (data) { 231 var page = $('internetPage'); 232 if (data.accessLocked) { 233 page.setAttribute('accesslocked', true); 234 return; 235 } 236 page.removeAttribute('accesslocked'); 237 if (InternetOptions.updateLocked) { 238 InternetOptions.updateData = data; 239 InternetOptions.updatePending = true; 240 } else { 241 $('wired-list').load(data.wiredList); 242 $('wireless-list').load(data.wirelessList); 243 $('remembered-list').load(data.rememberedList); 244 245 $('wired-section').hidden = (data.wiredList.length == 0); 246 $('wireless-section').hidden = (data.wirelessList.length == 0); 247 InternetOptions.setupAttributes(data); 248 $('remembered-section').hidden = (data.rememberedList.length == 0); 249 InternetOptions.updateData = null; 250 InternetOptions.updatePending = false; 251 } 252 }; 253 254 InternetOptions.updateCellularPlans = function (data) { 255 var page = $('detailsInternetPage'); 256 page.removeAttribute('cellplanloading'); 257 if (data.plans && data.plans.length) { 258 page.removeAttribute('nocellplan'); 259 page.setAttribute('hascellplan', true); 260 $('planList').load(data.plans); 261 } else { 262 page.setAttribute('nocellplan', true); 263 page.removeAttribute('hascellplan'); 264 } 265 266 if (!data.needsPlan) 267 page.setAttribute('hasactiveplan', true); 268 else 269 page.removeAttribute('hasactiveplan'); 270 271 if (data.activated) { 272 page.setAttribute('activated', true); 273 } else { 274 page.removeAttribute('activated'); 275 $('detailsInternetLogin').classList.add('hidden'); 276 } 277 278 // CSS selectors don't like me anymore, switching to classList 279 if (data.showBuyButton) 280 $('buyplanDetails').classList.remove('hidden'); 281 else 282 $('buyplanDetails').classList.add('hidden'); 283 284 if (data.showActivateButton) 285 $('activateDetails').classList.remove('hidden'); 286 else 287 $('activateDetails').classList.add('hidden'); 288 289 // Nudge webkit so that it redraws the details overlay page. 290 // See http://crosbug.com/9616 for details. 291 // Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=50176 292 var dummy = page.ownerDocument.createTextNode(' '); 293 page.appendChild(dummy); 294 page.removeChild(dummy); 295 }; 296 297 InternetOptions.updateSecurityTab = function(data) { 298 InternetOptions.enableSecurityTab(true); 299 $('sim-card-lock-enabled').checked = data.requirePin; 300 }; 301 302 InternetOptions.showPasswordEntry = function (data) { 303 var element = $(data.servicePath); 304 element.showPassword(); 305 }; 306 307 InternetOptions.showDetailedInfo = function (data) { 308 var page = $('detailsInternetPage'); 309 $('buyplanDetails').classList.add('hidden'); 310 $('activateDetails').classList.add('hidden'); 311 $('detailsInternetLogin').classList.add('hidden'); 312 if (data.connecting) { 313 page.setAttribute('connecting', data.connecting); 314 } else { 315 page.removeAttribute('connecting'); 316 } 317 if (data.connected) { 318 page.setAttribute('connected', data.connected); 319 $('inetTitle').textContent = localStrings.getString('inetStatus'); 320 } else { 321 page.removeAttribute('connected'); 322 $('inetTitle').textContent = localStrings.getString('inetConnect'); 323 $('detailsInternetLogin').classList.remove('hidden'); 324 } 325 $('connectionState').textContent = data.connectionState; 326 var address = $('inetAddress'); 327 address.data = data; 328 if (data.ipconfigs && data.ipconfigs.length) { 329 // We will be displaying only the first ipconfig info for now until we 330 // start supporting multiple IP addresses per connection. 331 address.textContent = data.ipconfigs[0].address; 332 $('inetSubnetAddress').textContent = data.ipconfigs[0].subnetAddress; 333 $('inetGateway').textContent = data.ipconfigs[0].gateway; 334 $('inetDns').textContent = data.ipconfigs[0].dns; 335 } else { 336 // This is most likely a transient state due to device still connecting. 337 address.textContent = '?'; 338 $('inetSubnetAddress').textContent = '?'; 339 $('inetGateway').textContent = '?'; 340 $('inetDns').textContent = '?'; 341 } 342 if (data.hardwareAddress) { 343 $('hardwareAddress').textContent = data.hardwareAddress; 344 $('hardwareAddressRow').style.display = 'table-row'; 345 } else { 346 // This is most likely a device without a hardware address. 347 $('hardwareAddressRow').style.display = 'none'; 348 } 349 if (data.type == 2) { 350 OptionsPage.showTab($('wifiNetworkNavTab')); 351 page.setAttribute('wireless', true); 352 page.removeAttribute('ethernet'); 353 page.removeAttribute('cellular'); 354 page.removeAttribute('gsm'); 355 $('inetSsid').textContent = data.ssid; 356 $('autoConnectNetwork').checked = data.autoConnect; 357 if (!AccountsOptions.currentUserIsOwner()) { 358 // Disable this for guest non-Owners. 359 $('autoConnectNetwork').disabled = true; 360 } 361 page.removeAttribute('password'); 362 if (data.encrypted) { 363 page.setAttribute('password', true); 364 } 365 } else if(data.type == 5) { 366 if (!data.gsm) 367 OptionsPage.showTab($('cellularPlanNavTab')); 368 else 369 OptionsPage.showTab($('cellularConnNavTab')); 370 page.removeAttribute('ethernet'); 371 page.removeAttribute('wireless'); 372 page.setAttribute('cellular', true); 373 if (data.carrierUrl) { 374 var a = $('carrierUrl'); 375 if (!a) { 376 a = document.createElement('a'); 377 $('serviceName').appendChild(a); 378 a.id = 'carrierUrl'; 379 a.target = "_blank"; 380 } 381 a.href = data.carrierUrl; 382 a.textContent = data.serviceName; 383 } else { 384 $('serviceName').textContent = data.serviceName; 385 } 386 $('networkTechnology').textContent = data.networkTechnology; 387 $('activationState').textContent = data.activationState; 388 $('roamingState').textContent = data.roamingState; 389 $('restrictedPool').textContent = data.restrictedPool; 390 $('errorState').textContent = data.errorState; 391 $('manufacturer').textContent = data.manufacturer; 392 $('modelId').textContent = data.modelId; 393 $('firmwareRevision').textContent = data.firmwareRevision; 394 $('hardwareRevision').textContent = data.hardwareRevision; 395 $('prlVersion').textContent = data.prlVersion; 396 $('meid').textContent = data.meid; 397 $('imei').textContent = data.imei; 398 $('mdn').textContent = data.mdn; 399 $('esn').textContent = data.esn; 400 $('min').textContent = data.min; 401 if (!data.gsm) { 402 page.removeAttribute('gsm'); 403 } else { 404 $('operatorName').textContent = data.operatorName; 405 $('operatorCode').textContent = data.operatorCode; 406 $('imsi').textContent = data.imsi; 407 // If there's no custom APN show default APN that is used. These will be 408 // displayed differently when http://crosbug.com/14290 is fixed. 409 // See also http://crosbug.com/p/4058 for context. 410 if (data.apn != '') { 411 $('cellularApn').value = data.apn; 412 $('cellularApnUsername').value = data.apn_username; 413 $('cellularApnPassword').value = data.apn_password; 414 } else { 415 $('cellularApn').value = data.last_good_apn; 416 $('cellularApnUsername').value = data.last_good_apn_username; 417 $('cellularApnPassword').value = data.last_good_apn_password; 418 } 419 $('sim-card-lock-enabled').checked = data.simCardLockEnabled; 420 InternetOptions.enableSecurityTab(true); 421 page.setAttribute('gsm', true); 422 } 423 424 // CSS selectors don't like me anymore, switching to classList 425 if (data.showBuyButton) 426 $('buyplanDetails').classList.remove('hidden'); 427 else 428 $('buyplanDetails').classList.add('hidden'); 429 430 if (data.showActivateButton) { 431 $('activateDetails').classList.remove('hidden') 432 $('detailsInternetLogin').classList.add('hidden'); 433 } else { 434 $('activateDetails').classList.add('hidden'); 435 } 436 437 page.removeAttribute('hascellplan'); 438 if (data.connected) { 439 page.removeAttribute('nocellplan'); 440 page.setAttribute('cellplanloading', true); 441 chrome.send('refreshCellularPlan', [data.servicePath]) 442 } else { 443 page.setAttribute('nocellplan', true); 444 page.removeAttribute('cellplanloading'); 445 } 446 } else { 447 OptionsPage.showTab($('internetNavTab')); 448 page.setAttribute('ethernet', true); 449 page.removeAttribute('wireless'); 450 page.removeAttribute('cellular'); 451 page.removeAttribute('gsm'); 452 } 453 OptionsPage.navigateToPage('detailsInternetPage'); 454 }; 455 456 // Export 457 return { 458 InternetOptions: InternetOptions 459 }; 460}); 461