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

Side by Side Diff: chrome/browser/resources/chromeos/diagnostics/main.js

Issue 10825291: Diagnostics UI: more UI implementation. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Use local_strings.js to support i18n in JS; avoid innerHTML manipulation. Created 8 years, 4 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 | Annotate | Revision Log
OLDNEW
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 /*
14 * Remove all children nodes for an element.
15 * @param {element} parent of the elements to be removed.
16 */
17 function removeChildren(element) {
18 element.textContent = '';
19 }
20
21 /**
22 * Creates an element named |elementName| containing the content |text|.
23 * @param {string} elementName Name of the new element to be created.
24 * @param {string} text Text to be contained in the new element.
25 * @return {HTMLElement} The newly created HTML element.
26 */
27 function createElementFromText(elementName, text) {
28 var element = document.createElement(elementName);
29 element.appendChild(document.createTextNode(text));
30 return element;
31 }
32
33 cr.addSingletonGetter(DiagPage);
34
35 /**
36 * List of network adapter types.
37 */
38 DiagPage.AdapterType = [
39 {adapter: 'wlan0', name: localStrings.getString('wlan0')},
40 {adapter: 'eth0', name: localStrings.getString('eth0')},
41 {adapter: 'eth1', name: localStrings.getString('eth1')},
42 {adapter: 'wwan0', name: localStrings.getString('wwan0')},
43 ];
44
45 /**
46 * List of network adapter status.
47 * The numeric value assigned to each status reflects how healthy the network
48 * adapter is.
49 *
50 * @enum {int}
51 */
52 DiagPage.AdapterStatus = {
53 NOT_FOUND: 0,
54 DISABLED: 1,
55 NO_IP: 2,
56 VALID_IP: 3
57 };
58
59 DiagPage.prototype = {
60 /**
61 * Perform initial setup.
62 */
63 initialize: function() {
64 // Initialize member variables.
65 this.activeAdapter_ = -1;
66 this.adapterStatus_ = new Array();
67
68 // Attempt to update.
69 chrome.send('pageLoaded');
70 },
71
72 /**
73 * Updates the connectivity status with netif information.
74 * @param {String} netifStatus Dictionary of network adapter status.
75 */
76 setNetifStatus_: function(netifStatus) {
77 // Hide the "loading" message.
78 $('loading').hidden = true;
79
80 // Update netif state.
81 for (var i = 0; i < DiagPage.AdapterType.length; i++) {
82 var adapterType = DiagPage.AdapterType[i];
83 var status = netifStatus[adapterType.adapter];
84 if (!status)
85 this.adapterStatus_[i] = DiagPage.AdapterStatus.NOT_FOUND;
86 else if (!status.flags || status.flags.indexOf('up') == -1)
87 this.adapterStatus_[i] = DiagPage.AdapterStatus.DISABLED;
88 else if (!status.ipv4)
89 this.adapterStatus_[i] = DiagPage.AdapterStatus.NO_IP;
90 else
91 this.adapterStatus_[i] = DiagPage.AdapterStatus.VALID_IP;
92 }
93
94 // Update UI
95 this.updateAdapterSelection_();
96 this.updateConnectivityStatus_();
97 },
98
99 /**
100 * Gets the HTML radio input element id for a network adapter.
101 * @private
102 */
103 getAdapterElementId_: function(adapter) {
104 return 'adapter-' + DiagPage.AdapterType[adapter].adapter;
105 },
106
107 /**
108 * Gets the most active adapter based on their status.
109 * @private
110 */
111 getActiveAdapter_: function() {
112 var activeAdapter = -1;
113 var activeAdapterStatus = DiagPage.AdapterStatus.NOT_FOUND;
114 for (var i = 0; i < DiagPage.AdapterType.length; i++) {
115 var status = this.adapterStatus_[i];
116 if (status == DiagPage.AdapterStatus.NOT_FOUND)
117 continue;
118 if (activeAdapter == -1 || status > activeAdapterStatus) {
119 activeAdapter = i;
120 activeAdapterStatus = status;
121 }
122 }
123 return activeAdapter;
124 },
125
126 /**
127 * Update the adapter selection section.
128 * @private
129 */
130 updateAdapterSelection_: function() {
131 // Determine active adapter.
132 if (this.activeAdapter_ == -1)
133 this.activeAdapter_ = this.getActiveAdapter_();
134 // Create HTML radio input elements.
135 var adapterSelectionElement = $('adapter-selection');
136 removeChildren(adapterSelectionElement);
137 for (var i = 0; i < DiagPage.AdapterType.length; i++) {
138 if (this.adapterStatus_[i] == DiagPage.AdapterStatus.NOT_FOUND)
139 continue;
140 var radioElement = document.createElement('input');
141 radioElement.setAttribute('type', 'radio');
142 radioElement.setAttribute('name', 'adapter');
143 radioElement.setAttribute('id', this.getAdapterElementId_(i));
144 if (i == this.activeAdapter_)
145 radioElement.setAttribute('checked', 'true');
146 radioElement.onclick = function(adapter) {
147 this.activeAdapter_ = adapter;
148 this.updateConnectivityStatus_();
149 }.bind(this, i);
150 adapterSelectionElement.appendChild(radioElement);
151 adapterSelectionElement.appendChild(
152 document.createTextNode(DiagPage.AdapterType[i].name));
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 var performedTestsElement = document.createElement('div');
167 var pendingTestsElement = document.createElement('div');
168 var errorElement = document.createElement('div');
169 var recommendationElement = document.createElement('div');
170 var failIconElement = document.createElement('img');
171 var tickIconElement = document.createElement('img');
172
173 performedTestsElement.setAttribute('class', 'test-performed');
174 pendingTestsElement.setAttribute('class', 'test-pending');
175 errorElement.setAttribute('class', 'test-error');
176 recommendationElement.setAttribute('class', 'recommendation');
177 failIconElement.setAttribute('src', 'fail.png');
178 tickIconElement.setAttribute('src', 'tick.png');
179
180 performedTestsElement.appendChild(createElementFromText('b', '1. '));
181 performedTestsElement.appendChild(document.createTextNode(
182 localStrings.getStringF('testing-hardware', name)));
183
184 if (status == DiagPage.AdapterStatus.DISABLED) {
185 errorElement.appendChild(failIconElement.cloneNode());
186 errorElement.appendChild(document.createTextNode(
187 localStrings.getStringF('adapter-disabled', name)));
188
189 recommendationElement.appendChild(createElementFromText(
190 'b', localStrings.getString('recommendation')));
191 recommendationElement.appendChild(document.createTextNode(
192 localStrings.getStringF('enable-adapter', name)));
193
194 pendingTestsElement.appendChild(createElementFromText('b', '2. '));
195 pendingTestsElement.appendChild(document.createTextNode(
196 localStrings.getString('testing-connection-to-router')));
197 pendingTestsElement.appendChild(document.createElement('br'));
198 pendingTestsElement.appendChild(createElementFromText('b', '3. '));
199 pendingTestsElement.appendChild(document.createTextNode(
200 localStrings.getString('testing-connection-to-internet')));
201 } else {
202 performedTestsElement.appendChild(tickIconElement.cloneNode());
203 performedTestsElement.appendChild(document.createElement('br'));
204 performedTestsElement.appendChild(createElementFromText('b', '2. '));
205 performedTestsElement.appendChild(document.createTextNode(
206 localStrings.getString('testing-connection-to-router')));
207
208 if (status == DiagPage.AdapterStatus.NO_IP) {
209 errorElement.appendChild(failIconElement.cloneNode());
210 errorElement.appendChild(document.createTextNode(
211 localStrings.getStringF('adapter-no-ip', name)));
212
213 recommendationElement.appendChild(createElementFromText(
214 'b', localStrings.getString('recommendation')));
215 // TODO: i18n string
216 recommendationElement.innerHTML +=
217 '<i>Please ensure that</i><br />' +
218 '1) you are trying to connect to the right network<br />' +
219 '2) you are using the right authentication method<br />' +
220 '3) your router is configured correctly<br />' +
221 '<i>Try to</i><br />' +
222 '1) connect to a different network<br />' +
223 '2) reboot your router<br /></div>';
hshi1 2012/08/15 00:44:33 How would you suggest to handle i18n strings like
xiyuan 2012/08/15 16:36:07 Sorry that I was not clear enough. What I suggeste
hshi1 2012/08/15 22:59:25 Done.
224
225 pendingTestsElement.appendChild(createElementFromText('b', '3. '));
226 pendingTestsElement.appendChild(document.createTextNode(
227 localStrings.getString('testing-connection-to-internet')));
228 } else {
229 performedTestsElement.appendChild(tickIconElement.cloneNode());
230 performedTestsElement.appendChild(document.createElement('br'));
231 performedTestsElement.appendChild(createElementFromText('b', '3. '));
232 performedTestsElement.appendChild(document.createTextNode(
233 localStrings.getString('testing-connection-to-internet')));
234 performedTestsElement.appendChild(tickIconElement.cloneNode());
235
236 errorElement.hidden = true;
237 recommendationElement.hidden = true;
238 pendingTestsElement.hidden = true;
239 }
240 }
241
242 var connectivityStatusElement = $('connectivity-status');
243 removeChildren(connectivityStatusElement);
244 connectivityStatusElement.appendChild(performedTestsElement);
245 connectivityStatusElement.appendChild(errorElement);
246 connectivityStatusElement.appendChild(recommendationElement);
247 connectivityStatusElement.appendChild(pendingTestsElement);
248 }
249 };
250
251 DiagPage.setNetifStatus = function(netifStatus) {
252 DiagPage.getInstance().setNetifStatus_(netifStatus);
253 }
254
255 // Export
256 return {
257 DiagPage: DiagPage
258 };
259 });
260
5 /** 261 /**
6 * Updates the Connectivity Status section. 262 * Initialize the DiagPage upon DOM content loaded.
7 * @param {String} connStatus Dictionary containing connectivity status.
8 */ 263 */
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() { 264 document.addEventListener('DOMContentLoaded', function() {
38 chrome.send('pageLoaded'); 265 diag.DiagPage.getInstance().initialize();
39 }); 266 });
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698