blob: 62c3e479fbc952d5d83b6e081e39b93320d303b4 [file] [log] [blame]
// Copyright 2014 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "content/browser/devtools/shared_worker_devtools_agent_host.h"
#include <memory>
#include <utility>
#include "base/json/json_writer.h"
#include "content/browser/devtools/devtools_renderer_channel.h"
#include "content/browser/devtools/devtools_session.h"
#include "content/browser/devtools/protocol/fetch_handler.h"
#include "content/browser/devtools/protocol/inspector_handler.h"
#include "content/browser/devtools/protocol/io_handler.h"
#include "content/browser/devtools/protocol/network_handler.h"
#include "content/browser/devtools/protocol/protocol.h"
#include "content/browser/devtools/protocol/schema_handler.h"
#include "content/browser/devtools/protocol/target_handler.h"
#include "content/browser/devtools/shared_worker_devtools_manager.h"
#include "content/browser/worker_host/shared_worker_host.h"
#include "content/browser/worker_host/shared_worker_service_impl.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/render_process_host.h"
#include "net/cookies/site_for_cookies.h"
#include "third_party/blink/public/mojom/devtools/devtools_agent.mojom.h"
namespace content {
// static
SharedWorkerDevToolsAgentHost* SharedWorkerDevToolsAgentHost::GetFor(
SharedWorkerHost* worker_host) {
return SharedWorkerDevToolsManager::GetInstance()->GetDevToolsHost(
worker_host);
}
SharedWorkerDevToolsAgentHost::SharedWorkerDevToolsAgentHost(
SharedWorkerHost* worker_host,
const base::UnguessableToken& devtools_worker_token)
: DevToolsAgentHostImpl(devtools_worker_token.ToString()),
auto_attacher_(std::make_unique<protocol::RendererAutoAttacherBase>(
GetRendererChannel())),
state_(WORKER_NOT_READY),
worker_host_(worker_host),
devtools_worker_token_(devtools_worker_token),
instance_(worker_host->instance()) {
NotifyCreated();
}
SharedWorkerDevToolsAgentHost::~SharedWorkerDevToolsAgentHost() {
SharedWorkerDevToolsManager::GetInstance()->AgentHostDestroyed(this);
}
BrowserContext* SharedWorkerDevToolsAgentHost::GetBrowserContext() {
if (!worker_host_)
return nullptr;
return worker_host_->GetProcessHost()->GetBrowserContext();
}
std::string SharedWorkerDevToolsAgentHost::GetType() {
return kTypeSharedWorker;
}
std::string SharedWorkerDevToolsAgentHost::GetTitle() {
return instance_.name();
}
std::string SharedWorkerDevToolsAgentHost::GetDescription() {
if (!instance_.extended_lifetime()) {
return std::string();
}
base::Value::Dict description;
description.Set("extendedLifetime", true);
std::string json;
base::JSONWriter::Write(description, &json);
return json;
}
GURL SharedWorkerDevToolsAgentHost::GetURL() {
return instance_.url();
}
blink::StorageKey SharedWorkerDevToolsAgentHost::GetStorageKey() const {
return instance_.storage_key();
}
bool SharedWorkerDevToolsAgentHost::Activate() {
return false;
}
void SharedWorkerDevToolsAgentHost::Reload() {
}
bool SharedWorkerDevToolsAgentHost::Close() {
if (worker_host_)
worker_host_->Destruct();
return true;
}
bool SharedWorkerDevToolsAgentHost::AttachSession(DevToolsSession* session) {
session->CreateAndAddHandler<protocol::IOHandler>(GetIOContext());
session->CreateAndAddHandler<protocol::InspectorHandler>();
session->CreateAndAddHandler<protocol::NetworkHandler>(
GetId(), devtools_worker_token_, GetIOContext(),
base::BindRepeating([] {}), session->GetClient());
// TODO(crbug.com/40154954): support pushing updated loader factories down to
// renderer.
session->CreateAndAddHandler<protocol::FetchHandler>(
GetIOContext(),
base::BindRepeating([](base::OnceClosure cb) { std::move(cb).Run(); }));
session->CreateAndAddHandler<protocol::SchemaHandler>();
session->CreateAndAddHandler<protocol::TargetHandler>(
protocol::TargetHandler::AccessMode::kAutoAttachOnly, GetId(),
auto_attacher_.get(), session);
return true;
}
void SharedWorkerDevToolsAgentHost::DetachSession(DevToolsSession* session) {
// Destroying session automatically detaches in renderer.
}
bool SharedWorkerDevToolsAgentHost::Matches(SharedWorkerHost* worker_host) {
return instance_.Matches(worker_host->instance().url(),
worker_host->instance().name(),
worker_host->instance().storage_key(),
worker_host->instance().same_site_cookies());
}
void SharedWorkerDevToolsAgentHost::WorkerReadyForInspection(
mojo::PendingRemote<blink::mojom::DevToolsAgent> agent_remote,
mojo::PendingReceiver<blink::mojom::DevToolsAgentHost>
agent_host_receiver) {
DCHECK_EQ(WORKER_NOT_READY, state_);
DCHECK(worker_host_);
state_ = WORKER_READY;
GetRendererChannel()->SetRenderer(
std::move(agent_remote), std::move(agent_host_receiver),
worker_host_->GetProcessHost()->GetDeprecatedID());
for (auto* inspector : protocol::InspectorHandler::ForAgentHost(this))
inspector->TargetReloadedAfterCrash();
}
void SharedWorkerDevToolsAgentHost::WorkerRestarted(
SharedWorkerHost* worker_host) {
DCHECK_EQ(WORKER_TERMINATED, state_);
DCHECK(!worker_host_);
state_ = WORKER_NOT_READY;
worker_host_ = worker_host;
}
void SharedWorkerDevToolsAgentHost::WorkerDestroyed() {
DCHECK_NE(WORKER_TERMINATED, state_);
DCHECK(worker_host_);
state_ = WORKER_TERMINATED;
for (auto* inspector : protocol::InspectorHandler::ForAgentHost(this))
inspector->TargetCrashed();
worker_host_ = nullptr;
GetRendererChannel()->SetRenderer(mojo::NullRemote(), mojo::NullReceiver(),
ChildProcessHost::kInvalidUniqueID);
}
DevToolsAgentHostImpl::NetworkLoaderFactoryParamsAndInfo
SharedWorkerDevToolsAgentHost::CreateNetworkFactoryParamsForDevTools() {
DCHECK(worker_host_);
return {GetStorageKey().origin(),
instance_.DoesRequireCrossSiteRequestForCookies()
? net::SiteForCookies()
: net::SiteForCookies::FromUrl(GetURL()),
worker_host_->CreateNetworkFactoryParamsForSubresources()};
}
RenderProcessHost* SharedWorkerDevToolsAgentHost::GetProcessHost() {
DCHECK(worker_host_);
return worker_host_->GetProcessHost();
}
protocol::TargetAutoAttacher* SharedWorkerDevToolsAgentHost::auto_attacher() {
return auto_attacher_.get();
}
} // namespace content