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 |