OLD | NEW |
1 var pendingPorts = []; | 1 var pendingPorts = []; |
2 var portResolves = []; | 2 var portResolves = []; |
3 | 3 |
4 onmessage = function(e) { | 4 onmessage = function(e) { |
5 var message = e.data; | 5 var message = e.data; |
6 if ('port' in message) { | 6 if ('port' in message) { |
7 var resolve = self.portResolves.shift(); | 7 var resolve = self.portResolves.shift(); |
8 if (resolve) | 8 if (resolve) |
9 resolve(message.port); | 9 resolve(message.port); |
10 else | 10 else |
11 self.pendingPorts.push(message.port); | 11 self.pendingPorts.push(message.port); |
12 } | 12 } |
13 }; | 13 }; |
14 | 14 |
15 function fulfillPromise() { | 15 function fulfillPromise() { |
16 return new Promise(function(resolve) { | 16 return new Promise(function(resolve) { |
17 // Make sure the oninstall/onactivate callback returns first. | 17 // Make sure the oninstall/onactivate callback returns first. |
18 Promise.resolve().then(function() { | 18 Promise.resolve().then(function() { |
19 var port = self.pendingPorts.shift(); | 19 var port = self.pendingPorts.shift(); |
20 if (port) | 20 if (port) |
21 resolve(port); | 21 resolve(port); |
22 else | 22 else |
23 self.portResolves.push(resolve); | 23 self.portResolves.push(resolve); |
24 }); | 24 }); |
25 }).then(function(port) { | 25 }).then(function(port) { |
26 port.postMessage('SYNC'); | 26 port.postMessage('SYNC'); |
27 return new Promise(function(resolve) { | 27 return new Promise(function(resolve) { |
28 port.onmessage = function(e) { | 28 port.onmessage = function(e) { |
29 if (e.data == 'ACK') | 29 if (e.data == 'ACK') |
30 resolve(); | 30 resolve(); |
31 }; | 31 }; |
32 }); | 32 }); |
33 }); | 33 }); |
34 } | 34 } |
35 | 35 |
36 function rejectPromise() { | 36 function rejectPromise() { |
37 return new Promise(function(resolve, reject) { | 37 return new Promise(function(resolve, reject) { |
38 // Make sure the oninstall/onactivate callback returns first. | 38 // Make sure the oninstall/onactivate callback returns first. |
39 Promise.resolve().then(reject); | 39 Promise.resolve().then(reject); |
40 }); | 40 }); |
41 } | 41 } |
42 | 42 |
43 function stripScopeName(scope) { | 43 function stripScopeName(scope) { |
44 return scope.split('/').slice(-1)[0]; | 44 return scope.split('/').slice(-1)[0]; |
45 } | 45 } |
46 | 46 |
47 oninstall = function(e) { | 47 oninstall = function(e) { |
48 switch (stripScopeName(self.scope)) { | 48 switch (stripScopeName(self.scope)) { |
49 case 'install-fulfilled': | 49 case 'install-fulfilled': |
50 e.waitUntil(fulfillPromise()); | 50 e.waitUntil(fulfillPromise()); |
51 break; | 51 break; |
52 case 'install-rejected': | 52 case 'install-rejected': |
53 e.waitUntil(rejectPromise()); | 53 e.waitUntil(rejectPromise()); |
54 break; | 54 break; |
55 } | 55 } |
56 }; | 56 }; |
57 | 57 |
58 onactivate = function(e) { | 58 onactivate = function(e) { |
59 switch (stripScopeName(self.scope)) { | 59 switch (stripScopeName(self.scope)) { |
60 case 'activate-fulfilled': | 60 case 'activate-fulfilled': |
61 e.waitUntil(fulfillPromise()); | 61 e.waitUntil(fulfillPromise()); |
62 break; | 62 break; |
63 case 'activate-rejected': | 63 case 'activate-rejected': |
64 e.waitUntil(rejectPromise()); | 64 e.waitUntil(rejectPromise()); |
65 break; | 65 break; |
66 case 'activate-multiple-fulfilled': | 66 case 'activate-multiple-fulfilled': |
67 e.waitUntil(fulfillPromise()); | 67 e.waitUntil(fulfillPromise()); |
68 e.waitUntil(fulfillPromise()); | 68 e.waitUntil(fulfillPromise()); |
69 break; | 69 break; |
70 case 'activate-reject-precedence': | 70 case 'activate-reject-precedence': |
71 e.waitUntil(fulfillPromise()); | 71 e.waitUntil(fulfillPromise()); |
72 e.waitUntil(rejectPromise()); | 72 e.waitUntil(rejectPromise()); |
73 break; | 73 break; |
74 } | 74 } |
75 }; | 75 }; |
OLD | NEW |