/** * Karma middleware is responsible for serving: * - client.html (the entrypoint for capturing a browser) * - debug.html * - context.html (the execution context, loaded within an iframe) * - karma.js * * The main part is generating context.html, as it contains: * - generating mappings * - including `) } else { scriptTags.push(``) } } } const scriptUrls = [] // For client_with_context, html elements are not added directly through an iframe. // Instead, scriptTags is stored to window.__karma__.scriptUrls first. Later, the // client will read window.__karma__.scriptUrls and dynamically add them to the DOM // using DOMParser. if (requestUrl === '/client_with_context.html') { for (const script of scriptTags) { scriptUrls.push( // Escape characters with special roles (tags) in HTML. Open angle brackets are parsed as tags // immediately, even if it is within double quotations in browsers script.replace(//g, '\\x3E')) } } const mappings = data.includes('%MAPPINGS%') ? files.served.map((file) => { const filePath = filePathToUrlPath(file.path, basePath, urlRoot, proxyPath) .replace(/\\/g, '\\\\') // Windows paths contain backslashes and generate bad IDs if not escaped .replace(/'/g, '\\\'') // Escape single quotes - double quotes should not be allowed! return ` '${filePath}': '${file.sha}'` }) : [] return data .replace('%SCRIPTS%', () => scriptTags.join('\n')) .replace('%CLIENT_CONFIG%', 'window.__karma__.config = ' + JSON.stringify(client) + ';\n') .replace('%SCRIPT_URL_ARRAY%', () => 'window.__karma__.scriptUrls = ' + JSON.stringify(scriptUrls) + ';\n') .replace('%MAPPINGS%', () => 'window.__karma__.files = {\n' + mappings.join(',\n') + '\n};\n') .replace('\n%X_UA_COMPATIBLE%', getXUACompatibleMetaElement(request.url)) }) }) } else if (requestUrl === '/context.json') { return filesPromise.then((files) => { common.setNoCacheHeaders(response) response.writeHead(200) response.end(JSON.stringify({ files: files.included.map((file) => filePathToUrlPath(file.path + '?' + file.sha, basePath, urlRoot, proxyPath)) })) }) } return next() } } createKarmaMiddleware.$inject = [ 'filesPromise', 'serveStaticFile', 'serveFile', 'injector', 'config.basePath', 'config.urlRoot', 'config.upstreamProxy', 'config.browserSocketTimeout' ] // PUBLIC API exports.create = createKarmaMiddleware