blob: 8ef2c756acaa7bab0228214cb4d52f82316b284a [file] [log] [blame]
[email protected]9b0d66b2014-02-20 13:16:011// Copyright 2014 The Chromium Authors. All rights reserved.
[email protected]f17be762014-01-30 21:05:382// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
[email protected]b7600272014-02-11 18:55:555cr.define('chrome.invalidations', function() {
[email protected]9b0d66b2014-02-20 13:16:016 /**
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
[email protected]5cb5b182014-03-18 00:32:399 * log any invalidations ocurred prior to opening the about:invalidation
10 * page).
[email protected]9b0d66b2014-02-20 13:16:0111 */
dpapadaa2d59d2018-12-05 19:10:4012 const tableObjects = {};
[email protected]f17be762014-01-30 21:05:3813
[email protected]edfe19f2014-03-21 01:38:1214 /**
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.
18 */
dpapadaa2d59d2018-12-05 19:10:4019 let cachedDetails = {};
[email protected]edfe19f2014-03-21 01:38:1220
[email protected]b7600272014-02-11 18:55:5521 function quote(str) {
22 return '\"' + str + '\"';
23 }
24
25 function nowTimeString() {
26 return '[' + new Date().getTime() + '] ';
27 }
28
29 /**
30 * Appends a string to a textarea log.
[email protected]b7600272014-02-11 18:55:5531 * @param {string} logMessage The string to be appended.
32 */
33 function appendToLog(logMessage) {
dpapadaa2d59d2018-12-05 19:10:4034 const invalidationsLog = $('invalidations-log');
[email protected]b7600272014-02-11 18:55:5535 invalidationsLog.value += logMessage + '\n';
36 }
[email protected]9b0d66b2014-02-20 13:16:0137 /**
38 * Updates the jstemplate with the latest ObjectIds, ordered by registrar.
39 */
40 function repaintTable() {
dpapadaa2d59d2018-12-05 19:10:4041 const keys = [];
42 for (const key in tableObjects) {
[email protected]9b0d66b2014-02-20 13:16:0143 keys.push(key);
[email protected]edfe19f2014-03-21 01:38:1244 }
[email protected]9b0d66b2014-02-20 13:16:0145 keys.sort();
dpapadaa2d59d2018-12-05 19:10:4046 const sortedInvalidations = [];
47 for (let i = 0; i < keys.length; i++) {
[email protected]9b0d66b2014-02-20 13:16:0148 sortedInvalidations.push(tableObjects[keys[i]]);
[email protected]edfe19f2014-03-21 01:38:1249 }
dpapadaa2d59d2018-12-05 19:10:4050 const wrapped = {objectsidtable: sortedInvalidations};
[email protected]9b0d66b2014-02-20 13:16:0151 jstProcess(new JsEvalContext(wrapped), $('objectsid-table-div'));
52 }
[email protected]b7600272014-02-11 18:55:5553
54 /**
[email protected]5cb5b182014-03-18 00:32:3955 * Shows the current state of the InvalidatorService.
[email protected]b7600272014-02-11 18:55:5556 * @param {string} newState The string to be displayed and logged.
[email protected]46109c52014-04-08 22:58:3457 * @param {number} lastChangedTime The time in epoch when the state was last
58 * changed.
[email protected]b7600272014-02-11 18:55:5559 */
[email protected]46109c52014-04-08 22:58:3460 function updateInvalidatorState(newState, lastChangedTime) {
dpapadaa2d59d2018-12-05 19:10:4061 const logMessage = nowTimeString() +
dbeamd0e42682017-06-19 07:14:1062 'Invalidations service state changed to ' + quote(newState);
[email protected]b7600272014-02-11 18:55:5563
64 appendToLog(logMessage);
dbeamd0e42682017-06-19 07:14:1065 $('invalidations-state').textContent =
66 newState + ' (since ' + new Date(lastChangedTime) + ')';
[email protected]b7600272014-02-11 18:55:5567 }
68
69 /**
70 * Adds to the log the latest invalidations received
Dan Beamb9749f412015-02-14 02:42:5071 * @param {!Array<!Object>} allInvalidations The array of ObjectId
[email protected]9b0d66b2014-02-20 13:16:0172 * that contains the invalidations received by the InvalidatorService.
[email protected]b7600272014-02-11 18:55:5573 */
74 function logInvalidations(allInvalidations) {
dpapadaa2d59d2018-12-05 19:10:4075 for (let i = 0; i < allInvalidations.length; i++) {
76 const inv = allInvalidations[i];
[email protected]b7600272014-02-11 18:55:5577 if (inv.hasOwnProperty('objectId')) {
dpapadaa2d59d2018-12-05 19:10:4078 const logMessage = nowTimeString() +
79 'Received Invalidation with type ' + quote(inv.objectId.name) +
80 ' version ' +
dbeamd0e42682017-06-19 07:14:1081 quote((inv.isUnknownVersion ? 'Unknown' : inv.version)) +
82 ' with payload ' + quote(inv.payload);
[email protected]b7600272014-02-11 18:55:5583
84 appendToLog(logMessage);
dpapadaa2d59d2018-12-05 19:10:4085 const isInvalidation = true;
[email protected]9b0d66b2014-02-20 13:16:0186 logToTable(inv, isInvalidation);
[email protected]b7600272014-02-11 18:55:5587 }
88 }
[email protected]9b0d66b2014-02-20 13:16:0189 repaintTable();
90 }
91
92 /**
93 * Marks a change in the table whether a new invalidation has arrived
94 * or a new ObjectId is currently being added or updated.
[email protected]063cbbb32014-02-27 01:46:2095 * @param {!Object} oId The ObjectId being added or updated.
96 * @param {!boolean} isInvaldation A flag that says that an invalidation
[email protected]9b0d66b2014-02-20 13:16:0197 * for this ObjectId has arrived or we just need to add it to the table
98 * as it was just updated its state.
99 */
100 function logToTable(oId, isInvalidation) {
dpapadaa2d59d2018-12-05 19:10:40101 const registrar = oId.registrar;
102 const name = oId.objectId.name;
103 const source = oId.objectId.source;
104 const totalCount = oId.objectId.totalCount || 0;
105 const key = source + '-' + name;
106 const time = new Date();
107 const version = oId.isUnknownVersion ? '?' : oId.version;
108 let payload = '';
Dan Beamd1cca6e2019-01-03 02:46:27109 if (oId.hasOwnProperty('payload')) {
[email protected]9b0d66b2014-02-20 13:16:01110 payload = oId.payload;
Dan Beamd1cca6e2019-01-03 02:46:27111 }
[email protected]9b0d66b2014-02-20 13:16:01112 if (!(key in tableObjects)) {
113 tableObjects[key] = {
114 name: name,
115 source: source,
[email protected]9364154f2014-03-31 17:39:24116 totalCount: totalCount,
117 sessionCount: 0,
[email protected]9b0d66b2014-02-20 13:16:01118 registrar: registrar,
119 time: '',
120 version: '',
121 payload: '',
122 type: 'content'
123 };
124 }
125 // Refresh the type to be a content because it might have been
126 // greyed out.
127 tableObjects[key].type = 'content';
128 if (isInvalidation) {
[email protected]9364154f2014-03-31 17:39:24129 tableObjects[key].totalCount = tableObjects[key].totalCount + 1;
130 tableObjects[key].sessionCount = tableObjects[key].sessionCount + 1;
[email protected]9b0d66b2014-02-20 13:16:01131 tableObjects[key].time = time.toTimeString();
132 tableObjects[key].version = version;
133 tableObjects[key].payload = payload;
134 }
135 }
136
137 /**
[email protected]063cbbb32014-02-27 01:46:20138 * Shows the handlers that are currently registered for invalidations
139 * (but might not have objects ids registered yet).
Dan Beamb9749f412015-02-14 02:42:50140 * @param {!Array<string>} allHandlers An array of Strings that are
[email protected]063cbbb32014-02-27 01:46:20141 * the names of all the handlers currently registered in the
142 * InvalidatorService.
143 */
144 function updateHandlers(allHandlers) {
dpapadaa2d59d2018-12-05 19:10:40145 const allHandlersFormatted = allHandlers.join(', ');
[email protected]063cbbb32014-02-27 01:46:20146 $('registered-handlers').textContent = allHandlersFormatted;
dpapadaa2d59d2018-12-05 19:10:40147 const logMessage = nowTimeString() +
[email protected]063cbbb32014-02-27 01:46:20148 'InvalidatorHandlers currently registered: ' + allHandlersFormatted;
149 appendToLog(logMessage);
150 }
151
152 /**
[email protected]9b0d66b2014-02-20 13:16:01153 * Updates the table with the objects ids registered for invalidations
[email protected]9b0d66b2014-02-20 13:16:01154 * @param {string} registrar The name of the owner of the InvalidationHandler
155 * that is registered for invalidations
156 * @param {Array of Object} allIds An array of ObjectsIds that are currently
157 * registered for invalidations. It is not differential (as in, whatever
158 * is not registered now but was before, it mean it was taken out the
159 * registered objects)
160 */
161 function updateIds(registrar, allIds) {
162 // Grey out every datatype assigned to this registrar
163 // (and reenable them later in case they are still registered).
dpapadaa2d59d2018-12-05 19:10:40164 for (const key in tableObjects) {
Dan Beamd1cca6e2019-01-03 02:46:27165 if (tableObjects[key]['registrar'] === registrar) {
[email protected]9b0d66b2014-02-20 13:16:01166 tableObjects[key].type = 'greyed';
Dan Beamd1cca6e2019-01-03 02:46:27167 }
[email protected]9b0d66b2014-02-20 13:16:01168 }
169 // Reenable those ObjectsIds still registered with this registrar.
dpapadaa2d59d2018-12-05 19:10:40170 for (let i = 0; i < allIds.length; i++) {
171 const oId = {objectId: allIds[i], registrar: registrar};
172 const isInvalidation = false;
[email protected]9b0d66b2014-02-20 13:16:01173 logToTable(oId, isInvalidation);
174 }
175 repaintTable();
[email protected]b7600272014-02-11 18:55:55176 }
177
178 /**
[email protected]edfe19f2014-03-21 01:38:12179 * Update the internal status display, merging new detailed information.
180 * @param {!Object} newDetails The dictionary containing assorted debugging
[email protected]5cb5b182014-03-18 00:32:39181 * details (e.g. Network Channel information).
182 */
[email protected]edfe19f2014-03-21 01:38:12183 function updateDetailedStatus(newDetails) {
dpapadaa2d59d2018-12-05 19:10:40184 for (const key in newDetails) {
[email protected]edfe19f2014-03-21 01:38:12185 cachedDetails[key] = newDetails[key];
186 }
187 $('internal-display').value = JSON.stringify(cachedDetails, null, 2);
[email protected]5cb5b182014-03-18 00:32:39188 }
189
190 /**
191 * Function that notifies the InvalidationsMessageHandler that the UI is
[email protected]b7600272014-02-11 18:55:55192 * ready to receive real-time notifications.
193 */
194 function onLoadWork() {
[email protected]5cb5b182014-03-18 00:32:39195 $('request-detailed-status').onclick = function() {
[email protected]edfe19f2014-03-21 01:38:12196 cachedDetails = {};
[email protected]5cb5b182014-03-18 00:32:39197 chrome.send('requestDetailedStatus');
198 };
[email protected]b7600272014-02-11 18:55:55199 chrome.send('doneLoading');
200 }
201
202 return {
[email protected]b7600272014-02-11 18:55:55203 logInvalidations: logInvalidations,
[email protected]063cbbb32014-02-27 01:46:20204 onLoadWork: onLoadWork,
[email protected]5cb5b182014-03-18 00:32:39205 updateDetailedStatus: updateDetailedStatus,
[email protected]063cbbb32014-02-27 01:46:20206 updateHandlers: updateHandlers,
207 updateIds: updateIds,
[email protected]5cb5b182014-03-18 00:32:39208 updateInvalidatorState: updateInvalidatorState,
[email protected]b7600272014-02-11 18:55:55209 };
210});
211
212document.addEventListener('DOMContentLoaded', chrome.invalidations.onLoadWork);