Index: third_party/WebKit/LayoutTests/imported/wpt/service-workers/service-worker/resources/extendable-event-async-waituntil.js |
diff --git a/third_party/WebKit/LayoutTests/imported/wpt/service-workers/service-worker/resources/extendable-event-async-waituntil.js b/third_party/WebKit/LayoutTests/imported/wpt/service-workers/service-worker/resources/extendable-event-async-waituntil.js |
index d77238d9397c14b16a714165e0e33438b000b583..21b4e28a1ad646953f311fe801f130e2298111a0 100644 |
--- a/third_party/WebKit/LayoutTests/imported/wpt/service-workers/service-worker/resources/extendable-event-async-waituntil.js |
+++ b/third_party/WebKit/LayoutTests/imported/wpt/service-workers/service-worker/resources/extendable-event-async-waituntil.js |
@@ -1,20 +1,100 @@ |
-var result = 'FAIL: did not throw.'; |
+// controlled by 'init'/'done' messages. |
+var resolveLockPromise; |
+var port; |
self.addEventListener('message', function(event) { |
- event.data.port.postMessage(result); |
+ var waitPromise; |
+ var resolveTestPromise; |
+ |
+ switch (event.data.step) { |
+ case 'init': |
+ event.waitUntil(new Promise((res) => { resolveLockPromise = res; })); |
+ port = event.data.port; |
+ break; |
+ case 'done': |
+ resolveLockPromise(); |
+ break; |
+ case 'no-current-extension-different-task': |
+ async_task_waituntil(event).then(reportResultExpecting('InvalidStateError')); |
+ break; |
+ case 'no-current-extension-different-microtask': |
+ async_microtask_waituntil(event).then(reportResultExpecting('InvalidStateError')); |
+ break; |
+ case 'current-extension-different-task': |
+ event.waitUntil(new Promise((res) => { resolveTestPromise = res; })); |
+ async_task_waituntil(event).then(reportResultExpecting('OK')).then(resolveTestPromise); |
+ break; |
+ case 'current-extension-expired-same-microtask-turn': |
+ waitPromise = Promise.resolve(); |
+ event.waitUntil(waitPromise); |
+ waitPromise.then(() => { return sync_waituntil(event); }) |
+ .then(reportResultExpecting('OK')) |
+ break; |
+ case 'current-extension-expired-same-microtask-turn-extra': |
+ // The promise handler queues a new microtask *after* the check for new |
+ // extensions was performed. |
+ waitPromise = Promise.resolve(); |
+ event.waitUntil(waitPromise); |
+ waitPromise.then(() => { return async_microtask_waituntil(event); }) |
+ .then(reportResultExpecting('InvalidStateError')) |
+ break; |
+ case 'current-extension-expired-different-task': |
+ event.waitUntil(Promise.resolve()); |
+ async_task_waituntil(event).then(reportResultExpecting('InvalidStateError')); |
+ break; |
+ } |
+ event.source.postMessage('ACK'); |
}); |
-self.addEventListener('install', function(event) { |
- self.installEvent = event; |
+self.addEventListener('fetch', function(event) { |
+ var resolveFetch; |
+ let response = new Promise((res) => { resolveFetch = res; }); |
+ event.respondWith(response); |
+ async_task_waituntil(event) |
+ .then(reportResultExpecting('OK')) |
+ .then(() => { resolveFetch(new Response('OK')); }); |
}); |
-self.addEventListener('activate', function(event) { |
+function reportResultExpecting(expectedResult) { |
+ return function (result) { |
+ port.postMessage({result : result, expected: expectedResult}); |
+ return result; |
+ }; |
+} |
+ |
+function sync_waituntil(event) { |
+ return new Promise((res, rej) => { |
try { |
- self.installEvent.waitUntil(new Promise(function(){})); |
- } catch (error) { |
- if (error.name == 'InvalidStateError') |
- result = 'PASS'; |
- else |
- result = 'FAIL: unexpected exception: ' + error; |
- } |
+ event.waitUntil(Promise.resolve()); |
+ res('OK'); |
+ } catch (error) { |
+ res(error.name); |
+ } |
+ }); |
+} |
+ |
+function async_microtask_waituntil(event) { |
+ return new Promise((res, rej) => { |
+ Promise.resolve().then(() => { |
+ try { |
+ event.waitUntil(Promise.resolve()); |
+ res('OK'); |
+ } catch (error) { |
+ res(error.name); |
+ } |
+ }); |
+ }); |
+} |
+ |
+function async_task_waituntil(event) { |
+ return new Promise((res, rej) => { |
+ setTimeout(() => { |
+ try { |
+ event.waitUntil(Promise.resolve()); |
+ res('OK'); |
+ } catch (error) { |
+ res(error.name); |
+ } |
+ }, 0); |
}); |
+} |