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 |