Home | History | Annotate | Download | only in resources
      1 // Copyright 2014 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.
      4 
      5 cr.define('gcmInternals', function() {
      6   'use strict';
      7 
      8   var isRecording = false;
      9 
     10   /**
     11    * If the info dictionary has property prop, then set the text content of
     12    * element to the value of this property. Otherwise clear the content.
     13    * @param {!Object} info A dictionary of device infos to be displayed.
     14    * @param {string} prop Name of the property.
     15    * @param {string} element The id of a HTML element.
     16    */
     17   function setIfExists(info, prop, element) {
     18     if (info[prop] !== undefined) {
     19       $(element).textContent = info[prop];
     20     } else {
     21       $(element).textContent = '';
     22     }
     23   }
     24 
     25   /**
     26    * Display device informations.
     27    * @param {!Object} info A dictionary of device infos to be displayed.
     28    */
     29   function displayDeviceInfo(info) {
     30     setIfExists(info, 'androidId', 'android-id');
     31     setIfExists(info, 'profileServiceCreated', 'profile-service-created');
     32     setIfExists(info, 'gcmEnabled', 'gcm-enabled');
     33     setIfExists(info, 'signedInUserName', 'signed-in-username');
     34     setIfExists(info, 'gcmClientCreated', 'gcm-client-created');
     35     setIfExists(info, 'gcmClientState', 'gcm-client-state');
     36     setIfExists(info, 'connectionClientCreated', 'connection-client-created');
     37     setIfExists(info, 'connectionState', 'connection-state');
     38     setIfExists(info, 'registeredAppIds', 'registered-app-ids');
     39     setIfExists(info, 'sendQueueSize', 'send-queue-size');
     40     setIfExists(info, 'resendQueueSize', 'resend-queue-size');
     41   }
     42 
     43   /**
     44    * Remove all the child nodes of the element.
     45    * @param {HTMLElement} element A HTML element.
     46    */
     47   function removeAllChildNodes(element) {
     48     element.textContent = '';
     49   }
     50 
     51   /**
     52    * For each item in line, add a row to the table. Each item is actually a list
     53    * of sub-items; each of which will have a corresponding cell created in that
     54    * row, and the sub-item will be displayed in the cell.
     55    * @param {HTMLElement} table A HTML tbody element.
     56    * @param {!Object} list A list of list of item.
     57    */
     58   function addRows(table, list) {
     59     for (var i = 0; i < list.length; ++i) {
     60       var row = document.createElement('tr');
     61 
     62       // The first element is always a timestamp.
     63       var cell = document.createElement('td');
     64       var d = new Date(list[i][0]);
     65       cell.textContent = d;
     66       row.appendChild(cell);
     67 
     68       for (var j = 1; j < list[i].length; ++j) {
     69         var cell = document.createElement('td');
     70         cell.textContent = list[i][j];
     71         row.appendChild(cell);
     72       }
     73       table.appendChild(row);
     74     }
     75   }
     76 
     77   /**
     78    * Refresh all displayed information.
     79    */
     80   function refreshAll() {
     81     chrome.send('getGcmInternalsInfo', [false]);
     82   }
     83 
     84   /**
     85    * Toggle the isRecording variable and send it to browser.
     86    */
     87   function setRecording() {
     88     isRecording = !isRecording;
     89     chrome.send('setGcmInternalsRecording', [isRecording]);
     90   }
     91 
     92   /**
     93    * Clear all the activity logs.
     94    */
     95   function clearLogs() {
     96     chrome.send('getGcmInternalsInfo', [true]);
     97   }
     98 
     99   function initialize() {
    100     $('recording').disabled = true;
    101     $('refresh').onclick = refreshAll;
    102     $('recording').onclick = setRecording;
    103     $('clear-logs').onclick = clearLogs;
    104     chrome.send('getGcmInternalsInfo', [false]);
    105   }
    106 
    107   /**
    108    * Refresh the log html table by clearing it first. If data is not empty, then
    109    * it will be used to populate the table.
    110    * @param {string} id ID of the log html table.
    111    * @param {!Object} data A list of list of data items.
    112    */
    113   function refreshLogTable(id, data) {
    114     removeAllChildNodes($(id));
    115     if (data !== undefined) {
    116       addRows($(id), data);
    117     }
    118   }
    119 
    120   /**
    121    * Callback function accepting a dictionary of info items to be displayed.
    122    * @param {!Object} infos A dictionary of info items to be displayed.
    123    */
    124   function setGcmInternalsInfo(infos) {
    125     isRecording = infos.isRecording;
    126     if (isRecording)
    127       $('recording').textContent = 'Stop Recording';
    128     else
    129       $('recording').textContent = 'Start Recording';
    130     $('recording').disabled = false;
    131     if (infos.deviceInfo !== undefined) {
    132       displayDeviceInfo(infos.deviceInfo);
    133     }
    134 
    135     refreshLogTable('checkin-info', infos.checkinInfo);
    136     refreshLogTable('connection-info', infos.connectionInfo);
    137     refreshLogTable('registration-info', infos.registrationInfo);
    138     refreshLogTable('receive-info', infos.receiveInfo);
    139     refreshLogTable('send-info', infos.sendInfo);
    140   }
    141 
    142   // Return an object with all of the exports.
    143   return {
    144     initialize: initialize,
    145     setGcmInternalsInfo: setGcmInternalsInfo,
    146   };
    147 });
    148 
    149 document.addEventListener('DOMContentLoaded', gcmInternals.initialize);
    150