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