request-keepalive-quota.html (10386B)
1 <!doctype html> 2 <html> 3 4 <head> 5 <meta charset="utf-8"> 6 <title>Request Keepalive Quota Per Origin Tests</title> 7 <meta name="timeout" content="long"> 8 <meta name="author" title="Sunil Mayya" href="mailto:smayya@mozilla.com"> 9 <meta name="variant" content="?include=keepalive-request-limit-per-origin-1"> 10 <meta name="variant" content="?include=keepalive-request-limit-per-origin-2"> 11 <meta name="variant" content="?include=keepalive-request-different-origins-1"> 12 <meta name=" variant" content="?include=keepalive-request-different-origins-2"> 13 <script src="/common/get-host-info.sub.js"></script> 14 <script src="/resources/testharness.js"></script> 15 <script src="/resources/testharnessreport.js"></script> 16 <script src="/common/subset-tests-by-key.js"></script> 17 <script src="/fetch/api/resources/keepalive-helper.js"></script> 18 <script> 19 // These tests verify resource limits specific to firefox 20 // We verify the following: 21 // 1. Blocking New Keep-Alive Requests (keepalive-request-limit-per-origin-1): 22 // Firefox should block sending new keep-alive requests if the pending keep-alive request 23 // quota per origin is reached. 24 // 2. Releasing Quota (keepalive-request-limit-per-origin-2): 25 // Firefox should be able to send new keep-alive requests once the quota per origin 26 // becomes available (i.e., all pending keep-alive requests are resolved). 27 // 3. Different Origin Requests (keepalive-request-different-origins-1): 28 // If the keep-alive quota of one origin is full, Firefox should allow new keep-alive 29 // requests from a different origin. 30 // 4. Total Requests Per Browser Instance (keepalive-request-different-origins-2): 31 // Verify that the total number of keep-alive requests per browser instance is limited 32 // by sending keep-alive requests from different origins. 33 34 35 36 // The remote origin URL is used to create keep-alive requests from a different origin. 37 // keepalive-requests.html'creates 5 keepalive pending requests from a remote origin. 38 const trickleRemoteURL = get_host_info().HTTPS_REMOTE_ORIGIN + '/_mozilla/fetch/api/request/resources/keepalive-requests.html'; 39 40 const noDelay = 0; 41 const standardDelay = 1000; 42 43 // Starts a request from a different origin, a new tab is opened and 44 // we load the page hosted on a different origin than request-keepalive-quota.html. 45 function fetchKeepAliveRequestRemoteUrl(url) { 46 return new Promise((resolve, reject) => { 47 try { 48 var w = window.open(url, '_blank'); 49 if (!w) { 50 reject(new Error('Failed to open the new window')); 51 } 52 window.addEventListener('message', function listener() { 53 if (event.data === "REQUEST SENT") { 54 // we have successfully created 5 keepalive requests in the new tab 55 window.removeEventListener('message', listener); 56 resolve(); 57 } else if (event.data === "FAIL") { 58 window.removeEventListener('message', listener); 59 reject(new Error('Fetch request failed')); 60 } 61 }); 62 } catch (error) { 63 reject(error); 64 } 65 }); 66 } 67 </script> 68 </head> 69 70 <body> 71 <script> 72 'use strict'; 73 74 // Ensure we restrict the number of pending requests per origin. 75 subsetTestByKey("keepalive-request-limit-per-origin-1", promise_test, function (test) { 76 SpecialPowers.setIntPref("dom.fetchKeepalive.request_limit_per_origin", 4); 77 const first = createPendingKeepAliveRequest(standardDelay * 2); 78 const second = createPendingKeepAliveRequest(standardDelay * 2); 79 const third = createPendingKeepAliveRequest(standardDelay * 2); 80 const fourth = createPendingKeepAliveRequest(standardDelay * 2); 81 const fifth = createPendingKeepAliveRequest(noDelay).then( 82 () => { 83 return Promise.reject("A Keepalive fetch() should be rejected when per origin pending requests exceed the limit."); 84 }, 85 () => { 86 return Promise.resolve(); 87 }); 88 return Promise.all([first, second, third, fourth, fifth]); 89 }, 'Restrict the number of pending requests per origin to dom.fetchKeepalive.request_limit_per_origin'); 90 91 // Ensure keepalive requests per origin quota becomes available after pending requests are completed. 92 subsetTestByKey("keepalive-request-limit-per-origin-2", promise_test, function (test) { 93 SpecialPowers.setIntPref("dom.fetchKeepalive.request_limit_per_origin", 2); 94 const first = createPendingKeepAliveRequest(standardDelay * 2); 95 const second = createPendingKeepAliveRequest(standardDelay * 2).then(() => { 96 // ensure that we can send another Keep-Alive fetch after pending requests are completed. 97 return createPendingKeepAliveRequest(noDelay); 98 }); 99 100 const third = createPendingKeepAliveRequest(noDelay).then(() => { 101 return Promise.reject("A Keep-Alive fetch() request exceeding per origin limit should reject."); 102 }, () => { 103 return Promise.resolve(); 104 }); 105 106 return Promise.all([first, second, third]); 107 }, 'A Keep-Alive fetch() per origin quota should become available after pending requests are completed.'); 108 109 // Ensure keepalive limits of different origins do not affect each other. 110 subsetTestByKey("keepalive-request-different-origins-1", promise_test, function (test) { 111 SpecialPowers.setIntPref("dom.fetchKeepalive.request_limit_per_origin", 5); 112 SpecialPowers.setIntPref("dom.fetchKeepalive.total_request_limit", 7); 113 114 // fetchKeepAliveRequestRemoteUrl creates 5 pending keepalive requests from a remote origin 115 const first = fetchKeepAliveRequestRemoteUrl(trickleRemoteURL).then(() => { 116 // ensure that when remote origin has reached full quota, 117 // we are still able to send keepalive requests from the current window. 118 const second = createPendingKeepAliveRequest(standardDelay); 119 const third = createPendingKeepAliveRequest(noDelay).then(() => { 120 return new Promise((resolve, reject) => { 121 try { 122 // By now we have 5 pending requests from the remote origin. 123 // Add event listener to ensure these pending requests are completed 124 window.addEventListener('message', function listener() { 125 // remote origin has successfully completed keepalive requests 126 if (event.data === "REQUEST COMPLETED") { 127 resolve(); 128 window.removeEventListener('message', listener); 129 } else if (event.data === "FAIL") { 130 reject(new Error('Fetch request failed')); 131 window.removeEventListener('message', listener); 132 } 133 }); 134 } catch (error) { 135 send 136 reject(error); 137 } 138 }); 139 }); 140 return Promise.all([second, third]); 141 }).catch((error) => { 142 return Promise.reject(error); 143 }); 144 145 return first; 146 }, 'keepalive limits of different origins should not affect each other'); 147 148 // Ensure that total keepalive request limits are respected 149 subsetTestByKey("keepalive-request-different-origins-2", promise_test, function (test) { 150 SpecialPowers.setIntPref("dom.fetchKeepalive.request_limit_per_origin", 5); 151 SpecialPowers.setIntPref("dom.fetchKeepalive.total_request_limit", 6); 152 // creates 5 pending keepalive requests for a different origin 153 const first = fetchKeepAliveRequestRemoteUrl(trickleRemoteURL).then(() => { 154 // ensure that when remote origin has reached full quota, 155 // we are still able to send exactly 1 keepalive request for the current origin. 156 const second = createPendingKeepAliveRequest(standardDelay); 157 const third = createPendingKeepAliveRequest(noDelay).then( 158 () => { 159 return Promise.reject("A Keep-Alive fetch() request exceeding total limit should be rejected."); 160 }, 161 () => { 162 return new Promise((resolve, reject) => { 163 try { 164 window.addEventListener('message', function listener() { 165 // remote origin has successfully completed keepalive requests 166 if (event.data === "REQUEST COMPLETED") { 167 resolve(); 168 window.removeEventListener('message', listener); 169 } else if (event.data === "FAIL") { 170 reject(new Error('Fetch request failed')); 171 window.removeEventListener('message', listener); 172 } 173 }); 174 } catch (error) { 175 reject(error); 176 } 177 }); 178 }); 179 180 return Promise.all([second, third]); 181 }).catch((error) => { 182 return Promise.reject(error); 183 }); 184 185 return first; 186 }, 'total keepalive request limits should be respected'); 187 188 189 </script> 190 </body> 191 192 </html>