Chromium Code Reviews| Index: components/security_interstitials/core/safe_browsing_error_ui.cc |
| diff --git a/components/security_interstitials/core/safe_browsing_error_ui.cc b/components/security_interstitials/core/safe_browsing_error_ui.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..a6a5bb6b16d649a4a8b599aff4d50f08ca4c2bd4 |
| --- /dev/null |
| +++ b/components/security_interstitials/core/safe_browsing_error_ui.cc |
| @@ -0,0 +1,315 @@ |
| +// Copyright 2016 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#include "components/security_interstitials/core/safe_browsing_error_ui.h" |
| + |
| +#include "base/i18n/time_formatting.h" |
| +#include "base/metrics/histogram_macros.h" |
| +#include "base/strings/stringprintf.h" |
| +#include "base/strings/utf_string_conversions.h" |
| +#include "components/google/core/browser/google_util.h" |
| +#include "components/security_interstitials/core/common_string_util.h" |
| +#include "components/security_interstitials/core/metrics_helper.h" |
| +#include "grit/components_strings.h" |
| +#include "net/base/escape.h" |
| +#include "ui/base/l10n/l10n_util.h" |
| + |
| +namespace security_interstitials { |
| +namespace { |
| + |
| +// URL for the Help Center article on Safe Browsing warnings. |
| +const char kLearnMore[] = "https://support.google.com/chrome/answer/99020"; |
| + |
| +// For malware interstitial pages, we link the problematic URL to Google's |
| +// diagnostic page. |
| +#if defined(GOOGLE_CHROME_BUILD) |
| +const char kSbDiagnosticUrl[] = |
| + "https://www.google.com/safebrowsing/" |
| + "diagnostic?site=%s&client=googlechrome"; |
| +#else |
| +const char kSbDiagnosticUrl[] = |
| + "https://www.google.com/safebrowsing/diagnostic?site=%s&client=chromium"; |
| +#endif |
| + |
| +// Constants for the V4 phishing string upgrades. |
| +const char kReportPhishingErrorUrl[] = |
| + "https://www.google.com/safebrowsing/report_error/"; |
| + |
| +void RecordExtendedReportingPrefChanged(bool report, bool is_scout) { |
| + if (is_scout) { |
| + UMA_HISTOGRAM_BOOLEAN( |
| + "SafeBrowsing.Pref.Scout.SetPref.SBER2Pref.SecurityInterstitial", |
| + report); |
| + } else { |
| + UMA_HISTOGRAM_BOOLEAN( |
| + "SafeBrowsing.Pref.Scout.SetPref.SBER1Pref.SecurityInterstitial", |
| + report); |
| + } |
| +} |
| + |
| +} // namespace |
| + |
| +SafeBrowsingErrorUI::SafeBrowsingErrorUI( |
| + const GURL& request_url, |
| + const GURL& main_frame_url, |
| + SBInterstitialReason reason, |
| + const SBErrorDisplayOptions& display_options, |
| + const std::string& app_locale, |
| + const base::Time& time_triggered, |
| + ControllerClient* controller) |
| + : request_url_(request_url), |
| + main_frame_url_(main_frame_url), |
| + interstitial_reason_(reason), |
| + display_options_(display_options), |
| + app_locale_(app_locale), |
| + time_triggered_(time_triggered), |
| + controller_(controller), |
| + user_made_decision_(false) { |
| + controller_->metrics_helper()->RecordUserDecision(MetricsHelper::SHOW); |
| + controller_->metrics_helper()->RecordUserInteraction( |
| + MetricsHelper::TOTAL_VISITS); |
| + if (display_options_.is_proceed_anyway_disabled) |
| + controller_->metrics_helper()->RecordUserDecision( |
| + security_interstitials::MetricsHelper::PROCEEDING_DISABLED); |
| +} |
| + |
| +SafeBrowsingErrorUI::~SafeBrowsingErrorUI() { |
| + // If the page is closing without an explicit decision, record it as not |
| + // proceeding. |
| + if (!user_made_decision_) { |
| + controller_->metrics_helper()->RecordUserDecision( |
| + MetricsHelper::DONT_PROCEED); |
| + } |
| + controller_->metrics_helper()->RecordShutdownMetrics(); |
| +} |
| + |
| +void SafeBrowsingErrorUI::PopulateStringsForHTML( |
| + base::DictionaryValue* load_time_data) { |
| + DCHECK(load_time_data); |
| + |
| + load_time_data->SetString("type", "SAFEBROWSING"); |
| + load_time_data->SetString( |
| + "tabTitle", l10n_util::GetStringUTF16(IDS_SAFEBROWSING_V3_TITLE)); |
| + load_time_data->SetString( |
| + "openDetails", |
| + l10n_util::GetStringUTF16(IDS_SAFEBROWSING_V3_OPEN_DETAILS_BUTTON)); |
| + load_time_data->SetString( |
| + "closeDetails", |
| + l10n_util::GetStringUTF16(IDS_SAFEBROWSING_V3_CLOSE_DETAILS_BUTTON)); |
| + load_time_data->SetString( |
| + "primaryButtonText", |
| + l10n_util::GetStringUTF16(IDS_SAFEBROWSING_OVERRIDABLE_SAFETY_BUTTON)); |
| + load_time_data->SetBoolean("overridable", |
| + !display_options_.is_proceed_anyway_disabled); |
| + security_interstitials::common_string_util::PopulateNewIconStrings( |
| + load_time_data); |
| + |
| + switch (interstitial_reason_) { |
| + case SB_REASON_MALWARE: |
| + PopulateMalwareLoadTimeData(load_time_data); |
| + break; |
| + case SB_REASON_HARMFUL: |
| + PopulateHarmfulLoadTimeData(load_time_data); |
| + break; |
| + case SB_REASON_PHISHING: |
| + PopulatePhishingLoadTimeData(load_time_data); |
| + break; |
| + } |
| + |
| + PopulateExtendedReportingOption(load_time_data); |
| +} |
| + |
| +void SafeBrowsingErrorUI::HandleCommand(SecurityInterstitialCommands command) { |
| + switch (command) { |
|
Nathan Parker
2016/12/15 23:30:42
I'll assume this is all copy/paste from orig file,
Jialiu Lin
2016/12/16 00:51:43
Mostly copy/paste, except for CMD_DO_REPORT, CMD_D
|
| + case CMD_PROCEED: { |
| + // User pressed on the button to proceed. |
| + if (!display_options_.is_proceed_anyway_disabled) { |
| + controller_->metrics_helper()->RecordUserDecision( |
| + MetricsHelper::PROCEED); |
| + controller_->Proceed(); |
| + user_made_decision_ = true; |
| + break; |
| + } |
| + } |
| + // If the user can't proceed, fall through to CMD_DONT_PROCEED. |
| + case CMD_DONT_PROCEED: { |
| + // User pressed on the button to return to safety. |
| + // Don't record the user action here because there are other ways of |
| + // triggering DontProceed, like clicking the back button. |
| + if (display_options_.is_main_frame_load_blocked) { |
| + // If the load is blocked, we want to close the interstitial and discard |
| + // the pending entry. |
| + controller_->GoBack(); |
| + } else { |
| + // Otherwise the offending entry has committed, and we need to go back |
| + // or to a safe page. We will close the interstitial when that page |
| + // commits. |
| + controller_->GoBackAfterNavigationCommitted(); |
| + } |
| + user_made_decision_ = true; |
| + break; |
| + } |
| + case CMD_DO_REPORT: { |
| + // User enabled SB Extended Reporting via the checkbox. |
| + display_options_.is_extended_reporting_enabled = true; |
| + controller_->SetReportingPreference(true); |
| + RecordExtendedReportingPrefChanged( |
| + true, display_options_.is_scout_reporting_enabled); |
| + break; |
| + } |
| + case CMD_DONT_REPORT: { |
| + // User disabled SB Extended Reporting via the checkbox. |
| + display_options_.is_extended_reporting_enabled = false; |
| + controller_->SetReportingPreference(false); |
| + RecordExtendedReportingPrefChanged( |
| + false, display_options_.is_scout_reporting_enabled); |
| + break; |
| + } |
| + case CMD_SHOW_MORE_SECTION: { |
| + controller_->metrics_helper()->RecordUserInteraction( |
| + security_interstitials::MetricsHelper::SHOW_ADVANCED); |
| + break; |
| + } |
| + case CMD_OPEN_HELP_CENTER: { |
| + // User pressed "Learn more". |
| + controller_->metrics_helper()->RecordUserInteraction( |
| + security_interstitials::MetricsHelper::SHOW_LEARN_MORE); |
| + GURL learn_more_url(kLearnMore); |
| + learn_more_url = |
| + google_util::AppendGoogleLocaleParam(learn_more_url, app_locale_); |
| + controller_->OpenUrlInCurrentTab(learn_more_url); |
| + break; |
| + } |
| + case CMD_RELOAD: { |
| + controller_->metrics_helper()->RecordUserInteraction( |
| + security_interstitials::MetricsHelper::RELOAD); |
| + controller_->Reload(); |
| + break; |
| + } |
| + case CMD_OPEN_REPORTING_PRIVACY: { |
| + // User pressed on the SB Extended Reporting "privacy policy" link. |
| + controller_->OpenExtendedReportingPrivacyPolicy(); |
| + break; |
| + } |
| + case CMD_OPEN_WHITEPAPER: { |
| + controller_->OpenExtendedReportingWhitepaper(); |
| + break; |
| + } |
| + case CMD_OPEN_DIAGNOSTIC: { |
| + controller_->metrics_helper()->RecordUserInteraction( |
| + security_interstitials::MetricsHelper::SHOW_DIAGNOSTIC); |
| + std::string diagnostic = base::StringPrintf( |
| + kSbDiagnosticUrl, |
| + net::EscapeQueryParamValue(request_url_.spec(), true).c_str()); |
| + GURL diagnostic_url(diagnostic); |
| + diagnostic_url = |
| + google_util::AppendGoogleLocaleParam(diagnostic_url, app_locale_); |
| + controller_->OpenUrlInCurrentTab(diagnostic_url); |
| + break; |
| + } |
| + case CMD_REPORT_PHISHING_ERROR: { |
| + controller_->metrics_helper()->RecordUserInteraction( |
| + security_interstitials::MetricsHelper::REPORT_PHISHING_ERROR); |
| + GURL phishing_error_url(kReportPhishingErrorUrl); |
| + phishing_error_url = |
| + google_util::AppendGoogleLocaleParam(phishing_error_url, app_locale_); |
| + controller_->OpenUrlInCurrentTab(phishing_error_url); |
| + break; |
| + } |
| + case CMD_OPEN_DATE_SETTINGS: |
| + case CMD_OPEN_LOGIN: |
| + case CMD_ERROR: |
| + case CMD_TEXT_FOUND: |
| + case CMD_TEXT_NOT_FOUND: |
| + break; |
| + } |
| +} |
| + |
| +void SafeBrowsingErrorUI::PopulateMalwareLoadTimeData( |
| + base::DictionaryValue* load_time_data) { |
| + load_time_data->SetBoolean("phishing", false); |
| + load_time_data->SetString("heading", |
| + l10n_util::GetStringUTF16(IDS_MALWARE_V3_HEADING)); |
| + load_time_data->SetString( |
| + "primaryParagraph", |
| + l10n_util::GetStringFUTF16( |
| + IDS_MALWARE_V3_PRIMARY_PARAGRAPH, |
| + common_string_util::GetFormattedHostName(request_url_))); |
| + load_time_data->SetString( |
| + "explanationParagraph", |
| + display_options_.is_main_frame_load_blocked |
| + ? l10n_util::GetStringFUTF16( |
| + IDS_MALWARE_V3_EXPLANATION_PARAGRAPH, |
| + common_string_util::GetFormattedHostName(request_url_)) |
| + : l10n_util::GetStringFUTF16( |
| + IDS_MALWARE_V3_EXPLANATION_PARAGRAPH_SUBRESOURCE, |
| + base::UTF8ToUTF16(main_frame_url_.host()), |
| + common_string_util::GetFormattedHostName(request_url_))); |
| + load_time_data->SetString( |
| + "finalParagraph", |
| + l10n_util::GetStringUTF16(IDS_MALWARE_V3_PROCEED_PARAGRAPH)); |
| +} |
| + |
| +void SafeBrowsingErrorUI::PopulateHarmfulLoadTimeData( |
| + base::DictionaryValue* load_time_data) { |
| + load_time_data->SetBoolean("phishing", false); |
| + load_time_data->SetString("heading", |
| + l10n_util::GetStringUTF16(IDS_HARMFUL_V3_HEADING)); |
| + load_time_data->SetString( |
| + "primaryParagraph", |
| + l10n_util::GetStringFUTF16( |
| + IDS_HARMFUL_V3_PRIMARY_PARAGRAPH, |
| + common_string_util::GetFormattedHostName(request_url_))); |
| + load_time_data->SetString( |
| + "explanationParagraph", |
| + l10n_util::GetStringFUTF16( |
| + IDS_HARMFUL_V3_EXPLANATION_PARAGRAPH, |
| + common_string_util::GetFormattedHostName(request_url_))); |
| + load_time_data->SetString( |
| + "finalParagraph", |
| + l10n_util::GetStringUTF16(IDS_HARMFUL_V3_PROCEED_PARAGRAPH)); |
| +} |
| + |
| +void SafeBrowsingErrorUI::PopulatePhishingLoadTimeData( |
| + base::DictionaryValue* load_time_data) { |
| + load_time_data->SetBoolean("phishing", true); |
| + load_time_data->SetString("heading", |
| + l10n_util::GetStringUTF16(IDS_PHISHING_V4_HEADING)); |
| + load_time_data->SetString( |
| + "primaryParagraph", |
| + l10n_util::GetStringFUTF16( |
| + IDS_PHISHING_V4_PRIMARY_PARAGRAPH, |
| + common_string_util::GetFormattedHostName(request_url_))); |
| + load_time_data->SetString( |
| + "explanationParagraph", |
| + l10n_util::GetStringFUTF16( |
| + IDS_PHISHING_V4_EXPLANATION_PARAGRAPH, |
| + common_string_util::GetFormattedHostName(request_url_))); |
| + load_time_data->SetString( |
| + "finalParagraph", |
| + l10n_util::GetStringUTF16(IDS_PHISHING_V4_PROCEED_AND_REPORT_PARAGRAPH)); |
| +} |
| + |
| +void SafeBrowsingErrorUI::PopulateExtendedReportingOption( |
| + base::DictionaryValue* load_time_data) { |
| + load_time_data->SetBoolean(security_interstitials::kDisplayCheckBox, |
| + display_options_.can_show_threat_details_option); |
| + if (!display_options_.can_show_threat_details_option) |
| + return; |
| + |
| + const std::string privacy_link = base::StringPrintf( |
| + security_interstitials::kPrivacyLinkHtml, |
| + security_interstitials::CMD_OPEN_REPORTING_PRIVACY, |
| + l10n_util::GetStringUTF8(IDS_SAFE_BROWSING_PRIVACY_POLICY_PAGE).c_str()); |
| + load_time_data->SetString(security_interstitials::kOptInLink, |
| + l10n_util::GetStringFUTF16( |
| + display_options_.is_scout_reporting_enabled |
| + ? IDS_SAFE_BROWSING_SCOUT_REPORTING_AGREE |
| + : IDS_SAFE_BROWSING_MALWARE_REPORTING_AGREE, |
| + base::UTF8ToUTF16(privacy_link))); |
| + load_time_data->SetBoolean(security_interstitials::kBoxChecked, |
| + display_options_.is_extended_reporting_enabled); |
| +} |
| + |
| +} // security_interstitials |