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

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: 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 286 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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
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
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
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