tor-browser

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

helper.js (2947B)


      1 export function documentHasCookie(cookieAndValue) {
      2  return document.cookie.split(';').some(item => item.includes(cookieAndValue));
      3 }
      4 
      5 export async function waitForCookie(cookieAndValue, expectCookie) {
      6  const startTime = Date.now();
      7  const hasCookie = await new Promise(resolve => {
      8    const interval = setInterval(() => {
      9      if (documentHasCookie(cookieAndValue)) {
     10        clearInterval(interval);
     11        resolve(true);
     12      }
     13      if (!expectCookie && Date.now() - startTime >= 1000) {
     14        clearInterval(interval);
     15        resolve(false);
     16      }
     17    }, 100);
     18  });
     19  assert_equals(hasCookie, expectCookie);
     20 }
     21 
     22 export function expireCookie(cookieAndAttributes) {
     23  document.cookie =
     24      `${cookieAndAttributes}; expires=Thu, 01 Jan 1970 00:00:00 UTC;`;
     25 }
     26 
     27 export function addCookieAndSessionCleanup(test) {
     28  // Clean up any set cookies once the test completes.
     29  test.add_cleanup(async () => {
     30    const response = await fetch('end_session_via_clear_site_data.py');
     31    assert_equals(response.status, 200);
     32  });
     33 }
     34 
     35 export async function postJson(url, obj) {
     36  return await fetch(url, {
     37    method: 'POST',
     38    headers: {'Content-Type': 'application/json'},
     39    body: JSON.stringify(obj),
     40  });
     41 }
     42 
     43 export async function configureServer(obj) {
     44  const response = await fetch('configure_server.py', {
     45    method: 'POST',
     46    headers: {'Content-Type': 'application/json'},
     47    body: JSON.stringify(obj),
     48  });
     49  assert_equals(response.status, 200);
     50 }
     51 
     52 export async function setupShardedServerState(obj) {
     53  if (obj === undefined) {
     54    obj = {};
     55  }
     56  const response = await fetch('setup_sharded_server_state.py', {
     57    method: 'POST',
     58    headers: {'Content-Type': 'application/json'},
     59    body: JSON.stringify(obj),
     60  });
     61  assert_equals(response.status, 200);
     62  const testIdCookie =
     63      document.cookie.split(';').filter(item => item.includes('test_id'))[0];
     64  return testIdCookie.split('=')[1];
     65 }
     66 
     67 export async function pullServerState() {
     68  const response = await fetch('pull_server_state.py');
     69  assert_equals(response.status, 200);
     70  return await response.json();
     71 }
     72 
     73 // Create an iframe that fetches URLs on demand via postMessage.
     74 export async function crossSiteFetch(fromSite, url, fetchParams) {
     75  const frame = document.createElement('iframe');
     76  const frameLoadPromise = new Promise((resolve, reject) => {
     77    frame.onload = resolve;
     78    frame.onerror = reject;
     79  });
     80  frame.src = fromSite + "/device-bound-session-credentials/url_fetcher.html";
     81  document.body.appendChild(frame);
     82  await frameLoadPromise;
     83 
     84  const fetchStatusPromise = new Promise((resolve) => {
     85    const listener = (event) => {
     86      window.removeEventListener("message", listener);
     87      resolve(event.data);
     88    };
     89    window.addEventListener("message", listener);
     90  });
     91  frame.contentWindow.postMessage({url, fetchParams}, "*");
     92 
     93  const fetchStatus = await fetchStatusPromise;
     94  document.body.removeChild(frame);
     95 
     96  return fetchStatus;
     97 }