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

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

Issue 853083003: Try to test a theoretical problem: (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 11 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_browsertest.cc
diff --git a/content/browser/web_contents/web_contents_impl_browsertest.cc b/content/browser/web_contents/web_contents_impl_browsertest.cc
index e4a8ee7f367df23e2460315cfaa446defacb7f75..616ea79f836ca5240ab2720cd8821fbcecc01732 100644
--- a/content/browser/web_contents/web_contents_impl_browsertest.cc
+++ b/content/browser/web_contents/web_contents_impl_browsertest.cc
@@ -484,6 +484,7 @@ struct LoadProgressDelegateAndObserver : public WebContentsDelegate,
public WebContentsObserver {
LoadProgressDelegateAndObserver(Shell* shell)
: WebContentsObserver(shell->web_contents()),
+ subframe_rfh(nullptr),
did_start_loading(false),
did_stop_loading(false) {
web_contents()->SetDelegate(this);
@@ -491,6 +492,7 @@ struct LoadProgressDelegateAndObserver : public WebContentsDelegate,
// WebContentsDelegate:
void LoadProgressChanged(WebContents* source, double progress) override {
+ DLOG(INFO) << "LoadProgressChanged";
EXPECT_TRUE(did_start_loading);
EXPECT_FALSE(did_stop_loading);
progresses.push_back(progress);
@@ -498,10 +500,31 @@ struct LoadProgressDelegateAndObserver : public WebContentsDelegate,
// WebContentsObserver:
void DidStartLoading(RenderViewHost* render_view_host) override {
+ DLOG(INFO) << "DidStartLoading for " << render_view_host->GetSiteInstance()->GetSiteURL();
EXPECT_FALSE(did_start_loading);
EXPECT_EQ(0U, progresses.size());
EXPECT_FALSE(did_stop_loading);
did_start_loading = true;
+
+ // TODO(creis): Replace with a callback with a setter function.
+ if (subframe_rfh) {
+ DLOG(INFO) << "Forcing a stale DidStartLoading for " << subframe_rfh->GetSiteInstance()->GetSiteURL();
+ // Before the new navigation has a chance to commit, simulate a
+ // DidStartLoading IPC from the old subframe RFH.
+ FrameHostMsg_DidStartLoading subframe_start_msg(
+ subframe_rfh->GetRoutingID(), true);
+ static_cast<WebContentsImpl*>(web_contents())->OnMessageReceived(
+ subframe_rfh, subframe_start_msg);
+
+ // Also simulate a DidChangeLoadProgress, but not a DidStopLoading.
+ FrameHostMsg_DidChangeLoadProgress progress_msg(
+ subframe_rfh->GetRoutingID(), 1.0);
+ static_cast<WebContentsImpl*>(web_contents())->OnMessageReceived(
+ subframe_rfh, progress_msg);
+
+ // Only do this once.
+ subframe_rfh = nullptr;
+ }
}
void DidStopLoading(RenderViewHost* render_view_host) override {
@@ -511,6 +534,8 @@ struct LoadProgressDelegateAndObserver : public WebContentsDelegate,
did_stop_loading = true;
}
+ // TODO(creis): Replace with a Callback.
+ RenderFrameHost* subframe_rfh;
bool did_start_loading;
std::vector<double> progresses;
bool did_stop_loading;
@@ -600,6 +625,47 @@ IN_PROC_BROWSER_TEST_F(WebContentsImplBrowserTest,
EXPECT_TRUE(delegate->did_stop_loading);
}
+// Ensure that a new navigation that interrupts a pending one will still fire
+// a DidStopLoading. See http://crbug.com/429399.
+IN_PROC_BROWSER_TEST_F(WebContentsImplBrowserTest,
+ LoadProgressAfterStaleDidStart) {
+ host_resolver()->AddRule("*", "127.0.0.1");
+ ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
+
+ // Start at a real page with a subframe.
+ DLOG(INFO) << "First nav";
+ NavigateToURL(shell(), embedded_test_server()->GetURL(
+ "/frame_tree/page_with_one_frame.html"));
+ FrameTree* frame_tree =
+ static_cast<WebContentsImpl*>(shell()->web_contents())->GetFrameTree();
+ ASSERT_EQ(1U, frame_tree->root()->child_count());
+ RenderFrameHost* subframe_rfh =
+ frame_tree->root()->child_at(0)->current_frame_host();
+
+ scoped_ptr<LoadProgressDelegateAndObserver> delegate(
+ new LoadProgressDelegateAndObserver(shell()));
+
+ // Now start a new cross-process navigation.
+ TestNavigationObserver tab_observer(shell()->web_contents(), 1);
+ GURL url(embedded_test_server()->GetURL("foo.com", "/title2.html"));
+ DLOG(INFO) << "Second nav to " << url;
+ shell()->LoadURL(url);
+
+ // Do this after the fake DidStartLoading in RFH::Navigate, so that it runs
+ // when the real DidStartLoading arrives from the old renderer.
+ delegate->subframe_rfh = subframe_rfh;
+
+ // The fake subframe DidStartLoading should have incremented
+ // loading_frames_in_progress_...
+
+ // Now complete the new navigation.
+ tab_observer.Wait();
+ EXPECT_EQ(url, shell()->web_contents()->GetLastCommittedURL());
+
+ // We should have gotten to DidStopLoading.
+ EXPECT_TRUE(delegate->did_stop_loading);
+}
+
struct FirstVisuallyNonEmptyPaintObserver : public WebContentsObserver {
FirstVisuallyNonEmptyPaintObserver(Shell* shell)
: WebContentsObserver(shell->web_contents()),
« 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