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

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

Issue 1459343004: RenderFrameDevToolsAgentHost uses new navigation observer API. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: WIP: RenderFrameHostChanged is no more Created 5 years 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
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"
11 #include "content/browser/devtools/devtools_frame_trace_recorder.h" 11 #include "content/browser/devtools/devtools_frame_trace_recorder.h"
12 #include "content/browser/devtools/devtools_protocol_handler.h" 12 #include "content/browser/devtools/devtools_protocol_handler.h"
13 #include "content/browser/devtools/protocol/dom_handler.h" 13 #include "content/browser/devtools/protocol/dom_handler.h"
14 #include "content/browser/devtools/protocol/emulation_handler.h" 14 #include "content/browser/devtools/protocol/emulation_handler.h"
15 #include "content/browser/devtools/protocol/input_handler.h" 15 #include "content/browser/devtools/protocol/input_handler.h"
16 #include "content/browser/devtools/protocol/inspector_handler.h" 16 #include "content/browser/devtools/protocol/inspector_handler.h"
17 #include "content/browser/devtools/protocol/io_handler.h" 17 #include "content/browser/devtools/protocol/io_handler.h"
18 #include "content/browser/devtools/protocol/network_handler.h" 18 #include "content/browser/devtools/protocol/network_handler.h"
19 #include "content/browser/devtools/protocol/page_handler.h" 19 #include "content/browser/devtools/protocol/page_handler.h"
20 #include "content/browser/devtools/protocol/security_handler.h" 20 #include "content/browser/devtools/protocol/security_handler.h"
21 #include "content/browser/devtools/protocol/service_worker_handler.h" 21 #include "content/browser/devtools/protocol/service_worker_handler.h"
22 #include "content/browser/devtools/protocol/tracing_handler.h" 22 #include "content/browser/devtools/protocol/tracing_handler.h"
23 #include "content/browser/frame_host/navigation_handle_impl.h"
23 #include "content/browser/frame_host/render_frame_host_impl.h" 24 #include "content/browser/frame_host/render_frame_host_impl.h"
24 #include "content/browser/renderer_host/render_process_host_impl.h" 25 #include "content/browser/renderer_host/render_process_host_impl.h"
25 #include "content/browser/renderer_host/render_view_host_impl.h" 26 #include "content/browser/renderer_host/render_view_host_impl.h"
26 #include "content/browser/site_instance_impl.h" 27 #include "content/browser/site_instance_impl.h"
27 #include "content/browser/web_contents/web_contents_impl.h" 28 #include "content/browser/web_contents/web_contents_impl.h"
28 #include "content/common/view_messages.h" 29 #include "content/common/view_messages.h"
29 #include "content/public/browser/browser_context.h" 30 #include "content/public/browser/browser_context.h"
30 #include "content/public/browser/content_browser_client.h" 31 #include "content/public/browser/content_browser_client.h"
31 #include "content/public/browser/render_widget_host_iterator.h" 32 #include "content/public/browser/render_widget_host_iterator.h"
32 #include "content/public/browser/web_contents_delegate.h" 33 #include "content/public/browser/web_contents_delegate.h"
(...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after
224 void RenderFrameDevToolsAgentHost::FrameHostHolder::Resume() { 225 void RenderFrameDevToolsAgentHost::FrameHostHolder::Resume() {
225 suspended_ = false; 226 suspended_ = false;
226 for (const auto& pair : pending_messages_) 227 for (const auto& pair : pending_messages_)
227 agent_->SendMessageToClient(pair.first, pair.second); 228 agent_->SendMessageToClient(pair.first, pair.second);
228 std::vector<std::pair<int, std::string>> empty; 229 std::vector<std::pair<int, std::string>> empty;
229 pending_messages_.swap(empty); 230 pending_messages_.swap(empty);
230 } 231 }
231 232
232 // RenderFrameDevToolsAgentHost ------------------------------------------------ 233 // RenderFrameDevToolsAgentHost ------------------------------------------------
233 234
235 // static
234 scoped_refptr<DevToolsAgentHost> 236 scoped_refptr<DevToolsAgentHost>
235 DevToolsAgentHost::GetOrCreateFor(RenderFrameHost* frame_host) { 237 DevToolsAgentHost::GetOrCreateFor(RenderFrameHost* frame_host) {
236 while (frame_host && !ShouldCreateDevToolsFor(frame_host)) 238 while (frame_host && !ShouldCreateDevToolsFor(frame_host))
237 frame_host = frame_host->GetParent(); 239 frame_host = frame_host->GetParent();
238 DCHECK(frame_host); 240 DCHECK(frame_host);
239 RenderFrameDevToolsAgentHost* result = FindAgentHost(frame_host); 241 RenderFrameDevToolsAgentHost* result = FindAgentHost(frame_host);
240 if (!result) { 242 if (!result) {
241 result = new RenderFrameDevToolsAgentHost( 243 result = new RenderFrameDevToolsAgentHost(
242 static_cast<RenderFrameHostImpl*>(frame_host)); 244 static_cast<RenderFrameHostImpl*>(frame_host));
243 } 245 }
244 return result; 246 return result;
245 } 247 }
246 248
249 // static
247 scoped_refptr<DevToolsAgentHost> 250 scoped_refptr<DevToolsAgentHost>
248 DevToolsAgentHost::GetOrCreateFor(WebContents* web_contents) { 251 DevToolsAgentHost::GetOrCreateFor(WebContents* web_contents) {
249 RenderFrameDevToolsAgentHost* result = FindAgentHost(web_contents); 252 RenderFrameDevToolsAgentHost* result = FindAgentHost(web_contents);
250 if (!result) { 253 if (!result) {
251 // TODO(dgozman): this check should not be necessary. See 254 // TODO(dgozman): this check should not be necessary. See
252 // http://crbug.com/489664. 255 // http://crbug.com/489664.
253 if (!web_contents->GetMainFrame()) 256 if (!web_contents->GetMainFrame())
254 return nullptr; 257 return nullptr;
255 result = new RenderFrameDevToolsAgentHost( 258 result = new RenderFrameDevToolsAgentHost(
256 static_cast<RenderFrameHostImpl*>(web_contents->GetMainFrame())); 259 static_cast<RenderFrameHostImpl*>(web_contents->GetMainFrame()));
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
330 page_handler_(nullptr), 333 page_handler_(nullptr),
331 security_handler_(nullptr), 334 security_handler_(nullptr),
332 service_worker_handler_( 335 service_worker_handler_(
333 new devtools::service_worker::ServiceWorkerHandler()), 336 new devtools::service_worker::ServiceWorkerHandler()),
334 tracing_handler_(new devtools::tracing::TracingHandler( 337 tracing_handler_(new devtools::tracing::TracingHandler(
335 devtools::tracing::TracingHandler::Renderer, 338 devtools::tracing::TracingHandler::Renderer,
336 GetIOContext())), 339 GetIOContext())),
337 emulation_handler_(nullptr), 340 emulation_handler_(nullptr),
338 frame_trace_recorder_(nullptr), 341 frame_trace_recorder_(nullptr),
339 protocol_handler_(new DevToolsProtocolHandler(this)), 342 protocol_handler_(new DevToolsProtocolHandler(this)),
340 current_frame_crashed_(false) { 343 current_frame_crashed_(false),
344 frame_tree_node_(host->frame_tree_node()) {
341 DevToolsProtocolDispatcher* dispatcher = protocol_handler_->dispatcher(); 345 DevToolsProtocolDispatcher* dispatcher = protocol_handler_->dispatcher();
342 dispatcher->SetDOMHandler(dom_handler_.get()); 346 dispatcher->SetDOMHandler(dom_handler_.get());
343 dispatcher->SetInputHandler(input_handler_.get()); 347 dispatcher->SetInputHandler(input_handler_.get());
344 dispatcher->SetInspectorHandler(inspector_handler_.get()); 348 dispatcher->SetInspectorHandler(inspector_handler_.get());
345 dispatcher->SetIOHandler(io_handler_.get()); 349 dispatcher->SetIOHandler(io_handler_.get());
346 dispatcher->SetNetworkHandler(network_handler_.get()); 350 dispatcher->SetNetworkHandler(network_handler_.get());
347 dispatcher->SetServiceWorkerHandler(service_worker_handler_.get()); 351 dispatcher->SetServiceWorkerHandler(service_worker_handler_.get());
348 dispatcher->SetTracingHandler(tracing_handler_.get()); 352 dispatcher->SetTracingHandler(tracing_handler_.get());
349 353
350 if (!host->GetParent()) { 354 if (!host->GetParent()) {
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after
486 } 490 }
487 491
488 RenderFrameDevToolsAgentHost::~RenderFrameDevToolsAgentHost() { 492 RenderFrameDevToolsAgentHost::~RenderFrameDevToolsAgentHost() {
489 Instances::iterator it = std::find(g_instances.Get().begin(), 493 Instances::iterator it = std::find(g_instances.Get().begin(),
490 g_instances.Get().end(), 494 g_instances.Get().end(),
491 this); 495 this);
492 if (it != g_instances.Get().end()) 496 if (it != g_instances.Get().end())
493 g_instances.Get().erase(it); 497 g_instances.Get().erase(it);
494 } 498 }
495 499
500 void RenderFrameDevToolsAgentHost::DidFinishNavigation(
501 NavigationHandle* navigation_handle) {
502 if (MatchesMyTreeNode(navigation_handle) && pending_) {
503 if (navigation_handle->HasCommitted() &&
504 !navigation_handle->IsErrorPage()) {
505 // This was a successful navigation
506 CommitPending();
507 CHECK(current_->host() == navigation_handle->GetRenderFrameHost());
508 } else {
509 // This was an unsuccessful navigation (canceled, failed, interrupted...).
510 DiscardPending();
511 }
512 }
513 service_worker_handler_->UpdateHosts();
514 }
515
496 void RenderFrameDevToolsAgentHost::AboutToNavigateRenderFrame( 516 void RenderFrameDevToolsAgentHost::AboutToNavigateRenderFrame(
497 RenderFrameHost* old_host, 517 RenderFrameHost* old_host,
498 RenderFrameHost* new_host) { 518 RenderFrameHost* new_host) {
519 if (!MatchesMyTreeNode(old_host))
520 return;
499 DCHECK(!pending_ || pending_->host() != old_host); 521 DCHECK(!pending_ || pending_->host() != old_host);
500 if (!current_ || current_->host() != old_host)
501 return;
502 if (old_host == new_host && !current_frame_crashed_) 522 if (old_host == new_host && !current_frame_crashed_)
503 return; 523 return;
504 DCHECK(!pending_); 524 DCHECK(!pending_);
505 SetPending(static_cast<RenderFrameHostImpl*>(new_host)); 525 SetPending(static_cast<RenderFrameHostImpl*>(new_host));
506 } 526 }
507 527
508 void RenderFrameDevToolsAgentHost::RenderFrameHostChanged( 528 // void RenderFrameDevToolsAgentHost::RenderFrameHostChanged(
509 RenderFrameHost* old_host, 529 // RenderFrameHost* old_host,
510 RenderFrameHost* new_host) { 530 // RenderFrameHost* new_host) {
511 DCHECK(!pending_ || pending_->host() != old_host); 531 // if (!MatchesMyTreeNode(old_host))
512 if (!current_ || current_->host() != old_host) 532 // return;
513 return; 533 // DCHECK(!pending_ || pending_->host() != old_host);
514 534
515 // AboutToNavigateRenderFrame was not called for renderer-initiated 535 // // AboutToNavigateRenderFrame was not called for renderer-initiated
516 // navigation. 536 // // navigation.
517 if (!pending_) 537 // if (!pending_) {
518 SetPending(static_cast<RenderFrameHostImpl*>(new_host)); 538 // SetPending(static_cast<RenderFrameHostImpl*>(new_host));
539 // } else {
540 // DCHECK(pending_->host() == new_host);
541 // }
519 542
520 CommitPending(); 543 // CommitPending();
521 } 544 // }
522 545
523 void RenderFrameDevToolsAgentHost::FrameDeleted(RenderFrameHost* rfh) { 546 void RenderFrameDevToolsAgentHost::FrameDeleted(RenderFrameHost* rfh) {
524 if (pending_ && pending_->host() == rfh) { 547 if (pending_ && pending_->host() == rfh) {
525 DiscardPending(); 548 DiscardPending();
526 return; 549 return;
527 } 550 }
528 551
529 if (current_ && current_->host() == rfh) 552 if (current_ && current_->host() == rfh)
530 DestroyOnRenderFrameGone(); // |this| may be deleted at this point. 553 DestroyOnRenderFrameGone(); // |this| may be deleted at this point.
531 } 554 }
532 555
533 void RenderFrameDevToolsAgentHost::RenderFrameDeleted(RenderFrameHost* rfh) { 556 void RenderFrameDevToolsAgentHost::RenderFrameDeleted(RenderFrameHost* rfh) {
534 if (!current_frame_crashed_) 557 if (!current_frame_crashed_)
535 FrameDeleted(rfh); 558 FrameDeleted(rfh);
536 } 559 }
537 560
538 void RenderFrameDevToolsAgentHost::DestroyOnRenderFrameGone() { 561 void RenderFrameDevToolsAgentHost::DestroyOnRenderFrameGone() {
539 DCHECK(current_); 562 DCHECK(current_);
540 scoped_refptr<RenderFrameDevToolsAgentHost> protect(this); 563 scoped_refptr<RenderFrameDevToolsAgentHost> protect(this);
541 UpdateProtocolHandlers(nullptr); 564 UpdateProtocolHandlers(nullptr);
542 if (IsAttached()) 565 if (IsAttached())
543 OnClientDetached(); 566 OnClientDetached();
544 HostClosed(); 567 HostClosed();
545 pending_.reset(); 568 pending_.reset();
546 current_.reset(); 569 current_.reset();
570 frame_tree_node_ = nullptr;
571 WebContentsObserver::Observe(nullptr);
547 Release(); 572 Release();
548 } 573 }
549 574
550 void RenderFrameDevToolsAgentHost::RenderProcessGone( 575 void RenderFrameDevToolsAgentHost::RenderProcessGone(
551 base::TerminationStatus status) { 576 base::TerminationStatus status) {
552 switch(status) { 577 switch(status) {
553 case base::TERMINATION_STATUS_ABNORMAL_TERMINATION: 578 case base::TERMINATION_STATUS_ABNORMAL_TERMINATION:
554 case base::TERMINATION_STATUS_PROCESS_WAS_KILLED: 579 case base::TERMINATION_STATUS_PROCESS_WAS_KILLED:
555 #if defined(OS_CHROMEOS) 580 #if defined(OS_CHROMEOS)
556 case base::TERMINATION_STATUS_PROCESS_WAS_KILLED_BY_OOM: 581 case base::TERMINATION_STATUS_PROCESS_WAS_KILLED_BY_OOM:
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
611 // Pending set in AboutToNavigateRenderFrame turned out to be interstitial. 636 // Pending set in AboutToNavigateRenderFrame turned out to be interstitial.
612 // Connect back to the real one. 637 // Connect back to the real one.
613 DiscardPending(); 638 DiscardPending();
614 } 639 }
615 640
616 void RenderFrameDevToolsAgentHost::DidDetachInterstitialPage() { 641 void RenderFrameDevToolsAgentHost::DidDetachInterstitialPage() {
617 if (page_handler_) 642 if (page_handler_)
618 page_handler_->DidDetachInterstitialPage(); 643 page_handler_->DidDetachInterstitialPage();
619 } 644 }
620 645
621 void RenderFrameDevToolsAgentHost::DidCommitProvisionalLoadForFrame(
622 RenderFrameHost* render_frame_host,
623 const GURL& url,
624 ui::PageTransition transition_type) {
625 if (pending_ && pending_->host() == render_frame_host)
626 CommitPending();
627 service_worker_handler_->UpdateHosts();
628 }
629
630 void RenderFrameDevToolsAgentHost::DidFailProvisionalLoad(
631 RenderFrameHost* render_frame_host,
632 const GURL& validated_url,
633 int error_code,
634 const base::string16& error_description,
635 bool was_ignored_by_handler) {
636 if (pending_ && pending_->host() == render_frame_host)
637 DiscardPending();
638 }
639
640 void RenderFrameDevToolsAgentHost::UpdateProtocolHandlers( 646 void RenderFrameDevToolsAgentHost::UpdateProtocolHandlers(
641 RenderFrameHostImpl* host) { 647 RenderFrameHostImpl* host) {
642 dom_handler_->SetRenderFrameHost(host); 648 dom_handler_->SetRenderFrameHost(host);
643 if (emulation_handler_) 649 if (emulation_handler_)
644 emulation_handler_->SetRenderFrameHost(host); 650 emulation_handler_->SetRenderFrameHost(host);
645 input_handler_->SetRenderWidgetHost( 651 input_handler_->SetRenderWidgetHost(
646 host ? host->GetRenderWidgetHost() : nullptr); 652 host ? host->GetRenderWidgetHost() : nullptr);
647 inspector_handler_->SetRenderFrameHost(host); 653 inspector_handler_->SetRenderFrameHost(host);
648 network_handler_->SetRenderFrameHost(host); 654 network_handler_->SetRenderFrameHost(host);
649 if (page_handler_) 655 if (page_handler_)
650 page_handler_->SetRenderFrameHost(host); 656 page_handler_->SetRenderFrameHost(host);
651 service_worker_handler_->SetRenderFrameHost(host); 657 service_worker_handler_->SetRenderFrameHost(host);
652 if (security_handler_) 658 if (security_handler_)
653 security_handler_->SetRenderFrameHost(host); 659 security_handler_->SetRenderFrameHost(host);
654 } 660 }
655 661
656 void RenderFrameDevToolsAgentHost::DisconnectWebContents() { 662 void RenderFrameDevToolsAgentHost::DisconnectWebContents() {
657 if (pending_) 663 if (pending_)
658 DiscardPending(); 664 DiscardPending();
659 UpdateProtocolHandlers(nullptr); 665 UpdateProtocolHandlers(nullptr);
660 disconnected_ = current_.Pass(); 666 disconnected_ = current_.Pass();
661 disconnected_->Detach(); 667 disconnected_->Detach();
668 frame_tree_node_ = nullptr;
662 WebContentsObserver::Observe(nullptr); 669 WebContentsObserver::Observe(nullptr);
663 } 670 }
664 671
665 void RenderFrameDevToolsAgentHost::ConnectWebContents(WebContents* wc) { 672 void RenderFrameDevToolsAgentHost::ConnectWebContents(WebContents* wc) {
666 DCHECK(!current_); 673 DCHECK(!current_);
667 DCHECK(!pending_); 674 DCHECK(!pending_);
668 RenderFrameHostImpl* host = 675 RenderFrameHostImpl* host =
669 static_cast<RenderFrameHostImpl*>(wc->GetMainFrame()); 676 static_cast<RenderFrameHostImpl*>(wc->GetMainFrame());
670 DCHECK(host); 677 DCHECK(host);
678 frame_tree_node_ = host->frame_tree_node();
671 current_ = disconnected_.Pass(); 679 current_ = disconnected_.Pass();
672 SetPending(host); 680 SetPending(host);
673 CommitPending(); 681 CommitPending();
674 WebContentsObserver::Observe(WebContents::FromRenderFrameHost(host)); 682 WebContentsObserver::Observe(WebContents::FromRenderFrameHost(host));
675 } 683 }
676 684
677 DevToolsAgentHost::Type RenderFrameDevToolsAgentHost::GetType() { 685 DevToolsAgentHost::Type RenderFrameDevToolsAgentHost::GetType() {
678 return IsChildFrame() ? TYPE_FRAME : TYPE_WEB_CONTENTS; 686 return IsChildFrame() ? TYPE_FRAME : TYPE_WEB_CONTENTS;
679 } 687 }
680 688
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
747 bool RenderFrameDevToolsAgentHost::HasRenderFrameHost( 755 bool RenderFrameDevToolsAgentHost::HasRenderFrameHost(
748 RenderFrameHost* host) { 756 RenderFrameHost* host) {
749 return (current_ && current_->host() == host) || 757 return (current_ && current_->host() == host) ||
750 (pending_ && pending_->host() == host); 758 (pending_ && pending_->host() == host);
751 } 759 }
752 760
753 bool RenderFrameDevToolsAgentHost::IsChildFrame() { 761 bool RenderFrameDevToolsAgentHost::IsChildFrame() {
754 return current_ && current_->host()->GetParent(); 762 return current_ && current_->host()->GetParent();
755 } 763 }
756 764
765 bool RenderFrameDevToolsAgentHost::MatchesMyTreeNode(
766 NavigationHandle* navigation_handle) {
767 return frame_tree_node_ ==
768 static_cast<NavigationHandleImpl*>(navigation_handle)
769 ->frame_tree_node();
770 }
771
772 bool RenderFrameDevToolsAgentHost::MatchesMyTreeNode(
773 RenderFrameHost* render_frame_host) {
774 return frame_tree_node_ ==
775 static_cast<RenderFrameHostImpl*>(render_frame_host)
776 ->frame_tree_node();
777 }
778
757 } // namespace content 779 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/devtools/render_frame_devtools_agent_host.h ('k') | content/browser/frame_host/navigation_handle_impl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698