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 870f5d708db9818f5d9acce014f945ac237de8ff..6e3e60b893e0a0a707c27e28c1279bcb7a21f325 100644 |
--- a/net/proxy/mojo_proxy_resolver_impl.cc |
+++ b/net/proxy/mojo_proxy_resolver_impl.cc |
@@ -4,8 +4,11 @@ |
#include "net/proxy/mojo_proxy_resolver_impl.h" |
+#include "base/memory/weak_ptr.h" |
+#include "base/message_loop/message_loop.h" |
#include "base/stl_util.h" |
#include "mojo/common/common_type_converters.h" |
+#include "net/base/load_state_change_coalescer.h" |
#include "net/base/net_errors.h" |
#include "net/base/net_log.h" |
#include "net/proxy/mojo_type_converters.h" |
@@ -14,6 +17,9 @@ |
#include "net/proxy/proxy_resolver_script_data.h" |
namespace net { |
+namespace { |
+const int kLoadStateChangeCoalesceTimeoutMilliseconds = 10; |
+} |
class MojoProxyResolverImpl::Job : public mojo::ErrorHandler { |
public: |
@@ -24,6 +30,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 |
@@ -32,12 +43,16 @@ class MojoProxyResolverImpl::Job : public mojo::ErrorHandler { |
void GetProxyDone(int error); |
+ void SendLoadStateChanged(LoadState load_state); |
+ |
MojoProxyResolverImpl* resolver_; |
interfaces::ProxyResolverRequestClientPtr client_; |
ProxyInfo result_; |
GURL url_; |
net::ProxyResolver::RequestHandle request_handle_; |
+ bool done_; |
+ LoadStateChangeCoalescer load_state_change_coalescer_; |
DISALLOW_COPY_AND_ASSIGN(Job); |
}; |
@@ -54,6 +69,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 +98,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 +132,18 @@ MojoProxyResolverImpl::Job::Job( |
: resolver_(resolver), |
client_(client.Pass()), |
url_(url), |
- request_handle_(nullptr) { |
+ request_handle_(nullptr), |
+ done_(false), |
+ load_state_change_coalescer_( |
+ base::Bind(&MojoProxyResolverImpl::Job::SendLoadStateChanged, |
+ base::Unretained(this)), |
+ base::TimeDelta::FromMilliseconds( |
+ kLoadStateChangeCoalesceTimeoutMilliseconds), |
+ LOAD_STATE_RESOLVING_PROXY_FOR_URL) { |
} |
MojoProxyResolverImpl::Job::~Job() { |
- if (request_handle_) |
+ if (request_handle_ && !done_) |
resolver_->resolver_->CancelRequest(request_handle_); |
} |
@@ -123,10 +156,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) { |
+ load_state_change_coalescer_.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()) { |
@@ -145,6 +184,10 @@ void MojoProxyResolverImpl::Job::OnConnectionError() { |
resolver_->DeleteJob(this); |
} |
+void MojoProxyResolverImpl::Job::SendLoadStateChanged(LoadState load_state) { |
+ client_->LoadStateChanged(load_state); |
+} |
+ |
MojoProxyResolverImpl::SetPacScriptRequest::SetPacScriptRequest( |
const scoped_refptr<ProxyResolverScriptData>& script_data, |
const mojo::Callback<void(int32_t)>& callback) |