blob: c2639b6592f0d2adcdd74841d31fef08cff0146d [file] [log] [blame]
// Copyright 2017 The Chromium Authors. All
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
/**
* @fileoverview using private properties isn't a Closure violation in tests.
* @suppress {accessControls}
*/
ApplicationTestRunner.registerServiceWorker = function(script, scope) {
return TestRunner.callFunctionInPageAsync('registerServiceWorker', [script, scope]);
};
ApplicationTestRunner.waitForActivated = function(scope) {
return TestRunner.callFunctionInPageAsync('waitForActivated', [scope]);
};
ApplicationTestRunner.unregisterServiceWorker = function(scope) {
return TestRunner.callFunctionInPageAsync('unregisterServiceWorker', [scope]);
};
ApplicationTestRunner.postToServiceWorker = function(scope, message) {
return TestRunner.evaluateInPageAnonymously('postToServiceWorker("' + scope + '","' + message + '")');
};
ApplicationTestRunner.waitForServiceWorker = function(callback) {
SDK.targetManager.observeTargets({
targetAdded: function(target) {
if (target.type() === SDK.Target.Type.ServiceWorker && callback) {
setTimeout(callback.bind(null, target), 0);
callback = null;
}
},
targetRemoved: function(target) {}
});
};
ApplicationTestRunner.dumpServiceWorkersView = function() {
const swView = UI.panels.resources.visibleView;
return swView._currentWorkersView._sectionList.childTextNodes()
.concat(swView._otherWorkersView._sectionList.childTextNodes())
.map(function(node) {
if (node.textContent === 'Received ' + (new Date(0)).toLocaleString()) {
return 'Invalid scriptResponseTime (unix epoch)';
}
return node.textContent.replace(/Received.*/, 'Received').replace(/#\d+/, '#N');
})
.join('\n');
};
ApplicationTestRunner.deleteServiceWorkerRegistration = function(scope) {
TestRunner.serviceWorkerManager.registrations().valuesArray().map(function(registration) {
if (registration.scopeURL === scope) {
TestRunner.serviceWorkerManager.deleteRegistration(registration.id);
}
});
};
ApplicationTestRunner.makeFetchInServiceWorker = function(scope, url, requestInitializer, callback) {
TestRunner.callFunctionInPageAsync('makeFetchInServiceWorker', [scope, url, requestInitializer]).then(callback);
};
TestRunner.deprecatedInitAsync(`
let registrations = {};
function registerServiceWorker(script, scope) {
return navigator.serviceWorker.register(script, {
scope: scope
})
.then(reg => registrations[scope] = reg)
.catch(err => {
return Promise.reject(new Error('Service Worker registration error: ' +
err.toString()));
});
}
function waitForActivated(scope) {
let reg = registrations[scope];
if (!reg)
return Promise.reject(new Error('The registration'));
let worker = reg.installing || reg.waiting || reg.active;
if (worker.state === 'activated')
return Promise.resolve();
if (worker.state === 'redundant')
return Promise.reject(new Error('The worker is redundant'));
return new Promise(resolve => {
worker.addEventListener('statechange', () => {
if (worker.state === 'activated')
resolve();
});
});
}
function postToServiceWorker(scope, message) {
registrations[scope].active.postMessage(message);
}
function unregisterServiceWorker(scope) {
let registration = registrations[scope];
if (!registration)
return Promise.reject('ServiceWorker for ' + scope + ' is not registered');
return registration.unregister().then(() => delete registrations[scope]);
}
function makeFetchInServiceWorker(scope, url, requestInitializer) {
let script = 'resources/network-fetch-worker.js';
return navigator.serviceWorker.register(script, {
scope: scope
}).then(registration => {
let worker = registration.installing;
return new Promise(resolve => {
navigator.serviceWorker.onmessage = e => {
resolve(e.data);
};
worker.postMessage({
url: url,
init: requestInitializer
});
});
});
}
`);