update-import-scripts.https.html (5694B)
1 <!DOCTYPE html> 2 <meta charset="utf-8"> 3 <title>Tests for importScripts: import scripts ignored error</title> 4 <script src="/common/utils.js"></script> 5 <script src="/resources/testharness.js"></script> 6 <script src="/resources/testharnessreport.js"></script> 7 <script src="resources/test-helpers.sub.js"></script> 8 <body> 9 <script> 10 // This file contains tests to check if imported scripts appropriately updated. 11 12 const SCOPE = 'resources/simple.txt'; 13 14 // Create a service worker (update-worker-from-file.py), which is initially 15 // |initial_worker| and |updated_worker| later. 16 async function prepare_ready_update_worker_from_file( 17 t, initial_worker, updated_worker) { 18 const key = token(); 19 const worker_url = `resources/update-worker-from-file.py?` + 20 `First=${initial_worker}&Second=${updated_worker}&Key=${key}`; 21 const expected_url = normalizeURL(worker_url); 22 23 const registration = await service_worker_unregister_and_register( 24 t, worker_url, SCOPE); 25 await wait_for_state(t, registration.installing, 'activated'); 26 assert_equals(registration.installing, null, 27 'prepare_ready: installing'); 28 assert_equals(registration.waiting, null, 29 'prepare_ready: waiting'); 30 assert_equals(registration.active.scriptURL, expected_url, 31 'prepare_ready: active'); 32 return [registration, expected_url]; 33 } 34 35 // Create a service worker using the script under resources/. 36 async function prepare_ready_normal_worker(t, filename, additional_params='') { 37 const key = token(); 38 const worker_url = `resources/${filename}?Key=${key}&${additional_params}`; 39 const expected_url = normalizeURL(worker_url); 40 41 const registration = await service_worker_unregister_and_register( 42 t, worker_url, SCOPE); 43 await wait_for_state(t, registration.installing, 'activated'); 44 assert_equals(registration.installing, null, 45 'prepare_ready: installing'); 46 assert_equals(registration.waiting, null, 47 'prepare_ready: waiting'); 48 assert_equals(registration.active.scriptURL, expected_url, 49 'prepare_ready: active'); 50 return [registration, expected_url]; 51 } 52 53 function assert_installing_and_active(registration, expected_url) { 54 assert_equals(registration.installing.scriptURL, expected_url, 55 'assert_installing_and_active: installing'); 56 assert_equals(registration.waiting, null, 57 'assert_installing_and_active: waiting'); 58 assert_equals(registration.active.scriptURL, expected_url, 59 'assert_installing_and_active: active'); 60 } 61 62 function assert_waiting_and_active(registration, expected_url) { 63 assert_equals(registration.installing, null, 64 'assert_waiting_and_active: installing'); 65 assert_equals(registration.waiting.scriptURL, expected_url, 66 'assert_waiting_and_active: waiting'); 67 assert_equals(registration.active.scriptURL, expected_url, 68 'assert_waiting_and_active: active'); 69 } 70 71 function assert_active_only(registration, expected_url) { 72 assert_equals(registration.installing, null, 73 'assert_active_only: installing'); 74 assert_equals(registration.waiting, null, 75 'assert_active_only: waiting'); 76 assert_equals(registration.active.scriptURL, expected_url, 77 'assert_active_only: active'); 78 } 79 80 promise_test(async t => { 81 const [registration, expected_url] = 82 await prepare_ready_update_worker_from_file( 83 t, 'empty.js', 'import-scripts-404.js'); 84 t.add_cleanup(() => registration.unregister()); 85 86 await promise_rejects_js(t, TypeError, registration.update()); 87 assert_active_only(registration, expected_url); 88 }, 'update() should fail when a new worker imports an unavailable script.'); 89 90 promise_test(async t => { 91 const [registration, expected_url] = 92 await prepare_ready_update_worker_from_file( 93 t, 'import-scripts-404-after-update.js', 'empty.js'); 94 t.add_cleanup(() => registration.unregister()); 95 96 await Promise.all([registration.update(), wait_for_update(t, registration)]); 97 assert_installing_and_active(registration, expected_url); 98 99 await wait_for_state(t, registration.installing, 'installed'); 100 assert_waiting_and_active(registration, expected_url); 101 102 await wait_for_state(t, registration.waiting, 'activated'); 103 assert_active_only(registration, expected_url); 104 }, 'update() should succeed when the old imported script no longer exist but ' + 105 "the new worker doesn't import it."); 106 107 promise_test(async t => { 108 const [registration, expected_url] = await prepare_ready_normal_worker( 109 t, 'import-scripts-404-after-update.js'); 110 t.add_cleanup(() => registration.unregister()); 111 112 await registration.update(); 113 assert_active_only(registration, expected_url); 114 }, 'update() should treat 404 on imported scripts as no change.'); 115 116 promise_test(async t => { 117 const [registration, expected_url] = await prepare_ready_normal_worker( 118 t, 'import-scripts-404-after-update-plus-update-worker.js', 119 `AdditionalKey=${token()}`); 120 t.add_cleanup(() => registration.unregister()); 121 122 await promise_rejects_js(t, TypeError, registration.update()); 123 assert_active_only(registration, expected_url); 124 }, 'update() should find an update in an imported script but update() should ' + 125 'result in failure due to missing the other imported script.'); 126 127 promise_test(async t => { 128 const [registration, expected_url] = await prepare_ready_normal_worker( 129 t, 'import-scripts-cross-origin-worker.sub.js'); 130 t.add_cleanup(() => registration.unregister()); 131 await registration.update(); 132 assert_installing_and_active(registration, expected_url); 133 }, 'update() should work with cross-origin importScripts.'); 134 </script> 135 </body>