1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "net/proxy/mock_proxy_resolver.h" 6 7 #include "base/logging.h" 8 #include "base/message_loop/message_loop.h" 9 10 namespace net { 11 12 MockAsyncProxyResolverBase::Request::Request( 13 MockAsyncProxyResolverBase* resolver, 14 const GURL& url, 15 ProxyInfo* results, 16 const CompletionCallback& callback) 17 : resolver_(resolver), 18 url_(url), 19 results_(results), 20 callback_(callback), 21 origin_loop_(base::MessageLoop::current()) {} 22 23 void MockAsyncProxyResolverBase::Request::CompleteNow(int rv) { 24 CompletionCallback callback = callback_; 25 26 // May delete |this|. 27 resolver_->RemovePendingRequest(this); 28 29 callback.Run(rv); 30 } 31 32 MockAsyncProxyResolverBase::Request::~Request() {} 33 34 MockAsyncProxyResolverBase::SetPacScriptRequest::SetPacScriptRequest( 35 MockAsyncProxyResolverBase* resolver, 36 const scoped_refptr<ProxyResolverScriptData>& script_data, 37 const CompletionCallback& callback) 38 : resolver_(resolver), 39 script_data_(script_data), 40 callback_(callback), 41 origin_loop_(base::MessageLoop::current()) {} 42 43 MockAsyncProxyResolverBase::SetPacScriptRequest::~SetPacScriptRequest() {} 44 45 void MockAsyncProxyResolverBase::SetPacScriptRequest::CompleteNow(int rv) { 46 CompletionCallback callback = callback_; 47 48 // Will delete |this|. 49 resolver_->RemovePendingSetPacScriptRequest(this); 50 51 callback.Run(rv); 52 } 53 54 MockAsyncProxyResolverBase::~MockAsyncProxyResolverBase() {} 55 56 int MockAsyncProxyResolverBase::GetProxyForURL( 57 const GURL& url, ProxyInfo* results, const CompletionCallback& callback, 58 RequestHandle* request_handle, const BoundNetLog& /*net_log*/) { 59 scoped_refptr<Request> request = new Request(this, url, results, callback); 60 pending_requests_.push_back(request); 61 62 if (request_handle) 63 *request_handle = reinterpret_cast<RequestHandle>(request.get()); 64 65 // Test code completes the request by calling request->CompleteNow(). 66 return ERR_IO_PENDING; 67 } 68 69 void MockAsyncProxyResolverBase::CancelRequest(RequestHandle request_handle) { 70 scoped_refptr<Request> request = reinterpret_cast<Request*>(request_handle); 71 cancelled_requests_.push_back(request); 72 RemovePendingRequest(request.get()); 73 } 74 75 LoadState MockAsyncProxyResolverBase::GetLoadState( 76 RequestHandle request_handle) const { 77 return LOAD_STATE_RESOLVING_PROXY_FOR_URL; 78 } 79 80 int MockAsyncProxyResolverBase::SetPacScript( 81 const scoped_refptr<ProxyResolverScriptData>& script_data, 82 const CompletionCallback& callback) { 83 DCHECK(!pending_set_pac_script_request_.get()); 84 pending_set_pac_script_request_.reset( 85 new SetPacScriptRequest(this, script_data, callback)); 86 // Finished when user calls SetPacScriptRequest::CompleteNow(). 87 return ERR_IO_PENDING; 88 } 89 90 void MockAsyncProxyResolverBase::CancelSetPacScript() { 91 // Do nothing (caller was responsible for completing the request). 92 } 93 94 MockAsyncProxyResolverBase::SetPacScriptRequest* 95 MockAsyncProxyResolverBase::pending_set_pac_script_request() const { 96 return pending_set_pac_script_request_.get(); 97 } 98 99 void MockAsyncProxyResolverBase::RemovePendingRequest(Request* request) { 100 RequestsList::iterator it = std::find( 101 pending_requests_.begin(), pending_requests_.end(), request); 102 DCHECK(it != pending_requests_.end()); 103 pending_requests_.erase(it); 104 } 105 106 void MockAsyncProxyResolverBase::RemovePendingSetPacScriptRequest( 107 SetPacScriptRequest* request) { 108 DCHECK_EQ(request, pending_set_pac_script_request()); 109 pending_set_pac_script_request_.reset(); 110 } 111 112 MockAsyncProxyResolverBase::MockAsyncProxyResolverBase(bool expects_pac_bytes) 113 : ProxyResolver(expects_pac_bytes) {} 114 115 } // namespace net 116