| 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) {
|
| + 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
|
|
|