test_fetch.html (5019B)
1 <!DOCTYPE HTML> 2 <html> 3 <head> 4 <title>Service worker performance test: fetch</title> 5 </head> 6 <script src="/tests/SimpleTest/SimpleTest.js"></script> 7 <script src="../utils.js"></script> 8 <script src="perfutils.js"></script> 9 <script> 10 11 "use strict"; 12 13 const COLD_FETCH = "Cold fetch"; 14 const UNDISTURBED_FETCH = "Undisturbed fetch"; 15 const INTERCEPTED_FETCH = "Intercepted fetch"; 16 const LIBERATED_FETCH = "Liberated fetch"; 17 const UNDISTURBED_XHR = "Undisturbed XHR"; 18 const INTERCEPTED_XHR = "Intercepted XHR"; 19 const LIBERATED_XHR = "Liberated XHR"; 20 21 var journal = {}; 22 journal[COLD_FETCH] = []; 23 journal[UNDISTURBED_FETCH] = []; 24 journal[INTERCEPTED_FETCH] = []; 25 journal[LIBERATED_FETCH] = []; 26 journal[UNDISTURBED_XHR] = []; 27 journal[INTERCEPTED_XHR] = []; 28 journal[LIBERATED_XHR] = []; 29 30 const ITERATIONS = 10; 31 32 var perfMetadata = { 33 owner: "DOM LWS", 34 name: "Service Worker Fetch", 35 description: "Test cold and warm fetches.", 36 options: { 37 default: { 38 perfherder: true, 39 perfherder_metrics: [ 40 // Here, we can't use the constants defined above because perfherder 41 // grabs data from the parse tree. 42 { name: "Cold fetch", unit: "ms", shouldAlert: true }, 43 { name: "Undisturbed fetch", unit: "ms", shouldAlert: true }, 44 { name: "Intercepted fetch", unit: "ms", shouldAlert: true }, 45 { name: "Liberated fetch", unit: "ms", shouldAlert: true }, 46 { name: "Undisturbed XHR", unit: "ms", shouldAlert: true }, 47 { name: "Intercepted XHR", unit: "ms", shouldAlert: true }, 48 { name: "Liberated XHR", unit: "ms", shouldAlert: true }, 49 ], 50 verbose: true, 51 manifest: "perftest.toml", 52 manifest_flavor: "plain", 53 }, 54 }, 55 }; 56 57 function create_iframe(url) { 58 return new Promise(function(res) { 59 let iframe = document.createElement("iframe"); 60 iframe.src = url; 61 iframe.onload = function() { res(iframe) } 62 document.body.appendChild(iframe); 63 }); 64 } 65 66 add_task(async () => { 67 await SpecialPowers.pushPrefEnv({ 68 set: [["dom.serviceWorkers.testing.enabled", true]] 69 }); 70 }); 71 72 /** 73 * Time fetch from a fresh service worker. 74 */ 75 add_task(async () => { 76 for (let i = 0; i < ITERATIONS; i++) { 77 let reg = await navigator.serviceWorker.register("sw_intercept_target.js"); 78 await waitForState(reg.installing, "activated"); 79 80 let iframe = await create_iframe("time_fetch.html"); 81 82 let result = await iframe.contentWindow.time_fetch("target.txt"); 83 is(result.status, 200); 84 is(result.data, "intercepted\n"); 85 journal[COLD_FETCH].push(result.elapsed_ms); 86 87 ok(document.body.removeChild(iframe), "Failed to remove child iframe"); 88 89 await reg.unregister(); 90 } 91 }); 92 93 /** 94 * Time unintercepted fetch, intercepted fetch, then unintercepted 95 * fetch again. 96 */ 97 add_task(async () => { 98 let reg = await navigator.serviceWorker.register("sw_intercept_target.js"); 99 await waitForState(reg.installing, "activated"); 100 101 async function measure(journal, sw_enabled) { 102 await SpecialPowers.pushPrefEnv({ 103 set: [["dom.serviceWorkers.enabled", sw_enabled]] 104 }); 105 106 let iframe = await create_iframe("time_fetch.html"); 107 108 for (let i = 0; i < ITERATIONS; i++) { 109 let result = await iframe.contentWindow.time_fetch("target.txt"); 110 is(result.status, 200); 111 is(result.data, sw_enabled ? "intercepted\n" : "target\n"); 112 journal.push(result.elapsed_ms); 113 } 114 115 ok(document.body.removeChild(iframe), "Failed to remove child iframe"); 116 117 await SpecialPowers.popPrefEnv(); 118 } 119 120 await measure(journal[UNDISTURBED_FETCH], false); 121 await measure(journal[INTERCEPTED_FETCH], true); 122 await measure(journal[LIBERATED_FETCH], false); 123 124 await reg.unregister(); 125 }); 126 127 /** 128 * Time unintercepted XHR, intercepted XHR, then unintercepted 129 * XHR again. 130 */ 131 add_task(async () => { 132 let reg = await navigator.serviceWorker.register("sw_intercept_target.js"); 133 await waitForState(reg.installing, "activated"); 134 135 async function measure(journal, sw_enabled) { 136 await SpecialPowers.pushPrefEnv({ 137 set: [["dom.serviceWorkers.enabled", sw_enabled]] 138 }); 139 140 let iframe = await create_iframe("time_fetch.html"); 141 142 for (let i = 0; i < ITERATIONS; i++) { 143 let result = await iframe.contentWindow.time_xhr("target.txt"); 144 is(result.status, 200); 145 is(result.data, sw_enabled ? "intercepted\n" : "target\n"); 146 journal.push(result.elapsed_ms); 147 } 148 149 ok(document.body.removeChild(iframe), "Failed to remove child iframe"); 150 151 await SpecialPowers.popPrefEnv(); 152 } 153 154 await measure(journal[UNDISTURBED_XHR], false); 155 await measure(journal[INTERCEPTED_XHR], true); 156 await measure(journal[LIBERATED_XHR], false); 157 158 await reg.unregister(); 159 }); 160 161 add_task(() => { 162 reportMetrics(journal); 163 }); 164 165 </script> 166 <body> 167 </body> 168 </html>