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.
5 cr.define('chrome.invalidations', function() {
7 * Local variable where we maintain a count of the invalidations received
8 * and of every ObjectId that has ever been updated (note that this doesn't
9 * log any invalidations ocurred prior to opening the about:invalidation
12 var tableObjects = {};
15 * Local variable that contains the detailed information in an object form.
16 * This was done this way as to allow multiple calls to updateDetailedStatus
17 * to keep adding new items.
19 var cachedDetails = {};
22 return '\"' + str + '\"';
25 function nowTimeString() {
26 return '[' + new Date().getTime() + '] ';
30 * Appends a string to a textarea log.
31 * @param {string} logMessage The string to be appended.
33 function appendToLog(logMessage) {
34 var invalidationsLog = $('invalidations-log');
35 invalidationsLog.value += logMessage + '\n';
38 * Updates the jstemplate with the latest ObjectIds, ordered by registrar.
40 function repaintTable() {
42 for (var key in tableObjects) {
46 var sortedInvalidations = [];
47 for (var i = 0; i < keys.length; i++) {
48 sortedInvalidations.push(tableObjects[keys[i]]);
50 var wrapped = { objectsidtable: sortedInvalidations };
51 jstProcess(new JsEvalContext(wrapped), $('objectsid-table-div'));
55 * Shows the current state of the InvalidatorService.
56 * @param {string} newState The string to be displayed and logged.
57 * @param {number} lastChangedTime The time in epoch when the state was last
60 function updateInvalidatorState(newState, lastChangedTime) {
61 var logMessage = nowTimeString() +
62 'Invalidations service state changed to ' + quote(newState);
64 appendToLog(logMessage);
65 $('invalidations-state').textContent = newState + ' (since ' +
66 new Date(lastChangedTime) + ')';
70 * Adds to the log the latest invalidations received
71 * @param {!Array<!Object>} allInvalidations The array of ObjectId
72 * that contains the invalidations received by the InvalidatorService.
74 function logInvalidations(allInvalidations) {
75 for (var i = 0; i < allInvalidations.length; i++) {
76 var inv = allInvalidations[i];
77 if (inv.hasOwnProperty('objectId')) {
78 var logMessage = nowTimeString() +
79 'Received Invalidation with type ' +
80 quote(inv.objectId.name) +
82 quote((inv.isUnknownVersion ? 'Unknown' : inv.version)) +
86 appendToLog(logMessage);
87 var isInvalidation = true;
88 logToTable(inv, isInvalidation);
95 * Marks a change in the table whether a new invalidation has arrived
96 * or a new ObjectId is currently being added or updated.
97 * @param {!Object} oId The ObjectId being added or updated.
98 * @param {!boolean} isInvaldation A flag that says that an invalidation
99 * for this ObjectId has arrived or we just need to add it to the table
100 * as it was just updated its state.
102 function logToTable(oId, isInvalidation) {
103 var registrar = oId.registrar;
104 var name = oId.objectId.name;
105 var source = oId.objectId.source;
106 var totalCount = oId.objectId.totalCount || 0;
107 var key = source + '-' + name;
108 var time = new Date();
109 var version = oId.isUnknownVersion ? '?' :
112 if (oId.hasOwnProperty('payload'))
113 payload = oId.payload;
114 if (!(key in tableObjects)) {
115 tableObjects[key] = {
118 totalCount: totalCount,
120 registrar: registrar,
127 // Refresh the type to be a content because it might have been
129 tableObjects[key].type = 'content';
130 if (isInvalidation) {
131 tableObjects[key].totalCount = tableObjects[key].totalCount + 1;
132 tableObjects[key].sessionCount = tableObjects[key].sessionCount + 1;
133 tableObjects[key].time = time.toTimeString();
134 tableObjects[key].version = version;
135 tableObjects[key].payload = payload;
140 * Shows the handlers that are currently registered for invalidations
141 * (but might not have objects ids registered yet).
142 * @param {!Array<string>} allHandlers An array of Strings that are
143 * the names of all the handlers currently registered in the
144 * InvalidatorService.
146 function updateHandlers(allHandlers) {
147 var allHandlersFormatted = allHandlers.join(', ');
148 $('registered-handlers').textContent = allHandlersFormatted;
149 var logMessage = nowTimeString() +
150 'InvalidatorHandlers currently registered: ' + allHandlersFormatted;
151 appendToLog(logMessage);
155 * Updates the table with the objects ids registered for invalidations
156 * @param {string} registrar The name of the owner of the InvalidationHandler
157 * that is registered for invalidations
158 * @param {Array of Object} allIds An array of ObjectsIds that are currently
159 * registered for invalidations. It is not differential (as in, whatever
160 * is not registered now but was before, it mean it was taken out the
161 * registered objects)
163 function updateIds(registrar, allIds) {
164 // Grey out every datatype assigned to this registrar
165 // (and reenable them later in case they are still registered).
166 for (var key in tableObjects) {
167 if (tableObjects[key]['registrar'] === registrar)
168 tableObjects[key].type = 'greyed';
170 // Reenable those ObjectsIds still registered with this registrar.
171 for (var i = 0; i < allIds.length; i++) {
172 var oId = { objectId: allIds[i], registrar: registrar };
173 var isInvalidation = false;
174 logToTable(oId, isInvalidation);
180 * Update the internal status display, merging new detailed information.
181 * @param {!Object} newDetails The dictionary containing assorted debugging
182 * details (e.g. Network Channel information).
184 function updateDetailedStatus(newDetails) {
185 for (var key in newDetails) {
186 cachedDetails[key] = newDetails[key];
188 $('internal-display').value = JSON.stringify(cachedDetails, null, 2);
192 * Function that notifies the InvalidationsMessageHandler that the UI is
193 * ready to receive real-time notifications.
195 function onLoadWork() {
196 $('request-detailed-status').onclick = function() {
198 chrome.send('requestDetailedStatus');
200 chrome.send('doneLoading');
204 logInvalidations: logInvalidations,
205 onLoadWork: onLoadWork,
206 updateDetailedStatus: updateDetailedStatus,
207 updateHandlers: updateHandlers,
208 updateIds: updateIds,
209 updateInvalidatorState: updateInvalidatorState,
213 document.addEventListener('DOMContentLoaded', chrome.invalidations.onLoadWork);