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/target_handler.h"
10 #include "content/browser/renderer_host/render_process_host_impl.h"
11 #include "content/public/common/child_process_host.h"
12 
13 namespace content {
14 
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)15 WorkerDevToolsAgentHost::WorkerDevToolsAgentHost(
16     int process_id,
17     mojo::PendingRemote<blink::mojom::DevToolsAgent> agent_remote,
18     mojo::PendingReceiver<blink::mojom::DevToolsAgentHost> host_receiver,
19     const GURL& url,
20     const std::string& name,
21     const base::UnguessableToken& devtools_worker_token,
22     const std::string& parent_id,
23     base::OnceCallback<void(DevToolsAgentHostImpl*)> destroyed_callback)
24     : DevToolsAgentHostImpl(devtools_worker_token.ToString()),
25       process_id_(process_id),
26       url_(url),
27       name_(name),
28       parent_id_(parent_id),
29       destroyed_callback_(std::move(destroyed_callback)) {
30   DCHECK(agent_remote);
31   DCHECK(!devtools_worker_token.is_empty());
32   AddRef();  // Self keep-alive while the worker agent is alive.
33   base::OnceClosure connection_error = (base::BindOnce(
34       &WorkerDevToolsAgentHost::Disconnected, base::Unretained(this)));
35   NotifyCreated();
36   GetRendererChannel()->SetRenderer(std::move(agent_remote),
37                                     std::move(host_receiver), process_id,
38                                     std::move(connection_error));
39 }
40 
41 WorkerDevToolsAgentHost::~WorkerDevToolsAgentHost() = default;
42 
Disconnected()43 void WorkerDevToolsAgentHost::Disconnected() {
44   ForceDetachAllSessions();
45   GetRendererChannel()->SetRenderer(mojo::NullRemote(), mojo::NullReceiver(),
46                                     ChildProcessHost::kInvalidUniqueID);
47   std::move(destroyed_callback_).Run(this);
48   Release();  // Matches AddRef() in constructor.
49 }
50 
GetBrowserContext()51 BrowserContext* WorkerDevToolsAgentHost::GetBrowserContext() {
52   RenderProcessHost* process = RenderProcessHost::FromID(process_id_);
53   return process ? process->GetBrowserContext() : nullptr;
54 }
55 
GetType()56 std::string WorkerDevToolsAgentHost::GetType() {
57   return kTypeDedicatedWorker;
58 }
59 
GetTitle()60 std::string WorkerDevToolsAgentHost::GetTitle() {
61   return name_.empty() ? url_.spec() : name_;
62 }
63 
GetParentId()64 std::string WorkerDevToolsAgentHost::GetParentId() {
65   return parent_id_;
66 }
67 
GetURL()68 GURL WorkerDevToolsAgentHost::GetURL() {
69   return url_;
70 }
71 
Activate()72 bool WorkerDevToolsAgentHost::Activate() {
73   return false;
74 }
75 
Reload()76 void WorkerDevToolsAgentHost::Reload() {}
77 
Close()78 bool WorkerDevToolsAgentHost::Close() {
79   return false;
80 }
81 
AttachSession(DevToolsSession * session)82 bool WorkerDevToolsAgentHost::AttachSession(DevToolsSession* session) {
83   session->AddHandler(std::make_unique<protocol::TargetHandler>(
84       protocol::TargetHandler::AccessMode::kAutoAttachOnly, GetId(),
85       GetRendererChannel(), session->GetRootSession()));
86   return true;
87 }
88 
DetachSession(DevToolsSession * session)89 void WorkerDevToolsAgentHost::DetachSession(DevToolsSession* session) {
90   // Destroying session automatically detaches in renderer.
91 }
92 
93 }  // namespace content
94