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