tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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>