module DEBUGGER__::UI_CDP

def setup_chrome addr, uuid

def setup_chrome addr, uuid
  return if CONFIG[:chrome_path] == ''
  port, path, pid = run_new_chrome
  begin
    s = Socket.tcp '127.0.0.1', port
  rescue Errno::ECONNREFUSED, Errno::EADDRNOTAVAIL
    return
  end
  ws_client = WebSocketClient.new(s)
  ws_client.handshake port, path
  ws_client.send id: 1, method: 'Target.getTargets'
  loop do
    res = ws_client.extract_data
    case res['id']
    when 1
      target_info = res.dig('result', 'targetInfos')
      page = target_info.find{|t| t['type'] == 'page'}
      ws_client.send id: 2, method: 'Target.attachToTarget',
                    params: {
                      targetId: page['targetId'],
                      flatten: true
                    }
    when 2
      s_id = res.dig('result', 'sessionId')
      # TODO: change id
      ws_client.send sessionId: s_id, id: 100, method: 'Network.enable'
      ws_client.send sessionId: s_id, id: 3,
                    method: 'Page.enable'
    when 3
      s_id = res['sessionId']
      ws_client.send sessionId: s_id, id: 4,
                    method: 'Page.getFrameTree'
    when 4
      s_id = res['sessionId']
      f_id = res.dig('result', 'frameTree', 'frame', 'id')
      ws_client.send sessionId: s_id, id: 5,
                    method: 'Page.navigate',
                    params: {
                      url: "devtools://devtools/bundled/inspector.html?v8only=true&panel=sources&ws=#{addr}/#{uuid}",
                      frameId: f_id
                    }
    when 101
      break
    else
      if res['method'] == 'Network.webSocketWillSendHandshakeRequest'
        s_id = res['sessionId']
        # Display the console by entering ESC key
        ws_client.send sessionId: s_id, id: 101,  # TODO: change id
                      method:"Input.dispatchKeyEvent",
                      params: {
                        type:"keyDown",
                        windowsVirtualKeyCode:27 # ESC key
                      }
      end
    end
  end
  pid
rescue Errno::ENOENT, UnsupportedError, NotFoundChromeEndpointError
  nil
end