1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "content/browser/devtools/shared_worker_devtools_agent_host.h"
6
7 #include <memory>
8 #include <utility>
9
10 #include "content/browser/devtools/devtools_renderer_channel.h"
11 #include "content/browser/devtools/devtools_session.h"
12 #include "content/browser/devtools/protocol/inspector_handler.h"
13 #include "content/browser/devtools/protocol/network_handler.h"
14 #include "content/browser/devtools/protocol/protocol.h"
15 #include "content/browser/devtools/protocol/schema_handler.h"
16 #include "content/browser/devtools/protocol/target_handler.h"
17 #include "content/browser/devtools/shared_worker_devtools_manager.h"
18 #include "content/browser/worker_host/shared_worker_host.h"
19 #include "content/browser/worker_host/shared_worker_service_impl.h"
20 #include "content/public/browser/browser_thread.h"
21 #include "content/public/browser/render_process_host.h"
22 #include "third_party/blink/public/mojom/devtools/devtools_agent.mojom.h"
23
24 namespace content {
25
SharedWorkerDevToolsAgentHost(SharedWorkerHost * worker_host,const base::UnguessableToken & devtools_worker_token)26 SharedWorkerDevToolsAgentHost::SharedWorkerDevToolsAgentHost(
27 SharedWorkerHost* worker_host,
28 const base::UnguessableToken& devtools_worker_token)
29 : DevToolsAgentHostImpl(devtools_worker_token.ToString()),
30 state_(WORKER_NOT_READY),
31 worker_host_(worker_host),
32 devtools_worker_token_(devtools_worker_token),
33 instance_(worker_host->instance()) {
34 NotifyCreated();
35 }
36
~SharedWorkerDevToolsAgentHost()37 SharedWorkerDevToolsAgentHost::~SharedWorkerDevToolsAgentHost() {
38 SharedWorkerDevToolsManager::GetInstance()->AgentHostDestroyed(this);
39 }
40
GetBrowserContext()41 BrowserContext* SharedWorkerDevToolsAgentHost::GetBrowserContext() {
42 if (!worker_host_)
43 return nullptr;
44 return worker_host_->GetProcessHost()->GetBrowserContext();
45 }
46
GetType()47 std::string SharedWorkerDevToolsAgentHost::GetType() {
48 return kTypeSharedWorker;
49 }
50
GetTitle()51 std::string SharedWorkerDevToolsAgentHost::GetTitle() {
52 return instance_.name();
53 }
54
GetURL()55 GURL SharedWorkerDevToolsAgentHost::GetURL() {
56 return instance_.url();
57 }
58
Activate()59 bool SharedWorkerDevToolsAgentHost::Activate() {
60 return false;
61 }
62
Reload()63 void SharedWorkerDevToolsAgentHost::Reload() {
64 }
65
Close()66 bool SharedWorkerDevToolsAgentHost::Close() {
67 if (worker_host_)
68 worker_host_->Destruct();
69 return true;
70 }
71
AttachSession(DevToolsSession * session)72 bool SharedWorkerDevToolsAgentHost::AttachSession(DevToolsSession* session) {
73 session->AddHandler(std::make_unique<protocol::InspectorHandler>());
74 session->AddHandler(std::make_unique<protocol::NetworkHandler>(
75 GetId(), devtools_worker_token_, GetIOContext(),
76 base::BindRepeating([] {})));
77 session->AddHandler(std::make_unique<protocol::SchemaHandler>());
78 session->AddHandler(std::make_unique<protocol::TargetHandler>(
79 protocol::TargetHandler::AccessMode::kAutoAttachOnly, GetId(),
80 GetRendererChannel(), session->GetRootSession()));
81 return true;
82 }
83
DetachSession(DevToolsSession * session)84 void SharedWorkerDevToolsAgentHost::DetachSession(DevToolsSession* session) {
85 // Destroying session automatically detaches in renderer.
86 }
87
Matches(SharedWorkerHost * worker_host)88 bool SharedWorkerDevToolsAgentHost::Matches(SharedWorkerHost* worker_host) {
89 return instance_.Matches(worker_host->instance().url(),
90 worker_host->instance().name(),
91 worker_host->instance().constructor_origin());
92 }
93
WorkerReadyForInspection(mojo::PendingRemote<blink::mojom::DevToolsAgent> agent_remote,mojo::PendingReceiver<blink::mojom::DevToolsAgentHost> agent_host_receiver)94 void SharedWorkerDevToolsAgentHost::WorkerReadyForInspection(
95 mojo::PendingRemote<blink::mojom::DevToolsAgent> agent_remote,
96 mojo::PendingReceiver<blink::mojom::DevToolsAgentHost>
97 agent_host_receiver) {
98 DCHECK_EQ(WORKER_NOT_READY, state_);
99 DCHECK(worker_host_);
100 state_ = WORKER_READY;
101 GetRendererChannel()->SetRenderer(std::move(agent_remote),
102 std::move(agent_host_receiver),
103 worker_host_->GetProcessHost()->GetID());
104 for (auto* inspector : protocol::InspectorHandler::ForAgentHost(this))
105 inspector->TargetReloadedAfterCrash();
106 }
107
WorkerRestarted(SharedWorkerHost * worker_host)108 void SharedWorkerDevToolsAgentHost::WorkerRestarted(
109 SharedWorkerHost* worker_host) {
110 DCHECK_EQ(WORKER_TERMINATED, state_);
111 DCHECK(!worker_host_);
112 state_ = WORKER_NOT_READY;
113 worker_host_ = worker_host;
114 }
115
WorkerDestroyed()116 void SharedWorkerDevToolsAgentHost::WorkerDestroyed() {
117 DCHECK_NE(WORKER_TERMINATED, state_);
118 DCHECK(worker_host_);
119 state_ = WORKER_TERMINATED;
120 for (auto* inspector : protocol::InspectorHandler::ForAgentHost(this))
121 inspector->TargetCrashed();
122 worker_host_ = nullptr;
123 GetRendererChannel()->SetRenderer(mojo::NullRemote(), mojo::NullReceiver(),
124 ChildProcessHost::kInvalidUniqueID);
125 }
126
127 } // namespace content
128