Commit 3b705a74 authored by Yuta Kasai's avatar Yuta Kasai Committed by Commit Bot

WPT: Service Worker: Add unexpected state check to wait_for_state()

This patch makes wait_for_state() in test-helpers.sub.js for a service
worker WPT test check an unexpected state after adding the event
handler. Before this patch, wait_for_state() only checks the equivalence
of the state to the specific state. It might wait forever if the worker
unexpectedly skips the state or it's unexpectedly evicted.

Bug: 1000544
Change-Id: I7025fad3ba25648888a762e16ae0ded63f9c4f9f
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2344440
Commit-Queue: Makoto Shimazu <shimazu@chromium.org>
Reviewed-by: default avatarMatt Falkenhagen <falken@chromium.org>
Reviewed-by: default avatarMakoto Shimazu <shimazu@chromium.org>
Cr-Commit-Position: refs/heads/master@{#799561}
parent 397ad9f0
...@@ -92,56 +92,66 @@ function wait_for_update(test, registration) { ...@@ -92,56 +92,66 @@ function wait_for_update(test, registration) {
})); }));
} }
function wait_for_state(test, worker, state) { // Return true if |state_a| is more advanced than |state_b|.
if (!worker || worker.state == undefined) { function is_state_advanced(state_a, state_b) {
return Promise.reject(new Error( if (state_b === 'installing') {
'wait_for_state must be passed a ServiceWorker')); switch (state_a) {
}
if (worker.state === state)
return Promise.resolve(state);
if (state === 'installing') {
switch (worker.state) {
case 'installed': case 'installed':
case 'activating': case 'activating':
case 'activated': case 'activated':
case 'redundant': case 'redundant':
return Promise.reject(new Error( return true;
'worker is ' + worker.state + ' but waiting for ' + state));
} }
} }
if (state === 'installed') { if (state_b === 'installed') {
switch (worker.state) { switch (state_a) {
case 'activating': case 'activating':
case 'activated': case 'activated':
case 'redundant': case 'redundant':
return Promise.reject(new Error( return true;
'worker is ' + worker.state + ' but waiting for ' + state));
} }
} }
if (state === 'activating') { if (state_b === 'activating') {
switch (worker.state) { switch (state_a) {
case 'activated': case 'activated':
case 'redundant': case 'redundant':
return Promise.reject(new Error( return true;
'worker is ' + worker.state + ' but waiting for ' + state));
} }
} }
if (state === 'activated') { if (state_b === 'activated') {
switch (worker.state) { switch (state_a) {
case 'redundant': case 'redundant':
return Promise.reject(new Error( return true;
'worker is ' + worker.state + ' but waiting for ' + state));
} }
} }
return false;
}
return new Promise(test.step_func(function(resolve) { function wait_for_state(test, worker, state) {
if (!worker || worker.state == undefined) {
return Promise.reject(new Error(
'wait_for_state needs a ServiceWorker object to be passed.'));
}
if (worker.state === state)
return Promise.resolve(state);
if (is_state_advanced(worker.state, state)) {
return Promise.reject(new Error(
`Waiting for ${state} but the worker is already ${worker.state}.`));
}
return new Promise(test.step_func(function(resolve, reject) {
worker.addEventListener('statechange', test.step_func(function() { worker.addEventListener('statechange', test.step_func(function() {
if (worker.state === state) if (worker.state === state)
resolve(state); resolve(state);
if (is_state_advanced(worker.state, state)) {
reject(new Error(
`The state of the worker becomes ${worker.state} while waiting` +
`for ${state}.`));
}
})); }));
})); }));
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment