Index: components/policy/core/common/cloud/external_policy_data_fetcher.cc |
diff --git a/components/policy/core/common/cloud/external_policy_data_fetcher.cc b/components/policy/core/common/cloud/external_policy_data_fetcher.cc |
index d3474e2826ce20d5c1cd2d17b4bebe5893edd710..624c4e99235820c74bbf22c2688688d8974a8f97 100644 |
--- a/components/policy/core/common/cloud/external_policy_data_fetcher.cc |
+++ b/components/policy/core/common/cloud/external_policy_data_fetcher.cc |
@@ -149,6 +149,11 @@ void ExternalPolicyDataFetcher::OnJobFinished( |
delete job; |
} |
+struct ExternalPolicyDataFetcherBackend::FetcherAndJob { |
+ std::unique_ptr<net::URLFetcher> fetcher; |
+ ExternalPolicyDataFetcher::Job* job; |
+}; |
+ |
ExternalPolicyDataFetcherBackend::ExternalPolicyDataFetcherBackend( |
scoped_refptr<base::SequencedTaskRunner> io_task_runner, |
scoped_refptr<net::URLRequestContextGetter> request_context) |
@@ -160,7 +165,6 @@ ExternalPolicyDataFetcherBackend::ExternalPolicyDataFetcherBackend( |
ExternalPolicyDataFetcherBackend::~ExternalPolicyDataFetcherBackend() { |
DCHECK(io_task_runner_->RunsTasksOnCurrentThread()); |
- base::STLDeleteContainerPairFirstPointers(job_map_.begin(), job_map_.end()); |
} |
std::unique_ptr<ExternalPolicyDataFetcher> |
@@ -173,9 +177,9 @@ ExternalPolicyDataFetcherBackend::CreateFrontend( |
void ExternalPolicyDataFetcherBackend::StartJob( |
ExternalPolicyDataFetcher::Job* job) { |
DCHECK(io_task_runner_->RunsTasksOnCurrentThread()); |
- net::URLFetcher* fetcher = |
- net::URLFetcher::Create(++last_fetch_id_, job->url, net::URLFetcher::GET, |
- this).release(); |
+ std::unique_ptr<net::URLFetcher> owned_fetcher = net::URLFetcher::Create( |
+ ++last_fetch_id_, job->url, net::URLFetcher::GET, this); |
+ net::URLFetcher* fetcher = owned_fetcher.get(); |
data_use_measurement::DataUseUserData::AttachToFetcher( |
fetcher, data_use_measurement::DataUseUserData::POLICY); |
fetcher->SetRequestContext(request_context_.get()); |
@@ -185,16 +189,15 @@ void ExternalPolicyDataFetcherBackend::StartJob( |
net::LOAD_DO_NOT_SEND_AUTH_DATA); |
fetcher->SetAutomaticallyRetryOnNetworkChanges(3); |
fetcher->Start(); |
- job_map_[fetcher] = job; |
+ job_map_[fetcher] = {std::move(owned_fetcher), job}; |
} |
void ExternalPolicyDataFetcherBackend::CancelJob( |
ExternalPolicyDataFetcher::Job* job, |
const base::Closure& callback) { |
DCHECK(io_task_runner_->RunsTasksOnCurrentThread()); |
- for (JobMap::iterator it = job_map_.begin(); it != job_map_.end(); ) { |
- if (it->second == job) { |
- delete it->first; |
+ for (auto it = job_map_.begin(); it != job_map_.end();) { |
+ if (it->second.job == job) { |
job_map_.erase(it++); |
} else { |
++it; |
@@ -206,7 +209,7 @@ void ExternalPolicyDataFetcherBackend::CancelJob( |
void ExternalPolicyDataFetcherBackend::OnURLFetchComplete( |
const net::URLFetcher* source) { |
DCHECK(io_task_runner_->RunsTasksOnCurrentThread()); |
- JobMap::iterator it = job_map_.find(const_cast<net::URLFetcher*>(source)); |
+ auto it = job_map_.find(const_cast<net::URLFetcher*>(source)); |
if (it == job_map_.end()) { |
NOTREACHED(); |
return; |
@@ -235,15 +238,14 @@ void ExternalPolicyDataFetcherBackend::OnURLFetchComplete( |
} else { |
data.reset(new std::string); |
source->GetResponseAsString(data.get()); |
- if (static_cast<int64_t>(data->size()) > it->second->max_size) { |
+ if (static_cast<int64_t>(data->size()) > it->second.job->max_size) { |
// Received |data| exceeds maximum allowed size. |
data.reset(); |
result = ExternalPolicyDataFetcher::MAX_SIZE_EXCEEDED; |
} |
} |
- ExternalPolicyDataFetcher::Job* job = it->second; |
- delete it->first; |
+ ExternalPolicyDataFetcher::Job* job = it->second.job; |
job_map_.erase(it); |
job->callback.Run(job, result, std::move(data)); |
} |
@@ -253,16 +255,16 @@ void ExternalPolicyDataFetcherBackend::OnURLFetchDownloadProgress( |
int64_t current, |
int64_t total) { |
DCHECK(io_task_runner_->RunsTasksOnCurrentThread()); |
- JobMap::iterator it = job_map_.find(const_cast<net::URLFetcher*>(source)); |
+ auto it = job_map_.find(source); |
DCHECK(it != job_map_.end()); |
if (it == job_map_.end()) |
return; |
// Reject the data if it exceeds the size limit. The content length is in |
// |total|, and it may be -1 when not known. |
- if (current > it->second->max_size || total > it->second->max_size) { |
- ExternalPolicyDataFetcher::Job* job = it->second; |
- delete it->first; |
+ ExternalPolicyDataFetcher::Job* job = it->second.job; |
+ int64_t max_size = job->max_size; |
+ if (current > max_size || total > max_size) { |
job_map_.erase(it); |
job->callback.Run(job, ExternalPolicyDataFetcher::MAX_SIZE_EXCEEDED, |
std::unique_ptr<std::string>()); |