// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. cr.define('gcmInternals', function() { 'use strict'; var isRecording = false; /** * If the info dictionary has property prop, then set the text content of * element to the value of this property. Otherwise clear the content. * @param {!Object} info A dictionary of device infos to be displayed. * @param {string} prop Name of the property. * @param {string} element The id of a HTML element. */ function setIfExists(info, prop, element) { if (info[prop] !== undefined) { $(element).textContent = info[prop]; } else { $(element).textContent = ''; } } /** * Display device informations. * @param {!Object} info A dictionary of device infos to be displayed. */ function displayDeviceInfo(info) { setIfExists(info, 'androidId', 'android-id'); setIfExists(info, 'profileServiceCreated', 'profile-service-created'); setIfExists(info, 'gcmEnabled', 'gcm-enabled'); setIfExists(info, 'signedInUserName', 'signed-in-username'); setIfExists(info, 'gcmClientCreated', 'gcm-client-created'); setIfExists(info, 'gcmClientState', 'gcm-client-state'); setIfExists(info, 'connectionClientCreated', 'connection-client-created'); setIfExists(info, 'connectionState', 'connection-state'); setIfExists(info, 'registeredAppIds', 'registered-app-ids'); setIfExists(info, 'sendQueueSize', 'send-queue-size'); setIfExists(info, 'resendQueueSize', 'resend-queue-size'); } /** * Remove all the child nodes of the element. * @param {HTMLElement} element A HTML element. */ function removeAllChildNodes(element) { element.textContent = ''; } /** * For each item in line, add a row to the table. Each item is actually a list * of sub-items; each of which will have a corresponding cell created in that * row, and the sub-item will be displayed in the cell. * @param {HTMLElement} table A HTML tbody element. * @param {!Object} list A list of list of item. */ function addRows(table, list) { for (var i = 0; i < list.length; ++i) { var row = document.createElement('tr'); // The first element is always a timestamp. var cell = document.createElement('td'); var d = new Date(list[i][0]); cell.textContent = d; row.appendChild(cell); for (var j = 1; j < list[i].length; ++j) { var cell = document.createElement('td'); cell.textContent = list[i][j]; row.appendChild(cell); } table.appendChild(row); } } /** * Refresh all displayed information. */ function refreshAll() { chrome.send('getGcmInternalsInfo', [false]); } /** * Toggle the isRecording variable and send it to browser. */ function setRecording() { isRecording = !isRecording; chrome.send('setGcmInternalsRecording', [isRecording]); } /** * Clear all the activity logs. */ function clearLogs() { chrome.send('getGcmInternalsInfo', [true]); } function initialize() { $('recording').disabled = true; $('refresh').onclick = refreshAll; $('recording').onclick = setRecording; $('clear-logs').onclick = clearLogs; chrome.send('getGcmInternalsInfo', [false]); } /** * Refresh the log html table by clearing it first. If data is not empty, then * it will be used to populate the table. * @param {string} id ID of the log html table. * @param {!Object} data A list of list of data items. */ function refreshLogTable(id, data) { removeAllChildNodes($(id)); if (data !== undefined) { addRows($(id), data); } } /** * Callback function accepting a dictionary of info items to be displayed. * @param {!Object} infos A dictionary of info items to be displayed. */ function setGcmInternalsInfo(infos) { isRecording = infos.isRecording; if (isRecording) $('recording').textContent = 'Stop Recording'; else $('recording').textContent = 'Start Recording'; $('recording').disabled = false; if (infos.deviceInfo !== undefined) { displayDeviceInfo(infos.deviceInfo); } refreshLogTable('checkin-info', infos.checkinInfo); refreshLogTable('connection-info', infos.connectionInfo); refreshLogTable('registration-info', infos.registrationInfo); refreshLogTable('receive-info', infos.receiveInfo); refreshLogTable('send-info', infos.sendInfo); } // Return an object with all of the exports. return { initialize: initialize, setGcmInternalsInfo: setGcmInternalsInfo, }; }); document.addEventListener('DOMContentLoaded', gcmInternals.initialize);