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.
5 #include "content/browser/devtools/worker_devtools_agent_host.h"
7 #include "content/browser/devtools/ipc_devtools_agent_host.h"
8 #include "content/browser/devtools/protocol/devtools_protocol_handler.h"
9 #include "content/public/browser/browser_thread.h"
10 #include "content/public/browser/render_process_host.h"
14 bool WorkerDevToolsAgentHost::IsWorker() const {
18 BrowserContext
* WorkerDevToolsAgentHost::GetBrowserContext() {
19 RenderProcessHost
* rph
= RenderProcessHost::FromID(worker_id_
.first
);
20 return rph
? rph
->GetBrowserContext() : nullptr;
23 void WorkerDevToolsAgentHost::SendMessageToAgent(
24 IPC::Message
* message_raw
) {
25 scoped_ptr
<IPC::Message
> message(message_raw
);
26 if (state_
!= WORKER_INSPECTED
)
28 if (RenderProcessHost
* host
= RenderProcessHost::FromID(worker_id_
.first
)) {
29 message
->set_routing_id(worker_id_
.second
);
30 host
->Send(message
.release());
34 void WorkerDevToolsAgentHost::Attach() {
35 if (state_
!= WORKER_INSPECTED
) {
36 state_
= WORKER_INSPECTED
;
39 IPCDevToolsAgentHost::Attach();
42 void WorkerDevToolsAgentHost::OnClientAttached() {
43 DevToolsAgentHostImpl::NotifyCallbacks(this, true);
46 void WorkerDevToolsAgentHost::OnClientDetached() {
47 if (state_
== WORKER_INSPECTED
) {
48 state_
= WORKER_UNINSPECTED
;
50 } else if (state_
== WORKER_PAUSED_FOR_REATTACH
) {
51 state_
= WORKER_UNINSPECTED
;
53 DevToolsAgentHostImpl::NotifyCallbacks(this, false);
56 bool WorkerDevToolsAgentHost::OnMessageReceived(
57 const IPC::Message
& msg
) {
58 DCHECK_CURRENTLY_ON(BrowserThread::UI
);
60 IPC_BEGIN_MESSAGE_MAP(WorkerDevToolsAgentHost
, msg
)
61 IPC_MESSAGE_HANDLER(DevToolsClientMsg_DispatchOnInspectorFrontend
,
62 OnDispatchOnInspectorFrontend
)
63 IPC_MESSAGE_UNHANDLED(handled
= false)
68 void WorkerDevToolsAgentHost::PauseForDebugOnStart() {
69 DCHECK(state_
== WORKER_UNINSPECTED
);
70 state_
= WORKER_PAUSED_FOR_DEBUG_ON_START
;
73 bool WorkerDevToolsAgentHost::IsPausedForDebugOnStart() {
74 return state_
== WORKER_PAUSED_FOR_DEBUG_ON_START
;
77 void WorkerDevToolsAgentHost::WorkerReadyForInspection() {
78 if (state_
== WORKER_PAUSED_FOR_REATTACH
) {
80 state_
= WORKER_INSPECTED
;
86 void WorkerDevToolsAgentHost::WorkerRestarted(WorkerId worker_id
) {
87 DCHECK_EQ(WORKER_TERMINATED
, state_
);
88 state_
= IsAttached() ? WORKER_PAUSED_FOR_REATTACH
: WORKER_UNINSPECTED
;
89 worker_id_
= worker_id
;
93 void WorkerDevToolsAgentHost::WorkerDestroyed() {
94 DCHECK_NE(WORKER_TERMINATED
, state_
);
95 if (state_
== WORKER_INSPECTED
) {
97 // Client host is debugging this worker agent host.
98 base::Callback
<void(const std::string
&)> raw_message_callback(
99 base::Bind(&WorkerDevToolsAgentHost::SendMessageToClient
,
100 base::Unretained(this)));
101 devtools::inspector::Client
inspector(raw_message_callback
);
102 inspector
.TargetCrashed(
103 devtools::inspector::TargetCrashedParams::Create());
106 state_
= WORKER_TERMINATED
;
107 Release(); // Balanced in WorkerCreated().
110 bool WorkerDevToolsAgentHost::IsTerminated() {
111 return state_
== WORKER_TERMINATED
;
114 WorkerDevToolsAgentHost::WorkerDevToolsAgentHost(
116 : state_(WORKER_UNINSPECTED
),
117 worker_id_(worker_id
) {
121 WorkerDevToolsAgentHost::~WorkerDevToolsAgentHost() {
122 DCHECK_EQ(WORKER_TERMINATED
, state_
);
125 void WorkerDevToolsAgentHost::AttachToWorker() {
126 if (RenderProcessHost
* host
= RenderProcessHost::FromID(worker_id_
.first
))
127 host
->AddRoute(worker_id_
.second
, this);
130 void WorkerDevToolsAgentHost::DetachFromWorker() {
131 if (RenderProcessHost
* host
= RenderProcessHost::FromID(worker_id_
.first
))
132 host
->RemoveRoute(worker_id_
.second
);
135 void WorkerDevToolsAgentHost::WorkerCreated() {
136 AddRef(); // Balanced in WorkerDestroyed()
139 void WorkerDevToolsAgentHost::OnDispatchOnInspectorFrontend(
140 const DevToolsMessageChunk
& message
) {
144 ProcessChunkedMessageFromAgent(message
);
147 } // namespace content