| Index: chrome/browser/safe_browsing/safe_browsing_navigation_observer_manager.cc | 
| diff --git a/chrome/browser/safe_browsing/safe_browsing_navigation_observer_manager.cc b/chrome/browser/safe_browsing/safe_browsing_navigation_observer_manager.cc | 
| index 989f7d61eeea3d07bb96d6bae1f4048edbd7b7b8..0d14f782777934a9c1bd803b3106d17f4901fd4d 100644 | 
| --- a/chrome/browser/safe_browsing/safe_browsing_navigation_observer_manager.cc | 
| +++ b/chrome/browser/safe_browsing/safe_browsing_navigation_observer_manager.cc | 
| @@ -9,10 +9,15 @@ | 
| #include "base/strings/stringprintf.h" | 
| #include "base/time/time.h" | 
| #include "base/timer/timer.h" | 
| +#include "chrome/browser/browser_process.h" | 
| #include "chrome/browser/chrome_notification_types.h" | 
| +#include "chrome/browser/profiles/profile.h" | 
| #include "chrome/browser/safe_browsing/safe_browsing_navigation_observer.h" | 
| +#include "chrome/browser/safe_browsing/safe_browsing_service.h" | 
| #include "chrome/browser/sessions/session_tab_helper.h" | 
| #include "chrome/browser/tab_contents/retargeting_details.h" | 
| +#include "chrome/common/pref_names.h" | 
| +#include "components/prefs/pref_service.h" | 
| #include "content/public/browser/navigation_details.h" | 
| #include "content/public/browser/notification_service.h" | 
| #include "content/public/browser/notification_types.h" | 
| @@ -47,10 +52,13 @@ static const double kUserGestureTTLInSecond = 1.0; | 
| // navigation related records that happened 2 minutes ago are considered as | 
| // expired. So we clean up these navigation footprints every 2 minutes. | 
| static const double kNavigationFootprintTTLInSecond = 120.0; | 
| -// The number of user gestures we trace back for download attribution. | 
| -static const int kDownloadAttributionUserGestureLimit = 2; | 
|  | 
| // static | 
| +const base::Feature | 
| +SafeBrowsingNavigationObserverManager::kDownloadAttribution { | 
| +    "DownloadAttribution", base::FEATURE_DISABLED_BY_DEFAULT | 
| +}; | 
| +// static | 
| bool SafeBrowsingNavigationObserverManager::IsUserGestureExpired( | 
| const base::Time& timestamp) { | 
| return IsEventExpired(timestamp, kUserGestureTTLInSecond); | 
| @@ -66,12 +74,23 @@ GURL SafeBrowsingNavigationObserverManager::ClearEmptyRef(const GURL& url) { | 
| return url; | 
| } | 
|  | 
| +// static | 
| +bool SafeBrowsingNavigationObserverManager::IsEnabledAndReady( | 
| +    Profile* profile) { | 
| +  return base::FeatureList::IsEnabled( | 
| +      SafeBrowsingNavigationObserverManager::kDownloadAttribution) && | 
| +      profile->GetPrefs()->GetBoolean(prefs::kSafeBrowsingEnabled) && | 
| +      g_browser_process->safe_browsing_service() && | 
| +      g_browser_process->safe_browsing_service()->navigation_observer_manager(); | 
| +} | 
| + | 
| SafeBrowsingNavigationObserverManager::SafeBrowsingNavigationObserverManager() { | 
| registrar_.Add(this, chrome::NOTIFICATION_RETARGETING, | 
| content::NotificationService::AllSources()); | 
|  | 
| -  // TODO(jialiul): call ScheduleNextCleanUpAfterInterval() when this class is | 
| -  // ready to be hooked into SafeBrowsingService. | 
| +  // Schedule clean up in 2 minutes. | 
| +  ScheduleNextCleanUpAfterInterval( | 
| +      base::TimeDelta::FromSecondsD(kNavigationFootprintTTLInSecond)); | 
| } | 
|  | 
| void SafeBrowsingNavigationObserverManager::RecordNavigationEvent( | 
| @@ -208,29 +227,6 @@ SafeBrowsingNavigationObserverManager::IdentifyReferrerChain( | 
| return result; | 
| } | 
|  | 
| -void SafeBrowsingNavigationObserverManager:: | 
| -    AddReferrerChainToClientDownloadRequest( | 
| -        const GURL& download_url, | 
| -        content::WebContents* source_contents, | 
| -        ClientDownloadRequest* out_request) { | 
| -  int download_tab_id = SessionTabHelper::IdForTab(source_contents); | 
| -  UMA_HISTOGRAM_BOOLEAN( | 
| -      "SafeBrowsing.ReferrerHasInvalidTabID.DownloadAttribution", | 
| -      download_tab_id == -1); | 
| -  std::vector<ReferrerChainEntry> attribution_chain; | 
| -  AttributionResult result = IdentifyReferrerChain( | 
| -      download_url, download_tab_id, kDownloadAttributionUserGestureLimit, | 
| -      &attribution_chain); | 
| -  UMA_HISTOGRAM_COUNTS_100( | 
| -      "SafeBrowsing.ReferrerURLChainSize.DownloadAttribution", | 
| -      attribution_chain.size()); | 
| -  UMA_HISTOGRAM_ENUMERATION( | 
| -      "SafeBrowsing.ReferrerAttributionResult.DownloadAttribution", result, | 
| -      SafeBrowsingNavigationObserverManager::ATTRIBUTION_FAILURE_TYPE_MAX); | 
| -  for (auto entry : attribution_chain) | 
| -    *out_request->add_referrer_chain() = entry; | 
| -} | 
| - | 
| SafeBrowsingNavigationObserverManager:: | 
| ~SafeBrowsingNavigationObserverManager() {} | 
|  | 
|  |