tor-browser

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

fetch-request-resources.https.html (14682B)


      1 <!DOCTYPE html>
      2 <title>Service Worker: FetchEvent for resources</title>
      3 <script src="/resources/testharness.js"></script>
      4 <script src="/resources/testharnessreport.js"></script>
      5 <script src="/common/get-host-info.sub.js"></script>
      6 <script src="resources/test-helpers.sub.js"></script>
      7 <script>
      8 let url_count = 0;
      9 const expected_results = {};
     10 
     11 function add_promise_to_test(url)
     12 {
     13  const expected = expected_results[url];
     14  return new Promise((resolve) => {
     15    expected.resolve = resolve;
     16  });
     17 }
     18 
     19 function image_test(frame, url, cross_origin, expected_mode,
     20                    expected_credentials) {
     21  const actual_url = url + (++url_count);
     22  expected_results[actual_url] = {
     23      cross_origin: cross_origin,
     24      mode: expected_mode,
     25      credentials: expected_credentials,
     26      redirect: 'follow',
     27      integrity: '',
     28      destination: 'image',
     29      message: `Image load (url:${actual_url} cross_origin:${cross_origin})`
     30    };
     31  frame.contentWindow.load_image(actual_url, cross_origin);
     32  return add_promise_to_test(actual_url);
     33 }
     34 
     35 function script_test(frame, url, cross_origin, expected_mode,
     36                     expected_credentials) {
     37  const actual_url = url + (++url_count);
     38  expected_results[actual_url] = {
     39      cross_origin: cross_origin,
     40      mode: expected_mode,
     41      credentials: expected_credentials,
     42      redirect: 'follow',
     43      integrity: '',
     44      destination: 'script',
     45      message: `Script load (url:${actual_url} cross_origin:${cross_origin})`
     46    };
     47  frame.contentWindow.load_script(actual_url, cross_origin);
     48  return add_promise_to_test(actual_url);
     49 }
     50 
     51 function css_test(frame, url, cross_origin, expected_mode,
     52                  expected_credentials) {
     53  const actual_url = url + (++url_count);
     54  expected_results[actual_url] = {
     55      cross_origin: cross_origin,
     56      mode: expected_mode,
     57      credentials: expected_credentials,
     58      redirect: 'follow',
     59      integrity: '',
     60      destination: 'style',
     61      message: `CSS load (url:${actual_url} cross_origin:${cross_origin})`
     62    };
     63  frame.contentWindow.load_css(actual_url, cross_origin);
     64  return add_promise_to_test(actual_url);
     65 }
     66 
     67 function font_face_test(frame, url, expected_mode, expected_credentials) {
     68  const actual_url = url + (++url_count);
     69  expected_results[actual_url] = {
     70      url: actual_url,
     71      mode: expected_mode,
     72      credentials: expected_credentials,
     73      redirect: 'follow',
     74      integrity: '',
     75      destination: 'font',
     76      message: `FontFace load (url: ${actual_url})`
     77    };
     78  frame.contentWindow.load_font(actual_url);
     79  return add_promise_to_test(actual_url);
     80 }
     81 
     82 function script_integrity_test(frame, url, integrity, expected_integrity) {
     83  const actual_url = url + (++url_count);
     84  expected_results[actual_url] = {
     85      url: actual_url,
     86      mode: 'no-cors',
     87      credentials: 'include',
     88      redirect: 'follow',
     89      integrity: expected_integrity,
     90      destination: 'script',
     91      message: `Script load (url:${actual_url})`
     92    };
     93  frame.contentWindow.load_script_with_integrity(actual_url, integrity, /*type=*/null);
     94  return add_promise_to_test(actual_url);
     95 }
     96 
     97 function module_script_integrity_test(frame, url, integrity, expected_integrity) {
     98  const actual_url = url + "_module";
     99  expected_results[actual_url] = {
    100      url: actual_url,
    101      mode: 'cors',
    102      credentials: 'same-origin',
    103      redirect: 'follow',
    104      integrity: expected_integrity,
    105      destination: 'script',
    106      message: `Module Script load (url:${actual_url})`
    107    };
    108  frame.contentWindow.load_script_with_integrity(actual_url, integrity, "module");
    109  return add_promise_to_test(actual_url);
    110 }
    111 
    112 function modulepreload_integrity_test(frame, url, integrity, expected_integrity) {
    113  const actual_url = url + "_modulepreload";
    114  expected_results[actual_url] = {
    115      url: actual_url,
    116      mode: 'cors',
    117      credentials: 'same-origin',
    118      redirect: 'follow',
    119      integrity: expected_integrity,
    120      destination: 'script',
    121      message: `Module Script load (url:${actual_url})`
    122    };
    123  frame.contentWindow.load_modulepreload_with_integrity(actual_url, integrity);
    124  return add_promise_to_test(actual_url);
    125 }
    126 
    127 function import_module_integrity_test(frame, url, expected_integrity) {
    128  const actual_url = url + "_moduleimport";
    129  expected_results[actual_url] = {
    130      url: actual_url,
    131      mode: 'cors',
    132      credentials: 'same-origin',
    133      redirect: 'follow',
    134      integrity: expected_integrity,
    135      destination: 'script',
    136      message: `Module Script load (url:${actual_url})`
    137    };
    138  frame.contentWindow.import_modulescript(actual_url);
    139  return add_promise_to_test(actual_url);
    140 }
    141 
    142 function import_dynamic_module_integrity_test(frame, url, expected_integrity) {
    143  const actual_url = url + "_moduleimportdynamic";
    144  expected_results[actual_url] = {
    145      url: actual_url,
    146      mode: 'cors',
    147      credentials: 'same-origin',
    148      redirect: 'follow',
    149      integrity: expected_integrity,
    150      destination: 'script',
    151      message: `Module Script load (url:${actual_url})`
    152    };
    153  frame.contentWindow.import_dynamic_modulescript(actual_url);
    154  return add_promise_to_test(actual_url);
    155 }
    156 
    157 function css_integrity_test(frame, url, integrity, expected_integrity) {
    158  const actual_url = url + (++url_count);
    159  expected_results[actual_url] = {
    160      url: actual_url,
    161      mode: 'no-cors',
    162      credentials: 'include',
    163      redirect: 'follow',
    164      integrity: expected_integrity,
    165      destination: 'style',
    166      message: `CSS load (url:${actual_url})`
    167    };
    168  frame.contentWindow.load_css_with_integrity(actual_url, integrity);
    169  return add_promise_to_test(actual_url);
    170 }
    171 
    172 function fetch_test(frame, url, mode, credentials,
    173                    expected_mode, expected_credentials) {
    174  const actual_url = url + (++url_count);
    175  expected_results[actual_url] = {
    176      mode: expected_mode,
    177      credentials: expected_credentials,
    178      redirect: 'follow',
    179      integrity: '',
    180      destination: '',
    181      message: `fetch (url:${actual_url} mode:${mode} ` +
    182               `credentials:${credentials})`
    183    };
    184  frame.contentWindow.fetch(
    185      new Request(actual_url, {mode: mode, credentials: credentials}));
    186  return add_promise_to_test(actual_url);
    187 }
    188 
    189 function audio_test(frame, url, cross_origin,
    190                    expected_mode, expected_credentials) {
    191  const actual_url = url + (++url_count);
    192  expected_results[actual_url] = {
    193      mode: expected_mode,
    194      credentials: expected_credentials,
    195      redirect: 'follow',
    196      integrity: '',
    197      destination: 'audio',
    198      message: `Audio load (url:${actual_url} cross_origin:${cross_origin})`
    199    };
    200  frame.contentWindow.load_audio(actual_url, cross_origin);
    201  return add_promise_to_test(actual_url);
    202 }
    203 
    204 
    205 function video_test(frame, url, cross_origin,
    206                    expected_mode, expected_credentials) {
    207  const actual_url = url + (++url_count);
    208  expected_results[actual_url] = {
    209      mode: expected_mode,
    210      credentials: expected_credentials,
    211      redirect: 'follow',
    212      integrity: '',
    213      destination: 'video',
    214      message: `Video load (url:${actual_url} cross_origin:${cross_origin})`
    215    };
    216  frame.contentWindow.load_video(actual_url, cross_origin);
    217  return add_promise_to_test(actual_url);
    218 }
    219 
    220 promise_test(async t => {
    221  const SCOPE = 'resources/fetch-request-resources-iframe.https.html';
    222  const SCRIPT = 'resources/fetch-request-resources-worker.js';
    223  const host_info = get_host_info();
    224  const LOCAL_URL =
    225      host_info['HTTPS_ORIGIN'] + base_path() + 'resources/sample?test';
    226  const REMOTE_URL =
    227      host_info['HTTPS_REMOTE_ORIGIN'] + base_path() + 'resources/sample?test';
    228 
    229  const registration =
    230      await service_worker_unregister_and_register(t, SCRIPT, SCOPE);
    231  t.add_cleanup(() => registration.unregister());
    232  const worker = registration.installing;
    233  await wait_for_state(t, worker, 'activated');
    234 
    235  await new Promise((resolve, reject) => {
    236    const channel = new MessageChannel();
    237    channel.port1.onmessage = t.step_func(msg => {
    238      if (msg.data.ready) {
    239        resolve();
    240        return;
    241      }
    242      const result = msg.data;
    243      const expected = expected_results[result.url];
    244      if (!expected) {
    245        return;
    246      }
    247      test(() => {
    248        assert_equals(
    249            result.mode, expected.mode,
    250            `mode of must be ${expected.mode}.`);
    251        assert_equals(
    252            result.credentials, expected.credentials,
    253            `credentials of ${expected.message} must be ` +
    254            `${expected.credentials}.`);
    255        assert_equals(
    256            result.redirect, expected.redirect,
    257            `redirect mode of ${expected.message} must be ` +
    258            `${expected.redirect}.`);
    259        assert_equals(
    260            result.integrity, expected.integrity,
    261            `integrity of ${expected.message} must be ` +
    262            `${expected.integrity}.`);
    263        assert_equals(
    264            result.destination, expected.destination,
    265            `destination of ${expected.message} must be ` +
    266            `${expected.destination}.`);
    267      }, expected.message);
    268      expected.resolve();
    269      delete expected_results[result.url];
    270    });
    271    worker.postMessage({port: channel.port2}, [channel.port2]);
    272  });
    273 
    274  const f = await with_iframe(SCOPE);
    275  t.add_cleanup(() => f.remove());
    276 
    277  await image_test(f, LOCAL_URL, '', 'no-cors', 'include');
    278  await image_test(f, REMOTE_URL, '', 'no-cors', 'include');
    279  await css_test(f, LOCAL_URL, '', 'no-cors', 'include');
    280  await css_test(f, REMOTE_URL, '', 'no-cors', 'include');
    281 
    282  await image_test(f, LOCAL_URL, 'anonymous', 'cors', 'same-origin');
    283  await image_test(f, LOCAL_URL, 'use-credentials', 'cors', 'include');
    284  await image_test(f, REMOTE_URL, '', 'no-cors', 'include');
    285  await image_test(f, REMOTE_URL, 'anonymous', 'cors', 'same-origin');
    286  await image_test(f, REMOTE_URL, 'use-credentials', 'cors', 'include');
    287 
    288  await script_test(f, LOCAL_URL, '', 'no-cors', 'include');
    289  await script_test(f, LOCAL_URL, 'anonymous', 'cors', 'same-origin');
    290  await script_test(f, LOCAL_URL, 'use-credentials', 'cors', 'include');
    291  await script_test(f, REMOTE_URL, '', 'no-cors', 'include');
    292  await script_test(f, REMOTE_URL, 'anonymous', 'cors', 'same-origin');
    293  await script_test(f, REMOTE_URL, 'use-credentials', 'cors', 'include');
    294 
    295  await css_test(f, LOCAL_URL, '', 'no-cors', 'include');
    296  await css_test(f, LOCAL_URL, 'anonymous', 'cors', 'same-origin');
    297  await css_test(f, LOCAL_URL, 'use-credentials', 'cors', 'include');
    298  await css_test(f, REMOTE_URL, '', 'no-cors', 'include');
    299  await css_test(f, REMOTE_URL, 'anonymous', 'cors', 'same-origin');
    300  await css_test(f, REMOTE_URL, 'use-credentials', 'cors', 'include');
    301 
    302  await font_face_test(f, LOCAL_URL, 'cors', 'same-origin');
    303  await font_face_test(f, REMOTE_URL, 'cors', 'same-origin');
    304 
    305  await script_integrity_test(f, LOCAL_URL, '     ', '     ');
    306  await script_integrity_test(
    307      f, LOCAL_URL,
    308      'This is not a valid integrity because it has no dashes',
    309      'This is not a valid integrity because it has no dashes');
    310  await script_integrity_test(f, LOCAL_URL, 'sha256-', 'sha256-');
    311  await script_integrity_test(f, LOCAL_URL, 'sha256-foo?123', 'sha256-foo?123');
    312  await script_integrity_test(f, LOCAL_URL, 'sha256-foo sha384-abc ',
    313                              'sha256-foo sha384-abc ');
    314  await script_integrity_test(f, LOCAL_URL, 'sha256-foo sha256-abc',
    315                              'sha256-foo sha256-abc');
    316  await module_script_integrity_test(f, LOCAL_URL,
    317                                     null,
    318                                     'sha384-foobar');
    319 
    320  await modulepreload_integrity_test(f, LOCAL_URL,
    321                                     null,
    322                                     'sha384-foobar');
    323 
    324  await import_module_integrity_test(f, LOCAL_URL,
    325                                     'sha384-foobar');
    326 
    327  await import_dynamic_module_integrity_test(f, LOCAL_URL,
    328                                     'sha384-foobar');
    329 
    330  await css_integrity_test(f, LOCAL_URL, '     ', '     ');
    331  await css_integrity_test(
    332      f, LOCAL_URL,
    333      'This is not a valid integrity because it has no dashes',
    334      'This is not a valid integrity because it has no dashes');
    335  await css_integrity_test(f, LOCAL_URL, 'sha256-', 'sha256-');
    336  await css_integrity_test(f, LOCAL_URL, 'sha256-foo?123', 'sha256-foo?123');
    337  await css_integrity_test(f, LOCAL_URL, 'sha256-foo sha384-abc ',
    338                           'sha256-foo sha384-abc ');
    339  await css_integrity_test(f, LOCAL_URL, 'sha256-foo sha256-abc',
    340                           'sha256-foo sha256-abc');
    341 
    342  await fetch_test(f, LOCAL_URL, 'same-origin', 'omit', 'same-origin', 'omit');
    343  await fetch_test(f, LOCAL_URL, 'same-origin', 'same-origin',
    344                   'same-origin', 'same-origin');
    345  await fetch_test(f, LOCAL_URL, 'same-origin', 'include',
    346                   'same-origin', 'include');
    347  await fetch_test(f, LOCAL_URL, 'no-cors', 'omit', 'no-cors', 'omit');
    348  await fetch_test(f, LOCAL_URL, 'no-cors', 'same-origin',
    349                   'no-cors', 'same-origin');
    350  await fetch_test(f, LOCAL_URL, 'no-cors', 'include', 'no-cors', 'include');
    351  await fetch_test(f, LOCAL_URL, 'cors', 'omit', 'cors', 'omit');
    352  await fetch_test(f, LOCAL_URL, 'cors', 'same-origin', 'cors', 'same-origin');
    353  await fetch_test(f, LOCAL_URL, 'cors', 'include', 'cors', 'include');
    354  await fetch_test(f, REMOTE_URL, 'no-cors', 'omit', 'no-cors', 'omit');
    355  await fetch_test(f, REMOTE_URL, 'no-cors', 'same-origin', 'no-cors', 'same-origin');
    356  await fetch_test(f, REMOTE_URL, 'no-cors', 'include', 'no-cors', 'include');
    357  await fetch_test(f, REMOTE_URL, 'cors', 'omit', 'cors', 'omit');
    358  await fetch_test(f, REMOTE_URL, 'cors', 'same-origin', 'cors', 'same-origin');
    359  await fetch_test(f, REMOTE_URL, 'cors', 'include', 'cors', 'include');
    360 
    361  await audio_test(f, LOCAL_URL, '', 'no-cors', 'include');
    362  await audio_test(f, LOCAL_URL, 'anonymous', 'cors', 'same-origin');
    363  await audio_test(f, LOCAL_URL, 'use-credentials', 'cors', 'include');
    364  await audio_test(f, REMOTE_URL, '', 'no-cors', 'include');
    365  await audio_test(f, REMOTE_URL, 'anonymous', 'cors', 'same-origin');
    366  await audio_test(f, REMOTE_URL, 'use-credentials', 'cors', 'include');
    367 
    368  await video_test(f, LOCAL_URL, '', 'no-cors', 'include');
    369  await video_test(f, LOCAL_URL, 'anonymous', 'cors', 'same-origin');
    370  await video_test(f, LOCAL_URL, 'use-credentials', 'cors', 'include');
    371  await video_test(f, REMOTE_URL, '', 'no-cors', 'include');
    372  await video_test(f, REMOTE_URL, 'anonymous', 'cors', 'same-origin');
    373  await video_test(f, REMOTE_URL, 'use-credentials', 'cors', 'include');
    374 }, 'Verify FetchEvent for resources.');
    375 </script>