OLD | NEW |
---|---|
1 // Adapter for testharness.js-style tests with Service Workers | 1 // Adapter for testharness.js-style tests with Service Workers |
2 | 2 |
3 function service_worker_unregister_and_register(test, url, scope) { | 3 function service_worker_unregister_and_register(test, url, scope) { |
4 var options = scope ? { scope: scope } : {}; | 4 var options = scope ? {scope: scope} : {}; |
5 return navigator.serviceWorker.unregister(scope).then( | 5 return navigator.serviceWorker.unregister(scope) |
6 test.step_func(function() { | 6 .catch(unreached_rejection(test, 'Unregister should not fail')) |
7 return navigator.serviceWorker.register(url, options); | 7 .then(test.step_func(function() { |
8 }), | 8 return navigator.serviceWorker.register(url, options); |
9 unreached_rejection(test, 'Unregister should not fail') | 9 })) |
10 ).then(test.step_func(function(worker) { | 10 .catch(unreached_rejection(test, 'Registration should not fail')); |
11 return Promise.resolve(worker); | |
12 }), | |
13 unreached_rejection(test, 'Registration should not fail') | |
14 ); | |
15 } | 11 } |
16 | 12 |
17 function service_worker_unregister_and_done(test, scope) { | 13 function service_worker_unregister_and_done(test, scope) { |
18 return navigator.serviceWorker.unregister(scope).then( | 14 return navigator.serviceWorker.unregister(scope) |
19 test.done.bind(test), | 15 .then(test.done.bind(test), |
20 unreached_rejection(test, 'Unregister should not fail')); | 16 unreached_rejection(test, 'Unregister should not fail')); |
21 } | 17 } |
22 | 18 |
23 // Rejection-specific helper that provides more details | 19 // Rejection-specific helper that provides more details |
24 function unreached_rejection(test, prefix) { | 20 function unreached_rejection(test, prefix) { |
25 return test.step_func(function(error) { | 21 return test.step_func(function(error) { |
26 var reason = error.name ? error.name : error; | 22 var reason = error.message || error.name || error; |
falken
2014/08/07 12:45:45
Thank you for this!!! I've been using this locally
| |
27 var prefix = prefix ? prefix : "unexpected rejection"; | 23 var error_prefix = prefix || 'unexpected rejection'; |
28 assert_unreached(prefix + ': ' + reason); | 24 assert_unreached(error_prefix + ': ' + reason); |
29 }); | 25 }); |
30 } | 26 } |
31 | 27 |
32 // FIXME: Clean up the iframe when the test completes. | 28 // FIXME: Clean up the iframe when the test completes. |
33 function with_iframe(url, f) { | 29 function with_iframe(url, f) { |
34 return new Promise(function(resolve, reject) { | 30 return new Promise(function(resolve, reject) { |
35 var frame = document.createElement('iframe'); | 31 var frame = document.createElement('iframe'); |
36 frame.src = url; | 32 frame.src = url; |
37 frame.onload = function() { | 33 frame.onload = function() { |
38 if (f) { | 34 if (f) { |
39 f(frame); | 35 f(frame); |
40 } | 36 } |
41 resolve(frame); | 37 resolve(frame); |
42 }; | 38 }; |
43 document.body.appendChild(frame); | 39 document.body.appendChild(frame); |
44 }); | 40 }); |
45 } | 41 } |
46 | 42 |
47 function normalizeURL(url) { | 43 function normalizeURL(url) { |
48 return new URL(url, document.location).toString().replace(/#.*$/, ''); | 44 return new URL(url, document.location).toString().replace(/#.*$/, ''); |
49 } | 45 } |
50 | 46 |
51 function wait_for_state(test, worker, state) { | 47 function wait_for_state(test, worker, state) { |
52 return new Promise(test.step_func(function(resolve, reject) { | 48 return new Promise(test.step_func(function(resolve, reject) { |
53 worker.addEventListener('statechange', test.step_func(function() { | 49 worker.addEventListener('statechange', |
50 test.step_func(function() { | |
54 if (worker.state === state) | 51 if (worker.state === state) |
55 resolve(state); | 52 resolve(state); |
56 })); | 53 })); |
57 })); | 54 })); |
58 } | 55 } |
59 | 56 |
60 (function() { | 57 (function() { |
61 function fetch_tests_from_worker(worker) { | 58 function fetch_tests_from_worker(worker) { |
62 return new Promise(function(resolve, reject) { | 59 return new Promise(function(resolve, reject) { |
63 var messageChannel = new MessageChannel(); | 60 var messageChannel = new MessageChannel(); |
64 messageChannel.port1.addEventListener('message', function(message) { | 61 messageChannel.port1.addEventListener('message', function(message) { |
65 if (message.data.type == 'complete') { | 62 if (message.data.type == 'complete') { |
66 synthesize_tests(message.data.tests, message.data.status); | 63 synthesize_tests(message.data.tests, message.data.status); |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
102 var test = async_test(description); | 99 var test = async_test(description); |
103 service_worker_unregister_and_register(test, url, scope) | 100 service_worker_unregister_and_register(test, url, scope) |
104 .then(function(worker) { return fetch_tests_from_worker(worker); }) | 101 .then(function(worker) { return fetch_tests_from_worker(worker); }) |
105 .then(function() { return navigator.serviceWorker.unregister(scope); }) | 102 .then(function() { return navigator.serviceWorker.unregister(scope); }) |
106 .then(function() { test.done(); }) | 103 .then(function() { test.done(); }) |
107 .catch(test.step_func(function(e) { throw e; })); | 104 .catch(test.step_func(function(e) { throw e; })); |
108 }; | 105 }; |
109 | 106 |
110 self.service_worker_test = service_worker_test; | 107 self.service_worker_test = service_worker_test; |
111 })(); | 108 })(); |
OLD | NEW |