// Copyright (c) 2011 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "net/proxy/mock_proxy_resolver.h" #include "base/logging.h" #include "base/message_loop/message_loop.h" namespace net { MockAsyncProxyResolverBase::Request::Request( MockAsyncProxyResolverBase* resolver, const GURL& url, ProxyInfo* results, const CompletionCallback& callback) : resolver_(resolver), url_(url), results_(results), callback_(callback), origin_loop_(base::MessageLoop::current()) {} void MockAsyncProxyResolverBase::Request::CompleteNow(int rv) { CompletionCallback callback = callback_; // May delete |this|. resolver_->RemovePendingRequest(this); callback.Run(rv); } MockAsyncProxyResolverBase::Request::~Request() {} MockAsyncProxyResolverBase::SetPacScriptRequest::SetPacScriptRequest( MockAsyncProxyResolverBase* resolver, const scoped_refptr& script_data, const CompletionCallback& callback) : resolver_(resolver), script_data_(script_data), callback_(callback), origin_loop_(base::MessageLoop::current()) {} MockAsyncProxyResolverBase::SetPacScriptRequest::~SetPacScriptRequest() {} void MockAsyncProxyResolverBase::SetPacScriptRequest::CompleteNow(int rv) { CompletionCallback callback = callback_; // Will delete |this|. resolver_->RemovePendingSetPacScriptRequest(this); callback.Run(rv); } MockAsyncProxyResolverBase::~MockAsyncProxyResolverBase() {} int MockAsyncProxyResolverBase::GetProxyForURL( const GURL& url, ProxyInfo* results, const CompletionCallback& callback, RequestHandle* request_handle, const BoundNetLog& /*net_log*/) { scoped_refptr request = new Request(this, url, results, callback); pending_requests_.push_back(request); if (request_handle) *request_handle = reinterpret_cast(request.get()); // Test code completes the request by calling request->CompleteNow(). return ERR_IO_PENDING; } void MockAsyncProxyResolverBase::CancelRequest(RequestHandle request_handle) { scoped_refptr request = reinterpret_cast(request_handle); cancelled_requests_.push_back(request); RemovePendingRequest(request.get()); } LoadState MockAsyncProxyResolverBase::GetLoadState( RequestHandle request_handle) const { return LOAD_STATE_RESOLVING_PROXY_FOR_URL; } int MockAsyncProxyResolverBase::SetPacScript( const scoped_refptr& script_data, const CompletionCallback& callback) { DCHECK(!pending_set_pac_script_request_.get()); pending_set_pac_script_request_.reset( new SetPacScriptRequest(this, script_data, callback)); // Finished when user calls SetPacScriptRequest::CompleteNow(). return ERR_IO_PENDING; } void MockAsyncProxyResolverBase::CancelSetPacScript() { // Do nothing (caller was responsible for completing the request). } MockAsyncProxyResolverBase::SetPacScriptRequest* MockAsyncProxyResolverBase::pending_set_pac_script_request() const { return pending_set_pac_script_request_.get(); } void MockAsyncProxyResolverBase::RemovePendingRequest(Request* request) { RequestsList::iterator it = std::find( pending_requests_.begin(), pending_requests_.end(), request); DCHECK(it != pending_requests_.end()); pending_requests_.erase(it); } void MockAsyncProxyResolverBase::RemovePendingSetPacScriptRequest( SetPacScriptRequest* request) { DCHECK_EQ(request, pending_set_pac_script_request()); pending_set_pac_script_request_.reset(); } MockAsyncProxyResolverBase::MockAsyncProxyResolverBase(bool expects_pac_bytes) : ProxyResolver(expects_pac_bytes) {} } // namespace net