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