Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(184)

Side by Side Diff: content/browser/resources/service_worker/serviceworker_internals.js

Issue 304543002: Show the unregistered workers in chrome://serviceworker-internals and chrome://inspect (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Pass live_registrations to chrome://inspect. Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 cr.define('serviceworker', function() { 5 cr.define('serviceworker', function() {
6 'use strict'; 6 'use strict';
falken 2014/05/28 08:21:40 it's late to point out now, but why does this file
horo 2014/05/28 09:06:39 Done.
7 7
8 function initialize() { 8 function initialize() {
9 if (window.location.hash == "#iframe") { 9 if (window.location.hash == "#iframe") {
10 // This page is loaded from chrome://inspect. 10 // This page is loaded from chrome://inspect.
11 window.addEventListener('message', onMessage.bind(this), false); 11 window.addEventListener('message', onMessage.bind(this), false);
12 } 12 }
13 update(); 13 update();
14 } 14 }
15 15
16 function onMessage(event) { 16 function onMessage(event) {
17 if (event.origin != 'chrome://inspect') { 17 if (event.origin != 'chrome://inspect') {
18 return; 18 return;
19 } 19 }
20 chrome.send(event.data.action, 20 sendCommand(event.data.action, event.data.worker);
21 [event.data.partition_path, event.data.scope]);
22 } 21 }
23 22
24 function update() { 23 function update() {
25 chrome.send('getAllRegistrations'); 24 chrome.send('getAllRegistrations');
26 } 25 }
27 26
28 function progressNodeFor(link) { 27 function progressNodeFor(link) {
29 return link.parentNode.querySelector('.operation-status'); 28 return link.parentNode.querySelector('.operation-status');
30 } 29 }
31 30
32 // All commands are sent with the partition_path and scope, and 31 // All commands are sent with the partition_path and scope, and
falken 2014/05/28 16:26:06 Is the "partition_path and scope" part of the comm
horo 2014/05/29 01:31:25 Done.
33 // are all completed with 'onOperationComplete'. 32 // are all completed with 'onOperationComplete'.
34 var COMMANDS = ['unregister', 'start', 'stop', 'sync', 'inspect']; 33 var COMMANDS = ['stop', 'sync', 'inspect', 'unregister', 'start'];
35 function commandHandler(command) { 34 function commandHandler(command) {
36 return function(event) { 35 return function(event) {
37 var link = event.target; 36 var link = event.target;
38 progressNodeFor(link).style.display = 'inline'; 37 progressNodeFor(link).style.display = 'inline';
39 chrome.send(command, [link.partition_path, 38 sendCommand(command, link.cmdArgs, (function(status){
40 link.scope]); 39 progressNodeFor(link).style.display = 'none';
40 }).bind(null, link));
41 return false; 41 return false;
42 }; 42 };
43 }; 43 };
44 44
45 function withNode(selector, partition_path, scope, callback) { 45 var commandCallbacks = [];
46 var links = document.querySelectorAll(selector); 46 function sendCommand(command, args, callback) {
47 for (var i = 0; i < links.length; ++i) { 47 var callbackId = 0;
48 var link = links[i]; 48 while (callbackId in commandCallbacks) {
49 if (partition_path == link.partition_path && 49 callbackId++;
50 scope == link.scope) {
51 callback(link);
52 }
53 } 50 }
51 commandCallbacks[callbackId] = callback;
52 chrome.send(command, [callbackId, args]);
54 } 53 }
55 54
56 // Fired from the backend after the start call has completed 55 // Fired from the backend after the command call has completed.
57 function onOperationComplete(status, path, scope) { 56 function onOperationComplete(status, callbackId) {
58 // refreshes the ui, displaying any relevant buttons 57 var callback = commandCallbacks[callbackId];
59 withNode('button', path, scope, function(link) { 58 delete commandCallbacks[callbackId];
60 progressNodeFor(link).style.display = 'none'; 59 if (callback) {
61 }); 60 callback(status);
61 }
62 update(); 62 update();
63 } 63 }
64 64
65 var allLogMessages = {};
66
67 // Send the active ServiceWorker information to chrome://inspect. 65 // Send the active ServiceWorker information to chrome://inspect.
68 function sendToInspectPage(registrations, partition_id, partition_path) { 66 function sendToInspectPage(live_registrations,
67 partition_id) {
69 var workers = []; 68 var workers = [];
70 for (var i = 0; i < registrations.length; i++) { 69 live_registrations.forEach(function (registration) {
falken 2014/05/28 08:21:40 should be no space after "function"? (and througho
horo 2014/05/28 09:06:39 Done.
71 var registration = registrations[i]; 70 [registration.active,
72 if (!registration.active || 71 registration.pending].forEach(function (version){
falken 2014/05/28 08:21:40 should be a space before "{"? (and throughout)
horo 2014/05/28 09:06:39 Done.
73 registration.active.running_status != 'RUNNING') { 72 if (!version || version.running_status != 'RUNNING') {
74 continue; 73 return;
75 } 74 }
76 workers.push({ 75 workers.push({
77 'partition_path': partition_path, 76 'scope': registration.scope,
78 'scope': registration.scope, 77 'url': registration.script_url,
79 'url': registration.script_url 78 'partition_id': partition_id,
80 }) 79 'version_id': version.version_id,
81 } 80 'process_id': version.process_id,
81 'devtools_agent_route_id':
82 version.devtools_agent_route_id
83 });
84 });
85 });
82 window.parent.postMessage({ 86 window.parent.postMessage({
83 'partition_id': partition_id, 87 'partition_id': partition_id,
84 'workers': workers, 88 'workers': workers,
85 }, 'chrome://inspect') 89 }, 'chrome://inspect')
86 } 90 }
87 91
92 var allLogMessages = {};
93 // Set log for each worker versions.
falken 2014/05/28 08:21:40 This function is really filling the log for one ve
horo 2014/05/28 09:06:39 Done.
94 function fillLogForVersion(partition_id, version) {
95 if (!version) {
96 return;
97 }
98 if (!(partition_id in allLogMessages)) {
99 allLogMessages[partition_id] = {};
100 }
101 var logMessages = allLogMessages[partition_id];
102 if (version.version_id in logMessages) {
103 version.log = logMessages[version.version_id];
104 } else {
105 version.log = '';
106 }
107 }
108
109 // Get the unregistered workers.
110 // |unregistered_registrations| will be filled with the registrations which
111 // are in |live_registrations| but not in |stored_registrations|.
112 // |unregistered_versions| will be filled with the versions which
113 // are in |live_versions| but not in |stored_registrations| nor in
114 // |live_registrations|.
115 function getUnregisteredWorkers(stored_registrations,
116 live_registrations,
117 live_versions,
118 unregistered_registrations,
119 unregistered_versions) {
120 var registration_id_set = {};
121 var version_id_set = {};
122 stored_registrations.forEach(function (registration) {
falken 2014/05/28 08:21:40 should be no space after "function"?
horo 2014/05/28 09:06:39 Done.
123 registration_id_set[registration.registration_id] = true;
124 });
125 [stored_registrations, live_registrations].forEach(
126 function (registrations) {
127 registrations.forEach(function (registration) {
128 [registration.active,
129 registration.pending].forEach(
130 function (version){
131 if (version) {
132 version_id_set[version.version_id] = true;
133 }
134 });
falken 2014/05/28 08:21:40 this close paren should be aligned with its open p
horo 2014/05/28 09:06:39 Done.
135 });
136 });
137 live_registrations.forEach(function (registration) {
138 if (!registration_id_set[registration.registration_id]) {
139 registration.unregistered = true;
140 unregistered_registrations.push(registration);
141 }
142 });
143 live_versions.forEach(function (version) {
144 if (!version_id_set[version.version_id]) {
145 unregistered_versions.push(version);
146 }
147 });
148 }
149
88 // Fired once per partition from the backend. 150 // Fired once per partition from the backend.
89 function onPartitionData(registrations, partition_id, partition_path) { 151 function onPartitionData(live_registrations,
152 live_versions,
153 stored_registrations,
154 partition_id,
155 partition_path) {
90 if (window.location.hash == "#iframe") { 156 if (window.location.hash == "#iframe") {
91 // This page is loaded from chrome://inspect. 157 // This page is loaded from chrome://inspect.
92 sendToInspectPage(registrations, partition_id, partition_path); 158 sendToInspectPage(live_registrations,
159 partition_id);
93 return; 160 return;
94 } 161 }
162 var unregistered_registrations = [];
163 var unregistered_versions = [];
164 getUnregisteredWorkers(stored_registrations,
165 live_registrations,
166 live_versions,
167 unregistered_registrations,
168 unregistered_versions);
95 var template; 169 var template;
96 var container = $('serviceworker-list'); 170 var container = $('serviceworker-list');
97
98 // Existing templates are keyed by partition_path. This allows 171 // Existing templates are keyed by partition_path. This allows
99 // the UI to be updated in-place rather than refreshing the 172 // the UI to be updated in-place rather than refreshing the
100 // whole page. 173 // whole page.
101 for (var i = 0; i < container.childNodes.length; ++i) { 174 for (var i = 0; i < container.childNodes.length; ++i) {
102 if (container.childNodes[i].partition_path == partition_path) { 175 if (container.childNodes[i].partition_path == partition_path) {
103 template = container.childNodes[i]; 176 template = container.childNodes[i];
104 } 177 }
105 } 178 }
106
107 // This is probably the first time we're loading. 179 // This is probably the first time we're loading.
108 if (!template) { 180 if (!template) {
109 template = jstGetTemplate('serviceworker-list-template'); 181 template = jstGetTemplate('serviceworker-list-template');
110 container.appendChild(template); 182 container.appendChild(template);
111 } 183 }
112 184 var fillLogFunc = fillLogForVersion.bind(this, partition_id);
113 // Set log for each worker versions. 185 stored_registrations.forEach(function (registration) {
114 if (!(partition_id in allLogMessages)) { 186 [registration.active, registration.pending].forEach(fillLogFunc);
115 allLogMessages[partition_id] = {};
116 }
117 var logMessages = allLogMessages[partition_id];
118 registrations.forEach(function (worker) {
119 [worker.active, worker.pending].forEach(function (version) {
120 if (version) {
121 if (version.version_id in logMessages) {
122 version.log = logMessages[version.version_id];
123 } else {
124 version.log = '';
125 }
126 }
127 });
128 }); 187 });
129 188 unregistered_registrations.forEach(function (registration) {
130 jstProcess(new JsEvalContext({ registrations: registrations, 189 [registration.active, registration.pending].forEach(fillLogFunc);
131 partition_id: partition_id, 190 });
132 partition_path: partition_path}), 191 unregistered_versions.forEach(fillLogFunc);
192 jstProcess(new JsEvalContext({
193 stored_registrations: stored_registrations,
194 unregistered_registrations: unregistered_registrations,
195 unregistered_versions: unregistered_versions,
196 partition_id: partition_id,
197 partition_path: partition_path}),
133 template); 198 template);
134 for (var i = 0; i < COMMANDS.length; ++i) { 199 for (var i = 0; i < COMMANDS.length; ++i) {
135 var handler = commandHandler(COMMANDS[i]); 200 var handler = commandHandler(COMMANDS[i]);
136 var links = container.querySelectorAll('button.' + COMMANDS[i]); 201 var links = container.querySelectorAll('button.' + COMMANDS[i]);
137 for (var j = 0; j < links.length; ++j) { 202 for (var j = 0; j < links.length; ++j) {
138 if (!links[j].hasClickEvent) { 203 if (!links[j].hasClickEvent) {
139 links[j].addEventListener('click', handler, false); 204 links[j].addEventListener('click', handler, false);
140 links[j].hasClickEvent = true; 205 links[j].hasClickEvent = true;
141 } 206 }
142 } 207 }
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
200 var logArea = logAreas[i]; 265 var logArea = logAreas[i];
201 if (logArea.partition_id == partition_id && 266 if (logArea.partition_id == partition_id &&
202 logArea.version_id == version_id) { 267 logArea.version_id == version_id) {
203 logArea.value += message; 268 logArea.value += message;
204 } 269 }
205 } 270 }
206 } 271 }
207 272
208 return { 273 return {
209 initialize: initialize, 274 initialize: initialize,
210 update: update,
211 onOperationComplete: onOperationComplete, 275 onOperationComplete: onOperationComplete,
212 onPartitionData: onPartitionData, 276 onPartitionData: onPartitionData,
213 onWorkerStarted: onWorkerStarted, 277 onWorkerStarted: onWorkerStarted,
214 onWorkerStopped: onWorkerStopped, 278 onWorkerStopped: onWorkerStopped,
215 onErrorReported: onErrorReported, 279 onErrorReported: onErrorReported,
216 onConsoleMessageReported: onConsoleMessageReported, 280 onConsoleMessageReported: onConsoleMessageReported,
217 onVersionStateChanged: onVersionStateChanged, 281 onVersionStateChanged: onVersionStateChanged,
218 onRegistrationStored: onRegistrationStored, 282 onRegistrationStored: onRegistrationStored,
219 onRegistrationDeleted: onRegistrationDeleted, 283 onRegistrationDeleted: onRegistrationDeleted,
220 }; 284 };
221 }); 285 });
222 286
223 document.addEventListener('DOMContentLoaded', serviceworker.initialize); 287 document.addEventListener('DOMContentLoaded', serviceworker.initialize);
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698