OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "content/browser/devtools/worker_devtools_agent_host.h" | 5 #include "content/browser/devtools/worker_devtools_agent_host.h" |
6 | 6 |
7 #include "content/browser/devtools/devtools_protocol_handler.h" | 7 #include "content/browser/devtools/devtools_protocol_handler.h" |
8 #include "content/public/browser/browser_thread.h" | 8 #include "content/public/browser/browser_thread.h" |
9 #include "content/public/browser/render_process_host.h" | 9 #include "content/public/browser/render_process_host.h" |
10 | 10 |
11 namespace content { | 11 namespace content { |
12 | 12 |
13 BrowserContext* WorkerDevToolsAgentHost::GetBrowserContext() { | 13 BrowserContext* WorkerDevToolsAgentHost::GetBrowserContext() { |
14 RenderProcessHost* rph = RenderProcessHost::FromID(worker_id_.first); | 14 RenderProcessHost* rph = RenderProcessHost::FromID(worker_id_.first); |
15 return rph ? rph->GetBrowserContext() : nullptr; | 15 return rph ? rph->GetBrowserContext() : nullptr; |
16 } | 16 } |
17 | 17 |
18 void WorkerDevToolsAgentHost::Attach() { | 18 void WorkerDevToolsAgentHost::Attach() { |
19 if (state_ != WORKER_INSPECTED) { | 19 if (state_ != WORKER_INSPECTED) { |
20 state_ = WORKER_INSPECTED; | 20 state_ = WORKER_INSPECTED; |
21 AttachToWorker(); | 21 AttachToWorker(); |
22 } | 22 } |
23 if (RenderProcessHost* host = RenderProcessHost::FromID(worker_id_.first)) | 23 if (RenderProcessHost* host = RenderProcessHost::FromID(worker_id_.first)) |
24 host->Send( | 24 host->Send(new DevToolsAgentMsg_Attach(worker_id_.second, GetId())); |
25 new DevToolsAgentMsg_Attach(worker_id_.second, GetId(), session_id())); | |
26 OnAttachedStateChanged(true); | 25 OnAttachedStateChanged(true); |
27 DevToolsAgentHostImpl::NotifyCallbacks(this, true); | 26 DevToolsAgentHostImpl::NotifyCallbacks(this, true); |
28 } | 27 } |
29 | 28 |
30 void WorkerDevToolsAgentHost::Detach() { | 29 void WorkerDevToolsAgentHost::Detach() { |
31 if (RenderProcessHost* host = RenderProcessHost::FromID(worker_id_.first)) | 30 if (RenderProcessHost* host = RenderProcessHost::FromID(worker_id_.first)) |
32 host->Send(new DevToolsAgentMsg_Detach(worker_id_.second)); | 31 host->Send(new DevToolsAgentMsg_Detach(worker_id_.second)); |
33 OnAttachedStateChanged(false); | 32 OnAttachedStateChanged(false); |
34 if (state_ == WORKER_INSPECTED) { | 33 if (state_ == WORKER_INSPECTED) { |
35 state_ = WORKER_UNINSPECTED; | 34 state_ = WORKER_UNINSPECTED; |
36 DetachFromWorker(); | 35 DetachFromWorker(); |
37 } else if (state_ == WORKER_PAUSED_FOR_REATTACH) { | 36 } else if (state_ == WORKER_PAUSED_FOR_REATTACH) { |
38 state_ = WORKER_UNINSPECTED; | 37 state_ = WORKER_UNINSPECTED; |
39 } | 38 } |
40 DevToolsAgentHostImpl::NotifyCallbacks(this, false); | 39 DevToolsAgentHostImpl::NotifyCallbacks(this, false); |
41 } | 40 } |
42 | 41 |
43 bool WorkerDevToolsAgentHost::DispatchProtocolMessage( | 42 bool WorkerDevToolsAgentHost::DispatchProtocolMessage( |
44 const std::string& message) { | 43 const std::string& message) { |
45 if (state_ != WORKER_INSPECTED) | 44 if (state_ != WORKER_INSPECTED) |
46 return true; | 45 return true; |
47 | 46 |
48 int call_id; | 47 int call_id; |
49 if (protocol_handler_->HandleOptionalMessage(session_id(), message, &call_id)) | 48 if (protocol_handler_->HandleOptionalMessage(message, &call_id)) |
50 return true; | 49 return true; |
51 | 50 |
52 if (RenderProcessHost* host = RenderProcessHost::FromID(worker_id_.first)) { | 51 if (RenderProcessHost* host = RenderProcessHost::FromID(worker_id_.first)) { |
53 host->Send(new DevToolsAgentMsg_DispatchOnInspectorBackend( | 52 host->Send(new DevToolsAgentMsg_DispatchOnInspectorBackend( |
54 worker_id_.second, session_id(), message)); | 53 worker_id_.second, message)); |
55 } | 54 } |
56 return true; | 55 return true; |
57 } | 56 } |
58 | 57 |
59 bool WorkerDevToolsAgentHost::OnMessageReceived( | 58 bool WorkerDevToolsAgentHost::OnMessageReceived( |
60 const IPC::Message& msg) { | 59 const IPC::Message& msg) { |
61 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 60 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
62 bool handled = true; | 61 bool handled = true; |
63 IPC_BEGIN_MESSAGE_MAP(WorkerDevToolsAgentHost, msg) | 62 IPC_BEGIN_MESSAGE_MAP(WorkerDevToolsAgentHost, msg) |
64 IPC_MESSAGE_HANDLER(DevToolsClientMsg_DispatchOnInspectorFrontend, | 63 IPC_MESSAGE_HANDLER(DevToolsClientMsg_DispatchOnInspectorFrontend, |
(...skipping 12 matching lines...) Expand all Loading... |
77 return state_ == WORKER_PAUSED_FOR_DEBUG_ON_START; | 76 return state_ == WORKER_PAUSED_FOR_DEBUG_ON_START; |
78 } | 77 } |
79 | 78 |
80 void WorkerDevToolsAgentHost::WorkerReadyForInspection() { | 79 void WorkerDevToolsAgentHost::WorkerReadyForInspection() { |
81 if (state_ == WORKER_PAUSED_FOR_REATTACH) { | 80 if (state_ == WORKER_PAUSED_FOR_REATTACH) { |
82 DCHECK(IsAttached()); | 81 DCHECK(IsAttached()); |
83 state_ = WORKER_INSPECTED; | 82 state_ = WORKER_INSPECTED; |
84 AttachToWorker(); | 83 AttachToWorker(); |
85 if (RenderProcessHost* host = RenderProcessHost::FromID(worker_id_.first)) { | 84 if (RenderProcessHost* host = RenderProcessHost::FromID(worker_id_.first)) { |
86 host->Send(new DevToolsAgentMsg_Reattach( | 85 host->Send(new DevToolsAgentMsg_Reattach( |
87 worker_id_.second, GetId(), session_id(), | 86 worker_id_.second, GetId(), chunk_processor_.state_cookie())); |
88 chunk_processor_.state_cookie())); | |
89 } | 87 } |
90 OnAttachedStateChanged(true); | 88 OnAttachedStateChanged(true); |
91 } | 89 } |
92 } | 90 } |
93 | 91 |
94 void WorkerDevToolsAgentHost::WorkerRestarted(WorkerId worker_id) { | 92 void WorkerDevToolsAgentHost::WorkerRestarted(WorkerId worker_id) { |
95 DCHECK_EQ(WORKER_TERMINATED, state_); | 93 DCHECK_EQ(WORKER_TERMINATED, state_); |
96 state_ = IsAttached() ? WORKER_PAUSED_FOR_REATTACH : WORKER_UNINSPECTED; | 94 state_ = IsAttached() ? WORKER_PAUSED_FOR_REATTACH : WORKER_UNINSPECTED; |
97 worker_id_ = worker_id; | 95 worker_id_ = worker_id; |
98 WorkerCreated(); | 96 WorkerCreated(); |
99 } | 97 } |
100 | 98 |
101 void WorkerDevToolsAgentHost::WorkerDestroyed() { | 99 void WorkerDevToolsAgentHost::WorkerDestroyed() { |
102 DCHECK_NE(WORKER_TERMINATED, state_); | 100 DCHECK_NE(WORKER_TERMINATED, state_); |
103 if (state_ == WORKER_INSPECTED) { | 101 if (state_ == WORKER_INSPECTED) { |
104 DCHECK(IsAttached()); | 102 DCHECK(IsAttached()); |
105 // Client host is debugging this worker agent host. | 103 // Client host is debugging this worker agent host. |
106 devtools::inspector::Client inspector(this); | 104 base::Callback<void(const std::string&)> raw_message_callback( |
| 105 base::Bind(&WorkerDevToolsAgentHost::SendMessageToClient, |
| 106 base::Unretained(this))); |
| 107 devtools::inspector::Client inspector(raw_message_callback); |
107 inspector.TargetCrashed( | 108 inspector.TargetCrashed( |
108 devtools::inspector::TargetCrashedParams::Create()); | 109 devtools::inspector::TargetCrashedParams::Create()); |
109 DetachFromWorker(); | 110 DetachFromWorker(); |
110 } | 111 } |
111 state_ = WORKER_TERMINATED; | 112 state_ = WORKER_TERMINATED; |
112 Release(); // Balanced in WorkerCreated(). | 113 Release(); // Balanced in WorkerCreated(). |
113 } | 114 } |
114 | 115 |
115 bool WorkerDevToolsAgentHost::IsTerminated() { | 116 bool WorkerDevToolsAgentHost::IsTerminated() { |
116 return state_ == WORKER_TERMINATED; | 117 return state_ == WORKER_TERMINATED; |
117 } | 118 } |
118 | 119 |
119 WorkerDevToolsAgentHost::WorkerDevToolsAgentHost(WorkerId worker_id) | 120 WorkerDevToolsAgentHost::WorkerDevToolsAgentHost( |
120 : protocol_handler_(new DevToolsProtocolHandler(this)), | 121 WorkerId worker_id) |
121 chunk_processor_(base::Bind(&WorkerDevToolsAgentHost::SendMessageToClient, | 122 : protocol_handler_(new DevToolsProtocolHandler( |
122 base::Unretained(this))), | 123 this, |
| 124 base::Bind(&WorkerDevToolsAgentHost::SendMessageToClient, |
| 125 base::Unretained(this)))), |
| 126 chunk_processor_( |
| 127 base::Bind(&WorkerDevToolsAgentHost::SendMessageToClient, |
| 128 base::Unretained(this))), |
123 state_(WORKER_UNINSPECTED), | 129 state_(WORKER_UNINSPECTED), |
124 worker_id_(worker_id) { | 130 worker_id_(worker_id) { |
125 WorkerCreated(); | 131 WorkerCreated(); |
126 } | 132 } |
127 | 133 |
128 WorkerDevToolsAgentHost::~WorkerDevToolsAgentHost() { | 134 WorkerDevToolsAgentHost::~WorkerDevToolsAgentHost() { |
129 DCHECK_EQ(WORKER_TERMINATED, state_); | 135 DCHECK_EQ(WORKER_TERMINATED, state_); |
130 } | 136 } |
131 | 137 |
132 void WorkerDevToolsAgentHost::OnAttachedStateChanged(bool attached) { | 138 void WorkerDevToolsAgentHost::OnAttachedStateChanged(bool attached) { |
(...skipping 15 matching lines...) Expand all Loading... |
148 | 154 |
149 void WorkerDevToolsAgentHost::OnDispatchOnInspectorFrontend( | 155 void WorkerDevToolsAgentHost::OnDispatchOnInspectorFrontend( |
150 const DevToolsMessageChunk& message) { | 156 const DevToolsMessageChunk& message) { |
151 if (!IsAttached()) | 157 if (!IsAttached()) |
152 return; | 158 return; |
153 | 159 |
154 chunk_processor_.ProcessChunkedMessageFromAgent(message); | 160 chunk_processor_.ProcessChunkedMessageFromAgent(message); |
155 } | 161 } |
156 | 162 |
157 } // namespace content | 163 } // namespace content |
OLD | NEW |