blob: a08ff83e2ce6b78dd23bd95777a5844fd2141444 [file] [log] [blame]
// 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);