|  | // Copyright (c) 2012 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_resolution/mock_pac_file_fetcher.h" | 
|  |  | 
|  | #include "base/callback_helpers.h" | 
|  | #include "base/logging.h" | 
|  | #include "base/run_loop.h" | 
|  | #include "base/strings/string16.h" | 
|  | #include "base/strings/utf_string_conversions.h" | 
|  | #include "net/base/net_errors.h" | 
|  |  | 
|  | namespace net { | 
|  |  | 
|  | MockPacFileFetcher::MockPacFileFetcher() | 
|  | : pending_request_text_(NULL), | 
|  | is_shutdown_(false) {} | 
|  |  | 
|  | MockPacFileFetcher::~MockPacFileFetcher() = default; | 
|  |  | 
|  | // PacFileFetcher implementation. | 
|  | int MockPacFileFetcher::Fetch( | 
|  | const GURL& url, | 
|  | base::string16* text, | 
|  | CompletionOnceCallback callback, | 
|  | const NetworkTrafficAnnotationTag traffic_annotation) { | 
|  | DCHECK(!has_pending_request()); | 
|  |  | 
|  | if (on_fetch_complete_) | 
|  | std::move(on_fetch_complete_).Run(); | 
|  |  | 
|  | if (is_shutdown_) | 
|  | return ERR_CONTEXT_SHUT_DOWN; | 
|  |  | 
|  | // Save the caller's information, and have them wait. | 
|  | pending_request_url_ = url; | 
|  | pending_request_callback_ = std::move(callback); | 
|  | pending_request_text_ = text; | 
|  |  | 
|  | return ERR_IO_PENDING; | 
|  | } | 
|  |  | 
|  | void MockPacFileFetcher::NotifyFetchCompletion(int result, | 
|  | const std::string& ascii_text) { | 
|  | DCHECK(has_pending_request()); | 
|  | *pending_request_text_ = base::ASCIIToUTF16(ascii_text); | 
|  | base::ResetAndReturn(&pending_request_callback_).Run(result); | 
|  | } | 
|  |  | 
|  | void MockPacFileFetcher::Cancel() { | 
|  | pending_request_callback_.Reset(); | 
|  | } | 
|  |  | 
|  | void MockPacFileFetcher::OnShutdown() { | 
|  | is_shutdown_ = true; | 
|  | if (pending_request_callback_) { | 
|  | base::ResetAndReturn(&pending_request_callback_).Run(ERR_CONTEXT_SHUT_DOWN); | 
|  | } | 
|  | } | 
|  |  | 
|  | URLRequestContext* MockPacFileFetcher::GetRequestContext() const { | 
|  | return NULL; | 
|  | } | 
|  |  | 
|  | const GURL& MockPacFileFetcher::pending_request_url() const { | 
|  | return pending_request_url_; | 
|  | } | 
|  |  | 
|  | bool MockPacFileFetcher::has_pending_request() const { | 
|  | return !pending_request_callback_.is_null(); | 
|  | } | 
|  |  | 
|  | void MockPacFileFetcher::WaitUntilFetch() { | 
|  | DCHECK(!has_pending_request()); | 
|  | base::RunLoop run_loop; | 
|  | on_fetch_complete_ = run_loop.QuitClosure(); | 
|  | run_loop.Run(); | 
|  | } | 
|  |  | 
|  | }  // namespace net |