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 #include "base/bind.h" | 5 #include "base/bind.h" |
6 #include "base/command_line.h" | 6 #include "base/command_line.h" |
7 #include "base/compiler_specific.h" | 7 #include "base/compiler_specific.h" |
8 #include "base/logging.h" | 8 #include "base/logging.h" |
9 #include "base/memory/scoped_ptr.h" | 9 #include "base/memory/scoped_ptr.h" |
10 #include "base/memory/weak_ptr.h" | 10 #include "base/memory/weak_ptr.h" |
(...skipping 29 matching lines...) Expand all Loading... |
40 #include "content/test/net/url_request_mock_http_job.h" | 40 #include "content/test/net/url_request_mock_http_job.h" |
41 #include "grit/generated_resources.h" | 41 #include "grit/generated_resources.h" |
42 #include "net/base/net_errors.h" | 42 #include "net/base/net_errors.h" |
43 #include "net/base/net_util.h" | 43 #include "net/base/net_util.h" |
44 #include "net/http/failing_http_transaction_factory.h" | 44 #include "net/http/failing_http_transaction_factory.h" |
45 #include "net/http/http_cache.h" | 45 #include "net/http/http_cache.h" |
46 #include "net/test/spawned_test_server/spawned_test_server.h" | 46 #include "net/test/spawned_test_server/spawned_test_server.h" |
47 #include "net/url_request/url_request_context.h" | 47 #include "net/url_request/url_request_context.h" |
48 #include "net/url_request/url_request_context_getter.h" | 48 #include "net/url_request/url_request_context_getter.h" |
49 #include "net/url_request/url_request_filter.h" | 49 #include "net/url_request/url_request_filter.h" |
| 50 #include "net/url_request/url_request_interceptor.h" |
50 #include "net/url_request/url_request_job.h" | 51 #include "net/url_request/url_request_job.h" |
51 #include "net/url_request/url_request_job_factory.h" | |
52 #include "net/url_request/url_request_test_job.h" | 52 #include "net/url_request/url_request_test_job.h" |
53 #include "net/url_request/url_request_test_util.h" | 53 #include "net/url_request/url_request_test_util.h" |
54 #include "ui/base/l10n/l10n_util.h" | 54 #include "ui/base/l10n/l10n_util.h" |
55 | 55 |
56 using content::BrowserThread; | 56 using content::BrowserThread; |
57 using content::NavigationController; | 57 using content::NavigationController; |
58 using content::URLRequestFailedJob; | 58 using content::URLRequestFailedJob; |
59 using net::URLRequestJobFactory; | |
60 using net::URLRequestTestJob; | 59 using net::URLRequestTestJob; |
61 | 60 |
62 namespace { | 61 namespace { |
63 | 62 |
64 // Returns true if |text| is displayed on the page |browser| is currently | 63 // Returns true if |text| is displayed on the page |browser| is currently |
65 // displaying. Uses "innerText", so will miss hidden text, and whitespace | 64 // displaying. Uses "innerText", so will miss hidden text, and whitespace |
66 // space handling may be weird. | 65 // space handling may be weird. |
67 bool WARN_UNUSED_RESULT IsDisplayingText(Browser* browser, | 66 bool WARN_UNUSED_RESULT IsDisplayingText(Browser* browser, |
68 const std::string& text) { | 67 const std::string& text) { |
69 std::string command = base::StringPrintf( | 68 std::string command = base::StringPrintf( |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
140 "var searchText = document.getElementById('search-box').value;" | 139 "var searchText = document.getElementById('search-box').value;" |
141 "domAutomationController.send(searchText == 'search query');", | 140 "domAutomationController.send(searchText == 'search query');", |
142 &search_box_populated)); | 141 &search_box_populated)); |
143 EXPECT_TRUE(search_box_populated); | 142 EXPECT_TRUE(search_box_populated); |
144 } | 143 } |
145 | 144 |
146 std::string GetLoadStaleButtonLabel() { | 145 std::string GetLoadStaleButtonLabel() { |
147 return l10n_util::GetStringUTF8(IDS_ERRORPAGES_BUTTON_LOAD_STALE); | 146 return l10n_util::GetStringUTF8(IDS_ERRORPAGES_BUTTON_LOAD_STALE); |
148 } | 147 } |
149 | 148 |
150 void AddProtocolHandlerForURL( | 149 void AddInterceptorForURL( |
151 const GURL& url, | 150 const GURL& url, |
152 scoped_ptr<URLRequestJobFactory::ProtocolHandler> handler) { | 151 scoped_ptr<net::URLRequestInterceptor> handler) { |
153 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 152 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
154 net::URLRequestFilter::GetInstance()->AddUrlProtocolHandler( | 153 net::URLRequestFilter::GetInstance()->AddUrlInterceptor( |
155 url, handler.Pass()); | 154 url, handler.Pass()); |
156 } | 155 } |
157 | 156 |
158 // A protocol handler that fails a configurable number of requests, then | 157 // An interceptor that fails a configurable number of requests, then succeeds |
159 // succeeds all requests after that, keeping count of failures and successes. | 158 // all requests after that, keeping count of failures and successes. |
160 class FailFirstNRequestsProtocolHandler | 159 class FailFirstNRequestsInterceptor : public net::URLRequestInterceptor { |
161 : public URLRequestJobFactory::ProtocolHandler { | |
162 public: | 160 public: |
163 explicit FailFirstNRequestsProtocolHandler(int requests_to_fail) | 161 explicit FailFirstNRequestsInterceptor(int requests_to_fail) |
164 : requests_(0), failures_(0), requests_to_fail_(requests_to_fail) {} | 162 : requests_(0), failures_(0), requests_to_fail_(requests_to_fail) {} |
165 virtual ~FailFirstNRequestsProtocolHandler() {} | 163 virtual ~FailFirstNRequestsInterceptor() {} |
166 | 164 |
167 // net::URLRequestJobFactory::ProtocolHandler implementation | 165 // net::URLRequestInterceptor implementation |
168 virtual net::URLRequestJob* MaybeCreateJob( | 166 virtual net::URLRequestJob* MaybeInterceptRequest( |
169 net::URLRequest* request, | 167 net::URLRequest* request, |
170 net::NetworkDelegate* network_delegate) const OVERRIDE { | 168 net::NetworkDelegate* network_delegate) const OVERRIDE { |
171 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 169 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
172 requests_++; | 170 requests_++; |
173 if (failures_ < requests_to_fail_) { | 171 if (failures_ < requests_to_fail_) { |
174 failures_++; | 172 failures_++; |
175 // Note: net::ERR_CONNECTION_RESET does not summon the Link Doctor; see | 173 // Note: net::ERR_CONNECTION_RESET does not summon the Link Doctor; see |
176 // NetErrorHelperCore::GetErrorPageURL. | 174 // NetErrorHelperCore::GetErrorPageURL. |
177 return new URLRequestFailedJob(request, | 175 return new URLRequestFailedJob(request, |
178 network_delegate, | 176 network_delegate, |
179 net::ERR_CONNECTION_RESET); | 177 net::ERR_CONNECTION_RESET); |
180 } else { | 178 } else { |
181 return new URLRequestTestJob(request, network_delegate, | 179 return new URLRequestTestJob(request, network_delegate, |
182 URLRequestTestJob::test_headers(), | 180 URLRequestTestJob::test_headers(), |
183 URLRequestTestJob::test_data_1(), | 181 URLRequestTestJob::test_data_1(), |
184 true); | 182 true); |
185 } | 183 } |
186 } | 184 } |
187 | 185 |
188 int requests() const { return requests_; } | 186 int requests() const { return requests_; } |
189 int failures() const { return failures_; } | 187 int failures() const { return failures_; } |
190 | 188 |
191 private: | 189 private: |
192 // These are mutable because MaybeCreateJob is const but we want this state | 190 // These are mutable because MaybeCreateJob is const but we want this state |
193 // for testing. | 191 // for testing. |
194 mutable int requests_; | 192 mutable int requests_; |
195 mutable int failures_; | 193 mutable int failures_; |
196 int requests_to_fail_; | 194 int requests_to_fail_; |
| 195 |
| 196 DISALLOW_COPY_AND_ASSIGN(FailFirstNRequestsInterceptor); |
197 }; | 197 }; |
198 | 198 |
199 // A protocol handler that serves LinkDoctor responses. It also allows waiting | 199 // An interceptor that serves LinkDoctor responses. It also allows waiting |
200 // until a certain number of requests have been sent. | 200 // until a certain number of requests have been sent. |
201 // TODO(mmenke): Wait until responses have been received instead. | 201 // TODO(mmenke): Wait until responses have been received instead. |
202 class LinkDoctorProtocolHandler | 202 class LinkDoctorInterceptor : public net::URLRequestInterceptor { |
203 : public URLRequestJobFactory::ProtocolHandler { | |
204 public: | 203 public: |
205 LinkDoctorProtocolHandler() | 204 LinkDoctorInterceptor() : num_requests_(0), |
206 : num_requests_(0), | 205 requests_to_wait_for_(-1), |
207 requests_to_wait_for_(-1), | 206 weak_factory_(this) { |
208 weak_factory_(this) { | |
209 } | 207 } |
210 | 208 |
211 virtual ~LinkDoctorProtocolHandler() {} | 209 virtual ~LinkDoctorInterceptor() {} |
212 | 210 |
213 // net::URLRequestJobFactory::ProtocolHandler implementation | 211 // net::URLRequestInterceptor implementation |
214 virtual net::URLRequestJob* MaybeCreateJob( | 212 virtual net::URLRequestJob* MaybeInterceptRequest( |
215 net::URLRequest* request, | 213 net::URLRequest* request, |
216 net::NetworkDelegate* network_delegate) const OVERRIDE { | 214 net::NetworkDelegate* network_delegate) const OVERRIDE { |
217 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 215 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
218 | 216 |
219 BrowserThread::PostTask( | 217 BrowserThread::PostTask( |
220 BrowserThread::UI, FROM_HERE, | 218 BrowserThread::UI, FROM_HERE, |
221 base::Bind(&LinkDoctorProtocolHandler::RequestCreated, | 219 base::Bind(&LinkDoctorInterceptor::RequestCreated, |
222 weak_factory_.GetWeakPtr())); | 220 weak_factory_.GetWeakPtr())); |
223 | 221 |
224 base::FilePath root_http; | 222 base::FilePath root_http; |
225 PathService::Get(chrome::DIR_TEST_DATA, &root_http); | 223 PathService::Get(chrome::DIR_TEST_DATA, &root_http); |
226 return new content::URLRequestMockHTTPJob( | 224 return new content::URLRequestMockHTTPJob( |
227 request, network_delegate, | 225 request, network_delegate, |
228 root_http.AppendASCII("mock-link-doctor.json")); | 226 root_http.AppendASCII("mock-link-doctor.json")); |
229 } | 227 } |
230 | 228 |
231 void WaitForRequests(int requests_to_wait_for) { | 229 void WaitForRequests(int requests_to_wait_for) { |
(...skipping 29 matching lines...) Expand all Loading... |
261 run_loop_->Quit(); | 259 run_loop_->Quit(); |
262 } | 260 } |
263 | 261 |
264 // These are only used on the UI thread. | 262 // These are only used on the UI thread. |
265 int num_requests_; | 263 int num_requests_; |
266 int requests_to_wait_for_; | 264 int requests_to_wait_for_; |
267 scoped_ptr<base::RunLoop> run_loop_; | 265 scoped_ptr<base::RunLoop> run_loop_; |
268 | 266 |
269 // This prevents any risk of flake if any test doesn't wait for a request | 267 // This prevents any risk of flake if any test doesn't wait for a request |
270 // it sent. Mutable so it can be accessed from a const function. | 268 // it sent. Mutable so it can be accessed from a const function. |
271 mutable base::WeakPtrFactory<LinkDoctorProtocolHandler> weak_factory_; | 269 mutable base::WeakPtrFactory<LinkDoctorInterceptor> weak_factory_; |
| 270 |
| 271 DISALLOW_COPY_AND_ASSIGN(LinkDoctorInterceptor); |
272 }; | 272 }; |
273 | 273 |
274 void InstallMockProtocolHandlers( | 274 void InstallMockInterceptors( |
275 const GURL& search_url, | 275 const GURL& search_url, |
276 scoped_ptr<URLRequestJobFactory::ProtocolHandler> link_doctor_handler) { | 276 scoped_ptr<net::URLRequestInterceptor> link_doctor_interceptor) { |
277 chrome_browser_net::SetUrlRequestMocksEnabled(true); | 277 chrome_browser_net::SetUrlRequestMocksEnabled(true); |
278 | 278 |
279 AddProtocolHandlerForURL(google_util::LinkDoctorBaseURL(), | 279 AddInterceptorForURL(google_util::LinkDoctorBaseURL(), |
280 link_doctor_handler.Pass()); | 280 link_doctor_interceptor.Pass()); |
281 | 281 |
282 // Add a mock for the search engine the error page will use. | 282 // Add a mock for the search engine the error page will use. |
283 base::FilePath root_http; | 283 base::FilePath root_http; |
284 PathService::Get(chrome::DIR_TEST_DATA, &root_http); | 284 PathService::Get(chrome::DIR_TEST_DATA, &root_http); |
285 content::URLRequestMockHTTPJob::AddHostnameToFileHandler( | 285 content::URLRequestMockHTTPJob::AddHostnameToFileHandler( |
286 search_url.host(), root_http.AppendASCII("title3.html")); | 286 search_url.host(), root_http.AppendASCII("title3.html")); |
287 } | 287 } |
288 | 288 |
289 class ErrorPageTest : public InProcessBrowserTest { | 289 class ErrorPageTest : public InProcessBrowserTest { |
290 public: | 290 public: |
291 enum HistoryNavigationDirection { | 291 enum HistoryNavigationDirection { |
292 HISTORY_NAVIGATE_BACK, | 292 HISTORY_NAVIGATE_BACK, |
293 HISTORY_NAVIGATE_FORWARD, | 293 HISTORY_NAVIGATE_FORWARD, |
294 }; | 294 }; |
295 | 295 |
296 ErrorPageTest() : link_doctor_handler_(NULL) {} | 296 ErrorPageTest() : link_doctor_interceptor_(NULL) {} |
297 virtual ~ErrorPageTest() {} | 297 virtual ~ErrorPageTest() {} |
298 | 298 |
299 // Navigates the active tab to a mock url created for the file at |file_path|. | 299 // Navigates the active tab to a mock url created for the file at |file_path|. |
300 // Needed for StaleCacheStatus and StaleCacheStatusFailedCorrections tests. | 300 // Needed for StaleCacheStatus and StaleCacheStatusFailedCorrections tests. |
301 virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE { | 301 virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE { |
302 command_line->AppendSwitch(switches::kEnableOfflineLoadStaleCache); | 302 command_line->AppendSwitch(switches::kEnableOfflineLoadStaleCache); |
303 } | 303 } |
304 | 304 |
305 // Navigates the active tab to a mock url created for the file at |file_path|. | 305 // Navigates the active tab to a mock url created for the file at |file_path|. |
306 void NavigateToFileURL(const base::FilePath::StringType& file_path) { | 306 void NavigateToFileURL(const base::FilePath::StringType& file_path) { |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
394 browser()->tab_strip_model()->GetActiveWebContents(), | 394 browser()->tab_strip_model()->GetActiveWebContents(), |
395 js_reload_script, | 395 js_reload_script, |
396 &result); | 396 &result); |
397 EXPECT_TRUE(ret); | 397 EXPECT_TRUE(ret); |
398 if (!ret) | 398 if (!ret) |
399 return testing::AssertionFailure(); | 399 return testing::AssertionFailure(); |
400 return ("success" == result ? testing::AssertionSuccess() : | 400 return ("success" == result ? testing::AssertionSuccess() : |
401 (testing::AssertionFailure() << "Exception message is " << result)); | 401 (testing::AssertionFailure() << "Exception message is " << result)); |
402 } | 402 } |
403 | 403 |
404 LinkDoctorProtocolHandler* link_doctor_handler() { | 404 LinkDoctorInterceptor* link_doctor_interceptor() { |
405 return link_doctor_handler_; | 405 return link_doctor_interceptor_; |
406 } | 406 } |
407 | 407 |
408 protected: | 408 protected: |
409 virtual void SetUpOnMainThread() OVERRIDE { | 409 virtual void SetUpOnMainThread() OVERRIDE { |
410 link_doctor_handler_ = new LinkDoctorProtocolHandler(); | 410 link_doctor_interceptor_ = new LinkDoctorInterceptor(); |
411 scoped_ptr<URLRequestJobFactory::ProtocolHandler> owned_handler( | 411 scoped_ptr<net::URLRequestInterceptor> owned_interceptor( |
412 link_doctor_handler_); | 412 link_doctor_interceptor_); |
413 // Ownership of the |protocol_handler_| is passed to an object the IO | 413 // Ownership of the |interceptor_| is passed to an object the IO thread, but |
414 // thread, but a pointer is kept in the test fixture. As soon as anything | 414 // a pointer is kept in the test fixture. As soon as anything calls |
415 // calls URLRequestFilter::ClearHandlers(), |protocol_handler_| can become | 415 // URLRequestFilter::ClearHandlers(), |interceptor_| can become invalid. |
416 // invalid. | |
417 BrowserThread::PostTask( | 416 BrowserThread::PostTask( |
418 BrowserThread::IO, | 417 BrowserThread::IO, FROM_HERE, |
419 FROM_HERE, | 418 base::Bind(&InstallMockInterceptors, |
420 base::Bind(&InstallMockProtocolHandlers, | |
421 google_util::GetGoogleSearchURL( | 419 google_util::GetGoogleSearchURL( |
422 google_profile_helper::GetGoogleHomePageURL( | 420 google_profile_helper::GetGoogleHomePageURL( |
423 browser()->profile())), | 421 browser()->profile())), |
424 base::Passed(&owned_handler))); | 422 base::Passed(&owned_interceptor))); |
425 } | 423 } |
426 | 424 |
427 // Returns a GURL that results in a DNS error. | 425 // Returns a GURL that results in a DNS error. |
428 GURL GetDnsErrorURL() const { | 426 GURL GetDnsErrorURL() const { |
429 return URLRequestFailedJob::GetMockHttpUrl(net::ERR_NAME_NOT_RESOLVED); | 427 return URLRequestFailedJob::GetMockHttpUrl(net::ERR_NAME_NOT_RESOLVED); |
430 } | 428 } |
431 | 429 |
432 private: | 430 private: |
433 // Navigates the browser the indicated direction in the history and waits for | 431 // Navigates the browser the indicated direction in the history and waits for |
434 // |num_navigations| to occur and the title to change to |expected_title|. | 432 // |num_navigations| to occur and the title to change to |expected_title|. |
(...skipping 18 matching lines...) Expand all Loading... |
453 if (direction == HISTORY_NAVIGATE_BACK) { | 451 if (direction == HISTORY_NAVIGATE_BACK) { |
454 chrome::GoBack(browser(), CURRENT_TAB); | 452 chrome::GoBack(browser(), CURRENT_TAB); |
455 } else if (direction == HISTORY_NAVIGATE_FORWARD) { | 453 } else if (direction == HISTORY_NAVIGATE_FORWARD) { |
456 chrome::GoForward(browser(), CURRENT_TAB); | 454 chrome::GoForward(browser(), CURRENT_TAB); |
457 } else { | 455 } else { |
458 FAIL(); | 456 FAIL(); |
459 } | 457 } |
460 test_navigation_observer.Wait(); | 458 test_navigation_observer.Wait(); |
461 } | 459 } |
462 | 460 |
463 LinkDoctorProtocolHandler* link_doctor_handler_; | 461 LinkDoctorInterceptor* link_doctor_interceptor_; |
464 }; | 462 }; |
465 | 463 |
466 class TestFailProvisionalLoadObserver : public content::WebContentsObserver { | 464 class TestFailProvisionalLoadObserver : public content::WebContentsObserver { |
467 public: | 465 public: |
468 explicit TestFailProvisionalLoadObserver(content::WebContents* contents) | 466 explicit TestFailProvisionalLoadObserver(content::WebContents* contents) |
469 : content::WebContentsObserver(contents) {} | 467 : content::WebContentsObserver(contents) {} |
470 virtual ~TestFailProvisionalLoadObserver() {} | 468 virtual ~TestFailProvisionalLoadObserver() {} |
471 | 469 |
472 // This method is invoked when the provisional load failed. | 470 // This method is invoked when the provisional load failed. |
473 virtual void DidFailProvisionalLoad( | 471 virtual void DidFailProvisionalLoad( |
(...skipping 28 matching lines...) Expand all Loading... |
502 cache->SetHttpNetworkTransactionFactoryForTesting(factory.Pass()); | 500 cache->SetHttpNetworkTransactionFactoryForTesting(factory.Pass()); |
503 } | 501 } |
504 | 502 |
505 // Test that a DNS error occuring in the main frame redirects to an error page. | 503 // Test that a DNS error occuring in the main frame redirects to an error page. |
506 IN_PROC_BROWSER_TEST_F(ErrorPageTest, DNSError_Basic) { | 504 IN_PROC_BROWSER_TEST_F(ErrorPageTest, DNSError_Basic) { |
507 // The first navigation should fail, and the second one should be the error | 505 // The first navigation should fail, and the second one should be the error |
508 // page. | 506 // page. |
509 ui_test_utils::NavigateToURLBlockUntilNavigationsComplete( | 507 ui_test_utils::NavigateToURLBlockUntilNavigationsComplete( |
510 browser(), GetDnsErrorURL(), 2); | 508 browser(), GetDnsErrorURL(), 2); |
511 ExpectDisplayingNavigationCorrections(browser(), net::ERR_NAME_NOT_RESOLVED); | 509 ExpectDisplayingNavigationCorrections(browser(), net::ERR_NAME_NOT_RESOLVED); |
512 EXPECT_EQ(1, link_doctor_handler()->num_requests()); | 510 EXPECT_EQ(1, link_doctor_interceptor()->num_requests()); |
513 } | 511 } |
514 | 512 |
515 // Test that a DNS error occuring in the main frame does not result in an | 513 // Test that a DNS error occuring in the main frame does not result in an |
516 // additional session history entry. | 514 // additional session history entry. |
517 IN_PROC_BROWSER_TEST_F(ErrorPageTest, DNSError_GoBack1) { | 515 IN_PROC_BROWSER_TEST_F(ErrorPageTest, DNSError_GoBack1) { |
518 NavigateToFileURL(FILE_PATH_LITERAL("title2.html")); | 516 NavigateToFileURL(FILE_PATH_LITERAL("title2.html")); |
519 ui_test_utils::NavigateToURLBlockUntilNavigationsComplete( | 517 ui_test_utils::NavigateToURLBlockUntilNavigationsComplete( |
520 browser(), GetDnsErrorURL(), 2); | 518 browser(), GetDnsErrorURL(), 2); |
521 ExpectDisplayingNavigationCorrections(browser(), net::ERR_NAME_NOT_RESOLVED); | 519 ExpectDisplayingNavigationCorrections(browser(), net::ERR_NAME_NOT_RESOLVED); |
522 GoBackAndWaitForTitle("Title Of Awesomeness", 1); | 520 GoBackAndWaitForTitle("Title Of Awesomeness", 1); |
523 EXPECT_EQ(1, link_doctor_handler()->num_requests()); | 521 EXPECT_EQ(1, link_doctor_interceptor()->num_requests()); |
524 } | 522 } |
525 | 523 |
526 // Test that a DNS error occuring in the main frame does not result in an | 524 // Test that a DNS error occuring in the main frame does not result in an |
527 // additional session history entry. | 525 // additional session history entry. |
528 IN_PROC_BROWSER_TEST_F(ErrorPageTest, DNSError_GoBack2) { | 526 IN_PROC_BROWSER_TEST_F(ErrorPageTest, DNSError_GoBack2) { |
529 NavigateToFileURL(FILE_PATH_LITERAL("title2.html")); | 527 NavigateToFileURL(FILE_PATH_LITERAL("title2.html")); |
530 | 528 |
531 ui_test_utils::NavigateToURLBlockUntilNavigationsComplete( | 529 ui_test_utils::NavigateToURLBlockUntilNavigationsComplete( |
532 browser(), GetDnsErrorURL(), 2); | 530 browser(), GetDnsErrorURL(), 2); |
533 ExpectDisplayingNavigationCorrections(browser(), net::ERR_NAME_NOT_RESOLVED); | 531 ExpectDisplayingNavigationCorrections(browser(), net::ERR_NAME_NOT_RESOLVED); |
534 EXPECT_EQ(1, link_doctor_handler()->num_requests()); | 532 EXPECT_EQ(1, link_doctor_interceptor()->num_requests()); |
535 | 533 |
536 NavigateToFileURL(FILE_PATH_LITERAL("title3.html")); | 534 NavigateToFileURL(FILE_PATH_LITERAL("title3.html")); |
537 | 535 |
538 GoBackAndWaitForNavigations(2); | 536 GoBackAndWaitForNavigations(2); |
539 ExpectDisplayingNavigationCorrections(browser(), net::ERR_NAME_NOT_RESOLVED); | 537 ExpectDisplayingNavigationCorrections(browser(), net::ERR_NAME_NOT_RESOLVED); |
540 EXPECT_EQ(2, link_doctor_handler()->num_requests()); | 538 EXPECT_EQ(2, link_doctor_interceptor()->num_requests()); |
541 | 539 |
542 GoBackAndWaitForTitle("Title Of Awesomeness", 1); | 540 GoBackAndWaitForTitle("Title Of Awesomeness", 1); |
543 EXPECT_EQ(2, link_doctor_handler()->num_requests()); | 541 EXPECT_EQ(2, link_doctor_interceptor()->num_requests()); |
544 } | 542 } |
545 | 543 |
546 // Test that a DNS error occuring in the main frame does not result in an | 544 // Test that a DNS error occuring in the main frame does not result in an |
547 // additional session history entry. | 545 // additional session history entry. |
548 IN_PROC_BROWSER_TEST_F(ErrorPageTest, DNSError_GoBack2AndForward) { | 546 IN_PROC_BROWSER_TEST_F(ErrorPageTest, DNSError_GoBack2AndForward) { |
549 NavigateToFileURL(FILE_PATH_LITERAL("title2.html")); | 547 NavigateToFileURL(FILE_PATH_LITERAL("title2.html")); |
550 | 548 |
551 ui_test_utils::NavigateToURLBlockUntilNavigationsComplete( | 549 ui_test_utils::NavigateToURLBlockUntilNavigationsComplete( |
552 browser(), GetDnsErrorURL(), 2); | 550 browser(), GetDnsErrorURL(), 2); |
553 ExpectDisplayingNavigationCorrections(browser(), net::ERR_NAME_NOT_RESOLVED); | 551 ExpectDisplayingNavigationCorrections(browser(), net::ERR_NAME_NOT_RESOLVED); |
554 EXPECT_EQ(1, link_doctor_handler()->num_requests()); | 552 EXPECT_EQ(1, link_doctor_interceptor()->num_requests()); |
555 | 553 |
556 NavigateToFileURL(FILE_PATH_LITERAL("title3.html")); | 554 NavigateToFileURL(FILE_PATH_LITERAL("title3.html")); |
557 | 555 |
558 GoBackAndWaitForNavigations(2); | 556 GoBackAndWaitForNavigations(2); |
559 ExpectDisplayingNavigationCorrections(browser(), net::ERR_NAME_NOT_RESOLVED); | 557 ExpectDisplayingNavigationCorrections(browser(), net::ERR_NAME_NOT_RESOLVED); |
560 EXPECT_EQ(2, link_doctor_handler()->num_requests()); | 558 EXPECT_EQ(2, link_doctor_interceptor()->num_requests()); |
561 | 559 |
562 GoBackAndWaitForTitle("Title Of Awesomeness", 1); | 560 GoBackAndWaitForTitle("Title Of Awesomeness", 1); |
563 | 561 |
564 GoForwardAndWaitForNavigations(2); | 562 GoForwardAndWaitForNavigations(2); |
565 ExpectDisplayingNavigationCorrections(browser(), net::ERR_NAME_NOT_RESOLVED); | 563 ExpectDisplayingNavigationCorrections(browser(), net::ERR_NAME_NOT_RESOLVED); |
566 EXPECT_EQ(3, link_doctor_handler()->num_requests()); | 564 EXPECT_EQ(3, link_doctor_interceptor()->num_requests()); |
567 } | 565 } |
568 | 566 |
569 // Test that a DNS error occuring in the main frame does not result in an | 567 // Test that a DNS error occuring in the main frame does not result in an |
570 // additional session history entry. | 568 // additional session history entry. |
571 IN_PROC_BROWSER_TEST_F(ErrorPageTest, DNSError_GoBack2Forward2) { | 569 IN_PROC_BROWSER_TEST_F(ErrorPageTest, DNSError_GoBack2Forward2) { |
572 NavigateToFileURL(FILE_PATH_LITERAL("title3.html")); | 570 NavigateToFileURL(FILE_PATH_LITERAL("title3.html")); |
573 | 571 |
574 ui_test_utils::NavigateToURLBlockUntilNavigationsComplete( | 572 ui_test_utils::NavigateToURLBlockUntilNavigationsComplete( |
575 browser(), GetDnsErrorURL(), 2); | 573 browser(), GetDnsErrorURL(), 2); |
576 ExpectDisplayingNavigationCorrections(browser(), net::ERR_NAME_NOT_RESOLVED); | 574 ExpectDisplayingNavigationCorrections(browser(), net::ERR_NAME_NOT_RESOLVED); |
577 EXPECT_EQ(1, link_doctor_handler()->num_requests()); | 575 EXPECT_EQ(1, link_doctor_interceptor()->num_requests()); |
578 | 576 |
579 NavigateToFileURL(FILE_PATH_LITERAL("title2.html")); | 577 NavigateToFileURL(FILE_PATH_LITERAL("title2.html")); |
580 | 578 |
581 GoBackAndWaitForNavigations(2); | 579 GoBackAndWaitForNavigations(2); |
582 ExpectDisplayingNavigationCorrections(browser(), net::ERR_NAME_NOT_RESOLVED); | 580 ExpectDisplayingNavigationCorrections(browser(), net::ERR_NAME_NOT_RESOLVED); |
583 EXPECT_EQ(2, link_doctor_handler()->num_requests()); | 581 EXPECT_EQ(2, link_doctor_interceptor()->num_requests()); |
584 | 582 |
585 GoBackAndWaitForTitle("Title Of More Awesomeness", 1); | 583 GoBackAndWaitForTitle("Title Of More Awesomeness", 1); |
586 | 584 |
587 GoForwardAndWaitForNavigations(2); | 585 GoForwardAndWaitForNavigations(2); |
588 ExpectDisplayingNavigationCorrections(browser(), net::ERR_NAME_NOT_RESOLVED); | 586 ExpectDisplayingNavigationCorrections(browser(), net::ERR_NAME_NOT_RESOLVED); |
589 EXPECT_EQ(3, link_doctor_handler()->num_requests()); | 587 EXPECT_EQ(3, link_doctor_interceptor()->num_requests()); |
590 | 588 |
591 GoForwardAndWaitForTitle("Title Of Awesomeness", 1); | 589 GoForwardAndWaitForTitle("Title Of Awesomeness", 1); |
592 EXPECT_EQ(3, link_doctor_handler()->num_requests()); | 590 EXPECT_EQ(3, link_doctor_interceptor()->num_requests()); |
593 } | 591 } |
594 | 592 |
595 // Test that the search button on a DNS error page works. | 593 // Test that the search button on a DNS error page works. |
596 IN_PROC_BROWSER_TEST_F(ErrorPageTest, DNSError_DoSearch) { | 594 IN_PROC_BROWSER_TEST_F(ErrorPageTest, DNSError_DoSearch) { |
597 // The first navigation should fail, and the second one should be the error | 595 // The first navigation should fail, and the second one should be the error |
598 // page. | 596 // page. |
599 ui_test_utils::NavigateToURLBlockUntilNavigationsComplete( | 597 ui_test_utils::NavigateToURLBlockUntilNavigationsComplete( |
600 browser(), GetDnsErrorURL(), 2); | 598 browser(), GetDnsErrorURL(), 2); |
601 ExpectDisplayingNavigationCorrections(browser(), net::ERR_NAME_NOT_RESOLVED); | 599 ExpectDisplayingNavigationCorrections(browser(), net::ERR_NAME_NOT_RESOLVED); |
602 EXPECT_EQ(1, link_doctor_handler()->num_requests()); | 600 EXPECT_EQ(1, link_doctor_interceptor()->num_requests()); |
603 | 601 |
604 content::WebContents* web_contents = | 602 content::WebContents* web_contents = |
605 browser()->tab_strip_model()->GetActiveWebContents(); | 603 browser()->tab_strip_model()->GetActiveWebContents(); |
606 | 604 |
607 // Do a search and make sure the browser ends up at the right page. | 605 // Do a search and make sure the browser ends up at the right page. |
608 content::TestNavigationObserver nav_observer(web_contents, 1); | 606 content::TestNavigationObserver nav_observer(web_contents, 1); |
609 content::TitleWatcher title_watcher( | 607 content::TitleWatcher title_watcher( |
610 web_contents, | 608 web_contents, |
611 base::ASCIIToUTF16("Title Of More Awesomeness")); | 609 base::ASCIIToUTF16("Title Of More Awesomeness")); |
612 // Can't use content::ExecuteScript because it waits for scripts to send | 610 // Can't use content::ExecuteScript because it waits for scripts to send |
613 // notification that they've run, and scripts that trigger a navigation may | 611 // notification that they've run, and scripts that trigger a navigation may |
614 // not send that notification. | 612 // not send that notification. |
615 web_contents->GetMainFrame()->ExecuteJavaScript( | 613 web_contents->GetMainFrame()->ExecuteJavaScript( |
616 base::ASCIIToUTF16("document.getElementById('search-button').click();")); | 614 base::ASCIIToUTF16("document.getElementById('search-button').click();")); |
617 nav_observer.Wait(); | 615 nav_observer.Wait(); |
618 EXPECT_EQ(base::ASCIIToUTF16("Title Of More Awesomeness"), | 616 EXPECT_EQ(base::ASCIIToUTF16("Title Of More Awesomeness"), |
619 title_watcher.WaitAndGetTitle()); | 617 title_watcher.WaitAndGetTitle()); |
620 | 618 |
621 // There should have been another Link Doctor request, for tracking purposes. | 619 // There should have been another Link Doctor request, for tracking purposes. |
622 // Have to wait for it, since the search page does not depend on having | 620 // Have to wait for it, since the search page does not depend on having |
623 // sent the tracking request. | 621 // sent the tracking request. |
624 link_doctor_handler()->WaitForRequests(2); | 622 link_doctor_interceptor()->WaitForRequests(2); |
625 EXPECT_EQ(2, link_doctor_handler()->num_requests()); | 623 EXPECT_EQ(2, link_doctor_interceptor()->num_requests()); |
626 | 624 |
627 // Check the path and query string. | 625 // Check the path and query string. |
628 std::string url; | 626 std::string url; |
629 ASSERT_TRUE(content::ExecuteScriptAndExtractString( | 627 ASSERT_TRUE(content::ExecuteScriptAndExtractString( |
630 browser()->tab_strip_model()->GetActiveWebContents(), | 628 browser()->tab_strip_model()->GetActiveWebContents(), |
631 "domAutomationController.send(window.location.href);", | 629 "domAutomationController.send(window.location.href);", |
632 &url)); | 630 &url)); |
633 EXPECT_EQ("/search", GURL(url).path()); | 631 EXPECT_EQ("/search", GURL(url).path()); |
634 EXPECT_EQ("q=search%20query", GURL(url).query()); | 632 EXPECT_EQ("q=search%20query", GURL(url).query()); |
635 | 633 |
636 // Go back to the error page, to make sure the history is correct. | 634 // Go back to the error page, to make sure the history is correct. |
637 GoBackAndWaitForNavigations(2); | 635 GoBackAndWaitForNavigations(2); |
638 ExpectDisplayingNavigationCorrections(browser(), net::ERR_NAME_NOT_RESOLVED); | 636 ExpectDisplayingNavigationCorrections(browser(), net::ERR_NAME_NOT_RESOLVED); |
639 EXPECT_EQ(3, link_doctor_handler()->num_requests()); | 637 EXPECT_EQ(3, link_doctor_interceptor()->num_requests()); |
640 } | 638 } |
641 | 639 |
642 // Test that the reload button on a DNS error page works. | 640 // Test that the reload button on a DNS error page works. |
643 IN_PROC_BROWSER_TEST_F(ErrorPageTest, DNSError_DoReload) { | 641 IN_PROC_BROWSER_TEST_F(ErrorPageTest, DNSError_DoReload) { |
644 // The first navigation should fail, and the second one should be the error | 642 // The first navigation should fail, and the second one should be the error |
645 // page. | 643 // page. |
646 ui_test_utils::NavigateToURLBlockUntilNavigationsComplete( | 644 ui_test_utils::NavigateToURLBlockUntilNavigationsComplete( |
647 browser(), GetDnsErrorURL(), 2); | 645 browser(), GetDnsErrorURL(), 2); |
648 ExpectDisplayingNavigationCorrections(browser(), net::ERR_NAME_NOT_RESOLVED); | 646 ExpectDisplayingNavigationCorrections(browser(), net::ERR_NAME_NOT_RESOLVED); |
649 EXPECT_EQ(1, link_doctor_handler()->num_requests()); | 647 EXPECT_EQ(1, link_doctor_interceptor()->num_requests()); |
650 | 648 |
651 content::WebContents* web_contents = | 649 content::WebContents* web_contents = |
652 browser()->tab_strip_model()->GetActiveWebContents(); | 650 browser()->tab_strip_model()->GetActiveWebContents(); |
653 | 651 |
654 // Clicking the reload button should load the error page again, and there | 652 // Clicking the reload button should load the error page again, and there |
655 // should be two commits, as before. | 653 // should be two commits, as before. |
656 content::TestNavigationObserver nav_observer(web_contents, 2); | 654 content::TestNavigationObserver nav_observer(web_contents, 2); |
657 // Can't use content::ExecuteScript because it waits for scripts to send | 655 // Can't use content::ExecuteScript because it waits for scripts to send |
658 // notification that they've run, and scripts that trigger a navigation may | 656 // notification that they've run, and scripts that trigger a navigation may |
659 // not send that notification. | 657 // not send that notification. |
660 web_contents->GetMainFrame()->ExecuteJavaScript( | 658 web_contents->GetMainFrame()->ExecuteJavaScript( |
661 base::ASCIIToUTF16("document.getElementById('reload-button').click();")); | 659 base::ASCIIToUTF16("document.getElementById('reload-button').click();")); |
662 nav_observer.Wait(); | 660 nav_observer.Wait(); |
663 ExpectDisplayingNavigationCorrections(browser(), net::ERR_NAME_NOT_RESOLVED); | 661 ExpectDisplayingNavigationCorrections(browser(), net::ERR_NAME_NOT_RESOLVED); |
664 | 662 |
665 // There should have two more requests to the correction service: One for the | 663 // There should have two more requests to the correction service: One for the |
666 // new error page, and one for tracking purposes. Have to make sure to wait | 664 // new error page, and one for tracking purposes. Have to make sure to wait |
667 // for the tracking request, since the new error page does not depend on it. | 665 // for the tracking request, since the new error page does not depend on it. |
668 link_doctor_handler()->WaitForRequests(3); | 666 link_doctor_interceptor()->WaitForRequests(3); |
669 EXPECT_EQ(3, link_doctor_handler()->num_requests()); | 667 EXPECT_EQ(3, link_doctor_interceptor()->num_requests()); |
670 } | 668 } |
671 | 669 |
672 // Test that clicking links on a DNS error page works. | 670 // Test that clicking links on a DNS error page works. |
673 IN_PROC_BROWSER_TEST_F(ErrorPageTest, DNSError_DoClickLink) { | 671 IN_PROC_BROWSER_TEST_F(ErrorPageTest, DNSError_DoClickLink) { |
674 // The first navigation should fail, and the second one should be the error | 672 // The first navigation should fail, and the second one should be the error |
675 // page. | 673 // page. |
676 ui_test_utils::NavigateToURLBlockUntilNavigationsComplete( | 674 ui_test_utils::NavigateToURLBlockUntilNavigationsComplete( |
677 browser(), GetDnsErrorURL(), 2); | 675 browser(), GetDnsErrorURL(), 2); |
678 ExpectDisplayingNavigationCorrections(browser(), net::ERR_NAME_NOT_RESOLVED); | 676 ExpectDisplayingNavigationCorrections(browser(), net::ERR_NAME_NOT_RESOLVED); |
679 EXPECT_EQ(1, link_doctor_handler()->num_requests()); | 677 EXPECT_EQ(1, link_doctor_interceptor()->num_requests()); |
680 | 678 |
681 content::WebContents* web_contents = | 679 content::WebContents* web_contents = |
682 browser()->tab_strip_model()->GetActiveWebContents(); | 680 browser()->tab_strip_model()->GetActiveWebContents(); |
683 | 681 |
684 // Simulate a click on a link. | 682 // Simulate a click on a link. |
685 | 683 |
686 content::TitleWatcher title_watcher( | 684 content::TitleWatcher title_watcher( |
687 web_contents, | 685 web_contents, |
688 base::ASCIIToUTF16("Title Of Awesomeness")); | 686 base::ASCIIToUTF16("Title Of Awesomeness")); |
689 std::string link_selector = | 687 std::string link_selector = |
690 "document.querySelector('a[href=\"http://mock.http/title2.html\"]')"; | 688 "document.querySelector('a[href=\"http://mock.http/title2.html\"]')"; |
691 // The tracking request is triggered by onmousedown, so it catches middle | 689 // The tracking request is triggered by onmousedown, so it catches middle |
692 // mouse button clicks, as well as left clicks. | 690 // mouse button clicks, as well as left clicks. |
693 web_contents->GetMainFrame()->ExecuteJavaScript( | 691 web_contents->GetMainFrame()->ExecuteJavaScript( |
694 base::ASCIIToUTF16(link_selector + ".onmousedown();")); | 692 base::ASCIIToUTF16(link_selector + ".onmousedown();")); |
695 // Can't use content::ExecuteScript because it waits for scripts to send | 693 // Can't use content::ExecuteScript because it waits for scripts to send |
696 // notification that they've run, and scripts that trigger a navigation may | 694 // notification that they've run, and scripts that trigger a navigation may |
697 // not send that notification. | 695 // not send that notification. |
698 web_contents->GetMainFrame()->ExecuteJavaScript( | 696 web_contents->GetMainFrame()->ExecuteJavaScript( |
699 base::ASCIIToUTF16(link_selector + ".click();")); | 697 base::ASCIIToUTF16(link_selector + ".click();")); |
700 EXPECT_EQ(base::ASCIIToUTF16("Title Of Awesomeness"), | 698 EXPECT_EQ(base::ASCIIToUTF16("Title Of Awesomeness"), |
701 title_watcher.WaitAndGetTitle()); | 699 title_watcher.WaitAndGetTitle()); |
702 | 700 |
703 // There should have been a tracking request to the correction service. Have | 701 // There should have been a tracking request to the correction service. Have |
704 // to make sure to wait the tracking request, since the new page does not | 702 // to make sure to wait the tracking request, since the new page does not |
705 // depend on it. | 703 // depend on it. |
706 link_doctor_handler()->WaitForRequests(2); | 704 link_doctor_interceptor()->WaitForRequests(2); |
707 EXPECT_EQ(2, link_doctor_handler()->num_requests()); | 705 EXPECT_EQ(2, link_doctor_interceptor()->num_requests()); |
708 } | 706 } |
709 | 707 |
710 // Test that a DNS error occuring in an iframe does not result in showing | 708 // Test that a DNS error occuring in an iframe does not result in showing |
711 // navigation corrections. | 709 // navigation corrections. |
712 IN_PROC_BROWSER_TEST_F(ErrorPageTest, IFrameDNSError_Basic) { | 710 IN_PROC_BROWSER_TEST_F(ErrorPageTest, IFrameDNSError_Basic) { |
713 NavigateToURLAndWaitForTitle( | 711 NavigateToURLAndWaitForTitle( |
714 content::URLRequestMockHTTPJob::GetMockUrl( | 712 content::URLRequestMockHTTPJob::GetMockUrl( |
715 base::FilePath(FILE_PATH_LITERAL("iframe_dns_error.html"))), | 713 base::FilePath(FILE_PATH_LITERAL("iframe_dns_error.html"))), |
716 "Blah", | 714 "Blah", |
717 1); | 715 1); |
718 // We expect to have two history entries, since we started off with navigation | 716 // We expect to have two history entries, since we started off with navigation |
719 // to "about:blank" and then navigated to "iframe_dns_error.html". | 717 // to "about:blank" and then navigated to "iframe_dns_error.html". |
720 EXPECT_EQ(2, | 718 EXPECT_EQ(2, |
721 browser()->tab_strip_model()->GetActiveWebContents()-> | 719 browser()->tab_strip_model()->GetActiveWebContents()-> |
722 GetController().GetEntryCount()); | 720 GetController().GetEntryCount()); |
723 EXPECT_EQ(0, link_doctor_handler()->num_requests()); | 721 EXPECT_EQ(0, link_doctor_interceptor()->num_requests()); |
724 } | 722 } |
725 | 723 |
726 // This test fails regularly on win_rel trybots. See crbug.com/121540 | 724 // This test fails regularly on win_rel trybots. See crbug.com/121540 |
727 #if defined(OS_WIN) | 725 #if defined(OS_WIN) |
728 #define MAYBE_IFrameDNSError_GoBack DISABLED_IFrameDNSError_GoBack | 726 #define MAYBE_IFrameDNSError_GoBack DISABLED_IFrameDNSError_GoBack |
729 #else | 727 #else |
730 #define MAYBE_IFrameDNSError_GoBack IFrameDNSError_GoBack | 728 #define MAYBE_IFrameDNSError_GoBack IFrameDNSError_GoBack |
731 #endif | 729 #endif |
732 // Test that a DNS error occuring in an iframe does not result in an | 730 // Test that a DNS error occuring in an iframe does not result in an |
733 // additional session history entry. | 731 // additional session history entry. |
734 IN_PROC_BROWSER_TEST_F(ErrorPageTest, MAYBE_IFrameDNSError_GoBack) { | 732 IN_PROC_BROWSER_TEST_F(ErrorPageTest, MAYBE_IFrameDNSError_GoBack) { |
735 NavigateToFileURL(FILE_PATH_LITERAL("title2.html")); | 733 NavigateToFileURL(FILE_PATH_LITERAL("title2.html")); |
736 NavigateToFileURL(FILE_PATH_LITERAL("iframe_dns_error.html")); | 734 NavigateToFileURL(FILE_PATH_LITERAL("iframe_dns_error.html")); |
737 GoBackAndWaitForTitle("Title Of Awesomeness", 1); | 735 GoBackAndWaitForTitle("Title Of Awesomeness", 1); |
738 EXPECT_EQ(0, link_doctor_handler()->num_requests()); | 736 EXPECT_EQ(0, link_doctor_interceptor()->num_requests()); |
739 } | 737 } |
740 | 738 |
741 // This test fails regularly on win_rel trybots. See crbug.com/121540 | 739 // This test fails regularly on win_rel trybots. See crbug.com/121540 |
742 // | 740 // |
743 // This fails on linux_aura bringup: http://crbug.com/163931 | 741 // This fails on linux_aura bringup: http://crbug.com/163931 |
744 #if defined(OS_WIN) || (defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(US
E_AURA)) | 742 #if defined(OS_WIN) || (defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(US
E_AURA)) |
745 #define MAYBE_IFrameDNSError_GoBackAndForward DISABLED_IFrameDNSError_GoBackAndF
orward | 743 #define MAYBE_IFrameDNSError_GoBackAndForward DISABLED_IFrameDNSError_GoBackAndF
orward |
746 #else | 744 #else |
747 #define MAYBE_IFrameDNSError_GoBackAndForward IFrameDNSError_GoBackAndForward | 745 #define MAYBE_IFrameDNSError_GoBackAndForward IFrameDNSError_GoBackAndForward |
748 #endif | 746 #endif |
749 // Test that a DNS error occuring in an iframe does not result in an | 747 // Test that a DNS error occuring in an iframe does not result in an |
750 // additional session history entry. | 748 // additional session history entry. |
751 IN_PROC_BROWSER_TEST_F(ErrorPageTest, MAYBE_IFrameDNSError_GoBackAndForward) { | 749 IN_PROC_BROWSER_TEST_F(ErrorPageTest, MAYBE_IFrameDNSError_GoBackAndForward) { |
752 NavigateToFileURL(FILE_PATH_LITERAL("title2.html")); | 750 NavigateToFileURL(FILE_PATH_LITERAL("title2.html")); |
753 NavigateToFileURL(FILE_PATH_LITERAL("iframe_dns_error.html")); | 751 NavigateToFileURL(FILE_PATH_LITERAL("iframe_dns_error.html")); |
754 GoBackAndWaitForTitle("Title Of Awesomeness", 1); | 752 GoBackAndWaitForTitle("Title Of Awesomeness", 1); |
755 GoForwardAndWaitForTitle("Blah", 1); | 753 GoForwardAndWaitForTitle("Blah", 1); |
756 EXPECT_EQ(0, link_doctor_handler()->num_requests()); | 754 EXPECT_EQ(0, link_doctor_interceptor()->num_requests()); |
757 } | 755 } |
758 | 756 |
759 // Test that a DNS error occuring in an iframe, once the main document is | 757 // Test that a DNS error occuring in an iframe, once the main document is |
760 // completed loading, does not result in an additional session history entry. | 758 // completed loading, does not result in an additional session history entry. |
761 // To ensure that the main document has completed loading, JavaScript is used to | 759 // To ensure that the main document has completed loading, JavaScript is used to |
762 // inject an iframe after loading is done. | 760 // inject an iframe after loading is done. |
763 IN_PROC_BROWSER_TEST_F(ErrorPageTest, IFrameDNSError_JavaScript) { | 761 IN_PROC_BROWSER_TEST_F(ErrorPageTest, IFrameDNSError_JavaScript) { |
764 content::WebContents* wc = | 762 content::WebContents* wc = |
765 browser()->tab_strip_model()->GetActiveWebContents(); | 763 browser()->tab_strip_model()->GetActiveWebContents(); |
766 GURL fail_url = | 764 GURL fail_url = |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
811 TestFailProvisionalLoadObserver fail_observer(wc); | 809 TestFailProvisionalLoadObserver fail_observer(wc); |
812 content::WindowedNotificationObserver load_observer( | 810 content::WindowedNotificationObserver load_observer( |
813 content::NOTIFICATION_LOAD_STOP, | 811 content::NOTIFICATION_LOAD_STOP, |
814 content::Source<NavigationController>(&wc->GetController())); | 812 content::Source<NavigationController>(&wc->GetController())); |
815 wc->GetMainFrame()->ExecuteJavaScript(base::ASCIIToUTF16(script)); | 813 wc->GetMainFrame()->ExecuteJavaScript(base::ASCIIToUTF16(script)); |
816 load_observer.Wait(); | 814 load_observer.Wait(); |
817 | 815 |
818 EXPECT_EQ(fail_url, fail_observer.fail_url()); | 816 EXPECT_EQ(fail_url, fail_observer.fail_url()); |
819 EXPECT_EQ(2, wc->GetController().GetEntryCount()); | 817 EXPECT_EQ(2, wc->GetController().GetEntryCount()); |
820 } | 818 } |
821 EXPECT_EQ(0, link_doctor_handler()->num_requests()); | 819 EXPECT_EQ(0, link_doctor_interceptor()->num_requests()); |
822 } | 820 } |
823 | 821 |
824 // Checks that navigation corrections are not loaded when we receive an actual | 822 // Checks that navigation corrections are not loaded when we receive an actual |
825 // 404 page. | 823 // 404 page. |
826 IN_PROC_BROWSER_TEST_F(ErrorPageTest, Page404) { | 824 IN_PROC_BROWSER_TEST_F(ErrorPageTest, Page404) { |
827 NavigateToURLAndWaitForTitle( | 825 NavigateToURLAndWaitForTitle( |
828 content::URLRequestMockHTTPJob::GetMockUrl( | 826 content::URLRequestMockHTTPJob::GetMockUrl( |
829 base::FilePath(FILE_PATH_LITERAL("page404.html"))), | 827 base::FilePath(FILE_PATH_LITERAL("page404.html"))), |
830 "SUCCESS", | 828 "SUCCESS", |
831 1); | 829 1); |
832 EXPECT_EQ(0, link_doctor_handler()->num_requests()); | 830 EXPECT_EQ(0, link_doctor_interceptor()->num_requests()); |
833 } | 831 } |
834 | 832 |
835 // Checks that when an error occurs, the stale cache status of the page | 833 // Checks that when an error occurs, the stale cache status of the page |
836 // is correctly transferred, and that stale cached copied can be loaded | 834 // is correctly transferred, and that stale cached copied can be loaded |
837 // from the javascript. | 835 // from the javascript. |
838 IN_PROC_BROWSER_TEST_F(ErrorPageTest, StaleCacheStatus) { | 836 IN_PROC_BROWSER_TEST_F(ErrorPageTest, StaleCacheStatus) { |
839 ASSERT_TRUE(test_server()->Start()); | 837 ASSERT_TRUE(test_server()->Start()); |
840 // Load cache with entry with "nocache" set, to create stale | 838 // Load cache with entry with "nocache" set, to create stale |
841 // cache. | 839 // cache. |
842 GURL test_url(test_server()->GetURL("files/nocache.html")); | 840 GURL test_url(test_server()->GetURL("files/nocache.html")); |
(...skipping 27 matching lines...) Expand all Loading... |
870 // Clear the cache and reload the same URL; confirm the error page is told | 868 // Clear the cache and reload the same URL; confirm the error page is told |
871 // that there is no cached copy. | 869 // that there is no cached copy. |
872 BrowsingDataRemover* remover = | 870 BrowsingDataRemover* remover = |
873 BrowsingDataRemover::CreateForUnboundedRange(browser()->profile()); | 871 BrowsingDataRemover::CreateForUnboundedRange(browser()->profile()); |
874 remover->Remove(BrowsingDataRemover::REMOVE_CACHE, | 872 remover->Remove(BrowsingDataRemover::REMOVE_CACHE, |
875 BrowsingDataHelper::UNPROTECTED_WEB); | 873 BrowsingDataHelper::UNPROTECTED_WEB); |
876 ui_test_utils::NavigateToURLBlockUntilNavigationsComplete( | 874 ui_test_utils::NavigateToURLBlockUntilNavigationsComplete( |
877 browser(), test_url, 1); | 875 browser(), test_url, 1); |
878 EXPECT_TRUE(ProbeStaleCopyValue(false)); | 876 EXPECT_TRUE(ProbeStaleCopyValue(false)); |
879 EXPECT_FALSE(IsDisplayingText(browser(), GetLoadStaleButtonLabel())); | 877 EXPECT_FALSE(IsDisplayingText(browser(), GetLoadStaleButtonLabel())); |
880 EXPECT_EQ(0, link_doctor_handler()->num_requests()); | 878 EXPECT_EQ(0, link_doctor_interceptor()->num_requests()); |
881 } | 879 } |
882 | 880 |
883 class ErrorPageAutoReloadTest : public InProcessBrowserTest { | 881 class ErrorPageAutoReloadTest : public InProcessBrowserTest { |
884 public: | 882 public: |
885 virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE { | 883 virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE { |
886 command_line->AppendSwitch(switches::kEnableOfflineAutoReload); | 884 command_line->AppendSwitch(switches::kEnableOfflineAutoReload); |
887 } | 885 } |
888 | 886 |
889 void InstallProtocolHandler(const GURL& url, int requests_to_fail) { | 887 void InstallInterceptor(const GURL& url, int requests_to_fail) { |
890 protocol_handler_ = new FailFirstNRequestsProtocolHandler(requests_to_fail); | 888 interceptor_ = new FailFirstNRequestsInterceptor(requests_to_fail); |
891 scoped_ptr<URLRequestJobFactory::ProtocolHandler> owned_handler( | 889 scoped_ptr<net::URLRequestInterceptor> owned_interceptor(interceptor_); |
892 protocol_handler_); | |
893 | 890 |
894 // Tests don't need to wait for this task to complete before using the | 891 // Tests don't need to wait for this task to complete before using the |
895 // filter; any requests that might be affected by it will end up in the IO | 892 // filter; any requests that might be affected by it will end up in the IO |
896 // thread's message loop after this posted task anyway. | 893 // thread's message loop after this posted task anyway. |
897 // | 894 // |
898 // Ownership of the |protocol_handler_| is passed to an object the IO | 895 // Ownership of the interceptor is passed to an object the IO thread, but a |
899 // thread, but a pointer is kept in the test fixture. As soon as anything | 896 // pointer is kept in the test fixture. As soon as anything calls |
900 // calls URLRequestFilter::ClearHandlers(), |protocol_handler_| can become | 897 // URLRequestFilter::ClearHandlers(), |interceptor_| can become invalid. |
901 // invalid. | |
902 BrowserThread::PostTask( | 898 BrowserThread::PostTask( |
903 BrowserThread::IO, FROM_HERE, | 899 BrowserThread::IO, FROM_HERE, |
904 base::Bind(&AddProtocolHandlerForURL, url, | 900 base::Bind(&AddInterceptorForURL, url, |
905 base::Passed(&owned_handler))); | 901 base::Passed(&owned_interceptor))); |
906 } | 902 } |
907 | 903 |
908 void NavigateToURLAndWaitForTitle(const GURL& url, | 904 void NavigateToURLAndWaitForTitle(const GURL& url, |
909 const std::string& expected_title, | 905 const std::string& expected_title, |
910 int num_navigations) { | 906 int num_navigations) { |
911 content::TitleWatcher title_watcher( | 907 content::TitleWatcher title_watcher( |
912 browser()->tab_strip_model()->GetActiveWebContents(), | 908 browser()->tab_strip_model()->GetActiveWebContents(), |
913 base::ASCIIToUTF16(expected_title)); | 909 base::ASCIIToUTF16(expected_title)); |
914 | 910 |
915 ui_test_utils::NavigateToURLBlockUntilNavigationsComplete( | 911 ui_test_utils::NavigateToURLBlockUntilNavigationsComplete( |
916 browser(), url, num_navigations); | 912 browser(), url, num_navigations); |
917 | 913 |
918 EXPECT_EQ(base::ASCIIToUTF16(expected_title), | 914 EXPECT_EQ(base::ASCIIToUTF16(expected_title), |
919 title_watcher.WaitAndGetTitle()); | 915 title_watcher.WaitAndGetTitle()); |
920 } | 916 } |
921 | 917 |
922 FailFirstNRequestsProtocolHandler* protocol_handler() { | 918 FailFirstNRequestsInterceptor* interceptor() { |
923 return protocol_handler_; | 919 return interceptor_; |
924 } | 920 } |
925 | 921 |
926 private: | 922 private: |
927 FailFirstNRequestsProtocolHandler* protocol_handler_; | 923 FailFirstNRequestsInterceptor* interceptor_; |
928 }; | 924 }; |
929 | 925 |
930 IN_PROC_BROWSER_TEST_F(ErrorPageAutoReloadTest, AutoReload) { | 926 IN_PROC_BROWSER_TEST_F(ErrorPageAutoReloadTest, AutoReload) { |
931 GURL test_url("http://error.page.auto.reload"); | 927 GURL test_url("http://error.page.auto.reload"); |
932 const int kRequestsToFail = 2; | 928 const int kRequestsToFail = 2; |
933 InstallProtocolHandler(test_url, kRequestsToFail); | 929 InstallInterceptor(test_url, kRequestsToFail); |
934 NavigateToURLAndWaitForTitle(test_url, "Test One", kRequestsToFail + 1); | 930 NavigateToURLAndWaitForTitle(test_url, "Test One", kRequestsToFail + 1); |
935 // Note that the protocol handler updates these variables on the IO thread, | 931 // Note that the interceptor updates these variables on the IO thread, |
936 // but this function reads them on the main thread. The requests have to be | 932 // but this function reads them on the main thread. The requests have to be |
937 // created (on the IO thread) before NavigateToURLAndWaitForTitle returns or | 933 // created (on the IO thread) before NavigateToURLAndWaitForTitle returns or |
938 // this becomes racey. | 934 // this becomes racey. |
939 EXPECT_EQ(kRequestsToFail, protocol_handler()->failures()); | 935 EXPECT_EQ(kRequestsToFail, interceptor()->failures()); |
940 EXPECT_EQ(kRequestsToFail + 1, protocol_handler()->requests()); | 936 EXPECT_EQ(kRequestsToFail + 1, interceptor()->requests()); |
941 } | 937 } |
942 | 938 |
943 // Protocol handler that fails all requests with net::ERR_ADDRESS_UNREACHABLE. | 939 // Interceptor that fails all requests with net::ERR_ADDRESS_UNREACHABLE. |
944 class AddressUnreachableProtocolHandler | 940 class AddressUnreachableInterceptor : public net::URLRequestInterceptor { |
945 : public net::URLRequestJobFactory::ProtocolHandler { | |
946 public: | 941 public: |
947 AddressUnreachableProtocolHandler() {} | 942 AddressUnreachableInterceptor() {} |
948 virtual ~AddressUnreachableProtocolHandler() {} | 943 virtual ~AddressUnreachableInterceptor() {} |
949 | 944 |
950 // net::URLRequestJobFactory::ProtocolHandler: | 945 // net::URLRequestInterceptor: |
951 virtual net::URLRequestJob* MaybeCreateJob( | 946 virtual net::URLRequestJob* MaybeInterceptRequest( |
952 net::URLRequest* request, | 947 net::URLRequest* request, |
953 net::NetworkDelegate* network_delegate) const OVERRIDE { | 948 net::NetworkDelegate* network_delegate) const OVERRIDE { |
954 return new URLRequestFailedJob(request, | 949 return new URLRequestFailedJob(request, |
955 network_delegate, | 950 network_delegate, |
956 net::ERR_ADDRESS_UNREACHABLE); | 951 net::ERR_ADDRESS_UNREACHABLE); |
957 } | 952 } |
958 | 953 |
959 private: | 954 private: |
960 DISALLOW_COPY_AND_ASSIGN(AddressUnreachableProtocolHandler); | 955 DISALLOW_COPY_AND_ASSIGN(AddressUnreachableInterceptor); |
961 }; | 956 }; |
962 | 957 |
963 // A test fixture that returns ERR_ADDRESS_UNREACHABLE for all navigation | 958 // A test fixture that returns ERR_ADDRESS_UNREACHABLE for all navigation |
964 // correction requests. ERR_NAME_NOT_RESOLVED is more typical, but need to use | 959 // correction requests. ERR_NAME_NOT_RESOLVED is more typical, but need to use |
965 // a different error for the correction service and the original page to | 960 // a different error for the correction service and the original page to |
966 // validate the right page is being displayed. | 961 // validate the right page is being displayed. |
967 class ErrorPageNavigationCorrectionsFailTest : public ErrorPageTest { | 962 class ErrorPageNavigationCorrectionsFailTest : public ErrorPageTest { |
968 public: | 963 public: |
969 // InProcessBrowserTest: | 964 // InProcessBrowserTest: |
970 virtual void SetUpOnMainThread() OVERRIDE { | 965 virtual void SetUpOnMainThread() OVERRIDE { |
(...skipping 10 matching lines...) Expand all Loading... |
981 | 976 |
982 private: | 977 private: |
983 // Adds a filter that causes all correction service requests to fail with | 978 // Adds a filter that causes all correction service requests to fail with |
984 // ERR_ADDRESS_UNREACHABLE. | 979 // ERR_ADDRESS_UNREACHABLE. |
985 // | 980 // |
986 // Also adds the content::URLRequestFailedJob filter. | 981 // Also adds the content::URLRequestFailedJob filter. |
987 static void AddFilters() { | 982 static void AddFilters() { |
988 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 983 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
989 content::URLRequestFailedJob::AddUrlHandler(); | 984 content::URLRequestFailedJob::AddUrlHandler(); |
990 | 985 |
991 net::URLRequestFilter::GetInstance()->AddUrlProtocolHandler( | 986 net::URLRequestFilter::GetInstance()->AddUrlInterceptor( |
992 google_util::LinkDoctorBaseURL(), | 987 google_util::LinkDoctorBaseURL(), |
993 scoped_ptr<net::URLRequestJobFactory::ProtocolHandler>( | 988 scoped_ptr<net::URLRequestInterceptor>( |
994 new AddressUnreachableProtocolHandler())); | 989 new AddressUnreachableInterceptor())); |
995 } | 990 } |
996 | 991 |
997 static void RemoveFilters() { | 992 static void RemoveFilters() { |
998 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 993 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
999 net::URLRequestFilter::GetInstance()->ClearHandlers(); | 994 net::URLRequestFilter::GetInstance()->ClearHandlers(); |
1000 } | 995 } |
1001 }; | 996 }; |
1002 | 997 |
1003 // Make sure that when corrections fail to load, the network error page is | 998 // Make sure that when corrections fail to load, the network error page is |
1004 // successfully loaded. | 999 // successfully loaded. |
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1107 browser(), | 1102 browser(), |
1108 URLRequestFailedJob::GetMockHttpUrlForHostname(net::ERR_UNSAFE_PORT, | 1103 URLRequestFailedJob::GetMockHttpUrlForHostname(net::ERR_UNSAFE_PORT, |
1109 kHostname), | 1104 kHostname), |
1110 1); | 1105 1); |
1111 | 1106 |
1112 ToggleHelpBox(browser()); | 1107 ToggleHelpBox(browser()); |
1113 EXPECT_TRUE(IsDisplayingText(browser(), kHostnameJSUnicode)); | 1108 EXPECT_TRUE(IsDisplayingText(browser(), kHostnameJSUnicode)); |
1114 } | 1109 } |
1115 | 1110 |
1116 } // namespace | 1111 } // namespace |
OLD | NEW |