tor-browser

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

get-resultingClientId-worker.js (2728B)


      1 // This worker expects a fetch event for a navigation and messages back the
      2 // result of clients.get(event.resultingClientId).
      3 
      4 // Resolves when the test finishes.
      5 let testFinishPromise;
      6 let resolveTestFinishPromise;
      7 let rejectTestFinishPromise;
      8 
      9 // Resolves to clients.get(event.resultingClientId) from the fetch event.
     10 let getPromise;
     11 let resolveGetPromise;
     12 let rejectGetPromise;
     13 
     14 let resultingClientId;
     15 
     16 function startTest() {
     17  testFinishPromise = new Promise((resolve, reject) => {
     18    resolveTestFinishPromise = resolve;
     19    rejectTestFinishPromise = reject;
     20  });
     21 
     22  getPromise = new Promise((resolve, reject) => {
     23    resolveGetPromise = resolve;
     24    rejectGetPromise = reject;
     25  });
     26 }
     27 
     28 async function describeGetPromiseResult(promise) {
     29  const result = {};
     30 
     31  await promise.then(
     32    (client) => {
     33      result.promiseState = 'fulfilled';
     34      if (client === undefined) {
     35        result.promiseValue = 'undefinedValue';
     36      } else if (client instanceof Client) {
     37        result.promiseValue = 'client';
     38        result.client = {
     39          id:  client.id,
     40          url: client.url
     41        };
     42      } else {
     43        result.promiseValue = 'unknown';
     44      }
     45    },
     46    (error) => {
     47      result.promiseState = 'rejected';
     48    });
     49 
     50  return result;
     51 }
     52 
     53 async function handleGetResultingClient(event) {
     54  // Note that this message can arrive before |resultingClientId| is populated.
     55  const result = await describeGetPromiseResult(getPromise);
     56  // |resultingClientId| must be populated by now.
     57  result.queriedId = resultingClientId;
     58  event.source.postMessage(result);
     59 };
     60 
     61 async function handleGetClient(event) {
     62  const id = event.data.id;
     63  const result = await describeGetPromiseResult(self.clients.get(id));
     64  result.queriedId = id;
     65  event.source.postMessage(result);
     66 };
     67 
     68 self.addEventListener('message', (event) => {
     69  if (event.data.command == 'startTest') {
     70    startTest();
     71    event.waitUntil(testFinishPromise);
     72    event.source.postMessage('ok');
     73    return;
     74  }
     75 
     76  if (event.data.command == 'finishTest') {
     77    resolveTestFinishPromise();
     78    event.source.postMessage('ok');
     79    return;
     80  }
     81 
     82  if (event.data.command == 'getResultingClient') {
     83    event.waitUntil(handleGetResultingClient(event));
     84    return;
     85  }
     86 
     87  if (event.data.command == 'getClient') {
     88    event.waitUntil(handleGetClient(event));
     89    return;
     90  }
     91 });
     92 
     93 async function handleFetch(event) {
     94  try {
     95    resultingClientId = event.resultingClientId;
     96    const client = await self.clients.get(resultingClientId);
     97    resolveGetPromise(client);
     98  } catch (error) {
     99    rejectGetPromise(error);
    100  }
    101 }
    102 
    103 self.addEventListener('fetch', (event) => {
    104  if (event.request.mode != 'navigate')
    105    return;
    106  event.waitUntil(handleFetch(event));
    107 });