Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(140)

Side by Side Diff: content/browser/devtools/render_frame_devtools_agent_host.cc

Issue 1181673002: [DevTools] Preserve DevTools for crashed page. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Addressed comment Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « content/browser/devtools/render_frame_devtools_agent_host.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « content/browser/devtools/render_frame_devtools_agent_host.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698