Index: content/browser/frame_host/render_frame_host_manager.cc |
diff --git a/content/browser/frame_host/render_frame_host_manager.cc b/content/browser/frame_host/render_frame_host_manager.cc |
index 29771b2ab65da73c748a60643a0634acce2ec5a2..86ec929606b873d108c635750f63b0177eb29f40 100644 |
--- a/content/browser/frame_host/render_frame_host_manager.cc |
+++ b/content/browser/frame_host/render_frame_host_manager.cc |
@@ -63,6 +63,8 @@ RenderFrameHostManager::RenderFrameHostManager( |
render_widget_delegate_(render_widget_delegate), |
interstitial_page_(nullptr), |
should_reuse_web_ui_(false), |
+ pending_commit_current_frame_(false), |
+ pending_commit_speculative_frame_(false), |
weak_factory_(this) { |
DCHECK(frame_tree_node_); |
} |
@@ -458,15 +460,19 @@ void RenderFrameHostManager::CommitPendingIfNecessary( |
if (base::CommandLine::ForCurrentProcess()->HasSwitch( |
switches::kEnableBrowserSideNavigation)) { |
if (render_frame_host == speculative_render_frame_host_.get()) { |
+ DCHECK(pending_commit_speculative_frame_); |
CommitPending(); |
} else if (render_frame_host == render_frame_host_.get()) { |
// TODO(carlosk): this code doesn't properly handle in-page navigation or |
// interwoven navigation requests. |
+ 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
|
DCHECK(!speculative_render_frame_host_); |
} else { |
// No one else should be sending us a DidNavigate in this state. |
DCHECK(false); |
} |
+ // The current frame either committed or was swapped out. |
+ pending_commit_current_frame_ = false; |
Charlie Reis
2015/04/03 06:02:58
What if pending_commit_speculative_frame_ was true
|
DCHECK(!speculative_render_frame_host_); |
return; |
} |
@@ -731,13 +737,14 @@ void RenderFrameHostManager::BeginNavigation(const NavigationRequest& request) { |
// navigations. |
CleanUpNavigation(); |
- RenderFrameHostImpl* dest_rfh = GetFrameHostForNavigation(request); |
+ RenderFrameHostImpl* dest_rfh = GetFrameHostForNavigation(request, false); |
DCHECK(dest_rfh); |
} |
// PlzNavigate |
RenderFrameHostImpl* RenderFrameHostManager::GetFrameHostForNavigation( |
- const NavigationRequest& request) { |
+ const NavigationRequest& request, |
+ bool is_for_commit) { |
CHECK(base::CommandLine::ForCurrentProcess()->HasSwitch( |
switches::kEnableBrowserSideNavigation)); |
@@ -827,7 +834,14 @@ RenderFrameHostImpl* RenderFrameHostManager::GetFrameHostForNavigation( |
} |
} |
- cross_navigation_pending_ = navigation_rfh != render_frame_host_.get(); |
+ // Register that a commit is pending. |
+ if (is_for_commit) { |
Charlie Reis
2015/04/03 06:02:58
This is only used at the end of the method and doe
|
+ if (navigation_rfh == render_frame_host_.get()) |
+ pending_commit_current_frame_ = true; |
+ else |
+ pending_commit_speculative_frame_ = true; |
+ } |
+ |
return navigation_rfh; |
} |
@@ -837,6 +851,7 @@ void RenderFrameHostManager::CleanUpNavigation() { |
switches::kEnableBrowserSideNavigation)); |
speculative_web_ui_.reset(); |
should_reuse_web_ui_ = false; |
+ pending_commit_speculative_frame_ = false; |
Charlie Reis
2015/04/03 06:02:59
This is where your comment about it being impossib
|
if (speculative_render_frame_host_) |
DiscardUnusedFrame(UnsetSpeculativeRenderFrameHost()); |
} |
@@ -1671,6 +1686,7 @@ void RenderFrameHostManager::CommitPending() { |
DCHECK(speculative_render_frame_host_); |
old_render_frame_host = |
SetRenderFrameHost(speculative_render_frame_host_.Pass()); |
+ pending_commit_speculative_frame_ = false; |
} |
cross_navigation_pending_ = false; |