Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(813)

Side by Side Diff: chrome/browser/safe_browsing/download_protection_service.cc

Issue 2601303002: Wireup SafeBrowsingNavigationObserverManager to help PPAPI download attribution (Closed)
Patch Set: add check for rfh Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 #include "chrome/browser/safe_browsing/download_protection_service.h" 5 #include "chrome/browser/safe_browsing/download_protection_service.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include <memory> 9 #include <memory>
10 10
(...skipping 1212 matching lines...) Expand 10 before | Expand all | Expand 10 after
1223 TIMEDOUT, 1223 TIMEDOUT,
1224 WHITELIST_HIT, 1224 WHITELIST_HIT,
1225 REQUEST_MALFORMED, 1225 REQUEST_MALFORMED,
1226 FETCH_FAILED, 1226 FETCH_FAILED,
1227 RESPONSE_MALFORMED, 1227 RESPONSE_MALFORMED,
1228 SUCCEEDED 1228 SUCCEEDED
1229 }; 1229 };
1230 1230
1231 PPAPIDownloadRequest( 1231 PPAPIDownloadRequest(
1232 const GURL& requestor_url, 1232 const GURL& requestor_url,
1233 const GURL& initiating_frame_url,
1234 content::WebContents* web_contents,
1233 const base::FilePath& default_file_path, 1235 const base::FilePath& default_file_path,
1234 const std::vector<base::FilePath::StringType>& alternate_extensions, 1236 const std::vector<base::FilePath::StringType>& alternate_extensions,
1235 Profile* profile, 1237 Profile* profile,
1236 const CheckDownloadCallback& callback, 1238 const CheckDownloadCallback& callback,
1237 DownloadProtectionService* service, 1239 DownloadProtectionService* service,
1238 scoped_refptr<SafeBrowsingDatabaseManager> database_manager) 1240 scoped_refptr<SafeBrowsingDatabaseManager> database_manager)
1239 : requestor_url_(requestor_url), 1241 : requestor_url_(requestor_url),
1242 initiating_frame_url_(initiating_frame_url),
1243 tab_id_(SessionTabHelper::IdForTab(web_contents)),
1240 default_file_path_(default_file_path), 1244 default_file_path_(default_file_path),
1241 alternate_extensions_(alternate_extensions), 1245 alternate_extensions_(alternate_extensions),
1242 callback_(callback), 1246 callback_(callback),
1243 service_(service), 1247 service_(service),
1244 database_manager_(database_manager), 1248 database_manager_(database_manager),
1245 start_time_(base::TimeTicks::Now()), 1249 start_time_(base::TimeTicks::Now()),
1246 supported_path_( 1250 supported_path_(
1247 GetSupportedFilePath(default_file_path, alternate_extensions)), 1251 GetSupportedFilePath(default_file_path, alternate_extensions)),
1248 weakptr_factory_(this) { 1252 weakptr_factory_(this) {
1249 DCHECK(profile); 1253 DCHECK(profile);
1250 is_extended_reporting_ = IsExtendedReportingEnabled(*profile->GetPrefs()); 1254 is_extended_reporting_ = IsExtendedReportingEnabled(*profile->GetPrefs());
1255
1256 if (service->navigation_observer_manager()) {
1257 has_user_gesture_ =
1258 service->navigation_observer_manager()->HasUserGesture(web_contents);
1259 if (has_user_gesture_) {
1260 service->navigation_observer_manager()->OnUserGestureConsumed(
1261 web_contents, base::Time::Now());
1262 }
1263 }
1251 } 1264 }
1252 1265
1253 ~PPAPIDownloadRequest() override { 1266 ~PPAPIDownloadRequest() override {
1254 if (fetcher_ && !callback_.is_null()) 1267 if (fetcher_ && !callback_.is_null())
1255 Finish(RequestOutcome::REQUEST_DESTROYED, UNKNOWN); 1268 Finish(RequestOutcome::REQUEST_DESTROYED, UNKNOWN);
1256 } 1269 }
1257 1270
1258 // Start the process of checking the download request. The callback passed as 1271 // Start the process of checking the download request. The callback passed as
1259 // the |callback| parameter to the constructor will be invoked with the result 1272 // the |callback| parameter to the constructor will be invoked with the result
1260 // of the check at some point in the future. 1273 // of the check at some point in the future.
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
1352 continue; 1365 continue;
1353 DCHECK_EQ(base::FilePath::kExtensionSeparator, alternate_extension[0]); 1366 DCHECK_EQ(base::FilePath::kExtensionSeparator, alternate_extension[0]);
1354 *(request.add_alternate_extensions()) = 1367 *(request.add_alternate_extensions()) =
1355 base::FilePath(alternate_extension).AsUTF8Unsafe(); 1368 base::FilePath(alternate_extension).AsUTF8Unsafe();
1356 } 1369 }
1357 if (supported_path_ != default_file_path_) { 1370 if (supported_path_ != default_file_path_) {
1358 *(request.add_alternate_extensions()) = 1371 *(request.add_alternate_extensions()) =
1359 base::FilePath(default_file_path_.FinalExtension()).AsUTF8Unsafe(); 1372 base::FilePath(default_file_path_.FinalExtension()).AsUTF8Unsafe();
1360 } 1373 }
1361 1374
1362 // TODO(676691): We should add reliable download referrer chain for PPAPI 1375 service_->AddReferrerChainToPPAPIClientDownloadRequest(
1363 // downloads too. 1376 initiating_frame_url_,
1377 tab_id_,
1378 has_user_gesture_,
1379 &request);
1364 1380
1365 if (!request.SerializeToString(&client_download_request_data_)) { 1381 if (!request.SerializeToString(&client_download_request_data_)) {
1366 // More of an internal error than anything else. Note that the UNKNOWN 1382 // More of an internal error than anything else. Note that the UNKNOWN
1367 // verdict gets interpreted as "allowed". 1383 // verdict gets interpreted as "allowed".
1368 Finish(RequestOutcome::REQUEST_MALFORMED, UNKNOWN); 1384 Finish(RequestOutcome::REQUEST_MALFORMED, UNKNOWN);
1369 return; 1385 return;
1370 } 1386 }
1371 1387
1372 service_->ppapi_download_request_callbacks_.Notify(&request); 1388 service_->ppapi_download_request_callbacks_.Notify(&request);
1373 DVLOG(2) << "Sending a PPAPI download request for URL: " << request.url(); 1389 DVLOG(2) << "Sending a PPAPI download request for URL: " << request.url();
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
1477 1493
1478 return base::FilePath(); 1494 return base::FilePath();
1479 } 1495 }
1480 1496
1481 std::unique_ptr<net::URLFetcher> fetcher_; 1497 std::unique_ptr<net::URLFetcher> fetcher_;
1482 std::string client_download_request_data_; 1498 std::string client_download_request_data_;
1483 1499
1484 // URL of document that requested the PPAPI download. 1500 // URL of document that requested the PPAPI download.
1485 const GURL requestor_url_; 1501 const GURL requestor_url_;
1486 1502
1503 // URL of the frame that hosted the PPAPI plugin.
1504 const GURL initiating_frame_url_;
1505
1506 // Tab id that associated with the PPAPI plugin, computed by
1507 // SessionTabHelper::IdForTab().
1508 int tab_id_;
1509
1510 // If the user interacted with this PPAPI plugin to trigger the download.
1511 bool has_user_gesture_;
1512
1487 // Default download path requested by the PPAPI plugin. 1513 // Default download path requested by the PPAPI plugin.
1488 const base::FilePath default_file_path_; 1514 const base::FilePath default_file_path_;
1489 1515
1490 // List of alternate extensions provided by the PPAPI plugin. Each extension 1516 // List of alternate extensions provided by the PPAPI plugin. Each extension
1491 // must begin with a leading extension separator. 1517 // must begin with a leading extension separator.
1492 const std::vector<base::FilePath::StringType> alternate_extensions_; 1518 const std::vector<base::FilePath::StringType> alternate_extensions_;
1493 1519
1494 // Callback to invoke with the result of the PPAPI download request check. 1520 // Callback to invoke with the result of the PPAPI download request check.
1495 CheckDownloadCallback callback_; 1521 CheckDownloadCallback callback_;
1496 1522
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
1607 ClientDownloadRequest::WIN_EXECUTABLE; 1633 ClientDownloadRequest::WIN_EXECUTABLE;
1608 // TODO(nparker): Remove the CRX check here once can support 1634 // TODO(nparker): Remove the CRX check here once can support
1609 // UNKNOWN types properly. http://crbug.com/581044 1635 // UNKNOWN types properly. http://crbug.com/581044
1610 return (CheckClientDownloadRequest::IsSupportedDownload( 1636 return (CheckClientDownloadRequest::IsSupportedDownload(
1611 item, target_path, &reason, &type) && 1637 item, target_path, &reason, &type) &&
1612 (ClientDownloadRequest::CHROME_EXTENSION != type)); 1638 (ClientDownloadRequest::CHROME_EXTENSION != type));
1613 } 1639 }
1614 1640
1615 void DownloadProtectionService::CheckPPAPIDownloadRequest( 1641 void DownloadProtectionService::CheckPPAPIDownloadRequest(
1616 const GURL& requestor_url, 1642 const GURL& requestor_url,
1643 const GURL& initiating_frame_url,
1644 content::WebContents* web_contents,
1617 const base::FilePath& default_file_path, 1645 const base::FilePath& default_file_path,
1618 const std::vector<base::FilePath::StringType>& alternate_extensions, 1646 const std::vector<base::FilePath::StringType>& alternate_extensions,
1619 Profile* profile, 1647 Profile* profile,
1620 const CheckDownloadCallback& callback) { 1648 const CheckDownloadCallback& callback) {
1621 DVLOG(1) << __func__ << " url:" << requestor_url 1649 DVLOG(1) << __func__ << " url:" << requestor_url
1622 << " default_file_path:" << default_file_path.value(); 1650 << " default_file_path:" << default_file_path.value();
1623 std::unique_ptr<PPAPIDownloadRequest> request(new PPAPIDownloadRequest( 1651 std::unique_ptr<PPAPIDownloadRequest> request(new PPAPIDownloadRequest(
1624 requestor_url, default_file_path, alternate_extensions, profile, callback, 1652 requestor_url, initiating_frame_url, web_contents, default_file_path,
1625 this, database_manager_)); 1653 alternate_extensions, profile, callback, this, database_manager_));
1626 PPAPIDownloadRequest* request_copy = request.get(); 1654 PPAPIDownloadRequest* request_copy = request.get();
1627 auto insertion_result = ppapi_download_requests_.insert( 1655 auto insertion_result = ppapi_download_requests_.insert(
1628 std::make_pair(request_copy, std::move(request))); 1656 std::make_pair(request_copy, std::move(request)));
1629 DCHECK(insertion_result.second); 1657 DCHECK(insertion_result.second);
1630 insertion_result.first->second->Start(); 1658 insertion_result.first->second->Start();
1631 } 1659 }
1632 1660
1633 DownloadProtectionService::ClientDownloadRequestSubscription 1661 DownloadProtectionService::ClientDownloadRequestSubscription
1634 DownloadProtectionService::RegisterClientDownloadRequestCallback( 1662 DownloadProtectionService::RegisterClientDownloadRequestCallback(
1635 const ClientDownloadRequestCallback& callback) { 1663 const ClientDownloadRequestCallback& callback) {
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after
1801 !navigation_observer_manager_) { 1829 !navigation_observer_manager_) {
1802 return; 1830 return;
1803 } 1831 }
1804 1832
1805 int download_tab_id = SessionTabHelper::IdForTab(web_contents); 1833 int download_tab_id = SessionTabHelper::IdForTab(web_contents);
1806 UMA_HISTOGRAM_BOOLEAN( 1834 UMA_HISTOGRAM_BOOLEAN(
1807 "SafeBrowsing.ReferrerHasInvalidTabID.DownloadAttribution", 1835 "SafeBrowsing.ReferrerHasInvalidTabID.DownloadAttribution",
1808 download_tab_id == -1); 1836 download_tab_id == -1);
1809 std::vector<ReferrerChainEntry> attribution_chain; 1837 std::vector<ReferrerChainEntry> attribution_chain;
1810 SafeBrowsingNavigationObserverManager::AttributionResult result = 1838 SafeBrowsingNavigationObserverManager::AttributionResult result =
1811 navigation_observer_manager_->IdentifyReferrerChain( 1839 navigation_observer_manager_->IdentifyReferrerChainForDownload(
1812 download_url, 1840 download_url,
1813 download_tab_id, 1841 download_tab_id,
1814 kDownloadAttributionUserGestureLimit, 1842 kDownloadAttributionUserGestureLimit,
1815 &attribution_chain); 1843 &attribution_chain);
1816 UMA_HISTOGRAM_COUNTS_100( 1844 UMA_HISTOGRAM_COUNTS_100(
1817 "SafeBrowsing.ReferrerURLChainSize.DownloadAttribution", 1845 "SafeBrowsing.ReferrerURLChainSize.DownloadAttribution",
1818 attribution_chain.size()); 1846 attribution_chain.size());
1819 UMA_HISTOGRAM_ENUMERATION( 1847 UMA_HISTOGRAM_ENUMERATION(
1820 "SafeBrowsing.ReferrerAttributionResult.DownloadAttribution", result, 1848 "SafeBrowsing.ReferrerAttributionResult.DownloadAttribution", result,
1821 SafeBrowsingNavigationObserverManager::ATTRIBUTION_FAILURE_TYPE_MAX); 1849 SafeBrowsingNavigationObserverManager::ATTRIBUTION_FAILURE_TYPE_MAX);
1822 for (auto entry : attribution_chain) 1850 for (auto entry : attribution_chain)
1823 out_request->add_referrer_chain()->Swap(&entry); 1851 out_request->add_referrer_chain()->Swap(&entry);
1824 } 1852 }
1825 1853
1854 void DownloadProtectionService::AddReferrerChainToPPAPIClientDownloadRequest(
1855 const GURL& initiating_frame_url,
1856 int tab_id,
1857 bool has_user_gesture,
1858 ClientDownloadRequest* out_request) {
1859 if (!base::FeatureList::IsEnabled(
1860 SafeBrowsingNavigationObserverManager::kDownloadAttribution) ||
1861 !navigation_observer_manager_) {
1862 return;
1863 }
1864
1865 UMA_HISTOGRAM_BOOLEAN(
1866 "SafeBrowsing.ReferrerHasInvalidTabID.DownloadAttribution",
1867 tab_id == -1);
1868 std::vector<ReferrerChainEntry> attribution_chain;
1869 SafeBrowsingNavigationObserverManager::AttributionResult result =
1870 navigation_observer_manager_->IdentifyReferrerChainForPPAPIDownload(
1871 initiating_frame_url,
1872 tab_id,
1873 has_user_gesture,
1874 kDownloadAttributionUserGestureLimit,
1875 &attribution_chain);
1876 UMA_HISTOGRAM_COUNTS_100(
1877 "SafeBrowsing.ReferrerURLChainSize.PPAPIDownloadAttribution",
1878 attribution_chain.size());
1879 UMA_HISTOGRAM_ENUMERATION(
1880 "SafeBrowsing.ReferrerAttributionResult.PPAPIDownloadAttribution", result,
1881 SafeBrowsingNavigationObserverManager::ATTRIBUTION_FAILURE_TYPE_MAX);
1882 for (auto entry : attribution_chain)
1883 out_request->add_referrer_chain()->Swap(&entry);
1884 }
1885
1826 } // namespace safe_browsing 1886 } // namespace safe_browsing
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698