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 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
134 agent_host->DisconnectRenderFrameHost(); | 134 agent_host->DisconnectRenderFrameHost(); |
135 agent_host->ConnectRenderFrameHost(current); | 135 agent_host->ConnectRenderFrameHost(current); |
136 } | 136 } |
137 | 137 |
138 RenderFrameDevToolsAgentHost::RenderFrameDevToolsAgentHost(RenderFrameHost* rfh) | 138 RenderFrameDevToolsAgentHost::RenderFrameDevToolsAgentHost(RenderFrameHost* rfh) |
139 : render_frame_host_(NULL), | 139 : render_frame_host_(NULL), |
140 dom_handler_(new devtools::dom::DOMHandler()), | 140 dom_handler_(new devtools::dom::DOMHandler()), |
141 input_handler_(new devtools::input::InputHandler()), | 141 input_handler_(new devtools::input::InputHandler()), |
142 inspector_handler_(new devtools::inspector::InspectorHandler()), | 142 inspector_handler_(new devtools::inspector::InspectorHandler()), |
143 network_handler_(new devtools::network::NetworkHandler()), | 143 network_handler_(new devtools::network::NetworkHandler()), |
144 page_handler_(new devtools::page::PageHandler()), | 144 page_handler_(nullptr), |
145 power_handler_(new devtools::power::PowerHandler()), | 145 power_handler_(new devtools::power::PowerHandler()), |
146 service_worker_handler_( | 146 service_worker_handler_( |
147 new devtools::service_worker::ServiceWorkerHandler()), | 147 new devtools::service_worker::ServiceWorkerHandler()), |
148 tracing_handler_(new devtools::tracing::TracingHandler( | 148 tracing_handler_(new devtools::tracing::TracingHandler( |
149 devtools::tracing::TracingHandler::Renderer)), | 149 devtools::tracing::TracingHandler::Renderer)), |
150 emulation_handler_(new devtools::emulation::EmulationHandler( | 150 emulation_handler_(nullptr), |
151 page_handler_.get())), | |
152 frame_trace_recorder_(new DevToolsFrameTraceRecorder()), | 151 frame_trace_recorder_(new DevToolsFrameTraceRecorder()), |
153 reattaching_(false) { | 152 reattaching_(false) { |
154 DevToolsProtocolDispatcher* dispatcher = protocol_handler_->dispatcher(); | 153 DevToolsProtocolDispatcher* dispatcher = protocol_handler_->dispatcher(); |
155 dispatcher->SetDOMHandler(dom_handler_.get()); | 154 dispatcher->SetDOMHandler(dom_handler_.get()); |
156 dispatcher->SetEmulationHandler(emulation_handler_.get()); | |
157 dispatcher->SetInputHandler(input_handler_.get()); | 155 dispatcher->SetInputHandler(input_handler_.get()); |
158 dispatcher->SetInspectorHandler(inspector_handler_.get()); | 156 dispatcher->SetInspectorHandler(inspector_handler_.get()); |
159 dispatcher->SetNetworkHandler(network_handler_.get()); | 157 dispatcher->SetNetworkHandler(network_handler_.get()); |
160 dispatcher->SetPageHandler(page_handler_.get()); | |
161 dispatcher->SetPowerHandler(power_handler_.get()); | 158 dispatcher->SetPowerHandler(power_handler_.get()); |
162 dispatcher->SetServiceWorkerHandler(service_worker_handler_.get()); | 159 dispatcher->SetServiceWorkerHandler(service_worker_handler_.get()); |
163 dispatcher->SetTracingHandler(tracing_handler_.get()); | 160 dispatcher->SetTracingHandler(tracing_handler_.get()); |
| 161 |
| 162 if (!rfh->GetParent()) { |
| 163 page_handler_.reset(new devtools::page::PageHandler()); |
| 164 emulation_handler_.reset( |
| 165 new devtools::emulation::EmulationHandler(page_handler_.get())); |
| 166 dispatcher->SetPageHandler(page_handler_.get()); |
| 167 dispatcher->SetEmulationHandler(emulation_handler_.get()); |
| 168 } |
| 169 |
164 SetRenderFrameHost(rfh); | 170 SetRenderFrameHost(rfh); |
165 g_instances.Get().push_back(this); | 171 g_instances.Get().push_back(this); |
166 AddRef(); // Balanced in RenderFrameHostDestroyed. | 172 AddRef(); // Balanced in RenderFrameHostDestroyed. |
167 DevToolsManager::GetInstance()->AgentHostChanged(this); | 173 DevToolsManager::GetInstance()->AgentHostChanged(this); |
168 } | 174 } |
169 | 175 |
170 BrowserContext* RenderFrameDevToolsAgentHost::GetBrowserContext() { | 176 BrowserContext* RenderFrameDevToolsAgentHost::GetBrowserContext() { |
171 WebContents* contents = web_contents(); | 177 WebContents* contents = web_contents(); |
172 return contents ? contents->GetBrowserContext() : nullptr; | 178 return contents ? contents->GetBrowserContext() : nullptr; |
173 } | 179 } |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
210 power_save_blocker_.get()-> | 216 power_save_blocker_.get()-> |
211 InitDisplaySleepBlocker(rvh->GetView()->GetNativeView()); | 217 InitDisplaySleepBlocker(rvh->GetView()->GetNativeView()); |
212 } | 218 } |
213 #endif | 219 #endif |
214 } | 220 } |
215 | 221 |
216 void RenderFrameDevToolsAgentHost::OnClientDetached() { | 222 void RenderFrameDevToolsAgentHost::OnClientDetached() { |
217 #if defined(OS_ANDROID) | 223 #if defined(OS_ANDROID) |
218 power_save_blocker_.reset(); | 224 power_save_blocker_.reset(); |
219 #endif | 225 #endif |
220 emulation_handler_->Detached(); | 226 if (emulation_handler_) |
221 page_handler_->Detached(); | 227 emulation_handler_->Detached(); |
| 228 if (page_handler_) |
| 229 page_handler_->Detached(); |
222 power_handler_->Detached(); | 230 power_handler_->Detached(); |
223 service_worker_handler_->Detached(); | 231 service_worker_handler_->Detached(); |
224 tracing_handler_->Detached(); | 232 tracing_handler_->Detached(); |
225 ClientDetachedFromRenderer(); | 233 ClientDetachedFromRenderer(); |
226 | 234 |
227 // TODO(kaznacheev): Move this call back to DevToolsManager when | 235 // TODO(kaznacheev): Move this call back to DevToolsManager when |
228 // extensions::ProcessManager no longer relies on this notification. | 236 // extensions::ProcessManager no longer relies on this notification. |
229 if (!reattaching_) | 237 if (!reattaching_) |
230 DevToolsAgentHostImpl::NotifyCallbacks(this, false); | 238 DevToolsAgentHostImpl::NotifyCallbacks(this, false); |
231 } | 239 } |
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
358 bool handled = true; | 366 bool handled = true; |
359 IPC_BEGIN_MESSAGE_MAP(RenderFrameDevToolsAgentHost, message) | 367 IPC_BEGIN_MESSAGE_MAP(RenderFrameDevToolsAgentHost, message) |
360 IPC_MESSAGE_HANDLER(DevToolsClientMsg_DispatchOnInspectorFrontend, | 368 IPC_MESSAGE_HANDLER(DevToolsClientMsg_DispatchOnInspectorFrontend, |
361 OnDispatchOnInspectorFrontend) | 369 OnDispatchOnInspectorFrontend) |
362 IPC_MESSAGE_UNHANDLED(handled = false) | 370 IPC_MESSAGE_UNHANDLED(handled = false) |
363 IPC_END_MESSAGE_MAP() | 371 IPC_END_MESSAGE_MAP() |
364 return handled; | 372 return handled; |
365 } | 373 } |
366 | 374 |
367 void RenderFrameDevToolsAgentHost::DidAttachInterstitialPage() { | 375 void RenderFrameDevToolsAgentHost::DidAttachInterstitialPage() { |
368 page_handler_->DidAttachInterstitialPage(); | 376 if (page_handler_) |
| 377 page_handler_->DidAttachInterstitialPage(); |
369 | 378 |
370 if (!render_frame_host_) | 379 if (!render_frame_host_) |
371 return; | 380 return; |
372 // The rvh set in AboutToNavigateRenderFrame turned out to be interstitial. | 381 // The rvh set in AboutToNavigateRenderFrame turned out to be interstitial. |
373 // Connect back to the real one. | 382 // Connect back to the real one. |
374 WebContents* web_contents = | 383 WebContents* web_contents = |
375 WebContents::FromRenderFrameHost(render_frame_host_); | 384 WebContents::FromRenderFrameHost(render_frame_host_); |
376 if (!web_contents) | 385 if (!web_contents) |
377 return; | 386 return; |
378 DisconnectRenderFrameHost(); | 387 DisconnectRenderFrameHost(); |
379 ConnectRenderFrameHost(web_contents->GetMainFrame()); | 388 ConnectRenderFrameHost(web_contents->GetMainFrame()); |
380 } | 389 } |
381 | 390 |
382 void RenderFrameDevToolsAgentHost::DidDetachInterstitialPage() { | 391 void RenderFrameDevToolsAgentHost::DidDetachInterstitialPage() { |
383 page_handler_->DidDetachInterstitialPage(); | 392 if (page_handler_) |
| 393 page_handler_->DidDetachInterstitialPage(); |
384 } | 394 } |
385 | 395 |
386 void RenderFrameDevToolsAgentHost::TitleWasSet( | 396 void RenderFrameDevToolsAgentHost::TitleWasSet( |
387 NavigationEntry* entry, bool explicit_set) { | 397 NavigationEntry* entry, bool explicit_set) { |
388 DevToolsManager::GetInstance()->AgentHostChanged(this); | 398 DevToolsManager::GetInstance()->AgentHostChanged(this); |
389 } | 399 } |
390 | 400 |
391 void RenderFrameDevToolsAgentHost::NavigationEntryCommitted( | 401 void RenderFrameDevToolsAgentHost::NavigationEntryCommitted( |
392 const LoadCommittedDetails& load_details) { | 402 const LoadCommittedDetails& load_details) { |
393 DevToolsManager::GetInstance()->AgentHostChanged(this); | 403 DevToolsManager::GetInstance()->AgentHostChanged(this); |
394 } | 404 } |
395 | 405 |
396 void RenderFrameDevToolsAgentHost::DidCommitProvisionalLoadForFrame( | 406 void RenderFrameDevToolsAgentHost::DidCommitProvisionalLoadForFrame( |
397 RenderFrameHost* render_frame_host, | 407 RenderFrameHost* render_frame_host, |
398 const GURL& url, | 408 const GURL& url, |
399 ui::PageTransition transition_type) { | 409 ui::PageTransition transition_type) { |
400 service_worker_handler_->UpdateHosts(); | 410 service_worker_handler_->UpdateHosts(); |
401 } | 411 } |
402 | 412 |
403 void RenderFrameDevToolsAgentHost::Observe(int type, | 413 void RenderFrameDevToolsAgentHost::Observe(int type, |
404 const NotificationSource& source, | 414 const NotificationSource& source, |
405 const NotificationDetails& details) { | 415 const NotificationDetails& details) { |
406 if (type == content::NOTIFICATION_RENDER_WIDGET_VISIBILITY_CHANGED) { | 416 if (type == content::NOTIFICATION_RENDER_WIDGET_VISIBILITY_CHANGED) { |
407 bool visible = *Details<bool>(details).ptr(); | 417 bool visible = *Details<bool>(details).ptr(); |
| 418 DCHECK(page_handler_); |
408 page_handler_->OnVisibilityChanged(visible); | 419 page_handler_->OnVisibilityChanged(visible); |
409 } | 420 } |
410 } | 421 } |
411 | 422 |
412 void RenderFrameDevToolsAgentHost::SetRenderFrameHost(RenderFrameHost* rfh) { | 423 void RenderFrameDevToolsAgentHost::SetRenderFrameHost(RenderFrameHost* rfh) { |
413 DCHECK(ShouldCreateDevToolsFor(rfh)); | 424 DCHECK(ShouldCreateDevToolsFor(rfh)); |
414 DCHECK(!render_frame_host_); | 425 DCHECK(!render_frame_host_); |
415 render_frame_host_ = static_cast<RenderFrameHostImpl*>(rfh); | 426 render_frame_host_ = static_cast<RenderFrameHostImpl*>(rfh); |
416 | 427 |
417 WebContentsObserver::Observe(WebContents::FromRenderFrameHost(rfh)); | 428 WebContentsObserver::Observe(WebContents::FromRenderFrameHost(rfh)); |
418 RenderViewHostImpl* rvh = static_cast<RenderViewHostImpl*>( | 429 RenderViewHostImpl* rvh = static_cast<RenderViewHostImpl*>( |
419 rfh->GetRenderViewHost()); | 430 rfh->GetRenderViewHost()); |
420 dom_handler_->SetRenderFrameHost(render_frame_host_); | 431 dom_handler_->SetRenderFrameHost(render_frame_host_); |
421 emulation_handler_->SetRenderViewHost(rvh); | |
422 input_handler_->SetRenderViewHost(rvh); | 432 input_handler_->SetRenderViewHost(rvh); |
423 network_handler_->SetRenderFrameHost(render_frame_host_); | 433 network_handler_->SetRenderFrameHost(render_frame_host_); |
424 page_handler_->SetRenderViewHost(rvh); | |
425 service_worker_handler_->SetRenderFrameHost(render_frame_host_); | 434 service_worker_handler_->SetRenderFrameHost(render_frame_host_); |
426 | 435 |
427 registrar_.Add( | 436 WebContentsImpl* web_contents_impl = |
428 this, | 437 static_cast<WebContentsImpl*>(web_contents()); |
429 content::NOTIFICATION_RENDER_WIDGET_VISIBILITY_CHANGED, | 438 if (emulation_handler_) |
430 content::Source<RenderWidgetHost>(rvh)); | 439 emulation_handler_->SetWebContents(web_contents_impl); |
| 440 if (page_handler_) |
| 441 page_handler_->SetWebContents(web_contents_impl); |
| 442 |
| 443 if (page_handler_) { |
| 444 registrar_.Add( |
| 445 this, |
| 446 content::NOTIFICATION_RENDER_WIDGET_VISIBILITY_CHANGED, |
| 447 content::Source<RenderWidgetHost>(rvh)); |
| 448 } |
431 } | 449 } |
432 | 450 |
433 void RenderFrameDevToolsAgentHost::ClearRenderFrameHost() { | 451 void RenderFrameDevToolsAgentHost::ClearRenderFrameHost() { |
434 DCHECK(render_frame_host_); | 452 DCHECK(render_frame_host_); |
435 RenderViewHostImpl* rvh = static_cast<RenderViewHostImpl*>( | 453 RenderViewHostImpl* rvh = static_cast<RenderViewHostImpl*>( |
436 render_frame_host_->GetRenderViewHost()); | 454 render_frame_host_->GetRenderViewHost()); |
437 registrar_.Remove( | 455 if (page_handler_) { |
438 this, | 456 registrar_.Remove( |
439 content::NOTIFICATION_RENDER_WIDGET_VISIBILITY_CHANGED, | 457 this, |
440 content::Source<RenderWidgetHost>(rvh)); | 458 content::NOTIFICATION_RENDER_WIDGET_VISIBILITY_CHANGED, |
| 459 content::Source<RenderWidgetHost>(rvh)); |
| 460 } |
441 render_frame_host_ = nullptr; | 461 render_frame_host_ = nullptr; |
442 dom_handler_->SetRenderFrameHost(nullptr); | 462 dom_handler_->SetRenderFrameHost(nullptr); |
443 emulation_handler_->SetRenderViewHost(nullptr); | 463 if (emulation_handler_) |
| 464 emulation_handler_->SetWebContents(nullptr); |
444 input_handler_->SetRenderViewHost(nullptr); | 465 input_handler_->SetRenderViewHost(nullptr); |
445 network_handler_->SetRenderFrameHost(nullptr); | 466 network_handler_->SetRenderFrameHost(nullptr); |
446 page_handler_->SetRenderViewHost(nullptr); | 467 if (page_handler_) |
| 468 page_handler_->SetWebContents(nullptr); |
447 service_worker_handler_->SetRenderFrameHost(nullptr); | 469 service_worker_handler_->SetRenderFrameHost(nullptr); |
448 } | 470 } |
449 | 471 |
450 void RenderFrameDevToolsAgentHost::DisconnectWebContents() { | 472 void RenderFrameDevToolsAgentHost::DisconnectWebContents() { |
451 DisconnectRenderFrameHost(); | 473 DisconnectRenderFrameHost(); |
452 } | 474 } |
453 | 475 |
454 void RenderFrameDevToolsAgentHost::ConnectWebContents(WebContents* wc) { | 476 void RenderFrameDevToolsAgentHost::ConnectWebContents(WebContents* wc) { |
455 ConnectRenderFrameHost(wc->GetMainFrame()); | 477 ConnectRenderFrameHost(wc->GetMainFrame()); |
456 } | 478 } |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
505 | 527 |
506 void RenderFrameDevToolsAgentHost::RenderFrameCrashed() { | 528 void RenderFrameDevToolsAgentHost::RenderFrameCrashed() { |
507 inspector_handler_->TargetCrashed(); | 529 inspector_handler_->TargetCrashed(); |
508 } | 530 } |
509 | 531 |
510 void RenderFrameDevToolsAgentHost::OnSwapCompositorFrame( | 532 void RenderFrameDevToolsAgentHost::OnSwapCompositorFrame( |
511 const IPC::Message& message) { | 533 const IPC::Message& message) { |
512 ViewHostMsg_SwapCompositorFrame::Param param; | 534 ViewHostMsg_SwapCompositorFrame::Param param; |
513 if (!ViewHostMsg_SwapCompositorFrame::Read(&message, ¶m)) | 535 if (!ViewHostMsg_SwapCompositorFrame::Read(&message, ¶m)) |
514 return; | 536 return; |
515 page_handler_->OnSwapCompositorFrame(get<1>(param).metadata); | 537 if (page_handler_) |
| 538 page_handler_->OnSwapCompositorFrame(get<1>(param).metadata); |
516 frame_trace_recorder_->OnSwapCompositorFrame( | 539 frame_trace_recorder_->OnSwapCompositorFrame( |
517 render_frame_host_, get<1>(param).metadata); | 540 render_frame_host_, get<1>(param).metadata); |
518 } | 541 } |
519 | 542 |
520 void RenderFrameDevToolsAgentHost::SynchronousSwapCompositorFrame( | 543 void RenderFrameDevToolsAgentHost::SynchronousSwapCompositorFrame( |
521 const cc::CompositorFrameMetadata& frame_metadata) { | 544 const cc::CompositorFrameMetadata& frame_metadata) { |
522 if (!render_frame_host_) | 545 if (!render_frame_host_) |
523 return; | 546 return; |
524 page_handler_->OnSwapCompositorFrame(frame_metadata); | 547 if (page_handler_) |
| 548 page_handler_->OnSwapCompositorFrame(frame_metadata); |
525 frame_trace_recorder_->OnSwapCompositorFrame( | 549 frame_trace_recorder_->OnSwapCompositorFrame( |
526 render_frame_host_, frame_metadata); | 550 render_frame_host_, frame_metadata); |
527 } | 551 } |
528 | 552 |
529 bool RenderFrameDevToolsAgentHost::HasRenderFrameHost( | 553 bool RenderFrameDevToolsAgentHost::HasRenderFrameHost( |
530 RenderFrameHost* host) { | 554 RenderFrameHost* host) { |
531 return host == render_frame_host_; | 555 return host == render_frame_host_; |
532 } | 556 } |
533 | 557 |
534 void RenderFrameDevToolsAgentHost::OnDispatchOnInspectorFrontend( | 558 void RenderFrameDevToolsAgentHost::OnDispatchOnInspectorFrontend( |
535 const DevToolsMessageChunk& message) { | 559 const DevToolsMessageChunk& message) { |
536 if (!IsAttached() || !render_frame_host_) | 560 if (!IsAttached() || !render_frame_host_) |
537 return; | 561 return; |
538 ProcessChunkedMessageFromAgent(message); | 562 ProcessChunkedMessageFromAgent(message); |
539 } | 563 } |
540 | 564 |
541 bool RenderFrameDevToolsAgentHost::IsChildFrame() { | 565 bool RenderFrameDevToolsAgentHost::IsChildFrame() { |
542 return render_frame_host_ && render_frame_host_->GetParent(); | 566 return render_frame_host_ && render_frame_host_->GetParent(); |
543 } | 567 } |
544 | 568 |
545 } // namespace content | 569 } // namespace content |
OLD | NEW |