1 // Copyright 2018 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/worker_devtools_agent_host.h"
6
7 #include "base/bind.h"
8 #include "content/browser/devtools/devtools_session.h"
9 #include "content/browser/devtools/protocol/io_handler.h"
10 #include "content/browser/devtools/protocol/network_handler.h"
11 #include "content/browser/devtools/protocol/target_handler.h"
12 #include "content/browser/devtools/shared_worker_devtools_agent_host.h"
13 #include "content/browser/renderer_host/render_process_host_impl.h"
14 #include "content/browser/storage_partition_impl.h"
15 #include "content/browser/worker_host/dedicated_worker_host.h"
16 #include "content/public/common/child_process_host.h"
17
18 namespace content {
19
WorkerDevToolsAgentHost(int process_id,mojo::PendingRemote<blink::mojom::DevToolsAgent> agent_remote,mojo::PendingReceiver<blink::mojom::DevToolsAgentHost> host_receiver,const GURL & url,const std::string & name,const base::UnguessableToken & devtools_worker_token,const std::string & parent_id,base::OnceCallback<void (DevToolsAgentHostImpl *)> destroyed_callback)20 WorkerDevToolsAgentHost::WorkerDevToolsAgentHost(
21 int process_id,
22 mojo::PendingRemote<blink::mojom::DevToolsAgent> agent_remote,
23 mojo::PendingReceiver<blink::mojom::DevToolsAgentHost> host_receiver,
24 const GURL& url,
25 const std::string& name,
26 const base::UnguessableToken& devtools_worker_token,
27 const std::string& parent_id,
28 base::OnceCallback<void(DevToolsAgentHostImpl*)> destroyed_callback)
29 : DevToolsAgentHostImpl(devtools_worker_token.ToString()),
30 process_id_(process_id),
31 url_(url),
32 name_(name),
33 parent_id_(parent_id),
34 destroyed_callback_(std::move(destroyed_callback)),
35 devtools_worker_token_(devtools_worker_token) {
36 DCHECK(agent_remote);
37 DCHECK(!devtools_worker_token.is_empty());
38 AddRef(); // Self keep-alive while the worker agent is alive.
39 base::OnceClosure connection_error = (base::BindOnce(
40 &WorkerDevToolsAgentHost::Disconnected, base::Unretained(this)));
41 NotifyCreated();
42 GetRendererChannel()->SetRenderer(std::move(agent_remote),
43 std::move(host_receiver), process_id,
44 std::move(connection_error));
45 }
46
47 WorkerDevToolsAgentHost::~WorkerDevToolsAgentHost() = default;
48
Disconnected()49 void WorkerDevToolsAgentHost::Disconnected() {
50 ForceDetachAllSessions();
51 GetRendererChannel()->SetRenderer(mojo::NullRemote(), mojo::NullReceiver(),
52 ChildProcessHost::kInvalidUniqueID);
53 std::move(destroyed_callback_).Run(this);
54 Release(); // Matches AddRef() in constructor.
55 }
56
GetBrowserContext()57 BrowserContext* WorkerDevToolsAgentHost::GetBrowserContext() {
58 RenderProcessHost* process = RenderProcessHost::FromID(process_id_);
59 return process ? process->GetBrowserContext() : nullptr;
60 }
61
GetType()62 std::string WorkerDevToolsAgentHost::GetType() {
63 return kTypeDedicatedWorker;
64 }
65
GetTitle()66 std::string WorkerDevToolsAgentHost::GetTitle() {
67 return name_.empty() ? url_.spec() : name_;
68 }
69
GetParentId()70 std::string WorkerDevToolsAgentHost::GetParentId() {
71 return parent_id_;
72 }
73
GetURL()74 GURL WorkerDevToolsAgentHost::GetURL() {
75 return url_;
76 }
77
Activate()78 bool WorkerDevToolsAgentHost::Activate() {
79 return false;
80 }
81
Reload()82 void WorkerDevToolsAgentHost::Reload() {}
83
Close()84 bool WorkerDevToolsAgentHost::Close() {
85 return false;
86 }
87
AttachSession(DevToolsSession * session,bool acquire_wake_lock)88 bool WorkerDevToolsAgentHost::AttachSession(DevToolsSession* session,
89 bool acquire_wake_lock) {
90 session->AddHandler(std::make_unique<protocol::IOHandler>(GetIOContext()));
91 session->AddHandler(std::make_unique<protocol::TargetHandler>(
92 protocol::TargetHandler::AccessMode::kAutoAttachOnly, GetId(),
93 GetRendererChannel(), session->GetRootSession()));
94 session->AddHandler(std::make_unique<protocol::NetworkHandler>(
95 GetId(), devtools_worker_token_, GetIOContext(), base::DoNothing()));
96 return true;
97 }
98
DetachSession(DevToolsSession * session)99 void WorkerDevToolsAgentHost::DetachSession(DevToolsSession* session) {
100 // Destroying session automatically detaches in renderer.
101 }
102
GetDedicatedWorkerHost()103 DedicatedWorkerHost* WorkerDevToolsAgentHost::GetDedicatedWorkerHost() {
104 RenderProcessHost* process = RenderProcessHost::FromID(process_id_);
105 auto* storage_partition_impl =
106 static_cast<StoragePartitionImpl*>(process->GetStoragePartition());
107 auto* service = storage_partition_impl->GetDedicatedWorkerService();
108 return service->GetDedicatedWorkerHostFromToken(
109 blink::DedicatedWorkerToken(devtools_worker_token_));
110 }
111
112 base::Optional<network::CrossOriginEmbedderPolicy>
cross_origin_embedder_policy(const std::string &)113 WorkerDevToolsAgentHost::cross_origin_embedder_policy(const std::string&) {
114 DedicatedWorkerHost* host = GetDedicatedWorkerHost();
115 if (!host) {
116 return base::nullopt;
117 }
118 return host->cross_origin_embedder_policy();
119 }
120
121 } // namespace content
122