Index: LayoutTests/http/tests/navigatorconnect/resources/connect-event-worker.js |
diff --git a/LayoutTests/http/tests/navigatorconnect/resources/connect-event-worker.js b/LayoutTests/http/tests/navigatorconnect/resources/connect-event-worker.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..498171dcfda26b68003f0d269e0436d44fbafbec |
--- /dev/null |
+++ b/LayoutTests/http/tests/navigatorconnect/resources/connect-event-worker.js |
@@ -0,0 +1,129 @@ |
+importScripts('../../serviceworker/resources/worker-testharness.js'); |
+importScripts('../../serviceworker/resources/test-helpers.js'); |
+importScripts('/resources/testharness-helpers.js'); |
+importScripts('test-helpers.js'); |
+ |
+// Returns a promise that additionally has |resolve| and |reject| methods. |
+function NewResolvablePromise() { |
+ var resolveMethod, rejectMethod; |
+ var p = new Promise(function(resolve, reject) { |
+ resolveMethod = resolve; |
+ rejectMethod = reject; |
+ }); |
+ p.resolve = resolveMethod; |
+ p.reject = rejectMethod; |
+ return p; |
+} |
+ |
+self.addEventListener('install', function(event) { |
+ event.waitUntil(self.skipWaiting()); |
+}); |
+ |
+self.addEventListener('activate', function(event) { |
+ sequential_promise_test(function(test) { |
+ return wait_for_state(test, self.registration.active, 'activated'); |
+ }, 'wait for worker to be activated'); |
+ |
+ sequential_promise_test(function(test) { |
+ var respondResult = NewResolvablePromise(); |
+ navigator.services.onconnect = test.step_func(function(event) { |
+ respondResult.resolve(event.respondWith({accept: true})); |
+ }); |
+ return Promise.all([respondResult, |
+ navigator.services.connect(self.registration.scope + '/service')]); |
+ }, 'respondWith can synchronously accept a connection without a promise.'); |
+ |
+ sequential_promise_test(function(test) { |
+ var respondResult = NewResolvablePromise(); |
+ navigator.services.onconnect = test.step_func(function(event) { |
+ respondResult.resolve( |
+ event.respondWith(Promise.resolve({accept: true}))); |
+ }); |
+ return Promise.all([respondResult, |
+ navigator.services.connect(self.registration.scope + '/service')]); |
+ }, 'respondWith can synchronously accept a connection with a promise.'); |
+ |
+ sequential_promise_test(function(test) { |
+ var respondResult = NewResolvablePromise(); |
+ navigator.services.onconnect = test.step_func(function(event) { |
+ respondResult.resolve( |
+ event.respondWith(new Promise(function(resolve) { |
+ self.setTimeout(resolve, 1, {accept: true}); |
+ }))); |
+ }); |
+ return Promise.all([respondResult, |
+ navigator.services.connect(self.registration.scope + '/service')]); |
+ }, 'respondWith can asynchronously accept a connection.'); |
+ |
+ sequential_promise_test(function(test) { |
+ var respondResult = NewResolvablePromise(); |
+ navigator.services.onconnect = test.step_func(function(event) { |
+ respondResult.resolve( |
+ promise_rejects(test, "AbortError", |
+ event.respondWith({accept: false}))); |
+ }); |
+ return Promise.all([respondResult, |
+ promise_rejects(test, 'AbortError', |
+ navigator.services.connect(self.registration.scope + '/service')) |
+ ]); |
+ }, 'respondWith can synchronously reject a connection without a promise.'); |
+ |
+ sequential_promise_test(function(test) { |
+ var respondResult = NewResolvablePromise(); |
+ navigator.services.onconnect = test.step_func(function(event) { |
+ respondResult.resolve( |
+ promise_rejects(test, "AbortError", |
+ event.respondWith(Promise.resolve({accept: false})))); |
+ }); |
+ return Promise.all([respondResult, |
+ promise_rejects(test, 'AbortError', |
+ navigator.services.connect(self.registration.scope + '/service')) |
+ ]); |
+ }, 'respondWith can synchronously reject a connection with a resolved promise.'); |
+ |
+ sequential_promise_test(function(test) { |
+ var respondResult = NewResolvablePromise(); |
+ navigator.services.onconnect = test.step_func(function(event) { |
+ respondResult.resolve( |
+ promise_rejects(test, "AbortError", |
+ event.respondWith(Promise.reject()))); |
+ }); |
+ return Promise.all([respondResult, |
+ promise_rejects(test, 'AbortError', |
+ navigator.services.connect(self.registration.scope + '/service')) |
+ ]); |
+ }, 'respondWith can synchronously reject a connection with a rejected promise.'); |
+ |
+ sequential_promise_test(function(test) { |
+ navigator.services.onconnect = test.step_func(function(event) { |
+ }); |
+ return promise_rejects(test, 'AbortError', |
+ navigator.services.connect(self.registration.scope + '/service')); |
+ }, 'Not calling respondWith will reject the connection.'); |
+ |
+ sequential_promise_test(function(test) { |
+ var respondResult1 = NewResolvablePromise(); |
+ var respondResult2 = NewResolvablePromise(); |
+ navigator.services.onconnect = test.step_func(function(event) { |
+ respondResult1.resolve(event.respondWith({accept: true})); |
+ respondResult2.resolve( |
+ promise_rejects(test, 'InvalidStateError', |
+ event.respondWith({}))); |
+ }); |
+ return Promise.all([respondResult1, respondResult2, |
+ navigator.services.connect(self.registration.scope + '/service')]); |
+ }, 'Calling respondWith a second time will fail.'); |
+ |
+ sequential_promise_test(function(test) { |
+ var respondResult = NewResolvablePromise(); |
+ navigator.services.onconnect = test.step_func(function(event) { |
+ respondResult.resolve( |
+ promise_rejects(test, new TypeError(), |
+ event.respondWith(""))); |
+ }); |
+ return Promise.all([respondResult, |
+ promise_rejects(test, 'AbortError', |
+ navigator.services.connect(self.registration.scope + '/service')) |
+ ]); |
+ }, 'Calling respondWith with something that is not an object rejects.'); |
+}); |