Correct the skip-waiting-installed.html behavior
According to the latest spec, the skipWaiting promise should be resolved
after 'activate' event is dispatched. This change is from
https://github.com/w3c/ServiceWorker/pull/1065.
Tracing through the spec, skipWaiting() enters "Try Activate".
"Try Activate" invokes "Activate". "Activate" blocks until the final step:
"13. Run the Update Worker State algorithm passing registration’s active
worker and activated as the arguments."
"Update Worker State" queues a task to set ServiceWorker#state to 'activated'.
But in step 10, we have dispatched the 'activate' event. Therefore the order
should be:
1. 'activate' event handler runs
2. skipWaiting() promise resolves
3. ServiceWorker#state is set to 'activated'
So we correct the test case here and delete all the wrong expected files.
BUG=725616
Change-Id: Id0765988c7cdf48f39bb73ccb3fc0cce6ea60949
Reviewed-on: https://chromium-review.googlesource.com/646244
Commit-Queue: Matt Falkenhagen <falken@chromium.org>
Reviewed-by: Matt Falkenhagen <falken@chromium.org>
Cr-Commit-Position: refs/heads/master@{#499513}
diff --git a/service-workers/service-worker/resources/skip-waiting-installed-worker.js b/service-workers/service-worker/resources/skip-waiting-installed-worker.js
index eb63026..b48d502 100644
--- a/service-workers/service-worker/resources/skip-waiting-installed-worker.js
+++ b/service-workers/service-worker/resources/skip-waiting-installed-worker.js
@@ -1,19 +1,11 @@
-self.state = 'starting';
-
-self.addEventListener('install', function() {
- self.state = 'installing';
- });
+var saw_activate_event = false
self.addEventListener('activate', function() {
- self.state = 'activating';
+ saw_activate_event = true;
});
self.addEventListener('message', function(event) {
var port = event.data.port;
- if (self.state !== 'installing') {
- port.postMessage('FAIL: Worker should be waiting in installed state');
- return;
- }
event.waitUntil(self.skipWaiting()
.then(function(result) {
if (result !== undefined) {
@@ -21,9 +13,15 @@
return;
}
- if (self.state === 'activating') {
+ if (!saw_activate_event) {
port.postMessage(
- 'FAIL: Promise should be resolved before worker is activated');
+ 'FAIL: Promise should be resolved after activate event is dispatched');
+ return;
+ }
+
+ if (self.registration.active.state !== 'activating') {
+ port.postMessage(
+ 'FAITL: Promise should be resolved before ServiceWorker#state is set to activated');
return;
}