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 "chrome/browser/ssl/ssl_blocking_page.h" | 5 #include "chrome/browser/ssl/ssl_blocking_page.h" |
6 | 6 |
7 #include "base/command_line.h" | 7 #include "base/command_line.h" |
8 #include "base/i18n/rtl.h" | 8 #include "base/i18n/rtl.h" |
9 #include "base/metrics/field_trial.h" | 9 #include "base/metrics/field_trial.h" |
10 #include "base/metrics/histogram.h" | 10 #include "base/metrics/histogram.h" |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
50 #endif | 50 #endif |
51 | 51 |
52 using base::ASCIIToUTF16; | 52 using base::ASCIIToUTF16; |
53 using base::TimeTicks; | 53 using base::TimeTicks; |
54 using content::InterstitialPage; | 54 using content::InterstitialPage; |
55 using content::NavigationController; | 55 using content::NavigationController; |
56 using content::NavigationEntry; | 56 using content::NavigationEntry; |
57 | 57 |
58 namespace { | 58 namespace { |
59 | 59 |
60 // Constants for the M37 Finch trial. | |
61 const char kInterstitialTrialName[] = "SSLInterstitialVersion"; | |
62 const char kCondV1[] = "V1"; | |
63 const char kCondV1LayoutV2Text[] = "V1LayoutV2Text"; | |
64 const char kCondV2[] = "V2"; // Also the default. | |
65 const char kCondV2Guard[] = "V2WithGuard"; | |
66 const char kCondV2Yellow[] = "V2Yellow"; | |
67 | |
68 const char* GetTrialCondition() { | |
69 CommandLine* cli = CommandLine::ForCurrentProcess(); | |
70 std::string name(base::FieldTrialList::FindFullName(kInterstitialTrialName)); | |
Dan Beam
2014/06/21 00:42:52
nit: declare |name| right before it's needed
felt
2014/06/21 00:56:32
Done.
| |
71 if (cli->HasSwitch(switches::kSSLInterstitialV1)) | |
72 return kCondV1; | |
73 if (cli->HasSwitch(switches::kSSLInterstitialV2)) | |
74 return kCondV2; | |
75 if (cli->HasSwitch(switches::kSSLInterstitialV1WithV2Text)) | |
76 return kCondV1LayoutV2Text; | |
77 if (cli->HasSwitch(switches::kSSLInterstitialV2Guard)) | |
78 return kCondV2Guard; | |
79 if (cli->HasSwitch(switches::kSSLInterstitialV2Yellow)) | |
80 return kCondV2Yellow; | |
81 | |
82 if (name == kCondV1) | |
83 return kCondV1; | |
84 if (name == kCondV2) | |
85 return kCondV2; | |
86 if (name == kCondV1LayoutV2Text) | |
87 return kCondV1LayoutV2Text; | |
88 if (name == kCondV2Guard) | |
89 return kCondV2Guard; | |
90 if (name == kCondV2Yellow) | |
91 return kCondV2Yellow; | |
92 return kCondV2; | |
93 } | |
94 | |
60 // Events for UMA. Do not reorder or change! | 95 // Events for UMA. Do not reorder or change! |
61 enum SSLBlockingPageEvent { | 96 enum SSLBlockingPageEvent { |
62 SHOW_ALL, | 97 SHOW_ALL, |
63 SHOW_OVERRIDABLE, | 98 SHOW_OVERRIDABLE, |
64 PROCEED_OVERRIDABLE, | 99 PROCEED_OVERRIDABLE, |
65 PROCEED_NAME, | 100 PROCEED_NAME, |
66 PROCEED_DATE, | 101 PROCEED_DATE, |
67 PROCEED_AUTHORITY, | 102 PROCEED_AUTHORITY, |
68 DONT_PROCEED_OVERRIDABLE, | 103 DONT_PROCEED_OVERRIDABLE, |
69 DONT_PROCEED_NAME, | 104 DONT_PROCEED_NAME, |
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
193 cert_error_(cert_error), | 228 cert_error_(cert_error), |
194 ssl_info_(ssl_info), | 229 ssl_info_(ssl_info), |
195 request_url_(request_url), | 230 request_url_(request_url), |
196 overridable_(overridable), | 231 overridable_(overridable), |
197 strict_enforcement_(strict_enforcement), | 232 strict_enforcement_(strict_enforcement), |
198 internal_(false), | 233 internal_(false), |
199 num_visits_(-1), | 234 num_visits_(-1), |
200 captive_portal_detection_enabled_(false), | 235 captive_portal_detection_enabled_(false), |
201 captive_portal_probe_completed_(false), | 236 captive_portal_probe_completed_(false), |
202 captive_portal_no_response_(false), | 237 captive_portal_no_response_(false), |
203 captive_portal_detected_(false) { | 238 captive_portal_detected_(false), |
239 trial_condition_(GetTrialCondition()) { | |
204 Profile* profile = Profile::FromBrowserContext( | 240 Profile* profile = Profile::FromBrowserContext( |
205 web_contents->GetBrowserContext()); | 241 web_contents->GetBrowserContext()); |
206 // For UMA stats. | 242 // For UMA stats. |
207 if (net::IsHostnameNonUnique(request_url_.HostNoBrackets())) | 243 if (net::IsHostnameNonUnique(request_url_.HostNoBrackets())) |
208 internal_ = true; | 244 internal_ = true; |
209 RecordSSLBlockingPageEventStats(SHOW_ALL); | 245 RecordSSLBlockingPageEventStats(SHOW_ALL); |
210 if (overridable_ && !strict_enforcement_) { | 246 if (overridable_ && !strict_enforcement_) { |
211 RecordSSLBlockingPageEventStats(SHOW_OVERRIDABLE); | 247 RecordSSLBlockingPageEventStats(SHOW_OVERRIDABLE); |
212 if (internal_) | 248 if (internal_) |
213 RecordSSLBlockingPageEventStats(SHOW_INTERNAL_HOSTNAME); | 249 RecordSSLBlockingPageEventStats(SHOW_INTERNAL_HOSTNAME); |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
248 captive_portal_probe_completed_, | 284 captive_portal_probe_completed_, |
249 captive_portal_no_response_, | 285 captive_portal_no_response_, |
250 captive_portal_detected_); | 286 captive_portal_detected_); |
251 // The page is closed without the user having chosen what to do, default to | 287 // The page is closed without the user having chosen what to do, default to |
252 // deny. | 288 // deny. |
253 NotifyDenyCertificate(); | 289 NotifyDenyCertificate(); |
254 } | 290 } |
255 } | 291 } |
256 | 292 |
257 std::string SSLBlockingPage::GetHTMLContents() { | 293 std::string SSLBlockingPage::GetHTMLContents() { |
258 if (CommandLine::ForCurrentProcess()->HasSwitch( | 294 if (trial_condition_ == kCondV1 || trial_condition_ == kCondV1LayoutV2Text) |
259 switches::kSSLInterstitialVersionV1) || | |
260 base::FieldTrialList::FindFullName("SSLInterstitialVersion") == "V1") { | |
261 return GetHTMLContentsV1(); | 295 return GetHTMLContentsV1(); |
262 } | |
263 return GetHTMLContentsV2(); | 296 return GetHTMLContentsV2(); |
264 } | 297 } |
265 | 298 |
266 std::string SSLBlockingPage::GetHTMLContentsV1() { | 299 std::string SSLBlockingPage::GetHTMLContentsV1() { |
267 base::DictionaryValue strings; | 300 base::DictionaryValue strings; |
268 int resource_id; | 301 int resource_id; |
269 if (overridable_ && !strict_enforcement_) { | 302 if (overridable_ && !strict_enforcement_) { |
270 // Let's build the overridable error page. | 303 // Let's build the overridable error page. |
271 SSLErrorInfo error_info = | 304 SSLErrorInfo error_info = |
272 SSLErrorInfo::CreateError( | 305 SSLErrorInfo::CreateError( |
273 SSLErrorInfo::NetErrorToErrorType(cert_error_), | 306 SSLErrorInfo::NetErrorToErrorType(cert_error_), |
274 ssl_info_.cert.get(), | 307 ssl_info_.cert.get(), |
275 request_url_); | 308 request_url_); |
309 resource_id = IDR_SSL_ROAD_BLOCK_HTML; | |
310 strings.SetString("textdirection", base::i18n::IsRTL() ? "rtl" : "ltr"); | |
311 strings.SetString("errorType", "overridable"); | |
312 if (trial_condition_ == kCondV1LayoutV2Text) { | |
313 base::string16 url(ASCIIToUTF16(request_url_.host())); | |
314 strings.SetString( | |
315 "headLine", l10n_util::GetStringUTF16(IDS_SSL_V2_HEADING)); | |
316 strings.SetString( | |
317 "description", | |
318 l10n_util::GetStringFUTF16(IDS_SSL_V2_PRIMARY_PARAGRAPH, url)); | |
319 strings.SetString( | |
320 "moreInfoTitle", | |
321 l10n_util::GetStringUTF16(IDS_SSL_V2_OPEN_DETAILS_BUTTON)); | |
322 strings.SetString("moreInfo1", error_info.details()); | |
323 strings.SetString("moreInfo2", std::string16()); | |
324 strings.SetString("moreInfo3", std::string16()); | |
325 strings.SetString("moreInfo4", std::string16()); | |
326 strings.SetString("moreInfo5", std::string16()); | |
Dan Beam
2014/06/21 00:42:52
dare you to compile this ;)
felt
2014/06/21 00:56:32
http://goo.gl/xR1Dky
| |
327 strings.SetString( | |
328 "exit", | |
329 l10n_util::GetStringUTF16(IDS_SSL_OVERRIDABLE_SAFETY_BUTTON)); | |
330 strings.SetString( | |
331 "title", l10n_util::GetStringUTF16(IDS_SSL_V2_TITLE)); | |
332 strings.SetString( | |
333 "proceed", | |
334 l10n_util::GetStringUTF16(IDS_SSL_OVERRIDABLE_PROCEED_LINK_TEXT)); | |
335 strings.SetString("reasonForNotProceeding", std::string16()); | |
336 } else { | |
337 strings.SetString("headLine", error_info.title()); | |
338 strings.SetString("description", error_info.details()); | |
339 strings.SetString("moreInfoTitle", | |
340 l10n_util::GetStringUTF16(IDS_CERT_ERROR_EXTRA_INFO_TITLE)); | |
341 SetExtraInfo(&strings, error_info.extra_information()); | |
276 | 342 |
277 resource_id = IDR_SSL_ROAD_BLOCK_HTML; | 343 strings.SetString( |
278 strings.SetString("headLine", error_info.title()); | 344 "exit", l10n_util::GetStringUTF16(IDS_SSL_OVERRIDABLE_PAGE_EXIT)); |
279 strings.SetString("description", error_info.details()); | 345 strings.SetString( |
280 strings.SetString("moreInfoTitle", | 346 "title", l10n_util::GetStringUTF16(IDS_SSL_OVERRIDABLE_PAGE_TITLE)); |
281 l10n_util::GetStringUTF16(IDS_CERT_ERROR_EXTRA_INFO_TITLE)); | 347 strings.SetString( |
282 SetExtraInfo(&strings, error_info.extra_information()); | 348 "proceed", |
283 | 349 l10n_util::GetStringUTF16(IDS_SSL_OVERRIDABLE_PAGE_PROCEED)); |
284 strings.SetString( | 350 strings.SetString("reasonForNotProceeding", |
285 "exit", l10n_util::GetStringUTF16(IDS_SSL_OVERRIDABLE_PAGE_EXIT)); | 351 l10n_util::GetStringUTF16( |
286 strings.SetString( | 352 IDS_SSL_OVERRIDABLE_PAGE_SHOULD_NOT_PROCEED)); |
287 "title", l10n_util::GetStringUTF16(IDS_SSL_OVERRIDABLE_PAGE_TITLE)); | 353 } |
288 strings.SetString( | |
289 "proceed", l10n_util::GetStringUTF16(IDS_SSL_OVERRIDABLE_PAGE_PROCEED)); | |
290 strings.SetString( | |
291 "reasonForNotProceeding", l10n_util::GetStringUTF16( | |
292 IDS_SSL_OVERRIDABLE_PAGE_SHOULD_NOT_PROCEED)); | |
293 strings.SetString("errorType", "overridable"); | |
294 strings.SetString("textdirection", base::i18n::IsRTL() ? "rtl" : "ltr"); | |
295 } else { | 354 } else { |
296 // Let's build the blocking error page. | 355 // Let's build the blocking error page. |
297 resource_id = IDR_SSL_BLOCKING_HTML; | 356 resource_id = IDR_SSL_BLOCKING_HTML; |
298 | 357 |
299 // Strings that are not dependent on the URL. | 358 // Strings that are not dependent on the URL. |
300 strings.SetString( | 359 strings.SetString( |
301 "title", l10n_util::GetStringUTF16(IDS_SSL_BLOCKING_PAGE_TITLE)); | 360 "title", l10n_util::GetStringUTF16(IDS_SSL_BLOCKING_PAGE_TITLE)); |
302 strings.SetString( | 361 strings.SetString( |
303 "reloadMsg", l10n_util::GetStringUTF16(IDS_ERRORPAGES_BUTTON_RELOAD)); | 362 "reloadMsg", l10n_util::GetStringUTF16(IDS_ERRORPAGES_BUTTON_RELOAD)); |
304 strings.SetString( | 363 strings.SetString( |
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
405 resource_id)); | 464 resource_id)); |
406 return webui::GetI18nTemplateHtml(html, &strings); | 465 return webui::GetI18nTemplateHtml(html, &strings); |
407 } | 466 } |
408 | 467 |
409 std::string SSLBlockingPage::GetHTMLContentsV2() { | 468 std::string SSLBlockingPage::GetHTMLContentsV2() { |
410 base::DictionaryValue load_time_data; | 469 base::DictionaryValue load_time_data; |
411 base::string16 url(ASCIIToUTF16(request_url_.host())); | 470 base::string16 url(ASCIIToUTF16(request_url_.host())); |
412 if (base::i18n::IsRTL()) | 471 if (base::i18n::IsRTL()) |
413 base::i18n::WrapStringWithLTRFormatting(&url); | 472 base::i18n::WrapStringWithLTRFormatting(&url); |
414 webui::SetFontAndTextDirection(&load_time_data); | 473 webui::SetFontAndTextDirection(&load_time_data); |
474 load_time_data.SetString("trialCondition", trial_condition_); | |
415 | 475 |
416 // Shared values for both the overridable and non-overridable versions. | 476 // Shared values for both the overridable and non-overridable versions. |
417 load_time_data.SetBoolean("ssl", true); | 477 load_time_data.SetBoolean("ssl", true); |
418 load_time_data.SetBoolean( | 478 load_time_data.SetBoolean( |
419 "overridable", overridable_ && !strict_enforcement_); | 479 "overridable", overridable_ && !strict_enforcement_); |
420 load_time_data.SetString( | 480 load_time_data.SetString( |
421 "tabTitle", l10n_util::GetStringUTF16(IDS_SSL_V2_TITLE)); | 481 "tabTitle", l10n_util::GetStringUTF16(IDS_SSL_V2_TITLE)); |
422 load_time_data.SetString( | 482 load_time_data.SetString( |
423 "heading", l10n_util::GetStringUTF16(IDS_SSL_V2_HEADING)); | 483 "heading", l10n_util::GetStringUTF16(IDS_SSL_V2_HEADING)); |
424 load_time_data.SetString( | 484 load_time_data.SetString( |
(...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
637 // sure we don't clear the captive portal flag, since the interstitial was | 697 // sure we don't clear the captive portal flag, since the interstitial was |
638 // potentially caused by the captive portal. | 698 // potentially caused by the captive portal. |
639 captive_portal_detected_ = captive_portal_detected_ || | 699 captive_portal_detected_ = captive_portal_detected_ || |
640 (results->result == captive_portal::RESULT_BEHIND_CAPTIVE_PORTAL); | 700 (results->result == captive_portal::RESULT_BEHIND_CAPTIVE_PORTAL); |
641 // Also keep track of non-HTTP portals and error cases. | 701 // Also keep track of non-HTTP portals and error cases. |
642 captive_portal_no_response_ = captive_portal_no_response_ || | 702 captive_portal_no_response_ = captive_portal_no_response_ || |
643 (results->result == captive_portal::RESULT_NO_RESPONSE); | 703 (results->result == captive_portal::RESULT_NO_RESPONSE); |
644 } | 704 } |
645 #endif | 705 #endif |
646 } | 706 } |
OLD | NEW |