| Index: components/cronet/ios/cronet_environment.cc | 
| diff --git a/components/cronet/ios/cronet_environment.cc b/components/cronet/ios/cronet_environment.cc | 
| index cb65294ae6848fb8db178a64976d3afd92faf135..0fef4af2e2266ab840e1b76a457f213ba763f5a6 100644 | 
| --- a/components/cronet/ios/cronet_environment.cc | 
| +++ b/components/cronet/ios/cronet_environment.cc | 
| @@ -23,9 +23,11 @@ | 
| #include "base/single_thread_task_runner.h" | 
| #include "base/synchronization/waitable_event.h" | 
| #include "base/threading/worker_pool.h" | 
| +#include "components/cronet/histogram_manager.h" | 
| #include "components/cronet/ios/version.h" | 
| #include "components/prefs/json_pref_store.h" | 
| #include "components/prefs/pref_filter.h" | 
| +#include "ios/web/public/user_agent.h" | 
| #include "net/base/net_errors.h" | 
| #include "net/base/network_change_notifier.h" | 
| #include "net/cert/cert_verifier.h" | 
| @@ -63,6 +65,33 @@ net::NetworkChangeNotifier* g_network_change_notifier = nullptr; | 
| // MessageLoop on the main thread. | 
| base::MessageLoop* g_main_message_loop = nullptr; | 
|  | 
| +// Request context getter for Cronet. | 
| +class CronetURLRequestContextGetter : public net::URLRequestContextGetter { | 
| + public: | 
| +  CronetURLRequestContextGetter( | 
| +      cronet::CronetEnvironment* environment, | 
| +      const scoped_refptr<base::SingleThreadTaskRunner>& task_runner) | 
| +      : environment_(environment), task_runner_(task_runner) {} | 
| + | 
| +  net::URLRequestContext* GetURLRequestContext() override { | 
| +    DCHECK(environment_); | 
| +    return environment_->GetURLRequestContext(); | 
| +  } | 
| + | 
| +  scoped_refptr<base::SingleThreadTaskRunner> GetNetworkTaskRunner() | 
| +      const override { | 
| +    return task_runner_; | 
| +  } | 
| + | 
| + private: | 
| +  // Must be called on the IO thread. | 
| +  ~CronetURLRequestContextGetter() override {} | 
| + | 
| +  cronet::CronetEnvironment* environment_; | 
| +  scoped_refptr<base::SingleThreadTaskRunner> task_runner_; | 
| +  DISALLOW_COPY_AND_ASSIGN(CronetURLRequestContextGetter); | 
| +}; | 
| + | 
| }  // namespace | 
|  | 
| namespace cronet { | 
| @@ -87,6 +116,11 @@ net::URLRequestContext* CronetEnvironment::GetURLRequestContext() const { | 
| return main_context_.get(); | 
| } | 
|  | 
| +net::URLRequestContextGetter* CronetEnvironment::GetURLRequestContextGetter() | 
| +    const { | 
| +  return main_context_getter_.get(); | 
| +} | 
| + | 
| // static | 
| void CronetEnvironment::Initialize() { | 
| // DCHECK_EQ([NSThread currentThread], [NSThread mainThread]); | 
| @@ -187,10 +221,12 @@ void CronetEnvironment::AddQuicHint(const std::string& host, | 
| quic_hints_.push_back(net::HostPortPair(host, port)); | 
| } | 
|  | 
| -CronetEnvironment::CronetEnvironment(const std::string& user_agent_product_name) | 
| +CronetEnvironment::CronetEnvironment(const std::string& user_agent, | 
| +                                     bool user_agent_partial) | 
| : http2_enabled_(false), | 
| quic_enabled_(false), | 
| -      user_agent_product_name_(user_agent_product_name), | 
| +      user_agent_(user_agent), | 
| +      user_agent_partial_(user_agent_partial), | 
| net_log_(new net::NetLog) {} | 
|  | 
| void CronetEnvironment::Start() { | 
| @@ -222,10 +258,8 @@ void CronetEnvironment::Start() { | 
|  | 
| proxy_config_service_ = net::ProxyService::CreateSystemProxyConfigService( | 
| network_io_thread_->task_runner(), nullptr); | 
| - | 
| -#if defined(USE_NSS_CERTS) | 
| -  net::SetURLRequestContextForNSSHttpIO(main_context_.get()); | 
| -#endif | 
| +  main_context_getter_ = new CronetURLRequestContextGetter( | 
| +      this, network_io_thread_->task_runner()); | 
| base::subtle::MemoryBarrier(); | 
| PostToNetworkThread(FROM_HERE, | 
| base::Bind(&CronetEnvironment::InitializeOnNetworkThread, | 
| @@ -234,9 +268,6 @@ void CronetEnvironment::Start() { | 
|  | 
| CronetEnvironment::~CronetEnvironment() { | 
| // net::HTTPProtocolHandlerDelegate::SetInstance(nullptr); | 
| -#if defined(USE_NSS_CERTS) | 
| -  net::SetURLRequestContextForNSSHttpIO(nullptr); | 
| -#endif | 
| } | 
|  | 
| void CronetEnvironment::InitializeOnNetworkThread() { | 
| @@ -245,10 +276,12 @@ void CronetEnvironment::InitializeOnNetworkThread() { | 
| // TODO(mef): Use net:UrlRequestContextBuilder instead of manual build. | 
| main_context_.reset(new net::URLRequestContext); | 
| main_context_->set_net_log(net_log_.get()); | 
| -  std::string user_agent(user_agent_product_name_ + | 
| -                         " (iOS); Cronet/" CRONET_VERSION); | 
| + | 
| +  if (user_agent_partial_) | 
| +    user_agent_ = web::BuildUserAgentFromProduct(user_agent_); | 
| + | 
| main_context_->set_http_user_agent_settings( | 
| -      new net::StaticHttpUserAgentSettings("en", user_agent)); | 
| +      new net::StaticHttpUserAgentSettings(accept_language_, user_agent_)); | 
|  | 
| main_context_->set_ssl_config_service(new net::SSLConfigServiceDefaults); | 
| main_context_->set_transport_security_state( | 
| @@ -359,4 +392,12 @@ std::string CronetEnvironment::user_agent() { | 
| return user_agent_settings->GetUserAgent(); | 
| } | 
|  | 
| +std::vector<uint8_t> CronetEnvironment::GetHistogramDeltas() { | 
| +  base::StatisticsRecorder::Initialize(); | 
| +  std::vector<uint8_t> data; | 
| +  if (!HistogramManager::GetInstance()->GetDeltas(&data)) | 
| +    return std::vector<uint8_t>(); | 
| +  return data; | 
| +} | 
| + | 
| }  // namespace cronet | 
|  |