| // Copyright 2015 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. |
| |
| var activatedServiceWorkerPromise = null; |
| var messagePort = null; |
| |
| // Returns a promise that will be resolved with an activated Service |
| // Worker, or rejects when the Service Worker could not be started. There |
| // will be a message port to and from the worker in |messagePort|. |
| function GetActivatedServiceWorker(script, scope) { |
| if (activatedServiceWorkerPromise == null) { |
| activatedServiceWorkerPromise = |
| navigator.serviceWorker.getRegistration(scope) |
| .then(function(registration) { |
| // Unregister any existing Service Worker. |
| if (registration) |
| return registration.unregister(); |
| }).then(function() { |
| // Register the Service Worker again. |
| return navigator.serviceWorker.register(script, { scope: scope }); |
| }).then(function(registration) { |
| if (registration.active) { |
| return registration; |
| } else if (registration.waiting || registration.installing) { |
| var worker = registration.waiting || registration.installing; |
| return new Promise(function(resolve) { |
| worker.addEventListener('statechange', function () { |
| if (worker.state === 'activated') |
| resolve(registration); |
| }); |
| }); |
| } else { |
| return Promise.reject('Service Worker in invalid state.'); |
| } |
| }).then(function(registration) { |
| return new Promise(function(resolve) { |
| var channel = new MessageChannel(); |
| channel.port1.addEventListener('message', function(event) { |
| if (event.data == 'ready') |
| resolve(registration); |
| }); |
| |
| registration.active.postMessage(channel.port2, |
| [ channel.port2 ]); |
| |
| messagePort = channel.port1; |
| messagePort.start(); |
| }); |
| }); |
| } |
| |
| return activatedServiceWorkerPromise; |
| } |