| Index: net/http/http_stream_factory_impl_job.cc
 | 
| ===================================================================
 | 
| --- net/http/http_stream_factory_impl_job.cc	(revision 118888)
 | 
| +++ net/http/http_stream_factory_impl_job.cc	(working copy)
 | 
| @@ -181,14 +181,22 @@
 | 
|    return StartInternal();
 | 
|  }
 | 
|  
 | 
| -int HttpStreamFactoryImpl::Job::RestartTunnelWithProxyAuth(
 | 
| -    const AuthCredentials& credentials) {
 | 
| -  DCHECK(establishing_tunnel_);
 | 
| -  next_state_ = STATE_RESTART_TUNNEL_AUTH;
 | 
| -  stream_.reset();
 | 
| -  return RunLoop(OK);
 | 
| +int HttpStreamFactoryImpl::Job::RestartTunnelWithProxyAuth() {
 | 
| +  // We run this asynchronously to ensure that we don't invoke
 | 
| +  // the callback (which might cause the caller to be deleted)
 | 
| +  // while the caller is waiting for this method to return.
 | 
| +  MessageLoop::current()->PostTask(
 | 
| +      FROM_HERE,
 | 
| +      base::Bind(&HttpStreamFactoryImpl::Job::DoRestartTunnelWithProxyAuth,
 | 
| +                 ptr_factory_.GetWeakPtr()));
 | 
| +  return ERR_IO_PENDING;
 | 
|  }
 | 
|  
 | 
| +void HttpStreamFactoryImpl::Job::DoRestartTunnelWithProxyAuth() {
 | 
| +  tunnel_auth_handled_callback_.Run(OK);
 | 
| +  tunnel_auth_handled_callback_.Reset();
 | 
| +}
 | 
| +
 | 
|  LoadState HttpStreamFactoryImpl::Job::GetLoadState() const {
 | 
|    switch (next_state_) {
 | 
|      case STATE_RESOLVE_PROXY_COMPLETE:
 | 
| @@ -342,6 +350,18 @@
 | 
|    // |this| may be deleted after this call.
 | 
|  }
 | 
|  
 | 
| +void HttpStreamFactoryImpl::Job::OnNeedsProxyTunnelAuthCallback(
 | 
| +    const HttpResponseInfo& response_info,
 | 
| +    HttpAuthController* auth_controller,
 | 
| +    CompletionCallback callback) {
 | 
| +  DCHECK(!callback.is_null());
 | 
| +  DCHECK(tunnel_auth_handled_callback_.is_null());
 | 
| +  tunnel_auth_handled_callback_ = callback;
 | 
| +  request_->OnNeedsProxyAuth(
 | 
| +    this, response_info, server_ssl_config_, proxy_info_, auth_controller);
 | 
| +  // |this| may be deleted after this call.
 | 
| +}
 | 
| +
 | 
|  void HttpStreamFactoryImpl::Job::OnNeedsClientAuthCallback(
 | 
|      SSLCertRequestInfo* cert_info) {
 | 
|    DCHECK(!IsPreconnecting());
 | 
| @@ -420,10 +440,10 @@
 | 
|          DCHECK(connection_->socket());
 | 
|          DCHECK(establishing_tunnel_);
 | 
|  
 | 
| -        HttpProxyClientSocket* http_proxy_socket =
 | 
| -            static_cast<HttpProxyClientSocket*>(connection_->socket());
 | 
| +        ProxyClientSocket* proxy_socket =
 | 
| +            static_cast<ProxyClientSocket*>(connection_->socket());
 | 
|          const HttpResponseInfo* tunnel_auth_response =
 | 
| -            http_proxy_socket->GetConnectResponseInfo();
 | 
| +            proxy_socket->GetConnectResponseInfo();
 | 
|  
 | 
|          next_state_ = STATE_WAITING_USER_ACTION;
 | 
|          MessageLoop::current()->PostTask(
 | 
| @@ -432,7 +452,7 @@
 | 
|                  &HttpStreamFactoryImpl::Job::OnNeedsProxyAuthCallback,
 | 
|                  ptr_factory_.GetWeakPtr(),
 | 
|                  *tunnel_auth_response,
 | 
| -                http_proxy_socket->auth_controller()));
 | 
| +                proxy_socket->GetAuthController()));
 | 
|        }
 | 
|        return ERR_IO_PENDING;
 | 
|  
 | 
| @@ -733,13 +753,18 @@
 | 
|          server_ssl_config_,
 | 
|          proxy_ssl_config_,
 | 
|          net_log_,
 | 
| -        num_streams_);
 | 
| +        num_streams_,
 | 
| +        base::Bind(&HttpStreamFactoryImpl::Job::OnNeedsProxyTunnelAuthCallback,
 | 
| +                   ptr_factory_.GetWeakPtr()));
 | 
|    } else {
 | 
|      return InitSocketHandleForHttpRequest(
 | 
|          origin_url_, request_info_.extra_headers, request_info_.load_flags,
 | 
|          request_info_.priority, session_, proxy_info_, ShouldForceSpdySSL(),
 | 
|          want_spdy_over_npn, server_ssl_config_, proxy_ssl_config_, net_log_,
 | 
| -        connection_.get(), io_callback_);
 | 
| +        connection_.get(),
 | 
| +        base::Bind(&HttpStreamFactoryImpl::Job::OnNeedsProxyTunnelAuthCallback,
 | 
| +                   ptr_factory_.GetWeakPtr()),
 | 
| +        io_callback_);
 | 
|    }
 | 
|  }
 | 
|  
 | 
| 
 |