| <!DOCTYPE html> | |
| <meta charset="utf-8"> | |
| <title>Tests Stale While Revalidate works for scripts</title> | |
| <script src="/resources/testharness.js"></script> | |
| <script src="/resources/testharnessreport.js"></script> | |
| <script src="/common/utils.js"></script> | |
| <body> | |
| <script> | |
| const request_token = token(); | |
| const script_src = "./resources/stale-script.py?token=" + request_token; | |
| // The script above will call report() via a uniquely generated ID on the | |
| // subresource. If it is a cache hit, the ID will be the same and | |
| // |last_modified_count| won't be incremented. | |
| let last_modified; | |
| let last_modified_count = 0; | |
| function report(mod) { | |
| if (last_modified == mod) | |
| return; | |
| last_modified = mod; | |
| last_modified_count++; | |
| } | |
| let loadScript = async () => { | |
| let script = document.createElement("script"); | |
| let script_loaded = new Promise(r => script.onload = r); | |
| script.src = script_src; | |
| document.body.appendChild(script); | |
| await script_loaded; | |
| }; | |
| promise_test(async t => { | |
| await new Promise(r => window.onload = r); | |
| await loadScript(); | |
| assert_equals(last_modified_count, 1, '(initial version loaded)'); | |
| await loadScript(); | |
| assert_equals(last_modified_count, 1, '(stale version loaded)'); | |
| // Query the server again and again. At some point it must have received the | |
| // revalidation request. We poll, because we don't know when the revalidation | |
| // will occur. | |
| while(true) { | |
| await new Promise(r => step_timeout(r, 25)); | |
| let response = await fetch(script_src + "&query"); | |
| let count = response.headers.get("Count"); | |
| if (count == '2') | |
| break; | |
| } | |
| await loadScript(); | |
| assert_equals(last_modified_count, 2, '(revalidated version loaded)'); | |
| }, 'Cache returns stale resource'); | |
| </script> | |
| </body> |