tor-browser

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

nested-testharness.js (2351B)


      1 'use strict';
      2 
      3 /**
      4 * Execute testharness.js and one or more scripts in an iframe. Report the
      5 * results of the execution.
      6 *
      7 * @param {...function|...string} bodies - a function body. If specified as a
      8 *                                         function object, it will be
      9 *                                         serialized to a string using the
     10 *                                         built-in
     11 *                                         `Function.prototype.toString` prior
     12 *                                         to inclusion in the generated
     13 *                                         iframe.
     14 *
     15 * @returns {Promise} eventual value describing the result of the test
     16 *                    execution; the summary object has two properties:
     17 *                    `harness` (a string describing the harness status) and
     18 *                    `tests` (an object whose "own" property names are the
     19 *                    titles of the defined sub-tests and whose associated
     20 *                    values are the subtest statuses).
     21 */
     22 function makeTest(...bodies) {
     23  const closeScript = '<' + '/script>';
     24  let src = `
     25 <!DOCTYPE HTML>
     26 <html>
     27 <head>
     28 <title>Document title</title>
     29 <script src="/resources/testharness.js?${Math.random()}">${closeScript}
     30 </head>
     31 
     32 <body>
     33 <div id="log"></div>`;
     34  bodies.forEach((body) => {
     35    src += '<script>(' + body + ')();' + closeScript;
     36  });
     37 
     38  const iframe = document.createElement('iframe');
     39 
     40  document.body.appendChild(iframe);
     41  iframe.contentDocument.write(src);
     42 
     43  return new Promise((resolve) => {
     44    window.addEventListener('message', function onMessage(e) {
     45      if (e.source !== iframe.contentWindow) {
     46        return;
     47      }
     48      if (!e.data || e.data.type !=='complete') {
     49        return;
     50      }
     51      window.removeEventListener('message', onMessage);
     52      resolve(e.data);
     53    });
     54 
     55    iframe.contentDocument.close();
     56  }).then(({ tests, status }) => {
     57    const summary = {
     58      harness: getEnumProp(status, status.status),
     59      tests: {}
     60    };
     61 
     62    tests.forEach((test) => {
     63      summary.tests[test.name] = getEnumProp(test, test.status);
     64    });
     65 
     66    return summary;
     67  });
     68 }
     69 
     70 function getEnumProp(object, value) {
     71  for (let property in object) {
     72    if (!/^[A-Z]+$/.test(property)) {
     73      continue;
     74    }
     75 
     76    if (object[property] === value) {
     77      return property;
     78    }
     79  }
     80 }