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

Unified Diff: chrome/browser/ui/browser_browsertest.cc

Issue 15742019: Avoid DidStopLoading messages from the old renderer process during a transfer. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix assumption in test Created 7 years, 7 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: chrome/browser/ui/browser_browsertest.cc
diff --git a/chrome/browser/ui/browser_browsertest.cc b/chrome/browser/ui/browser_browsertest.cc
index 64ff7aa410ae4535b156cfd48b5bf376cfee3671..262ac6b3eea146e91a0064b817c37eeb9db2caf2 100644
--- a/chrome/browser/ui/browser_browsertest.cc
+++ b/chrome/browser/ui/browser_browsertest.cc
@@ -183,14 +183,15 @@ class InterstitialObserver : public content::WebContentsObserver {
DISALLOW_COPY_AND_ASSIGN(InterstitialObserver);
};
-class TransfersAllRedirectsContentBrowserClient
+// Causes the browser to swap processes on a redirect to an HTTPS URL.
+class TransferHttpsRedirectsContentBrowserClient
: public chrome::ChromeContentBrowserClient {
public:
virtual bool ShouldSwapProcessesForRedirect(
content::ResourceContext* resource_context,
const GURL& current_url,
const GURL& new_url) OVERRIDE {
- return true;
+ return new_url.SchemeIs(chrome::kHttpsScheme);
}
};
@@ -376,10 +377,47 @@ IN_PROC_BROWSER_TEST_F(BrowserTest, ReloadThenCancelBeforeUnload) {
ASCIIToUTF16("onbeforeunload=null;"));
}
+// Ensure that a transferred cross-process navigation does not generate
+// DidStopLoading events until the navigation commits. If it did, then
+// ui_test_utils::NavigateToURL would proceed before the URL had committed.
+// http://crbug.com/243957.
+IN_PROC_BROWSER_TEST_F(BrowserTest, NoStopDuringTransferUntilCommit) {
+ // Create HTTP and HTTPS servers for a cross-site transition.
+ ASSERT_TRUE(test_server()->Start());
+ net::SpawnedTestServer https_test_server(net::SpawnedTestServer::TYPE_HTTPS,
+ net::SpawnedTestServer::kLocalhost,
+ base::FilePath(kDocRoot));
+ ASSERT_TRUE(https_test_server.Start());
+
+ // Temporarily replace ContentBrowserClient with one that will cause a
+ // process swap on all redirects to HTTPS URLs.
+ TransferHttpsRedirectsContentBrowserClient new_client;
+ content::ContentBrowserClient* old_client =
+ SetBrowserClientForTesting(&new_client);
+
+ GURL init_url(test_server()->GetURL("files/title1.html"));
+ ui_test_utils::NavigateToURL(browser(), init_url);
+
+ // Navigate to a same-site page that redirects, causing a transfer.
+ GURL dest_url(https_test_server.GetURL("files/title2.html"));
+ GURL redirect_url(test_server()->GetURL("server-redirect?" +
+ dest_url.spec()));
+ ui_test_utils::NavigateToURL(browser(), redirect_url);
+
+ // We should immediately see the new committed entry.
+ WebContents* contents = browser()->tab_strip_model()->GetActiveWebContents();
+ EXPECT_FALSE(contents->GetController().GetPendingEntry());
+ EXPECT_EQ(dest_url,
+ contents->GetController().GetLastCommittedEntry()->GetURL());
+
+ // Restore previous browser client.
+ SetBrowserClientForTesting(old_client);
+}
+
// Tests that a cross-process redirect will only cause the beforeunload
// handler to run once.
IN_PROC_BROWSER_TEST_F(BrowserTest, SingleBeforeUnloadAfterRedirect) {
- // Create HTTP and HTTPS servers for cross-site transition.
+ // Create HTTP and HTTPS servers for a cross-site transition.
ASSERT_TRUE(test_server()->Start());
net::SpawnedTestServer https_test_server(net::SpawnedTestServer::TYPE_HTTPS,
net::SpawnedTestServer::kLocalhost,
@@ -387,8 +425,8 @@ IN_PROC_BROWSER_TEST_F(BrowserTest, SingleBeforeUnloadAfterRedirect) {
ASSERT_TRUE(https_test_server.Start());
// Temporarily replace ContentBrowserClient with one that will cause a
- // process swap on all redirects.
- TransfersAllRedirectsContentBrowserClient new_client;
+ // process swap on all redirects to HTTPS URLs.
+ TransferHttpsRedirectsContentBrowserClient new_client;
content::ContentBrowserClient* old_client =
SetBrowserClientForTesting(&new_client);

Powered by Google App Engine
This is Rietveld 408576698