| Index: chrome/browser/safe_browsing/client_side_detection_service.cc
|
| diff --git a/chrome/browser/safe_browsing/client_side_detection_service.cc b/chrome/browser/safe_browsing/client_side_detection_service.cc
|
| index e3b6803fdbb5ad5c5aab8c092ee072dd9a931482..c87885f610cb9048a661862fc44058f46c6ebdf1 100644
|
| --- a/chrome/browser/safe_browsing/client_side_detection_service.cc
|
| +++ b/chrome/browser/safe_browsing/client_side_detection_service.cc
|
| @@ -10,6 +10,7 @@
|
| #include "base/bind.h"
|
| #include "base/location.h"
|
| #include "base/logging.h"
|
| +#include "base/memory/ptr_util.h"
|
| #include "base/metrics/histogram.h"
|
| #include "base/metrics/sparse_histogram.h"
|
| #include "base/single_thread_task_runner.h"
|
| @@ -74,12 +75,14 @@ const char ClientSideDetectionService::kClientReportPhishingUrl[] =
|
| const char ClientSideDetectionService::kClientReportMalwareUrl[] =
|
| "https://sb-ssl.google.com/safebrowsing/clientreport/malware-check";
|
|
|
| -struct ClientSideDetectionService::ClientReportInfo {
|
| +struct ClientSideDetectionService::ClientPhishingReportInfo {
|
| + std::unique_ptr<net::URLFetcher> fetcher;
|
| ClientReportPhishingRequestCallback callback;
|
| GURL phishing_url;
|
| };
|
|
|
| struct ClientSideDetectionService::ClientMalwareReportInfo {
|
| + std::unique_ptr<net::URLFetcher> fetcher;
|
| ClientReportMalwareRequestCallback callback;
|
| // This is the original landing url, may not be the malware url.
|
| GURL original_url;
|
| @@ -108,12 +111,6 @@ ClientSideDetectionService::ClientSideDetectionService(
|
|
|
| ClientSideDetectionService::~ClientSideDetectionService() {
|
| weak_factory_.InvalidateWeakPtrs();
|
| - base::STLDeleteContainerPairPointers(client_phishing_reports_.begin(),
|
| - client_phishing_reports_.end());
|
| - client_phishing_reports_.clear();
|
| - base::STLDeleteContainerPairPointers(client_malware_reports_.begin(),
|
| - client_malware_reports_.end());
|
| - client_malware_reports_.clear();
|
| }
|
|
|
| // static
|
| @@ -142,25 +139,19 @@ void ClientSideDetectionService::SetEnabledAndRefreshState(bool enabled) {
|
| model_loader_standard_->CancelFetcher();
|
| model_loader_extended_->CancelFetcher();
|
| // Invoke pending callbacks with a false verdict.
|
| - for (std::map<const net::URLFetcher*, ClientReportInfo*>::iterator it =
|
| - client_phishing_reports_.begin();
|
| + for (auto it = client_phishing_reports_.begin();
|
| it != client_phishing_reports_.end(); ++it) {
|
| - ClientReportInfo* info = it->second;
|
| + ClientPhishingReportInfo* info = it->second.get();
|
| if (!info->callback.is_null())
|
| info->callback.Run(info->phishing_url, false);
|
| }
|
| - base::STLDeleteContainerPairPointers(client_phishing_reports_.begin(),
|
| - client_phishing_reports_.end());
|
| client_phishing_reports_.clear();
|
| - for (std::map<const net::URLFetcher*, ClientMalwareReportInfo*>::iterator it
|
| - = client_malware_reports_.begin();
|
| + for (auto it = client_malware_reports_.begin();
|
| it != client_malware_reports_.end(); ++it) {
|
| - ClientMalwareReportInfo* info = it->second;
|
| + ClientMalwareReportInfo* info = it->second.get();
|
| if (!info->callback.is_null())
|
| info->callback.Run(info->original_url, info->original_url, false);
|
| }
|
| - base::STLDeleteContainerPairPointers(client_malware_reports_.begin(),
|
| - client_malware_reports_.end());
|
| client_malware_reports_.clear();
|
| cache_.clear();
|
| }
|
| @@ -205,11 +196,10 @@ void ClientSideDetectionService::OnURLFetchComplete(
|
| std::string data;
|
| source->GetResponseAsString(&data);
|
|
|
| - if (client_phishing_reports_.find(source) != client_phishing_reports_.end()) {
|
| + if (base::ContainsKey(client_phishing_reports_, source)) {
|
| HandlePhishingVerdict(source, source->GetURL(), source->GetStatus(),
|
| source->GetResponseCode(), data);
|
| - } else if (client_malware_reports_.find(source) !=
|
| - client_malware_reports_.end()) {
|
| + } else if (base::ContainsKey(client_malware_reports_, source)) {
|
| HandleMalwareVerdict(source, source->GetURL(), source->GetStatus(),
|
| source->GetResponseCode(), data);
|
| } else {
|
| @@ -295,21 +285,23 @@ void ClientSideDetectionService::StartClientReportPhishingRequest(
|
| return;
|
| }
|
|
|
| - net::URLFetcher* fetcher =
|
| + std::unique_ptr<net::URLFetcher> fetcher(
|
| net::URLFetcher::Create(0 /* ID used for testing */,
|
| GetClientReportUrl(kClientReportPhishingUrl),
|
| - net::URLFetcher::POST, this).release();
|
| + net::URLFetcher::POST, this));
|
| + net::URLFetcher* fetcher_ptr = fetcher.get();
|
|
|
| // Remember which callback and URL correspond to the current fetcher object.
|
| - ClientReportInfo* info = new ClientReportInfo;
|
| + std::unique_ptr<ClientPhishingReportInfo> info(new ClientPhishingReportInfo);
|
| + info->fetcher = std::move(fetcher);
|
| info->callback = callback;
|
| info->phishing_url = GURL(request->url());
|
| - client_phishing_reports_[fetcher] = info;
|
| + client_phishing_reports_[fetcher_ptr] = std::move(info);
|
|
|
| - fetcher->SetLoadFlags(net::LOAD_DISABLE_CACHE);
|
| - fetcher->SetRequestContext(request_context_getter_.get());
|
| - fetcher->SetUploadData("application/octet-stream", request_data);
|
| - fetcher->Start();
|
| + fetcher_ptr->SetLoadFlags(net::LOAD_DISABLE_CACHE);
|
| + fetcher_ptr->SetRequestContext(request_context_getter_.get());
|
| + fetcher_ptr->SetUploadData("application/octet-stream", request_data);
|
| + fetcher_ptr->Start();
|
|
|
| // Record that we made a request
|
| phishing_report_times_.push(base::Time::Now());
|
| @@ -336,21 +328,23 @@ void ClientSideDetectionService::StartClientReportMalwareRequest(
|
| return;
|
| }
|
|
|
| - net::URLFetcher* fetcher =
|
| + std::unique_ptr<net::URLFetcher> fetcher(
|
| net::URLFetcher::Create(0 /* ID used for testing */,
|
| GetClientReportUrl(kClientReportMalwareUrl),
|
| - net::URLFetcher::POST, this).release();
|
| + net::URLFetcher::POST, this));
|
| + net::URLFetcher* fetcher_ptr = fetcher.get();
|
|
|
| // Remember which callback and URL correspond to the current fetcher object.
|
| - ClientMalwareReportInfo* info = new ClientMalwareReportInfo;
|
| + std::unique_ptr<ClientMalwareReportInfo> info(new ClientMalwareReportInfo);
|
| + info->fetcher = std::move(fetcher);
|
| info->callback = callback;
|
| info->original_url = GURL(request->url());
|
| - client_malware_reports_[fetcher] = info;
|
| + client_malware_reports_[fetcher_ptr] = std::move(info);
|
|
|
| - fetcher->SetLoadFlags(net::LOAD_DISABLE_CACHE);
|
| - fetcher->SetRequestContext(request_context_getter_.get());
|
| - fetcher->SetUploadData("application/octet-stream", request_data);
|
| - fetcher->Start();
|
| + fetcher_ptr->SetLoadFlags(net::LOAD_DISABLE_CACHE);
|
| + fetcher_ptr->SetRequestContext(request_context_getter_.get());
|
| + fetcher_ptr->SetUploadData("application/octet-stream", request_data);
|
| + fetcher_ptr->Start();
|
|
|
| UMA_HISTOGRAM_ENUMERATION("SBClientMalware.SentReports",
|
| REPORT_SENT, REPORT_RESULT_MAX);
|
| @@ -370,13 +364,16 @@ void ClientSideDetectionService::HandlePhishingVerdict(
|
| int response_code,
|
| const std::string& data) {
|
| ClientPhishingResponse response;
|
| - std::unique_ptr<ClientReportInfo> info(client_phishing_reports_[source]);
|
| + std::unique_ptr<ClientPhishingReportInfo> info =
|
| + std::move(client_phishing_reports_[source]);
|
| + client_phishing_reports_.erase(source);
|
| +
|
| bool is_phishing = false;
|
| if (status.is_success() && net::HTTP_OK == response_code &&
|
| response.ParseFromString(data)) {
|
| // Cache response, possibly flushing an old one.
|
| cache_[info->phishing_url] =
|
| - make_linked_ptr(new CacheState(response.phishy(), base::Time::Now()));
|
| + base::WrapUnique(new CacheState(response.phishy(), base::Time::Now()));
|
| is_phishing = response.phishy();
|
| } else {
|
| DLOG(ERROR) << "Unable to get the server verdict for URL: "
|
| @@ -385,8 +382,6 @@ void ClientSideDetectionService::HandlePhishingVerdict(
|
| }
|
| if (!info->callback.is_null())
|
| info->callback.Run(info->phishing_url, is_phishing);
|
| - client_phishing_reports_.erase(source);
|
| - delete source;
|
| }
|
|
|
| void ClientSideDetectionService::HandleMalwareVerdict(
|
| @@ -404,8 +399,10 @@ void ClientSideDetectionService::HandleMalwareVerdict(
|
| "SBClientMalware.IPBlacklistRequestNetError", -status.error());
|
|
|
| ClientMalwareResponse response;
|
| - std::unique_ptr<ClientMalwareReportInfo> info(
|
| - client_malware_reports_[source]);
|
| + std::unique_ptr<ClientMalwareReportInfo> info =
|
| + std::move(client_malware_reports_[source]);
|
| + client_malware_reports_.erase(source);
|
| +
|
| bool should_blacklist = false;
|
| if (status.is_success() && net::HTTP_OK == response_code &&
|
| response.ParseFromString(data)) {
|
| @@ -424,8 +421,6 @@ void ClientSideDetectionService::HandleMalwareVerdict(
|
| info->callback.Run(info->original_url, info->original_url, false);
|
| }
|
|
|
| - client_malware_reports_.erase(source);
|
| - delete source;
|
| }
|
|
|
| bool ClientSideDetectionService::IsInCache(const GURL& url) {
|
| @@ -438,7 +433,7 @@ bool ClientSideDetectionService::GetValidCachedResult(const GURL& url,
|
| bool* is_phishing) {
|
| UpdateCache();
|
|
|
| - PhishingCache::iterator it = cache_.find(url);
|
| + auto it = cache_.find(url);
|
| if (it == cache_.end()) {
|
| return false;
|
| }
|
| @@ -469,7 +464,7 @@ void ClientSideDetectionService::UpdateCache() {
|
| base::TimeDelta::FromDays(kReportsIntervalDays));
|
|
|
| // Remove elements from the cache that will no longer be used.
|
| - for (PhishingCache::iterator it = cache_.begin(); it != cache_.end();) {
|
| + for (auto it = cache_.begin(); it != cache_.end();) {
|
| const CacheState& cache_state = *it->second;
|
| if (cache_state.is_phishing ?
|
| cache_state.timestamp > base::Time::Now() - positive_cache_interval :
|
|
|