Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(188)

Side by Side Diff: chrome/browser/io_thread.cc

Issue 2872903006: Use URLRequestContextStorage for the SystemURLRequestContext. (Closed)
Patch Set: merge Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « chrome/browser/io_thread.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/io_thread.h" 5 #include "chrome/browser/io_thread.h"
6 6
7 #include <utility> 7 #include <utility>
8 #include <vector> 8 #include <vector>
9 9
10 #include "base/base64.h" 10 #include "base/base64.h"
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
101 #include "net/ssl/channel_id_service.h" 101 #include "net/ssl/channel_id_service.h"
102 #include "net/ssl/default_channel_id_store.h" 102 #include "net/ssl/default_channel_id_store.h"
103 #include "net/url_request/data_protocol_handler.h" 103 #include "net/url_request/data_protocol_handler.h"
104 #include "net/url_request/file_protocol_handler.h" 104 #include "net/url_request/file_protocol_handler.h"
105 #include "net/url_request/ftp_protocol_handler.h" 105 #include "net/url_request/ftp_protocol_handler.h"
106 #include "net/url_request/static_http_user_agent_settings.h" 106 #include "net/url_request/static_http_user_agent_settings.h"
107 #include "net/url_request/url_fetcher.h" 107 #include "net/url_request/url_fetcher.h"
108 #include "net/url_request/url_request_context.h" 108 #include "net/url_request/url_request_context.h"
109 #include "net/url_request/url_request_context_builder.h" 109 #include "net/url_request/url_request_context_builder.h"
110 #include "net/url_request/url_request_context_getter.h" 110 #include "net/url_request/url_request_context_getter.h"
111 #include "net/url_request/url_request_context_storage.h"
111 #include "net/url_request/url_request_job_factory_impl.h" 112 #include "net/url_request/url_request_job_factory_impl.h"
112 #include "url/url_constants.h" 113 #include "url/url_constants.h"
113 114
114 #if BUILDFLAG(ENABLE_EXTENSIONS) 115 #if BUILDFLAG(ENABLE_EXTENSIONS)
115 #include "chrome/browser/extensions/event_router_forwarder.h" 116 #include "chrome/browser/extensions/event_router_forwarder.h"
116 #endif 117 #endif
117 118
118 #if defined(USE_NSS_CERTS) 119 #if defined(USE_NSS_CERTS)
119 #include "net/cert_net/nss_ocsp.h" 120 #include "net/cert_net/nss_ocsp.h"
120 #endif 121 #endif
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
190 SystemURLRequestContext() { 191 SystemURLRequestContext() {
191 #if defined(USE_NSS_CERTS) 192 #if defined(USE_NSS_CERTS)
192 net::SetURLRequestContextForNSSHttpIO(this); 193 net::SetURLRequestContextForNSSHttpIO(this);
193 #endif 194 #endif
194 #if defined(OS_ANDROID) 195 #if defined(OS_ANDROID)
195 net::CertVerifyProcAndroid::SetCertNetFetcher( 196 net::CertVerifyProcAndroid::SetCertNetFetcher(
196 net::CreateCertNetFetcher(this)); 197 net::CreateCertNetFetcher(this));
197 #endif 198 #endif
198 } 199 }
199 200
200 private:
201 ~SystemURLRequestContext() override { 201 ~SystemURLRequestContext() override {
202 AssertNoURLRequests(); 202 AssertNoURLRequests();
203 #if defined(USE_NSS_CERTS) 203 #if defined(USE_NSS_CERTS)
204 net::SetURLRequestContextForNSSHttpIO(NULL); 204 net::SetURLRequestContextForNSSHttpIO(NULL);
205 #endif 205 #endif
206 206
207 #if defined(OS_ANDROID) 207 #if defined(OS_ANDROID)
208 net::CertVerifyProcAndroid::ShutdownCertNetFetcher(); 208 net::CertVerifyProcAndroid::ShutdownCertNetFetcher();
209 #endif 209 #endif
210 } 210 }
211
212 private:
213 DISALLOW_COPY_AND_ASSIGN(SystemURLRequestContext);
211 }; 214 };
212 215
213 std::unique_ptr<net::HostResolver> CreateGlobalHostResolver( 216 std::unique_ptr<net::HostResolver> CreateGlobalHostResolver(
214 net::NetLog* net_log) { 217 net::NetLog* net_log) {
215 TRACE_EVENT0("startup", "IOThread::CreateGlobalHostResolver"); 218 TRACE_EVENT0("startup", "IOThread::CreateGlobalHostResolver");
216 const base::CommandLine& command_line = 219 const base::CommandLine& command_line =
217 *base::CommandLine::ForCurrentProcess(); 220 *base::CommandLine::ForCurrentProcess();
218 221
219 net::HostResolver::Options options; 222 net::HostResolver::Options options;
220 223
(...skipping 410 matching lines...) Expand 10 before | Expand all | Expand 10 after
631 globals_->ct_policy_enforcer.reset(new net::CTPolicyEnforcer()); 634 globals_->ct_policy_enforcer.reset(new net::CTPolicyEnforcer());
632 params_.ct_policy_enforcer = globals_->ct_policy_enforcer.get(); 635 params_.ct_policy_enforcer = globals_->ct_policy_enforcer.get();
633 636
634 globals_->ssl_config_service = GetSSLConfigService(); 637 globals_->ssl_config_service = GetSSLConfigService();
635 638
636 CreateDefaultAuthHandlerFactory(); 639 CreateDefaultAuthHandlerFactory();
637 globals_->http_server_properties.reset(new net::HttpServerPropertiesImpl()); 640 globals_->http_server_properties.reset(new net::HttpServerPropertiesImpl());
638 // For the ProxyScriptFetcher, we use a direct ProxyService. 641 // For the ProxyScriptFetcher, we use a direct ProxyService.
639 globals_->proxy_script_fetcher_proxy_service = 642 globals_->proxy_script_fetcher_proxy_service =
640 net::ProxyService::CreateDirectWithNetLog(net_log_); 643 net::ProxyService::CreateDirectWithNetLog(net_log_);
641 // In-memory cookie store.
642 globals_->system_cookie_store =
643 content::CreateCookieStore(content::CookieStoreConfig());
644 // In-memory channel ID store.
645 globals_->system_channel_id_service.reset(
646 new net::ChannelIDService(new net::DefaultChannelIDStore(NULL)));
647 globals_->system_cookie_store->SetChannelIDServiceID(
648 globals_->system_channel_id_service->GetUniqueID());
649 globals_->dns_probe_service.reset(new chrome_browser_net::DnsProbeService()); 644 globals_->dns_probe_service.reset(new chrome_browser_net::DnsProbeService());
650 globals_->host_mapping_rules.reset(new net::HostMappingRules()); 645 globals_->host_mapping_rules.reset(new net::HostMappingRules());
651 params_.host_mapping_rules = globals_->host_mapping_rules.get(); 646 params_.host_mapping_rules = globals_->host_mapping_rules.get();
652 globals_->http_user_agent_settings.reset( 647 globals_->http_user_agent_settings.reset(
653 new net::StaticHttpUserAgentSettings(std::string(), GetUserAgent())); 648 new net::StaticHttpUserAgentSettings(std::string(), GetUserAgent()));
654 if (command_line.HasSwitch(switches::kHostRules)) { 649 if (command_line.HasSwitch(switches::kHostRules)) {
655 TRACE_EVENT_BEGIN0("startup", "IOThread::InitAsync:SetRulesFromString"); 650 TRACE_EVENT_BEGIN0("startup", "IOThread::InitAsync:SetRulesFromString");
656 globals_->host_mapping_rules->SetRulesFromString( 651 globals_->host_mapping_rules->SetRulesFromString(
657 command_line.GetSwitchValueASCII(switches::kHostRules)); 652 command_line.GetSwitchValueASCII(switches::kHostRules));
658 TRACE_EVENT_END0("startup", "IOThread::InitAsync:SetRulesFromString"); 653 TRACE_EVENT_END0("startup", "IOThread::InitAsync:SetRulesFromString");
659 } 654 }
660 globals_->enable_brotli = 655 globals_->enable_brotli =
661 base::FeatureList::IsEnabled(features::kBrotliEncoding); 656 base::FeatureList::IsEnabled(features::kBrotliEncoding);
662 params_.enable_token_binding = 657 params_.enable_token_binding =
663 base::FeatureList::IsEnabled(features::kTokenBinding); 658 base::FeatureList::IsEnabled(features::kTokenBinding);
664 659
665 // Check for OS support of TCP FastOpen, and turn it on for all connections if 660 // Check for OS support of TCP FastOpen, and turn it on for all connections if
666 // indicated by user. 661 // indicated by user.
667 // TODO(rch): Make the client socket factory a per-network session instance, 662 // TODO(rch): Make the client socket factory a per-network session instance,
668 // constructed from a NetworkSession::Params, to allow us to move this option 663 // constructed from a NetworkSession::Params, to allow us to move this option
669 // to IOThread::Globals & HttpNetworkSession::Params. 664 // to IOThread::Globals & HttpNetworkSession::Params.
670 bool always_enable_tfo_if_supported = 665 bool always_enable_tfo_if_supported =
671 command_line.HasSwitch(switches::kEnableTcpFastOpen); 666 command_line.HasSwitch(switches::kEnableTcpFastOpen);
672 net::CheckSupportAndMaybeEnableTCPFastOpen(always_enable_tfo_if_supported); 667 net::CheckSupportAndMaybeEnableTCPFastOpen(always_enable_tfo_if_supported);
673 668
674 ConfigureParamsFromFieldTrialsAndCommandLine( 669 ConfigureParamsFromFieldTrialsAndCommandLine(
675 command_line, is_quic_allowed_by_policy_, 670 command_line, is_quic_allowed_by_policy_,
676 http_09_on_non_default_ports_enabled_, &params_); 671 http_09_on_non_default_ports_enabled_, &params_);
677 672
678 TRACE_EVENT_BEGIN0("startup",
679 "IOThread::Init:ProxyScriptFetcherRequestContext");
680 globals_->proxy_script_fetcher_context.reset(
681 ConstructProxyScriptFetcherContext(globals_, params_, net_log_));
682 TRACE_EVENT_END0("startup",
683 "IOThread::Init:ProxyScriptFetcherRequestContext");
684
685 #if defined(OS_MACOSX) 673 #if defined(OS_MACOSX)
686 // Start observing Keychain events. This needs to be done on the UI thread, 674 // Start observing Keychain events. This needs to be done on the UI thread,
687 // as Keychain services requires a CFRunLoop. 675 // as Keychain services requires a CFRunLoop.
688 BrowserThread::PostTask(BrowserThread::UI, 676 BrowserThread::PostTask(BrowserThread::UI,
689 FROM_HERE, 677 FROM_HERE,
690 base::Bind(&ObserveKeychainEvents)); 678 base::Bind(&ObserveKeychainEvents));
691 #endif 679 #endif
692 680
693 #if defined(OS_ANDROID) && defined(ARCH_CPU_ARMEL) 681 #if defined(OS_ANDROID) && defined(ARCH_CPU_ARMEL)
694 // Record how common CPUs with broken NEON units are. See 682 // Record how common CPUs with broken NEON units are. See
695 // https://crbug.com/341598. 683 // https://crbug.com/341598.
696 crypto::EnsureOpenSSLInit(); 684 crypto::EnsureOpenSSLInit();
697 UMA_HISTOGRAM_BOOLEAN("Net.HasBrokenNEON", CRYPTO_has_broken_NEON()); 685 UMA_HISTOGRAM_BOOLEAN("Net.HasBrokenNEON", CRYPTO_has_broken_NEON());
698 #endif 686 #endif
699 687
700 globals_->system_proxy_service = ProxyServiceFactory::CreateProxyService( 688 ConstructSystemRequestContext();
701 net_log_, globals_->proxy_script_fetcher_context.get(),
702 globals_->system_network_delegate.get(),
703 std::move(system_proxy_config_service_), command_line,
704 WpadQuickCheckEnabled(), PacHttpsUrlStrippingEnabled());
705
706 globals_->system_request_context.reset(
707 ConstructSystemRequestContext(globals_, params_, net_log_));
708 } 689 }
709 690
710 void IOThread::CleanUp() { 691 void IOThread::CleanUp() {
711 base::debug::LeakTracker<SafeBrowsingURLRequestContext>::CheckForLeaks(); 692 base::debug::LeakTracker<SafeBrowsingURLRequestContext>::CheckForLeaks();
712 693
713 #if defined(USE_NSS_CERTS) 694 #if defined(USE_NSS_CERTS)
714 net::ShutdownNSSHttpIO(); 695 net::ShutdownNSSHttpIO();
715 #endif 696 #endif
716 697
717 system_url_request_context_getter_ = NULL; 698 system_url_request_context_getter_ = NULL;
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
825 host_cache->ClearForHosts(host_filter); 806 host_cache->ClearForHosts(host_filter);
826 } 807 }
827 808
828 const net::HttpNetworkSession::Params& IOThread::NetworkSessionParams() const { 809 const net::HttpNetworkSession::Params& IOThread::NetworkSessionParams() const {
829 return params_; 810 return params_;
830 } 811 }
831 812
832 void IOThread::DisableQuic() { 813 void IOThread::DisableQuic() {
833 params_.enable_quic = false; 814 params_.enable_quic = false;
834 815
835 if (globals_->system_http_network_session) 816 if (globals_->system_request_context_storage)
836 globals_->system_http_network_session->DisableQuic(); 817 globals_->system_request_context_storage->http_network_session()
818 ->DisableQuic();
837 819
838 if (globals_->proxy_script_fetcher_http_network_session) 820 if (globals_->proxy_script_fetcher_http_network_session)
839 globals_->proxy_script_fetcher_http_network_session->DisableQuic(); 821 globals_->proxy_script_fetcher_http_network_session->DisableQuic();
840 } 822 }
841 823
842 base::TimeTicks IOThread::creation_time() const { 824 base::TimeTicks IOThread::creation_time() const {
843 return creation_time_; 825 return creation_time_;
844 } 826 }
845 827
846 net::SSLConfigService* IOThread::GetSSLConfigService() { 828 net::SSLConfigService* IOThread::GetSSLConfigService() {
(...skipping 21 matching lines...) Expand all
868 } 850 }
869 851
870 bool IOThread::WpadQuickCheckEnabled() const { 852 bool IOThread::WpadQuickCheckEnabled() const {
871 return quick_check_enabled_.GetValue(); 853 return quick_check_enabled_.GetValue();
872 } 854 }
873 855
874 bool IOThread::PacHttpsUrlStrippingEnabled() const { 856 bool IOThread::PacHttpsUrlStrippingEnabled() const {
875 return pac_https_url_stripping_enabled_.GetValue(); 857 return pac_https_url_stripping_enabled_.GetValue();
876 } 858 }
877 859
878 // static 860 void IOThread::ConstructSystemRequestContext() {
879 net::URLRequestContext* IOThread::ConstructSystemRequestContext( 861 globals_->system_request_context =
880 IOThread::Globals* globals, 862 base::MakeUnique<SystemURLRequestContext>();
881 const net::HttpNetworkSession::Params& params, 863 net::URLRequestContext* context = globals_->system_request_context.get();
882 net::NetLog* net_log) { 864 globals_->system_request_context_storage =
883 net::URLRequestContext* context = new SystemURLRequestContext; 865 base::MakeUnique<net::URLRequestContextStorage>(context);
866 net::URLRequestContextStorage* context_storage =
867 globals_->system_request_context_storage.get();
884 868
885 context->set_network_quality_estimator( 869 context->set_network_quality_estimator(
886 globals->network_quality_estimator.get()); 870 globals_->network_quality_estimator.get());
887 context->set_enable_brotli(globals->enable_brotli); 871 context->set_enable_brotli(globals_->enable_brotli);
888 context->set_name("system"); 872 context->set_name("system");
889 873
890 context->set_http_user_agent_settings( 874 context->set_http_user_agent_settings(
891 globals->http_user_agent_settings.get()); 875 globals_->http_user_agent_settings.get());
892 context->set_network_delegate(globals->system_network_delegate.get()); 876 context->set_network_delegate(globals_->system_network_delegate.get());
893 context->set_net_log(net_log); 877 context->set_net_log(net_log_);
894 context->set_host_resolver(globals->host_resolver.get()); 878 context->set_host_resolver(globals_->host_resolver.get());
895 context->set_proxy_service(globals->system_proxy_service.get()); 879
896 context->set_ssl_config_service(globals->ssl_config_service.get()); 880 context->set_ssl_config_service(globals_->ssl_config_service.get());
897 context->set_http_auth_handler_factory( 881 context->set_http_auth_handler_factory(
898 globals->http_auth_handler_factory.get()); 882 globals_->http_auth_handler_factory.get());
899 883
900 context->set_cookie_store(globals->system_cookie_store.get()); 884 // In-memory cookie store.
901 context->set_channel_id_service( 885 context_storage->set_cookie_store(
902 globals->system_channel_id_service.get()); 886 content::CreateCookieStore(content::CookieStoreConfig()));
887 // In-memory channel ID store.
888 context_storage->set_channel_id_service(
889 base::MakeUnique<net::ChannelIDService>(
890 new net::DefaultChannelIDStore(nullptr)));
891 context->cookie_store()->SetChannelIDServiceID(
892 context->channel_id_service()->GetUniqueID());
893
903 context->set_transport_security_state( 894 context->set_transport_security_state(
904 globals->transport_security_state.get()); 895 globals_->transport_security_state.get());
905 896
906 context->set_http_server_properties(globals->http_server_properties.get()); 897 context->set_http_server_properties(globals_->http_server_properties.get());
907 898
908 context->set_cert_verifier(globals->cert_verifier.get()); 899 context->set_cert_verifier(globals_->cert_verifier.get());
909 context->set_cert_transparency_verifier( 900 context->set_cert_transparency_verifier(
910 globals->cert_transparency_verifier.get()); 901 globals_->cert_transparency_verifier.get());
911 context->set_ct_policy_enforcer(globals->ct_policy_enforcer.get()); 902 context->set_ct_policy_enforcer(globals_->ct_policy_enforcer.get());
912 903
913 net::HttpNetworkSession::Params system_params(params); 904 TRACE_EVENT_BEGIN0("startup",
905 "IOThread::Init:ProxyScriptFetcherRequestContext");
906 globals_->proxy_script_fetcher_context.reset(
907 ConstructProxyScriptFetcherContext(globals_, params_, net_log_));
908 TRACE_EVENT_END0("startup",
909 "IOThread::Init:ProxyScriptFetcherRequestContext");
910
911 const base::CommandLine& command_line =
912 *base::CommandLine::ForCurrentProcess();
913 context_storage->set_proxy_service(ProxyServiceFactory::CreateProxyService(
914 net_log_, globals_->proxy_script_fetcher_context.get(),
915 globals_->system_network_delegate.get(),
916 std::move(system_proxy_config_service_), command_line,
917 WpadQuickCheckEnabled(), PacHttpsUrlStrippingEnabled()));
918
919 net::HttpNetworkSession::Params system_params(params_);
914 net::URLRequestContextBuilder::SetHttpNetworkSessionComponents( 920 net::URLRequestContextBuilder::SetHttpNetworkSessionComponents(
915 context, &system_params); 921 context, &system_params);
916 922
917 globals->system_http_network_session.reset( 923 context_storage->set_http_network_session(
918 new net::HttpNetworkSession(system_params)); 924 base::MakeUnique<net::HttpNetworkSession>(system_params));
919 globals->system_http_transaction_factory.reset( 925 context_storage->set_http_transaction_factory(
920 new net::HttpNetworkLayer(globals->system_http_network_session.get())); 926 base::MakeUnique<net::HttpNetworkLayer>(
927 context_storage->http_network_session()));
921 928
922 context->set_http_transaction_factory( 929 context_storage->set_job_factory(
923 globals->system_http_transaction_factory.get()); 930 base::MakeUnique<net::URLRequestJobFactoryImpl>());
924
925 globals->system_url_request_job_factory.reset(
926 new net::URLRequestJobFactoryImpl());
927 context->set_job_factory(globals->system_url_request_job_factory.get());
928
929 return context;
930 } 931 }
931 932
932 // static 933 // static
933 void IOThread::ConfigureParamsFromFieldTrialsAndCommandLine( 934 void IOThread::ConfigureParamsFromFieldTrialsAndCommandLine(
934 const base::CommandLine& command_line, 935 const base::CommandLine& command_line,
935 bool is_quic_allowed_by_policy, 936 bool is_quic_allowed_by_policy,
936 bool http_09_on_non_default_ports_enabled, 937 bool http_09_on_non_default_ports_enabled,
937 net::HttpNetworkSession::Params* params) { 938 net::HttpNetworkSession::Params* params) {
938 std::string quic_user_agent_id = chrome::GetChannelString(); 939 std::string quic_user_agent_id = chrome::GetChannelString();
939 if (!quic_user_agent_id.empty()) 940 if (!quic_user_agent_id.empty())
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
1038 globals->cert_transparency_verifier.get()); 1039 globals->cert_transparency_verifier.get());
1039 context->set_ct_policy_enforcer(globals->ct_policy_enforcer.get()); 1040 context->set_ct_policy_enforcer(globals->ct_policy_enforcer.get());
1040 context->set_ssl_config_service(globals->ssl_config_service.get()); 1041 context->set_ssl_config_service(globals->ssl_config_service.get());
1041 context->set_http_auth_handler_factory( 1042 context->set_http_auth_handler_factory(
1042 globals->http_auth_handler_factory.get()); 1043 globals->http_auth_handler_factory.get());
1043 context->set_proxy_service(globals->proxy_script_fetcher_proxy_service.get()); 1044 context->set_proxy_service(globals->proxy_script_fetcher_proxy_service.get());
1044 1045
1045 context->set_job_factory( 1046 context->set_job_factory(
1046 globals->proxy_script_fetcher_url_request_job_factory.get()); 1047 globals->proxy_script_fetcher_url_request_job_factory.get());
1047 1048
1048 context->set_cookie_store(globals->system_cookie_store.get()); 1049 context->set_cookie_store(globals->system_request_context->cookie_store());
1049 context->set_channel_id_service( 1050 context->set_channel_id_service(
1050 globals->system_channel_id_service.get()); 1051 globals->system_request_context->channel_id_service());
1051 context->set_network_delegate(globals->system_network_delegate.get()); 1052 context->set_network_delegate(globals->system_network_delegate.get());
1052 context->set_http_user_agent_settings( 1053 context->set_http_user_agent_settings(
1053 globals->http_user_agent_settings.get()); 1054 globals->http_user_agent_settings.get());
1054 context->set_http_server_properties(globals->http_server_properties.get()); 1055 context->set_http_server_properties(globals->http_server_properties.get());
1055 1056
1056 context->set_enable_brotli(globals->enable_brotli); 1057 context->set_enable_brotli(globals->enable_brotli);
1057 1058
1058 net::HttpNetworkSession::Params session_params(params); 1059 net::HttpNetworkSession::Params session_params(params);
1059 net::URLRequestContextBuilder::SetHttpNetworkSessionComponents( 1060 net::URLRequestContextBuilder::SetHttpNetworkSessionComponents(
1060 context, &session_params); 1061 context, &session_params);
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
1092 1093
1093 // TODO(rtenneti): We should probably use HttpServerPropertiesManager for the 1094 // TODO(rtenneti): We should probably use HttpServerPropertiesManager for the
1094 // system URLRequestContext too. There's no reason this should be tied to a 1095 // system URLRequestContext too. There's no reason this should be tied to a
1095 // profile. 1096 // profile.
1096 return context; 1097 return context;
1097 } 1098 }
1098 1099
1099 metrics::UpdateUsagePrefCallbackType IOThread::GetMetricsDataUseForwarder() { 1100 metrics::UpdateUsagePrefCallbackType IOThread::GetMetricsDataUseForwarder() {
1100 return base::Bind(&UpdateMetricsUsagePrefsOnUIThread); 1101 return base::Bind(&UpdateMetricsUsagePrefsOnUIThread);
1101 } 1102 }
OLDNEW
« no previous file with comments | « chrome/browser/io_thread.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698