blob: b2e7e13031f87e7a3cd3b8c622f3710dbbf79a99 [file] [log] [blame]
// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
'use strict';
/**
* @fileoverview This file provides a JavaScript helper function that
* determines whether service worker registration has completed.
* TODO(crbug.com/768701): Move the ServiceWorker state operations to
* InspectorServiceWorker by implementing _OnNotification().
*/
(function() {
// Make executing this code idempotent.
if (window.__telemetry_getServiceWorkerState) {
return;
}
// These variables are used for checking service worker state.
let isServiceWorkerAccessable = true;
let isServiceWorkerRegistered = false;
let isServiceWorkerActivated = false;
window.__telemetry_getServiceWorkerState = () => {
// These returned string should exactly match strings used in
// ServiceWorkerState, in web_contents.py.
if (isServiceWorkerActivated) { return 'activated'; }
if (isServiceWorkerRegistered) { return 'installing'; }
return 'not registered';
};
// Check if service worker is accessible.
try {
if (!navigator.serviceWorker) {
isServiceWorkerAccessable = false;
}
} catch (e) {
// Ignore the exception here. We will frequently meet it because
// navigator.serviceWorker is not accessible when loading about:blank etc.
isServiceWorkerAccessable = false;
}
if (!isServiceWorkerAccessable) { return; }
// Patch navigator.serviceWorker.register().
navigator.serviceWorker.originalRegister =
navigator.serviceWorker.register;
navigator.serviceWorker.register = (name, options = {}) => {
isServiceWorkerRegistered = true;
return navigator.serviceWorker.originalRegister(name, options).then(
(registration) => {
let serviceworker = null;
// Service worker always have .active or .waiting or .installing.
if (registration.active) {
if (registration.active.state === 'activated') {
isServiceWorkerActivated = true;
return registration;
}
serviceworker = registration.active;
} else if (registration.waiting) {
serviceworker = registration.waiting;
} else {
serviceworker = registration.installing;
}
serviceworker.addEventListener('statechange', (event) => {
if (serviceworker.state === 'activated') {
isServiceWorkerActivated = true;
} else if (serviceworker.state === 'redundant') {
isServiceWorkerRegistered = false;
}
});
return registration;
},
(error) => {
isServiceWorkerRegistered = false;
return Promise.reject(error);
});
};
})();