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 var localStrings = new LocalStrings(); |
| 6 |
| 7 cr.define('diag', function() { |
| 8 /** |
| 9 * Encapsulated handling of the diagnostics page. |
| 10 */ |
| 11 function DiagPage() {} |
| 12 |
| 13 cr.addSingletonGetter(DiagPage); |
| 14 |
| 15 /* |
| 16 * Remove all children nodes for an element. |
| 17 * @param {element} parent of the elements to be removed. |
| 18 */ |
| 19 function removeChildren(element) { |
| 20 element.textContent = ''; |
| 21 } |
| 22 |
| 23 /** |
| 24 * List of network adapter types. |
| 25 */ |
| 26 DiagPage.AdapterType = [ |
| 27 {adapter: 'wlan0', name: localStrings.getString('wlan0')}, |
| 28 {adapter: 'eth0', name: localStrings.getString('eth0')}, |
| 29 {adapter: 'eth1', name: localStrings.getString('eth1')}, |
| 30 {adapter: 'wwan0', name: localStrings.getString('wwan0')}, |
| 31 ]; |
| 32 |
| 33 /** |
| 34 * List of network adapter status. |
| 35 * The numeric value assigned to each status reflects how healthy the network |
| 36 * adapter is. |
| 37 * |
| 38 * @enum {int} |
| 39 */ |
| 40 DiagPage.AdapterStatus = { |
| 41 NOT_FOUND: 0, |
| 42 DISABLED: 1, |
| 43 NO_IP: 2, |
| 44 VALID_IP: 3 |
| 45 }; |
| 46 |
| 47 /** |
| 48 * Image elements for icons. |
| 49 */ |
| 50 DiagPage.FailIconElement = document.createElement('img'); |
| 51 DiagPage.TickIconElement = document.createElement('img'); |
| 52 DiagPage.FailIconElement.setAttribute('src', 'fail.png'); |
| 53 DiagPage.TickIconElement.setAttribute('src', 'tick.png'); |
| 54 |
| 55 DiagPage.prototype = { |
| 56 /** |
| 57 * Perform initial setup. |
| 58 */ |
| 59 initialize: function() { |
| 60 // Initialize member variables. |
| 61 this.activeAdapter_ = -1; |
| 62 this.adapterStatus_ = new Array(); |
| 63 |
| 64 // Attempt to update. |
| 65 chrome.send('pageLoaded'); |
| 66 }, |
| 67 |
| 68 /** |
| 69 * Updates the connectivity status with netif information. |
| 70 * @param {String} netifStatus Dictionary of network adapter status. |
| 71 */ |
| 72 setNetifStatus_: function(netifStatus) { |
| 73 // Hide the "loading" message. |
| 74 $('loading').hidden = true; |
| 75 |
| 76 // Update netif state. |
| 77 for (var i = 0; i < DiagPage.AdapterType.length; i++) { |
| 78 var adapterType = DiagPage.AdapterType[i]; |
| 79 var status = netifStatus[adapterType.adapter]; |
| 80 if (!status) |
| 81 this.adapterStatus_[i] = DiagPage.AdapterStatus.NOT_FOUND; |
| 82 else if (!status.flags || status.flags.indexOf('up') == -1) |
| 83 this.adapterStatus_[i] = DiagPage.AdapterStatus.DISABLED; |
| 84 else if (!status.ipv4) |
| 85 this.adapterStatus_[i] = DiagPage.AdapterStatus.NO_IP; |
| 86 else |
| 87 this.adapterStatus_[i] = DiagPage.AdapterStatus.VALID_IP; |
| 88 } |
| 89 |
| 90 // Update UI |
| 91 this.updateAdapterSelection_(); |
| 92 this.updateConnectivityStatus_(); |
| 93 }, |
| 94 |
| 95 /** |
| 96 * Gets the HTML radio input element id for a network adapter. |
| 97 * @private |
| 98 */ |
| 99 getAdapterElementId_: function(adapter) { |
| 100 return 'adapter-' + DiagPage.AdapterType[adapter].adapter; |
| 101 }, |
| 102 |
| 103 /** |
| 104 * Gets the most active adapter based on their status. |
| 105 * @private |
| 106 */ |
| 107 getActiveAdapter_: function() { |
| 108 var activeAdapter = -1; |
| 109 var activeAdapterStatus = DiagPage.AdapterStatus.NOT_FOUND; |
| 110 for (var i = 0; i < DiagPage.AdapterType.length; i++) { |
| 111 var status = this.adapterStatus_[i]; |
| 112 if (status == DiagPage.AdapterStatus.NOT_FOUND) |
| 113 continue; |
| 114 if (activeAdapter == -1 || status > activeAdapterStatus) { |
| 115 activeAdapter = i; |
| 116 activeAdapterStatus = status; |
| 117 } |
| 118 } |
| 119 return activeAdapter; |
| 120 }, |
| 121 |
| 122 /** |
| 123 * Update the adapter selection section. |
| 124 * @private |
| 125 */ |
| 126 updateAdapterSelection_: function() { |
| 127 // Determine active adapter. |
| 128 if (this.activeAdapter_ == -1) |
| 129 this.activeAdapter_ = this.getActiveAdapter_(); |
| 130 // Create HTML radio input elements. |
| 131 var adapterSelectionElement = $('adapter-selection'); |
| 132 removeChildren(adapterSelectionElement); |
| 133 for (var i = 0; i < DiagPage.AdapterType.length; i++) { |
| 134 if (this.adapterStatus_[i] == DiagPage.AdapterStatus.NOT_FOUND) |
| 135 continue; |
| 136 var radioElement = document.createElement('input'); |
| 137 var elementId = this.getAdapterElementId_(i); |
| 138 radioElement.setAttribute('type', 'radio'); |
| 139 radioElement.setAttribute('name', 'adapter'); |
| 140 radioElement.setAttribute('id', elementId); |
| 141 if (i == this.activeAdapter_) |
| 142 radioElement.setAttribute('checked', 'true'); |
| 143 radioElement.onclick = function(adapter) { |
| 144 this.activeAdapter_ = adapter; |
| 145 this.updateConnectivityStatus_(); |
| 146 }.bind(this, i); |
| 147 var labelElement = document.createElement('label'); |
| 148 labelElement.setAttribute('for', elementId); |
| 149 labelElement.appendChild(radioElement); |
| 150 labelElement.appendChild( |
| 151 document.createTextNode(DiagPage.AdapterType[i].name)); |
| 152 adapterSelectionElement.appendChild(labelElement); |
| 153 adapterSelectionElement.appendChild(document.createElement('br')); |
| 154 } |
| 155 }, |
| 156 |
| 157 /** |
| 158 * Update the connectivity status for the specified network interface. |
| 159 * @private |
| 160 */ |
| 161 updateConnectivityStatus_: function() { |
| 162 var adapter = this.activeAdapter_; |
| 163 var status = this.adapterStatus_[adapter]; |
| 164 var name = DiagPage.AdapterType[adapter].name; |
| 165 |
| 166 // Status messages for individual tests. |
| 167 var connectivityStatusElement = $('connectivity-status'); |
| 168 var testStatusElements = new Array(); |
| 169 removeChildren(connectivityStatusElement); |
| 170 for (var i = 0; i < 3; i++) { |
| 171 testStatusElements[i] = document.createElement('div'); |
| 172 connectivityStatusElement.appendChild(testStatusElements[i]); |
| 173 } |
| 174 testStatusElements[0].innerHTML = |
| 175 localStrings.getStringF('testing-hardware', name); |
| 176 testStatusElements[1].innerHTML = |
| 177 localStrings.getString('testing-connection-to-router'); |
| 178 testStatusElements[2].innerHTML = |
| 179 localStrings.getString('testing-connection-to-internet'); |
| 180 |
| 181 // Error and recommendation messages may be inserted in test status |
| 182 // elements. |
| 183 var errorElement = document.createElement('div'); |
| 184 var recommendationElement = document.createElement('div'); |
| 185 errorElement.className = 'test-error'; |
| 186 recommendationElement.className = 'recommendation'; |
| 187 testStatusElements[0].className = 'test-performed'; |
| 188 if (status == DiagPage.AdapterStatus.DISABLED) { |
| 189 errorElement.appendChild(DiagPage.FailIconElement.cloneNode()); |
| 190 errorElement.appendChild(document.createTextNode( |
| 191 localStrings.getStringF('adapter-disabled', name))); |
| 192 recommendationElement.innerHTML = |
| 193 localStrings.getStringF('enable-adapter', name); |
| 194 connectivityStatusElement.insertBefore(errorElement, |
| 195 testStatusElements[1]); |
| 196 connectivityStatusElement.insertBefore(recommendationElement, |
| 197 testStatusElements[1]); |
| 198 testStatusElements[1].className = 'test-pending'; |
| 199 testStatusElements[2].className = 'test-pending'; |
| 200 } else { |
| 201 testStatusElements[0].appendChild(DiagPage.TickIconElement.cloneNode()); |
| 202 testStatusElements[1].className = 'test-performed'; |
| 203 if (status == DiagPage.AdapterStatus.NO_IP) { |
| 204 errorElement.appendChild(DiagPage.FailIconElement.cloneNode()); |
| 205 errorElement.appendChild(document.createTextNode( |
| 206 localStrings.getStringF('adapter-no-ip', name))); |
| 207 recommendationElement.innerHTML = |
| 208 localStrings.getStringF('fix-connection-to-router'); |
| 209 connectivityStatusElement.insertBefore(errorElement, |
| 210 testStatusElements[2]); |
| 211 connectivityStatusElement.insertBefore(recommendationElement, |
| 212 testStatusElements[2]); |
| 213 testStatusElements[2].className = 'test-pending'; |
| 214 } else { |
| 215 testStatusElements[1].appendChild( |
| 216 DiagPage.TickIconElement.cloneNode()); |
| 217 testStatusElements[2].className = 'test-performed'; |
| 218 testStatusElements[2].appendChild( |
| 219 DiagPage.TickIconElement.cloneNode()); |
| 220 } |
| 221 } |
| 222 } |
| 223 }; |
| 224 |
| 225 DiagPage.setNetifStatus = function(netifStatus) { |
| 226 DiagPage.getInstance().setNetifStatus_(netifStatus); |
| 227 } |
| 228 |
| 229 // Export |
| 230 return { |
| 231 DiagPage: DiagPage |
| 232 }; |
| 233 }); |
| 234 |
5 /** | 235 /** |
6 * Updates the Connectivity Status section. | 236 * Initialize the DiagPage upon DOM content loaded. |
7 * @param {String} connStatus Dictionary containing connectivity status. | |
8 */ | 237 */ |
9 function updateConnectivityStatus(connStatus) { | |
10 var deviceTypes = ['wlan0', 'wwan0', 'eth0', 'eth1']; | |
11 var deviceNames = ['Wi-Fi', '3G', 'Ethernet0', 'Ethernet1']; | |
12 for (var i = 0; i < deviceTypes.length; i++) { | |
13 var deviceName = deviceNames[i]; | |
14 var nameElement = document.createElement('h2'); | |
15 nameElement.appendChild(document.createTextNode(deviceName)); | |
16 $('connectivity-status').appendChild(nameElement); | |
17 | |
18 var deviceType = deviceTypes[i]; | |
19 var deviceStatus = connStatus[deviceType]; | |
20 var statusMessage; | |
21 if (!deviceStatus) { | |
22 statusMessage = 'Device not found.'; | |
23 } else if (!deviceStatus.flags || | |
24 deviceStatus.flags.indexOf('up') == -1) { | |
25 statusMessage = 'Device disabled.'; | |
26 } else if (!deviceStatus.ipv4) { | |
27 statusMessage = 'IPv4 address unavailable.'; | |
28 } else { | |
29 statusMessage = 'IPv4 address: ' + deviceStatus.ipv4.addrs; | |
30 } | |
31 var statusElement = document.createElement('p'); | |
32 statusElement.appendChild(document.createTextNode(statusMessage)); | |
33 $('connectivity-status').appendChild(statusElement); | |
34 } | |
35 } | |
36 | |
37 document.addEventListener('DOMContentLoaded', function() { | 238 document.addEventListener('DOMContentLoaded', function() { |
38 chrome.send('pageLoaded'); | 239 diag.DiagPage.getInstance().initialize(); |
39 }); | 240 }); |
OLD | NEW |