| 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 136 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 147   net::URLRequestFilter::GetInstance()->AddUrlInterceptor( | 147   net::URLRequestFilter::GetInstance()->AddUrlInterceptor( | 
| 148       url, handler.Pass()); | 148       url, handler.Pass()); | 
| 149 } | 149 } | 
| 150 | 150 | 
| 151 // An interceptor that fails a configurable number of requests, then succeeds | 151 // An interceptor that fails a configurable number of requests, then succeeds | 
| 152 // all requests after that, keeping count of failures and successes. | 152 // all requests after that, keeping count of failures and successes. | 
| 153 class FailFirstNRequestsInterceptor : public net::URLRequestInterceptor { | 153 class FailFirstNRequestsInterceptor : public net::URLRequestInterceptor { | 
| 154  public: | 154  public: | 
| 155   explicit FailFirstNRequestsInterceptor(int requests_to_fail) | 155   explicit FailFirstNRequestsInterceptor(int requests_to_fail) | 
| 156       : requests_(0), failures_(0), requests_to_fail_(requests_to_fail) {} | 156       : requests_(0), failures_(0), requests_to_fail_(requests_to_fail) {} | 
| 157   virtual ~FailFirstNRequestsInterceptor() {} | 157   ~FailFirstNRequestsInterceptor() override {} | 
| 158 | 158 | 
| 159   // net::URLRequestInterceptor implementation | 159   // net::URLRequestInterceptor implementation | 
| 160   virtual net::URLRequestJob* MaybeInterceptRequest( | 160   net::URLRequestJob* MaybeInterceptRequest( | 
| 161       net::URLRequest* request, | 161       net::URLRequest* request, | 
| 162       net::NetworkDelegate* network_delegate) const override { | 162       net::NetworkDelegate* network_delegate) const override { | 
| 163     DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 163     DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 
| 164     requests_++; | 164     requests_++; | 
| 165     if (failures_ < requests_to_fail_) { | 165     if (failures_ < requests_to_fail_) { | 
| 166       failures_++; | 166       failures_++; | 
| 167       // Note: net::ERR_CONNECTION_RESET does not summon the Link Doctor; see | 167       // Note: net::ERR_CONNECTION_RESET does not summon the Link Doctor; see | 
| 168       // NetErrorHelperCore::GetErrorPageURL. | 168       // NetErrorHelperCore::GetErrorPageURL. | 
| 169       return new URLRequestFailedJob(request, | 169       return new URLRequestFailedJob(request, | 
| 170                                      network_delegate, | 170                                      network_delegate, | 
| (...skipping 22 matching lines...) Expand all  Loading... | 
| 193 // An interceptor that serves LinkDoctor responses.  It also allows waiting | 193 // An interceptor that serves LinkDoctor responses.  It also allows waiting | 
| 194 // until a certain number of requests have been sent. | 194 // until a certain number of requests have been sent. | 
| 195 // TODO(mmenke):  Wait until responses have been received instead. | 195 // TODO(mmenke):  Wait until responses have been received instead. | 
| 196 class LinkDoctorInterceptor : public net::URLRequestInterceptor { | 196 class LinkDoctorInterceptor : public net::URLRequestInterceptor { | 
| 197  public: | 197  public: | 
| 198   LinkDoctorInterceptor() : num_requests_(0), | 198   LinkDoctorInterceptor() : num_requests_(0), | 
| 199                             requests_to_wait_for_(-1), | 199                             requests_to_wait_for_(-1), | 
| 200                             weak_factory_(this) { | 200                             weak_factory_(this) { | 
| 201   } | 201   } | 
| 202 | 202 | 
| 203   virtual ~LinkDoctorInterceptor() {} | 203   ~LinkDoctorInterceptor() override {} | 
| 204 | 204 | 
| 205   // net::URLRequestInterceptor implementation | 205   // net::URLRequestInterceptor implementation | 
| 206   virtual net::URLRequestJob* MaybeInterceptRequest( | 206   net::URLRequestJob* MaybeInterceptRequest( | 
| 207       net::URLRequest* request, | 207       net::URLRequest* request, | 
| 208       net::NetworkDelegate* network_delegate) const override { | 208       net::NetworkDelegate* network_delegate) const override { | 
| 209     DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 209     DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 
| 210 | 210 | 
| 211     BrowserThread::PostTask( | 211     BrowserThread::PostTask( | 
| 212         BrowserThread::UI, FROM_HERE, | 212         BrowserThread::UI, FROM_HERE, | 
| 213         base::Bind(&LinkDoctorInterceptor::RequestCreated, | 213         base::Bind(&LinkDoctorInterceptor::RequestCreated, | 
| 214                    weak_factory_.GetWeakPtr())); | 214                    weak_factory_.GetWeakPtr())); | 
| 215 | 215 | 
| 216     base::FilePath root_http; | 216     base::FilePath root_http; | 
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 290   enum HistoryNavigationDirection { | 290   enum HistoryNavigationDirection { | 
| 291     HISTORY_NAVIGATE_BACK, | 291     HISTORY_NAVIGATE_BACK, | 
| 292     HISTORY_NAVIGATE_FORWARD, | 292     HISTORY_NAVIGATE_FORWARD, | 
| 293   }; | 293   }; | 
| 294 | 294 | 
| 295   ErrorPageTest() : link_doctor_interceptor_(NULL) {} | 295   ErrorPageTest() : link_doctor_interceptor_(NULL) {} | 
| 296   virtual ~ErrorPageTest() {} | 296   virtual ~ErrorPageTest() {} | 
| 297 | 297 | 
| 298   // Navigates the active tab to a mock url created for the file at |file_path|. | 298   // Navigates the active tab to a mock url created for the file at |file_path|. | 
| 299   // Needed for StaleCacheStatus and StaleCacheStatusFailedCorrections tests. | 299   // Needed for StaleCacheStatus and StaleCacheStatusFailedCorrections tests. | 
| 300   virtual void SetUpCommandLine(CommandLine* command_line) override { | 300   void SetUpCommandLine(CommandLine* command_line) override { | 
| 301     command_line->AppendSwitch(switches::kEnableOfflineLoadStaleCache); | 301     command_line->AppendSwitch(switches::kEnableOfflineLoadStaleCache); | 
| 302   } | 302   } | 
| 303 | 303 | 
| 304   // Navigates the active tab to a mock url created for the file at |file_path|. | 304   // Navigates the active tab to a mock url created for the file at |file_path|. | 
| 305   void NavigateToFileURL(const base::FilePath::StringType& file_path) { | 305   void NavigateToFileURL(const base::FilePath::StringType& file_path) { | 
| 306     ui_test_utils::NavigateToURL( | 306     ui_test_utils::NavigateToURL( | 
| 307         browser(), | 307         browser(), | 
| 308         net::URLRequestMockHTTPJob::GetMockUrl(base::FilePath(file_path))); | 308         net::URLRequestMockHTTPJob::GetMockUrl(base::FilePath(file_path))); | 
| 309   } | 309   } | 
| 310 | 310 | 
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 398       return testing::AssertionFailure(); | 398       return testing::AssertionFailure(); | 
| 399     return ("success" == result ? testing::AssertionSuccess() : | 399     return ("success" == result ? testing::AssertionSuccess() : | 
| 400             (testing::AssertionFailure() << "Exception message is " << result)); | 400             (testing::AssertionFailure() << "Exception message is " << result)); | 
| 401   } | 401   } | 
| 402 | 402 | 
| 403   LinkDoctorInterceptor* link_doctor_interceptor() { | 403   LinkDoctorInterceptor* link_doctor_interceptor() { | 
| 404     return link_doctor_interceptor_; | 404     return link_doctor_interceptor_; | 
| 405   } | 405   } | 
| 406 | 406 | 
| 407  protected: | 407  protected: | 
| 408   virtual void SetUpOnMainThread() override { | 408   void SetUpOnMainThread() override { | 
| 409     link_doctor_interceptor_ = new LinkDoctorInterceptor(); | 409     link_doctor_interceptor_ = new LinkDoctorInterceptor(); | 
| 410     scoped_ptr<net::URLRequestInterceptor> owned_interceptor( | 410     scoped_ptr<net::URLRequestInterceptor> owned_interceptor( | 
| 411         link_doctor_interceptor_); | 411         link_doctor_interceptor_); | 
| 412     // Ownership of the |interceptor_| is passed to an object the IO thread, but | 412     // Ownership of the |interceptor_| is passed to an object the IO thread, but | 
| 413     // a pointer is kept in the test fixture.  As soon as anything calls | 413     // a pointer is kept in the test fixture.  As soon as anything calls | 
| 414     // URLRequestFilter::ClearHandlers(), |interceptor_| can become invalid. | 414     // URLRequestFilter::ClearHandlers(), |interceptor_| can become invalid. | 
| 415     BrowserThread::PostTask( | 415     BrowserThread::PostTask( | 
| 416         BrowserThread::IO, FROM_HERE, | 416         BrowserThread::IO, FROM_HERE, | 
| 417         base::Bind(&InstallMockInterceptors, | 417         base::Bind(&InstallMockInterceptors, | 
| 418                    google_util::GetGoogleSearchURL( | 418                    google_util::GetGoogleSearchURL( | 
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 457     test_navigation_observer.Wait(); | 457     test_navigation_observer.Wait(); | 
| 458   } | 458   } | 
| 459 | 459 | 
| 460   LinkDoctorInterceptor* link_doctor_interceptor_; | 460   LinkDoctorInterceptor* link_doctor_interceptor_; | 
| 461 }; | 461 }; | 
| 462 | 462 | 
| 463 class TestFailProvisionalLoadObserver : public content::WebContentsObserver { | 463 class TestFailProvisionalLoadObserver : public content::WebContentsObserver { | 
| 464  public: | 464  public: | 
| 465   explicit TestFailProvisionalLoadObserver(content::WebContents* contents) | 465   explicit TestFailProvisionalLoadObserver(content::WebContents* contents) | 
| 466       : content::WebContentsObserver(contents) {} | 466       : content::WebContentsObserver(contents) {} | 
| 467   virtual ~TestFailProvisionalLoadObserver() {} | 467   ~TestFailProvisionalLoadObserver() override {} | 
| 468 | 468 | 
| 469   // This method is invoked when the provisional load failed. | 469   // This method is invoked when the provisional load failed. | 
| 470   virtual void DidFailProvisionalLoad( | 470   void DidFailProvisionalLoad( | 
| 471       content::RenderFrameHost* render_frame_host, | 471       content::RenderFrameHost* render_frame_host, | 
| 472       const GURL& validated_url, | 472       const GURL& validated_url, | 
| 473       int error_code, | 473       int error_code, | 
| 474       const base::string16& error_description) override { | 474       const base::string16& error_description) override { | 
| 475     fail_url_ = validated_url; | 475     fail_url_ = validated_url; | 
| 476   } | 476   } | 
| 477 | 477 | 
| 478   const GURL& fail_url() const { return fail_url_; } | 478   const GURL& fail_url() const { return fail_url_; } | 
| 479 | 479 | 
| 480  private: | 480  private: | 
| (...skipping 388 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 869                   BrowsingDataHelper::UNPROTECTED_WEB); | 869                   BrowsingDataHelper::UNPROTECTED_WEB); | 
| 870   ui_test_utils::NavigateToURLBlockUntilNavigationsComplete( | 870   ui_test_utils::NavigateToURLBlockUntilNavigationsComplete( | 
| 871       browser(), test_url, 1); | 871       browser(), test_url, 1); | 
| 872   EXPECT_TRUE(ProbeStaleCopyValue(false)); | 872   EXPECT_TRUE(ProbeStaleCopyValue(false)); | 
| 873   EXPECT_FALSE(IsDisplayingText(browser(), GetLoadStaleButtonLabel())); | 873   EXPECT_FALSE(IsDisplayingText(browser(), GetLoadStaleButtonLabel())); | 
| 874   EXPECT_EQ(0, link_doctor_interceptor()->num_requests()); | 874   EXPECT_EQ(0, link_doctor_interceptor()->num_requests()); | 
| 875 } | 875 } | 
| 876 | 876 | 
| 877 class ErrorPageAutoReloadTest : public InProcessBrowserTest { | 877 class ErrorPageAutoReloadTest : public InProcessBrowserTest { | 
| 878  public: | 878  public: | 
| 879   virtual void SetUpCommandLine(CommandLine* command_line) override { | 879   void SetUpCommandLine(CommandLine* command_line) override { | 
| 880     command_line->AppendSwitch(switches::kEnableOfflineAutoReload); | 880     command_line->AppendSwitch(switches::kEnableOfflineAutoReload); | 
| 881   } | 881   } | 
| 882 | 882 | 
| 883   void InstallInterceptor(const GURL& url, int requests_to_fail) { | 883   void InstallInterceptor(const GURL& url, int requests_to_fail) { | 
| 884     interceptor_ = new FailFirstNRequestsInterceptor(requests_to_fail); | 884     interceptor_ = new FailFirstNRequestsInterceptor(requests_to_fail); | 
| 885     scoped_ptr<net::URLRequestInterceptor> owned_interceptor(interceptor_); | 885     scoped_ptr<net::URLRequestInterceptor> owned_interceptor(interceptor_); | 
| 886 | 886 | 
| 887     // Tests don't need to wait for this task to complete before using the | 887     // Tests don't need to wait for this task to complete before using the | 
| 888     // filter; any requests that might be affected by it will end up in the IO | 888     // filter; any requests that might be affected by it will end up in the IO | 
| 889     // thread's message loop after this posted task anyway. | 889     // thread's message loop after this posted task anyway. | 
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 929   // created (on the IO thread) before NavigateToURLAndWaitForTitle returns or | 929   // created (on the IO thread) before NavigateToURLAndWaitForTitle returns or | 
| 930   // this becomes racey. | 930   // this becomes racey. | 
| 931   EXPECT_EQ(kRequestsToFail, interceptor()->failures()); | 931   EXPECT_EQ(kRequestsToFail, interceptor()->failures()); | 
| 932   EXPECT_EQ(kRequestsToFail + 1, interceptor()->requests()); | 932   EXPECT_EQ(kRequestsToFail + 1, interceptor()->requests()); | 
| 933 } | 933 } | 
| 934 | 934 | 
| 935 // Interceptor that fails all requests with net::ERR_ADDRESS_UNREACHABLE. | 935 // Interceptor that fails all requests with net::ERR_ADDRESS_UNREACHABLE. | 
| 936 class AddressUnreachableInterceptor : public net::URLRequestInterceptor { | 936 class AddressUnreachableInterceptor : public net::URLRequestInterceptor { | 
| 937  public: | 937  public: | 
| 938   AddressUnreachableInterceptor() {} | 938   AddressUnreachableInterceptor() {} | 
| 939   virtual ~AddressUnreachableInterceptor() {} | 939   ~AddressUnreachableInterceptor() override {} | 
| 940 | 940 | 
| 941   // net::URLRequestInterceptor: | 941   // net::URLRequestInterceptor: | 
| 942   virtual net::URLRequestJob* MaybeInterceptRequest( | 942   net::URLRequestJob* MaybeInterceptRequest( | 
| 943       net::URLRequest* request, | 943       net::URLRequest* request, | 
| 944       net::NetworkDelegate* network_delegate) const override { | 944       net::NetworkDelegate* network_delegate) const override { | 
| 945     return new URLRequestFailedJob(request, | 945     return new URLRequestFailedJob(request, | 
| 946                                    network_delegate, | 946                                    network_delegate, | 
| 947                                    net::ERR_ADDRESS_UNREACHABLE); | 947                                    net::ERR_ADDRESS_UNREACHABLE); | 
| 948   } | 948   } | 
| 949 | 949 | 
| 950  private: | 950  private: | 
| 951   DISALLOW_COPY_AND_ASSIGN(AddressUnreachableInterceptor); | 951   DISALLOW_COPY_AND_ASSIGN(AddressUnreachableInterceptor); | 
| 952 }; | 952 }; | 
| 953 | 953 | 
| 954 // A test fixture that returns ERR_ADDRESS_UNREACHABLE for all navigation | 954 // A test fixture that returns ERR_ADDRESS_UNREACHABLE for all navigation | 
| 955 // correction requests.  ERR_NAME_NOT_RESOLVED is more typical, but need to use | 955 // correction requests.  ERR_NAME_NOT_RESOLVED is more typical, but need to use | 
| 956 // a different error for the correction service and the original page to | 956 // a different error for the correction service and the original page to | 
| 957 // validate the right page is being displayed. | 957 // validate the right page is being displayed. | 
| 958 class ErrorPageNavigationCorrectionsFailTest : public ErrorPageTest { | 958 class ErrorPageNavigationCorrectionsFailTest : public ErrorPageTest { | 
| 959  public: | 959  public: | 
| 960   // InProcessBrowserTest: | 960   // InProcessBrowserTest: | 
| 961   virtual void SetUpOnMainThread() override { | 961   void SetUpOnMainThread() override { | 
| 962     BrowserThread::PostTask( | 962     BrowserThread::PostTask( | 
| 963         BrowserThread::IO, FROM_HERE, | 963         BrowserThread::IO, FROM_HERE, | 
| 964         base::Bind(&ErrorPageNavigationCorrectionsFailTest::AddFilters)); | 964         base::Bind(&ErrorPageNavigationCorrectionsFailTest::AddFilters)); | 
| 965   } | 965   } | 
| 966 | 966 | 
| 967   virtual void TearDownOnMainThread() override { | 967   void TearDownOnMainThread() override { | 
| 968     BrowserThread::PostTask( | 968     BrowserThread::PostTask( | 
| 969         BrowserThread::IO, FROM_HERE, | 969         BrowserThread::IO, FROM_HERE, | 
| 970         base::Bind(&ErrorPageNavigationCorrectionsFailTest::RemoveFilters)); | 970         base::Bind(&ErrorPageNavigationCorrectionsFailTest::RemoveFilters)); | 
| 971   } | 971   } | 
| 972 | 972 | 
| 973  private: | 973  private: | 
| 974   // Adds a filter that causes all correction service requests to fail with | 974   // Adds a filter that causes all correction service requests to fail with | 
| 975   // ERR_ADDRESS_UNREACHABLE. | 975   // ERR_ADDRESS_UNREACHABLE. | 
| 976   // | 976   // | 
| 977   // Also adds the net::URLRequestFailedJob filter. | 977   // Also adds the net::URLRequestFailedJob filter. | 
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1051 } | 1051 } | 
| 1052 | 1052 | 
| 1053 // A test fixture that simulates failing requests for an IDN domain name. | 1053 // A test fixture that simulates failing requests for an IDN domain name. | 
| 1054 class ErrorPageForIDNTest : public InProcessBrowserTest { | 1054 class ErrorPageForIDNTest : public InProcessBrowserTest { | 
| 1055  public: | 1055  public: | 
| 1056   // Target hostname in different forms. | 1056   // Target hostname in different forms. | 
| 1057   static const char kHostname[]; | 1057   static const char kHostname[]; | 
| 1058   static const char kHostnameJSUnicode[]; | 1058   static const char kHostnameJSUnicode[]; | 
| 1059 | 1059 | 
| 1060   // InProcessBrowserTest: | 1060   // InProcessBrowserTest: | 
| 1061   virtual void SetUpOnMainThread() override { | 1061   void SetUpOnMainThread() override { | 
| 1062     // Clear AcceptLanguages to force punycode decoding. | 1062     // Clear AcceptLanguages to force punycode decoding. | 
| 1063     browser()->profile()->GetPrefs()->SetString(prefs::kAcceptLanguages, | 1063     browser()->profile()->GetPrefs()->SetString(prefs::kAcceptLanguages, | 
| 1064                                                 std::string()); | 1064                                                 std::string()); | 
| 1065     BrowserThread::PostTask( | 1065     BrowserThread::PostTask( | 
| 1066         BrowserThread::IO, FROM_HERE, | 1066         BrowserThread::IO, FROM_HERE, | 
| 1067         base::Bind(&ErrorPageForIDNTest::AddFilters)); | 1067         base::Bind(&ErrorPageForIDNTest::AddFilters)); | 
| 1068   } | 1068   } | 
| 1069 | 1069 | 
| 1070   virtual void TearDownOnMainThread() override { | 1070   void TearDownOnMainThread() override { | 
| 1071     BrowserThread::PostTask( | 1071     BrowserThread::PostTask( | 
| 1072         BrowserThread::IO, FROM_HERE, | 1072         BrowserThread::IO, FROM_HERE, | 
| 1073         base::Bind(&ErrorPageForIDNTest::RemoveFilters)); | 1073         base::Bind(&ErrorPageForIDNTest::RemoveFilters)); | 
| 1074   } | 1074   } | 
| 1075 | 1075 | 
| 1076  private: | 1076  private: | 
| 1077   static void AddFilters() { | 1077   static void AddFilters() { | 
| 1078     DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 1078     DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 
| 1079     URLRequestFailedJob::AddUrlHandlerForHostname(kHostname); | 1079     URLRequestFailedJob::AddUrlHandlerForHostname(kHostname); | 
| 1080   } | 1080   } | 
| (...skipping 17 matching lines...) Expand all  Loading... | 
| 1098       browser(), | 1098       browser(), | 
| 1099       URLRequestFailedJob::GetMockHttpUrlForHostname(net::ERR_UNSAFE_PORT, | 1099       URLRequestFailedJob::GetMockHttpUrlForHostname(net::ERR_UNSAFE_PORT, | 
| 1100                                                      kHostname), | 1100                                                      kHostname), | 
| 1101       1); | 1101       1); | 
| 1102 | 1102 | 
| 1103   ToggleHelpBox(browser()); | 1103   ToggleHelpBox(browser()); | 
| 1104   EXPECT_TRUE(IsDisplayingText(browser(), kHostnameJSUnicode)); | 1104   EXPECT_TRUE(IsDisplayingText(browser(), kHostnameJSUnicode)); | 
| 1105 } | 1105 } | 
| 1106 | 1106 | 
| 1107 }  // namespace | 1107 }  // namespace | 
| OLD | NEW | 
|---|