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

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: Rebase 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
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 da3c82e7d4826fe968344dadc907178eca8bb1d1..1a94f1c5a27ac9d353b91beb63f759ff5e440b30 100644
--- a/content/browser/web_contents/web_contents_impl_unittest.cc
+++ b/content/browser/web_contents/web_contents_impl_unittest.cc
@@ -2879,6 +2879,61 @@ 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. The sequence to reproduce the issue is as follows:
+// * StartLoading on a frame.
+// * Start another navigation before the previous frame has finished loading.
+// * StopLoading on the previous navigation.
+// At this point, the WebContentsImpl should still be loading as there is still
+// one pending navigation.
+TEST_F(WebContentsImplTest, NoEarlyStop) {
+ const GURL orig_url("http://www.chromium.org");
+ const GURL new_url("http://www.google.com");
+
+ TestRenderFrameHost* orig_rfh = contents()->GetMainFrame();
+
+ // Navigate the RenderFrame, simulate the DidStartLoading, and commit.
nasko 2015/02/26 23:30:34 nit: RenderFrameHost
Fabrice (no longer in Chrome) 2015/02/27 17:45:25 Acknowledged.
+ // The frame should still be loading.
+ controller().LoadURL(
+ orig_url, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string());
+ orig_rfh->OnMessageReceived(
+ FrameHostMsg_DidStartLoading(orig_rfh->GetRoutingID(), false));
+ contents()->TestDidNavigate(orig_rfh, 1, orig_url, ui::PAGE_TRANSITION_TYPED);
+ EXPECT_FALSE(contents()->cross_navigation_pending());
+ EXPECT_EQ(orig_rfh, contents()->GetMainFrame());
+ EXPECT_TRUE(contents()->IsLoading());
+
+ // Navigate to new site, simulate the DidStartLoading, and commit.
+ // The frame should still be loading.
+ controller().LoadURL(
+ new_url, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string());
+ if (base::CommandLine::ForCurrentProcess()->HasSwitch(
+ switches::kEnableBrowserSideNavigation)) {
+ orig_rfh->PrepareForCommit(new_url);
nasko 2015/02/26 23:30:33 Should this be in an if statement? I thought Prepa
Fabrice (no longer in Chrome) 2015/02/27 17:45:25 You are correct, fixed.
+ }
+ EXPECT_TRUE(contents()->cross_navigation_pending());
+
+ TestRenderFrameHost* new_rfh = contents()->GetPendingMainFrame();
+ ASSERT_NE(new_rfh, nullptr);
+ EXPECT_NE(orig_rfh, new_rfh);
+ new_rfh->OnMessageReceived(
+ FrameHostMsg_DidStartLoading(new_rfh->GetRoutingID(), false));
+ contents()->TestDidNavigate(new_rfh, 1, new_url, ui::PAGE_TRANSITION_TYPED);
+ EXPECT_TRUE(contents()->IsLoading());
+
+ // Simulate the DidStopLoading on the original navigation. The frame should
+ // still be loading.
+ orig_rfh->OnMessageReceived(
+ FrameHostMsg_DidStopLoading(orig_rfh->GetRoutingID()));
+ EXPECT_TRUE(contents()->IsLoading());
+
+ // Simulate the DidStopLoading on the new navigation. The frame should now
+ // have stopped loading.
+ new_rfh->OnMessageReceived(
+ FrameHostMsg_DidStopLoading(new_rfh->GetRoutingID()));
+ 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.

Powered by Google App Engine
This is Rietveld 408576698