blob: b3da62dff7cb017552b6b27291d1d8b4ad44c781 [file] [log] [blame]
// Copyright 2018 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.
#include "content/browser/gpu/viz_devtools_connector.h"
#include "base/bind.h"
#include "base/task/post_task.h"
#include "components/ui_devtools/devtools_server.h"
#include "components/viz/common/switches.h"
#include "content/browser/gpu/gpu_process_host.h"
#include "content/public/browser/browser_task_traits.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/content_browser_client.h"
#include "content/public/common/content_client.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
namespace content {
namespace {
void OnSocketCreated(base::OnceCallback<void(int, int)> callback,
int result,
const base::Optional<net::IPEndPoint>& local_addr) {
int port = 0;
if (local_addr)
port = local_addr->port();
base::PostTask(FROM_HERE, {BrowserThread::IO},
base::BindOnce(std::move(callback), result, port));
}
void CreateSocketOnUiThread(
mojo::PendingReceiver<network::mojom::TCPServerSocket>
server_socket_receiver,
int port,
base::OnceCallback<void(int, int)> callback) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
ui_devtools::UiDevToolsServer::CreateTCPServerSocket(
std::move(server_socket_receiver),
GetContentClient()->browser()->GetSystemNetworkContext(), port,
ui_devtools::UiDevToolsServer::kVizDevtoolsServerTag,
base::BindOnce(&OnSocketCreated, std::move(callback)));
}
} // namespace
VizDevToolsConnector::VizDevToolsConnector() {}
VizDevToolsConnector::~VizDevToolsConnector() {}
void VizDevToolsConnector::ConnectVizDevTools() {
constexpr int kVizDevToolsDefaultPort = 9229;
mojo::PendingRemote<network::mojom::TCPServerSocket> server_socket;
int port = ui_devtools::UiDevToolsServer::GetUiDevToolsPort(
switches::kEnableVizDevTools, kVizDevToolsDefaultPort);
// Jump to the UI thread to get the network context, create the socket, then
// jump back to the IO thread to complete the callback.
base::PostTask(
FROM_HERE, {BrowserThread::UI},
base::BindOnce(
&CreateSocketOnUiThread,
server_socket.InitWithNewPipeAndPassReceiver(), port,
base::BindOnce(&VizDevToolsConnector::OnVizDevToolsSocketCreated,
weak_ptr_factory_.GetWeakPtr(),
std::move(server_socket))));
}
void VizDevToolsConnector::OnVizDevToolsSocketCreated(
mojo::PendingRemote<network::mojom::TCPServerSocket> socket,
int result,
int port) {
viz::mojom::VizDevToolsParamsPtr params =
viz::mojom::VizDevToolsParams::New();
params->server_socket = std::move(socket);
params->server_port = port;
auto* gpu_process_host = GpuProcessHost::Get();
if (gpu_process_host)
gpu_process_host->gpu_host()->ConnectVizDevTools(std::move(params));
}
} // namespace content