| "use strict"; |
| Object.defineProperty(exports, "__esModule", { value: true }); |
| const http = require("http"); |
| const angular_wait_barrier_1 = require("./angular_wait_barrier"); |
| const highlight_delay_barrier_1 = require("./highlight_delay_barrier"); |
| const simple_webdriver_client_1 = require("./simple_webdriver_client"); |
| const webdriver_proxy_1 = require("./webdriver_proxy"); |
| exports.BP_PREFIX = 'bpproxy'; |
| /** |
| * The stability proxy is an http server responsible for intercepting |
| * JSON webdriver commands. It keeps track of whether the page under test |
| * needs to wait for page stability, and initiates a wait if so. |
| */ |
| class BlockingProxy { |
| constructor(seleniumAddress, highlightDelay = null) { |
| this.server = http.createServer(this.requestListener.bind(this)); |
| this.proxy = new webdriver_proxy_1.WebDriverProxy(seleniumAddress); |
| let client = new simple_webdriver_client_1.SimpleWebDriverClient(seleniumAddress); |
| this.waitBarrier = new angular_wait_barrier_1.AngularWaitBarrier(client); |
| this.highlightBarrier = new highlight_delay_barrier_1.HighlightDelayBarrier(client, highlightDelay); |
| this.proxy.addBarrier(this.waitBarrier); |
| this.proxy.addBarrier(this.highlightBarrier); |
| } |
| /** |
| * This command is for the proxy server, not to be forwarded to Selenium. |
| */ |
| static isProxyCommand(commandPath) { |
| return (commandPath.split('/')[1] === exports.BP_PREFIX); |
| } |
| /** |
| * Turn on WebDriver logging. |
| * |
| * @param logDir The directory to create logs in. |
| */ |
| enableLogging(logDir) { |
| this.waitBarrier.enableLogging(logDir); |
| } |
| /** |
| * Override the logger instance. Only used for testing. |
| */ |
| setLogger(logger) { |
| this.waitBarrier.setLogger(logger); |
| } |
| /** |
| * Change the parameters used by the wait function. |
| */ |
| setWaitParams(rootEl) { |
| this.waitBarrier.setRootSelector(rootEl); |
| } |
| handleProxyCommand(message, data, response) { |
| let command = message.url.split('/')[2]; |
| switch (command) { |
| case 'waitEnabled': |
| if (message.method === 'GET') { |
| response.writeHead(200); |
| response.write(JSON.stringify({ value: this.waitBarrier.enabled })); |
| response.end(); |
| } |
| else if (message.method === 'POST') { |
| response.writeHead(200); |
| this.waitBarrier.enabled = JSON.parse(data).value; |
| response.end(); |
| } |
| else { |
| response.writeHead(405); |
| response.write('Invalid method'); |
| response.end(); |
| } |
| break; |
| case 'waitParams': |
| if (message.method === 'GET') { |
| response.writeHead(200); |
| response.write(JSON.stringify({ rootSelector: this.waitBarrier.rootSelector })); |
| response.end(); |
| } |
| else if (message.method === 'POST') { |
| response.writeHead(200); |
| this.waitBarrier.rootSelector = JSON.parse(data).rootSelector; |
| response.end(); |
| } |
| else { |
| response.writeHead(405); |
| response.write('Invalid method'); |
| response.end(); |
| } |
| break; |
| default: |
| response.writeHead(404); |
| response.write('Unknown stabilizer proxy command'); |
| response.end(); |
| } |
| } |
| requestListener(originalRequest, response) { |
| if (BlockingProxy.isProxyCommand(originalRequest.url)) { |
| let commandData = ''; |
| originalRequest.on('data', (d) => { |
| commandData += d; |
| }); |
| originalRequest.on('end', () => { |
| this.handleProxyCommand(originalRequest, commandData, response); |
| }); |
| return; |
| } |
| // OK to ignore the promise returned by this. |
| this.proxy.handleRequest(originalRequest, response); |
| } |
| listen(port) { |
| this.server.listen(port); |
| let actualPort = this.server.address().port; |
| return actualPort; |
| } |
| quit() { |
| return new Promise((resolve) => { |
| this.server.close(resolve); |
| }); |
| } |
| } |
| exports.BlockingProxy = BlockingProxy; |
| //# sourceMappingURL=blockingproxy.js.map |