| 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 "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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |