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