| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // Navigates the browser to server and client redirect pages and makes sure | 5 // Navigates the browser to server and client redirect pages and makes sure |
| 6 // that the correct redirects are reflected in the history database. Errors | 6 // that the correct redirects are reflected in the history database. Errors |
| 7 // here might indicate that WebKit changed the calls our glue layer gets in | 7 // here might indicate that WebKit changed the calls our glue layer gets in |
| 8 // the case of redirects. It may also mean problems with the history system. | 8 // the case of redirects. It may also mean problems with the history system. |
| 9 | 9 |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| (...skipping 15 matching lines...) Expand all Loading... |
| 26 #include "chrome/browser/ui/browser.h" | 26 #include "chrome/browser/ui/browser.h" |
| 27 #include "chrome/browser/ui/tabs/tab_strip_model.h" | 27 #include "chrome/browser/ui/tabs/tab_strip_model.h" |
| 28 #include "chrome/browser/ui/view_ids.h" | 28 #include "chrome/browser/ui/view_ids.h" |
| 29 #include "chrome/test/base/in_process_browser_test.h" | 29 #include "chrome/test/base/in_process_browser_test.h" |
| 30 #include "chrome/test/base/ui_test_utils.h" | 30 #include "chrome/test/base/ui_test_utils.h" |
| 31 #include "components/history/core/browser/history_service.h" | 31 #include "components/history/core/browser/history_service.h" |
| 32 #include "content/public/browser/web_contents.h" | 32 #include "content/public/browser/web_contents.h" |
| 33 #include "content/public/test/browser_test_utils.h" | 33 #include "content/public/test/browser_test_utils.h" |
| 34 #include "content/public/test/test_navigation_observer.h" | 34 #include "content/public/test/test_navigation_observer.h" |
| 35 #include "net/base/filename_util.h" | 35 #include "net/base/filename_util.h" |
| 36 #include "net/test/spawned_test_server/spawned_test_server.h" | 36 #include "net/test/embedded_test_server/embedded_test_server.h" |
| 37 #include "ui/events/event_constants.h" | 37 #include "ui/events/event_constants.h" |
| 38 | 38 |
| 39 class RedirectTest : public InProcessBrowserTest { | 39 class RedirectTest : public InProcessBrowserTest { |
| 40 public: | 40 public: |
| 41 RedirectTest() {} | 41 RedirectTest() {} |
| 42 | 42 |
| 43 std::vector<GURL> GetRedirects(const GURL& url) { | 43 std::vector<GURL> GetRedirects(const GURL& url) { |
| 44 history::HistoryService* history_service = | 44 history::HistoryService* history_service = |
| 45 HistoryServiceFactory::GetForProfile( | 45 HistoryServiceFactory::GetForProfile( |
| 46 browser()->profile(), ServiceAccessType::EXPLICIT_ACCESS); | 46 browser()->profile(), ServiceAccessType::EXPLICIT_ACCESS); |
| (...skipping 19 matching lines...) Expand all Loading... |
| 66 base::ThreadTaskRunnerHandle::Get()->PostTask( | 66 base::ThreadTaskRunnerHandle::Get()->PostTask( |
| 67 FROM_HERE, base::MessageLoop::QuitWhenIdleClosure()); | 67 FROM_HERE, base::MessageLoop::QuitWhenIdleClosure()); |
| 68 } | 68 } |
| 69 | 69 |
| 70 // Tracker for asynchronous history queries. | 70 // Tracker for asynchronous history queries. |
| 71 base::CancelableTaskTracker tracker_; | 71 base::CancelableTaskTracker tracker_; |
| 72 }; | 72 }; |
| 73 | 73 |
| 74 // Tests a single server redirect | 74 // Tests a single server redirect |
| 75 IN_PROC_BROWSER_TEST_F(RedirectTest, Server) { | 75 IN_PROC_BROWSER_TEST_F(RedirectTest, Server) { |
| 76 ASSERT_TRUE(test_server()->Start()); | 76 ASSERT_TRUE(embedded_test_server()->Start()); |
| 77 GURL final_url = test_server()->GetURL(std::string()); | 77 GURL final_url = embedded_test_server()->GetURL("/defaultresponse"); |
| 78 GURL first_url = test_server()->GetURL( | 78 GURL first_url = |
| 79 "server-redirect?" + final_url.spec()); | 79 embedded_test_server()->GetURL("/server-redirect?" + final_url.spec()); |
| 80 | 80 |
| 81 ui_test_utils::NavigateToURL(browser(), first_url); | 81 ui_test_utils::NavigateToURL(browser(), first_url); |
| 82 | 82 |
| 83 std::vector<GURL> redirects = GetRedirects(first_url); | 83 std::vector<GURL> redirects = GetRedirects(first_url); |
| 84 | 84 |
| 85 ASSERT_EQ(1U, redirects.size()); | 85 ASSERT_EQ(1U, redirects.size()); |
| 86 EXPECT_EQ(final_url.spec(), redirects[0].spec()); | 86 EXPECT_EQ(final_url.spec(), redirects[0].spec()); |
| 87 } | 87 } |
| 88 | 88 |
| 89 // Tests a single client redirect. | 89 // Tests a single client redirect. |
| 90 IN_PROC_BROWSER_TEST_F(RedirectTest, Client) { | 90 IN_PROC_BROWSER_TEST_F(RedirectTest, Client) { |
| 91 ASSERT_TRUE(test_server()->Start()); | 91 ASSERT_TRUE(embedded_test_server()->Start()); |
| 92 | 92 |
| 93 GURL final_url = test_server()->GetURL(std::string()); | 93 GURL final_url = embedded_test_server()->GetURL("/defaultresponse"); |
| 94 GURL first_url = test_server()->GetURL( | 94 GURL first_url = |
| 95 "client-redirect?" + final_url.spec()); | 95 embedded_test_server()->GetURL("/client-redirect?" + final_url.spec()); |
| 96 | 96 |
| 97 // The client redirect appears as two page visits in the browser. | 97 // The client redirect appears as two page visits in the browser. |
| 98 ui_test_utils::NavigateToURLBlockUntilNavigationsComplete( | 98 ui_test_utils::NavigateToURLBlockUntilNavigationsComplete( |
| 99 browser(), first_url, 2); | 99 browser(), first_url, 2); |
| 100 | 100 |
| 101 std::vector<GURL> redirects = GetRedirects(first_url); | 101 std::vector<GURL> redirects = GetRedirects(first_url); |
| 102 | 102 |
| 103 ASSERT_EQ(1U, redirects.size()); | 103 ASSERT_EQ(1U, redirects.size()); |
| 104 EXPECT_EQ(final_url.spec(), redirects[0].spec()); | 104 EXPECT_EQ(final_url.spec(), redirects[0].spec()); |
| 105 | 105 |
| 106 // The address bar should display the final URL. | 106 // The address bar should display the final URL. |
| 107 EXPECT_EQ(final_url, | 107 EXPECT_EQ(final_url, |
| 108 browser()->tab_strip_model()->GetActiveWebContents()->GetURL()); | 108 browser()->tab_strip_model()->GetActiveWebContents()->GetURL()); |
| 109 | 109 |
| 110 // Navigate one more time. | 110 // Navigate one more time. |
| 111 ui_test_utils::NavigateToURLBlockUntilNavigationsComplete( | 111 ui_test_utils::NavigateToURLBlockUntilNavigationsComplete( |
| 112 browser(), first_url, 2); | 112 browser(), first_url, 2); |
| 113 | 113 |
| 114 // The address bar should still display the final URL. | 114 // The address bar should still display the final URL. |
| 115 EXPECT_EQ(final_url, | 115 EXPECT_EQ(final_url, |
| 116 browser()->tab_strip_model()->GetActiveWebContents()->GetURL()); | 116 browser()->tab_strip_model()->GetActiveWebContents()->GetURL()); |
| 117 } | 117 } |
| 118 | 118 |
| 119 // http://code.google.com/p/chromium/issues/detail?id=62772 | 119 // http://code.google.com/p/chromium/issues/detail?id=62772 |
| 120 IN_PROC_BROWSER_TEST_F(RedirectTest, ClientEmptyReferer) { | 120 IN_PROC_BROWSER_TEST_F(RedirectTest, ClientEmptyReferer) { |
| 121 ASSERT_TRUE(test_server()->Start()); | 121 ASSERT_TRUE(embedded_test_server()->Start()); |
| 122 | 122 |
| 123 // Create the file contents, which will do a redirect to the | 123 // Create the file contents, which will do a redirect to the |
| 124 // test server. | 124 // test server. |
| 125 GURL final_url = test_server()->GetURL(std::string()); | 125 GURL final_url = embedded_test_server()->GetURL("/defaultresponse"); |
| 126 ASSERT_TRUE(final_url.is_valid()); | 126 ASSERT_TRUE(final_url.is_valid()); |
| 127 std::string file_redirect_contents = base::StringPrintf( | 127 std::string file_redirect_contents = base::StringPrintf( |
| 128 "<html>" | 128 "<html>" |
| 129 "<head></head>" | 129 "<head></head>" |
| 130 "<body onload=\"document.location='%s'\"></body>" | 130 "<body onload=\"document.location='%s'\"></body>" |
| 131 "</html>", | 131 "</html>", |
| 132 final_url.spec().c_str()); | 132 final_url.spec().c_str()); |
| 133 | 133 |
| 134 // Write the contents to a temporary file. | 134 // Write the contents to a temporary file. |
| 135 base::ScopedTempDir temp_directory; | 135 base::ScopedTempDir temp_directory; |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 177 | 177 |
| 178 // There should be no redirects from first_url, because the anchor location | 178 // There should be no redirects from first_url, because the anchor location |
| 179 // change that occurs should not be flagged as a redirect and the meta-refresh | 179 // change that occurs should not be flagged as a redirect and the meta-refresh |
| 180 // won't have fired yet. | 180 // won't have fired yet. |
| 181 ASSERT_EQ(0U, redirects.size()); | 181 ASSERT_EQ(0U, redirects.size()); |
| 182 EXPECT_EQ("myanchor", web_contents->GetURL().ref()); | 182 EXPECT_EQ("myanchor", web_contents->GetURL().ref()); |
| 183 } | 183 } |
| 184 | 184 |
| 185 // Tests a client->server->server redirect | 185 // Tests a client->server->server redirect |
| 186 IN_PROC_BROWSER_TEST_F(RedirectTest, ClientServerServer) { | 186 IN_PROC_BROWSER_TEST_F(RedirectTest, ClientServerServer) { |
| 187 ASSERT_TRUE(test_server()->Start()); | 187 ASSERT_TRUE(embedded_test_server()->Start()); |
| 188 | 188 |
| 189 GURL final_url = test_server()->GetURL(std::string()); | 189 GURL final_url = embedded_test_server()->GetURL("/defaultresponse"); |
| 190 GURL next_to_last = test_server()->GetURL( | 190 GURL next_to_last = |
| 191 "server-redirect?" + final_url.spec()); | 191 embedded_test_server()->GetURL("/server-redirect?" + final_url.spec()); |
| 192 GURL second_url = test_server()->GetURL( | 192 GURL second_url = |
| 193 "server-redirect?" + next_to_last.spec()); | 193 embedded_test_server()->GetURL("/server-redirect?" + next_to_last.spec()); |
| 194 GURL first_url = test_server()->GetURL( | 194 GURL first_url = |
| 195 "client-redirect?" + second_url.spec()); | 195 embedded_test_server()->GetURL("/client-redirect?" + second_url.spec()); |
| 196 | 196 |
| 197 ui_test_utils::NavigateToURLBlockUntilNavigationsComplete( | 197 ui_test_utils::NavigateToURLBlockUntilNavigationsComplete( |
| 198 browser(), first_url, 2); | 198 browser(), first_url, 2); |
| 199 | 199 |
| 200 std::vector<GURL> redirects = GetRedirects(first_url); | 200 std::vector<GURL> redirects = GetRedirects(first_url); |
| 201 ASSERT_EQ(3U, redirects.size()); | 201 ASSERT_EQ(3U, redirects.size()); |
| 202 EXPECT_EQ(second_url.spec(), redirects[0].spec()); | 202 EXPECT_EQ(second_url.spec(), redirects[0].spec()); |
| 203 EXPECT_EQ(next_to_last.spec(), redirects[1].spec()); | 203 EXPECT_EQ(next_to_last.spec(), redirects[1].spec()); |
| 204 EXPECT_EQ(final_url.spec(), redirects[2].spec()); | 204 EXPECT_EQ(final_url.spec(), redirects[2].spec()); |
| 205 } | 205 } |
| 206 | 206 |
| 207 // Tests that the "#reference" gets preserved across server redirects. | 207 // Tests that the "#reference" gets preserved across server redirects. |
| 208 IN_PROC_BROWSER_TEST_F(RedirectTest, ServerReference) { | 208 IN_PROC_BROWSER_TEST_F(RedirectTest, ServerReference) { |
| 209 ASSERT_TRUE(test_server()->Start()); | 209 ASSERT_TRUE(embedded_test_server()->Start()); |
| 210 | 210 |
| 211 const std::string ref("reference"); | 211 const std::string ref("reference"); |
| 212 | 212 |
| 213 GURL final_url = test_server()->GetURL(std::string()); | 213 GURL final_url = embedded_test_server()->GetURL("/defaultresponse"); |
| 214 GURL initial_url = test_server()->GetURL( | 214 GURL initial_url = embedded_test_server()->GetURL( |
| 215 "server-redirect?" + final_url.spec() + "#" + ref); | 215 "/server-redirect?" + final_url.spec() + "#" + ref); |
| 216 | 216 |
| 217 ui_test_utils::NavigateToURL(browser(), initial_url); | 217 ui_test_utils::NavigateToURL(browser(), initial_url); |
| 218 | 218 |
| 219 EXPECT_EQ(ref, | 219 EXPECT_EQ(ref, |
| 220 browser()->tab_strip_model()->GetActiveWebContents()-> | 220 browser()->tab_strip_model()->GetActiveWebContents()-> |
| 221 GetURL().ref()); | 221 GetURL().ref()); |
| 222 } | 222 } |
| 223 | 223 |
| 224 // Test that redirect from http:// to file:// : | 224 // Test that redirect from http:// to file:// : |
| 225 // A) does not crash the browser or confuse the redirect chain, see bug 1080873 | 225 // A) does not crash the browser or confuse the redirect chain, see bug 1080873 |
| 226 // B) does not take place. | 226 // B) does not take place. |
| 227 // | 227 // |
| 228 // Flaky on XP and Vista, http://crbug.com/69390. | 228 // Flaky on XP and Vista, http://crbug.com/69390. |
| 229 IN_PROC_BROWSER_TEST_F(RedirectTest, NoHttpToFile) { | 229 IN_PROC_BROWSER_TEST_F(RedirectTest, NoHttpToFile) { |
| 230 ASSERT_TRUE(test_server()->Start()); | 230 ASSERT_TRUE(embedded_test_server()->Start()); |
| 231 GURL file_url = ui_test_utils::GetTestUrl( | 231 GURL file_url = ui_test_utils::GetTestUrl( |
| 232 base::FilePath(), base::FilePath().AppendASCII("http_to_file.html")); | 232 base::FilePath(), base::FilePath().AppendASCII("http_to_file.html")); |
| 233 | 233 |
| 234 GURL initial_url = test_server()->GetURL( | 234 GURL initial_url = |
| 235 "client-redirect?" + file_url.spec()); | 235 embedded_test_server()->GetURL("/client-redirect?" + file_url.spec()); |
| 236 | 236 |
| 237 ui_test_utils::NavigateToURL(browser(), initial_url); | 237 ui_test_utils::NavigateToURL(browser(), initial_url); |
| 238 // We make sure the title doesn't match the title from the file, because the | 238 // We make sure the title doesn't match the title from the file, because the |
| 239 // nav should not have taken place. | 239 // nav should not have taken place. |
| 240 EXPECT_NE(base::ASCIIToUTF16("File!"), | 240 EXPECT_NE(base::ASCIIToUTF16("File!"), |
| 241 browser()->tab_strip_model()->GetActiveWebContents()->GetTitle()); | 241 browser()->tab_strip_model()->GetActiveWebContents()->GetTitle()); |
| 242 } | 242 } |
| 243 | 243 |
| 244 // Ensures that non-user initiated location changes (within page) are | 244 // Ensures that non-user initiated location changes (within page) are |
| 245 // flagged as client redirects. See bug 1139823. | 245 // flagged as client redirects. See bug 1139823. |
| 246 IN_PROC_BROWSER_TEST_F(RedirectTest, ClientFragments) { | 246 IN_PROC_BROWSER_TEST_F(RedirectTest, ClientFragments) { |
| 247 ASSERT_TRUE(test_server()->Start()); | 247 ASSERT_TRUE(embedded_test_server()->Start()); |
| 248 GURL first_url = ui_test_utils::GetTestUrl( | 248 GURL first_url = ui_test_utils::GetTestUrl( |
| 249 base::FilePath(), base::FilePath().AppendASCII("ref_redirect.html")); | 249 base::FilePath(), base::FilePath().AppendASCII("ref_redirect.html")); |
| 250 ui_test_utils::NavigateToURL(browser(), first_url); | 250 ui_test_utils::NavigateToURL(browser(), first_url); |
| 251 std::vector<GURL> redirects = GetRedirects(first_url); | 251 std::vector<GURL> redirects = GetRedirects(first_url); |
| 252 EXPECT_EQ(1U, redirects.size()); | 252 EXPECT_EQ(1U, redirects.size()); |
| 253 EXPECT_EQ(first_url.spec() + "#myanchor", redirects[0].spec()); | 253 EXPECT_EQ(first_url.spec() + "#myanchor", redirects[0].spec()); |
| 254 } | 254 } |
| 255 | 255 |
| 256 // TODO(timsteele): This is disabled because our current testserver can't | 256 // TODO(timsteele): This is disabled because our current testserver can't |
| 257 // handle multiple requests in parallel, making it hang on the first request | 257 // handle multiple requests in parallel, making it hang on the first request |
| 258 // to /slow?60. It's unable to serve our second request for files/title2.html | 258 // to /slow?60. It's unable to serve our second request for /title2.html |
| 259 // until /slow? completes, which doesn't give the desired behavior. We could | 259 // until /slow? completes, which doesn't give the desired behavior. We could |
| 260 // alternatively load the second page from disk, but we would need to start | 260 // alternatively load the second page from disk, but we would need to start |
| 261 // the browser for this testcase with --process-per-tab, and I don't think | 261 // the browser for this testcase with --process-per-tab, and I don't think |
| 262 // we can do this at test-case-level granularity at the moment. | 262 // we can do this at test-case-level granularity at the moment. |
| 263 // http://crbug.com/45056 | 263 // http://crbug.com/45056 |
| 264 IN_PROC_BROWSER_TEST_F(RedirectTest, | 264 IN_PROC_BROWSER_TEST_F(RedirectTest, |
| 265 DISABLED_ClientCancelledByNewNavigationAfterProvisionalLoad) { | 265 DISABLED_ClientCancelledByNewNavigationAfterProvisionalLoad) { |
| 266 // We want to initiate a second navigation after the provisional load for | 266 // We want to initiate a second navigation after the provisional load for |
| 267 // the client redirect destination has started, but before this load is | 267 // the client redirect destination has started, but before this load is |
| 268 // committed. To achieve this, we tell the browser to load a slow page, | 268 // committed. To achieve this, we tell the browser to load a slow page, |
| 269 // which causes it to start a provisional load, and while it is waiting | 269 // which causes it to start a provisional load, and while it is waiting |
| 270 // for the response (which means it hasn't committed the load for the client | 270 // for the response (which means it hasn't committed the load for the client |
| 271 // redirect destination page yet), we issue a new navigation request. | 271 // redirect destination page yet), we issue a new navigation request. |
| 272 ASSERT_TRUE(test_server()->Start()); | 272 ASSERT_TRUE(embedded_test_server()->Start()); |
| 273 | 273 |
| 274 GURL final_url = test_server()->GetURL("files/title2.html"); | 274 GURL final_url = embedded_test_server()->GetURL("/title2.html"); |
| 275 GURL slow = test_server()->GetURL("slow?60"); | 275 GURL slow = embedded_test_server()->GetURL("/slow?60"); |
| 276 GURL first_url = test_server()->GetURL( | 276 GURL first_url = |
| 277 "client-redirect?" + slow.spec()); | 277 embedded_test_server()->GetURL("/client-redirect?" + slow.spec()); |
| 278 | 278 |
| 279 content::WebContents* web_contents = | 279 content::WebContents* web_contents = |
| 280 browser()->tab_strip_model()->GetActiveWebContents(); | 280 browser()->tab_strip_model()->GetActiveWebContents(); |
| 281 content::TestNavigationObserver observer(web_contents, 2); | 281 content::TestNavigationObserver observer(web_contents, 2); |
| 282 | 282 |
| 283 ui_test_utils::NavigateToURLWithDisposition( | 283 ui_test_utils::NavigateToURLWithDisposition( |
| 284 browser(), first_url, CURRENT_TAB, ui_test_utils::BROWSER_TEST_NONE); | 284 browser(), first_url, CURRENT_TAB, ui_test_utils::BROWSER_TEST_NONE); |
| 285 // We don't sleep here - the first navigation won't have been committed yet | 285 // We don't sleep here - the first navigation won't have been committed yet |
| 286 // because we told the server to wait a minute. This means the browser has | 286 // because we told the server to wait a minute. This means the browser has |
| 287 // started it's provisional load for the client redirect destination page but | 287 // started it's provisional load for the client redirect destination page but |
| 288 // hasn't completed. Our time is now! | 288 // hasn't completed. Our time is now! |
| 289 ui_test_utils::NavigateToURLWithDisposition( | 289 ui_test_utils::NavigateToURLWithDisposition( |
| 290 browser(), final_url, CURRENT_TAB, ui_test_utils::BROWSER_TEST_NONE); | 290 browser(), final_url, CURRENT_TAB, ui_test_utils::BROWSER_TEST_NONE); |
| 291 observer.Wait(); | 291 observer.Wait(); |
| 292 | 292 |
| 293 // Check to make sure the navigation did in fact take place and we are | 293 // Check to make sure the navigation did in fact take place and we are |
| 294 // at the expected page. | 294 // at the expected page. |
| 295 EXPECT_EQ(base::ASCIIToUTF16("Title Of Awesomeness"), | 295 EXPECT_EQ(base::ASCIIToUTF16("Title Of Awesomeness"), |
| 296 browser()->tab_strip_model()->GetActiveWebContents()->GetTitle()); | 296 browser()->tab_strip_model()->GetActiveWebContents()->GetTitle()); |
| 297 | 297 |
| 298 bool final_navigation_not_redirect = true; | 298 bool final_navigation_not_redirect = true; |
| 299 std::vector<GURL> redirects = GetRedirects(first_url); | 299 std::vector<GURL> redirects = GetRedirects(first_url); |
| 300 // Check to make sure our request for files/title2.html doesn't get flagged | 300 // Check to make sure our request for /title2.html doesn't get flagged |
| 301 // as a client redirect from the first (/client-redirect?) page. | 301 // as a client redirect from the first (/client-redirect?) page. |
| 302 for (std::vector<GURL>::iterator it = redirects.begin(); | 302 for (std::vector<GURL>::iterator it = redirects.begin(); |
| 303 it != redirects.end(); ++it) { | 303 it != redirects.end(); ++it) { |
| 304 if (final_url.spec() == it->spec()) { | 304 if (final_url.spec() == it->spec()) { |
| 305 final_navigation_not_redirect = false; | 305 final_navigation_not_redirect = false; |
| 306 break; | 306 break; |
| 307 } | 307 } |
| 308 } | 308 } |
| 309 EXPECT_TRUE(final_navigation_not_redirect); | 309 EXPECT_TRUE(final_navigation_not_redirect); |
| 310 } | 310 } |
| OLD | NEW |