| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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/file_util.h" | 10 #include "base/file_util.h" |
| 11 #include "base/platform_thread.h" | 11 #include "base/platform_thread.h" |
| 12 #include "base/scoped_ptr.h" | 12 #include "base/scoped_ptr.h" |
| 13 #include "base/string_util.h" | 13 #include "base/string_util.h" |
| 14 #include "base/string16.h" | 14 #include "base/string16.h" |
| 15 #include "chrome/test/automation/tab_proxy.h" | 15 #include "chrome/test/automation/tab_proxy.h" |
| 16 #include "chrome/test/ui/ui_test.h" | 16 #include "chrome/test/ui/ui_test.h" |
| 17 #include "net/base/net_util.h" | 17 #include "net/base/net_util.h" |
| 18 #include "net/url_request/url_request_unittest.h" | 18 #include "net/url_request/url_request_unittest.h" |
| 19 | 19 |
| 20 namespace { | 20 namespace { |
| 21 | 21 |
| 22 const wchar_t kDocRoot[] = L"chrome/test/data"; | 22 const wchar_t kDocRoot[] = L"chrome/test/data"; |
| 23 | 23 |
| 24 typedef UITest RedirectTest; | 24 typedef UITest RedirectTest; |
| 25 | 25 |
| 26 // Tests a single server redirect | 26 // Tests a single server redirect |
| 27 TEST_F(RedirectTest, Server) { | 27 TEST_F(RedirectTest, Server) { |
| 28 scoped_refptr<HTTPTestServer> server = | 28 scoped_refptr<HTTPTestServer> server(HTTPTestServer::CreateServer(kDocRoot)); |
| 29 HTTPTestServer::CreateServer(kDocRoot, NULL); | |
| 30 ASSERT_TRUE(NULL != server.get()); | 29 ASSERT_TRUE(NULL != server.get()); |
| 31 | 30 |
| 32 GURL final_url = server->TestServerPage(std::string()); | 31 GURL final_url = server->TestServerPage(std::string()); |
| 33 GURL first_url = server->TestServerPage( | 32 GURL first_url = server->TestServerPage( |
| 34 "server-redirect?" + final_url.spec()); | 33 "server-redirect?" + final_url.spec()); |
| 35 | 34 |
| 36 NavigateToURL(first_url); | 35 NavigateToURL(first_url); |
| 37 | 36 |
| 38 scoped_refptr<TabProxy> tab_proxy(GetActiveTab()); | 37 scoped_refptr<TabProxy> tab_proxy(GetActiveTab()); |
| 39 ASSERT_TRUE(tab_proxy.get()); | 38 ASSERT_TRUE(tab_proxy.get()); |
| 40 | 39 |
| 41 std::vector<GURL> redirects; | 40 std::vector<GURL> redirects; |
| 42 ASSERT_TRUE(tab_proxy->GetRedirectsFrom(first_url, &redirects)); | 41 ASSERT_TRUE(tab_proxy->GetRedirectsFrom(first_url, &redirects)); |
| 43 | 42 |
| 44 ASSERT_EQ(1U, redirects.size()); | 43 ASSERT_EQ(1U, redirects.size()); |
| 45 EXPECT_EQ(final_url.spec(), redirects[0].spec()); | 44 EXPECT_EQ(final_url.spec(), redirects[0].spec()); |
| 46 } | 45 } |
| 47 | 46 |
| 48 // Tests a single client redirect. | 47 // Tests a single client redirect. |
| 49 TEST_F(RedirectTest, Client) { | 48 TEST_F(RedirectTest, Client) { |
| 50 scoped_refptr<HTTPTestServer> server = | 49 scoped_refptr<HTTPTestServer> server(HTTPTestServer::CreateServer(kDocRoot)); |
| 51 HTTPTestServer::CreateServer(kDocRoot, NULL); | |
| 52 ASSERT_TRUE(NULL != server.get()); | 50 ASSERT_TRUE(NULL != server.get()); |
| 53 | 51 |
| 54 GURL final_url = server->TestServerPage(std::string()); | 52 GURL final_url = server->TestServerPage(std::string()); |
| 55 GURL first_url = server->TestServerPage( | 53 GURL first_url = server->TestServerPage( |
| 56 "client-redirect?" + final_url.spec()); | 54 "client-redirect?" + final_url.spec()); |
| 57 | 55 |
| 58 // The client redirect appears as two page visits in the browser. | 56 // The client redirect appears as two page visits in the browser. |
| 59 NavigateToURLBlockUntilNavigationsComplete(first_url, 2); | 57 NavigateToURLBlockUntilNavigationsComplete(first_url, 2); |
| 60 | 58 |
| 61 scoped_refptr<TabProxy> tab_proxy(GetActiveTab()); | 59 scoped_refptr<TabProxy> tab_proxy(GetActiveTab()); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 74 | 72 |
| 75 // Navigate one more time. | 73 // Navigate one more time. |
| 76 NavigateToURLBlockUntilNavigationsComplete(first_url, 2); | 74 NavigateToURLBlockUntilNavigationsComplete(first_url, 2); |
| 77 | 75 |
| 78 // The address bar should still display the final URL. | 76 // The address bar should still display the final URL. |
| 79 EXPECT_TRUE(tab_proxy->GetCurrentURL(&tab_url)); | 77 EXPECT_TRUE(tab_proxy->GetCurrentURL(&tab_url)); |
| 80 EXPECT_TRUE(final_url == tab_url); | 78 EXPECT_TRUE(final_url == tab_url); |
| 81 } | 79 } |
| 82 | 80 |
| 83 TEST_F(RedirectTest, ClientEmptyReferer) { | 81 TEST_F(RedirectTest, ClientEmptyReferer) { |
| 84 scoped_refptr<HTTPTestServer> server = | 82 scoped_refptr<HTTPTestServer> server(HTTPTestServer::CreateServer(kDocRoot)); |
| 85 HTTPTestServer::CreateServer(kDocRoot, NULL); | |
| 86 ASSERT_TRUE(NULL != server.get()); | 83 ASSERT_TRUE(NULL != server.get()); |
| 87 | 84 |
| 88 GURL final_url = server->TestServerPage(std::string()); | 85 GURL final_url = server->TestServerPage(std::string()); |
| 89 FilePath test_file(test_data_directory_); | 86 FilePath test_file(test_data_directory_); |
| 90 test_file = test_file.AppendASCII("file_client_redirect.html"); | 87 test_file = test_file.AppendASCII("file_client_redirect.html"); |
| 91 GURL first_url = net::FilePathToFileURL(test_file); | 88 GURL first_url = net::FilePathToFileURL(test_file); |
| 92 | 89 |
| 93 // The client redirect appears as two page visits in the browser. | 90 // The client redirect appears as two page visits in the browser. |
| 94 NavigateToURLBlockUntilNavigationsComplete(first_url, 2); | 91 NavigateToURLBlockUntilNavigationsComplete(first_url, 2); |
| 95 | 92 |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 134 ASSERT_TRUE(net::FileURLToFilePath(current_url, ¤t_path)); | 131 ASSERT_TRUE(net::FileURLToFilePath(current_url, ¤t_path)); |
| 135 ASSERT_TRUE(file_util::AbsolutePath(¤t_path)); | 132 ASSERT_TRUE(file_util::AbsolutePath(¤t_path)); |
| 136 // Path should remain unchanged. | 133 // Path should remain unchanged. |
| 137 EXPECT_EQ(StringToLowerASCII(first_path.value()), | 134 EXPECT_EQ(StringToLowerASCII(first_path.value()), |
| 138 StringToLowerASCII(current_path.value())); | 135 StringToLowerASCII(current_path.value())); |
| 139 EXPECT_EQ(final_ref, current_url.ref()); | 136 EXPECT_EQ(final_ref, current_url.ref()); |
| 140 } | 137 } |
| 141 | 138 |
| 142 // Tests a client->server->server redirect | 139 // Tests a client->server->server redirect |
| 143 TEST_F(RedirectTest, ClientServerServer) { | 140 TEST_F(RedirectTest, ClientServerServer) { |
| 144 scoped_refptr<HTTPTestServer> server = | 141 scoped_refptr<HTTPTestServer> server(HTTPTestServer::CreateServer(kDocRoot)); |
| 145 HTTPTestServer::CreateServer(kDocRoot, NULL); | |
| 146 ASSERT_TRUE(NULL != server.get()); | 142 ASSERT_TRUE(NULL != server.get()); |
| 147 | 143 |
| 148 GURL final_url = server->TestServerPage(std::string()); | 144 GURL final_url = server->TestServerPage(std::string()); |
| 149 GURL next_to_last = server->TestServerPage( | 145 GURL next_to_last = server->TestServerPage( |
| 150 "server-redirect?" + final_url.spec()); | 146 "server-redirect?" + final_url.spec()); |
| 151 GURL second_url = server->TestServerPage( | 147 GURL second_url = server->TestServerPage( |
| 152 "server-redirect?" + next_to_last.spec()); | 148 "server-redirect?" + next_to_last.spec()); |
| 153 GURL first_url = server->TestServerPage( | 149 GURL first_url = server->TestServerPage( |
| 154 "client-redirect?" + second_url.spec()); | 150 "client-redirect?" + second_url.spec()); |
| 155 std::vector<GURL> redirects; | 151 std::vector<GURL> redirects; |
| (...skipping 12 matching lines...) Expand all Loading... |
| 168 } | 164 } |
| 169 | 165 |
| 170 ASSERT_EQ(3U, redirects.size()); | 166 ASSERT_EQ(3U, redirects.size()); |
| 171 EXPECT_EQ(second_url.spec(), redirects[0].spec()); | 167 EXPECT_EQ(second_url.spec(), redirects[0].spec()); |
| 172 EXPECT_EQ(next_to_last.spec(), redirects[1].spec()); | 168 EXPECT_EQ(next_to_last.spec(), redirects[1].spec()); |
| 173 EXPECT_EQ(final_url.spec(), redirects[2].spec()); | 169 EXPECT_EQ(final_url.spec(), redirects[2].spec()); |
| 174 } | 170 } |
| 175 | 171 |
| 176 // Tests that the "#reference" gets preserved across server redirects. | 172 // Tests that the "#reference" gets preserved across server redirects. |
| 177 TEST_F(RedirectTest, ServerReference) { | 173 TEST_F(RedirectTest, ServerReference) { |
| 178 scoped_refptr<HTTPTestServer> server = | 174 scoped_refptr<HTTPTestServer> server(HTTPTestServer::CreateServer(kDocRoot)); |
| 179 HTTPTestServer::CreateServer(kDocRoot, NULL); | |
| 180 ASSERT_TRUE(NULL != server.get()); | 175 ASSERT_TRUE(NULL != server.get()); |
| 181 | 176 |
| 182 const std::string ref("reference"); | 177 const std::string ref("reference"); |
| 183 | 178 |
| 184 GURL final_url = server->TestServerPage(std::string()); | 179 GURL final_url = server->TestServerPage(std::string()); |
| 185 GURL initial_url = server->TestServerPage( | 180 GURL initial_url = server->TestServerPage( |
| 186 "server-redirect?" + final_url.spec() + "#" + ref); | 181 "server-redirect?" + final_url.spec() + "#" + ref); |
| 187 | 182 |
| 188 NavigateToURL(initial_url); | 183 NavigateToURL(initial_url); |
| 189 | 184 |
| 190 GURL url = GetActiveTabURL(); | 185 GURL url = GetActiveTabURL(); |
| 191 EXPECT_EQ(ref, url.ref()); | 186 EXPECT_EQ(ref, url.ref()); |
| 192 } | 187 } |
| 193 | 188 |
| 194 // Test that redirect from http:// to file:// : | 189 // Test that redirect from http:// to file:// : |
| 195 // A) does not crash the browser or confuse the redirect chain, see bug 1080873 | 190 // A) does not crash the browser or confuse the redirect chain, see bug 1080873 |
| 196 // B) does not take place. | 191 // B) does not take place. |
| 197 TEST_F(RedirectTest, NoHttpToFile) { | 192 TEST_F(RedirectTest, NoHttpToFile) { |
| 198 scoped_refptr<HTTPTestServer> server = | 193 scoped_refptr<HTTPTestServer> server(HTTPTestServer::CreateServer(kDocRoot)); |
| 199 HTTPTestServer::CreateServer(kDocRoot, NULL); | |
| 200 ASSERT_TRUE(NULL != server.get()); | 194 ASSERT_TRUE(NULL != server.get()); |
| 201 FilePath test_file(test_data_directory_); | 195 FilePath test_file(test_data_directory_); |
| 202 test_file = test_file.AppendASCII("http_to_file.html"); | 196 test_file = test_file.AppendASCII("http_to_file.html"); |
| 203 GURL file_url = net::FilePathToFileURL(test_file); | 197 GURL file_url = net::FilePathToFileURL(test_file); |
| 204 | 198 |
| 205 GURL initial_url = server->TestServerPage( | 199 GURL initial_url = server->TestServerPage( |
| 206 "client-redirect?" + file_url.spec()); | 200 "client-redirect?" + file_url.spec()); |
| 207 | 201 |
| 208 NavigateToURL(initial_url); | 202 NavigateToURL(initial_url); |
| 209 // UITest will check for crashes. We make sure the title doesn't match the | 203 // UITest will check for crashes. We make sure the title doesn't match the |
| 210 // title from the file, because the nav should not have taken place. | 204 // title from the file, because the nav should not have taken place. |
| 211 scoped_refptr<TabProxy> tab_proxy(GetActiveTab()); | 205 scoped_refptr<TabProxy> tab_proxy(GetActiveTab()); |
| 212 ASSERT_TRUE(tab_proxy.get()); | 206 ASSERT_TRUE(tab_proxy.get()); |
| 213 std::wstring actual_title; | 207 std::wstring actual_title; |
| 214 ASSERT_TRUE(tab_proxy->GetTabTitle(&actual_title)); | 208 ASSERT_TRUE(tab_proxy->GetTabTitle(&actual_title)); |
| 215 EXPECT_NE("File!", WideToUTF8(actual_title)); | 209 EXPECT_NE("File!", WideToUTF8(actual_title)); |
| 216 } | 210 } |
| 217 | 211 |
| 218 // Ensures that non-user initiated location changes (within page) are | 212 // Ensures that non-user initiated location changes (within page) are |
| 219 // flagged as client redirects. See bug 1139823. | 213 // flagged as client redirects. See bug 1139823. |
| 220 TEST_F(RedirectTest, ClientFragments) { | 214 TEST_F(RedirectTest, ClientFragments) { |
| 221 scoped_refptr<HTTPTestServer> server = | 215 scoped_refptr<HTTPTestServer> server(HTTPTestServer::CreateServer(kDocRoot)); |
| 222 HTTPTestServer::CreateServer(kDocRoot, NULL); | |
| 223 ASSERT_TRUE(NULL != server.get()); | 216 ASSERT_TRUE(NULL != server.get()); |
| 224 | 217 |
| 225 FilePath test_file(test_data_directory_); | 218 FilePath test_file(test_data_directory_); |
| 226 test_file = test_file.AppendASCII("ref_redirect.html"); | 219 test_file = test_file.AppendASCII("ref_redirect.html"); |
| 227 GURL first_url = net::FilePathToFileURL(test_file); | 220 GURL first_url = net::FilePathToFileURL(test_file); |
| 228 std::vector<GURL> redirects; | 221 std::vector<GURL> redirects; |
| 229 | 222 |
| 230 NavigateToURL(first_url); | 223 NavigateToURL(first_url); |
| 231 | 224 |
| 232 scoped_refptr<TabProxy> tab_proxy(GetActiveTab()); | 225 scoped_refptr<TabProxy> tab_proxy(GetActiveTab()); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 245 // we can do this at test-case-level granularity at the moment. | 238 // we can do this at test-case-level granularity at the moment. |
| 246 // http://crbug.com/45056 | 239 // http://crbug.com/45056 |
| 247 TEST_F(RedirectTest, | 240 TEST_F(RedirectTest, |
| 248 DISABLED_ClientCancelledByNewNavigationAfterProvisionalLoad) { | 241 DISABLED_ClientCancelledByNewNavigationAfterProvisionalLoad) { |
| 249 // We want to initiate a second navigation after the provisional load for | 242 // We want to initiate a second navigation after the provisional load for |
| 250 // the client redirect destination has started, but before this load is | 243 // the client redirect destination has started, but before this load is |
| 251 // committed. To achieve this, we tell the browser to load a slow page, | 244 // committed. To achieve this, we tell the browser to load a slow page, |
| 252 // which causes it to start a provisional load, and while it is waiting | 245 // which causes it to start a provisional load, and while it is waiting |
| 253 // for the response (which means it hasn't committed the load for the client | 246 // for the response (which means it hasn't committed the load for the client |
| 254 // redirect destination page yet), we issue a new navigation request. | 247 // redirect destination page yet), we issue a new navigation request. |
| 255 scoped_refptr<HTTPTestServer> server = | 248 scoped_refptr<HTTPTestServer> server(HTTPTestServer::CreateServer(kDocRoot)); |
| 256 HTTPTestServer::CreateServer(kDocRoot, NULL); | |
| 257 ASSERT_TRUE(NULL != server.get()); | 249 ASSERT_TRUE(NULL != server.get()); |
| 258 | 250 |
| 259 GURL final_url = server->TestServerPage("files/title2.html"); | 251 GURL final_url = server->TestServerPage("files/title2.html"); |
| 260 GURL slow = server->TestServerPage("slow?60"); | 252 GURL slow = server->TestServerPage("slow?60"); |
| 261 GURL first_url = server->TestServerPage( | 253 GURL first_url = server->TestServerPage( |
| 262 "client-redirect?" + slow.spec()); | 254 "client-redirect?" + slow.spec()); |
| 263 std::vector<GURL> redirects; | 255 std::vector<GURL> redirects; |
| 264 | 256 |
| 265 NavigateToURL(first_url); | 257 NavigateToURL(first_url); |
| 266 // We don't sleep here - the first navigation won't have been committed yet | 258 // We don't sleep here - the first navigation won't have been committed yet |
| (...skipping 27 matching lines...) Expand all Loading... |
| 294 it != redirects.end(); ++it) { | 286 it != redirects.end(); ++it) { |
| 295 if (final_url.spec() == it->spec()) { | 287 if (final_url.spec() == it->spec()) { |
| 296 final_navigation_not_redirect = false; | 288 final_navigation_not_redirect = false; |
| 297 break; | 289 break; |
| 298 } | 290 } |
| 299 } | 291 } |
| 300 EXPECT_TRUE(final_navigation_not_redirect); | 292 EXPECT_TRUE(final_navigation_not_redirect); |
| 301 } | 293 } |
| 302 | 294 |
| 303 } // namespace | 295 } // namespace |
| OLD | NEW |