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 // Implementation of the SafeBrowsingBlockingPage class. | 5 // Implementation of the SafeBrowsingBlockingPage class. |
6 | 6 |
7 #include "chrome/browser/safe_browsing/safe_browsing_blocking_page.h" | 7 #include "chrome/browser/safe_browsing/safe_browsing_blocking_page.h" |
8 | 8 |
9 #include <string> | 9 #include <string> |
10 | 10 |
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
116 const char kEventNameMalware[] = "safebrowsing_interstitial_"; | 116 const char kEventNameMalware[] = "safebrowsing_interstitial_"; |
117 const char kEventNamePhishing[] = "phishing_interstitial_"; | 117 const char kEventNamePhishing[] = "phishing_interstitial_"; |
118 const char kEventNameMalwareAndPhishing[] = | 118 const char kEventNameMalwareAndPhishing[] = |
119 "malware_and_phishing_interstitial_"; | 119 "malware_and_phishing_interstitial_"; |
120 const char kEventNameOther[] = "safebrowsing_other_interstitial_"; | 120 const char kEventNameOther[] = "safebrowsing_other_interstitial_"; |
121 #endif | 121 #endif |
122 | 122 |
123 base::LazyInstance<SafeBrowsingBlockingPage::UnsafeResourceMap> | 123 base::LazyInstance<SafeBrowsingBlockingPage::UnsafeResourceMap> |
124 g_unsafe_resource_map = LAZY_INSTANCE_INITIALIZER; | 124 g_unsafe_resource_map = LAZY_INSTANCE_INITIALIZER; |
125 | 125 |
126 // This enum is used for a histogram. Don't reorder, delete, or insert | |
127 // elements. New elements should be added before MAX_ACTION only. | |
128 enum DetailedDecision { | |
129 MALWARE_SHOW_NEW_SITE = 0, | |
130 MALWARE_PROCEED_NEW_SITE, | |
131 MALWARE_SHOW_CROSS_SITE, | |
132 MALWARE_PROCEED_CROSS_SITE, | |
133 PHISHING_SHOW_NEW_SITE, | |
134 PHISHING_PROCEED_NEW_SITE, | |
135 PHISHING_SHOW_CROSS_SITE, | |
136 PHISHING_PROCEED_CROSS_SITE, | |
137 MAX_DETAILED_ACTION | |
138 }; | |
139 | |
140 void RecordDetailedUserAction(DetailedDecision decision) { | |
141 UMA_HISTOGRAM_ENUMERATION("SB2.InterstitialActionDetails", | |
142 decision, | |
143 MAX_DETAILED_ACTION); | |
144 } | |
145 | |
146 } // namespace | 126 } // namespace |
147 | 127 |
148 // static | 128 // static |
149 SafeBrowsingBlockingPageFactory* SafeBrowsingBlockingPage::factory_ = NULL; | 129 SafeBrowsingBlockingPageFactory* SafeBrowsingBlockingPage::factory_ = NULL; |
150 | 130 |
151 // The default SafeBrowsingBlockingPageFactory. Global, made a singleton so we | 131 // The default SafeBrowsingBlockingPageFactory. Global, made a singleton so we |
152 // don't leak it. | 132 // don't leak it. |
153 class SafeBrowsingBlockingPageFactoryImpl | 133 class SafeBrowsingBlockingPageFactoryImpl |
154 : public SafeBrowsingBlockingPageFactory { | 134 : public SafeBrowsingBlockingPageFactory { |
155 public: | 135 public: |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
207 } | 187 } |
208 } | 188 } |
209 DCHECK(phishing || malware); | 189 DCHECK(phishing || malware); |
210 if (malware && phishing) | 190 if (malware && phishing) |
211 interstitial_type_ = TYPE_MALWARE_AND_PHISHING; | 191 interstitial_type_ = TYPE_MALWARE_AND_PHISHING; |
212 else if (malware) | 192 else if (malware) |
213 interstitial_type_ = TYPE_MALWARE; | 193 interstitial_type_ = TYPE_MALWARE; |
214 else | 194 else |
215 interstitial_type_ = TYPE_PHISHING; | 195 interstitial_type_ = TYPE_PHISHING; |
216 | 196 |
217 RecordUserAction(SHOW); | 197 RecordUserDecision(SHOW); |
198 if (IsPrefEnabled(prefs::kSafeBrowsingProceedAnywayDisabled)) | |
199 RecordUserDecision(PROCEEDING_DISABLED); | |
200 | |
218 HistoryService* history_service = HistoryServiceFactory::GetForProfile( | 201 HistoryService* history_service = HistoryServiceFactory::GetForProfile( |
219 Profile::FromBrowserContext(web_contents->GetBrowserContext()), | 202 Profile::FromBrowserContext(web_contents->GetBrowserContext()), |
220 Profile::EXPLICIT_ACCESS); | 203 Profile::EXPLICIT_ACCESS); |
221 if (history_service) { | 204 if (history_service) { |
222 history_service->GetVisibleVisitCountToHost( | 205 history_service->GetVisibleVisitCountToHost( |
223 url_, | 206 url_, |
224 base::Bind(&SafeBrowsingBlockingPage::OnGotHistoryCount, | 207 base::Bind(&SafeBrowsingBlockingPage::OnGotHistoryCount, |
225 base::Unretained(this)), | 208 base::Unretained(this)), |
226 &request_tracker_); | 209 &request_tracker_); |
227 } | 210 } |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
294 return; | 277 return; |
295 } | 278 } |
296 | 279 |
297 if (command == kDontReportCommand) { | 280 if (command == kDontReportCommand) { |
298 SetReportingPreference(false); | 281 SetReportingPreference(false); |
299 return; | 282 return; |
300 } | 283 } |
301 | 284 |
302 if (command == kLearnMoreCommand) { | 285 if (command == kLearnMoreCommand) { |
303 // User pressed "Learn more". | 286 // User pressed "Learn more". |
304 #if defined(ENABLE_EXTENSIONS) | 287 RecordUserInteraction(SHOW_LEARN_MORE); |
305 if (sampling_event_.get()) | |
306 sampling_event_->set_has_viewed_learn_more(true); | |
307 #endif | |
308 GURL learn_more_url(interstitial_type_ == TYPE_PHISHING ? | 288 GURL learn_more_url(interstitial_type_ == TYPE_PHISHING ? |
309 kLearnMorePhishingUrlV2 : kLearnMoreMalwareUrlV2); | 289 kLearnMorePhishingUrlV2 : kLearnMoreMalwareUrlV2); |
310 learn_more_url = google_util::AppendGoogleLocaleParam( | 290 learn_more_url = google_util::AppendGoogleLocaleParam( |
311 learn_more_url, g_browser_process->GetApplicationLocale()); | 291 learn_more_url, g_browser_process->GetApplicationLocale()); |
312 OpenURLParams params(learn_more_url, | 292 OpenURLParams params(learn_more_url, |
313 Referrer(), | 293 Referrer(), |
314 CURRENT_TAB, | 294 CURRENT_TAB, |
315 content::PAGE_TRANSITION_LINK, | 295 content::PAGE_TRANSITION_LINK, |
316 false); | 296 false); |
317 web_contents_->OpenURL(params); | 297 web_contents_->OpenURL(params); |
318 return; | 298 return; |
319 } | 299 } |
320 | 300 |
321 if (command == kShowPrivacyCommand) { | 301 if (command == kShowPrivacyCommand) { |
322 // User pressed "Safe Browsing privacy policy". | 302 // User pressed "Safe Browsing privacy policy". |
303 RecordUserInteraction(SHOW_PRIVACY_POLICY); | |
323 GURL privacy_url( | 304 GURL privacy_url( |
324 l10n_util::GetStringUTF8(IDS_SAFE_BROWSING_PRIVACY_POLICY_URL)); | 305 l10n_util::GetStringUTF8(IDS_SAFE_BROWSING_PRIVACY_POLICY_URL)); |
325 privacy_url = google_util::AppendGoogleLocaleParam( | 306 privacy_url = google_util::AppendGoogleLocaleParam( |
326 privacy_url, g_browser_process->GetApplicationLocale()); | 307 privacy_url, g_browser_process->GetApplicationLocale()); |
327 OpenURLParams params(privacy_url, | 308 OpenURLParams params(privacy_url, |
328 Referrer(), | 309 Referrer(), |
329 CURRENT_TAB, | 310 CURRENT_TAB, |
330 content::PAGE_TRANSITION_LINK, | 311 content::PAGE_TRANSITION_LINK, |
331 false); | 312 false); |
332 web_contents_->OpenURL(params); | 313 web_contents_->OpenURL(params); |
333 return; | 314 return; |
334 } | 315 } |
335 | 316 |
336 bool proceed_blocked = false; | 317 bool proceed_blocked = false; |
337 if (command == kProceedCommand) { | 318 if (command == kProceedCommand) { |
338 if (IsPrefEnabled(prefs::kSafeBrowsingProceedAnywayDisabled)) { | 319 if (IsPrefEnabled(prefs::kSafeBrowsingProceedAnywayDisabled)) { |
339 proceed_blocked = true; | 320 proceed_blocked = true; |
340 } else { | 321 } else { |
322 RecordUserDecision(PROCEED); | |
341 interstitial_page_->Proceed(); | 323 interstitial_page_->Proceed(); |
342 // |this| has been deleted after Proceed() returns. | 324 // |this| has been deleted after Proceed() returns. |
343 return; | 325 return; |
344 } | 326 } |
345 } | 327 } |
346 | 328 |
347 if (command == kTakeMeBackCommand || proceed_blocked) { | 329 if (command == kTakeMeBackCommand || proceed_blocked) { |
330 if (!proceed_blocked) | |
331 RecordUserDecision(DONT_PROCEED); | |
mattm
2014/09/16 07:48:20
I still don't think this will be recorded if the u
felt
2014/09/16 15:03:32
Oh, hmm, good point. Fixed.
| |
348 if (is_main_frame_load_blocked_) { | 332 if (is_main_frame_load_blocked_) { |
349 // If the load is blocked, we want to close the interstitial and discard | 333 // If the load is blocked, we want to close the interstitial and discard |
350 // the pending entry. | 334 // the pending entry. |
351 interstitial_page_->DontProceed(); | 335 interstitial_page_->DontProceed(); |
352 // |this| has been deleted after DontProceed() returns. | 336 // |this| has been deleted after DontProceed() returns. |
353 return; | 337 return; |
354 } | 338 } |
355 | 339 |
356 // Otherwise the offending entry has committed, and we need to go back or | 340 // Otherwise the offending entry has committed, and we need to go back or |
357 // to a safe page. We will close the interstitial when that page commits. | 341 // to a safe page. We will close the interstitial when that page commits. |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
403 threat_type == SB_THREAT_TYPE_CLIENT_SIDE_PHISHING_URL); | 387 threat_type == SB_THREAT_TYPE_CLIENT_SIDE_PHISHING_URL); |
404 OpenURLParams params( | 388 OpenURLParams params( |
405 report_url, Referrer(), CURRENT_TAB, content::PAGE_TRANSITION_LINK, | 389 report_url, Referrer(), CURRENT_TAB, content::PAGE_TRANSITION_LINK, |
406 false); | 390 false); |
407 web_contents_->OpenURL(params); | 391 web_contents_->OpenURL(params); |
408 return; | 392 return; |
409 } | 393 } |
410 | 394 |
411 if (command == kShowDiagnosticCommand) { | 395 if (command == kShowDiagnosticCommand) { |
412 // We're going to take the user to Google's SafeBrowsing diagnostic page. | 396 // We're going to take the user to Google's SafeBrowsing diagnostic page. |
397 RecordUserInteraction(SHOW_DIAGNOSTIC); | |
413 std::string diagnostic = | 398 std::string diagnostic = |
414 base::StringPrintf(kSbDiagnosticUrl, | 399 base::StringPrintf(kSbDiagnosticUrl, |
415 net::EscapeQueryParamValue(bad_url_spec, true).c_str()); | 400 net::EscapeQueryParamValue(bad_url_spec, true).c_str()); |
416 GURL diagnostic_url(diagnostic); | 401 GURL diagnostic_url(diagnostic); |
417 diagnostic_url = google_util::AppendGoogleLocaleParam( | 402 diagnostic_url = google_util::AppendGoogleLocaleParam( |
418 diagnostic_url, g_browser_process->GetApplicationLocale()); | 403 diagnostic_url, g_browser_process->GetApplicationLocale()); |
419 DCHECK(unsafe_resources_[element_index].threat_type == | 404 DCHECK(unsafe_resources_[element_index].threat_type == |
420 SB_THREAT_TYPE_URL_MALWARE || | 405 SB_THREAT_TYPE_URL_MALWARE || |
421 unsafe_resources_[element_index].threat_type == | 406 unsafe_resources_[element_index].threat_type == |
422 SB_THREAT_TYPE_CLIENT_SIDE_MALWARE_URL); | 407 SB_THREAT_TYPE_CLIENT_SIDE_MALWARE_URL); |
423 OpenURLParams params( | 408 OpenURLParams params( |
424 diagnostic_url, Referrer(), CURRENT_TAB, content::PAGE_TRANSITION_LINK, | 409 diagnostic_url, Referrer(), CURRENT_TAB, content::PAGE_TRANSITION_LINK, |
425 false); | 410 false); |
426 web_contents_->OpenURL(params); | 411 web_contents_->OpenURL(params); |
427 return; | 412 return; |
428 } | 413 } |
429 | 414 |
430 if (command == kExpandedSeeMoreCommand) { | 415 if (command == kExpandedSeeMoreCommand) { |
431 // User expanded the "see more info" section of the page. We don't actually | 416 RecordUserInteraction(SHOW_ADVANCED); |
432 // do any action based on this, it's just so that RecordUserReactionTime can | |
433 // track it. | |
434 | |
435 #if defined(ENABLE_EXTENSIONS) | |
436 // ExperienceSampling: We track that the user expanded the details. | |
437 if (sampling_event_.get()) | |
438 sampling_event_->set_has_viewed_details(true); | |
439 #endif | |
440 return; | 417 return; |
441 } | 418 } |
442 | 419 |
443 NOTREACHED() << "Unexpected command: " << command; | 420 NOTREACHED() << "Unexpected command: " << command; |
444 } | 421 } |
445 | 422 |
446 void SafeBrowsingBlockingPage::OverrideRendererPrefs( | 423 void SafeBrowsingBlockingPage::OverrideRendererPrefs( |
447 content::RendererPreferences* prefs) { | 424 content::RendererPreferences* prefs) { |
448 Profile* profile = Profile::FromBrowserContext( | 425 Profile* profile = Profile::FromBrowserContext( |
449 web_contents_->GetBrowserContext()); | 426 web_contents_->GetBrowserContext()); |
450 renderer_preferences_util::UpdateFromSystemSettings(prefs, profile); | 427 renderer_preferences_util::UpdateFromSystemSettings(prefs, profile); |
451 } | 428 } |
452 | 429 |
453 void SafeBrowsingBlockingPage::SetReportingPreference(bool report) { | 430 void SafeBrowsingBlockingPage::SetReportingPreference(bool report) { |
454 Profile* profile = Profile::FromBrowserContext( | 431 Profile* profile = Profile::FromBrowserContext( |
455 web_contents_->GetBrowserContext()); | 432 web_contents_->GetBrowserContext()); |
456 PrefService* pref = profile->GetPrefs(); | 433 PrefService* pref = profile->GetPrefs(); |
457 pref->SetBoolean(prefs::kSafeBrowsingExtendedReportingEnabled, report); | 434 pref->SetBoolean(prefs::kSafeBrowsingExtendedReportingEnabled, report); |
458 UMA_HISTOGRAM_BOOLEAN("SB2.SetExtendedReportingEnabled", report); | 435 UMA_HISTOGRAM_BOOLEAN("SB2.SetExtendedReportingEnabled", report); |
459 } | 436 } |
460 | 437 |
461 void SafeBrowsingBlockingPage::OnProceed() { | 438 void SafeBrowsingBlockingPage::OnProceed() { |
462 proceeded_ = true; | 439 proceeded_ = true; |
463 RecordUserAction(PROCEED); | |
464 // Send the malware details, if we opted to. | 440 // Send the malware details, if we opted to. |
465 FinishMalwareDetails(malware_details_proceed_delay_ms_); | 441 FinishMalwareDetails(malware_details_proceed_delay_ms_); |
466 | 442 |
467 NotifySafeBrowsingUIManager(ui_manager_, unsafe_resources_, true); | 443 NotifySafeBrowsingUIManager(ui_manager_, unsafe_resources_, true); |
468 | 444 |
469 // Check to see if some new notifications of unsafe resources have been | 445 // Check to see if some new notifications of unsafe resources have been |
470 // received while we were showing the interstitial. | 446 // received while we were showing the interstitial. |
471 UnsafeResourceMap* unsafe_resource_map = GetUnsafeResourcesMap(); | 447 UnsafeResourceMap* unsafe_resource_map = GetUnsafeResourcesMap(); |
472 UnsafeResourceMap::iterator iter = unsafe_resource_map->find(web_contents_); | 448 UnsafeResourceMap::iterator iter = unsafe_resource_map->find(web_contents_); |
473 SafeBrowsingBlockingPage* blocking_page = NULL; | 449 SafeBrowsingBlockingPage* blocking_page = NULL; |
474 if (iter != unsafe_resource_map->end() && !iter->second.empty()) { | 450 if (iter != unsafe_resource_map->end() && !iter->second.empty()) { |
475 // Build an interstitial for all the unsafe resources notifications. | 451 // Build an interstitial for all the unsafe resources notifications. |
476 // Don't show it now as showing an interstitial while an interstitial is | 452 // Don't show it now as showing an interstitial while an interstitial is |
477 // already showing would cause DontProceed() to be invoked. | 453 // already showing would cause DontProceed() to be invoked. |
478 blocking_page = factory_->CreateSafeBrowsingPage(ui_manager_, web_contents_, | 454 blocking_page = factory_->CreateSafeBrowsingPage(ui_manager_, web_contents_, |
479 iter->second); | 455 iter->second); |
480 unsafe_resource_map->erase(iter); | 456 unsafe_resource_map->erase(iter); |
481 } | 457 } |
482 | 458 |
483 #if defined(ENABLE_EXTENSIONS) | |
484 // ExperienceSampling: Notify that user decided to proceed. | |
485 if (sampling_event_.get()) | |
486 sampling_event_->CreateUserDecisionEvent(ExperienceSamplingEvent::kProceed); | |
487 #endif | |
488 | |
489 // Now that this interstitial is gone, we can show the new one. | 459 // Now that this interstitial is gone, we can show the new one. |
490 if (blocking_page) | 460 if (blocking_page) |
491 blocking_page->Show(); | 461 blocking_page->Show(); |
492 } | 462 } |
493 | 463 |
494 void SafeBrowsingBlockingPage::DontCreateViewForTesting() { | 464 void SafeBrowsingBlockingPage::DontCreateViewForTesting() { |
495 create_view_ = false; | 465 create_view_ = false; |
496 } | 466 } |
497 | 467 |
498 void SafeBrowsingBlockingPage::Show() { | 468 void SafeBrowsingBlockingPage::Show() { |
499 DCHECK(!interstitial_page_); | 469 DCHECK(!interstitial_page_); |
500 interstitial_page_ = InterstitialPage::Create( | 470 interstitial_page_ = InterstitialPage::Create( |
501 web_contents_, is_main_frame_load_blocked_, url_, this); | 471 web_contents_, is_main_frame_load_blocked_, url_, this); |
502 if (!create_view_) | 472 if (!create_view_) |
503 interstitial_page_->DontCreateViewForTesting(); | 473 interstitial_page_->DontCreateViewForTesting(); |
504 interstitial_page_->Show(); | 474 interstitial_page_->Show(); |
505 } | 475 } |
506 | 476 |
507 void SafeBrowsingBlockingPage::OnDontProceed() { | 477 void SafeBrowsingBlockingPage::OnDontProceed() { |
508 // Calling this method twice will not double-count. | 478 // Calling this method twice will not double-count. |
509 RecordUserReactionTime(kNavigatedAwayMetaCommand); | 479 RecordUserReactionTime(kNavigatedAwayMetaCommand); |
510 // We could have already called Proceed(), in which case we must not notify | 480 // We could have already called Proceed(), in which case we must not notify |
511 // the SafeBrowsingUIManager again, as the client has been deleted. | 481 // the SafeBrowsingUIManager again, as the client has been deleted. |
512 if (proceeded_) | 482 if (proceeded_) |
513 return; | 483 return; |
514 | 484 |
515 RecordUserAction(DONT_PROCEED); | |
516 // Send the malware details, if we opted to. | 485 // Send the malware details, if we opted to. |
517 FinishMalwareDetails(0); // No delay | 486 FinishMalwareDetails(0); // No delay |
518 | 487 |
519 NotifySafeBrowsingUIManager(ui_manager_, unsafe_resources_, false); | 488 NotifySafeBrowsingUIManager(ui_manager_, unsafe_resources_, false); |
520 | 489 |
521 // The user does not want to proceed, clear the queued unsafe resources | 490 // The user does not want to proceed, clear the queued unsafe resources |
522 // notifications we received while the interstitial was showing. | 491 // notifications we received while the interstitial was showing. |
523 UnsafeResourceMap* unsafe_resource_map = GetUnsafeResourcesMap(); | 492 UnsafeResourceMap* unsafe_resource_map = GetUnsafeResourcesMap(); |
524 UnsafeResourceMap::iterator iter = unsafe_resource_map->find(web_contents_); | 493 UnsafeResourceMap::iterator iter = unsafe_resource_map->find(web_contents_); |
525 if (iter != unsafe_resource_map->end() && !iter->second.empty()) { | 494 if (iter != unsafe_resource_map->end() && !iter->second.empty()) { |
526 NotifySafeBrowsingUIManager(ui_manager_, iter->second, false); | 495 NotifySafeBrowsingUIManager(ui_manager_, iter->second, false); |
527 unsafe_resource_map->erase(iter); | 496 unsafe_resource_map->erase(iter); |
528 } | 497 } |
529 | 498 |
530 // We don't remove the navigation entry if the tab is being destroyed as this | 499 // We don't remove the navigation entry if the tab is being destroyed as this |
531 // would trigger a navigation that would cause trouble as the render view host | 500 // would trigger a navigation that would cause trouble as the render view host |
532 // for the tab has by then already been destroyed. We also don't delete the | 501 // for the tab has by then already been destroyed. We also don't delete the |
533 // current entry if it has been committed again, which is possible on a page | 502 // current entry if it has been committed again, which is possible on a page |
534 // that had a subresource warning. | 503 // that had a subresource warning. |
535 int last_committed_index = | 504 int last_committed_index = |
536 web_contents_->GetController().GetLastCommittedEntryIndex(); | 505 web_contents_->GetController().GetLastCommittedEntryIndex(); |
537 if (navigation_entry_index_to_remove_ != -1 && | 506 if (navigation_entry_index_to_remove_ != -1 && |
538 navigation_entry_index_to_remove_ != last_committed_index && | 507 navigation_entry_index_to_remove_ != last_committed_index && |
539 !web_contents_->IsBeingDestroyed()) { | 508 !web_contents_->IsBeingDestroyed()) { |
540 CHECK(web_contents_->GetController().RemoveEntryAtIndex( | 509 CHECK(web_contents_->GetController().RemoveEntryAtIndex( |
541 navigation_entry_index_to_remove_)); | 510 navigation_entry_index_to_remove_)); |
542 navigation_entry_index_to_remove_ = -1; | 511 navigation_entry_index_to_remove_ = -1; |
543 } | 512 } |
544 | |
545 #if defined(ENABLE_EXTENSIONS) | |
546 // ExperienceSampling: Notify that user decided to go back. | |
547 // This also occurs if the user navigates away or closes the tab. | |
548 if (sampling_event_.get()) | |
549 sampling_event_->CreateUserDecisionEvent(ExperienceSamplingEvent::kDeny); | |
550 #endif | |
551 } | 513 } |
552 | 514 |
553 void SafeBrowsingBlockingPage::OnGotHistoryCount(bool success, | 515 void SafeBrowsingBlockingPage::OnGotHistoryCount(bool success, |
554 int num_visits, | 516 int num_visits, |
555 base::Time first_visit) { | 517 base::Time first_visit) { |
556 if (success) | 518 if (success) |
557 num_visits_ = num_visits; | 519 num_visits_ = num_visits; |
558 } | 520 } |
559 | 521 |
560 void SafeBrowsingBlockingPage::RecordUserAction(BlockingPageEvent event) { | 522 void SafeBrowsingBlockingPage::RecordUserDecision(Decision decision) { |
561 // This enum is used for a histogram. Don't reorder, delete, or insert | 523 switch (interstitial_type_) { |
562 // elements. New elements should be added before MAX_ACTION only. | 524 case TYPE_MALWARE: |
563 enum { | 525 UMA_HISTOGRAM_ENUMERATION("interstitial.malware.decision", |
564 MALWARE_SHOW = 0, | 526 decision, |
565 MALWARE_DONT_PROCEED, | 527 MAX_DECISION); |
566 MALWARE_FORCED_DONT_PROCEED, | |
567 MALWARE_PROCEED, | |
568 MULTIPLE_SHOW, | |
569 MULTIPLE_DONT_PROCEED, | |
570 MULTIPLE_FORCED_DONT_PROCEED, | |
571 MULTIPLE_PROCEED, | |
572 PHISHING_SHOW, | |
573 PHISHING_DONT_PROCEED, | |
574 PHISHING_FORCED_DONT_PROCEED, | |
575 PHISHING_PROCEED, | |
576 MALWARE_SHOW_ADVANCED, | |
577 MULTIPLE_SHOW_ADVANCED, | |
578 PHISHING_SHOW_ADVANCED, | |
579 MAX_ACTION | |
580 } histogram_action = MAX_ACTION; | |
581 | |
582 switch (event) { | |
583 case SHOW: | |
584 switch (interstitial_type_) { | |
585 case TYPE_MALWARE_AND_PHISHING: | |
586 histogram_action = MULTIPLE_SHOW; | |
587 break; | |
588 case TYPE_MALWARE: | |
589 histogram_action = MALWARE_SHOW; | |
590 break; | |
591 case TYPE_PHISHING: | |
592 histogram_action = PHISHING_SHOW; | |
593 break; | |
594 } | |
595 break; | 528 break; |
596 case PROCEED: | 529 case TYPE_PHISHING: |
597 switch (interstitial_type_) { | 530 UMA_HISTOGRAM_ENUMERATION("interstitial.phishing.decision", |
598 case TYPE_MALWARE_AND_PHISHING: | 531 decision, |
599 histogram_action = MULTIPLE_PROCEED; | 532 MAX_DECISION); |
600 break; | |
601 case TYPE_MALWARE: | |
602 histogram_action = MALWARE_PROCEED; | |
603 break; | |
604 case TYPE_PHISHING: | |
605 histogram_action = PHISHING_PROCEED; | |
606 break; | |
607 } | |
608 break; | |
609 case DONT_PROCEED: | |
610 if (IsPrefEnabled(prefs::kSafeBrowsingProceedAnywayDisabled)) { | |
611 switch (interstitial_type_) { | |
612 case TYPE_MALWARE_AND_PHISHING: | |
613 histogram_action = MULTIPLE_FORCED_DONT_PROCEED; | |
614 break; | |
615 case TYPE_MALWARE: | |
616 histogram_action = MALWARE_FORCED_DONT_PROCEED; | |
617 break; | |
618 case TYPE_PHISHING: | |
619 histogram_action = PHISHING_FORCED_DONT_PROCEED; | |
620 break; | |
621 } | |
622 } else { | |
623 switch (interstitial_type_) { | |
624 case TYPE_MALWARE_AND_PHISHING: | |
625 histogram_action = MULTIPLE_DONT_PROCEED; | |
626 break; | |
627 case TYPE_MALWARE: | |
628 histogram_action = MALWARE_DONT_PROCEED; | |
629 break; | |
630 case TYPE_PHISHING: | |
631 histogram_action = PHISHING_DONT_PROCEED; | |
632 break; | |
633 } | |
634 } | |
635 break; | |
636 case SHOW_ADVANCED: | |
637 switch (interstitial_type_) { | |
638 case TYPE_MALWARE_AND_PHISHING: | |
639 histogram_action = MULTIPLE_SHOW_ADVANCED; | |
640 break; | |
641 case TYPE_MALWARE: | |
642 histogram_action = MALWARE_SHOW_ADVANCED; | |
643 break; | |
644 case TYPE_PHISHING: | |
645 histogram_action = PHISHING_SHOW_ADVANCED; | |
646 break; | |
647 } | |
648 break; | 533 break; |
649 default: | 534 default: |
650 NOTREACHED() << "Unexpected event: " << event; | 535 NOTREACHED(); |
651 } | |
652 if (histogram_action == MAX_ACTION) { | |
653 NOTREACHED(); | |
654 } else { | |
655 UMA_HISTOGRAM_ENUMERATION("SB2.InterstitialAction", histogram_action, | |
656 MAX_ACTION); | |
657 } | 536 } |
658 | 537 |
659 if (event == PROCEED || event == DONT_PROCEED) { | 538 #if defined(ENABLE_EXTENSIONS) |
660 if (num_visits_ == 0 && interstitial_type_ != TYPE_MALWARE_AND_PHISHING) { | 539 if (sampling_event_.get()) { |
661 RecordDetailedUserAction((interstitial_type_ == TYPE_MALWARE) ? | 540 switch (decision) { |
662 MALWARE_SHOW_NEW_SITE : PHISHING_SHOW_NEW_SITE); | 541 case PROCEED: |
663 if (event == PROCEED) { | 542 sampling_event_->CreateUserDecisionEvent( |
664 RecordDetailedUserAction((interstitial_type_ == TYPE_MALWARE) ? | 543 ExperienceSamplingEvent::kProceed); |
665 MALWARE_PROCEED_NEW_SITE : PHISHING_PROCEED_NEW_SITE); | 544 break; |
666 } | 545 case DONT_PROCEED: |
546 sampling_event_->CreateUserDecisionEvent( | |
547 ExperienceSamplingEvent::kDeny); | |
548 break; | |
549 case SHOW: | |
550 case PROCEEDING_DISABLED: | |
551 case MAX_DECISION: | |
552 break; | |
667 } | 553 } |
668 if (unsafe_resources_[0].is_subresource && | 554 } |
669 interstitial_type_ != TYPE_MALWARE_AND_PHISHING) { | 555 #endif |
670 RecordDetailedUserAction((interstitial_type_ == TYPE_MALWARE) ? | 556 |
671 MALWARE_SHOW_CROSS_SITE : PHISHING_SHOW_CROSS_SITE); | 557 // Record additional information about malware sites that users have |
672 if (event == PROCEED) { | 558 // visited before. |
673 RecordDetailedUserAction((interstitial_type_ == TYPE_MALWARE) ? | 559 if (num_visits_ < 1 || interstitial_type_ != TYPE_MALWARE) |
674 MALWARE_PROCEED_CROSS_SITE : PHISHING_PROCEED_CROSS_SITE); | 560 return; |
675 } | 561 if (decision == PROCEED || decision == DONT_PROCEED) { |
676 } | 562 UMA_HISTOGRAM_ENUMERATION("interstitial.malware.repeat_visit_decision", |
563 SHOW, | |
564 MAX_DECISION); | |
565 UMA_HISTOGRAM_ENUMERATION("interstitial.malware.repeat_visit_decision", | |
566 decision, | |
567 MAX_DECISION); | |
677 } | 568 } |
678 } | 569 } |
679 | 570 |
571 void SafeBrowsingBlockingPage::RecordUserInteraction(Interaction interaction) { | |
572 switch (interstitial_type_) { | |
573 case TYPE_MALWARE: | |
574 UMA_HISTOGRAM_ENUMERATION("interstitial.malware.interaction", | |
575 interaction, | |
576 MAX_INTERACTION); | |
577 break; | |
578 case TYPE_PHISHING: | |
579 UMA_HISTOGRAM_ENUMERATION("interstitial.phishing.interaction", | |
580 interaction, | |
581 MAX_INTERACTION); | |
582 break; | |
583 default: | |
584 NOTREACHED(); | |
585 } | |
586 | |
587 #if defined(ENABLE_EXTENSIONS) | |
588 if (!sampling_event_.get()) | |
589 return; | |
590 switch (interaction) { | |
591 case SHOW_LEARN_MORE: | |
592 sampling_event_->set_has_viewed_learn_more(true); | |
593 break; | |
594 case SHOW_ADVANCED: | |
595 sampling_event_->set_has_viewed_details(true); | |
596 break; | |
597 case SHOW_PRIVACY_POLICY: | |
598 case SHOW_DIAGNOSTIC: | |
599 case MAX_INTERACTION: | |
600 break; | |
601 } | |
602 #endif | |
603 } | |
604 | |
680 void SafeBrowsingBlockingPage::RecordUserReactionTime( | 605 void SafeBrowsingBlockingPage::RecordUserReactionTime( |
681 const std::string& command) { | 606 const std::string& command) { |
682 if (interstitial_show_time_.is_null()) | 607 if (interstitial_show_time_.is_null()) |
683 return; // We already reported the user reaction time. | 608 return; // We already reported the user reaction time. |
684 base::TimeDelta dt = base::TimeTicks::Now() - interstitial_show_time_; | 609 base::TimeDelta dt = base::TimeTicks::Now() - interstitial_show_time_; |
685 DVLOG(1) << "User reaction time for command:" << command | 610 DVLOG(1) << "User reaction time for command:" << command |
686 << " on interstitial_type_:" << interstitial_type_ | 611 << " on interstitial_type_:" << interstitial_type_ |
687 << " warning took " << dt.InMilliseconds() << "ms"; | 612 << " warning took " << dt.InMilliseconds() << "ms"; |
688 bool recorded = true; | 613 bool recorded = true; |
689 if (interstitial_type_ == TYPE_MALWARE || | 614 if (interstitial_type_ == TYPE_MALWARE || |
(...skipping 14 matching lines...) Expand all Loading... | |
704 } else if (command == kLearnMoreCommand) { | 629 } else if (command == kLearnMoreCommand) { |
705 UMA_HISTOGRAM_MEDIUM_TIMES("SB2.MalwareInterstitialLearnMore", | 630 UMA_HISTOGRAM_MEDIUM_TIMES("SB2.MalwareInterstitialLearnMore", |
706 dt); | 631 dt); |
707 } else if (command == kNavigatedAwayMetaCommand) { | 632 } else if (command == kNavigatedAwayMetaCommand) { |
708 UMA_HISTOGRAM_MEDIUM_TIMES("SB2.MalwareInterstitialTimeClosed", dt); | 633 UMA_HISTOGRAM_MEDIUM_TIMES("SB2.MalwareInterstitialTimeClosed", dt); |
709 } else if (command == kExpandedSeeMoreCommand) { | 634 } else if (command == kExpandedSeeMoreCommand) { |
710 // Only record the expanded histogram once per display of the | 635 // Only record the expanded histogram once per display of the |
711 // interstitial. | 636 // interstitial. |
712 if (has_expanded_see_more_section_) | 637 if (has_expanded_see_more_section_) |
713 return; | 638 return; |
714 RecordUserAction(SHOW_ADVANCED); | |
715 UMA_HISTOGRAM_MEDIUM_TIMES("SB2.MalwareInterstitialTimeExpandedSeeMore", | 639 UMA_HISTOGRAM_MEDIUM_TIMES("SB2.MalwareInterstitialTimeExpandedSeeMore", |
716 dt); | 640 dt); |
717 has_expanded_see_more_section_ = true; | 641 has_expanded_see_more_section_ = true; |
718 // Expanding the "See More" section doesn't finish the interstitial, so | 642 // Expanding the "See More" section doesn't finish the interstitial, so |
719 // don't mark the reaction time as recorded. | 643 // don't mark the reaction time as recorded. |
720 recorded = false; | 644 recorded = false; |
721 } else { | 645 } else { |
722 recorded = false; | 646 recorded = false; |
723 } | 647 } |
724 } else { | 648 } else { |
725 // Same as above but for phishing warnings. | 649 // Same as above but for phishing warnings. |
726 if (command == kProceedCommand) { | 650 if (command == kProceedCommand) { |
727 UMA_HISTOGRAM_MEDIUM_TIMES("SB2.PhishingInterstitialTimeProceed", dt); | 651 UMA_HISTOGRAM_MEDIUM_TIMES("SB2.PhishingInterstitialTimeProceed", dt); |
728 } else if (command == kTakeMeBackCommand) { | 652 } else if (command == kTakeMeBackCommand) { |
729 UMA_HISTOGRAM_MEDIUM_TIMES("SB2.PhishingInterstitialTimeTakeMeBack", dt); | 653 UMA_HISTOGRAM_MEDIUM_TIMES("SB2.PhishingInterstitialTimeTakeMeBack", dt); |
730 } else if (command == kShowDiagnosticCommand) { | 654 } else if (command == kShowDiagnosticCommand) { |
731 UMA_HISTOGRAM_MEDIUM_TIMES("SB2.PhishingInterstitialTimeReportError", dt); | 655 UMA_HISTOGRAM_MEDIUM_TIMES("SB2.PhishingInterstitialTimeReportError", dt); |
732 } else if (command == kLearnMoreCommand) { | 656 } else if (command == kLearnMoreCommand) { |
733 UMA_HISTOGRAM_MEDIUM_TIMES("SB2.PhishingInterstitialTimeLearnMore", dt); | 657 UMA_HISTOGRAM_MEDIUM_TIMES("SB2.PhishingInterstitialTimeLearnMore", dt); |
734 } else if (command == kNavigatedAwayMetaCommand) { | 658 } else if (command == kNavigatedAwayMetaCommand) { |
735 UMA_HISTOGRAM_MEDIUM_TIMES("SB2.PhishingInterstitialTimeClosed", dt); | 659 UMA_HISTOGRAM_MEDIUM_TIMES("SB2.PhishingInterstitialTimeClosed", dt); |
736 } else if (command == kExpandedSeeMoreCommand) { | 660 } else if (command == kExpandedSeeMoreCommand) { |
737 // Only record the expanded histogram once per display of the | 661 // Only record the expanded histogram once per display of the |
738 // interstitial. | 662 // interstitial. |
739 if (has_expanded_see_more_section_) | 663 if (has_expanded_see_more_section_) |
740 return; | 664 return; |
741 RecordUserAction(SHOW_ADVANCED); | |
742 UMA_HISTOGRAM_MEDIUM_TIMES("SB2.PhishingInterstitialTimeExpandedSeeMore", | 665 UMA_HISTOGRAM_MEDIUM_TIMES("SB2.PhishingInterstitialTimeExpandedSeeMore", |
743 dt); | 666 dt); |
744 has_expanded_see_more_section_ = true; | 667 has_expanded_see_more_section_ = true; |
745 // Expanding the "See More" section doesn't finish the interstitial, so | 668 // Expanding the "See More" section doesn't finish the interstitial, so |
746 // don't mark the reaction time as recorded. | 669 // don't mark the reaction time as recorded. |
747 recorded = false; | 670 recorded = false; |
748 } else { | 671 } else { |
749 recorded = false; | 672 recorded = false; |
750 } | 673 } |
751 } | 674 } |
(...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
940 IDS_PHISHING_V3_PRIMARY_PARAGRAPH, | 863 IDS_PHISHING_V3_PRIMARY_PARAGRAPH, |
941 base::UTF8ToUTF16(url_.host()))); | 864 base::UTF8ToUTF16(url_.host()))); |
942 load_time_data->SetString( | 865 load_time_data->SetString( |
943 "explanationParagraph", | 866 "explanationParagraph", |
944 l10n_util::GetStringFUTF16(IDS_PHISHING_V3_EXPLANATION_PARAGRAPH, | 867 l10n_util::GetStringFUTF16(IDS_PHISHING_V3_EXPLANATION_PARAGRAPH, |
945 base::UTF8ToUTF16(url_.host()))); | 868 base::UTF8ToUTF16(url_.host()))); |
946 load_time_data->SetString( | 869 load_time_data->SetString( |
947 "finalParagraph", | 870 "finalParagraph", |
948 l10n_util::GetStringUTF16(IDS_PHISHING_V3_PROCEED_PARAGRAPH)); | 871 l10n_util::GetStringUTF16(IDS_PHISHING_V3_PROCEED_PARAGRAPH)); |
949 } | 872 } |
OLD | NEW |