OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/render_frame_devtools_agent_host.h" | 5 #include "content/browser/devtools/render_frame_devtools_agent_host.h" |
6 | 6 |
7 #include "base/basictypes.h" | 7 #include "base/basictypes.h" |
8 #include "base/lazy_instance.h" | 8 #include "base/lazy_instance.h" |
9 #include "base/strings/utf_string_conversions.h" | 9 #include "base/strings/utf_string_conversions.h" |
10 #include "content/browser/child_process_security_policy_impl.h" | 10 #include "content/browser/child_process_security_policy_impl.h" |
(...skipping 10 matching lines...) Expand all Loading... |
21 #include "content/browser/devtools/protocol/service_worker_handler.h" | 21 #include "content/browser/devtools/protocol/service_worker_handler.h" |
22 #include "content/browser/devtools/protocol/tracing_handler.h" | 22 #include "content/browser/devtools/protocol/tracing_handler.h" |
23 #include "content/browser/frame_host/render_frame_host_impl.h" | 23 #include "content/browser/frame_host/render_frame_host_impl.h" |
24 #include "content/browser/renderer_host/render_process_host_impl.h" | 24 #include "content/browser/renderer_host/render_process_host_impl.h" |
25 #include "content/browser/renderer_host/render_view_host_impl.h" | 25 #include "content/browser/renderer_host/render_view_host_impl.h" |
26 #include "content/browser/site_instance_impl.h" | 26 #include "content/browser/site_instance_impl.h" |
27 #include "content/browser/web_contents/web_contents_impl.h" | 27 #include "content/browser/web_contents/web_contents_impl.h" |
28 #include "content/common/view_messages.h" | 28 #include "content/common/view_messages.h" |
29 #include "content/public/browser/browser_context.h" | 29 #include "content/public/browser/browser_context.h" |
30 #include "content/public/browser/content_browser_client.h" | 30 #include "content/public/browser/content_browser_client.h" |
31 #include "content/public/browser/notification_service.h" | |
32 #include "content/public/browser/notification_types.h" | |
33 #include "content/public/browser/render_widget_host_iterator.h" | 31 #include "content/public/browser/render_widget_host_iterator.h" |
34 #include "content/public/browser/web_contents_delegate.h" | 32 #include "content/public/browser/web_contents_delegate.h" |
35 | 33 |
36 #if defined(OS_ANDROID) | 34 #if defined(OS_ANDROID) |
37 #include "content/browser/power_save_blocker_impl.h" | 35 #include "content/browser/power_save_blocker_impl.h" |
38 #include "content/public/browser/render_widget_host_view.h" | 36 #include "content/public/browser/render_widget_host_view.h" |
39 #endif | 37 #endif |
40 | 38 |
41 namespace content { | 39 namespace content { |
42 | 40 |
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
134 agent_host->DisconnectRenderFrameHost(); | 132 agent_host->DisconnectRenderFrameHost(); |
135 agent_host->ConnectRenderFrameHost(current); | 133 agent_host->ConnectRenderFrameHost(current); |
136 } | 134 } |
137 | 135 |
138 RenderFrameDevToolsAgentHost::RenderFrameDevToolsAgentHost(RenderFrameHost* rfh) | 136 RenderFrameDevToolsAgentHost::RenderFrameDevToolsAgentHost(RenderFrameHost* rfh) |
139 : render_frame_host_(NULL), | 137 : render_frame_host_(NULL), |
140 dom_handler_(new devtools::dom::DOMHandler()), | 138 dom_handler_(new devtools::dom::DOMHandler()), |
141 input_handler_(new devtools::input::InputHandler()), | 139 input_handler_(new devtools::input::InputHandler()), |
142 inspector_handler_(new devtools::inspector::InspectorHandler()), | 140 inspector_handler_(new devtools::inspector::InspectorHandler()), |
143 network_handler_(new devtools::network::NetworkHandler()), | 141 network_handler_(new devtools::network::NetworkHandler()), |
144 page_handler_(new devtools::page::PageHandler()), | 142 page_handler_(nullptr), |
145 power_handler_(new devtools::power::PowerHandler()), | 143 power_handler_(new devtools::power::PowerHandler()), |
146 service_worker_handler_( | 144 service_worker_handler_( |
147 new devtools::service_worker::ServiceWorkerHandler()), | 145 new devtools::service_worker::ServiceWorkerHandler()), |
148 tracing_handler_(new devtools::tracing::TracingHandler( | 146 tracing_handler_(new devtools::tracing::TracingHandler( |
149 devtools::tracing::TracingHandler::Renderer)), | 147 devtools::tracing::TracingHandler::Renderer)), |
150 emulation_handler_(new devtools::emulation::EmulationHandler( | 148 emulation_handler_(nullptr), |
151 page_handler_.get())), | |
152 frame_trace_recorder_(new DevToolsFrameTraceRecorder()), | 149 frame_trace_recorder_(new DevToolsFrameTraceRecorder()), |
153 reattaching_(false) { | 150 reattaching_(false) { |
154 DevToolsProtocolDispatcher* dispatcher = protocol_handler_->dispatcher(); | 151 DevToolsProtocolDispatcher* dispatcher = protocol_handler_->dispatcher(); |
155 dispatcher->SetDOMHandler(dom_handler_.get()); | 152 dispatcher->SetDOMHandler(dom_handler_.get()); |
156 dispatcher->SetEmulationHandler(emulation_handler_.get()); | |
157 dispatcher->SetInputHandler(input_handler_.get()); | 153 dispatcher->SetInputHandler(input_handler_.get()); |
158 dispatcher->SetInspectorHandler(inspector_handler_.get()); | 154 dispatcher->SetInspectorHandler(inspector_handler_.get()); |
159 dispatcher->SetNetworkHandler(network_handler_.get()); | 155 dispatcher->SetNetworkHandler(network_handler_.get()); |
160 dispatcher->SetPageHandler(page_handler_.get()); | |
161 dispatcher->SetPowerHandler(power_handler_.get()); | 156 dispatcher->SetPowerHandler(power_handler_.get()); |
162 dispatcher->SetServiceWorkerHandler(service_worker_handler_.get()); | 157 dispatcher->SetServiceWorkerHandler(service_worker_handler_.get()); |
163 dispatcher->SetTracingHandler(tracing_handler_.get()); | 158 dispatcher->SetTracingHandler(tracing_handler_.get()); |
| 159 |
| 160 if (!rfh->GetParent()) { |
| 161 page_handler_.reset(new devtools::page::PageHandler()); |
| 162 emulation_handler_.reset( |
| 163 new devtools::emulation::EmulationHandler(page_handler_.get())); |
| 164 dispatcher->SetPageHandler(page_handler_.get()); |
| 165 dispatcher->SetEmulationHandler(emulation_handler_.get()); |
| 166 } |
| 167 |
164 SetRenderFrameHost(rfh); | 168 SetRenderFrameHost(rfh); |
165 g_instances.Get().push_back(this); | 169 g_instances.Get().push_back(this); |
166 AddRef(); // Balanced in RenderFrameHostDestroyed. | 170 AddRef(); // Balanced in RenderFrameHostDestroyed. |
167 DevToolsManager::GetInstance()->AgentHostChanged(this); | 171 DevToolsManager::GetInstance()->AgentHostChanged(this); |
168 } | 172 } |
169 | 173 |
170 BrowserContext* RenderFrameDevToolsAgentHost::GetBrowserContext() { | 174 BrowserContext* RenderFrameDevToolsAgentHost::GetBrowserContext() { |
171 WebContents* contents = web_contents(); | 175 WebContents* contents = web_contents(); |
172 return contents ? contents->GetBrowserContext() : nullptr; | 176 return contents ? contents->GetBrowserContext() : nullptr; |
173 } | 177 } |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
210 power_save_blocker_.get()-> | 214 power_save_blocker_.get()-> |
211 InitDisplaySleepBlocker(rvh->GetView()->GetNativeView()); | 215 InitDisplaySleepBlocker(rvh->GetView()->GetNativeView()); |
212 } | 216 } |
213 #endif | 217 #endif |
214 } | 218 } |
215 | 219 |
216 void RenderFrameDevToolsAgentHost::OnClientDetached() { | 220 void RenderFrameDevToolsAgentHost::OnClientDetached() { |
217 #if defined(OS_ANDROID) | 221 #if defined(OS_ANDROID) |
218 power_save_blocker_.reset(); | 222 power_save_blocker_.reset(); |
219 #endif | 223 #endif |
220 emulation_handler_->Detached(); | 224 if (emulation_handler_) |
221 page_handler_->Detached(); | 225 emulation_handler_->Detached(); |
| 226 if (page_handler_) |
| 227 page_handler_->Detached(); |
222 power_handler_->Detached(); | 228 power_handler_->Detached(); |
223 service_worker_handler_->Detached(); | 229 service_worker_handler_->Detached(); |
224 tracing_handler_->Detached(); | 230 tracing_handler_->Detached(); |
225 ClientDetachedFromRenderer(); | 231 ClientDetachedFromRenderer(); |
226 | 232 |
227 // TODO(kaznacheev): Move this call back to DevToolsManager when | 233 // TODO(kaznacheev): Move this call back to DevToolsManager when |
228 // extensions::ProcessManager no longer relies on this notification. | 234 // extensions::ProcessManager no longer relies on this notification. |
229 if (!reattaching_) | 235 if (!reattaching_) |
230 DevToolsAgentHostImpl::NotifyCallbacks(this, false); | 236 DevToolsAgentHostImpl::NotifyCallbacks(this, false); |
231 } | 237 } |
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
358 bool handled = true; | 364 bool handled = true; |
359 IPC_BEGIN_MESSAGE_MAP(RenderFrameDevToolsAgentHost, message) | 365 IPC_BEGIN_MESSAGE_MAP(RenderFrameDevToolsAgentHost, message) |
360 IPC_MESSAGE_HANDLER(DevToolsClientMsg_DispatchOnInspectorFrontend, | 366 IPC_MESSAGE_HANDLER(DevToolsClientMsg_DispatchOnInspectorFrontend, |
361 OnDispatchOnInspectorFrontend) | 367 OnDispatchOnInspectorFrontend) |
362 IPC_MESSAGE_UNHANDLED(handled = false) | 368 IPC_MESSAGE_UNHANDLED(handled = false) |
363 IPC_END_MESSAGE_MAP() | 369 IPC_END_MESSAGE_MAP() |
364 return handled; | 370 return handled; |
365 } | 371 } |
366 | 372 |
367 void RenderFrameDevToolsAgentHost::DidAttachInterstitialPage() { | 373 void RenderFrameDevToolsAgentHost::DidAttachInterstitialPage() { |
368 page_handler_->DidAttachInterstitialPage(); | 374 if (page_handler_) |
| 375 page_handler_->DidAttachInterstitialPage(); |
369 | 376 |
370 if (!render_frame_host_) | 377 if (!render_frame_host_) |
371 return; | 378 return; |
372 // The rvh set in AboutToNavigateRenderFrame turned out to be interstitial. | 379 // The rvh set in AboutToNavigateRenderFrame turned out to be interstitial. |
373 // Connect back to the real one. | 380 // Connect back to the real one. |
374 WebContents* web_contents = | 381 WebContents* web_contents = |
375 WebContents::FromRenderFrameHost(render_frame_host_); | 382 WebContents::FromRenderFrameHost(render_frame_host_); |
376 if (!web_contents) | 383 if (!web_contents) |
377 return; | 384 return; |
378 DisconnectRenderFrameHost(); | 385 DisconnectRenderFrameHost(); |
379 ConnectRenderFrameHost(web_contents->GetMainFrame()); | 386 ConnectRenderFrameHost(web_contents->GetMainFrame()); |
380 } | 387 } |
381 | 388 |
382 void RenderFrameDevToolsAgentHost::DidDetachInterstitialPage() { | 389 void RenderFrameDevToolsAgentHost::DidDetachInterstitialPage() { |
383 page_handler_->DidDetachInterstitialPage(); | 390 if (page_handler_) |
| 391 page_handler_->DidDetachInterstitialPage(); |
384 } | 392 } |
385 | 393 |
386 void RenderFrameDevToolsAgentHost::TitleWasSet( | 394 void RenderFrameDevToolsAgentHost::TitleWasSet( |
387 NavigationEntry* entry, bool explicit_set) { | 395 NavigationEntry* entry, bool explicit_set) { |
388 DevToolsManager::GetInstance()->AgentHostChanged(this); | 396 DevToolsManager::GetInstance()->AgentHostChanged(this); |
389 } | 397 } |
390 | 398 |
391 void RenderFrameDevToolsAgentHost::NavigationEntryCommitted( | 399 void RenderFrameDevToolsAgentHost::NavigationEntryCommitted( |
392 const LoadCommittedDetails& load_details) { | 400 const LoadCommittedDetails& load_details) { |
393 DevToolsManager::GetInstance()->AgentHostChanged(this); | 401 DevToolsManager::GetInstance()->AgentHostChanged(this); |
394 } | 402 } |
395 | 403 |
396 void RenderFrameDevToolsAgentHost::DidCommitProvisionalLoadForFrame( | 404 void RenderFrameDevToolsAgentHost::DidCommitProvisionalLoadForFrame( |
397 RenderFrameHost* render_frame_host, | 405 RenderFrameHost* render_frame_host, |
398 const GURL& url, | 406 const GURL& url, |
399 ui::PageTransition transition_type) { | 407 ui::PageTransition transition_type) { |
400 service_worker_handler_->UpdateHosts(); | 408 service_worker_handler_->UpdateHosts(); |
401 } | 409 } |
402 | 410 |
403 void RenderFrameDevToolsAgentHost::Observe(int type, | |
404 const NotificationSource& source, | |
405 const NotificationDetails& details) { | |
406 if (type == content::NOTIFICATION_RENDER_WIDGET_VISIBILITY_CHANGED) { | |
407 bool visible = *Details<bool>(details).ptr(); | |
408 page_handler_->OnVisibilityChanged(visible); | |
409 } | |
410 } | |
411 | |
412 void RenderFrameDevToolsAgentHost::SetRenderFrameHost(RenderFrameHost* rfh) { | 411 void RenderFrameDevToolsAgentHost::SetRenderFrameHost(RenderFrameHost* rfh) { |
413 DCHECK(ShouldCreateDevToolsFor(rfh)); | 412 DCHECK(ShouldCreateDevToolsFor(rfh)); |
414 DCHECK(!render_frame_host_); | 413 DCHECK(!render_frame_host_); |
415 render_frame_host_ = static_cast<RenderFrameHostImpl*>(rfh); | 414 render_frame_host_ = static_cast<RenderFrameHostImpl*>(rfh); |
416 | 415 |
417 WebContentsObserver::Observe(WebContents::FromRenderFrameHost(rfh)); | 416 WebContentsObserver::Observe(WebContents::FromRenderFrameHost(rfh)); |
418 RenderViewHostImpl* rvh = static_cast<RenderViewHostImpl*>( | 417 RenderViewHostImpl* rvh = static_cast<RenderViewHostImpl*>( |
419 rfh->GetRenderViewHost()); | 418 rfh->GetRenderViewHost()); |
420 dom_handler_->SetRenderFrameHost(render_frame_host_); | 419 dom_handler_->SetRenderFrameHost(render_frame_host_); |
421 emulation_handler_->SetRenderViewHost(rvh); | |
422 input_handler_->SetRenderViewHost(rvh); | 420 input_handler_->SetRenderViewHost(rvh); |
423 network_handler_->SetRenderFrameHost(render_frame_host_); | 421 network_handler_->SetRenderFrameHost(render_frame_host_); |
424 page_handler_->SetRenderViewHost(rvh); | |
425 service_worker_handler_->SetRenderFrameHost(render_frame_host_); | 422 service_worker_handler_->SetRenderFrameHost(render_frame_host_); |
426 | 423 |
427 registrar_.Add( | 424 if (emulation_handler_) |
428 this, | 425 emulation_handler_->SetRenderFrameHost(render_frame_host_); |
429 content::NOTIFICATION_RENDER_WIDGET_VISIBILITY_CHANGED, | 426 if (page_handler_) |
430 content::Source<RenderWidgetHost>(rvh)); | 427 page_handler_->SetRenderFrameHost(render_frame_host_); |
431 } | 428 } |
432 | 429 |
433 void RenderFrameDevToolsAgentHost::ClearRenderFrameHost() { | 430 void RenderFrameDevToolsAgentHost::ClearRenderFrameHost() { |
434 DCHECK(render_frame_host_); | 431 DCHECK(render_frame_host_); |
435 RenderViewHostImpl* rvh = static_cast<RenderViewHostImpl*>( | |
436 render_frame_host_->GetRenderViewHost()); | |
437 registrar_.Remove( | |
438 this, | |
439 content::NOTIFICATION_RENDER_WIDGET_VISIBILITY_CHANGED, | |
440 content::Source<RenderWidgetHost>(rvh)); | |
441 render_frame_host_ = nullptr; | 432 render_frame_host_ = nullptr; |
442 dom_handler_->SetRenderFrameHost(nullptr); | 433 dom_handler_->SetRenderFrameHost(nullptr); |
443 emulation_handler_->SetRenderViewHost(nullptr); | 434 if (emulation_handler_) |
| 435 emulation_handler_->SetRenderFrameHost(nullptr); |
444 input_handler_->SetRenderViewHost(nullptr); | 436 input_handler_->SetRenderViewHost(nullptr); |
445 network_handler_->SetRenderFrameHost(nullptr); | 437 network_handler_->SetRenderFrameHost(nullptr); |
446 page_handler_->SetRenderViewHost(nullptr); | 438 if (page_handler_) |
| 439 page_handler_->SetRenderFrameHost(nullptr); |
447 service_worker_handler_->SetRenderFrameHost(nullptr); | 440 service_worker_handler_->SetRenderFrameHost(nullptr); |
448 } | 441 } |
449 | 442 |
450 void RenderFrameDevToolsAgentHost::DisconnectWebContents() { | 443 void RenderFrameDevToolsAgentHost::DisconnectWebContents() { |
451 DisconnectRenderFrameHost(); | 444 DisconnectRenderFrameHost(); |
452 } | 445 } |
453 | 446 |
454 void RenderFrameDevToolsAgentHost::ConnectWebContents(WebContents* wc) { | 447 void RenderFrameDevToolsAgentHost::ConnectWebContents(WebContents* wc) { |
455 ConnectRenderFrameHost(wc->GetMainFrame()); | 448 ConnectRenderFrameHost(wc->GetMainFrame()); |
456 } | 449 } |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
505 | 498 |
506 void RenderFrameDevToolsAgentHost::RenderFrameCrashed() { | 499 void RenderFrameDevToolsAgentHost::RenderFrameCrashed() { |
507 inspector_handler_->TargetCrashed(); | 500 inspector_handler_->TargetCrashed(); |
508 } | 501 } |
509 | 502 |
510 void RenderFrameDevToolsAgentHost::OnSwapCompositorFrame( | 503 void RenderFrameDevToolsAgentHost::OnSwapCompositorFrame( |
511 const IPC::Message& message) { | 504 const IPC::Message& message) { |
512 ViewHostMsg_SwapCompositorFrame::Param param; | 505 ViewHostMsg_SwapCompositorFrame::Param param; |
513 if (!ViewHostMsg_SwapCompositorFrame::Read(&message, ¶m)) | 506 if (!ViewHostMsg_SwapCompositorFrame::Read(&message, ¶m)) |
514 return; | 507 return; |
515 page_handler_->OnSwapCompositorFrame(get<1>(param).metadata); | 508 if (page_handler_) |
| 509 page_handler_->OnSwapCompositorFrame(get<1>(param).metadata); |
516 frame_trace_recorder_->OnSwapCompositorFrame( | 510 frame_trace_recorder_->OnSwapCompositorFrame( |
517 render_frame_host_, get<1>(param).metadata); | 511 render_frame_host_, get<1>(param).metadata); |
518 } | 512 } |
519 | 513 |
520 void RenderFrameDevToolsAgentHost::SynchronousSwapCompositorFrame( | 514 void RenderFrameDevToolsAgentHost::SynchronousSwapCompositorFrame( |
521 const cc::CompositorFrameMetadata& frame_metadata) { | 515 const cc::CompositorFrameMetadata& frame_metadata) { |
522 if (!render_frame_host_) | 516 if (!render_frame_host_) |
523 return; | 517 return; |
524 page_handler_->OnSwapCompositorFrame(frame_metadata); | 518 if (page_handler_) |
| 519 page_handler_->OnSwapCompositorFrame(frame_metadata); |
525 frame_trace_recorder_->OnSwapCompositorFrame( | 520 frame_trace_recorder_->OnSwapCompositorFrame( |
526 render_frame_host_, frame_metadata); | 521 render_frame_host_, frame_metadata); |
527 } | 522 } |
528 | 523 |
529 bool RenderFrameDevToolsAgentHost::HasRenderFrameHost( | 524 bool RenderFrameDevToolsAgentHost::HasRenderFrameHost( |
530 RenderFrameHost* host) { | 525 RenderFrameHost* host) { |
531 return host == render_frame_host_; | 526 return host == render_frame_host_; |
532 } | 527 } |
533 | 528 |
534 void RenderFrameDevToolsAgentHost::OnDispatchOnInspectorFrontend( | 529 void RenderFrameDevToolsAgentHost::OnDispatchOnInspectorFrontend( |
535 const DevToolsMessageChunk& message) { | 530 const DevToolsMessageChunk& message) { |
536 if (!IsAttached() || !render_frame_host_) | 531 if (!IsAttached() || !render_frame_host_) |
537 return; | 532 return; |
538 ProcessChunkedMessageFromAgent(message); | 533 ProcessChunkedMessageFromAgent(message); |
539 } | 534 } |
540 | 535 |
541 bool RenderFrameDevToolsAgentHost::IsChildFrame() { | 536 bool RenderFrameDevToolsAgentHost::IsChildFrame() { |
542 return render_frame_host_ && render_frame_host_->GetParent(); | 537 return render_frame_host_ && render_frame_host_->GetParent(); |
543 } | 538 } |
544 | 539 |
545 } // namespace content | 540 } // namespace content |
OLD | NEW |