Chromium Code Reviews| Index: chrome/browser/safe_browsing/download_protection_service.cc |
| diff --git a/chrome/browser/safe_browsing/download_protection_service.cc b/chrome/browser/safe_browsing/download_protection_service.cc |
| index cc34930f95ae5da4d718050233bcc952f30bcbf4..861c85f2a7c26c89829f8fce9b65dab4aa4bca7e 100644 |
| --- a/chrome/browser/safe_browsing/download_protection_service.cc |
| +++ b/chrome/browser/safe_browsing/download_protection_service.cc |
| @@ -1230,6 +1230,8 @@ class DownloadProtectionService::PPAPIDownloadRequest |
| PPAPIDownloadRequest( |
| const GURL& requestor_url, |
| + const GURL& initiating_frame_url, |
| + content::WebContents* web_contents, |
| const base::FilePath& default_file_path, |
| const std::vector<base::FilePath::StringType>& alternate_extensions, |
| Profile* profile, |
| @@ -1237,6 +1239,8 @@ class DownloadProtectionService::PPAPIDownloadRequest |
| DownloadProtectionService* service, |
| scoped_refptr<SafeBrowsingDatabaseManager> database_manager) |
| : requestor_url_(requestor_url), |
| + initiating_frame_url_(initiating_frame_url), |
| + web_contents_(web_contents), |
|
asanka
2017/01/05 18:00:44
not safe to store web_contents without observing i
Jialiu Lin
2017/01/05 20:12:21
Though my current code can work with null web_cont
asanka
2017/01/05 20:35:31
Cool. Though my worry here was that web_contents_
Jialiu Lin
2017/01/05 22:10:12
We can probably trust WebContents::FromRenderFrame
|
| default_file_path_(default_file_path), |
| alternate_extensions_(alternate_extensions), |
| callback_(callback), |
| @@ -1359,8 +1363,10 @@ class DownloadProtectionService::PPAPIDownloadRequest |
| base::FilePath(default_file_path_.FinalExtension()).AsUTF8Unsafe(); |
| } |
| - // TODO(676691): We should add reliable download referrer chain for PPAPI |
| - // downloads too. |
| + service_->AddReferrerChainToPPAPIClientDownloadRequest( |
| + initiating_frame_url_, |
| + web_contents_, |
| + &request); |
| if (!request.SerializeToString(&client_download_request_data_)) { |
| // More of an internal error than anything else. Note that the UNKNOWN |
| @@ -1484,6 +1490,12 @@ class DownloadProtectionService::PPAPIDownloadRequest |
| // URL of document that requested the PPAPI download. |
| const GURL requestor_url_; |
| + // URL of the frame that hosted the PPAPI plugin. |
| + const GURL initiating_frame_url_; |
| + |
| + // WebContents that is associated with this PPAPI download. |
| + content::WebContents* web_contents_; |
| + |
| // Default download path requested by the PPAPI plugin. |
| const base::FilePath default_file_path_; |
| @@ -1614,6 +1626,8 @@ bool DownloadProtectionService::IsSupportedDownload( |
| void DownloadProtectionService::CheckPPAPIDownloadRequest( |
| const GURL& requestor_url, |
| + const GURL& initiating_frame_url, |
| + content::WebContents* web_contents, |
| const base::FilePath& default_file_path, |
| const std::vector<base::FilePath::StringType>& alternate_extensions, |
| Profile* profile, |
| @@ -1621,8 +1635,8 @@ void DownloadProtectionService::CheckPPAPIDownloadRequest( |
| DVLOG(1) << __func__ << " url:" << requestor_url |
| << " default_file_path:" << default_file_path.value(); |
| std::unique_ptr<PPAPIDownloadRequest> request(new PPAPIDownloadRequest( |
| - requestor_url, default_file_path, alternate_extensions, profile, callback, |
| - this, database_manager_)); |
| + requestor_url, initiating_frame_url, web_contents, default_file_path, |
| + alternate_extensions, profile, callback, this, database_manager_)); |
| PPAPIDownloadRequest* request_copy = request.get(); |
| auto insertion_result = ppapi_download_requests_.insert( |
| std::make_pair(request_copy, std::move(request))); |
| @@ -1808,7 +1822,7 @@ void DownloadProtectionService::AddReferrerChainToClientDownloadRequest( |
| download_tab_id == -1); |
| std::vector<ReferrerChainEntry> attribution_chain; |
| SafeBrowsingNavigationObserverManager::AttributionResult result = |
| - navigation_observer_manager_->IdentifyReferrerChain( |
| + navigation_observer_manager_->IdentifyReferrerChainForDownload( |
| download_url, |
| download_tab_id, |
| kDownloadAttributionUserGestureLimit, |
| @@ -1823,4 +1837,31 @@ void DownloadProtectionService::AddReferrerChainToClientDownloadRequest( |
| out_request->add_referrer_chain()->Swap(&entry); |
| } |
| +void DownloadProtectionService::AddReferrerChainToPPAPIClientDownloadRequest( |
| + const GURL& initiating_frame_url, |
| + content::WebContents* web_contents, |
| + ClientDownloadRequest* out_request) { |
| + if (!base::FeatureList::IsEnabled( |
| + SafeBrowsingNavigationObserverManager::kDownloadAttribution) || |
| + !navigation_observer_manager_) { |
| + return; |
| + } |
| + |
| + std::vector<ReferrerChainEntry> attribution_chain; |
| + SafeBrowsingNavigationObserverManager::AttributionResult result = |
| + navigation_observer_manager_->IdentifyReferrerChainForPPAPIDownload( |
| + initiating_frame_url, |
| + web_contents, |
| + kDownloadAttributionUserGestureLimit, |
| + &attribution_chain); |
| + UMA_HISTOGRAM_COUNTS_100( |
| + "SafeBrowsing.ReferrerURLChainSize.PPAPIDownloadAttribution", |
| + attribution_chain.size()); |
| + UMA_HISTOGRAM_ENUMERATION( |
| + "SafeBrowsing.ReferrerAttributionResult.PPAPIDownloadAttribution", result, |
| + SafeBrowsingNavigationObserverManager::ATTRIBUTION_FAILURE_TYPE_MAX); |
| + for (auto entry : attribution_chain) |
| + out_request->add_referrer_chain()->Swap(&entry); |
| +} |
| + |
| } // namespace safe_browsing |