favor DCHECK_CURRENTLY_ON for better logs in content/browser/[a-d]*
[chromium-blink-merge.git] / content / browser / devtools / worker_devtools_agent_host.cc
blob204435aafba66c8c6339faf739389807f95d73ff
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"
12 namespace content {
14 bool WorkerDevToolsAgentHost::IsWorker() const {
15 return true;
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)
27 return;
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;
37 AttachToWorker();
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;
49 DetachFromWorker();
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);
59 bool handled = true;
60 IPC_BEGIN_MESSAGE_MAP(WorkerDevToolsAgentHost, msg)
61 IPC_MESSAGE_HANDLER(DevToolsClientMsg_DispatchOnInspectorFrontend,
62 OnDispatchOnInspectorFrontend)
63 IPC_MESSAGE_UNHANDLED(handled = false)
64 IPC_END_MESSAGE_MAP()
65 return handled;
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) {
79 DCHECK(IsAttached());
80 state_ = WORKER_INSPECTED;
81 AttachToWorker();
82 Reattach();
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;
90 WorkerCreated();
93 void WorkerDevToolsAgentHost::WorkerDestroyed() {
94 DCHECK_NE(WORKER_TERMINATED, state_);
95 if (state_ == WORKER_INSPECTED) {
96 DCHECK(IsAttached());
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());
104 DetachFromWorker();
106 state_ = WORKER_TERMINATED;
107 Release(); // Balanced in WorkerCreated().
110 bool WorkerDevToolsAgentHost::IsTerminated() {
111 return state_ == WORKER_TERMINATED;
114 WorkerDevToolsAgentHost::WorkerDevToolsAgentHost(
115 WorkerId worker_id)
116 : state_(WORKER_UNINSPECTED),
117 worker_id_(worker_id) {
118 WorkerCreated();
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) {
141 if (!IsAttached())
142 return;
144 ProcessChunkedMessageFromAgent(message);
147 } // namespace content