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

Side by Side Diff: content/browser/frame_host/render_frame_host_manager.cc

Issue 1048463004: PlzNavigate: track pending commits (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Now tracking pending commits Created 5 years, 8 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
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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/frame_host/render_frame_host_manager.h" 5 #include "content/browser/frame_host/render_frame_host_manager.h"
6 6
7 #include <utility> 7 #include <utility>
8 8
9 #include "base/command_line.h" 9 #include "base/command_line.h"
10 #include "base/logging.h" 10 #include "base/logging.h"
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
56 RenderWidgetHostDelegate* render_widget_delegate, 56 RenderWidgetHostDelegate* render_widget_delegate,
57 Delegate* delegate) 57 Delegate* delegate)
58 : frame_tree_node_(frame_tree_node), 58 : frame_tree_node_(frame_tree_node),
59 delegate_(delegate), 59 delegate_(delegate),
60 cross_navigation_pending_(false), 60 cross_navigation_pending_(false),
61 render_frame_delegate_(render_frame_delegate), 61 render_frame_delegate_(render_frame_delegate),
62 render_view_delegate_(render_view_delegate), 62 render_view_delegate_(render_view_delegate),
63 render_widget_delegate_(render_widget_delegate), 63 render_widget_delegate_(render_widget_delegate),
64 interstitial_page_(nullptr), 64 interstitial_page_(nullptr),
65 should_reuse_web_ui_(false), 65 should_reuse_web_ui_(false),
66 pending_commit_current_frame_(false),
67 pending_commit_speculative_frame_(false),
66 weak_factory_(this) { 68 weak_factory_(this) {
67 DCHECK(frame_tree_node_); 69 DCHECK(frame_tree_node_);
68 } 70 }
69 71
70 RenderFrameHostManager::~RenderFrameHostManager() { 72 RenderFrameHostManager::~RenderFrameHostManager() {
71 if (pending_render_frame_host_) 73 if (pending_render_frame_host_)
72 UnsetPendingRenderFrameHost(); 74 UnsetPendingRenderFrameHost();
73 75
74 if (speculative_render_frame_host_) 76 if (speculative_render_frame_host_)
75 UnsetSpeculativeRenderFrameHost(); 77 UnsetSpeculativeRenderFrameHost();
(...skipping 375 matching lines...) Expand 10 before | Expand all | Expand 10 after
451 // prior to navigation take effect. 453 // prior to navigation take effect.
452 CommitPendingSandboxFlags(); 454 CommitPendingSandboxFlags();
453 } 455 }
454 456
455 void RenderFrameHostManager::CommitPendingIfNecessary( 457 void RenderFrameHostManager::CommitPendingIfNecessary(
456 RenderFrameHostImpl* render_frame_host, 458 RenderFrameHostImpl* render_frame_host,
457 bool was_caused_by_user_gesture) { 459 bool was_caused_by_user_gesture) {
458 if (base::CommandLine::ForCurrentProcess()->HasSwitch( 460 if (base::CommandLine::ForCurrentProcess()->HasSwitch(
459 switches::kEnableBrowserSideNavigation)) { 461 switches::kEnableBrowserSideNavigation)) {
460 if (render_frame_host == speculative_render_frame_host_.get()) { 462 if (render_frame_host == speculative_render_frame_host_.get()) {
463 DCHECK(pending_commit_speculative_frame_);
461 CommitPending(); 464 CommitPending();
462 } else if (render_frame_host == render_frame_host_.get()) { 465 } else if (render_frame_host == render_frame_host_.get()) {
463 // TODO(carlosk): this code doesn't properly handle in-page navigation or 466 // TODO(carlosk): this code doesn't properly handle in-page navigation or
464 // interwoven navigation requests. 467 // interwoven navigation requests.
468 DCHECK(pending_commit_current_frame_);
Charlie Reis 2015/04/03 06:02:58 This appears to be the only place that pending_com
clamy 2015/04/07 16:29:21 So I ended up moving the state tracking to RenderF
Charlie Reis 2015/04/07 17:04:47 Hmm, ok. It would be nice to not need this in shi
465 DCHECK(!speculative_render_frame_host_); 469 DCHECK(!speculative_render_frame_host_);
466 } else { 470 } else {
467 // No one else should be sending us a DidNavigate in this state. 471 // No one else should be sending us a DidNavigate in this state.
468 DCHECK(false); 472 DCHECK(false);
469 } 473 }
474 // The current frame either committed or was swapped out.
475 pending_commit_current_frame_ = false;
Charlie Reis 2015/04/03 06:02:58 What if pending_commit_speculative_frame_ was true
470 DCHECK(!speculative_render_frame_host_); 476 DCHECK(!speculative_render_frame_host_);
471 return; 477 return;
472 } 478 }
473 479
474 if (!cross_navigation_pending_) { 480 if (!cross_navigation_pending_) {
475 DCHECK(!pending_render_frame_host_); 481 DCHECK(!pending_render_frame_host_);
476 482
477 // We should only hear this from our current renderer. 483 // We should only hear this from our current renderer.
478 DCHECK_EQ(render_frame_host_, render_frame_host); 484 DCHECK_EQ(render_frame_host_, render_frame_host);
479 485
(...skipping 244 matching lines...) Expand 10 before | Expand all | Expand 10 after
724 730
725 // PlzNavigate 731 // PlzNavigate
726 void RenderFrameHostManager::BeginNavigation(const NavigationRequest& request) { 732 void RenderFrameHostManager::BeginNavigation(const NavigationRequest& request) {
727 CHECK(base::CommandLine::ForCurrentProcess()->HasSwitch( 733 CHECK(base::CommandLine::ForCurrentProcess()->HasSwitch(
728 switches::kEnableBrowserSideNavigation)); 734 switches::kEnableBrowserSideNavigation));
729 // Clean up any state in case there's an ongoing navigation. 735 // Clean up any state in case there's an ongoing navigation.
730 // TODO(carlosk): remove this cleanup here once we properly cancel ongoing 736 // TODO(carlosk): remove this cleanup here once we properly cancel ongoing
731 // navigations. 737 // navigations.
732 CleanUpNavigation(); 738 CleanUpNavigation();
733 739
734 RenderFrameHostImpl* dest_rfh = GetFrameHostForNavigation(request); 740 RenderFrameHostImpl* dest_rfh = GetFrameHostForNavigation(request, false);
735 DCHECK(dest_rfh); 741 DCHECK(dest_rfh);
736 } 742 }
737 743
738 // PlzNavigate 744 // PlzNavigate
739 RenderFrameHostImpl* RenderFrameHostManager::GetFrameHostForNavigation( 745 RenderFrameHostImpl* RenderFrameHostManager::GetFrameHostForNavigation(
740 const NavigationRequest& request) { 746 const NavigationRequest& request,
747 bool is_for_commit) {
741 CHECK(base::CommandLine::ForCurrentProcess()->HasSwitch( 748 CHECK(base::CommandLine::ForCurrentProcess()->HasSwitch(
742 switches::kEnableBrowserSideNavigation)); 749 switches::kEnableBrowserSideNavigation));
743 750
744 SiteInstance* current_site_instance = render_frame_host_->GetSiteInstance(); 751 SiteInstance* current_site_instance = render_frame_host_->GetSiteInstance();
745 752
746 scoped_refptr<SiteInstance> dest_site_instance = GetSiteInstanceForNavigation( 753 scoped_refptr<SiteInstance> dest_site_instance = GetSiteInstanceForNavigation(
747 request.common_params().url, request.source_site_instance(), 754 request.common_params().url, request.source_site_instance(),
748 request.dest_site_instance(), request.common_params().transition, 755 request.dest_site_instance(), request.common_params().transition,
749 request.restore_type() != NavigationEntryImpl::RESTORE_NONE, 756 request.restore_type() != NavigationEntryImpl::RESTORE_NONE,
750 request.is_view_source()); 757 request.is_view_source());
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
820 if (!navigation_rfh->IsRenderFrameLive()) { 827 if (!navigation_rfh->IsRenderFrameLive()) {
821 // Recreate the opener chain. 828 // Recreate the opener chain.
822 int opener_route_id = delegate_->CreateOpenerRenderViewsForRenderManager( 829 int opener_route_id = delegate_->CreateOpenerRenderViewsForRenderManager(
823 navigation_rfh->GetSiteInstance()); 830 navigation_rfh->GetSiteInstance());
824 if (!InitRenderView(navigation_rfh->render_view_host(), opener_route_id, 831 if (!InitRenderView(navigation_rfh->render_view_host(), opener_route_id,
825 MSG_ROUTING_NONE, frame_tree_node_->IsMainFrame())) { 832 MSG_ROUTING_NONE, frame_tree_node_->IsMainFrame())) {
826 return nullptr; 833 return nullptr;
827 } 834 }
828 } 835 }
829 836
830 cross_navigation_pending_ = navigation_rfh != render_frame_host_.get(); 837 // Register that a commit is pending.
838 if (is_for_commit) {
Charlie Reis 2015/04/03 06:02:58 This is only used at the end of the method and doe
839 if (navigation_rfh == render_frame_host_.get())
840 pending_commit_current_frame_ = true;
841 else
842 pending_commit_speculative_frame_ = true;
843 }
844
831 return navigation_rfh; 845 return navigation_rfh;
832 } 846 }
833 847
834 // PlzNavigate 848 // PlzNavigate
835 void RenderFrameHostManager::CleanUpNavigation() { 849 void RenderFrameHostManager::CleanUpNavigation() {
836 CHECK(base::CommandLine::ForCurrentProcess()->HasSwitch( 850 CHECK(base::CommandLine::ForCurrentProcess()->HasSwitch(
837 switches::kEnableBrowserSideNavigation)); 851 switches::kEnableBrowserSideNavigation));
838 speculative_web_ui_.reset(); 852 speculative_web_ui_.reset();
839 should_reuse_web_ui_ = false; 853 should_reuse_web_ui_ = false;
854 pending_commit_speculative_frame_ = false;
Charlie Reis 2015/04/03 06:02:59 This is where your comment about it being impossib
840 if (speculative_render_frame_host_) 855 if (speculative_render_frame_host_)
841 DiscardUnusedFrame(UnsetSpeculativeRenderFrameHost()); 856 DiscardUnusedFrame(UnsetSpeculativeRenderFrameHost());
842 } 857 }
843 858
844 // PlzNavigate 859 // PlzNavigate
845 scoped_ptr<RenderFrameHostImpl> 860 scoped_ptr<RenderFrameHostImpl>
846 RenderFrameHostManager::UnsetSpeculativeRenderFrameHost() { 861 RenderFrameHostManager::UnsetSpeculativeRenderFrameHost() {
847 CHECK(base::CommandLine::ForCurrentProcess()->HasSwitch( 862 CHECK(base::CommandLine::ForCurrentProcess()->HasSwitch(
848 switches::kEnableBrowserSideNavigation)); 863 switches::kEnableBrowserSideNavigation));
849 speculative_render_frame_host_->GetProcess()->RemovePendingView(); 864 speculative_render_frame_host_->GetProcess()->RemovePendingView();
(...skipping 814 matching lines...) Expand 10 before | Expand all | Expand 10 after
1664 scoped_ptr<RenderFrameHostImpl> old_render_frame_host; 1679 scoped_ptr<RenderFrameHostImpl> old_render_frame_host;
1665 if (!browser_side_navigation) { 1680 if (!browser_side_navigation) {
1666 DCHECK(!speculative_render_frame_host_); 1681 DCHECK(!speculative_render_frame_host_);
1667 old_render_frame_host = 1682 old_render_frame_host =
1668 SetRenderFrameHost(pending_render_frame_host_.Pass()); 1683 SetRenderFrameHost(pending_render_frame_host_.Pass());
1669 } else { 1684 } else {
1670 // PlzNavigate 1685 // PlzNavigate
1671 DCHECK(speculative_render_frame_host_); 1686 DCHECK(speculative_render_frame_host_);
1672 old_render_frame_host = 1687 old_render_frame_host =
1673 SetRenderFrameHost(speculative_render_frame_host_.Pass()); 1688 SetRenderFrameHost(speculative_render_frame_host_.Pass());
1689 pending_commit_speculative_frame_ = false;
1674 } 1690 }
1675 cross_navigation_pending_ = false; 1691 cross_navigation_pending_ = false;
1676 1692
1677 if (is_main_frame) 1693 if (is_main_frame)
1678 render_frame_host_->render_view_host()->AttachToFrameTree(); 1694 render_frame_host_->render_view_host()->AttachToFrameTree();
1679 1695
1680 // The process will no longer try to exit, so we can decrement the count. 1696 // The process will no longer try to exit, so we can decrement the count.
1681 render_frame_host_->GetProcess()->RemovePendingView(); 1697 render_frame_host_->GetProcess()->RemovePendingView();
1682 1698
1683 // Show the new view (or a sad tab) if necessary. 1699 // Show the new view (or a sad tab) if necessary.
(...skipping 335 matching lines...) Expand 10 before | Expand all | Expand 10 after
2019 void RenderFrameHostManager::DeleteRenderFrameProxyHost( 2035 void RenderFrameHostManager::DeleteRenderFrameProxyHost(
2020 SiteInstance* instance) { 2036 SiteInstance* instance) {
2021 RenderFrameProxyHostMap::iterator iter = proxy_hosts_.find(instance->GetId()); 2037 RenderFrameProxyHostMap::iterator iter = proxy_hosts_.find(instance->GetId());
2022 if (iter != proxy_hosts_.end()) { 2038 if (iter != proxy_hosts_.end()) {
2023 delete iter->second; 2039 delete iter->second;
2024 proxy_hosts_.erase(iter); 2040 proxy_hosts_.erase(iter);
2025 } 2041 }
2026 } 2042 }
2027 2043
2028 } // namespace content 2044 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698