| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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/safe_browsing/safe_browsing_navigation_observer_manager
.h" | 5 #include "chrome/browser/safe_browsing/safe_browsing_navigation_observer_manager
.h" |
| 6 | 6 |
| 7 #include "base/memory/ptr_util.h" | 7 #include "base/memory/ptr_util.h" |
| 8 #include "base/metrics/histogram_macros.h" | 8 #include "base/metrics/histogram_macros.h" |
| 9 #include "base/strings/stringprintf.h" | 9 #include "base/strings/stringprintf.h" |
| 10 #include "base/time/time.h" | 10 #include "base/time/time.h" |
| 11 #include "base/timer/timer.h" | 11 #include "base/timer/timer.h" |
| 12 #include "chrome/browser/browser_process.h" |
| 12 #include "chrome/browser/chrome_notification_types.h" | 13 #include "chrome/browser/chrome_notification_types.h" |
| 14 #include "chrome/browser/profiles/profile.h" |
| 13 #include "chrome/browser/safe_browsing/safe_browsing_navigation_observer.h" | 15 #include "chrome/browser/safe_browsing/safe_browsing_navigation_observer.h" |
| 16 #include "chrome/browser/safe_browsing/safe_browsing_service.h" |
| 14 #include "chrome/browser/sessions/session_tab_helper.h" | 17 #include "chrome/browser/sessions/session_tab_helper.h" |
| 15 #include "chrome/browser/tab_contents/retargeting_details.h" | 18 #include "chrome/browser/tab_contents/retargeting_details.h" |
| 19 #include "chrome/common/pref_names.h" |
| 20 #include "components/prefs/pref_service.h" |
| 16 #include "content/public/browser/navigation_details.h" | 21 #include "content/public/browser/navigation_details.h" |
| 17 #include "content/public/browser/notification_service.h" | 22 #include "content/public/browser/notification_service.h" |
| 18 #include "content/public/browser/notification_types.h" | 23 #include "content/public/browser/notification_types.h" |
| 19 #include "content/public/browser/render_frame_host.h" | 24 #include "content/public/browser/render_frame_host.h" |
| 20 #include "content/public/browser/render_process_host.h" | 25 #include "content/public/browser/render_process_host.h" |
| 21 #include "content/public/browser/web_contents.h" | 26 #include "content/public/browser/web_contents.h" |
| 22 | 27 |
| 23 using content::WebContents; | 28 using content::WebContents; |
| 24 | 29 |
| 25 namespace safe_browsing { | 30 namespace safe_browsing { |
| (...skipping 14 matching lines...) Expand all Loading... |
| 40 } // namespace | 45 } // namespace |
| 41 | 46 |
| 42 // The expiration period of a user gesture. Any user gesture that happened 1.0 | 47 // The expiration period of a user gesture. Any user gesture that happened 1.0 |
| 43 // second ago is considered as expired and not relevant to upcoming navigation | 48 // second ago is considered as expired and not relevant to upcoming navigation |
| 44 // events. | 49 // events. |
| 45 static const double kUserGestureTTLInSecond = 1.0; | 50 static const double kUserGestureTTLInSecond = 1.0; |
| 46 // The expiration period of navigation events and resolved IP addresses. Any | 51 // The expiration period of navigation events and resolved IP addresses. Any |
| 47 // navigation related records that happened 2 minutes ago are considered as | 52 // navigation related records that happened 2 minutes ago are considered as |
| 48 // expired. So we clean up these navigation footprints every 2 minutes. | 53 // expired. So we clean up these navigation footprints every 2 minutes. |
| 49 static const double kNavigationFootprintTTLInSecond = 120.0; | 54 static const double kNavigationFootprintTTLInSecond = 120.0; |
| 50 // The number of user gestures we trace back for download attribution. | |
| 51 static const int kDownloadAttributionUserGestureLimit = 2; | |
| 52 | 55 |
| 53 // static | 56 // static |
| 57 const base::Feature |
| 58 SafeBrowsingNavigationObserverManager::kDownloadAttribution { |
| 59 "DownloadAttribution", base::FEATURE_DISABLED_BY_DEFAULT |
| 60 }; |
| 61 // static |
| 54 bool SafeBrowsingNavigationObserverManager::IsUserGestureExpired( | 62 bool SafeBrowsingNavigationObserverManager::IsUserGestureExpired( |
| 55 const base::Time& timestamp) { | 63 const base::Time& timestamp) { |
| 56 return IsEventExpired(timestamp, kUserGestureTTLInSecond); | 64 return IsEventExpired(timestamp, kUserGestureTTLInSecond); |
| 57 } | 65 } |
| 58 | 66 |
| 59 // static | 67 // static |
| 60 GURL SafeBrowsingNavigationObserverManager::ClearEmptyRef(const GURL& url) { | 68 GURL SafeBrowsingNavigationObserverManager::ClearEmptyRef(const GURL& url) { |
| 61 if (url.has_ref() && url.ref().empty()) { | 69 if (url.has_ref() && url.ref().empty()) { |
| 62 url::Replacements<char> replacements; | 70 url::Replacements<char> replacements; |
| 63 replacements.ClearRef(); | 71 replacements.ClearRef(); |
| 64 return url.ReplaceComponents(replacements); | 72 return url.ReplaceComponents(replacements); |
| 65 } | 73 } |
| 66 return url; | 74 return url; |
| 67 } | 75 } |
| 68 | 76 |
| 77 // static |
| 78 bool SafeBrowsingNavigationObserverManager::IsEnabledAndReady( |
| 79 Profile* profile) { |
| 80 return base::FeatureList::IsEnabled( |
| 81 SafeBrowsingNavigationObserverManager::kDownloadAttribution) && |
| 82 profile->GetPrefs()->GetBoolean(prefs::kSafeBrowsingEnabled) && |
| 83 g_browser_process->safe_browsing_service() && |
| 84 g_browser_process->safe_browsing_service()->navigation_observer_manager(); |
| 85 } |
| 86 |
| 69 SafeBrowsingNavigationObserverManager::SafeBrowsingNavigationObserverManager() { | 87 SafeBrowsingNavigationObserverManager::SafeBrowsingNavigationObserverManager() { |
| 70 registrar_.Add(this, chrome::NOTIFICATION_RETARGETING, | 88 registrar_.Add(this, chrome::NOTIFICATION_RETARGETING, |
| 71 content::NotificationService::AllSources()); | 89 content::NotificationService::AllSources()); |
| 72 | 90 |
| 73 // TODO(jialiul): call ScheduleNextCleanUpAfterInterval() when this class is | 91 // Schedule clean up in 2 minutes. |
| 74 // ready to be hooked into SafeBrowsingService. | 92 ScheduleNextCleanUpAfterInterval( |
| 93 base::TimeDelta::FromSecondsD(kNavigationFootprintTTLInSecond)); |
| 75 } | 94 } |
| 76 | 95 |
| 77 void SafeBrowsingNavigationObserverManager::RecordNavigationEvent( | 96 void SafeBrowsingNavigationObserverManager::RecordNavigationEvent( |
| 78 const GURL& nav_event_key, | 97 const GURL& nav_event_key, |
| 79 NavigationEvent* nav_event) { | 98 NavigationEvent* nav_event) { |
| 80 auto insertion_result = navigation_map_.insert( | 99 auto insertion_result = navigation_map_.insert( |
| 81 std::make_pair(nav_event_key, std::vector<NavigationEvent>())); | 100 std::make_pair(nav_event_key, std::vector<NavigationEvent>())); |
| 82 | 101 |
| 83 insertion_result.first->second.push_back(std::move(*nav_event)); | 102 insertion_result.first->second.push_back(std::move(*nav_event)); |
| 84 } | 103 } |
| (...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 201 AddToReferrerChain(out_referrer_chain, nav_event, | 220 AddToReferrerChain(out_referrer_chain, nav_event, |
| 202 ReferrerChainEntry::LANDING_REFERRER); | 221 ReferrerChainEntry::LANDING_REFERRER); |
| 203 result = SUCCESS_LANDING_REFERRER; | 222 result = SUCCESS_LANDING_REFERRER; |
| 204 } else { | 223 } else { |
| 205 NOTREACHED(); | 224 NOTREACHED(); |
| 206 } | 225 } |
| 207 } | 226 } |
| 208 return result; | 227 return result; |
| 209 } | 228 } |
| 210 | 229 |
| 211 void SafeBrowsingNavigationObserverManager:: | |
| 212 AddReferrerChainToClientDownloadRequest( | |
| 213 const GURL& download_url, | |
| 214 content::WebContents* source_contents, | |
| 215 ClientDownloadRequest* out_request) { | |
| 216 int download_tab_id = SessionTabHelper::IdForTab(source_contents); | |
| 217 UMA_HISTOGRAM_BOOLEAN( | |
| 218 "SafeBrowsing.ReferrerHasInvalidTabID.DownloadAttribution", | |
| 219 download_tab_id == -1); | |
| 220 std::vector<ReferrerChainEntry> attribution_chain; | |
| 221 AttributionResult result = IdentifyReferrerChain( | |
| 222 download_url, download_tab_id, kDownloadAttributionUserGestureLimit, | |
| 223 &attribution_chain); | |
| 224 UMA_HISTOGRAM_COUNTS_100( | |
| 225 "SafeBrowsing.ReferrerURLChainSize.DownloadAttribution", | |
| 226 attribution_chain.size()); | |
| 227 UMA_HISTOGRAM_ENUMERATION( | |
| 228 "SafeBrowsing.ReferrerAttributionResult.DownloadAttribution", result, | |
| 229 SafeBrowsingNavigationObserverManager::ATTRIBUTION_FAILURE_TYPE_MAX); | |
| 230 for (auto entry : attribution_chain) | |
| 231 *out_request->add_referrer_chain() = entry; | |
| 232 } | |
| 233 | |
| 234 SafeBrowsingNavigationObserverManager:: | 230 SafeBrowsingNavigationObserverManager:: |
| 235 ~SafeBrowsingNavigationObserverManager() {} | 231 ~SafeBrowsingNavigationObserverManager() {} |
| 236 | 232 |
| 237 void SafeBrowsingNavigationObserverManager::Observe( | 233 void SafeBrowsingNavigationObserverManager::Observe( |
| 238 int type, | 234 int type, |
| 239 const content::NotificationSource& source, | 235 const content::NotificationSource& source, |
| 240 const content::NotificationDetails& details) { | 236 const content::NotificationDetails& details) { |
| 241 if (type == chrome::NOTIFICATION_RETARGETING) | 237 if (type == chrome::NOTIFICATION_RETARGETING) |
| 242 RecordRetargeting(details); | 238 RecordRetargeting(details); |
| 243 } | 239 } |
| (...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 395 nav_event->source_main_frame_url.spec()); | 391 nav_event->source_main_frame_url.spec()); |
| 396 } | 392 } |
| 397 referrer_chain_entry.set_is_retargeting(nav_event->source_tab_id != | 393 referrer_chain_entry.set_is_retargeting(nav_event->source_tab_id != |
| 398 nav_event->target_tab_id); | 394 nav_event->target_tab_id); |
| 399 referrer_chain_entry.set_navigation_time_msec( | 395 referrer_chain_entry.set_navigation_time_msec( |
| 400 nav_event->last_updated.ToJavaTime()); | 396 nav_event->last_updated.ToJavaTime()); |
| 401 referrer_chain->push_back(referrer_chain_entry); | 397 referrer_chain->push_back(referrer_chain_entry); |
| 402 } | 398 } |
| 403 | 399 |
| 404 } // namespace safe_browsing | 400 } // namespace safe_browsing |
| OLD | NEW |