Index: chrome/browser/safe_browsing/safe_browsing_blocking_page.cc |
diff --git a/chrome/browser/safe_browsing/safe_browsing_blocking_page.cc b/chrome/browser/safe_browsing/safe_browsing_blocking_page.cc |
index 667e09fe0392abec422bba38d0f8d4576add7f75..6657510cc3c9b705eeabb975af90db9f10f8db17 100644 |
--- a/chrome/browser/safe_browsing/safe_browsing_blocking_page.cc |
+++ b/chrome/browser/safe_browsing/safe_browsing_blocking_page.cc |
@@ -22,7 +22,6 @@ |
#include "base/time/time.h" |
#include "base/values.h" |
#include "chrome/browser/browser_process.h" |
-#include "chrome/browser/history/history_service_factory.h" |
#include "chrome/browser/profiles/profile.h" |
#include "chrome/browser/renderer_preferences_util.h" |
#include "chrome/browser/safe_browsing/malware_details.h" |
@@ -44,10 +43,6 @@ |
#include "net/base/escape.h" |
#include "ui/base/l10n/l10n_util.h" |
-#if defined(ENABLE_EXTENSIONS) |
-#include "chrome/browser/extensions/api/experience_sampling_private/experience_sampling.h" |
-#endif |
- |
using base::UserMetricsAction; |
using content::BrowserThread; |
using content::InterstitialPage; |
@@ -55,10 +50,6 @@ using content::OpenURLParams; |
using content::Referrer; |
using content::WebContents; |
-#if defined(ENABLE_EXTENSIONS) |
-using extensions::ExperienceSamplingEvent; |
-#endif |
- |
namespace { |
// For malware interstitial pages, we link the problematic URL to Google's |
@@ -102,12 +93,10 @@ const char kBoxChecked[] = "boxchecked"; |
const char kDisplayCheckBox[] = "displaycheckbox"; |
// Constants for the Experience Sampling instrumentation. |
-#if defined(ENABLE_EXTENSIONS) |
const char kEventNameMalware[] = "safebrowsing_interstitial_"; |
const char kEventNameHarmful[] = "harmful_interstitial_"; |
const char kEventNamePhishing[] = "phishing_interstitial_"; |
const char kEventNameOther[] = "safebrowsing_other_interstitial_"; |
-#endif |
base::LazyInstance<SafeBrowsingBlockingPage::UnsafeResourceMap> |
g_unsafe_resource_map = LAZY_INSTANCE_INITIALIZER; |
@@ -158,8 +147,7 @@ SafeBrowsingBlockingPage::SafeBrowsingBlockingPage( |
report_loop_(NULL), |
is_main_frame_load_blocked_(IsMainPageLoadBlocked(unsafe_resources)), |
unsafe_resources_(unsafe_resources), |
- proceeded_(false), |
- num_visits_(-1) { |
+ proceeded_(false) { |
bool malware = false; |
bool harmful = false; |
bool phishing = false; |
@@ -180,26 +168,21 @@ SafeBrowsingBlockingPage::SafeBrowsingBlockingPage( |
} |
DCHECK(phishing || malware || harmful); |
if (malware) |
- interstitial_type_ = TYPE_MALWARE; |
+ interstitial_reason_ = SB_REASON_MALWARE; |
else if (harmful) |
- interstitial_type_ = TYPE_HARMFUL; |
+ interstitial_reason_ = SB_REASON_HARMFUL; |
else |
- interstitial_type_ = TYPE_PHISHING; |
- |
- RecordUserDecision(SHOW); |
- RecordUserInteraction(TOTAL_VISITS); |
- if (IsPrefEnabled(prefs::kSafeBrowsingProceedAnywayDisabled)) |
- RecordUserDecision(PROCEEDING_DISABLED); |
- |
- HistoryService* history_service = HistoryServiceFactory::GetForProfile( |
- Profile::FromBrowserContext(web_contents->GetBrowserContext()), |
- ServiceAccessType::EXPLICIT_ACCESS); |
- if (history_service) { |
- history_service->GetVisibleVisitCountToHost( |
- request_url(), |
- base::Bind(&SafeBrowsingBlockingPage::OnGotHistoryCount, |
- base::Unretained(this)), |
- &request_tracker_); |
+ interstitial_reason_ = SB_REASON_PHISHING; |
+ |
+ uma_helper_.reset(new SecurityInterstitialUmaHelper( |
+ web_contents, request_url(), |
+ GetHistogramPrefix(), GetSamplingEventName())); |
+ uma_helper_->RecordUserDecision(SecurityInterstitialUmaHelper::SHOW); |
+ uma_helper_->RecordUserInteraction( |
+ SecurityInterstitialUmaHelper::TOTAL_VISITS); |
+ if (IsPrefEnabled(prefs::kSafeBrowsingProceedAnywayDisabled)) { |
+ uma_helper_->RecordUserDecision( |
+ SecurityInterstitialUmaHelper::PROCEEDING_DISABLED); |
} |
if (!is_main_frame_load_blocked_) { |
@@ -220,31 +203,6 @@ SafeBrowsingBlockingPage::SafeBrowsingBlockingPage( |
malware_details_ = MalwareDetails::NewMalwareDetails( |
ui_manager_, web_contents, unsafe_resources[0]); |
} |
- |
-#if defined(ENABLE_EXTENSIONS) |
- // ExperienceSampling: Set up new sampling event for this interstitial. |
- // This needs to handle all types of warnings this interstitial can show. |
- std::string event_name; |
- switch (interstitial_type_) { |
- case TYPE_MALWARE: |
- event_name = kEventNameMalware; |
- break; |
- case TYPE_HARMFUL: |
- event_name = kEventNameHarmful; |
- break; |
- case TYPE_PHISHING: |
- event_name = kEventNamePhishing; |
- break; |
- default: |
- event_name = kEventNameOther; |
- break; |
- } |
- sampling_event_.reset(new ExperienceSamplingEvent( |
- event_name, |
- request_url(), |
- web_contents->GetLastCommittedURL(), |
- web_contents->GetBrowserContext())); |
-#endif |
} |
bool SafeBrowsingBlockingPage::CanShowMalwareDetailsOption() { |
@@ -273,9 +231,11 @@ void SafeBrowsingBlockingPage::CommandReceived(const std::string& cmd) { |
if (command == kLearnMoreCommand) { |
// User pressed "Learn more". |
- RecordUserInteraction(SHOW_LEARN_MORE); |
- GURL learn_more_url(interstitial_type_ == TYPE_PHISHING ? |
- kLearnMorePhishingUrlV2 : kLearnMoreMalwareUrlV2); |
+ uma_helper_->RecordUserInteraction( |
+ SecurityInterstitialUmaHelper::SHOW_LEARN_MORE); |
+ GURL learn_more_url( |
+ interstitial_reason_ == SB_REASON_PHISHING ? |
+ kLearnMorePhishingUrlV2 : kLearnMoreMalwareUrlV2); |
learn_more_url = google_util::AppendGoogleLocaleParam( |
learn_more_url, g_browser_process->GetApplicationLocale()); |
OpenURLParams params(learn_more_url, |
@@ -289,7 +249,8 @@ void SafeBrowsingBlockingPage::CommandReceived(const std::string& cmd) { |
if (command == kShowPrivacyCommand) { |
// User pressed "Safe Browsing privacy policy". |
- RecordUserInteraction(SHOW_PRIVACY_POLICY); |
+ uma_helper_->RecordUserInteraction( |
+ SecurityInterstitialUmaHelper::SHOW_PRIVACY_POLICY); |
GURL privacy_url( |
l10n_util::GetStringUTF8(IDS_SAFE_BROWSING_PRIVACY_POLICY_URL)); |
privacy_url = google_util::AppendGoogleLocaleParam( |
@@ -308,7 +269,7 @@ void SafeBrowsingBlockingPage::CommandReceived(const std::string& cmd) { |
if (IsPrefEnabled(prefs::kSafeBrowsingProceedAnywayDisabled)) { |
proceed_blocked = true; |
} else { |
- RecordUserDecision(PROCEED); |
+ uma_helper_->RecordUserDecision(SecurityInterstitialUmaHelper::PROCEED); |
interstitial_page()->Proceed(); |
// |this| has been deleted after Proceed() returns. |
return; |
@@ -364,7 +325,8 @@ void SafeBrowsingBlockingPage::CommandReceived(const std::string& cmd) { |
std::string bad_url_spec = unsafe_resources_[element_index].url.spec(); |
if (command == kShowDiagnosticCommand) { |
// We're going to take the user to Google's SafeBrowsing diagnostic page. |
- RecordUserInteraction(SHOW_DIAGNOSTIC); |
+ uma_helper_->RecordUserInteraction( |
+ SecurityInterstitialUmaHelper::SHOW_DIAGNOSTIC); |
std::string diagnostic = |
base::StringPrintf(kSbDiagnosticUrl, |
net::EscapeQueryParamValue(bad_url_spec, true).c_str()); |
@@ -385,7 +347,8 @@ void SafeBrowsingBlockingPage::CommandReceived(const std::string& cmd) { |
} |
if (command == kExpandedSeeMoreCommand) { |
- RecordUserInteraction(SHOW_ADVANCED); |
+ uma_helper_->RecordUserInteraction( |
+ SecurityInterstitialUmaHelper::SHOW_ADVANCED); |
return; |
} |
@@ -449,8 +412,10 @@ void SafeBrowsingBlockingPage::OnDontProceed() { |
if (proceeded_) |
return; |
- if (!IsPrefEnabled(prefs::kSafeBrowsingProceedAnywayDisabled)) |
- RecordUserDecision(DONT_PROCEED); |
+ if (!IsPrefEnabled(prefs::kSafeBrowsingProceedAnywayDisabled)) { |
+ uma_helper_->RecordUserDecision( |
+ SecurityInterstitialUmaHelper::DONT_PROCEED); |
+ } |
// Send the malware details, if we opted to. |
FinishMalwareDetails(0); // No delay |
@@ -482,107 +447,10 @@ void SafeBrowsingBlockingPage::OnDontProceed() { |
} |
} |
-void SafeBrowsingBlockingPage::OnGotHistoryCount(bool success, |
- int num_visits, |
- base::Time first_visit) { |
- if (success) |
- num_visits_ = num_visits; |
-} |
- |
-void SafeBrowsingBlockingPage::RecordUserDecision(Decision decision) { |
- switch (interstitial_type_) { |
- case TYPE_MALWARE: |
- UMA_HISTOGRAM_ENUMERATION("interstitial.malware.decision", |
- decision, |
- MAX_DECISION); |
- break; |
- case TYPE_HARMFUL: |
- UMA_HISTOGRAM_ENUMERATION("interstitial.harmful.decision", |
- decision, |
- MAX_DECISION); |
- break; |
- case TYPE_PHISHING: |
- UMA_HISTOGRAM_ENUMERATION("interstitial.phishing.decision", |
- decision, |
- MAX_DECISION); |
- break; |
- } |
- |
-#if defined(ENABLE_EXTENSIONS) |
- if (sampling_event_.get()) { |
- switch (decision) { |
- case PROCEED: |
- sampling_event_->CreateUserDecisionEvent( |
- ExperienceSamplingEvent::kProceed); |
- break; |
- case DONT_PROCEED: |
- sampling_event_->CreateUserDecisionEvent( |
- ExperienceSamplingEvent::kDeny); |
- break; |
- case SHOW: |
- case PROCEEDING_DISABLED: |
- case MAX_DECISION: |
- break; |
- } |
- } |
-#endif |
- |
- // Record additional information about malware sites that users have |
- // visited before. |
- if (num_visits_ < 1 || interstitial_type_ != TYPE_MALWARE) |
- return; |
- if (decision == PROCEED || decision == DONT_PROCEED) { |
- UMA_HISTOGRAM_ENUMERATION("interstitial.malware.decision.repeat_visit", |
- SHOW, |
- MAX_DECISION); |
- UMA_HISTOGRAM_ENUMERATION("interstitial.malware.decision.repeat_visit", |
- decision, |
- MAX_DECISION); |
- } |
-} |
- |
-void SafeBrowsingBlockingPage::RecordUserInteraction(Interaction interaction) { |
- switch (interstitial_type_) { |
- case TYPE_MALWARE: |
- UMA_HISTOGRAM_ENUMERATION("interstitial.malware.interaction", |
- interaction, |
- MAX_INTERACTION); |
- break; |
- case TYPE_HARMFUL: |
- UMA_HISTOGRAM_ENUMERATION("interstitial.harmful.interaction", |
- interaction, |
- MAX_INTERACTION); |
- break; |
- case TYPE_PHISHING: |
- UMA_HISTOGRAM_ENUMERATION("interstitial.phishing.interaction", |
- interaction, |
- MAX_INTERACTION); |
- break; |
- } |
- |
-#if defined(ENABLE_EXTENSIONS) |
- if (!sampling_event_.get()) |
- return; |
- switch (interaction) { |
- case SHOW_LEARN_MORE: |
- sampling_event_->set_has_viewed_learn_more(true); |
- break; |
- case SHOW_ADVANCED: |
- sampling_event_->set_has_viewed_details(true); |
- break; |
- case SHOW_PRIVACY_POLICY: |
- case SHOW_DIAGNOSTIC: |
- case TOTAL_VISITS: |
- case MAX_INTERACTION: |
- break; |
- } |
-#endif |
-} |
- |
void SafeBrowsingBlockingPage::FinishMalwareDetails(int64 delay_ms) { |
if (malware_details_.get() == NULL) |
return; // Not all interstitials have malware details (eg phishing). |
- DCHECK(interstitial_type_ == TYPE_MALWARE); |
+ DCHECK(interstitial_reason_ == SB_REASON_MALWARE); |
Alexei Svitkine (slow)
2015/01/14 22:12:33
Nit: Can this be a DCHECK_EQ?
felt
2015/01/15 06:47:22
Done.
|
const bool enabled = |
IsPrefEnabled(prefs::kSafeBrowsingExtendedReportingEnabled); |
@@ -679,6 +547,32 @@ bool SafeBrowsingBlockingPage::IsMainPageLoadBlocked( |
return unsafe_resources.size() == 1 && !unsafe_resources[0].is_subresource; |
} |
+std::string SafeBrowsingBlockingPage::GetHistogramPrefix() const { |
+ switch (interstitial_reason_) { |
+ case SB_REASON_MALWARE: |
+ return "malware"; |
+ case SB_REASON_HARMFUL: |
+ return "harmful"; |
+ case SB_REASON_PHISHING: |
+ return "phishing"; |
+ } |
+ NOTREACHED(); |
palmer
2015/01/15 01:09:32
Do you have to return string() here, for non-Debug
felt
2015/01/15 06:47:22
Good question.
|
+} |
+ |
+std::string SafeBrowsingBlockingPage::GetSamplingEventName() const { |
+ switch (interstitial_reason_) { |
+ case SB_REASON_MALWARE: |
+ return kEventNameMalware; |
+ case SB_REASON_HARMFUL: |
+ return kEventNameHarmful; |
+ case SB_REASON_PHISHING: |
+ return kEventNamePhishing; |
+ default: |
+ return kEventNameOther; |
+ } |
+ NOTREACHED(); |
+} |
+ |
void SafeBrowsingBlockingPage::PopulateInterstitialStrings( |
base::DictionaryValue* load_time_data) { |
CHECK(load_time_data); |
@@ -700,14 +594,14 @@ void SafeBrowsingBlockingPage::PopulateInterstitialStrings( |
"overridable", |
!IsPrefEnabled(prefs::kSafeBrowsingProceedAnywayDisabled)); |
- switch (interstitial_type_) { |
- case TYPE_MALWARE: |
+ switch (interstitial_reason_) { |
+ case SB_REASON_MALWARE: |
PopulateMalwareLoadTimeData(load_time_data); |
break; |
- case TYPE_HARMFUL: |
+ case SB_REASON_HARMFUL: |
PopulateHarmfulLoadTimeData(load_time_data); |
break; |
- case TYPE_PHISHING: |
+ case SB_REASON_PHISHING: |
PopulatePhishingLoadTimeData(load_time_data); |
break; |
} |