Commit 920881ea authored by Nicolás Peña Moreno's avatar Nicolás Peña Moreno Committed by Commit Bot

[ResourceTiming] Fix flakiness in workerStart test

This CL allows unregistering the service worker at the end of the test
to ensure that the test is not flaky when ran on WPT. It also slightly
modifies methods in sw-install to be closer to the counterparts used in
service-workers/service-worker/resources/test-helpers.sub.js.

Bug: 1032077
Change-Id: Ia4f1b993f69286cbe51213dc9d5158085fd147d1
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1964240
Commit-Queue: Nicolás Peña Moreno <npm@chromium.org>
Reviewed-by: default avatarBen Kelly <wanderview@chromium.org>
Cr-Commit-Position: refs/heads/master@{#725557}
parent 6e0efac2
<!DOCTYPE html>
<script>
function service_worker_unregister(documentUrl) {
return navigator.serviceWorker.getRegistration(documentUrl)
.then(function(registration) {
if (registration)
return registration.unregister();
})
async function service_worker_unregister(scope) {
var absoluteScope = (new URL(scope, window.location).href);
const registration = await navigator.serviceWorker.getRegistration(scope);
if (registration && registration.scope === absoluteScope)
return registration.unregister();
}
function service_worker_unregister_and_register(url, scope, options = {}) {
async function service_worker_unregister_and_register(url, scope, options = {}) {
if (!scope || scope.length == 0)
return Promise.reject(new Error('tests must define a scope'));
options.scope = scope;
return service_worker_unregister(scope)
.then(function() {
return navigator.serviceWorker.register(url, options);
})
await service_worker_unregister(scope);
return navigator.serviceWorker.register(url, options);
}
function wait_for_activation_event(worker) {
function wait_for_state_activated(worker) {
if (worker.state === 'activated')
return Promise.resolve();
if (worker.state === 'redundant') {
return Promise.reject(new Error('worker is redundant'));
}
return new Promise(function(resolve) {
worker.addEventListener('statechange', function(event) {
if (worker.state == 'activated')
resolve(true);
else if (worker.state == 'redundant')
resolve(false);
worker.addEventListener('statechange', function() {
if (worker.state === 'activated')
resolve();
});
});
}
......@@ -33,15 +35,20 @@ function wait_for_activation_event(worker) {
(async () => {
var script = '/resource-timing/resources/sw.js';
var scope = '/resource-timing/resources/';
await service_worker_unregister_and_register(script, scope)
.then(function(registration) {
return wait_for_activation_event(registration.installing);
})
.then(function(did_install) {
if (window.opener) {
window.opener.postMessage("installed", "*");
}
})
const registration = await service_worker_unregister_and_register(script, scope);
await wait_for_state_activated(registration.installing);
const opener = window.opener;
if (!opener)
return;
opener.postMessage("installed", "*");
async function unregister(e) {
if (e.data === "unregister") {
await registration.unregister();
opener.postMessage("unregistered", "*");
}
}
window.addEventListener("message", e => unregister(e));
})();
</script>
......@@ -24,9 +24,7 @@ let openee;
promise_test(t => {
return new Promise(resolve => {
addEventListener("message", e => {
if (e.data == "installed") {
// Close window once we get an event that it was installed
openee.close();
if (e.data === 'installed') {
performance.clearResourceTimings();
resolve();
}
......@@ -59,6 +57,19 @@ promise_test(t => {
// Add iframe to remote origin - page with TAO
promise_test(t => {
let unregisterPromise = new Promise(resolve => {
addEventListener("message", e => {
if (e.data === "unregistered") {
resolve();
}
});
});
t.add_cleanup(async () => {
openee.postMessage("unregister", "*");
await unregisterPromise;
// Close the window.
openee.close();
});
return new Promise((resolve, reject) => {
const observer = new PerformanceObserver(list => {
const entries = list.getEntries();
......
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