OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
| 5 var activatedServiceWorkerPromise = null; |
| 6 |
5 // Returns a promise that will be resolved with an activated Service | 7 // Returns a promise that will be resolved with an activated Service |
6 // Worker, or rejects when the Service Worker could not be started. There | 8 // Worker, or rejects when the Service Worker could not be started. There |
7 // will be a message port to and from the worker in |messagePort|. | 9 // will be a message port to and from the worker in |messagePort|. |
8 function GetActivatedServiceWorker(script, scope) { | 10 function GetActivatedServiceWorker(script, scope) { |
9 return navigator.serviceWorker.getRegistration(scope) | 11 if (activatedServiceWorkerPromise == null) { |
10 .then(function(registration) { | 12 activatedServiceWorkerPromise = |
11 // Unregister any existing Service Worker. | 13 navigator.serviceWorker.getRegistration(scope) |
12 if (registration) | 14 .then(function(registration) { |
13 return registration.unregister(); | 15 // Unregister any existing Service Worker. |
14 }).then(function() { | 16 if (registration) |
15 // Register the Service Worker again. | 17 return registration.unregister(); |
16 return navigator.serviceWorker.register(script, { scope: scope }); | 18 }).then(function() { |
17 }).then(function(registration) { | 19 // Register the Service Worker again. |
18 if (registration.active) { | 20 return navigator.serviceWorker.register(script, { scope: scope }); |
19 return registration; | 21 }).then(function(registration) { |
20 } else if (registration.waiting || registration.installing) { | 22 if (registration.active) { |
21 var worker = registration.waiting || registration.installing; | 23 return registration; |
| 24 } else if (registration.waiting || registration.installing) { |
| 25 var worker = registration.waiting || registration.installing; |
| 26 return new Promise(function(resolve) { |
| 27 worker.addEventListener('statechange', function () { |
| 28 if (worker.state === 'activated') |
| 29 resolve(registration); |
| 30 }); |
| 31 }); |
| 32 } else { |
| 33 return Promise.reject('Service Worker in invalid state.'); |
| 34 } |
| 35 }).then(function(registration) { |
22 return new Promise(function(resolve) { | 36 return new Promise(function(resolve) { |
23 worker.addEventListener('statechange', function () { | 37 var channel = new MessageChannel(); |
24 if (worker.state === 'activated') | 38 channel.port1.addEventListener('message', function(event) { |
| 39 if (event.data == 'ready') |
25 resolve(registration); | 40 resolve(registration); |
26 }); | 41 }); |
| 42 |
| 43 registration.active.postMessage(channel.port2, |
| 44 [ channel.port2 ]); |
| 45 |
| 46 messagePort = channel.port1; |
| 47 messagePort.start(); |
27 }); | 48 }); |
28 } else { | 49 }); |
29 return Promise.reject('Service Worker in invalid state.'); | 50 } |
30 } | |
31 }).then(function(registration) { | |
32 return new Promise(function(resolve) { | |
33 var channel = new MessageChannel(); | |
34 channel.port1.addEventListener('message', function(event) { | |
35 if (event.data == 'ready') | |
36 resolve(registration); | |
37 }); | |
38 | 51 |
39 registration.active.postMessage(channel.port2, | 52 return activatedServiceWorkerPromise; |
40 [ channel.port2 ]); | |
41 | |
42 messagePort = channel.port1; | |
43 messagePort.start(); | |
44 }); | |
45 }); | |
46 } | 53 } |
OLD | NEW |