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