| 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 |