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 286 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 297 power_handler_(new devtools::power::PowerHandler()), | 297 power_handler_(new devtools::power::PowerHandler()), |
| 298 service_worker_handler_( | 298 service_worker_handler_( |
| 299 new devtools::service_worker::ServiceWorkerHandler()), | 299 new devtools::service_worker::ServiceWorkerHandler()), |
| 300 tracing_handler_(new devtools::tracing::TracingHandler( | 300 tracing_handler_(new devtools::tracing::TracingHandler( |
| 301 devtools::tracing::TracingHandler::Renderer)), | 301 devtools::tracing::TracingHandler::Renderer)), |
| 302 emulation_handler_(nullptr), | 302 emulation_handler_(nullptr), |
| 303 frame_trace_recorder_(nullptr), | 303 frame_trace_recorder_(nullptr), |
| 304 protocol_handler_(new DevToolsProtocolHandler( | 304 protocol_handler_(new DevToolsProtocolHandler( |
| 305 this, | 305 this, |
| 306 base::Bind(&RenderFrameDevToolsAgentHost::SendMessageToClient, | 306 base::Bind(&RenderFrameDevToolsAgentHost::SendMessageToClient, |
| 307 base::Unretained(this)))) { | 307 base::Unretained(this)))), |
| 308 frame_crashed_(false) { | |
| 308 DevToolsProtocolDispatcher* dispatcher = protocol_handler_->dispatcher(); | 309 DevToolsProtocolDispatcher* dispatcher = protocol_handler_->dispatcher(); |
| 309 dispatcher->SetDOMHandler(dom_handler_.get()); | 310 dispatcher->SetDOMHandler(dom_handler_.get()); |
| 310 dispatcher->SetInputHandler(input_handler_.get()); | 311 dispatcher->SetInputHandler(input_handler_.get()); |
| 311 dispatcher->SetInspectorHandler(inspector_handler_.get()); | 312 dispatcher->SetInspectorHandler(inspector_handler_.get()); |
| 312 dispatcher->SetNetworkHandler(network_handler_.get()); | 313 dispatcher->SetNetworkHandler(network_handler_.get()); |
| 313 dispatcher->SetPowerHandler(power_handler_.get()); | 314 dispatcher->SetPowerHandler(power_handler_.get()); |
| 314 dispatcher->SetServiceWorkerHandler(service_worker_handler_.get()); | 315 dispatcher->SetServiceWorkerHandler(service_worker_handler_.get()); |
| 315 dispatcher->SetTracingHandler(tracing_handler_.get()); | 316 dispatcher->SetTracingHandler(tracing_handler_.get()); |
| 316 | 317 |
| 317 if (!host->GetParent()) { | 318 if (!host->GetParent()) { |
| 318 page_handler_.reset(new devtools::page::PageHandler()); | 319 page_handler_.reset(new devtools::page::PageHandler()); |
| 319 emulation_handler_.reset( | 320 emulation_handler_.reset( |
| 320 new devtools::emulation::EmulationHandler(page_handler_.get())); | 321 new devtools::emulation::EmulationHandler(page_handler_.get())); |
| 321 dispatcher->SetPageHandler(page_handler_.get()); | 322 dispatcher->SetPageHandler(page_handler_.get()); |
| 322 dispatcher->SetEmulationHandler(emulation_handler_.get()); | 323 dispatcher->SetEmulationHandler(emulation_handler_.get()); |
| 323 } | 324 } |
| 324 | 325 |
| 325 SetPending(host); | 326 SetPending(host); |
| 326 CommitPending(); | 327 CommitPending(); |
| 327 WebContentsObserver::Observe(WebContents::FromRenderFrameHost(host)); | 328 WebContentsObserver::Observe(WebContents::FromRenderFrameHost(host)); |
| 328 | 329 |
| 329 g_instances.Get().push_back(this); | 330 g_instances.Get().push_back(this); |
| 330 AddRef(); // Balanced in RenderFrameHostDestroyed. | 331 AddRef(); // Balanced in RenderFrameHostDestroyed. |
| 331 } | 332 } |
| 332 | 333 |
| 333 void RenderFrameDevToolsAgentHost::SetPending(RenderFrameHostImpl* host) { | 334 void RenderFrameDevToolsAgentHost::SetPending(RenderFrameHostImpl* host) { |
| 334 DCHECK(!pending_); | 335 DCHECK(!pending_); |
| 336 frame_crashed_ = false; | |
| 335 pending_.reset(new FrameHostHolder(this, host)); | 337 pending_.reset(new FrameHostHolder(this, host)); |
| 336 if (IsAttached()) | 338 if (IsAttached()) |
| 337 pending_->Reattach(current_.get()); | 339 pending_->Reattach(current_.get()); |
| 338 | 340 |
| 339 // Can only be null in constructor. | 341 // Can only be null in constructor. |
| 340 if (current_) | 342 if (current_) |
| 341 current_->Suspend(); | 343 current_->Suspend(); |
| 342 pending_->Suspend(); | 344 pending_->Suspend(); |
| 343 | 345 |
| 344 UpdateProtocolHandlers(host); | 346 UpdateProtocolHandlers(host); |
| 345 } | 347 } |
| 346 | 348 |
| 347 void RenderFrameDevToolsAgentHost::CommitPending() { | 349 void RenderFrameDevToolsAgentHost::CommitPending() { |
| 348 DCHECK(pending_); | 350 DCHECK(pending_); |
| 351 frame_crashed_ = false; | |
| 349 | 352 |
| 350 if (!ShouldCreateDevToolsFor(pending_->host())) { | 353 if (!ShouldCreateDevToolsFor(pending_->host())) { |
| 351 DestroyOnRenderFrameGone(); | 354 DestroyOnRenderFrameGone(); |
| 352 // |this| may be deleted at this point. | 355 // |this| may be deleted at this point. |
| 353 return; | 356 return; |
| 354 } | 357 } |
| 355 | 358 |
| 356 current_ = pending_.Pass(); | 359 current_ = pending_.Pass(); |
| 357 UpdateProtocolHandlers(current_->host()); | 360 UpdateProtocolHandlers(current_->host()); |
| 358 current_->Resume(); | 361 current_->Resume(); |
| 359 } | 362 } |
| 360 | 363 |
| 361 void RenderFrameDevToolsAgentHost::DiscardPending() { | 364 void RenderFrameDevToolsAgentHost::DiscardPending() { |
| 362 DCHECK(pending_); | 365 DCHECK(pending_); |
| 363 DCHECK(current_); | 366 DCHECK(current_); |
| 367 frame_crashed_ = false; | |
|
nasko
2015/06/11 16:56:12
Does this boolean track the pending or the current
dgozman
2015/06/15 14:59:06
It's intended to be the current one. RenderProcess
| |
| 364 pending_.reset(); | 368 pending_.reset(); |
| 365 UpdateProtocolHandlers(current_->host()); | 369 UpdateProtocolHandlers(current_->host()); |
| 366 current_->Resume(); | 370 current_->Resume(); |
| 367 } | 371 } |
| 368 | 372 |
| 369 BrowserContext* RenderFrameDevToolsAgentHost::GetBrowserContext() { | 373 BrowserContext* RenderFrameDevToolsAgentHost::GetBrowserContext() { |
| 370 WebContents* contents = web_contents(); | 374 WebContents* contents = web_contents(); |
| 371 return contents ? contents->GetBrowserContext() : nullptr; | 375 return contents ? contents->GetBrowserContext() : nullptr; |
| 372 } | 376 } |
| 373 | 377 |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 456 g_instances.Get().erase(it); | 460 g_instances.Get().erase(it); |
| 457 } | 461 } |
| 458 | 462 |
| 459 // TODO(creis): Consider removing this in favor of RenderFrameHostChanged. | 463 // TODO(creis): Consider removing this in favor of RenderFrameHostChanged. |
| 460 void RenderFrameDevToolsAgentHost::AboutToNavigateRenderFrame( | 464 void RenderFrameDevToolsAgentHost::AboutToNavigateRenderFrame( |
| 461 RenderFrameHost* old_host, | 465 RenderFrameHost* old_host, |
| 462 RenderFrameHost* new_host) { | 466 RenderFrameHost* new_host) { |
| 463 DCHECK(!pending_ || pending_->host() != old_host); | 467 DCHECK(!pending_ || pending_->host() != old_host); |
| 464 if (!current_ || current_->host() != old_host) | 468 if (!current_ || current_->host() != old_host) |
| 465 return; | 469 return; |
| 466 if (old_host == new_host) | 470 if (old_host == new_host && !frame_crashed_) |
| 467 return; | 471 return; |
| 468 DCHECK(!pending_); | 472 DCHECK(!pending_); |
| 469 SetPending(static_cast<RenderFrameHostImpl*>(new_host)); | 473 SetPending(static_cast<RenderFrameHostImpl*>(new_host)); |
| 470 } | 474 } |
| 471 | 475 |
| 472 void RenderFrameDevToolsAgentHost::RenderFrameHostChanged( | 476 void RenderFrameDevToolsAgentHost::RenderFrameHostChanged( |
| 473 RenderFrameHost* old_host, | 477 RenderFrameHost* old_host, |
| 474 RenderFrameHost* new_host) { | 478 RenderFrameHost* new_host) { |
| 475 DCHECK(!pending_ || pending_->host() != old_host); | 479 DCHECK(!pending_ || pending_->host() != old_host); |
| 476 if (!current_ || current_->host() != old_host) | 480 if (!current_ || current_->host() != old_host) |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 488 if (pending_ && pending_->host() == rfh) { | 492 if (pending_ && pending_->host() == rfh) { |
| 489 DiscardPending(); | 493 DiscardPending(); |
| 490 return; | 494 return; |
| 491 } | 495 } |
| 492 | 496 |
| 493 if (current_ && current_->host() == rfh) | 497 if (current_ && current_->host() == rfh) |
| 494 DestroyOnRenderFrameGone(); // |this| may be deleted at this point. | 498 DestroyOnRenderFrameGone(); // |this| may be deleted at this point. |
| 495 } | 499 } |
| 496 | 500 |
| 497 void RenderFrameDevToolsAgentHost::RenderFrameDeleted(RenderFrameHost* rfh) { | 501 void RenderFrameDevToolsAgentHost::RenderFrameDeleted(RenderFrameHost* rfh) { |
| 498 FrameDeleted(rfh); | 502 if (!frame_crashed_) |
| 503 FrameDeleted(rfh); | |
| 499 } | 504 } |
| 500 | 505 |
| 501 void RenderFrameDevToolsAgentHost::DestroyOnRenderFrameGone() { | 506 void RenderFrameDevToolsAgentHost::DestroyOnRenderFrameGone() { |
| 502 DCHECK(current_); | 507 DCHECK(current_); |
| 503 scoped_refptr<RenderFrameDevToolsAgentHost> protect(this); | 508 scoped_refptr<RenderFrameDevToolsAgentHost> protect(this); |
| 504 if (IsAttached()) | 509 if (IsAttached()) |
| 505 OnClientDetached(); | 510 OnClientDetached(); |
| 506 HostClosed(); | 511 HostClosed(); |
| 507 pending_.reset(); | 512 pending_.reset(); |
| 508 current_.reset(); | 513 current_.reset(); |
| 509 Release(); | 514 Release(); |
| 510 } | 515 } |
| 511 | 516 |
| 512 void RenderFrameDevToolsAgentHost::RenderProcessGone( | 517 void RenderFrameDevToolsAgentHost::RenderProcessGone( |
| 513 base::TerminationStatus status) { | 518 base::TerminationStatus status) { |
| 514 switch(status) { | 519 switch(status) { |
| 515 case base::TERMINATION_STATUS_ABNORMAL_TERMINATION: | 520 case base::TERMINATION_STATUS_ABNORMAL_TERMINATION: |
| 516 case base::TERMINATION_STATUS_PROCESS_WAS_KILLED: | 521 case base::TERMINATION_STATUS_PROCESS_WAS_KILLED: |
| 517 #if defined(OS_CHROMEOS) | 522 #if defined(OS_CHROMEOS) |
| 518 case base::TERMINATION_STATUS_PROCESS_WAS_KILLED_BY_OOM: | 523 case base::TERMINATION_STATUS_PROCESS_WAS_KILLED_BY_OOM: |
| 519 #endif | 524 #endif |
| 520 case base::TERMINATION_STATUS_PROCESS_CRASHED: | 525 case base::TERMINATION_STATUS_PROCESS_CRASHED: |
| 521 #if defined(OS_ANDROID) | 526 #if defined(OS_ANDROID) |
| 522 case base::TERMINATION_STATUS_OOM_PROTECTED: | 527 case base::TERMINATION_STATUS_OOM_PROTECTED: |
| 523 #endif | 528 #endif |
| 524 inspector_handler_->TargetCrashed(); | 529 inspector_handler_->TargetCrashed(); |
| 530 frame_crashed_ = true; | |
| 525 break; | 531 break; |
| 526 default: | 532 default: |
| 527 break; | 533 break; |
| 528 } | 534 } |
| 529 } | 535 } |
| 530 | 536 |
| 531 bool RenderFrameDevToolsAgentHost::OnMessageReceived( | 537 bool RenderFrameDevToolsAgentHost::OnMessageReceived( |
| 532 const IPC::Message& message) { | 538 const IPC::Message& message) { |
| 533 if (!current_) | 539 if (!current_) |
| 534 return false; | 540 return false; |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 574 | 580 |
| 575 void RenderFrameDevToolsAgentHost::DidDetachInterstitialPage() { | 581 void RenderFrameDevToolsAgentHost::DidDetachInterstitialPage() { |
| 576 if (page_handler_) | 582 if (page_handler_) |
| 577 page_handler_->DidDetachInterstitialPage(); | 583 page_handler_->DidDetachInterstitialPage(); |
| 578 } | 584 } |
| 579 | 585 |
| 580 void RenderFrameDevToolsAgentHost::DidCommitProvisionalLoadForFrame( | 586 void RenderFrameDevToolsAgentHost::DidCommitProvisionalLoadForFrame( |
| 581 RenderFrameHost* render_frame_host, | 587 RenderFrameHost* render_frame_host, |
| 582 const GURL& url, | 588 const GURL& url, |
| 583 ui::PageTransition transition_type) { | 589 ui::PageTransition transition_type) { |
| 590 if (pending_ && pending_->host() == render_frame_host) | |
| 591 CommitPending(); | |
| 584 service_worker_handler_->UpdateHosts(); | 592 service_worker_handler_->UpdateHosts(); |
| 585 } | 593 } |
| 586 | 594 |
| 587 void RenderFrameDevToolsAgentHost::DidFailProvisionalLoad( | 595 void RenderFrameDevToolsAgentHost::DidFailProvisionalLoad( |
| 588 RenderFrameHost* render_frame_host, | 596 RenderFrameHost* render_frame_host, |
| 589 const GURL& validated_url, | 597 const GURL& validated_url, |
| 590 int error_code, | 598 int error_code, |
| 591 const base::string16& error_description) { | 599 const base::string16& error_description) { |
| 592 if (pending_ && pending_->host() == render_frame_host) | 600 if (pending_ && pending_->host() == render_frame_host) |
| 593 DiscardPending(); | 601 DiscardPending(); |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 697 RenderFrameHost* host) { | 705 RenderFrameHost* host) { |
| 698 return (current_ && current_->host() == host) || | 706 return (current_ && current_->host() == host) || |
| 699 (pending_ && pending_->host() == host); | 707 (pending_ && pending_->host() == host); |
| 700 } | 708 } |
| 701 | 709 |
| 702 bool RenderFrameDevToolsAgentHost::IsChildFrame() { | 710 bool RenderFrameDevToolsAgentHost::IsChildFrame() { |
| 703 return current_ && current_->host()->GetParent(); | 711 return current_ && current_->host()->GetParent(); |
| 704 } | 712 } |
| 705 | 713 |
| 706 } // namespace content | 714 } // namespace content |
| OLD | NEW |