1// Copyright 2015 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 "ios/chrome/browser/ios_chrome_io_thread.h"
6
7#include "base/task/post_task.h"
8#include "components/variations/net/variations_http_headers.h"
9#include "ios/chrome/browser/net/ios_chrome_network_delegate.h"
10#include "ios/chrome/common/channel_info.h"
11#include "ios/web/public/init/network_context_owner.h"
12#include "ios/web/public/thread/web_task_traits.h"
13#include "services/network/public/cpp/weak_wrapper_shared_url_loader_factory.h"
14
15#if !defined(__has_feature) || !__has_feature(objc_arc)
16#error "This file requires ARC support."
17#endif
18
19IOSChromeIOThread::IOSChromeIOThread(PrefService* local_state,
20                                     net::NetLog* net_log)
21    : IOSIOThread(local_state, net_log) {
22  IOSChromeNetworkDelegate::InitializePrefsOnUIThread(nullptr, local_state);
23}
24
25IOSChromeIOThread::~IOSChromeIOThread() = default;
26
27std::unique_ptr<net::NetworkDelegate>
28IOSChromeIOThread::CreateSystemNetworkDelegate() {
29  return std::make_unique<IOSChromeNetworkDelegate>();
30}
31
32std::string IOSChromeIOThread::GetChannelString() const {
33  return ::GetChannelString();
34}
35
36network::mojom::NetworkContext* IOSChromeIOThread::GetSystemNetworkContext() {
37  if (!network_context_) {
38    network::mojom::NetworkContextParamsPtr network_context_params =
39        network::mojom::NetworkContextParams::New();
40    variations::UpdateCorsExemptHeaderForVariations(
41        network_context_params.get());
42    network_context_owner_ = std::make_unique<web::NetworkContextOwner>(
43        system_url_request_context_getter(),
44        network_context_params->cors_exempt_header_list, &network_context_);
45  }
46  return network_context_.get();
47}
48
49scoped_refptr<network::SharedURLLoaderFactory>
50IOSChromeIOThread::GetSharedURLLoaderFactory() {
51  if (!url_loader_factory_) {
52    auto url_loader_factory_params =
53        network::mojom::URLLoaderFactoryParams::New();
54    url_loader_factory_params->process_id = network::mojom::kBrowserProcessId;
55    url_loader_factory_params->is_corb_enabled = false;
56    url_loader_factory_params->is_trusted = true;
57    GetSystemNetworkContext()->CreateURLLoaderFactory(
58        url_loader_factory_.BindNewPipeAndPassReceiver(),
59        std::move(url_loader_factory_params));
60    shared_url_loader_factory_ =
61        base::MakeRefCounted<network::WeakWrapperSharedURLLoaderFactory>(
62            url_loader_factory_.get());
63  }
64  return shared_url_loader_factory_;
65}
66
67void IOSChromeIOThread::NetworkTearDown() {
68  if (shared_url_loader_factory_)
69    shared_url_loader_factory_->Detach();
70
71  if (network_context_) {
72    base::DeleteSoon(FROM_HERE, {web::WebThread::IO},
73                     network_context_owner_.release());
74  }
75}
76