| 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>());
|
|
|