Chromium Code Reviews| 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/build_time.h" | 7 #include "base/build_time.h" |
| 8 #include "base/command_line.h" | 8 #include "base/command_line.h" |
| 9 #include "base/i18n/rtl.h" | 9 #include "base/i18n/rtl.h" |
| 10 #include "base/i18n/time_formatting.h" | 10 #include "base/i18n/time_formatting.h" |
| 11 #include "base/metrics/field_trial.h" | 11 #include "base/metrics/field_trial.h" |
| 12 #include "base/metrics/histogram.h" | 12 #include "base/metrics/histogram.h" |
| 13 #include "base/process/launch.h" | 13 #include "base/process/launch.h" |
| 14 #include "base/strings/string_number_conversions.h" | 14 #include "base/strings/string_number_conversions.h" |
| 15 #include "base/strings/string_piece.h" | 15 #include "base/strings/string_piece.h" |
| 16 #include "base/strings/stringprintf.h" | 16 #include "base/strings/stringprintf.h" |
| 17 #include "base/strings/utf_string_conversions.h" | 17 #include "base/strings/utf_string_conversions.h" |
| 18 #include "base/time/time.h" | 18 #include "base/time/time.h" |
| 19 #include "base/values.h" | 19 #include "base/values.h" |
| 20 #include "chrome/browser/chrome_notification_types.h" | 20 #include "chrome/browser/chrome_notification_types.h" |
| 21 #include "chrome/browser/extensions/api/experience_sampling_private/experience_s ampling.h" | |
| 21 #include "chrome/browser/history/history_service_factory.h" | 22 #include "chrome/browser/history/history_service_factory.h" |
| 22 #include "chrome/browser/profiles/profile.h" | 23 #include "chrome/browser/profiles/profile.h" |
| 23 #include "chrome/browser/renderer_preferences_util.h" | 24 #include "chrome/browser/renderer_preferences_util.h" |
| 24 #include "chrome/browser/ssl/ssl_error_classification.h" | 25 #include "chrome/browser/ssl/ssl_error_classification.h" |
| 25 #include "chrome/browser/ssl/ssl_error_info.h" | 26 #include "chrome/browser/ssl/ssl_error_info.h" |
| 26 #include "chrome/common/chrome_switches.h" | 27 #include "chrome/common/chrome_switches.h" |
| 27 #include "content/public/browser/cert_store.h" | 28 #include "content/public/browser/cert_store.h" |
| 28 #include "content/public/browser/interstitial_page.h" | 29 #include "content/public/browser/interstitial_page.h" |
| 29 #include "content/public/browser/navigation_controller.h" | 30 #include "content/public/browser/navigation_controller.h" |
| 30 #include "content/public/browser/navigation_entry.h" | 31 #include "content/public/browser/navigation_entry.h" |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 62 #include "chrome/browser/profiles/profile_manager.h" | 63 #include "chrome/browser/profiles/profile_manager.h" |
| 63 #include "chrome/browser/ui/chrome_pages.h" | 64 #include "chrome/browser/ui/chrome_pages.h" |
| 64 #include "chrome/common/url_constants.h" | 65 #include "chrome/common/url_constants.h" |
| 65 #endif | 66 #endif |
| 66 | 67 |
| 67 using base::ASCIIToUTF16; | 68 using base::ASCIIToUTF16; |
| 68 using base::TimeTicks; | 69 using base::TimeTicks; |
| 69 using content::InterstitialPage; | 70 using content::InterstitialPage; |
| 70 using content::NavigationController; | 71 using content::NavigationController; |
| 71 using content::NavigationEntry; | 72 using content::NavigationEntry; |
| 73 using extensions::SamplingEvent; | |
| 72 | 74 |
| 73 namespace { | 75 namespace { |
| 74 | 76 |
| 75 // Constants for the M37 Finch trial. | 77 // Constants for the M37 Finch trial. |
| 76 const char kInterstitialTrialName[] = "SSLInterstitialVersion"; | 78 const char kInterstitialTrialName[] = "SSLInterstitialVersion"; |
| 77 const char kCondV1[] = "V1"; | 79 const char kCondV1[] = "V1"; |
| 78 const char kCondV1LayoutV2Text[] = "V1LayoutV2Text"; | 80 const char kCondV1LayoutV2Text[] = "V1LayoutV2Text"; |
| 79 const char kCondV2[] = "V2"; // Also the default. | 81 const char kCondV2[] = "V2"; // Also the default. |
| 80 const char kCondV2Guard[] = "V2WithGuard"; | 82 const char kCondV2Guard[] = "V2WithGuard"; |
| 81 const char kCondV2Yellow[] = "V2Yellow"; | 83 const char kCondV2Yellow[] = "V2Yellow"; |
| (...skipping 18 matching lines...) Expand all Loading... | |
| 100 return kCondV2; | 102 return kCondV2; |
| 101 if (name == kCondV1LayoutV2Text) | 103 if (name == kCondV1LayoutV2Text) |
| 102 return kCondV1LayoutV2Text; | 104 return kCondV1LayoutV2Text; |
| 103 if (name == kCondV2Guard) | 105 if (name == kCondV2Guard) |
| 104 return kCondV2Guard; | 106 return kCondV2Guard; |
| 105 if (name == kCondV2Yellow) | 107 if (name == kCondV2Yellow) |
| 106 return kCondV2Yellow; | 108 return kCondV2Yellow; |
| 107 return kCondV2; | 109 return kCondV2; |
| 108 } | 110 } |
| 109 | 111 |
| 112 // Constants for the Experience Sampling instrumentation. | |
| 113 const char kEventNameBase[] = "ssl_interstitial_"; | |
| 114 const char kEventNotOverridable[] = "notoverridable_"; | |
| 115 const char kEventOverridable[] = "overridable_"; | |
| 116 | |
| 110 // Events for UMA. Do not reorder or change! | 117 // Events for UMA. Do not reorder or change! |
| 111 enum SSLBlockingPageEvent { | 118 enum SSLBlockingPageEvent { |
| 112 SHOW_ALL, | 119 SHOW_ALL, |
| 113 SHOW_OVERRIDABLE, | 120 SHOW_OVERRIDABLE, |
| 114 PROCEED_OVERRIDABLE, | 121 PROCEED_OVERRIDABLE, |
| 115 PROCEED_NAME, | 122 PROCEED_NAME, |
| 116 PROCEED_DATE, | 123 PROCEED_DATE, |
| 117 PROCEED_AUTHORITY, | 124 PROCEED_AUTHORITY, |
| 118 DONT_PROCEED_OVERRIDABLE, | 125 DONT_PROCEED_OVERRIDABLE, |
| 119 DONT_PROCEED_NAME, | 126 DONT_PROCEED_NAME, |
| (...skipping 235 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 355 #if defined(ENABLE_CAPTIVE_PORTAL_DETECTION) | 362 #if defined(ENABLE_CAPTIVE_PORTAL_DETECTION) |
| 356 CaptivePortalService* captive_portal_service = | 363 CaptivePortalService* captive_portal_service = |
| 357 CaptivePortalServiceFactory::GetForProfile(profile); | 364 CaptivePortalServiceFactory::GetForProfile(profile); |
| 358 captive_portal_detection_enabled_ = captive_portal_service ->enabled(); | 365 captive_portal_detection_enabled_ = captive_portal_service ->enabled(); |
| 359 captive_portal_service ->DetectCaptivePortal(); | 366 captive_portal_service ->DetectCaptivePortal(); |
| 360 registrar_.Add(this, | 367 registrar_.Add(this, |
| 361 chrome::NOTIFICATION_CAPTIVE_PORTAL_CHECK_RESULT, | 368 chrome::NOTIFICATION_CAPTIVE_PORTAL_CHECK_RESULT, |
| 362 content::Source<Profile>(profile)); | 369 content::Source<Profile>(profile)); |
| 363 #endif | 370 #endif |
| 364 | 371 |
| 372 // ExperienceSampling: Set up new sampling event for this interstitial. | |
| 373 std::string event_name(kEventNameBase); | |
| 374 if (overridable_ && !strict_enforcement_) | |
| 375 event_name.append(kEventOverridable); | |
| 376 else | |
| 377 event_name.append(kEventNotOverridable); | |
| 378 event_name.append(net::ErrorToString(cert_error_)); | |
| 379 sampling_event_.reset(new SamplingEvent( | |
| 380 event_name, | |
| 381 request_url_, | |
| 382 web_contents_->GetLastCommittedURL(), | |
| 383 web_contents_->GetBrowserContext())); | |
| 384 | |
| 365 interstitial_page_ = InterstitialPage::Create( | 385 interstitial_page_ = InterstitialPage::Create( |
| 366 web_contents_, true, request_url, this); | 386 web_contents_, true, request_url, this); |
| 367 interstitial_page_->Show(); | 387 interstitial_page_->Show(); |
| 368 } | 388 } |
| 369 | 389 |
| 370 SSLBlockingPage::~SSLBlockingPage() { | 390 SSLBlockingPage::~SSLBlockingPage() { |
| 371 if (!callback_.is_null()) { | 391 if (!callback_.is_null()) { |
| 372 RecordSSLBlockingPageDetailedStats(false, | 392 RecordSSLBlockingPageDetailedStats(false, |
| 373 cert_error_, | 393 cert_error_, |
| 374 overridable_ && !strict_enforcement_, | 394 overridable_ && !strict_enforcement_, |
| (...skipping 299 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 674 case CMD_DONT_PROCEED: { | 694 case CMD_DONT_PROCEED: { |
| 675 interstitial_page_->DontProceed(); | 695 interstitial_page_->DontProceed(); |
| 676 break; | 696 break; |
| 677 } | 697 } |
| 678 case CMD_PROCEED: { | 698 case CMD_PROCEED: { |
| 679 interstitial_page_->Proceed(); | 699 interstitial_page_->Proceed(); |
| 680 break; | 700 break; |
| 681 } | 701 } |
| 682 case CMD_MORE: { | 702 case CMD_MORE: { |
| 683 RecordSSLBlockingPageEventStats(MORE); | 703 RecordSSLBlockingPageEventStats(MORE); |
| 704 sampling_event_->has_viewed_details = true; | |
| 684 break; | 705 break; |
| 685 } | 706 } |
| 686 case CMD_RELOAD: { | 707 case CMD_RELOAD: { |
| 687 // The interstitial can't refresh itself. | 708 // The interstitial can't refresh itself. |
| 688 web_contents_->GetController().Reload(true); | 709 web_contents_->GetController().Reload(true); |
| 689 break; | 710 break; |
| 690 } | 711 } |
| 691 case CMD_HELP: { | 712 case CMD_HELP: { |
| 692 content::NavigationController::LoadURLParams help_page_params(GURL( | 713 content::NavigationController::LoadURLParams help_page_params(GURL( |
| 693 "https://support.google.com/chrome/answer/4454607")); | 714 "https://support.google.com/chrome/answer/4454607")); |
| 715 sampling_event_->has_viewed_learn_more = true; | |
| 694 web_contents_->GetController().LoadURLWithParams(help_page_params); | 716 web_contents_->GetController().LoadURLWithParams(help_page_params); |
| 695 break; | 717 break; |
| 696 } | 718 } |
| 697 case CMD_CLOCK: { | 719 case CMD_CLOCK: { |
| 698 LaunchDateAndTimeSettings(); | 720 LaunchDateAndTimeSettings(); |
| 699 break; | 721 break; |
| 700 } | 722 } |
| 701 default: { | 723 default: { |
| 702 NOTREACHED(); | 724 NOTREACHED(); |
| 703 } | 725 } |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 714 void SSLBlockingPage::OnProceed() { | 736 void SSLBlockingPage::OnProceed() { |
| 715 RecordSSLBlockingPageDetailedStats(true, | 737 RecordSSLBlockingPageDetailedStats(true, |
| 716 cert_error_, | 738 cert_error_, |
| 717 overridable_ && !strict_enforcement_, | 739 overridable_ && !strict_enforcement_, |
| 718 internal_, | 740 internal_, |
| 719 num_visits_, | 741 num_visits_, |
| 720 captive_portal_detection_enabled_, | 742 captive_portal_detection_enabled_, |
| 721 captive_portal_probe_completed_, | 743 captive_portal_probe_completed_, |
| 722 captive_portal_no_response_, | 744 captive_portal_no_response_, |
| 723 captive_portal_detected_); | 745 captive_portal_detected_); |
| 746 // ExperienceSampling: Notify that user decided to proceed. | |
| 747 sampling_event_->CreateUserDecisionEvent(SamplingEvent::kProceed); | |
| 724 // Accepting the certificate resumes the loading of the page. | 748 // Accepting the certificate resumes the loading of the page. |
| 725 NotifyAllowCertificate(); | 749 NotifyAllowCertificate(); |
| 726 } | 750 } |
| 727 | 751 |
| 728 void SSLBlockingPage::OnDontProceed() { | 752 void SSLBlockingPage::OnDontProceed() { |
| 729 RecordSSLBlockingPageDetailedStats(false, | 753 RecordSSLBlockingPageDetailedStats(false, |
| 730 cert_error_, | 754 cert_error_, |
| 731 overridable_ && !strict_enforcement_, | 755 overridable_ && !strict_enforcement_, |
| 732 internal_, | 756 internal_, |
| 733 num_visits_, | 757 num_visits_, |
| 734 captive_portal_detection_enabled_, | 758 captive_portal_detection_enabled_, |
| 735 captive_portal_probe_completed_, | 759 captive_portal_probe_completed_, |
| 736 captive_portal_no_response_, | 760 captive_portal_no_response_, |
| 737 captive_portal_detected_); | 761 captive_portal_detected_); |
| 762 // ExperienceSampling: Notify that user decided to not proceed. | |
| 763 // This also occurs if the user navigates away or closes the tab. | |
| 764 sampling_event_->CreateUserDecisionEvent(SamplingEvent::kDeny); | |
| 765 | |
|
felt
2014/07/25 01:05:51
nit: don't need this empty line
Chris Thompson
2014/07/25 01:21:59
Done.
| |
| 738 NotifyDenyCertificate(); | 766 NotifyDenyCertificate(); |
| 739 } | 767 } |
| 740 | 768 |
| 741 void SSLBlockingPage::NotifyDenyCertificate() { | 769 void SSLBlockingPage::NotifyDenyCertificate() { |
| 742 // It's possible that callback_ may not exist if the user clicks "Proceed" | 770 // It's possible that callback_ may not exist if the user clicks "Proceed" |
| 743 // followed by pressing the back button before the interstitial is hidden. | 771 // followed by pressing the back button before the interstitial is hidden. |
| 744 // In that case the certificate will still be treated as allowed. | 772 // In that case the certificate will still be treated as allowed. |
| 745 if (callback_.is_null()) | 773 if (callback_.is_null()) |
| 746 return; | 774 return; |
| 747 | 775 |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 803 // sure we don't clear the captive portal flag, since the interstitial was | 831 // sure we don't clear the captive portal flag, since the interstitial was |
| 804 // potentially caused by the captive portal. | 832 // potentially caused by the captive portal. |
| 805 captive_portal_detected_ = captive_portal_detected_ || | 833 captive_portal_detected_ = captive_portal_detected_ || |
| 806 (results->result == captive_portal::RESULT_BEHIND_CAPTIVE_PORTAL); | 834 (results->result == captive_portal::RESULT_BEHIND_CAPTIVE_PORTAL); |
| 807 // Also keep track of non-HTTP portals and error cases. | 835 // Also keep track of non-HTTP portals and error cases. |
| 808 captive_portal_no_response_ = captive_portal_no_response_ || | 836 captive_portal_no_response_ = captive_portal_no_response_ || |
| 809 (results->result == captive_portal::RESULT_NO_RESPONSE); | 837 (results->result == captive_portal::RESULT_NO_RESPONSE); |
| 810 } | 838 } |
| 811 #endif | 839 #endif |
| 812 } | 840 } |
| OLD | NEW |