tor-browser

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

cookieStore_special_names.https.any.js (3995B)


      1 // META: title=Cookie Store API: cookieStore.set()/get()/delete() for cookies with special names
      2 // META: global=window,serviceworker
      3 
      4 'use strict';
      5 
      6 ['__Secure-', '__secure-', '__Host-', '__host-'].forEach(prefix => {
      7  promise_test(async testCase => {
      8    await cookieStore.set(`${prefix}cookie-name`, `secure-cookie-value`);
      9    assert_equals(
     10      (await cookieStore.get(`${prefix}cookie-name`)).value,
     11      'secure-cookie-value',
     12      `Setting ${prefix} cookies should not fail in secure context`);
     13 
     14    try { await cookieStore.delete(`${prefix}cookie-name`); } catch (e) {}
     15  }, `cookieStore.set with ${prefix} name on secure origin`);
     16 
     17  promise_test(async testCase => {
     18    // This test is for symmetry with the non-secure case. In non-secure
     19    // contexts, the set() should fail even if the expiration date makes
     20    // the operation a no-op.
     21    await cookieStore.set(
     22        { name: `${prefix}cookie-name`, value: `secure-cookie-value`,
     23          expires: Date.now() - (24 * 60 * 60 * 1000)});
     24    assert_equals(await cookieStore.get(`${prefix}cookie-name`), null);
     25    try { await cookieStore.delete(`${prefix}cookie-name`); } catch (e) {}
     26  }, `cookieStore.set of expired ${prefix} cookie name on secure origin`);
     27 
     28  promise_test(async testCase => {
     29    assert_equals(
     30      await cookieStore.delete(`${prefix}cookie-name`), undefined,
     31      `Deleting ${prefix} cookies should not fail in secure context`);
     32  }, `cookieStore.delete with ${prefix} name on secure origin`);
     33 });
     34 
     35 ['__Host-', '__host-'].forEach(prefix => {
     36  promise_test(async testCase => {
     37    const currentUrl = new URL(self.location.href);
     38    const currentDomain = currentUrl.hostname;
     39    await promise_rejects_js(testCase, TypeError,
     40        cookieStore.set({ name: `${prefix}cookie-name`, value: 'cookie-value',
     41                          domain: currentDomain }));
     42  }, `cookieStore.set with ${prefix} prefix and a domain option`);
     43 
     44  promise_test(async testCase => {
     45    await cookieStore.set({ name: `${prefix}cookie-name`, value: 'cookie-value',
     46                            path: "/" });
     47 
     48    assert_equals(
     49        (await cookieStore.get(`${prefix}cookie-name`)).value, "cookie-value");
     50 
     51    await promise_rejects_js(testCase, TypeError,
     52        cookieStore.set( { name: `${prefix}cookie-name`, value: 'cookie-value',
     53                          path: "/path" }));
     54 
     55    await cookieStore.delete({ name: `${prefix}cookie-name`});
     56  }, `cookieStore.set with ${prefix} prefix a path option`);
     57 });
     58 
     59 ['__Host-Http-', '__host-http-', '__Http-', '__http-', '  __Http-', '\t__Http-',
     60 '  __Host-Http-', '\t__Host-Http-'].forEach(prefix => {
     61  promise_test(async testCase => {
     62    await promise_rejects_js(testCase, TypeError,
     63        cookieStore.set({ name: `${prefix}cookie-name`, value: 'cookie-value'}));
     64  }, `cookieStore.set with ${prefix} prefix rejects`);
     65 });
     66 
     67 promise_test(async testCase => {
     68    let exceptionThrown = false;
     69    try {
     70        await cookieStore.set(unescape('cookie-name%0D1'), 'cookie-value');
     71    } catch (e) {
     72        assert_equals (e.name, "TypeError", "cookieStore thrown an incorrect exception -");
     73        exceptionThrown = true;
     74    }
     75    assert_true(exceptionThrown, "No exception thrown.");
     76 }, 'cookieStore.set with malformed name.');
     77 
     78 ['__Host-', '__Secure-', '__Http-', '__Host-Http-', ' __Host-', '\t__Host-', ' __Secure-',
     79 '\t__Secure-', ' __Http-', '\t__Http-', ' __Host-Http-', '\t__Host-Http-'].forEach(prefix => {
     80  promise_test(async testCase => {
     81    // Nameless cookies cannot have special prefixes
     82    await cookieStore.delete('');
     83 
     84    const currentUrl = new URL(self.location.href);
     85    const currentDomain = currentUrl.hostname;
     86 
     87    await promise_rejects_js(testCase, TypeError, cookieStore.set(
     88        { name: '',
     89          value: `${prefix}nameless-cookie`,
     90          domain: `.${currentDomain}` }));
     91    const cookie = await cookieStore.get('');
     92    assert_equals(cookie, null);
     93  }, `cookieStore.set a nameless cookie cannot have ${prefix} prefix`);
     94 });