| Index: chromeos/dbus/services/proxy_resolution_service_provider.cc
|
| diff --git a/chromeos/dbus/services/proxy_resolution_service_provider.cc b/chromeos/dbus/services/proxy_resolution_service_provider.cc
|
| index 87279d6057c2a286d989e84a219181d0e8464d4d..2400344a7ea92873f1f4471194ff6c170fc51b15 100644
|
| --- a/chromeos/dbus/services/proxy_resolution_service_provider.cc
|
| +++ b/chromeos/dbus/services/proxy_resolution_service_provider.cc
|
| @@ -163,6 +163,10 @@ void ProxyResolutionServiceProvider::ResolveProxy(
|
| : base::MakeUnique<Request>(source_url, std::move(response),
|
| response_sender, context_getter);
|
|
|
| + NotifyCallback notify_callback =
|
| + base::Bind(&ProxyResolutionServiceProvider::NotifyProxyResolved,
|
| + weak_ptr_factory_.GetWeakPtr());
|
| +
|
| // This would ideally call PostTaskAndReply() instead of PostTask(), but
|
| // ResolveProxyOnNetworkThread()'s call to net::ProxyService::ResolveProxy()
|
| // can result in an asynchronous lookup, in which case the result won't be
|
| @@ -170,8 +174,8 @@ void ProxyResolutionServiceProvider::ResolveProxy(
|
| context_getter->GetNetworkTaskRunner()->PostTask(
|
| FROM_HERE,
|
| base::Bind(&ProxyResolutionServiceProvider::ResolveProxyOnNetworkThread,
|
| - weak_ptr_factory_.GetWeakPtr(),
|
| - base::Passed(std::move(request))));
|
| + base::Passed(std::move(request)), origin_thread_,
|
| + notify_callback));
|
|
|
| // If we didn't already pass the response to the Request object because we're
|
| // returning data via a signal, send an empty response immediately.
|
| @@ -179,8 +183,11 @@ void ProxyResolutionServiceProvider::ResolveProxy(
|
| response_sender.Run(std::move(response));
|
| }
|
|
|
| +// static
|
| void ProxyResolutionServiceProvider::ResolveProxyOnNetworkThread(
|
| - std::unique_ptr<Request> request) {
|
| + std::unique_ptr<Request> request,
|
| + scoped_refptr<base::SingleThreadTaskRunner> notify_thread,
|
| + NotifyCallback notify_callback) {
|
| DCHECK(request->context_getter->GetNetworkTaskRunner()
|
| ->BelongsToCurrentThread());
|
|
|
| @@ -188,14 +195,15 @@ void ProxyResolutionServiceProvider::ResolveProxyOnNetworkThread(
|
| request->context_getter->GetURLRequestContext()->proxy_service();
|
| if (!proxy_service) {
|
| request->error = "No proxy service in chrome";
|
| - OnResolutionComplete(std::move(request), net::ERR_UNEXPECTED);
|
| + OnResolutionComplete(std::move(request), notify_thread, notify_callback,
|
| + net::ERR_UNEXPECTED);
|
| return;
|
| }
|
|
|
| Request* request_ptr = request.get();
|
| net::CompletionCallback callback = base::Bind(
|
| &ProxyResolutionServiceProvider::OnResolutionComplete,
|
| - weak_ptr_factory_.GetWeakPtr(), base::Passed(std::move(request)));
|
| + base::Passed(std::move(request)), notify_thread, notify_callback);
|
|
|
| VLOG(1) << "Starting network proxy resolution for "
|
| << request_ptr->source_url;
|
| @@ -208,8 +216,11 @@ void ProxyResolutionServiceProvider::ResolveProxyOnNetworkThread(
|
| }
|
| }
|
|
|
| +// static
|
| void ProxyResolutionServiceProvider::OnResolutionComplete(
|
| std::unique_ptr<Request> request,
|
| + scoped_refptr<base::SingleThreadTaskRunner> notify_thread,
|
| + NotifyCallback notify_callback,
|
| int result) {
|
| DCHECK(request->context_getter->GetNetworkTaskRunner()
|
| ->BelongsToCurrentThread());
|
| @@ -217,11 +228,8 @@ void ProxyResolutionServiceProvider::OnResolutionComplete(
|
| if (request->error.empty() && result != net::OK)
|
| request->error = net::ErrorToString(result);
|
|
|
| - origin_thread_->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(&ProxyResolutionServiceProvider::NotifyProxyResolved,
|
| - weak_ptr_factory_.GetWeakPtr(),
|
| - base::Passed(std::move(request))));
|
| + notify_thread->PostTask(
|
| + FROM_HERE, base::Bind(notify_callback, base::Passed(std::move(request))));
|
| }
|
|
|
| void ProxyResolutionServiceProvider::NotifyProxyResolved(
|
|
|