| Index: net/proxy/mojo_proxy_resolver_impl.cc | 
| diff --git a/net/proxy/mojo_proxy_resolver_impl.cc b/net/proxy/mojo_proxy_resolver_impl.cc | 
| index a2809223799ab92aab8e7604b5ef57b08e3e0d95..2d48c57197a4157db39b656a90ad06c97fd7390c 100644 | 
| --- a/net/proxy/mojo_proxy_resolver_impl.cc | 
| +++ b/net/proxy/mojo_proxy_resolver_impl.cc | 
| @@ -10,7 +10,6 @@ | 
| #include "net/base/net_log.h" | 
| #include "net/proxy/mojo_proxy_type_converters.h" | 
| #include "net/proxy/proxy_info.h" | 
| -#include "net/proxy/proxy_resolver.h" | 
| #include "net/proxy/proxy_resolver_script_data.h" | 
|  | 
| namespace net { | 
| @@ -24,6 +23,11 @@ class MojoProxyResolverImpl::Job : public mojo::ErrorHandler { | 
|  | 
| void Start(); | 
|  | 
| +  // Invoked when the LoadState for this job changes. | 
| +  void LoadStateChanged(LoadState load_state); | 
| + | 
| +  net::ProxyResolver::RequestHandle request_handle() { return request_handle_; } | 
| + | 
| private: | 
| // mojo::ErrorHandler override. | 
| // This is invoked in response to the client disconnecting, indicating | 
| @@ -38,6 +42,7 @@ class MojoProxyResolverImpl::Job : public mojo::ErrorHandler { | 
| ProxyInfo result_; | 
| GURL url_; | 
| net::ProxyResolver::RequestHandle request_handle_; | 
| +  bool done_; | 
|  | 
| DISALLOW_COPY_AND_ASSIGN(Job); | 
| }; | 
| @@ -54,6 +59,14 @@ MojoProxyResolverImpl::~MojoProxyResolverImpl() { | 
| STLDeleteElements(&resolve_jobs_); | 
| } | 
|  | 
| +void MojoProxyResolverImpl::LoadStateChanged( | 
| +    net::ProxyResolver::RequestHandle handle, | 
| +    LoadState load_state) { | 
| +  auto it = request_handle_to_job_.find(handle); | 
| +  DCHECK(it != request_handle_to_job_.end()); | 
| +  it->second->LoadStateChanged(load_state); | 
| +} | 
| + | 
| void MojoProxyResolverImpl::SetPacScript( | 
| const mojo::String& data, | 
| const mojo::Callback<void(int32_t)>& callback) { | 
| @@ -75,6 +88,9 @@ void MojoProxyResolverImpl::GetProxyForUrl( | 
| } | 
|  | 
| void MojoProxyResolverImpl::DeleteJob(Job* job) { | 
| +  if (job->request_handle()) | 
| +    request_handle_to_job_.erase(job->request_handle()); | 
| + | 
| size_t num_erased = resolve_jobs_.erase(job); | 
| DCHECK(num_erased); | 
| delete job; | 
| @@ -106,11 +122,12 @@ MojoProxyResolverImpl::Job::Job( | 
| : resolver_(resolver), | 
| client_(client.Pass()), | 
| url_(url), | 
| -      request_handle_(nullptr) { | 
| +      request_handle_(nullptr), | 
| +      done_(false) { | 
| } | 
|  | 
| MojoProxyResolverImpl::Job::~Job() { | 
| -  if (request_handle_) | 
| +  if (request_handle_ && !done_) | 
| resolver_->resolver_->CancelRequest(request_handle_); | 
| } | 
|  | 
| @@ -123,10 +140,16 @@ void MojoProxyResolverImpl::Job::Start() { | 
| return; | 
| } | 
| client_.set_error_handler(this); | 
| +  resolver_->request_handle_to_job_.insert( | 
| +      std::make_pair(request_handle_, this)); | 
| +} | 
| + | 
| +void MojoProxyResolverImpl::Job::LoadStateChanged(LoadState load_state) { | 
| +  client_->LoadStateChanged(load_state); | 
| } | 
|  | 
| void MojoProxyResolverImpl::Job::GetProxyDone(int error) { | 
| -  request_handle_ = nullptr; | 
| +  done_ = true; | 
| DVLOG(1) << "GetProxyForUrl(" << url_ << ") finished with error " << error | 
| << ". " << result_.proxy_list().size() << " Proxies returned:"; | 
| for (const auto& proxy : result_.proxy_list().GetAll()) { | 
|  |