1 // Copyright 2013 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.
5 var NetworkUI = (function() {
8 // Properties to display in the network state table. Each entry can be either
9 // a single state field or an array of state fields. If more than one is
10 // specified then the first non empty value is used.
11 var NETWORK_STATE_FIELDS = [
20 ['Cellular.NetworkTechnology',
22 'Cellular.ActivationState',
23 'Cellular.RoamingState',
24 'Cellular.OutOfCredits',
28 var FAVORITE_STATE_FIELDS = [
38 var LOG_LEVEL_CLASSNAME = {
39 'Error': 'network-log-level-error',
40 'User': 'network-log-level-user',
41 'Event': 'network-log-level-event',
42 'Debug': 'network-log-level-debug'
45 var LOG_LEVEL_CHECKBOX = {
53 * Create a tag of log level.
55 * @param {string} level A string that represents log level.
56 * @return {DOMElement} The created span element.
58 var createLevelTag = function(level) {
59 var tag = document.createElement('span');
60 tag.className = 'network-level-tag';
61 tag.textContent = level;
62 tag.classList.add(LOG_LEVEL_CLASSNAME[level]);
67 * Creates an element that contains the time, the event, the level and
68 * the description of the given log entry.
70 * @param {Object} logEntry An object that represents a single line of log.
71 * @return {DOMElement} The created p element that represents the log entry.
73 var createLogEntryText = function(logEntry) {
74 var level = logEntry['level'];
75 if (!$(LOG_LEVEL_CHECKBOX[level]).checked)
77 var res = document.createElement('p');
78 var textWrapper = document.createElement('span');
80 if ($('log-fileinfo').checked)
81 fileinfo = logEntry['file'];
83 if ($('log-timedetail').checked)
84 timestamp = logEntry['timestamp'];
86 timestamp = logEntry['timestampshort'];
87 textWrapper.textContent = loadTimeData.getStringF(
92 logEntry['description']);
93 res.appendChild(createLevelTag(level));
94 res.appendChild(textWrapper);
99 * Create event log entries.
101 * @param {Array.<string>} logEntries A array of strings that each string
102 * represents a log event in JSON format.
104 var createEventLog = function(logEntries) {
105 var container = $('network-log-container');
106 container.textContent = '';
107 for (var i = 0; i < logEntries.length; ++i) {
108 var entry = createLogEntryText(JSON.parse(logEntries[i]));
110 container.appendChild(entry);
115 * Create a cell with a button for expanding a network state table row.
117 * @param {string} guid The GUID identifying the network.
118 * @return {DOMElement} The created td element that displays the given value.
120 var createStateTableExpandButton = function(guid) {
121 var cell = document.createElement('td');
122 cell.className = 'state-table-expand-button-cell';
123 var button = document.createElement('button');
124 button.addEventListener('click', function(event) {
125 toggleExpandRow(event.target, guid);
127 button.className = 'state-table-expand-button';
128 button.textContent = '+';
129 cell.appendChild(button);
134 * Create a cell in network state table.
136 * @param {string} value Content in the cell.
137 * @return {DOMElement} The created td element that displays the given value.
139 var createStateTableCell = function(value) {
140 var cell = document.createElement('td');
141 cell.textContent = value || '';
146 * Create a row in the network state table.
148 * @param {Array} stateFields The state fields to use for the row.
149 * @param {Object} state Property values for the network or favorite.
150 * @return {DOMElement} The created tr element that contains the network
153 var createStateTableRow = function(stateFields, state) {
154 var row = document.createElement('tr');
155 row.className = 'state-table-row';
156 var guid = state.GUID;
157 row.appendChild(createStateTableExpandButton(guid));
158 for (var i = 0; i < stateFields.length; ++i) {
159 var field = stateFields[i];
161 if (typeof field == 'string') {
162 value = networkConfig.getValueFromProperties(state, field);
164 for (var j = 0; j < field.length; ++j) {
165 value = networkConfig.getValueFromProperties(state, field[j]);
171 value = value.slice(0, 8);
172 row.appendChild(createStateTableCell(value));
178 * Create table for networks or favorites.
180 * @param {string} tablename The name of the table to be created.
181 * @param {Array} stateFields The list of fields for the table.
182 * @param {Array} states An array of network or favorite states.
184 var createStateTable = function(tablename, stateFields, states) {
185 var table = $(tablename);
186 var oldRows = table.querySelectorAll('.state-table-row');
187 for (var i = 0; i < oldRows.length; ++i)
188 table.removeChild(oldRows[i]);
189 states.forEach(function(state) {
190 table.appendChild(createStateTableRow(stateFields, state));
195 * This callback function is triggered when the network log is received.
197 * @param {Object} data A JSON structure of event log entries.
199 var getNetworkLogCallback = function(data) {
200 createEventLog(JSON.parse(data));
204 * This callback function is triggered when visible networks are received.
206 * @param {Array} data A list of network state information for each
209 var onVisibleNetworksReceived = function(states) {
210 createStateTable('network-state-table', NETWORK_STATE_FIELDS, states);
214 * This callback function is triggered when favorite networks are received.
216 * @param {Object} data A list of network state information for each
219 var onFavoriteNetworksReceived = function(states) {
220 createStateTable('favorite-state-table', FAVORITE_STATE_FIELDS, states);
224 * Toggle the button state and add or remove a row displaying the complete
225 * state information for a row.
227 * @param {DOMElement} btn The button that was clicked.
228 * @param {string} guid GUID identifying the network.
230 var toggleExpandRow = function(btn, guid) {
231 var cell = btn.parentNode;
232 var row = cell.parentNode;
233 if (btn.textContent == '-') {
234 btn.textContent = '+';
235 row.parentNode.removeChild(row.nextSibling);
237 btn.textContent = '-';
238 var expandedRow = createExpandedRow(guid, row);
239 row.parentNode.insertBefore(expandedRow, row.nextSibling);
244 * Creates the expanded row for displaying the complete state as JSON.
246 * @param {Object} state Property values for the network or favorite.
247 * @param {DOMElement} baseRow The unexpanded row associated with the new row.
248 * @return {DOMElement} The created tr element for the expanded row.
250 var createExpandedRow = function(guid, baseRow) {
251 var expandedRow = document.createElement('tr');
252 expandedRow.className = 'state-table-row';
253 var emptyCell = document.createElement('td');
254 emptyCell.style.border = 'none';
255 expandedRow.appendChild(emptyCell);
256 var detailCell = document.createElement('td');
257 detailCell.className = 'state-table-expanded-cell';
258 detailCell.colSpan = baseRow.childNodes.length - 1;
259 expandedRow.appendChild(detailCell);
260 var showDetail = function(state) {
261 if (networkConfig.lastError)
262 detailCell.textContent = networkConfig.lastError;
264 detailCell.textContent = JSON.stringify(state, null, '\t');
266 var selected = $('get-network-type').selectedIndex;
267 var selectedId = $('get-network-type').options[selected].id;
268 if (selectedId == 'shill')
269 networkConfig.getShillProperties(guid, showDetail);
270 else if (selectedId == 'managed')
271 networkConfig.getManagedProperties(guid, showDetail);
273 networkConfig.getProperties(guid, showDetail);
278 * Requests a network log update.
280 var requestLog = function() {
281 chrome.send('NetworkUI.getNetworkLog');
285 * Requests an update of all network info.
287 var requestNetworks = function() {
288 networkConfig.getNetworks(
289 { 'type': 'All', 'visible': true },
290 onVisibleNetworksReceived);
291 networkConfig.getNetworks(
292 { 'type': 'All', 'configured': true },
293 onFavoriteNetworksReceived);
297 * Sets refresh rate if the interval is found in the url.
299 var setRefresh = function() {
300 var interval = parseQueryParams(window.location)['refresh'];
301 if (interval && interval != '')
302 setInterval(requestNetworks, parseInt(interval) * 1000);
306 * Get network information from WebUI.
308 document.addEventListener('DOMContentLoaded', function() {
309 $('log-refresh').onclick = requestLog;
310 $('log-error').checked = true;
311 $('log-error').onclick = requestLog;
312 $('log-user').checked = true;
313 $('log-user').onclick = requestLog;
314 $('log-event').checked = true;
315 $('log-event').onclick = requestLog;
316 $('log-debug').checked = false;
317 $('log-debug').onclick = requestLog;
318 $('log-fileinfo').checked = false;
319 $('log-fileinfo').onclick = requestLog;
320 $('log-timedetail').checked = false;
321 $('log-timedetail').onclick = requestLog;
328 getNetworkLogCallback: getNetworkLogCallback