| // Copyright 2022 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| /** |
| * @fileoverview Keeps the websocket connection and allows sending messages |
| */ |
| |
| const Connection = { |
| |
| async getUrl() { |
| let url = document.querySelector("#url").value; |
| if (url) { |
| return [url, ""]; |
| } |
| |
| try { |
| let response = await fetch(location.origin + "/discover.json"); |
| if (!response.ok) { |
| return [ |
| "", |
| `Unexpected server error=${response.status} ${response.statusText}`, |
| ]; |
| } else { |
| let discover_json = await response.json(); |
| if (discover_json.error) { |
| // Error message from the python server |
| return ["", discover_json.error]; |
| } |
| |
| // Success |
| return [discover_json.webSocketDebuggerUrl, ""]; |
| } |
| } catch (e) { |
| request_error = |
| "Visual Debugger local server is inaccessible. \n" + |
| "Please launch the server with command:\n " + |
| " ./launchdebugger {app_port} {remote_port} \n" + |
| " remote_port defaults to 7777 \n" + |
| " corresponds to the chromium command line\n " + |
| " --remote-debugging-port=7777 \n" + |
| " app_port defaults to 8777. Currently app_port=" + |
| location.port; |
| return ["", request_error]; |
| } |
| }, |
| |
| |
| async startConnection() { |
| const loop_interval = 3000; |
| const connect_info = await this.getUrl(); |
| if (connect_info[1] != "") { |
| window.alert(connect_info[1]); |
| return; |
| } |
| url = connect_info[0]; |
| |
| // Create WebSocket connection. |
| this.socket = new WebSocket(url); |
| |
| const status = document.querySelector('#connection-status'); |
| const connect = document.querySelector('#connect'); |
| const disconnect = document.querySelector('#disconnect'); |
| |
| this.next_command_id = 1; |
| |
| this.socket.addEventListener('error', (event) => { |
| document.getElementById('autoconnect').checked = false; |
| window.alert("Websocket could not connect.\n You may need to add: \n " + |
| "--remote-allow-origins=* \n to your chromium launch flags."); |
| }); |
| |
| |
| // Connection opened |
| this.socket.addEventListener('open', (event) => { |
| const message = {}; |
| message['method'] = 'VisualDebugger.startStream'; |
| this.sendMessage(message) |
| |
| connect.setAttribute('disabled', true); |
| disconnect.removeAttribute('disabled'); |
| status.classList.remove('disconnected'); |
| }); |
| |
| |
| // Listen for messages |
| this.socket.addEventListener('message', (event) => { |
| const json = JSON.parse(event.data); |
| // We now use devtool events so our frame data is packed |
| // into the args of the method. |
| if (json.method === "VisualDebugger.frameResponse") { |
| const frame_json = json.params.frameData; |
| if (frame_json.connection == "ok") { |
| Filter.sendStreamFilters(); |
| } else if (frame_json.frame && frame_json.drawcalls) { |
| processIncomingFrame(frame_json); |
| } |
| } |
| else if (json.error) { |
| window.alert("Visual Debugger could not start stream.\n " + |
| "please add 'use_viz_debugger=true' to args.gn"); |
| console.log(json.error); |
| this.socket.close(); |
| } |
| }); |
| |
| this.socket.addEventListener('close', () => { |
| connect.removeAttribute('disabled'); |
| disconnect.setAttribute('disabled', true); |
| status.classList.add('disconnected'); |
| // Checks if connection can be made every |
| // loop_interval number of milliseconds. |
| let retryAfterDelay = () => { |
| setTimeout(() => { |
| if (!document.getElementById("autoconnect").checked) { |
| // Keep this setTimeout loop alive in case the user re-checks the |
| // box. |
| retryAfterDelay(); |
| return; |
| } |
| |
| console.log("Attempting autoconnect..."); |
| Connection.getUrl().then((test_connect) => { |
| if (test_connect[0] != "") { |
| Connection.startConnection(); |
| } else { |
| // Failure, queue a retry. |
| retryAfterDelay(); |
| } |
| }); |
| }, loop_interval); |
| }; |
| |
| retryAfterDelay(); |
| }); |
| |
| disconnect.addEventListener('click', () => { |
| const message = {}; |
| message['method'] = 'VisualDebugger.stopStream'; |
| this.sendMessage(message); |
| document.getElementById('autoconnect').checked = false; |
| this.socket.close(); |
| }); |
| }, |
| |
| initialize() { |
| const connect = document.querySelector('#connect'); |
| connect.addEventListener('click', () => { |
| this.startConnection(); |
| }); |
| }, |
| |
| sendMessage(message) { |
| if (!this.socket) |
| return; |
| message['id'] = this.next_command_id++; |
| this.socket.send(JSON.stringify(message)); |
| } |
| }; |