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

Unified Diff: content/browser/web_contents/web_contents_impl_unittest.cc

Issue 925623002: Refactor the loading tracking logic in WebContentsImpl. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Nitses. Created 5 years, 10 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « content/browser/web_contents/web_contents_impl.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: content/browser/web_contents/web_contents_impl_unittest.cc
diff --git a/content/browser/web_contents/web_contents_impl_unittest.cc b/content/browser/web_contents/web_contents_impl_unittest.cc
index 5e322ef3fe8fcad6d1c4bbe1a6d142d624119e6f..dfba4445ce83e7aaca117e2f6ce2bbef99f9b330 100644
--- a/content/browser/web_contents/web_contents_impl_unittest.cc
+++ b/content/browser/web_contents/web_contents_impl_unittest.cc
@@ -2884,6 +2884,70 @@ TEST_F(WebContentsImplTest, StartStopEventsBalance) {
EXPECT_FALSE(observer.is_loading());
}
+// Ensure that WebContentsImpl does not stop loading too early when there still
+// is a pending renderer. This can happen if a same-process non user-initiated
+// navigation completes while there is an ongoing cross-process navigation.
+// TODO(fdegans): Rewrite the test for PlzNavigate when DidStartLoading and
+// DidStopLoading are properly called.
+TEST_F(WebContentsImplTest, NoEarlyStop) {
+ const GURL kUrl1("http://www.chromium.org");
+ const GURL kUrl2("http://www.google.com");
+ const GURL kUrl3("http://www.wikipedia.org");
+
+ contents()->NavigateAndCommit(kUrl1);
+
+ TestRenderFrameHost* current_rfh = contents()->GetMainFrame();
+
+ // Start a browser-initiated cross-process navigation to |kUrl2|. There should
+ // be a pending RenderFrameHost and the WebContents should be loading.
+ controller().LoadURL(
+ kUrl2, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string());
+ EXPECT_TRUE(contents()->cross_navigation_pending());
+ TestRenderFrameHost* pending_rfh = contents()->GetPendingMainFrame();
+ ASSERT_TRUE(pending_rfh);
+ EXPECT_TRUE(contents()->IsLoading());
+
+ // The current RenderFrameHost starts a non user-initiated render-initiated
+ // navigation and sends a DidStartLoading IPC. The WebContents should still be
+ // loading.
+ current_rfh->OnMessageReceived(
+ FrameHostMsg_DidStartLoading(current_rfh->GetRoutingID(), false));
+ EXPECT_TRUE(contents()->IsLoading());
+
+ // Simulate the pending RenderFrameHost DidStartLoading. There should still be
+ // a pending RenderFrameHost and the WebContents should still be loading.
+ pending_rfh->PrepareForCommit();
+ pending_rfh->OnMessageReceived(
+ FrameHostMsg_DidStartLoading(pending_rfh->GetRoutingID(), false));
+ EXPECT_EQ(contents()->GetPendingMainFrame(), pending_rfh);
+ EXPECT_TRUE(contents()->IsLoading());
+
+ // Simulate the commit and DidStopLoading from the renderer-initiated
+ // navigation in the current RenderFrameHost. There should still be a pending
+ // RenderFrameHost and the WebContents should still be loading.
+ current_rfh->SendNavigate(1, kUrl3);
+ current_rfh->OnMessageReceived(
+ FrameHostMsg_DidStopLoading(current_rfh->GetRoutingID()));
+ EXPECT_EQ(contents()->GetPendingMainFrame(), pending_rfh);
+ EXPECT_TRUE(contents()->IsLoading());
+
+ // Commit the navigation. The formerly pending RenderFrameHost should now be
+ // the current RenderFrameHost and the WebContents should still be loading.
+ contents()->TestDidNavigate(pending_rfh, 1, kUrl2,
+ ui::PAGE_TRANSITION_TYPED);
+ EXPECT_FALSE(contents()->GetPendingMainFrame());
+ TestRenderFrameHost* new_current_rfh = contents()->GetMainFrame();
+ EXPECT_EQ(new_current_rfh, pending_rfh);
+ EXPECT_TRUE(contents()->IsLoading());
+
+ // Simulate the new current RenderFrameHost DidStopLoading. The WebContents
+ // should now have stopped loading.
+ new_current_rfh->OnMessageReceived(
+ FrameHostMsg_DidStopLoading(new_current_rfh->GetRoutingID()));
+ EXPECT_EQ(contents()->GetMainFrame(), new_current_rfh);
+ EXPECT_FALSE(contents()->IsLoading());
+}
+
TEST_F(WebContentsImplTest, MediaPowerSaveBlocking) {
// PlayerIDs are actually pointers cast to int64, so verify that both negative
// and positive player ids don't blow up.
« no previous file with comments | « content/browser/web_contents/web_contents_impl.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698