| OLD | NEW |
| 1 <!DOCTYPE html> | 1 <!DOCTYPE html> |
| 2 <title>InstallPhaseEvent: waitUntil</title> | 2 <title>InstallPhaseEvent: waitUntil</title> |
| 3 <script src="../resources/testharness.js"></script> | 3 <script src="../resources/testharness.js"></script> |
| 4 <script src="../resources/testharnessreport.js"></script> | 4 <script src="../resources/testharnessreport.js"></script> |
| 5 <script src="resources/test-helpers.js"></script> | 5 <script src="resources/test-helpers.js"></script> |
| 6 <script> | 6 <script> |
| 7 // Temporary measure to diagnose timeouts on Win XP. Let the W3C harness | 7 // Temporary measure to diagnose timeouts on Win XP. Let the W3C harness |
| 8 // timeout before run-webkit-tests does, so it can report the particular | 8 // timeout before run-webkit-tests does, so it can report the particular |
| 9 // test that timed out. | 9 // test that timed out. |
| 10 // FIXME: Remove after the cause of timeout is fixed. | 10 // FIXME: Remove after the cause of timeout is fixed. |
| 11 var properties = {timeout: 5500}; | 11 var properties = {timeout: 5500}; |
| 12 | 12 |
| 13 // FIXME: Use the test-helpers.js version once it can handle workers that | 13 function runTest(test, scope, onRegister) { |
| 14 // don't install successfully. | 14 var script = 'resources/install-phase-event-waituntil.js'; |
| 15 function unregisterAndRegister(test, script, scope) { | 15 navigator.serviceWorker.getRegistration(scope) |
| 16 var empty_worker = 'resources/empty-worker.js'; | |
| 17 return navigator.serviceWorker.register(empty_worker, {scope: scope}) | |
| 18 .then(function(registration) { | 16 .then(function(registration) { |
| 19 return registration.unregister(); | 17 if (registration) |
| 18 return registration.unregister(); |
| 20 }) | 19 }) |
| 21 .then(function() { | 20 .then(function() { |
| 22 return navigator.serviceWorker.register(script, {scope: scope}); | 21 return navigator.serviceWorker.register(script, {scope: scope}); |
| 23 }) | 22 }) |
| 24 .catch(unreached_rejection(test)); | 23 .then(function(registration) { |
| 25 } | 24 return get_newest_worker(registration); |
| 26 | 25 }) |
| 27 function runTest(test, scope, onRegister) { | 26 .then(test.step_func(onRegister)); |
| 28 var script = 'resources/install-phase-event-waituntil.js'; | |
| 29 test.step(function() { | |
| 30 unregisterAndRegister(test, script, scope) | |
| 31 .then(function(registration) { | |
| 32 return wait_for_update(test, registration); | |
| 33 }) | |
| 34 .then(test.step_func(onRegister)); | |
| 35 }); | |
| 36 } | 27 } |
| 37 | 28 |
| 38 function syncWorker(test, worker, obj) { | 29 function syncWorker(test, worker, obj) { |
| 39 var channel = new MessageChannel(); | 30 var channel = new MessageChannel(); |
| 40 channel.port1.onmessage = test.step_func(function(e) { | 31 channel.port1.onmessage = test.step_func(function(e) { |
| 41 var message = e.data; | 32 var message = e.data; |
| 42 assert_equals(message, 'SYNC', | 33 assert_equals(message, 'SYNC', |
| 43 'Should receive sync message from worker.'); | 34 'Should receive sync message from worker.'); |
| 44 obj.synced = true; | 35 obj.synced = true; |
| 45 channel.port1.postMessage('ACK'); | 36 channel.port1.postMessage('ACK'); |
| 46 }); | 37 }); |
| 47 worker.postMessage({port: channel.port2}, [channel.port2]); | 38 worker.postMessage({port: channel.port2}, [channel.port2]); |
| 48 } | 39 } |
| 49 | 40 |
| 50 async_test(function(t) { | 41 async_test(function(t) { |
| 51 // Passing scope as the test switch for worker script. | 42 // Passing scope as the test switch for worker script. |
| 52 var scope = 'install-fulfilled'; | 43 var scope = 'install-fulfilled'; |
| 53 var onRegister = function(worker) { | 44 var onRegister = function(worker) { |
| 54 var obj = {}; | 45 var obj = {}; |
| 55 assert_equals(worker.state, | 46 wait_for_state(t, worker, 'installed') |
| 56 'installing', | 47 .then(function() { |
| 57 'Should be in the "installing" state upon updatefound'); | |
| 58 worker.onstatechange = t.step_func(function() { | |
| 59 if (worker.state == 'installed') { | |
| 60 assert_true( | 48 assert_true( |
| 61 obj.synced, | 49 obj.synced, |
| 62 'state should be "installed" after the waitUntil promise ' + | 50 'state should be "installed" after the waitUntil promise ' + |
| 63 'for "oninstall" is fulfilled.'); | 51 'for "oninstall" is fulfilled.'); |
| 64 service_worker_unregister_and_done(t, scope); | 52 service_worker_unregister_and_done(t, scope); |
| 65 } | 53 }) |
| 66 }); | 54 .catch(unreached_rejection(t)); |
| 67 syncWorker(t, worker, obj); | 55 syncWorker(t, worker, obj); |
| 68 }; | 56 }; |
| 69 runTest(t, scope, onRegister); | 57 runTest(t, scope, onRegister); |
| 70 }, 'Test install event waitUntil fulfilled', properties); | 58 }, 'Test install event waitUntil fulfilled', properties); |
| 71 | 59 |
| 72 async_test(function(t) { | 60 async_test(function(t) { |
| 73 var scope = 'activate-fulfilled'; | 61 var scope = 'activate-fulfilled'; |
| 74 var onRegister = function(worker) { | 62 var onRegister = function(worker) { |
| 75 var obj = {}; | 63 var obj = {}; |
| 76 worker.onstatechange = t.step_func(function() { | 64 wait_for_state(t, worker, 'activating') |
| 77 if (worker.state == 'activating') { | 65 .then(function() { |
| 78 syncWorker(t, worker, obj); | 66 syncWorker(t, worker, obj); |
| 79 } else if (worker.state == 'activated') { | 67 return wait_for_state(t, worker, 'activated'); |
| 68 }) |
| 69 .then(function() { |
| 80 assert_true( | 70 assert_true( |
| 81 obj.synced, | 71 obj.synced, |
| 82 'state should be "activated" after the waitUntil promise ' + | 72 'state should be "activated" after the waitUntil promise ' + |
| 83 'for "onactivate" is fulfilled.'); | 73 'for "onactivate" is fulfilled.'); |
| 84 service_worker_unregister_and_done(t, scope); | 74 service_worker_unregister_and_done(t, scope); |
| 85 } | 75 }) |
| 86 }); | 76 .catch(unreached_rejection(t)); |
| 87 }; | 77 }; |
| 88 runTest(t, scope, onRegister); | 78 runTest(t, scope, onRegister); |
| 89 }, 'Test activate event waitUntil fulfilled', properties); | 79 }, 'Test activate event waitUntil fulfilled', properties); |
| 90 | 80 |
| 91 async_test(function(t) { | 81 async_test(function(t) { |
| 92 var scope = 'install-rejected'; | 82 var scope = 'install-rejected'; |
| 93 var onRegister = function(worker) { | 83 var onRegister = function(worker) { |
| 94 worker.onstatechange = t.step_func(function() { | 84 wait_for_state(t, worker, 'redundant') |
| 95 if (worker.state == 'redundant') | 85 .then(function() { |
| 96 service_worker_unregister_and_done(t, scope); | 86 service_worker_unregister_and_done(t, scope); |
| 97 }); | 87 }) |
| 88 .catch(unreached_rejection(t)); |
| 98 }; | 89 }; |
| 99 runTest(t, scope, onRegister); | 90 runTest(t, scope, onRegister); |
| 100 }, 'Test install event waitUntil rejected', properties); | 91 }, 'Test install event waitUntil rejected', properties); |
| 101 | 92 |
| 102 async_test(function(t) { | 93 async_test(function(t) { |
| 103 var scope = 'activate-rejected'; | 94 var scope = 'activate-rejected'; |
| 104 var onRegister = function(worker) { | 95 var onRegister = function(worker) { |
| 105 worker.onstatechange = t.step_func(function() { | 96 wait_for_state(t, worker, 'redundant') |
| 106 if (worker.state == 'redundant') | 97 .then(function() { |
| 107 service_worker_unregister_and_done(t, scope); | 98 service_worker_unregister_and_done(t, scope); |
| 108 }); | 99 }) |
| 100 .catch(unreached_rejection(t)); |
| 109 }; | 101 }; |
| 110 runTest(t, scope, onRegister); | 102 runTest(t, scope, onRegister); |
| 111 }, 'Test activate event waitUntil rejected.', properties); | 103 }, 'Test activate event waitUntil rejected.', properties); |
| 112 | 104 |
| 113 async_test(function(t) { | 105 async_test(function(t) { |
| 114 var scope = 'activate-multiple-fulfilled'; | 106 var scope = 'activate-multiple-fulfilled'; |
| 115 var onRegister = function(worker) { | 107 var onRegister = function(worker) { |
| 116 var obj1 = {}; | 108 var obj1 = {}; |
| 117 var obj2 = {}; | 109 var obj2 = {}; |
| 118 worker.onstatechange = t.step_func(function() { | 110 wait_for_state(t, worker, 'activating') |
| 119 if (worker.state == 'activating') { | 111 .then(function() { |
| 120 syncWorker(t, worker, obj1); | 112 syncWorker(t, worker, obj1); |
| 121 syncWorker(t, worker, obj2); | 113 syncWorker(t, worker, obj2); |
| 122 } else if (worker.state == 'activated') { | 114 return wait_for_state(t, worker, 'activated'); |
| 115 }) |
| 116 .then(function() { |
| 123 assert_true( | 117 assert_true( |
| 124 obj1.synced && obj2.synced, | 118 obj1.synced && obj2.synced, |
| 125 'state should be "activated" after all waitUntil promises ' + | 119 'state should be "activated" after all waitUntil promises ' + |
| 126 'for "onactivate" are fulfilled.'); | 120 'for "onactivate" are fulfilled.'); |
| 127 service_worker_unregister_and_done(t, scope); | 121 service_worker_unregister_and_done(t, scope); |
| 128 } | 122 }) |
| 129 }); | 123 .catch(unreached_rejection(t)); |
| 130 }; | 124 }; |
| 131 runTest(t, scope, onRegister); | 125 runTest(t, scope, onRegister); |
| 132 }, 'Test InstallPhaseEvent multiple waitUntil fulfilled.', properties); | 126 }, 'Test InstallPhaseEvent multiple waitUntil fulfilled.', properties); |
| 133 | 127 |
| 134 async_test(function(t) { | 128 async_test(function(t) { |
| 135 var scope = 'activate-reject-precedence'; | 129 var scope = 'activate-reject-precedence'; |
| 136 var onRegister = function(worker) { | 130 var onRegister = function(worker) { |
| 137 worker.onstatechange = t.step_func(function() { | 131 wait_for_state(t, worker, 'redundant') |
| 138 if (worker.state == 'redundant') | 132 .then(function() { |
| 139 service_worker_unregister_and_done(t, scope); | 133 service_worker_unregister_and_done(t, scope); |
| 140 }); | 134 }) |
| 135 .catch(unreached_rejection(t)); |
| 141 }; | 136 }; |
| 142 runTest(t, scope, onRegister); | 137 runTest(t, scope, onRegister); |
| 143 }, 'Test InstallPhaseEvent waitUntil reject precedence.', properties); | 138 }, 'Test InstallPhaseEvent waitUntil reject precedence.', properties); |
| 144 </script> | 139 </script> |
| OLD | NEW |