Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(172)

Side by Side Diff: content/browser/devtools/worker_devtools_agent_host.cc

Issue 2864103002: [DevTools] Support multiple DevToolsMessageChunkProcessor instances (Closed)
Patch Set: fix Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 "base/guid.h" 7 #include "base/guid.h"
8 #include "base/memory/ptr_util.h" 8 #include "base/memory/ptr_util.h"
9 #include "content/browser/devtools/devtools_session.h" 9 #include "content/browser/devtools/devtools_session.h"
10 #include "content/browser/devtools/protocol/inspector_handler.h" 10 #include "content/browser/devtools/protocol/inspector_handler.h"
(...skipping 12 matching lines...) Expand all
23 23
24 void WorkerDevToolsAgentHost::AttachSession(DevToolsSession* session) { 24 void WorkerDevToolsAgentHost::AttachSession(DevToolsSession* session) {
25 if (state_ != WORKER_INSPECTED) { 25 if (state_ != WORKER_INSPECTED) {
26 state_ = WORKER_INSPECTED; 26 state_ = WORKER_INSPECTED;
27 AttachToWorker(); 27 AttachToWorker();
28 } 28 }
29 if (RenderProcessHost* host = RenderProcessHost::FromID(worker_id_.first)) { 29 if (RenderProcessHost* host = RenderProcessHost::FromID(worker_id_.first)) {
30 host->Send(new DevToolsAgentMsg_Attach( 30 host->Send(new DevToolsAgentMsg_Attach(
31 worker_id_.second, GetId(), session->session_id())); 31 worker_id_.second, GetId(), session->session_id()));
32 } 32 }
33 chunk_processors_[session->session_id()].reset(
34 new DevToolsMessageChunkProcessor(
35 base::Bind(&WorkerDevToolsAgentHost::SendChunkedMessage,
36 base::Unretained(this))));
33 session->SetFallThroughForNotFound(true); 37 session->SetFallThroughForNotFound(true);
34 session->AddHandler(base::WrapUnique(new protocol::InspectorHandler())); 38 session->AddHandler(base::WrapUnique(new protocol::InspectorHandler()));
35 session->AddHandler(base::WrapUnique(new protocol::NetworkHandler())); 39 session->AddHandler(base::WrapUnique(new protocol::NetworkHandler()));
36 session->AddHandler(base::WrapUnique(new protocol::SchemaHandler())); 40 session->AddHandler(base::WrapUnique(new protocol::SchemaHandler()));
37 OnAttachedStateChanged(true); 41 OnAttachedStateChanged(true);
38 } 42 }
39 43
40 void WorkerDevToolsAgentHost::DetachSession(int session_id) { 44 void WorkerDevToolsAgentHost::DetachSession(int session_id) {
41 if (RenderProcessHost* host = RenderProcessHost::FromID(worker_id_.first)) 45 if (RenderProcessHost* host = RenderProcessHost::FromID(worker_id_.first))
42 host->Send(new DevToolsAgentMsg_Detach(worker_id_.second, session_id)); 46 host->Send(new DevToolsAgentMsg_Detach(worker_id_.second, session_id));
47 chunk_processors_.erase(session_id);
43 OnAttachedStateChanged(false); 48 OnAttachedStateChanged(false);
44 if (state_ == WORKER_INSPECTED) { 49 if (state_ == WORKER_INSPECTED) {
45 state_ = WORKER_UNINSPECTED; 50 state_ = WORKER_UNINSPECTED;
46 DetachFromWorker(); 51 DetachFromWorker();
47 } else if (state_ == WORKER_PAUSED_FOR_REATTACH) { 52 } else if (state_ == WORKER_PAUSED_FOR_REATTACH) {
48 state_ = WORKER_UNINSPECTED; 53 state_ = WORKER_UNINSPECTED;
49 } 54 }
50 } 55 }
51 56
52 bool WorkerDevToolsAgentHost::DispatchProtocolMessage( 57 bool WorkerDevToolsAgentHost::DispatchProtocolMessage(
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
95 return state_ == WORKER_INSPECTED || state_ == WORKER_UNINSPECTED || 100 return state_ == WORKER_INSPECTED || state_ == WORKER_UNINSPECTED ||
96 state_ == WORKER_READY_FOR_DEBUG_ON_START; 101 state_ == WORKER_READY_FOR_DEBUG_ON_START;
97 } 102 }
98 103
99 void WorkerDevToolsAgentHost::WorkerReadyForInspection() { 104 void WorkerDevToolsAgentHost::WorkerReadyForInspection() {
100 if (state_ == WORKER_PAUSED_FOR_REATTACH) { 105 if (state_ == WORKER_PAUSED_FOR_REATTACH) {
101 DCHECK(IsAttached()); 106 DCHECK(IsAttached());
102 state_ = WORKER_INSPECTED; 107 state_ = WORKER_INSPECTED;
103 AttachToWorker(); 108 AttachToWorker();
104 if (RenderProcessHost* host = RenderProcessHost::FromID(worker_id_.first)) { 109 if (RenderProcessHost* host = RenderProcessHost::FromID(worker_id_.first)) {
110 std::string state_cookie;
111 auto it = chunk_processors_.find(session()->session_id());
112 if (it != chunk_processors_.end())
113 state_cookie = it->second->state_cookie();
105 host->Send(new DevToolsAgentMsg_Reattach( 114 host->Send(new DevToolsAgentMsg_Reattach(
106 worker_id_.second, GetId(), session()->session_id(), 115 worker_id_.second, GetId(), session()->session_id(), state_cookie));
107 chunk_processor_.state_cookie()));
108 } 116 }
109 OnAttachedStateChanged(true); 117 OnAttachedStateChanged(true);
110 } else if (state_ == WORKER_PAUSED_FOR_DEBUG_ON_START) { 118 } else if (state_ == WORKER_PAUSED_FOR_DEBUG_ON_START) {
111 state_ = WORKER_READY_FOR_DEBUG_ON_START; 119 state_ = WORKER_READY_FOR_DEBUG_ON_START;
112 } 120 }
113 } 121 }
114 122
115 void WorkerDevToolsAgentHost::WorkerRestarted(WorkerId worker_id) { 123 void WorkerDevToolsAgentHost::WorkerRestarted(WorkerId worker_id) {
116 DCHECK_EQ(WORKER_TERMINATED, state_); 124 DCHECK_EQ(WORKER_TERMINATED, state_);
117 state_ = IsAttached() ? WORKER_PAUSED_FOR_REATTACH : WORKER_UNINSPECTED; 125 state_ = IsAttached() ? WORKER_PAUSED_FOR_REATTACH : WORKER_UNINSPECTED;
(...skipping 12 matching lines...) Expand all
130 state_ = WORKER_TERMINATED; 138 state_ = WORKER_TERMINATED;
131 Release(); // Balanced in WorkerCreated(). 139 Release(); // Balanced in WorkerCreated().
132 } 140 }
133 141
134 bool WorkerDevToolsAgentHost::IsTerminated() { 142 bool WorkerDevToolsAgentHost::IsTerminated() {
135 return state_ == WORKER_TERMINATED; 143 return state_ == WORKER_TERMINATED;
136 } 144 }
137 145
138 WorkerDevToolsAgentHost::WorkerDevToolsAgentHost(WorkerId worker_id) 146 WorkerDevToolsAgentHost::WorkerDevToolsAgentHost(WorkerId worker_id)
139 : DevToolsAgentHostImpl(base::GenerateGUID()), 147 : DevToolsAgentHostImpl(base::GenerateGUID()),
140 chunk_processor_(base::Bind(&WorkerDevToolsAgentHost::SendMessageToClient,
141 base::Unretained(this))),
142 state_(WORKER_UNINSPECTED), 148 state_(WORKER_UNINSPECTED),
143 worker_id_(worker_id) { 149 worker_id_(worker_id) {
144 WorkerCreated(); 150 WorkerCreated();
145 } 151 }
146 152
147 WorkerDevToolsAgentHost::~WorkerDevToolsAgentHost() { 153 WorkerDevToolsAgentHost::~WorkerDevToolsAgentHost() {
148 DCHECK_EQ(WORKER_TERMINATED, state_); 154 DCHECK_EQ(WORKER_TERMINATED, state_);
149 } 155 }
150 156
151 void WorkerDevToolsAgentHost::OnAttachedStateChanged(bool attached) { 157 void WorkerDevToolsAgentHost::OnAttachedStateChanged(bool attached) {
152 } 158 }
153 159
154 void WorkerDevToolsAgentHost::AttachToWorker() { 160 void WorkerDevToolsAgentHost::AttachToWorker() {
155 if (RenderProcessHost* host = RenderProcessHost::FromID(worker_id_.first)) 161 if (RenderProcessHost* host = RenderProcessHost::FromID(worker_id_.first))
156 host->AddRoute(worker_id_.second, this); 162 host->AddRoute(worker_id_.second, this);
157 } 163 }
158 164
159 void WorkerDevToolsAgentHost::DetachFromWorker() { 165 void WorkerDevToolsAgentHost::DetachFromWorker() {
160 if (RenderProcessHost* host = RenderProcessHost::FromID(worker_id_.first)) 166 if (RenderProcessHost* host = RenderProcessHost::FromID(worker_id_.first))
161 host->RemoveRoute(worker_id_.second); 167 host->RemoveRoute(worker_id_.second);
162 } 168 }
163 169
164 void WorkerDevToolsAgentHost::WorkerCreated() { 170 void WorkerDevToolsAgentHost::WorkerCreated() {
165 AddRef(); // Balanced in WorkerDestroyed() 171 AddRef(); // Balanced in WorkerDestroyed()
166 } 172 }
167 173
168 void WorkerDevToolsAgentHost::OnDispatchOnInspectorFrontend( 174 void WorkerDevToolsAgentHost::OnDispatchOnInspectorFrontend(
169 const DevToolsMessageChunk& message) { 175 const DevToolsMessageChunk& message) {
170 if (!IsAttached()) 176 auto it = chunk_processors_.find(message.session_id);
171 return; 177 if (it != chunk_processors_.end())
178 it->second->ProcessChunkedMessageFromAgent(message);
179 }
172 180
173 chunk_processor_.ProcessChunkedMessageFromAgent(message); 181 void WorkerDevToolsAgentHost::SendChunkedMessage(int session_id,
182 const std::string& message) {
183 if (session() && session()->session_id() == session_id)
184 session()->SendMessageToClient(message);
174 } 185 }
175 186
176 } // namespace content 187 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/devtools/worker_devtools_agent_host.h ('k') | content/renderer/devtools/devtools_agent.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698