blob: b5d6ee9f6910f0f02bbc543413790cff1496789b [file] [log] [blame]
// Copyright 2023 The Cobalt Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
h5vcc.storage.clearServiceWorkerCache();
const unregisterAll = () => navigator.serviceWorker.getRegistrations().then(registrations =>
Promise.all(registrations.map(r => r.unregister())));
setTearDown(unregisterAll);
function TEST(test) {
console.log('[ RUN', test.name, ']');
test();
}
/**
* @param {KeyboardEvent} event
*/
window.onkeydown = function (event) {
assertEqual(undefined, self.clients);
if (!('serviceWorker' in navigator)) {
console.log("serviceWorker not in navigator, ending test");
onEndTest();
}
navigator.serviceWorker.ready.then(function (registration) {
assertNotEqual(null, registration);
console.log('(Expected) Registration ready promise',
registration, 'with active worker ', registration.active);
assertNotEqual(null, registration.active);
});
navigator.serviceWorker.oncontrollerchange = function (event) {
console.log('Got oncontrollerchange event', event.target);
}
navigator.serviceWorker.onmessage = function (event) {
console.log('Got onmessage event', event.target, event.data);
}
if (event.key == 0) {
console.log('Keydown 0');
TEST(SuccessfulRegistration);
} else if (event.key == 1) {
console.log('Keydown 1');
TEST(SuccessfulActivation);
} else if (event.key == 2) {
console.log('Keydown 2');
unregisterAll().then(() => onEndTest());
}
}
function SuccessfulRegistration() {
navigator.serviceWorker.register('service_worker_controller_activation_test_worker.js', {
scope: '/testdata',
}).then(function (registration) {
console.log('(Expected) Registration Succeeded:',
registration);
assertNotEqual(null, registration);
// The default value for RegistrationOptions.type is
// 'imports'.
assertEqual('imports', registration.updateViaCache);
assertTrue(registration.scope.endsWith('/testdata'));
// Check that the registration has an activated worker after
// some time. The delay used here should be long enough for
// the service worker to complete activating and have the
// state 'activated'. It has to be longer than the combined
// delays in the install or activate event handlers.
window.setTimeout(function () {
// Since these events are asynchronous, the service
// worker can be either of these states.
assertNotEqual(null, registration.active);
registration.active.postMessage('Registration is active after waiting.');
assertEqual('activated',
registration.active.state);
assertNotEqual(null, navigator.serviceWorker.controller);
assertEqual('activated',
navigator.serviceWorker.controller.state);
if (failed()) window.close();
console.log('Reload page');
window.location.href =
window.location.origin + window.location.pathname +
'?result=SuccessfulRegistration';
}, 1000);
}, function (error) {
console.log(`(Unexpected): ${error}`, error);
notReached();
onEndTest();
});
}
function SuccessfulActivation() {
navigator.serviceWorker.getRegistration().then(registration => {
assertTrue(!!registration);
assertEqual('imports', registration.updateViaCache);
assertNotEqual(null, registration.active);
assertEqual('activated', registration.active.state);
if (failed()) window.close();
console.log('Reload page');
window.location.href =
window.location.origin + window.location.pathname +
'?result=Success';
})
.catch(error => {
console.log(`(Unexpected): ${error}`, error);
notReached();
onEndTest();
});
assertNotEqual(null, navigator.serviceWorker.controller);
assertEqual('activated',
navigator.serviceWorker.controller.state);
}
var search = document.createElement('div');
search.id = window.location.search.replace(/\?result=/, 'Result');
document.body.appendChild(search);
setupFinished();