blob: 53813324f699a48fa86fc3f5955ae75bcd288fd9 [file] [log] [blame]
John Abd-El-Maleka4bb87f2017-11-27 21:32:191// Copyright 2017 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 "content/public/test/url_loader_interceptor.h"
6
Lukasz Anforowicz98ccf1c2018-08-23 18:14:317#include <string>
8#include <utility>
9
Sebastien Marchandf8cbfab2019-01-25 16:02:3010#include "base/bind.h"
David Benjamine430b8a2019-03-21 20:46:2711#include "base/containers/unique_ptr_adapters.h"
John Abd-El-Malek30a86892018-05-26 00:14:1612#include "base/files/file_path.h"
13#include "base/files/file_util.h"
14#include "base/path_service.h"
Carlos Caballero92aab29e2019-09-24 15:41:1115#include "base/run_loop.h"
Adrienne Walkere648ce5a2020-06-06 01:09:5916#include "base/strings/strcat.h"
Dan Harrington942019f2019-01-04 17:58:0317#include "base/synchronization/lock.h"
Guido Urdanetaef4e91942020-11-09 15:06:2418#include "base/test/bind.h"
John Abd-El-Malek30a86892018-05-26 00:14:1619#include "base/threading/thread_restrictions.h"
John Abd-El-Malek1d1ff9182018-08-10 16:18:2320#include "build/build_config.h"
arthursonzogni1fd60e62018-05-09 15:57:3221#include "content/browser/loader/navigation_url_loader_impl.h"
danakje34636e2020-09-15 22:15:0022#include "content/browser/renderer_host/render_frame_host_impl.h"
Tsuyoshi Horo0fd453152018-10-16 01:45:2023#include "content/browser/service_worker/embedded_worker_instance.h"
John Abd-El-Malekd5f920342018-02-12 17:37:3624#include "content/browser/storage_partition_impl.h"
John Abd-El-Maleka4bb87f2017-11-27 21:32:1925#include "content/browser/url_loader_factory_getter.h"
Eric Seckler8652dcd52018-09-20 10:42:2826#include "content/public/browser/browser_task_traits.h"
John Abd-El-Maleka4bb87f2017-11-27 21:32:1927#include "content/public/browser/browser_thread.h"
Matt Falkenhagen4df68d22019-09-09 08:34:1528#include "content/public/test/mock_render_process_host.h"
Julie Jeongeun Kim028b2c92019-11-08 02:51:1629#include "mojo/public/cpp/bindings/receiver.h"
Julie Jeongeun Kim7f8e26a22019-10-10 12:09:5230#include "mojo/public/cpp/bindings/receiver_set.h"
John Abd-El-Maleka796fa52017-12-12 17:12:3231#include "net/http/http_util.h"
John Abd-El-Malek30a86892018-05-26 00:14:1632#include "net/test/embedded_test_server/request_handler_util.h"
Yutaka Hiranod8789f92018-01-30 09:59:5133#include "services/network/public/cpp/features.h"
Ken Rockot54311e62018-02-10 19:01:5234#include "services/network/public/mojom/url_loader.mojom.h"
John Abd-El-Maleka4bb87f2017-11-27 21:32:1935
36namespace content {
37
John Abd-El-Malek30a86892018-05-26 00:14:1638namespace {
39
40base::FilePath GetDataFilePath(const std::string& relative_path) {
41 base::FilePath root_path;
42 CHECK(base::PathService::Get(base::DIR_SOURCE_ROOT, &root_path));
43 return root_path.AppendASCII(relative_path);
44}
45
John Abd-El-Malek1d1ff9182018-08-10 16:18:2346static std::string ReadFile(const base::FilePath& path) {
John Abd-El-Malek30a86892018-05-26 00:14:1647 std::string contents;
John Abd-El-Malek1d1ff9182018-08-10 16:18:2348 CHECK(base::ReadFileToString(path, &contents));
John Abd-El-Malek30a86892018-05-26 00:14:1649 return contents;
50}
51
52} // namespace
53
Dan Harrington942019f2019-01-04 17:58:0354// Part of URLLoaderInterceptor which lives on the IO thread. Outlives
55// URLLoaderInterceptor.
56class URLLoaderInterceptor::IOState
Lukasz Anforowicz2f985a42019-07-19 02:56:5257 : public base::RefCountedThreadSafe<URLLoaderInterceptor::IOState,
58 BrowserThread::DeleteOnIOThread> {
Dan Harrington942019f2019-01-04 17:58:0359 public:
60 explicit IOState(URLLoaderInterceptor* parent) : parent_(parent) {}
Yao Xiao43ae3bc2019-07-09 05:22:2361 void Initialize(
62 const URLLoaderCompletionStatusCallback& completion_status_callback,
63 base::OnceClosure closure);
64
Lukasz Anforowicz6a16fea2019-12-14 03:43:1465 // Called when a RenderProcessHostWrapper's binding has an error.
66 void RenderProcessHostWrapperBindingError(RenderProcessHostWrapper* wrapper);
Dan Harrington942019f2019-01-04 17:58:0367
68 // Unsets the parent pointer. Prevents URLLoaderInterceptor::Intercept from
69 // being called.
70 void UnsetParent() {
71 base::AutoLock lock(intercept_lock_);
72 parent_ = nullptr;
73 }
74
75 void Shutdown(base::OnceClosure closure) {
76 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
77 url_loader_factory_getter_wrappers_.clear();
78 subresource_wrappers_.clear();
Clark DuVall649c05f2019-02-05 23:58:4779 navigation_wrappers_.clear();
Dan Harrington942019f2019-01-04 17:58:0380
John Abd-El-Malek87301582019-07-27 04:50:5281 URLLoaderFactoryGetter::SetGetNetworkFactoryCallbackForTesting(
82 URLLoaderFactoryGetter::GetNetworkFactoryCallback());
Dan Harrington942019f2019-01-04 17:58:0383 if (closure)
84 std::move(closure).Run();
85 }
86
87 // Callback on IO thread whenever a
88 // URLLoaderFactoryGetter::GetNetworkContext is called on an object that
89 // doesn't have a test factory set up.
90 void GetNetworkFactoryCallback(
Matt Falkenhagen4df68d22019-09-09 08:34:1591 scoped_refptr<URLLoaderFactoryGetter> url_loader_factory_getter);
Dan Harrington942019f2019-01-04 17:58:0392
Lukasz Anforowicz6a16fea2019-12-14 03:43:1493 void CreateURLLoaderFactoryForRenderProcessHost(
Julie Jeongeun Kimb405097b2019-10-10 15:34:0794 mojo::PendingReceiver<network::mojom::URLLoaderFactory> receiver,
Dan Harrington942019f2019-01-04 17:58:0395 int process_id,
Julie Jeongeun Kim2811b952019-10-24 00:36:1296 mojo::PendingRemote<network::mojom::URLLoaderFactory> original_factory);
Dan Harrington942019f2019-01-04 17:58:0397
98 bool Intercept(RequestParams* params) {
99 // The lock ensures that |URLLoaderInterceptor| can't be deleted while it
100 // is processing an intercept. Before |URLLoaderInterceptor| is deleted,
101 // parent_ is set to null so that requests can't be intercepted after
102 // |URLLoaderInterceptor| is deleted.
103 base::AutoLock lock(intercept_lock_);
104 if (!parent_)
105 return false;
106 return parent_->Intercept(params);
107 }
108
Clark DuVall649c05f2019-02-05 23:58:47109 // Callback on IO thread whenever NavigationURLLoaderImpl needs a
John Abd-El-Malek08e99952019-04-12 22:46:22110 // URLLoaderFactory with a network::mojom::TrustedURLLoaderHeaderClient or
111 // for a non-network-service scheme.
Clark DuVall649c05f2019-02-05 23:58:47112 void InterceptNavigationRequestCallback(
Julie Jeongeun Kimb405097b2019-10-10 15:34:07113 mojo::PendingReceiver<network::mojom::URLLoaderFactory>* receiver) {
Clark DuVall649c05f2019-02-05 23:58:47114 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
115
Julie Jeongeun Kimb405097b2019-10-10 15:34:07116 auto proxied_receiver = std::move(*receiver);
Julie Jeongeun Kim2811b952019-10-24 00:36:12117 mojo::PendingRemote<network::mojom::URLLoaderFactory> target_factory;
118 *receiver = target_factory.InitWithNewPipeAndPassReceiver();
Clark DuVall649c05f2019-02-05 23:58:47119
120 navigation_wrappers_.emplace(
121 std::make_unique<URLLoaderFactoryNavigationWrapper>(
Julie Jeongeun Kimb405097b2019-10-10 15:34:07122 std::move(proxied_receiver), std::move(target_factory), this));
Clark DuVall649c05f2019-02-05 23:58:47123 }
124
Yao Xiao43ae3bc2019-07-09 05:22:23125 URLLoaderCompletionStatusCallback GetCompletionStatusCallback() {
126 return completion_status_callback_;
127 }
128
Dan Harrington942019f2019-01-04 17:58:03129 private:
Lukasz Anforowicz2f985a42019-07-19 02:56:52130 friend struct BrowserThread::DeleteOnThread<BrowserThread::IO>;
131 friend class base::DeleteHelper<IOState>;
132
Dan Harrington942019f2019-01-04 17:58:03133 ~IOState() {}
134
135 // This lock guarantees that when URLLoaderInterceptor is destroyed,
136 // no intercept callbacks will be called.
137 base::Lock intercept_lock_;
138 URLLoaderInterceptor* parent_ GUARDED_BY(intercept_lock_);
139
Yao Xiao43ae3bc2019-07-09 05:22:23140 URLLoaderCompletionStatusCallback completion_status_callback_;
141
Lukasz Anforowicz6a16fea2019-12-14 03:43:14142 // For intercepting requests via network service. There is one per
Dan Harrington942019f2019-01-04 17:58:03143 // StoragePartition. Only accessed on IO thread.
144 std::set<std::unique_ptr<URLLoaderFactoryGetterWrapper>>
145 url_loader_factory_getter_wrappers_;
Lukasz Anforowicz6a16fea2019-12-14 03:43:14146 // For intercepting requests via network service. There is one per factory
147 // created via RenderProcessHost::CreateURLLoaderFactory. Only accessed on IO
148 // thread.
149 std::set<std::unique_ptr<RenderProcessHostWrapper>, base::UniquePtrComparator>
David Benjamine430b8a2019-03-21 20:46:27150 subresource_wrappers_;
Clark DuVall649c05f2019-02-05 23:58:47151 std::set<std::unique_ptr<URLLoaderFactoryNavigationWrapper>>
152 navigation_wrappers_;
Dan Harrington942019f2019-01-04 17:58:03153
154 DISALLOW_COPY_AND_ASSIGN(IOState);
155};
156
Yao Xiao43ae3bc2019-07-09 05:22:23157class URLLoaderClientInterceptor : public network::mojom::URLLoaderClient {
158 public:
159 explicit URLLoaderClientInterceptor(
danakj710b4c02019-11-28 16:08:45160 base::OnceCallback<network::mojom::URLLoaderFactory*()> factory_getter,
Yao Xiao43ae3bc2019-07-09 05:22:23161 URLLoaderInterceptor::RequestParams params,
162 const URLLoaderInterceptor::URLLoaderCompletionStatusCallback&
163 completion_status_callback)
164 : original_client_(std::move(params.client)),
Yao Xiao43ae3bc2019-07-09 05:22:23165 completion_status_callback_(std::move(completion_status_callback)),
166 request_url_(params.url_request.url) {
danakj710b4c02019-11-28 16:08:45167 std::move(factory_getter)
168 .Run()
169 ->CreateLoaderAndStart(
Dave Tapuska28226d042021-03-17 14:21:29170 std::move(params.receiver), params.request_id, params.options,
171 std::move(params.url_request),
danakj710b4c02019-11-28 16:08:45172 delegating_client_receiver_.BindNewPipeAndPassRemote(),
173 params.traffic_annotation);
Yao Xiao43ae3bc2019-07-09 05:22:23174 }
175
Kenichi Ishibashi8a16c142021-03-13 02:55:33176 void OnReceiveEarlyHints(network::mojom::EarlyHintsPtr early_hints) override {
177 original_client_->OnReceiveEarlyHints(std::move(early_hints));
178 }
179
Lucas Furukawa Gadani81e294b2019-08-29 16:26:32180 void OnReceiveResponse(network::mojom::URLResponseHeadPtr head) override {
181 original_client_->OnReceiveResponse(std::move(head));
Yao Xiao43ae3bc2019-07-09 05:22:23182 }
183
184 void OnReceiveRedirect(const net::RedirectInfo& redirect_info,
Lucas Furukawa Gadani81e294b2019-08-29 16:26:32185 network::mojom::URLResponseHeadPtr head) override {
186 original_client_->OnReceiveRedirect(redirect_info, std::move(head));
Yao Xiao43ae3bc2019-07-09 05:22:23187 }
188
189 void OnUploadProgress(int64_t current_position,
190 int64_t total_size,
191 base::OnceCallback<void()> callback) override {
192 original_client_->OnUploadProgress(current_position, total_size,
193 std::move(callback));
194 }
195
196 void OnReceiveCachedMetadata(mojo_base::BigBuffer data) override {
197 original_client_->OnReceiveCachedMetadata(std::move(data));
198 }
199
200 void OnTransferSizeUpdated(int32_t transfer_size_diff) override {
201 original_client_->OnTransferSizeUpdated(transfer_size_diff);
202 }
203
204 void OnStartLoadingResponseBody(
205 mojo::ScopedDataPipeConsumerHandle body) override {
206 original_client_->OnStartLoadingResponseBody(std::move(body));
207 }
208
209 void OnComplete(const network::URLLoaderCompletionStatus& status) override {
210 if (!completion_status_callback_.is_null())
211 completion_status_callback_.Run(request_url_, status);
212 original_client_->OnComplete(status);
213 }
214
215 private:
Julie Jeongeun Kim6dd4c7b2019-11-18 05:56:30216 mojo::Remote<network::mojom::URLLoaderClient> original_client_;
Julie Jeongeun Kim028b2c92019-11-08 02:51:16217 mojo::Receiver<network::mojom::URLLoaderClient> delegating_client_receiver_{
218 this};
Yao Xiao43ae3bc2019-07-09 05:22:23219 URLLoaderInterceptor::URLLoaderCompletionStatusCallback
220 completion_status_callback_;
221 GURL request_url_;
222};
223
John Abd-El-Malekb165dc52018-01-18 17:12:18224class URLLoaderInterceptor::Interceptor
225 : public network::mojom::URLLoaderFactory {
John Abd-El-Maleka4bb87f2017-11-27 21:32:19226 public:
danakj710b4c02019-11-28 16:08:45227 using ProcessIdGetter = base::RepeatingCallback<int()>;
John Abd-El-Malekb165dc52018-01-18 17:12:18228 using OriginalFactoryGetter =
danakj710b4c02019-11-28 16:08:45229 base::RepeatingCallback<network::mojom::URLLoaderFactory*()>;
John Abd-El-Maleka4bb87f2017-11-27 21:32:19230
Dan Harrington942019f2019-01-04 17:58:03231 Interceptor(URLLoaderInterceptor::IOState* parent,
danakj710b4c02019-11-28 16:08:45232 ProcessIdGetter process_id_getter,
233 OriginalFactoryGetter original_factory_getter)
John Abd-El-Maleka4bb87f2017-11-27 21:32:19234 : parent_(parent),
danakj710b4c02019-11-28 16:08:45235 process_id_getter_(std::move(process_id_getter)),
236 original_factory_getter_(std::move(original_factory_getter)) {
Julie Jeongeun Kim7f8e26a22019-10-10 12:09:52237 receivers_.set_disconnect_handler(base::BindRepeating(
Ken Rockot0cf16c32018-03-01 16:50:49238 &Interceptor::OnConnectionError, base::Unretained(this)));
239 }
John Abd-El-Maleka4bb87f2017-11-27 21:32:19240
241 ~Interceptor() override {}
242
Julie Jeongeun Kim7f8e26a22019-10-10 12:09:52243 void BindReceiver(
244 mojo::PendingReceiver<network::mojom::URLLoaderFactory> receiver) {
245 receivers_.Add(this, std::move(receiver));
Ken Rockot0cf16c32018-03-01 16:50:49246 }
247
248 void SetConnectionErrorHandler(base::OnceClosure handler) {
249 error_handler_ = std::move(handler);
250 }
251
John Abd-El-Maleka4bb87f2017-11-27 21:32:19252 private:
John Abd-El-Malekb165dc52018-01-18 17:12:18253 // network::mojom::URLLoaderFactory implementation:
Julie Jeongeun Kime003de52019-10-29 05:14:27254 void CreateLoaderAndStart(
255 mojo::PendingReceiver<network::mojom::URLLoader> receiver,
Julie Jeongeun Kime003de52019-10-29 05:14:27256 int32_t request_id,
257 uint32_t options,
258 const network::ResourceRequest& url_request,
Julie Jeongeun Kim6dd4c7b2019-11-18 05:56:30259 mojo::PendingRemote<network::mojom::URLLoaderClient> client,
Julie Jeongeun Kime003de52019-10-29 05:14:27260 const net::MutableNetworkTrafficAnnotationTag& traffic_annotation)
261 override {
John Abd-El-Maleka4bb87f2017-11-27 21:32:19262 RequestParams params;
263 params.process_id = process_id_getter_.Run();
Julie Jeongeun Kime003de52019-10-29 05:14:27264 params.receiver = std::move(receiver);
John Abd-El-Maleka4bb87f2017-11-27 21:32:19265 params.request_id = request_id;
266 params.options = options;
267 params.url_request = std::move(url_request);
Julie Jeongeun Kim6dd4c7b2019-11-18 05:56:30268 params.client.Bind(std::move(client));
John Abd-El-Maleka4bb87f2017-11-27 21:32:19269 params.traffic_annotation = traffic_annotation;
arthursonzognib8a02552018-04-24 23:03:42270
John Abd-El-Malekdb3a13b2018-05-01 17:52:02271 if (parent_->Intercept(&params))
John Abd-El-Maleka4bb87f2017-11-27 21:32:19272 return;
273
Yao Xiao43ae3bc2019-07-09 05:22:23274 url_loader_client_interceptors_.push_back(
275 std::make_unique<URLLoaderClientInterceptor>(
danakj710b4c02019-11-28 16:08:45276 original_factory_getter_, std::move(params),
Yao Xiao43ae3bc2019-07-09 05:22:23277 parent_->GetCompletionStatusCallback()));
John Abd-El-Maleka4bb87f2017-11-27 21:32:19278 }
279
Julie Jeongeun Kim7f8e26a22019-10-10 12:09:52280 void Clone(mojo::PendingReceiver<network::mojom::URLLoaderFactory> receiver)
281 override {
282 BindReceiver(std::move(receiver));
Ken Rockot0cf16c32018-03-01 16:50:49283 }
284
285 void OnConnectionError() {
Julie Jeongeun Kim7f8e26a22019-10-10 12:09:52286 if (receivers_.empty() && error_handler_)
Ken Rockot0cf16c32018-03-01 16:50:49287 std::move(error_handler_).Run();
John Abd-El-Malekb165dc52018-01-18 17:12:18288 }
John Abd-El-Maleka4bb87f2017-11-27 21:32:19289
Dan Harrington942019f2019-01-04 17:58:03290 URLLoaderInterceptor::IOState* parent_;
John Abd-El-Maleka4bb87f2017-11-27 21:32:19291 ProcessIdGetter process_id_getter_;
292 OriginalFactoryGetter original_factory_getter_;
Julie Jeongeun Kim7f8e26a22019-10-10 12:09:52293 mojo::ReceiverSet<network::mojom::URLLoaderFactory> receivers_;
Ken Rockot0cf16c32018-03-01 16:50:49294 base::OnceClosure error_handler_;
Yao Xiao43ae3bc2019-07-09 05:22:23295 std::vector<std::unique_ptr<URLLoaderClientInterceptor>>
296 url_loader_client_interceptors_;
John Abd-El-Maleka4bb87f2017-11-27 21:32:19297
298 DISALLOW_COPY_AND_ASSIGN(Interceptor);
299};
300
John Abd-El-Malek63ff5f32017-12-18 22:14:58301// This class intercepts calls to each StoragePartition's URLLoaderFactoryGetter
302// so that it can intercept frame requests.
303class URLLoaderInterceptor::URLLoaderFactoryGetterWrapper {
John Abd-El-Maleka4bb87f2017-11-27 21:32:19304 public:
John Abd-El-Malek63ff5f32017-12-18 22:14:58305 URLLoaderFactoryGetterWrapper(
Matt Falkenhagen4df68d22019-09-09 08:34:15306 scoped_refptr<URLLoaderFactoryGetter> url_loader_factory_getter,
Dan Harrington942019f2019-01-04 17:58:03307 URLLoaderInterceptor::IOState* parent)
Matt Falkenhagen4df68d22019-09-09 08:34:15308 : url_loader_factory_getter_(std::move(url_loader_factory_getter)) {
Dan Harrington942019f2019-01-04 17:58:03309 DCHECK_CURRENTLY_ON(BrowserThread::IO);
John Abd-El-Malek63ff5f32017-12-18 22:14:58310 frame_interceptor_ = std::make_unique<Interceptor>(
311 parent, base::BindRepeating([]() { return 0; }),
John Abd-El-Malekb165dc52018-01-18 17:12:18312 base::BindLambdaForTesting([=]() -> network::mojom::URLLoaderFactory* {
Matt Falkenhagen4df68d22019-09-09 08:34:15313 return url_loader_factory_getter_
John Abd-El-Malek63ff5f32017-12-18 22:14:58314 ->original_network_factory_for_testing()
315 ->get();
316 }));
317 url_loader_factory_getter_->SetNetworkFactoryForTesting(
Lukasz Anforowicz288027b2019-01-17 01:51:27318 frame_interceptor_.get());
John Abd-El-Malek63ff5f32017-12-18 22:14:58319 }
320
321 ~URLLoaderFactoryGetterWrapper() {
Dan Harrington942019f2019-01-04 17:58:03322 DCHECK_CURRENTLY_ON(BrowserThread::IO);
Lukasz Anforowicz288027b2019-01-17 01:51:27323 url_loader_factory_getter_->SetNetworkFactoryForTesting(nullptr);
John Abd-El-Malek63ff5f32017-12-18 22:14:58324 }
325
326 private:
327 std::unique_ptr<Interceptor> frame_interceptor_;
Matt Falkenhagen4df68d22019-09-09 08:34:15328 scoped_refptr<URLLoaderFactoryGetter> url_loader_factory_getter_;
John Abd-El-Malek63ff5f32017-12-18 22:14:58329};
330
Clark DuValla5e25b752018-11-27 22:08:16331class URLLoaderInterceptor::URLLoaderFactoryNavigationWrapper {
332 public:
333 URLLoaderFactoryNavigationWrapper(
Julie Jeongeun Kimb405097b2019-10-10 15:34:07334 mojo::PendingReceiver<network::mojom::URLLoaderFactory> receiver,
Julie Jeongeun Kim2811b952019-10-24 00:36:12335 mojo::PendingRemote<network::mojom::URLLoaderFactory> target_factory,
Dan Harrington942019f2019-01-04 17:58:03336 URLLoaderInterceptor::IOState* parent)
Clark DuValla5e25b752018-11-27 22:08:16337 : target_factory_(std::move(target_factory)) {
338 interceptor_ = std::make_unique<Interceptor>(
339 parent, base::BindRepeating([]() { return 0; }),
340 base::BindLambdaForTesting([=]() -> network::mojom::URLLoaderFactory* {
341 return this->target_factory_.get();
342 }));
Julie Jeongeun Kimb405097b2019-10-10 15:34:07343 interceptor_->BindReceiver(std::move(receiver));
Clark DuValla5e25b752018-11-27 22:08:16344 }
345
346 private:
347 std::unique_ptr<Interceptor> interceptor_;
Julie Jeongeun Kim2811b952019-10-24 00:36:12348 mojo::Remote<network::mojom::URLLoaderFactory> target_factory_;
Clark DuValla5e25b752018-11-27 22:08:16349};
350
John Abd-El-Malekd5f920342018-02-12 17:37:36351// This class intercepts calls to
352// StoragePartition::GetURLLoaderFactoryForBrowserProcess.
353class URLLoaderInterceptor::BrowserProcessWrapper {
354 public:
Julie Jeongeun Kimb405097b2019-10-10 15:34:07355 BrowserProcessWrapper(
356 mojo::PendingReceiver<network::mojom::URLLoaderFactory> factory_receiver,
357 URLLoaderInterceptor::IOState* parent,
Julie Jeongeun Kim2811b952019-10-24 00:36:12358 mojo::PendingRemote<network::mojom::URLLoaderFactory> original_factory)
John Abd-El-Malekd5f920342018-02-12 17:37:36359 : interceptor_(
360 parent,
361 base::BindRepeating([]() { return 0; }),
362 base::BindRepeating(&BrowserProcessWrapper::GetOriginalFactory,
363 base::Unretained(this))),
Ken Rockot0cf16c32018-03-01 16:50:49364 original_factory_(std::move(original_factory)) {
Julie Jeongeun Kimb405097b2019-10-10 15:34:07365 interceptor_.BindReceiver(std::move(factory_receiver));
Ken Rockot0cf16c32018-03-01 16:50:49366 }
John Abd-El-Malekd5f920342018-02-12 17:37:36367
368 ~BrowserProcessWrapper() {}
369
370 private:
371 network::mojom::URLLoaderFactory* GetOriginalFactory() {
372 return original_factory_.get();
373 }
374
375 Interceptor interceptor_;
Julie Jeongeun Kim2811b952019-10-24 00:36:12376 mojo::Remote<network::mojom::URLLoaderFactory> original_factory_;
John Abd-El-Malekd5f920342018-02-12 17:37:36377
378 DISALLOW_COPY_AND_ASSIGN(BrowserProcessWrapper);
379};
380
Lukasz Anforowicz6a16fea2019-12-14 03:43:14381// This class is used (e.g. sent in a RenderFrame commit message, or used to
382// fetch a worker's main script) so it can intercept requests that normally
383// would be handled by the network service factory created via
384// RenderProcessHost::CreateURLLoaderFactory.
385class URLLoaderInterceptor::RenderProcessHostWrapper {
John Abd-El-Malek63ff5f32017-12-18 22:14:58386 public:
Lukasz Anforowicz6a16fea2019-12-14 03:43:14387 RenderProcessHostWrapper(
Julie Jeongeun Kimb405097b2019-10-10 15:34:07388 mojo::PendingReceiver<network::mojom::URLLoaderFactory> factory_receiver,
389 int process_id,
390 URLLoaderInterceptor::IOState* parent,
Julie Jeongeun Kim2811b952019-10-24 00:36:12391 mojo::PendingRemote<network::mojom::URLLoaderFactory> original_factory)
John Abd-El-Maleka4bb87f2017-11-27 21:32:19392 : interceptor_(
393 parent,
John Abd-El-Malek63ff5f32017-12-18 22:14:58394 base::BindRepeating([](int process_id) { return process_id; },
395 process_id),
Lukasz Anforowicz6a16fea2019-12-14 03:43:14396 base::BindRepeating(&RenderProcessHostWrapper::GetOriginalFactory,
John Abd-El-Malek63ff5f32017-12-18 22:14:58397 base::Unretained(this))),
John Abd-El-Malek63ff5f32017-12-18 22:14:58398 original_factory_(std::move(original_factory)) {
Julie Jeongeun Kimb405097b2019-10-10 15:34:07399 interceptor_.BindReceiver(std::move(factory_receiver));
Dan Harrington942019f2019-01-04 17:58:03400 interceptor_.SetConnectionErrorHandler(base::BindOnce(
Lukasz Anforowicz6a16fea2019-12-14 03:43:14401 &URLLoaderInterceptor::IOState::RenderProcessHostWrapperBindingError,
Dan Harrington942019f2019-01-04 17:58:03402 base::Unretained(parent), this));
John Abd-El-Malek63ff5f32017-12-18 22:14:58403 }
John Abd-El-Maleka4bb87f2017-11-27 21:32:19404
Lukasz Anforowicz6a16fea2019-12-14 03:43:14405 ~RenderProcessHostWrapper() {}
John Abd-El-Maleka4bb87f2017-11-27 21:32:19406
407 private:
John Abd-El-Malekb165dc52018-01-18 17:12:18408 network::mojom::URLLoaderFactory* GetOriginalFactory() {
John Abd-El-Maleka4bb87f2017-11-27 21:32:19409 return original_factory_.get();
410 }
411
412 Interceptor interceptor_;
Julie Jeongeun Kim2811b952019-10-24 00:36:12413 mojo::Remote<network::mojom::URLLoaderFactory> original_factory_;
John Abd-El-Maleka4bb87f2017-11-27 21:32:19414
Lukasz Anforowicz6a16fea2019-12-14 03:43:14415 DISALLOW_COPY_AND_ASSIGN(RenderProcessHostWrapper);
John Abd-El-Maleka4bb87f2017-11-27 21:32:19416};
417
418URLLoaderInterceptor::RequestParams::RequestParams() = default;
419URLLoaderInterceptor::RequestParams::~RequestParams() = default;
John Abd-El-Malekdf84c4492018-02-23 02:32:44420URLLoaderInterceptor::RequestParams::RequestParams(RequestParams&& other) =
421 default;
422URLLoaderInterceptor::RequestParams& URLLoaderInterceptor::RequestParams::
423operator=(RequestParams&& other) = default;
John Abd-El-Maleka4bb87f2017-11-27 21:32:19424
danakj710b4c02019-11-28 16:08:45425URLLoaderInterceptor::URLLoaderInterceptor(InterceptCallback callback)
426 : URLLoaderInterceptor(std::move(callback), {}, {}) {}
Dan Harringtona11fc962019-01-07 22:15:17427
Yao Xiao43ae3bc2019-07-09 05:22:23428URLLoaderInterceptor::URLLoaderInterceptor(
danakj710b4c02019-11-28 16:08:45429 InterceptCallback callback,
Yao Xiao43ae3bc2019-07-09 05:22:23430 const URLLoaderCompletionStatusCallback& completion_status_callback,
431 base::OnceClosure ready_callback)
danakj710b4c02019-11-28 16:08:45432 : callback_(std::move(callback)),
433 io_thread_(base::MakeRefCounted<IOState>(this)) {
John Abd-El-Malek63ff5f32017-12-18 22:14:58434 DCHECK(!BrowserThread::IsThreadInitialized(BrowserThread::UI) ||
435 BrowserThread::CurrentlyOn(BrowserThread::UI));
Dan Harrington942019f2019-01-04 17:58:03436 use_runloop_ = !ready_callback;
Lukasz Anforowicz6a16fea2019-12-14 03:43:14437 RenderProcessHostImpl::SetNetworkFactoryForTesting(base::BindRepeating(
438 &URLLoaderInterceptor::CreateURLLoaderFactoryForRenderProcessHost,
439 base::Unretained(this)));
440 MockRenderProcessHost::SetNetworkFactory(base::BindRepeating(
441 &URLLoaderInterceptor::CreateURLLoaderFactoryForRenderProcessHost,
Matt Falkenhagen4332b162019-03-04 08:58:52442 base::Unretained(this)));
John Abd-El-Maleka4bb87f2017-11-27 21:32:19443
John Abd-El-Malekd5f920342018-02-12 17:37:36444 StoragePartitionImpl::
445 SetGetURLLoaderFactoryForBrowserProcessCallbackForTesting(
446 base::BindRepeating(
447 &URLLoaderInterceptor::GetURLLoaderFactoryForBrowserProcess,
448 base::Unretained(this)));
449
Clark DuValla1220f72019-08-02 19:00:57450 NavigationURLLoaderImpl::SetURLLoaderFactoryInterceptorForTesting(
451 base::BindRepeating(
452 &URLLoaderInterceptor::InterceptNavigationRequestCallback,
453 base::Unretained(this)));
Clark DuVall0d278b432019-06-25 18:24:57454
John Abd-El-Malek63ff5f32017-12-18 22:14:58455 if (BrowserThread::IsThreadInitialized(BrowserThread::IO)) {
Dan Harrington942019f2019-01-04 17:58:03456 if (use_runloop_) {
457 base::RunLoop run_loop;
Gabriel Charettee7cdc5cd2020-05-27 23:35:05458 GetIOThreadTaskRunner({})->PostTask(
459 FROM_HERE,
Dan Harrington942019f2019-01-04 17:58:03460 base::BindOnce(&URLLoaderInterceptor::IOState::Initialize, io_thread_,
Yao Xiao43ae3bc2019-07-09 05:22:23461 std::move(completion_status_callback),
Dan Harrington942019f2019-01-04 17:58:03462 run_loop.QuitClosure()));
463 run_loop.Run();
464 } else {
465 base::OnceClosure wrapped_callback = base::BindOnce(
466 [](base::OnceClosure callback) {
Gabriel Charettee7cdc5cd2020-05-27 23:35:05467 GetUIThreadTaskRunner({})->PostTask(FROM_HERE, std::move(callback));
Dan Harrington942019f2019-01-04 17:58:03468 },
469 std::move(ready_callback));
470
Gabriel Charettee7cdc5cd2020-05-27 23:35:05471 GetIOThreadTaskRunner({})->PostTask(
472 FROM_HERE,
Dan Harrington942019f2019-01-04 17:58:03473 base::BindOnce(&URLLoaderInterceptor::IOState::Initialize, io_thread_,
Yao Xiao43ae3bc2019-07-09 05:22:23474 std::move(completion_status_callback),
Dan Harrington942019f2019-01-04 17:58:03475 std::move(wrapped_callback)));
476 }
John Abd-El-Malek63ff5f32017-12-18 22:14:58477 } else {
Yao Xiao43ae3bc2019-07-09 05:22:23478 io_thread_->Initialize(std::move(completion_status_callback),
479 std::move(ready_callback));
John Abd-El-Maleka4bb87f2017-11-27 21:32:19480 }
481}
482
483URLLoaderInterceptor::~URLLoaderInterceptor() {
484 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
Dan Harrington942019f2019-01-04 17:58:03485 io_thread_->UnsetParent();
John Abd-El-Malek63ff5f32017-12-18 22:14:58486
Lukasz Anforowicz6a16fea2019-12-14 03:43:14487 RenderProcessHostImpl::SetNetworkFactoryForTesting(
488 RenderProcessHostImpl::CreateNetworkFactoryCallback());
John Abd-El-Maleka4bb87f2017-11-27 21:32:19489
John Abd-El-Malekd5f920342018-02-12 17:37:36490 StoragePartitionImpl::
491 SetGetURLLoaderFactoryForBrowserProcessCallbackForTesting(
492 StoragePartitionImpl::CreateNetworkFactoryCallback());
493
Clark DuValla1220f72019-08-02 19:00:57494 NavigationURLLoaderImpl::SetURLLoaderFactoryInterceptorForTesting(
495 NavigationURLLoaderImpl::URLLoaderFactoryInterceptor());
Clark DuVall0d278b432019-06-25 18:24:57496
Matt Falkenhagen4df68d22019-09-09 08:34:15497 MockRenderProcessHost::SetNetworkFactory(
498 MockRenderProcessHost::CreateNetworkFactoryCallback());
499
Dan Harrington942019f2019-01-04 17:58:03500 if (use_runloop_) {
501 base::RunLoop run_loop;
Gabriel Charettee7cdc5cd2020-05-27 23:35:05502 GetIOThreadTaskRunner({})->PostTask(
503 FROM_HERE, base::BindOnce(&URLLoaderInterceptor::IOState::Shutdown,
Sami Kyostila807cd4d2019-08-01 16:15:07504 io_thread_, run_loop.QuitClosure()));
Dan Harrington942019f2019-01-04 17:58:03505 run_loop.Run();
506 } else {
Gabriel Charettee7cdc5cd2020-05-27 23:35:05507 GetIOThreadTaskRunner({})->PostTask(
508 FROM_HERE, base::BindOnce(&URLLoaderInterceptor::IOState::Shutdown,
Sami Kyostila807cd4d2019-08-01 16:15:07509 io_thread_, base::OnceClosure()));
Dan Harrington942019f2019-01-04 17:58:03510 }
John Abd-El-Maleka4bb87f2017-11-27 21:32:19511}
512
Adrienne Walkere648ce5a2020-06-06 01:09:59513// static
514std::unique_ptr<URLLoaderInterceptor>
515URLLoaderInterceptor::ServeFilesFromDirectoryAtOrigin(
516 const std::string& relative_base_path,
517 const GURL& origin,
518 base::RepeatingCallback<void(const GURL&)> callback) {
519 return std::make_unique<URLLoaderInterceptor>(base::BindLambdaForTesting(
520 [=](content::URLLoaderInterceptor::RequestParams* params) -> bool {
521 // Ignore requests for other origins.
522 if (params->url_request.url.GetOrigin() != origin.GetOrigin())
523 return false;
524
525 // Remove the leading slash from the url path, so that it can be
526 // treated as a relative path by base::FilePath::AppendASCII.
527 auto path = base::TrimString(params->url_request.url.path_piece(), "/",
528 base::TRIM_LEADING);
529
530 // URLLoaderInterceptor insists that all files exist unless
531 // explicitly said to be failing. Many browsertests fetch
532 // nonessential urls like favicons, so just ignore missing files
533 // entirely, to behave more like net::test::EmbeddedTestServer.
534 base::ScopedAllowBlockingForTesting allow_blocking;
535 auto full_path = GetDataFilePath(relative_base_path).AppendASCII(path);
536 if (!base::PathExists(full_path))
537 return false;
538
539 callback.Run(params->url_request.url);
540 content::URLLoaderInterceptor::WriteResponse(full_path,
541 params->client.get());
542 return true;
543 }));
544}
545
John Abd-El-Malekb165dc52018-01-18 17:12:18546void URLLoaderInterceptor::WriteResponse(
Titouan Rigoudy4d8f5772020-08-06 17:28:24547 base::StringPiece headers,
548 base::StringPiece body,
Ovidio Henriquezf8e2d93a2018-08-01 15:28:42549 network::mojom::URLLoaderClient* client,
Anton Bikineevf62d1bf2021-05-15 17:56:07550 absl::optional<net::SSLInfo> ssl_info) {
John Abd-El-Maleka796fa52017-12-12 17:12:32551 net::HttpResponseInfo info;
David Benjamin1384c0402019-04-29 18:55:52552 info.headers = base::MakeRefCounted<net::HttpResponseHeaders>(
553 net::HttpUtil::AssembleRawHeaders(headers));
Lucas Furukawa Gadanib8674782019-12-11 16:22:58554 auto response = network::mojom::URLResponseHead::New();
555 response->headers = info.headers;
556 response->headers->GetMimeType(&response->mime_type);
557 response->ssl_info = std::move(ssl_info);
558 client->OnReceiveResponse(std::move(response));
John Abd-El-Maleka796fa52017-12-12 17:12:32559
Titouan Rigoudy4d8f5772020-08-06 17:28:24560 CHECK_EQ(WriteResponseBody(body, client), MOJO_RESULT_OK);
John Abd-El-Maleka796fa52017-12-12 17:12:32561}
562
John Abd-El-Malek30a86892018-05-26 00:14:16563void URLLoaderInterceptor::WriteResponse(
564 const std::string& relative_path,
565 network::mojom::URLLoaderClient* client,
Ovidio Henriquezf8e2d93a2018-08-01 15:28:42566 const std::string* headers,
Anton Bikineevf62d1bf2021-05-15 17:56:07567 absl::optional<net::SSLInfo> ssl_info) {
John Abd-El-Malek1d1ff9182018-08-10 16:18:23568 return WriteResponse(GetDataFilePath(relative_path), client, headers,
569 std::move(ssl_info));
570}
571
572void URLLoaderInterceptor::WriteResponse(
573 const base::FilePath& file_path,
574 network::mojom::URLLoaderClient* client,
575 const std::string* headers,
Anton Bikineevf62d1bf2021-05-15 17:56:07576 absl::optional<net::SSLInfo> ssl_info) {
John Abd-El-Malek30a86892018-05-26 00:14:16577 base::ScopedAllowBlockingForTesting allow_io;
578 std::string headers_str;
579 if (headers) {
580 headers_str = *headers;
581 } else {
Jan Wilken Dörrie9720dce2020-07-21 17:14:23582 base::FilePath headers_path(
583 file_path.AddExtension(net::test_server::kMockHttpHeadersExtension));
John Abd-El-Malek1d1ff9182018-08-10 16:18:23584 if (base::PathExists(headers_path)) {
John Abd-El-Malek30a86892018-05-26 00:14:16585 headers_str = ReadFile(headers_path);
586 } else {
587 headers_str = "HTTP/1.0 200 OK\nContent-type: " +
John Abd-El-Malek1d1ff9182018-08-10 16:18:23588 net::test_server::GetContentType(file_path) + "\n\n";
John Abd-El-Malek30a86892018-05-26 00:14:16589 }
590 }
John Abd-El-Malek1d1ff9182018-08-10 16:18:23591 WriteResponse(headers_str, ReadFile(file_path), client, std::move(ssl_info));
John Abd-El-Malek30a86892018-05-26 00:14:16592}
593
Titouan Rigoudy4d8f5772020-08-06 17:28:24594MojoResult URLLoaderInterceptor::WriteResponseBody(
595 base::StringPiece body,
596 network::mojom::URLLoaderClient* client) {
597 mojo::ScopedDataPipeProducerHandle producer_handle;
598 mojo::ScopedDataPipeConsumerHandle consumer_handle;
599
600 MojoCreateDataPipeOptions options;
601 options.struct_size = sizeof(MojoCreateDataPipeOptions);
602 options.flags = MOJO_CREATE_DATA_PIPE_FLAG_NONE;
603 options.element_num_bytes = 1;
604 options.capacity_num_bytes = body.size();
605
606 MojoResult result =
Robert Sesek3bce5dd2021-02-19 19:27:58607 CreateDataPipe(&options, producer_handle, consumer_handle);
Titouan Rigoudy4d8f5772020-08-06 17:28:24608 if (result != MOJO_RESULT_OK) {
609 return result;
610 }
611
612 uint32_t bytes_written = body.size();
613 result = producer_handle->WriteData(body.data(), &bytes_written,
614 MOJO_WRITE_DATA_FLAG_ALL_OR_NONE);
615 if (result != MOJO_RESULT_OK) {
616 return result;
617 }
618
619 client->OnStartLoadingResponseBody(std::move(consumer_handle));
620
621 network::URLLoaderCompletionStatus status;
622 status.decoded_body_length = body.size();
623 status.error_code = net::OK;
624 client->OnComplete(status);
625
626 return MOJO_RESULT_OK;
627}
628
Lukasz Anforowicz6a16fea2019-12-14 03:43:14629void URLLoaderInterceptor::CreateURLLoaderFactoryForRenderProcessHost(
Julie Jeongeun Kimb405097b2019-10-10 15:34:07630 mojo::PendingReceiver<network::mojom::URLLoaderFactory> receiver,
John Abd-El-Maleka4bb87f2017-11-27 21:32:19631 int process_id,
Julie Jeongeun Kim2811b952019-10-24 00:36:12632 mojo::PendingRemote<network::mojom::URLLoaderFactory> original_factory) {
John Abd-El-Malek63ff5f32017-12-18 22:14:58633 if (!BrowserThread::CurrentlyOn(BrowserThread::IO)) {
Gabriel Charettee7cdc5cd2020-05-27 23:35:05634 GetIOThreadTaskRunner({})->PostTask(
635 FROM_HERE,
tzikff02d282018-02-22 06:11:08636 base::BindOnce(
Lukasz Anforowicz6a16fea2019-12-14 03:43:14637 &URLLoaderInterceptor::CreateURLLoaderFactoryForRenderProcessHost,
Julie Jeongeun Kimb405097b2019-10-10 15:34:07638 base::Unretained(this), std::move(receiver), process_id,
tzik983fb232018-04-06 15:47:50639 std::move(original_factory)));
John Abd-El-Maleka4bb87f2017-11-27 21:32:19640 return;
641 }
Lukasz Anforowicz6a16fea2019-12-14 03:43:14642 io_thread_->CreateURLLoaderFactoryForRenderProcessHost(
Julie Jeongeun Kimb405097b2019-10-10 15:34:07643 std::move(receiver), process_id, std::move(original_factory));
John Abd-El-Maleka4bb87f2017-11-27 21:32:19644}
645
Julie Jeongeun Kim2811b952019-10-24 00:36:12646mojo::PendingRemote<network::mojom::URLLoaderFactory>
John Abd-El-Malekd5f920342018-02-12 17:37:36647URLLoaderInterceptor::GetURLLoaderFactoryForBrowserProcess(
Julie Jeongeun Kim2811b952019-10-24 00:36:12648 mojo::PendingRemote<network::mojom::URLLoaderFactory> original_factory) {
John Abd-El-Malekd5f920342018-02-12 17:37:36649 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
Julie Jeongeun Kim2811b952019-10-24 00:36:12650 mojo::PendingRemote<network::mojom::URLLoaderFactory> loader_factory;
John Abd-El-Malekd5f920342018-02-12 17:37:36651 browser_process_interceptors_.emplace(std::make_unique<BrowserProcessWrapper>(
Julie Jeongeun Kim2811b952019-10-24 00:36:12652 loader_factory.InitWithNewPipeAndPassReceiver(), io_thread_.get(),
Dan Harrington942019f2019-01-04 17:58:03653 std::move(original_factory)));
John Abd-El-Malekd5f920342018-02-12 17:37:36654 return loader_factory;
655}
656
Clark DuVall0d278b432019-06-25 18:24:57657void URLLoaderInterceptor::InterceptNavigationRequestCallback(
Julie Jeongeun Kimb405097b2019-10-10 15:34:07658 mojo::PendingReceiver<network::mojom::URLLoaderFactory>* receiver) {
Clark DuVall0d278b432019-06-25 18:24:57659 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
660
Julie Jeongeun Kimb405097b2019-10-10 15:34:07661 auto proxied_receiver = std::move(*receiver);
Julie Jeongeun Kim2811b952019-10-24 00:36:12662 mojo::PendingRemote<network::mojom::URLLoaderFactory> target_factory;
663 *receiver = target_factory.InitWithNewPipeAndPassReceiver();
Clark DuVall0d278b432019-06-25 18:24:57664
665 navigation_wrappers_.emplace(
666 std::make_unique<URLLoaderFactoryNavigationWrapper>(
Julie Jeongeun Kimb405097b2019-10-10 15:34:07667 std::move(proxied_receiver), std::move(target_factory),
Clark DuVall0d278b432019-06-25 18:24:57668 io_thread_.get()));
669}
670
John Abd-El-Malekdb3a13b2018-05-01 17:52:02671bool URLLoaderInterceptor::Intercept(RequestParams* params) {
672 if (callback_.Run(params))
673 return true;
674
675 // mock.failed.request is a special request whereby the query indicates what
676 // error code to respond with.
677 if (params->url_request.url.DomainIs("mock.failed.request")) {
678 std::string query = params->url_request.url.query();
679 std::string error_code = query.substr(query.find("=") + 1);
680
681 int error = 0;
682 base::StringToInt(error_code, &error);
683 network::URLLoaderCompletionStatus status;
684 status.error_code = error;
685 params->client->OnComplete(status);
686 return true;
687 }
688
689 return false;
690}
691
Lukasz Anforowicz6a16fea2019-12-14 03:43:14692void URLLoaderInterceptor::IOState::RenderProcessHostWrapperBindingError(
693 RenderProcessHostWrapper* wrapper) {
John Abd-El-Malekd5f920342018-02-12 17:37:36694 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
David Benjamine430b8a2019-03-21 20:46:27695 auto it = subresource_wrappers_.find(wrapper);
696 DCHECK(it != subresource_wrappers_.end());
697 subresource_wrappers_.erase(it);
John Abd-El-Malek63ff5f32017-12-18 22:14:58698}
699
Yao Xiao43ae3bc2019-07-09 05:22:23700void URLLoaderInterceptor::IOState::Initialize(
701 const URLLoaderCompletionStatusCallback& completion_status_callback,
702 base::OnceClosure closure) {
703 completion_status_callback_ = std::move(completion_status_callback);
John Abd-El-Malek87301582019-07-27 04:50:52704 URLLoaderFactoryGetter::SetGetNetworkFactoryCallbackForTesting(
705 base::BindRepeating(
706 &URLLoaderInterceptor::IOState::GetNetworkFactoryCallback,
707 base::Unretained(this)));
Clark DuVall649c05f2019-02-05 23:58:47708
John Abd-El-Malek63ff5f32017-12-18 22:14:58709 if (closure)
710 std::move(closure).Run();
711}
712
Dan Harrington942019f2019-01-04 17:58:03713void URLLoaderInterceptor::IOState::GetNetworkFactoryCallback(
Matt Falkenhagen4df68d22019-09-09 08:34:15714 scoped_refptr<URLLoaderFactoryGetter> url_loader_factory_getter) {
John Abd-El-Maleka4bb87f2017-11-27 21:32:19715 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
Dan Harrington942019f2019-01-04 17:58:03716 url_loader_factory_getter_wrappers_.emplace(
717 std::make_unique<URLLoaderFactoryGetterWrapper>(url_loader_factory_getter,
718 this));
719}
John Abd-El-Malek63ff5f32017-12-18 22:14:58720
Lukasz Anforowicz6a16fea2019-12-14 03:43:14721void URLLoaderInterceptor::IOState::CreateURLLoaderFactoryForRenderProcessHost(
Julie Jeongeun Kimb405097b2019-10-10 15:34:07722 mojo::PendingReceiver<network::mojom::URLLoaderFactory> receiver,
Dan Harrington942019f2019-01-04 17:58:03723 int process_id,
Julie Jeongeun Kim2811b952019-10-24 00:36:12724 mojo::PendingRemote<network::mojom::URLLoaderFactory> original_factory) {
Dan Harrington942019f2019-01-04 17:58:03725 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
Lukasz Anforowicz6a16fea2019-12-14 03:43:14726 subresource_wrappers_.emplace(std::make_unique<RenderProcessHostWrapper>(
Julie Jeongeun Kimb405097b2019-10-10 15:34:07727 std::move(receiver), process_id, this, std::move(original_factory)));
John Abd-El-Maleka4bb87f2017-11-27 21:32:19728}
729
Lukasz Anforowicz98ccf1c2018-08-23 18:14:31730// static
731std::unique_ptr<content::URLLoaderInterceptor>
732URLLoaderInterceptor::SetupRequestFailForURL(const GURL& url,
Dan Harrington942019f2019-01-04 17:58:03733 net::Error error,
734 base::OnceClosure ready_callback) {
735 return std::make_unique<content::URLLoaderInterceptor>(
736 base::BindRepeating(
737 [](const GURL& url, net::Error error,
738 content::URLLoaderInterceptor::RequestParams* params) {
739 if (params->url_request.url != url)
740 return false;
741 params->client->OnComplete(
742 network::URLLoaderCompletionStatus(error));
743 return true;
744 },
745 url, error),
Yao Xiao43ae3bc2019-07-09 05:22:23746 URLLoaderCompletionStatusCallback(), std::move(ready_callback));
Lukasz Anforowicz98ccf1c2018-08-23 18:14:31747}
748
John Abd-El-Maleka4bb87f2017-11-27 21:32:19749} // namespace content