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

Side by Side Diff: chrome/browser/captive_portal/captive_portal_browsertest.cc

Issue 1223233002: Common Name Mismatch Handler For WWW Subdomain Mismatch case (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Resolving comments Created 5 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | chrome/browser/ssl/common_name_mismatch_handler.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 <map> 5 #include <map>
6 #include <set> 6 #include <set>
7 #include <string> 7 #include <string>
8 #include <vector> 8 #include <vector>
9 9
10 #include "base/basictypes.h" 10 #include "base/basictypes.h"
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
47 #include "content/public/browser/navigation_entry.h" 47 #include "content/public/browser/navigation_entry.h"
48 #include "content/public/browser/notification_observer.h" 48 #include "content/public/browser/notification_observer.h"
49 #include "content/public/browser/notification_registrar.h" 49 #include "content/public/browser/notification_registrar.h"
50 #include "content/public/browser/notification_service.h" 50 #include "content/public/browser/notification_service.h"
51 #include "content/public/browser/notification_types.h" 51 #include "content/public/browser/notification_types.h"
52 #include "content/public/browser/render_frame_host.h" 52 #include "content/public/browser/render_frame_host.h"
53 #include "content/public/browser/web_contents.h" 53 #include "content/public/browser/web_contents.h"
54 #include "content/public/common/url_constants.h" 54 #include "content/public/common/url_constants.h"
55 #include "content/public/test/browser_test_utils.h" 55 #include "content/public/test/browser_test_utils.h"
56 #include "net/base/net_errors.h" 56 #include "net/base/net_errors.h"
57 #include "net/base/test_data_directory.h"
58 #include "net/cert/x509_certificate.h"
57 #include "net/http/transport_security_state.h" 59 #include "net/http/transport_security_state.h"
60 #include "net/test/cert_test_util.h"
58 #include "net/test/url_request/url_request_failed_job.h" 61 #include "net/test/url_request/url_request_failed_job.h"
59 #include "net/test/url_request/url_request_mock_http_job.h" 62 #include "net/test/url_request/url_request_mock_http_job.h"
60 #include "net/url_request/url_request.h" 63 #include "net/url_request/url_request.h"
61 #include "net/url_request/url_request_context.h" 64 #include "net/url_request/url_request_context.h"
62 #include "net/url_request/url_request_context_getter.h" 65 #include "net/url_request/url_request_context_getter.h"
63 #include "net/url_request/url_request_filter.h" 66 #include "net/url_request/url_request_filter.h"
64 #include "net/url_request/url_request_interceptor.h" 67 #include "net/url_request/url_request_interceptor.h"
65 #include "net/url_request/url_request_job.h" 68 #include "net/url_request/url_request_job.h"
66 #include "net/url_request/url_request_status.h" 69 #include "net/url_request/url_request_status.h"
67 #include "testing/gtest/include/gtest/gtest.h" 70 #include "testing/gtest/include/gtest/gtest.h"
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
137 static void WaitForJobs(int num_jobs); 140 static void WaitForJobs(int num_jobs);
138 141
139 // Fails all active URLRequestTimeoutOnDemandJobs with connection timeouts. 142 // Fails all active URLRequestTimeoutOnDemandJobs with connection timeouts.
140 // There are expected to be exactly |expected_num_jobs| waiting for 143 // There are expected to be exactly |expected_num_jobs| waiting for
141 // failure. The only way to guarantee this is with an earlier call to 144 // failure. The only way to guarantee this is with an earlier call to
142 // WaitForJobs, so makes sure there has been a matching WaitForJobs call. 145 // WaitForJobs, so makes sure there has been a matching WaitForJobs call.
143 static void FailJobs(int expected_num_jobs); 146 static void FailJobs(int expected_num_jobs);
144 147
145 // Fails all active URLRequestTimeoutOnDemandJobs with SSL cert errors. 148 // Fails all active URLRequestTimeoutOnDemandJobs with SSL cert errors.
146 // |expected_num_jobs| behaves just as in FailJobs. 149 // |expected_num_jobs| behaves just as in FailJobs.
147 static void FailJobsWithCertError(int expected_num_jobs); 150 static void FailJobsWithCertError(int expected_num_jobs,
151 const net::SSLInfo& ssl_info);
148 152
149 // Abandon all active URLRequestTimeoutOnDemandJobs. |expected_num_jobs| 153 // Abandon all active URLRequestTimeoutOnDemandJobs. |expected_num_jobs|
150 // behaves just as in FailJobs. 154 // behaves just as in FailJobs.
151 static void AbandonJobs(int expected_num_jobs); 155 static void AbandonJobs(int expected_num_jobs);
152 156
153 private: 157 private:
154 friend class URLRequestMockCaptivePortalJobFactory; 158 friend class URLRequestMockCaptivePortalJobFactory;
155 159
156 // Operation to perform on jobs when removing them from |job_list_|. 160 // Operation to perform on jobs when removing them from |job_list_|.
157 enum EndJobOperation { 161 enum EndJobOperation {
158 FAIL_JOBS, 162 FAIL_JOBS,
159 ABANDON_JOBS, 163 ABANDON_JOBS,
160 FAIL_JOBS_WITH_CERT_ERROR 164 FAIL_JOBS_WITH_CERT_ERROR
161 }; 165 };
162 166
163 URLRequestTimeoutOnDemandJob(net::URLRequest* request, 167 URLRequestTimeoutOnDemandJob(net::URLRequest* request,
164 net::NetworkDelegate* network_delegate); 168 net::NetworkDelegate* network_delegate);
165 ~URLRequestTimeoutOnDemandJob() override; 169 ~URLRequestTimeoutOnDemandJob() override;
166 170
167 // Attempts to removes |this| from |jobs_|. Returns true if it was removed 171 // Attempts to removes |this| from |jobs_|. Returns true if it was removed
168 // from the list. 172 // from the list.
169 bool RemoveFromList(); 173 bool RemoveFromList();
170 174
171 static void WaitForJobsOnIOThread(int num_jobs); 175 static void WaitForJobsOnIOThread(int num_jobs);
172 static void FailOrAbandonJobsOnIOThread( 176 static void FailOrAbandonJobsOnIOThread(int expected_num_jobs,
173 int expected_num_jobs, 177 EndJobOperation end_job_operation,
174 EndJobOperation end_job_operation); 178 const net::SSLInfo& ssl_info);
175 179
176 // Checks if there are at least |num_jobs_to_wait_for_| jobs in 180 // Checks if there are at least |num_jobs_to_wait_for_| jobs in
177 // |job_list_|. If so, exits the message loop on the UI thread, which 181 // |job_list_|. If so, exits the message loop on the UI thread, which
178 // should be spinning in a call to WaitForJobs. Does nothing when 182 // should be spinning in a call to WaitForJobs. Does nothing when
179 // |num_jobs_to_wait_for_| is 0. 183 // |num_jobs_to_wait_for_| is 0.
180 static void MaybeStopWaitingForJobsOnIOThread(); 184 static void MaybeStopWaitingForJobsOnIOThread();
181 185
182 // All class variables are only accessed on the IO thread. 186 // All class variables are only accessed on the IO thread.
183 187
184 // Number of jobs currently being waited for, or 0 if not currently 188 // Number of jobs currently being waited for, or 0 if not currently
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
232 base::Bind(&URLRequestTimeoutOnDemandJob::WaitForJobsOnIOThread, 236 base::Bind(&URLRequestTimeoutOnDemandJob::WaitForJobsOnIOThread,
233 num_jobs)); 237 num_jobs));
234 content::RunMessageLoop(); 238 content::RunMessageLoop();
235 } 239 }
236 240
237 // static 241 // static
238 void URLRequestTimeoutOnDemandJob::FailJobs(int expected_num_jobs) { 242 void URLRequestTimeoutOnDemandJob::FailJobs(int expected_num_jobs) {
239 content::BrowserThread::PostTask( 243 content::BrowserThread::PostTask(
240 content::BrowserThread::IO, FROM_HERE, 244 content::BrowserThread::IO, FROM_HERE,
241 base::Bind(&URLRequestTimeoutOnDemandJob::FailOrAbandonJobsOnIOThread, 245 base::Bind(&URLRequestTimeoutOnDemandJob::FailOrAbandonJobsOnIOThread,
242 expected_num_jobs, 246 expected_num_jobs, FAIL_JOBS, net::SSLInfo()));
243 FAIL_JOBS));
244 } 247 }
245 248
246 // static 249 // static
247 void URLRequestTimeoutOnDemandJob::FailJobsWithCertError( 250 void URLRequestTimeoutOnDemandJob::FailJobsWithCertError(
248 int expected_num_jobs) { 251 int expected_num_jobs,
252 const net::SSLInfo& ssl_info) {
249 content::BrowserThread::PostTask( 253 content::BrowserThread::PostTask(
250 content::BrowserThread::IO, FROM_HERE, 254 content::BrowserThread::IO, FROM_HERE,
251 base::Bind(&URLRequestTimeoutOnDemandJob::FailOrAbandonJobsOnIOThread, 255 base::Bind(&URLRequestTimeoutOnDemandJob::FailOrAbandonJobsOnIOThread,
252 expected_num_jobs, 256 expected_num_jobs, FAIL_JOBS_WITH_CERT_ERROR, ssl_info));
253 FAIL_JOBS_WITH_CERT_ERROR));
254 } 257 }
255 258
256 // static 259 // static
257 void URLRequestTimeoutOnDemandJob::AbandonJobs(int expected_num_jobs) { 260 void URLRequestTimeoutOnDemandJob::AbandonJobs(int expected_num_jobs) {
258 content::BrowserThread::PostTask( 261 content::BrowserThread::PostTask(
259 content::BrowserThread::IO, FROM_HERE, 262 content::BrowserThread::IO, FROM_HERE,
260 base::Bind(&URLRequestTimeoutOnDemandJob::FailOrAbandonJobsOnIOThread, 263 base::Bind(&URLRequestTimeoutOnDemandJob::FailOrAbandonJobsOnIOThread,
261 expected_num_jobs, 264 expected_num_jobs, ABANDON_JOBS, net::SSLInfo()));
262 ABANDON_JOBS));
263 } 265 }
264 266
265 URLRequestTimeoutOnDemandJob::URLRequestTimeoutOnDemandJob( 267 URLRequestTimeoutOnDemandJob::URLRequestTimeoutOnDemandJob(
266 net::URLRequest* request, net::NetworkDelegate* network_delegate) 268 net::URLRequest* request, net::NetworkDelegate* network_delegate)
267 : net::URLRequestJob(request, network_delegate), 269 : net::URLRequestJob(request, network_delegate),
268 next_job_(NULL) { 270 next_job_(NULL) {
269 } 271 }
270 272
271 URLRequestTimeoutOnDemandJob::~URLRequestTimeoutOnDemandJob() { 273 URLRequestTimeoutOnDemandJob::~URLRequestTimeoutOnDemandJob() {
272 // All hanging jobs should have failed or been abandoned before being 274 // All hanging jobs should have failed or been abandoned before being
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
317 last_num_jobs_to_wait_for_ = num_jobs_to_wait_for_; 319 last_num_jobs_to_wait_for_ = num_jobs_to_wait_for_;
318 num_jobs_to_wait_for_ = 0; 320 num_jobs_to_wait_for_ = 0;
319 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, 321 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
320 base::MessageLoop::QuitClosure()); 322 base::MessageLoop::QuitClosure());
321 } 323 }
322 } 324 }
323 325
324 // static 326 // static
325 void URLRequestTimeoutOnDemandJob::FailOrAbandonJobsOnIOThread( 327 void URLRequestTimeoutOnDemandJob::FailOrAbandonJobsOnIOThread(
326 int expected_num_jobs, 328 int expected_num_jobs,
327 EndJobOperation end_job_operation) { 329 EndJobOperation end_job_operation,
330 const net::SSLInfo& ssl_info) {
328 ASSERT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::IO)); 331 ASSERT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::IO));
329 ASSERT_LT(0, expected_num_jobs); 332 ASSERT_LT(0, expected_num_jobs);
330 EXPECT_EQ(last_num_jobs_to_wait_for_, expected_num_jobs); 333 EXPECT_EQ(last_num_jobs_to_wait_for_, expected_num_jobs);
331 last_num_jobs_to_wait_for_ = 0; 334 last_num_jobs_to_wait_for_ = 0;
332 335
333 int num_jobs = 0; 336 int num_jobs = 0;
334 while (job_list_) { 337 while (job_list_) {
335 ++num_jobs; 338 ++num_jobs;
336 URLRequestTimeoutOnDemandJob* job = job_list_; 339 URLRequestTimeoutOnDemandJob* job = job_list_;
337 // Since the error notification may result in the job's destruction, remove 340 // Since the error notification may result in the job's destruction, remove
338 // it from the job list before the error. 341 // it from the job list before the error.
339 EXPECT_TRUE(job->RemoveFromList()); 342 EXPECT_TRUE(job->RemoveFromList());
340 if (end_job_operation == FAIL_JOBS) { 343 if (end_job_operation == FAIL_JOBS) {
341 job->NotifyStartError(net::URLRequestStatus( 344 job->NotifyStartError(net::URLRequestStatus(
342 net::URLRequestStatus::FAILED, 345 net::URLRequestStatus::FAILED,
343 net::ERR_CONNECTION_TIMED_OUT)); 346 net::ERR_CONNECTION_TIMED_OUT));
344 } else if (end_job_operation == FAIL_JOBS_WITH_CERT_ERROR) { 347 } else if (end_job_operation == FAIL_JOBS_WITH_CERT_ERROR) {
345 DCHECK(job->request()->url().SchemeIsCryptographic()); 348 DCHECK(job->request()->url().SchemeIsCryptographic());
346 net::SSLInfo info; 349 job->NotifySSLCertificateError(ssl_info, true);
347 info.cert_status = net::CERT_STATUS_COMMON_NAME_INVALID;
348 info.cert = new net::X509Certificate(
349 "bad.host", "CA", base::Time::Max(), base::Time::Max());
350 job->NotifySSLCertificateError(info, true);
351 } 350 }
352 } 351 }
353 352
354 EXPECT_EQ(expected_num_jobs, num_jobs_started_); 353 EXPECT_EQ(expected_num_jobs, num_jobs_started_);
355 EXPECT_EQ(expected_num_jobs, num_jobs); 354 EXPECT_EQ(expected_num_jobs, num_jobs);
356 355
357 num_jobs_started_ -= expected_num_jobs; 356 num_jobs_started_ -= expected_num_jobs;
358 } 357 }
359 358
360 // URLRequestCaptivePortalJobFactory emulates captive portal behavior. 359 // URLRequestCaptivePortalJobFactory emulates captive portal behavior.
(...skipping 2495 matching lines...) Expand 10 before | Expand all | Expand 10 after
2856 WebContents* broken_tab_contents = tab_strip_model->GetActiveWebContents(); 2855 WebContents* broken_tab_contents = tab_strip_model->GetActiveWebContents();
2857 SlowLoadBehindCaptivePortal(browser(), true, cert_error_url, 1, 1); 2856 SlowLoadBehindCaptivePortal(browser(), true, cert_error_url, 1, 1);
2858 2857
2859 // No longer behind a captive portal. Committing the SSL page should trigger 2858 // No longer behind a captive portal. Committing the SSL page should trigger
2860 // an SSL interstitial which triggers a new captive portal check. Since there 2859 // an SSL interstitial which triggers a new captive portal check. Since there
2861 // is no captive portal anymore, should end up with an SSL interstitial. 2860 // is no captive portal anymore, should end up with an SSL interstitial.
2862 factory_.SetBehindCaptivePortal(false); 2861 factory_.SetBehindCaptivePortal(false);
2863 2862
2864 CaptivePortalObserver portal_observer(browser()->profile()); 2863 CaptivePortalObserver portal_observer(browser()->profile());
2865 MultiNavigationObserver navigation_observer; 2864 MultiNavigationObserver navigation_observer;
2866 URLRequestTimeoutOnDemandJob::FailJobsWithCertError(1); 2865 net::SSLInfo info;
2866 info.cert_status = net::CERT_STATUS_COMMON_NAME_INVALID;
2867 info.cert =
2868 net::ImportCertFromFile(net::GetTestCertsDirectory(), "ok_cert.pem");
2869 URLRequestTimeoutOnDemandJob::FailJobsWithCertError(1, info);
2867 navigation_observer.WaitForNavigations(1); 2870 navigation_observer.WaitForNavigations(1);
2868 2871
2869 EXPECT_EQ(CaptivePortalTabReloader::STATE_NEEDS_RELOAD, 2872 EXPECT_EQ(CaptivePortalTabReloader::STATE_NEEDS_RELOAD,
2870 GetStateOfTabReloaderAt(browser(), broken_tab_index)); 2873 GetStateOfTabReloaderAt(browser(), broken_tab_index));
2871 2874
2872 WaitForInterstitialAttach(broken_tab_contents); 2875 WaitForInterstitialAttach(broken_tab_contents);
2873 portal_observer.WaitForResults(1); 2876 portal_observer.WaitForResults(1);
2874 2877
2875 EXPECT_EQ(SSLBlockingPage::kTypeForTesting, 2878 EXPECT_EQ(SSLBlockingPage::kTypeForTesting,
2876 GetInterstitialType(broken_tab_contents)); 2879 GetInterstitialType(broken_tab_contents));
2877 } 2880 }
OLDNEW
« no previous file with comments | « no previous file | chrome/browser/ssl/common_name_mismatch_handler.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698