| "use strict"; | 
 | // Usage: `node generate-test-wrappers.js js-filename1.js [js-filename2.js ...]` will generate: | 
 | // - js-filename1.https.html | 
 | // - js-filename1.sharedworker.html | 
 | // - js-filename1.dedicatedworker.html | 
 | // - js-filename1.serviceworker.html | 
 | // (for each passed filename) | 
 | // | 
 | // It will turn any importScripts inside the .js file into <script>s in the browser context wrapper. | 
 | // | 
 | // This could become obsolete if all of the following happen: | 
 | // - https://github.com/w3c/web-platform-tests/issues/4210 gets fixed, allowing .any.js to work with all four contexts | 
 | // - We find some way to include scripts (<script>/importScripts) in .any.js files | 
 | // - Chrome becomes able to run .any.js tests on its infrastructure | 
 | //   (https://bugs.chromium.org/p/chromium/issues/detail?id=653514) | 
 |  | 
 | const fs = require("fs"); | 
 | const path = require("path"); | 
 |  | 
 | for (const arg of process.argv.slice(2)) { | 
 |     generateWrapper(arg); | 
 | } | 
 |  | 
 | function generateWrapper(jsFilename) { | 
 |     const importedScriptFilenames = findImportedScriptFilenames(jsFilename); | 
 |     const importedScriptTags = importedScriptFilenames | 
 |         .map(filename => `<script src="${filename}"></script>`) | 
 |         .join('\n'); | 
 |  | 
 |     const basename = path.basename(jsFilename); | 
 |     const noExtension = path.basename(jsFilename, '.js'); | 
 |  | 
 |     const outputs = { | 
 |         '.html': `<!DOCTYPE html> | 
 | <meta charset="utf-8"> | 
 | <title>${basename} browser context wrapper file</title> | 
 |  | 
 | <script src="/resources/testharness.js"></script> | 
 | <script src="/resources/testharnessreport.js"></script> | 
 |  | 
 | ${importedScriptTags} | 
 |  | 
 | <script src="${basename}"></script> | 
 | `, | 
 |         '.dedicatedworker.html': `<!DOCTYPE html> | 
 | <meta charset="utf-8"> | 
 | <title>${basename} dedicated worker wrapper file</title> | 
 |  | 
 | <script src="/resources/testharness.js"></script> | 
 | <script src="/resources/testharnessreport.js"></script> | 
 |  | 
 | <script> | 
 | 'use strict'; | 
 | fetch_tests_from_worker(new Worker('${basename}')); | 
 | </script> | 
 | `, | 
 |         '.sharedworker.html': `<!DOCTYPE html> | 
 | <meta charset="utf-8"> | 
 | <title>${basename} shared worker wrapper file</title> | 
 |  | 
 | <script src="/resources/testharness.js"></script> | 
 | <script src="/resources/testharnessreport.js"></script> | 
 |  | 
 | <script> | 
 | 'use strict'; | 
 | fetch_tests_from_worker(new SharedWorker('${basename}')); | 
 | </script> | 
 | `, | 
 |         '.serviceworker.https.html': `<!DOCTYPE html> | 
 | <meta charset="utf-8"> | 
 | <title>${basename} service worker wrapper file</title> | 
 |  | 
 | <script src="/resources/testharness.js"></script> | 
 | <script src="/resources/testharnessreport.js"></script> | 
 | <script src="/service-workers/service-worker/resources/test-helpers.sub.js"></script> | 
 |  | 
 | <script> | 
 | 'use strict'; | 
 | service_worker_test('${basename}', 'Service worker test setup'); | 
 | </script> | 
 | ` | 
 |     }; | 
 |  | 
 |     for (const [key, value] of Object.entries(outputs)) { | 
 |         const destFilename = path.resolve(path.dirname(jsFilename), `${noExtension}${key}`); | 
 |         fs.writeFileSync(destFilename, value, { encoding: 'utf-8' }); | 
 |     } | 
 | } | 
 |  | 
 | function findImportedScriptFilenames(inputFilename) { | 
 |     const scriptContents = fs.readFileSync(inputFilename, { encoding: 'utf-8' }); | 
 |  | 
 |     const regExp = /self\.importScripts\('([^']+)'\);/g; | 
 |  | 
 |     let result = []; | 
 |     let match; | 
 |     while (match = regExp.exec(scriptContents)) { | 
 |         result.push(match[1]); | 
 |     } | 
 |  | 
 |     return result.filter(x => x !== '/resources/testharness.js'); | 
 | } |