| // Copyright 2022 The Chromium Authors. All rights reserved. |
| // 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 = { |
| |
| initialize() { |
| const connect = document.querySelector('#connect'); |
| connect.addEventListener('click', () => { |
| var url = document.querySelector('#url').value; |
| if (!url) { |
| var http_requester = new XMLHttpRequest(); |
| // Sync request to avoid complexity but is poor form. |
| try { |
| http_requester.open("GET", location.origin + '/discover.html', false); |
| http_requester.send(null); |
| } |
| catch (req_error) { |
| window.alert("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); |
| console.log(req_error); |
| return; |
| } |
| |
| if (http_requester.status != 200) { |
| window.alert("Server reports error=" + http_requester.responseText); |
| return; |
| } |
| else { |
| var discover_json = JSON.parse(http_requester.responseText); |
| // console.log(discover_json); |
| url = discover_json.webSocketDebuggerUrl; |
| } |
| } |
| |
| // 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; |
| |
| // 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'); |
| }); |
| |
| disconnect.addEventListener('click', () => { |
| const message = {}; |
| message['method'] = 'VisualDebugger.stopStream'; |
| this.sendMessage(message) |
| this.socket.close(); |
| }); |
| }); |
| }, |
| |
| sendMessage(message) { |
| if (!this.socket) |
| return; |
| message['id'] = this.next_command_id++; |
| this.socket.send(JSON.stringify(message)); |
| } |
| }; |