Chromium Code Reviews| 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 288 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 299 security_handler_(nullptr), | 299 security_handler_(nullptr), |
| 300 service_worker_handler_( | 300 service_worker_handler_( |
| 301 new devtools::service_worker::ServiceWorkerHandler()), | 301 new devtools::service_worker::ServiceWorkerHandler()), |
| 302 tracing_handler_(new devtools::tracing::TracingHandler( | 302 tracing_handler_(new devtools::tracing::TracingHandler( |
| 303 devtools::tracing::TracingHandler::Renderer)), | 303 devtools::tracing::TracingHandler::Renderer)), |
| 304 emulation_handler_(nullptr), | 304 emulation_handler_(nullptr), |
| 305 frame_trace_recorder_(nullptr), | 305 frame_trace_recorder_(nullptr), |
| 306 protocol_handler_(new DevToolsProtocolHandler( | 306 protocol_handler_(new DevToolsProtocolHandler( |
| 307 this, | 307 this, |
| 308 base::Bind(&RenderFrameDevToolsAgentHost::SendMessageToClient, | 308 base::Bind(&RenderFrameDevToolsAgentHost::SendMessageToClient, |
| 309 base::Unretained(this)))) { | 309 base::Unretained(this)))), |
| 310 current_frame_crashed_(false) { | |
| 310 DevToolsProtocolDispatcher* dispatcher = protocol_handler_->dispatcher(); | 311 DevToolsProtocolDispatcher* dispatcher = protocol_handler_->dispatcher(); |
| 311 dispatcher->SetDOMHandler(dom_handler_.get()); | 312 dispatcher->SetDOMHandler(dom_handler_.get()); |
| 312 dispatcher->SetInputHandler(input_handler_.get()); | 313 dispatcher->SetInputHandler(input_handler_.get()); |
| 313 dispatcher->SetInspectorHandler(inspector_handler_.get()); | 314 dispatcher->SetInspectorHandler(inspector_handler_.get()); |
| 314 dispatcher->SetNetworkHandler(network_handler_.get()); | 315 dispatcher->SetNetworkHandler(network_handler_.get()); |
| 315 dispatcher->SetPowerHandler(power_handler_.get()); | 316 dispatcher->SetPowerHandler(power_handler_.get()); |
| 316 dispatcher->SetServiceWorkerHandler(service_worker_handler_.get()); | 317 dispatcher->SetServiceWorkerHandler(service_worker_handler_.get()); |
| 317 dispatcher->SetTracingHandler(tracing_handler_.get()); | 318 dispatcher->SetTracingHandler(tracing_handler_.get()); |
| 318 | 319 |
| 319 if (!host->GetParent()) { | 320 if (!host->GetParent()) { |
| 320 security_handler_.reset(new devtools::security::SecurityHandler()); | 321 security_handler_.reset(new devtools::security::SecurityHandler()); |
| 321 page_handler_.reset(new devtools::page::PageHandler()); | 322 page_handler_.reset(new devtools::page::PageHandler()); |
| 322 emulation_handler_.reset( | 323 emulation_handler_.reset( |
| 323 new devtools::emulation::EmulationHandler(page_handler_.get())); | 324 new devtools::emulation::EmulationHandler(page_handler_.get())); |
| 324 dispatcher->SetSecurityHandler(security_handler_.get()); | 325 dispatcher->SetSecurityHandler(security_handler_.get()); |
| 325 dispatcher->SetPageHandler(page_handler_.get()); | 326 dispatcher->SetPageHandler(page_handler_.get()); |
| 326 dispatcher->SetEmulationHandler(emulation_handler_.get()); | 327 dispatcher->SetEmulationHandler(emulation_handler_.get()); |
| 327 } | 328 } |
| 328 | 329 |
| 329 SetPending(host); | 330 SetPending(host); |
| 330 CommitPending(); | 331 CommitPending(); |
| 331 WebContentsObserver::Observe(WebContents::FromRenderFrameHost(host)); | 332 WebContentsObserver::Observe(WebContents::FromRenderFrameHost(host)); |
| 332 | 333 |
| 333 g_instances.Get().push_back(this); | 334 g_instances.Get().push_back(this); |
| 334 AddRef(); // Balanced in RenderFrameHostDestroyed. | 335 AddRef(); // Balanced in RenderFrameHostDestroyed. |
| 335 } | 336 } |
| 336 | 337 |
| 337 void RenderFrameDevToolsAgentHost::SetPending(RenderFrameHostImpl* host) { | 338 void RenderFrameDevToolsAgentHost::SetPending(RenderFrameHostImpl* host) { |
| 338 DCHECK(!pending_); | 339 DCHECK(!pending_); |
| 340 current_frame_crashed_ = false; | |
| 339 pending_.reset(new FrameHostHolder(this, host)); | 341 pending_.reset(new FrameHostHolder(this, host)); |
| 340 if (IsAttached()) | 342 if (IsAttached()) |
| 341 pending_->Reattach(current_.get()); | 343 pending_->Reattach(current_.get()); |
| 342 | 344 |
| 343 // Can only be null in constructor. | 345 // Can only be null in constructor. |
| 344 if (current_) | 346 if (current_) |
| 345 current_->Suspend(); | 347 current_->Suspend(); |
| 346 pending_->Suspend(); | 348 pending_->Suspend(); |
| 347 | 349 |
| 348 UpdateProtocolHandlers(host); | 350 UpdateProtocolHandlers(host); |
| 349 } | 351 } |
| 350 | 352 |
| 351 void RenderFrameDevToolsAgentHost::CommitPending() { | 353 void RenderFrameDevToolsAgentHost::CommitPending() { |
| 352 DCHECK(pending_); | 354 DCHECK(pending_); |
| 355 current_frame_crashed_ = false; | |
| 353 | 356 |
| 354 if (!ShouldCreateDevToolsFor(pending_->host())) { | 357 if (!ShouldCreateDevToolsFor(pending_->host())) { |
| 355 DestroyOnRenderFrameGone(); | 358 DestroyOnRenderFrameGone(); |
| 356 // |this| may be deleted at this point. | 359 // |this| may be deleted at this point. |
| 357 return; | 360 return; |
| 358 } | 361 } |
| 359 | 362 |
| 360 current_ = pending_.Pass(); | 363 current_ = pending_.Pass(); |
| 361 UpdateProtocolHandlers(current_->host()); | 364 UpdateProtocolHandlers(current_->host()); |
| 362 current_->Resume(); | 365 current_->Resume(); |
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 460 g_instances.Get().erase(it); | 463 g_instances.Get().erase(it); |
| 461 } | 464 } |
| 462 | 465 |
| 463 // TODO(creis): Consider removing this in favor of RenderFrameHostChanged. | 466 // TODO(creis): Consider removing this in favor of RenderFrameHostChanged. |
| 464 void RenderFrameDevToolsAgentHost::AboutToNavigateRenderFrame( | 467 void RenderFrameDevToolsAgentHost::AboutToNavigateRenderFrame( |
| 465 RenderFrameHost* old_host, | 468 RenderFrameHost* old_host, |
| 466 RenderFrameHost* new_host) { | 469 RenderFrameHost* new_host) { |
| 467 DCHECK(!pending_ || pending_->host() != old_host); | 470 DCHECK(!pending_ || pending_->host() != old_host); |
| 468 if (!current_ || current_->host() != old_host) | 471 if (!current_ || current_->host() != old_host) |
| 469 return; | 472 return; |
| 470 if (old_host == new_host) | 473 if (old_host == new_host && !current_frame_crashed_) |
|
nasko
2015/06/15 22:25:49
Will it really make a difference whether the curre
dgozman
2015/06/16 13:30:36
Yes, because if the current frame has crashed, ren
| |
| 471 return; | 474 return; |
| 472 DCHECK(!pending_); | 475 DCHECK(!pending_); |
| 473 SetPending(static_cast<RenderFrameHostImpl*>(new_host)); | 476 SetPending(static_cast<RenderFrameHostImpl*>(new_host)); |
| 474 } | 477 } |
| 475 | 478 |
| 476 void RenderFrameDevToolsAgentHost::RenderFrameHostChanged( | 479 void RenderFrameDevToolsAgentHost::RenderFrameHostChanged( |
| 477 RenderFrameHost* old_host, | 480 RenderFrameHost* old_host, |
| 478 RenderFrameHost* new_host) { | 481 RenderFrameHost* new_host) { |
| 479 DCHECK(!pending_ || pending_->host() != old_host); | 482 DCHECK(!pending_ || pending_->host() != old_host); |
| 480 if (!current_ || current_->host() != old_host) | 483 if (!current_ || current_->host() != old_host) |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 492 if (pending_ && pending_->host() == rfh) { | 495 if (pending_ && pending_->host() == rfh) { |
| 493 DiscardPending(); | 496 DiscardPending(); |
| 494 return; | 497 return; |
| 495 } | 498 } |
| 496 | 499 |
| 497 if (current_ && current_->host() == rfh) | 500 if (current_ && current_->host() == rfh) |
| 498 DestroyOnRenderFrameGone(); // |this| may be deleted at this point. | 501 DestroyOnRenderFrameGone(); // |this| may be deleted at this point. |
| 499 } | 502 } |
| 500 | 503 |
| 501 void RenderFrameDevToolsAgentHost::RenderFrameDeleted(RenderFrameHost* rfh) { | 504 void RenderFrameDevToolsAgentHost::RenderFrameDeleted(RenderFrameHost* rfh) { |
| 502 FrameDeleted(rfh); | 505 if (!current_frame_crashed_) |
| 506 FrameDeleted(rfh); | |
| 503 } | 507 } |
| 504 | 508 |
| 505 void RenderFrameDevToolsAgentHost::DestroyOnRenderFrameGone() { | 509 void RenderFrameDevToolsAgentHost::DestroyOnRenderFrameGone() { |
| 506 DCHECK(current_); | 510 DCHECK(current_); |
| 507 scoped_refptr<RenderFrameDevToolsAgentHost> protect(this); | 511 scoped_refptr<RenderFrameDevToolsAgentHost> protect(this); |
| 508 if (IsAttached()) | 512 if (IsAttached()) |
| 509 OnClientDetached(); | 513 OnClientDetached(); |
| 510 HostClosed(); | 514 HostClosed(); |
| 511 pending_.reset(); | 515 pending_.reset(); |
| 512 current_.reset(); | 516 current_.reset(); |
| 513 Release(); | 517 Release(); |
| 514 } | 518 } |
| 515 | 519 |
| 516 void RenderFrameDevToolsAgentHost::RenderProcessGone( | 520 void RenderFrameDevToolsAgentHost::RenderProcessGone( |
| 517 base::TerminationStatus status) { | 521 base::TerminationStatus status) { |
| 518 switch(status) { | 522 switch(status) { |
| 519 case base::TERMINATION_STATUS_ABNORMAL_TERMINATION: | 523 case base::TERMINATION_STATUS_ABNORMAL_TERMINATION: |
| 520 case base::TERMINATION_STATUS_PROCESS_WAS_KILLED: | 524 case base::TERMINATION_STATUS_PROCESS_WAS_KILLED: |
| 521 #if defined(OS_CHROMEOS) | 525 #if defined(OS_CHROMEOS) |
| 522 case base::TERMINATION_STATUS_PROCESS_WAS_KILLED_BY_OOM: | 526 case base::TERMINATION_STATUS_PROCESS_WAS_KILLED_BY_OOM: |
| 523 #endif | 527 #endif |
| 524 case base::TERMINATION_STATUS_PROCESS_CRASHED: | 528 case base::TERMINATION_STATUS_PROCESS_CRASHED: |
| 525 #if defined(OS_ANDROID) | 529 #if defined(OS_ANDROID) |
| 526 case base::TERMINATION_STATUS_OOM_PROTECTED: | 530 case base::TERMINATION_STATUS_OOM_PROTECTED: |
| 527 #endif | 531 #endif |
| 528 inspector_handler_->TargetCrashed(); | 532 inspector_handler_->TargetCrashed(); |
| 533 current_frame_crashed_ = true; | |
| 529 break; | 534 break; |
| 530 default: | 535 default: |
| 531 break; | 536 break; |
| 532 } | 537 } |
| 533 } | 538 } |
| 534 | 539 |
| 535 bool RenderFrameDevToolsAgentHost::OnMessageReceived( | 540 bool RenderFrameDevToolsAgentHost::OnMessageReceived( |
| 536 const IPC::Message& message) { | 541 const IPC::Message& message) { |
| 537 if (!current_) | 542 if (!current_) |
| 538 return false; | 543 return false; |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 578 | 583 |
| 579 void RenderFrameDevToolsAgentHost::DidDetachInterstitialPage() { | 584 void RenderFrameDevToolsAgentHost::DidDetachInterstitialPage() { |
| 580 if (page_handler_) | 585 if (page_handler_) |
| 581 page_handler_->DidDetachInterstitialPage(); | 586 page_handler_->DidDetachInterstitialPage(); |
| 582 } | 587 } |
| 583 | 588 |
| 584 void RenderFrameDevToolsAgentHost::DidCommitProvisionalLoadForFrame( | 589 void RenderFrameDevToolsAgentHost::DidCommitProvisionalLoadForFrame( |
| 585 RenderFrameHost* render_frame_host, | 590 RenderFrameHost* render_frame_host, |
| 586 const GURL& url, | 591 const GURL& url, |
| 587 ui::PageTransition transition_type) { | 592 ui::PageTransition transition_type) { |
| 593 if (pending_ && pending_->host() == render_frame_host) | |
| 594 CommitPending(); | |
| 588 service_worker_handler_->UpdateHosts(); | 595 service_worker_handler_->UpdateHosts(); |
| 589 } | 596 } |
| 590 | 597 |
| 591 void RenderFrameDevToolsAgentHost::DidFailProvisionalLoad( | 598 void RenderFrameDevToolsAgentHost::DidFailProvisionalLoad( |
| 592 RenderFrameHost* render_frame_host, | 599 RenderFrameHost* render_frame_host, |
| 593 const GURL& validated_url, | 600 const GURL& validated_url, |
| 594 int error_code, | 601 int error_code, |
| 595 const base::string16& error_description) { | 602 const base::string16& error_description) { |
| 596 if (pending_ && pending_->host() == render_frame_host) | 603 if (pending_ && pending_->host() == render_frame_host) |
| 597 DiscardPending(); | 604 DiscardPending(); |
| (...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 704 RenderFrameHost* host) { | 711 RenderFrameHost* host) { |
| 705 return (current_ && current_->host() == host) || | 712 return (current_ && current_->host() == host) || |
| 706 (pending_ && pending_->host() == host); | 713 (pending_ && pending_->host() == host); |
| 707 } | 714 } |
| 708 | 715 |
| 709 bool RenderFrameDevToolsAgentHost::IsChildFrame() { | 716 bool RenderFrameDevToolsAgentHost::IsChildFrame() { |
| 710 return current_ && current_->host()->GetParent(); | 717 return current_ && current_->host()->GetParent(); |
| 711 } | 718 } |
| 712 | 719 |
| 713 } // namespace content | 720 } // namespace content |
| OLD | NEW |