diff --git a/chrome/browser/chromeos/policy/affiliated_invalidation_service_provider_impl.cc b/chrome/browser/chromeos/policy/affiliated_invalidation_service_provider_impl.cc index bc8d02154b2d15..5462bbdca81f0f 100644 --- a/chrome/browser/chromeos/policy/affiliated_invalidation_service_provider_impl.cc +++ b/chrome/browser/chromeos/policy/affiliated_invalidation_service_provider_impl.cc @@ -8,6 +8,7 @@ #include "base/logging.h" #include "base/macros.h" +#include "base/task/post_task.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/browser_process_platform_part_chromeos.h" #include "chrome/browser/chrome_notification_types.h" @@ -32,13 +33,43 @@ #include "components/invalidation/public/invalidator_state.h" #include "components/policy/core/common/cloud/cloud_policy_constants.h" #include "components/user_manager/user.h" +#include "content/public/browser/browser_task_traits.h" +#include "content/public/browser/browser_thread.h" #include "content/public/browser/network_service_instance.h" #include "content/public/browser/notification_details.h" #include "content/public/browser/notification_service.h" #include "services/network/public/cpp/shared_url_loader_factory.h" +#include "services/network/public/mojom/network_context.mojom.h" namespace policy { +namespace { + +// Runs on UI thread. +void RequestProxyResolvingSocketFactoryOnUIThread( + base::WeakPtr owner, + network::mojom::ProxyResolvingSocketFactoryRequest request) { + if (!owner) + return; + if (g_browser_process->system_network_context_manager()) { + g_browser_process->system_network_context_manager() + ->GetContext() + ->CreateProxyResolvingSocketFactory(std::move(request)); + } +} + +// Runs on IO thread. +void RequestProxyResolvingSocketFactory( + base::WeakPtr owner, + network::mojom::ProxyResolvingSocketFactoryRequest request) { + base::PostTaskWithTraits( + FROM_HERE, {content::BrowserThread::UI}, + base::BindOnce(&RequestProxyResolvingSocketFactoryOnUIThread, owner, + std::move(request))); +} + +} // namespace + class AffiliatedInvalidationServiceProviderImpl::InvalidationServiceObserver : public syncer::InvalidationHandler { public: @@ -323,7 +354,9 @@ AffiliatedInvalidationServiceProviderImpl::FindConnectedInvalidationService() { std::unique_ptr( new TiclDeviceSettingsProvider), g_browser_process->gcm_driver(), - g_browser_process->system_request_context(), + base::BindRepeating(&RequestProxyResolvingSocketFactory), + base::CreateSingleThreadTaskRunnerWithTraits( + {content::BrowserThread::IO}), std::move(url_loader_factory), content::GetNetworkConnectionTracker()); device_invalidation_service_->Init( diff --git a/chrome/browser/invalidation/deprecated_profile_invalidation_provider_factory.cc b/chrome/browser/invalidation/deprecated_profile_invalidation_provider_factory.cc index ff4f5f9664c80f..92272a782f2141 100644 --- a/chrome/browser/invalidation/deprecated_profile_invalidation_provider_factory.cc +++ b/chrome/browser/invalidation/deprecated_profile_invalidation_provider_factory.cc @@ -7,6 +7,7 @@ #include #include +#include "base/task/post_task.h" #include "build/build_config.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/gcm/gcm_profile_service_factory.h" @@ -28,6 +29,8 @@ #include "components/keyed_service/content/browser_context_dependency_manager.h" #include "components/pref_registry/pref_registry_syncable.h" #include "components/prefs/pref_registry.h" +#include "content/public/browser/browser_task_traits.h" +#include "content/public/browser/browser_thread.h" #include "content/public/browser/network_service_instance.h" #include "content/public/browser/storage_partition.h" #include "content/public/common/service_manager_connection.h" @@ -52,6 +55,36 @@ namespace invalidation { +namespace { + +#if !defined(OS_ANDROID) +void RequestProxyResolvingSocketFactoryOnUIThread( + Profile* profile, + base::WeakPtr service, + network::mojom::ProxyResolvingSocketFactoryRequest request) { + if (!service) + return; + network::mojom::NetworkContext* network_context = + content::BrowserContext::GetDefaultStoragePartition(profile) + ->GetNetworkContext(); + network_context->CreateProxyResolvingSocketFactory(std::move(request)); +} + +// A thread-safe wrapper to request a ProxyResolvingSocketFactoryPtr. +void RequestProxyResolvingSocketFactory( + Profile* profile, + base::WeakPtr service, + network::mojom::ProxyResolvingSocketFactoryRequest request) { + base::PostTaskWithTraits( + FROM_HERE, {content::BrowserThread::UI}, + base::BindOnce(&RequestProxyResolvingSocketFactoryOnUIThread, profile, + std::move(service), std::move(request))); +} + +#endif + +} // namespace + // static ProfileInvalidationProvider* DeprecatedProfileInvalidationProviderFactory::GetForProfile(Profile* profile) { @@ -134,7 +167,9 @@ DeprecatedProfileInvalidationProviderFactory::BuildServiceInstanceFor( GetUserAgent(), identity_provider.get(), std::make_unique(profile->GetPrefs()), gcm::GCMProfileServiceFactory::GetForProfile(profile)->driver(), - profile->GetRequestContext(), + base::BindRepeating(&RequestProxyResolvingSocketFactory, profile), + base::CreateSingleThreadTaskRunnerWithTraits( + {content::BrowserThread::IO}), content::BrowserContext::GetDefaultStoragePartition(profile) ->GetURLLoaderFactoryForBrowserProcess(), content::GetNetworkConnectionTracker()); diff --git a/chrome/browser/sync/test/integration/DEPS b/chrome/browser/sync/test/integration/DEPS new file mode 100644 index 00000000000000..eefc17b503d1d3 --- /dev/null +++ b/chrome/browser/sync/test/integration/DEPS @@ -0,0 +1,3 @@ +include_rules = [ + "+jingle/glue/network_service_config_test_util.h", +] diff --git a/chrome/browser/sync/test/integration/sync_test.cc b/chrome/browser/sync/test/integration/sync_test.cc index 40a7489e572ca3..0ee79d2f3477b3 100644 --- a/chrome/browser/sync/test/integration/sync_test.cc +++ b/chrome/browser/sync/test/integration/sync_test.cc @@ -84,6 +84,7 @@ #include "content/public/browser/web_contents.h" #include "content/public/test/test_browser_thread.h" #include "google_apis/gaia/gaia_urls.h" +#include "jingle/glue/network_service_config_test_util.h" #include "net/base/escape.h" #include "net/base/load_flags.h" #include "net/base/network_change_notifier.h" @@ -181,9 +182,12 @@ std::unique_ptr BuildP2PProfileInvalidationProvider( content::BrowserContext* context, syncer::P2PNotificationTarget notification_target) { Profile* profile = static_cast(context); + auto config_helper = + std::make_unique( + profile->GetRequestContext()); return std::make_unique( std::make_unique( - profile->GetRequestContext(), content::GetNetworkConnectionTracker(), + std::move(config_helper), content::GetNetworkConnectionTracker(), notification_target), std::make_unique( IdentityManagerFactory::GetForProfile(profile))); diff --git a/chrome/service/cloud_print/cloud_print_proxy_backend.cc b/chrome/service/cloud_print/cloud_print_proxy_backend.cc index bdfa18ae687196..51b9079b5519c4 100644 --- a/chrome/service/cloud_print/cloud_print_proxy_backend.cc +++ b/chrome/service/cloud_print/cloud_print_proxy_backend.cc @@ -166,6 +166,17 @@ class CloudPrintProxyBackend::Core CloudPrintTokenStore* GetTokenStore(); + // Runs on Core thread. + static void RequestProxyResolvingSocketFactoryOnCoreThread( + base::WeakPtr owner, + network::mojom::ProxyResolvingSocketFactoryRequest request); + + // Runs on IO thread. + static void RequestProxyResolvingSocketFactory( + scoped_refptr core_runner, + base::WeakPtr owner, + network::mojom::ProxyResolvingSocketFactoryRequest request); + // Our parent CloudPrintProxyBackend CloudPrintProxyBackend* const backend_; @@ -204,6 +215,8 @@ class CloudPrintProxyBackend::Core std::string robot_email_; std::unique_ptr token_store_; + base::WeakPtrFactory weak_ptr_factory_; + DISALLOW_COPY_AND_ASSIGN(Core); }; @@ -288,7 +301,8 @@ CloudPrintProxyBackend::Core::Core( job_poll_scheduled_(false), enable_job_poll_(enable_job_poll), xmpp_ping_scheduled_(false), - pending_xmpp_pings_(0) { + pending_xmpp_pings_(0), + weak_ptr_factory_(this) { settings_.CopyFrom(settings); } @@ -432,8 +446,14 @@ void CloudPrintProxyBackend::Core::InitNotifications( pending_xmpp_pings_ = 0; notifier::NotifierOptions notifier_options; - notifier_options.request_context_getter = - g_service_process->GetServiceURLRequestContextGetter(); + notifier_options.network_config.task_runner = + g_service_process->io_task_runner(); + notifier_options.network_config.get_proxy_resolving_socket_factory_callback = + base::BindRepeating(&Core::RequestProxyResolvingSocketFactory, + backend_->core_thread_.task_runner(), + // This needs to use weak pointers since the callback + // is repeatable and a ref would result in a cycle. + weak_ptr_factory_.GetWeakPtr()); notifier_options.auth_mechanism = "X-OAUTH2"; notifier_options.try_ssltcp_first = true; notifier_options.xmpp_host_port = net::HostPortPair::FromString( @@ -466,6 +486,7 @@ void CloudPrintProxyBackend::Core::DoShutdown() { notifications_enabled_ = false; notifications_enabled_since_ = base::TimeTicks(); token_store_.reset(); + weak_ptr_factory_.InvalidateWeakPtrs(); url_loader_factory_owner_.reset(); DestroyAuthAndConnector(); @@ -577,6 +598,32 @@ CloudPrintTokenStore* CloudPrintProxyBackend::Core::GetTokenStore() { return token_store_.get(); } +// static +void CloudPrintProxyBackend::Core:: + RequestProxyResolvingSocketFactoryOnCoreThread( + base::WeakPtr owner, + network::mojom::ProxyResolvingSocketFactoryRequest request) { + if (!owner) + return; + DCHECK(owner->CurrentlyOnCoreThread()); + owner->GetURLLoaderFactory(); // initialize |url_loader_factory_owner_| + owner->url_loader_factory_owner_->GetNetworkContext() + ->CreateProxyResolvingSocketFactory(std::move(request)); +} + +// static +void CloudPrintProxyBackend::Core::RequestProxyResolvingSocketFactory( + scoped_refptr core_runner, + base::WeakPtr owner, + network::mojom::ProxyResolvingSocketFactoryRequest request) { + DCHECK(g_service_process->io_task_runner()->BelongsToCurrentThread()); + // This runs on IO thread; should not dereference |owner|. + core_runner->PostTask( + FROM_HERE, + base::BindOnce(&Core::RequestProxyResolvingSocketFactoryOnCoreThread, + std::move(owner), std::move(request))); +} + void CloudPrintProxyBackend::Core::NotifyAuthenticated( const std::string& robot_oauth_refresh_token, const std::string& robot_email, diff --git a/components/invalidation/impl/DEPS b/components/invalidation/impl/DEPS index cdd5ffb15da210..bdb3f753369e0e 100644 --- a/components/invalidation/impl/DEPS +++ b/components/invalidation/impl/DEPS @@ -10,6 +10,7 @@ include_rules = [ "+google_apis/gaia", "+google_apis/gcm", "+jni", + "+jingle/glue/network_service_config_test_util.h", "+jingle/notifier", "+net/base/backoff_entry.h", "+net/base/ip_endpoint.h", diff --git a/components/invalidation/impl/non_blocking_invalidator_unittest.cc b/components/invalidation/impl/non_blocking_invalidator_unittest.cc index eb147aef17991c..19d1daed358c60 100644 --- a/components/invalidation/impl/non_blocking_invalidator_unittest.cc +++ b/components/invalidation/impl/non_blocking_invalidator_unittest.cc @@ -16,6 +16,7 @@ #include "components/invalidation/impl/invalidation_state_tracker.h" #include "components/invalidation/impl/invalidator_test_template.h" #include "google/cacheinvalidation/types.pb.h" +#include "jingle/glue/network_service_config_test_util.h" #include "jingle/notifier/base/fake_base_task.h" #include "net/url_request/url_request_test_util.h" #include "services/network/test/test_network_connection_tracker.h" @@ -40,10 +41,12 @@ class NonBlockingInvalidatorTestDelegate { base::Thread::Options options; options.message_loop_type = base::MessageLoop::TYPE_IO; io_thread_.StartWithOptions(options); - request_context_getter_ = - new net::TestURLRequestContextGetter(io_thread_.task_runner()); + net_config_helper_ = + std::make_unique( + base::MakeRefCounted( + io_thread_.task_runner())); notifier::NotifierOptions notifier_options; - notifier_options.request_context_getter = request_context_getter_; + net_config_helper_->FillInNetworkConfig(¬ifier_options.network_config); notifier_options.network_connection_tracker = network::TestNetworkConnectionTracker::GetInstance(); NetworkChannelCreator network_channel_creator = @@ -52,7 +55,7 @@ class NonBlockingInvalidatorTestDelegate { network_channel_creator, invalidator_client_id, UnackedInvalidationsMap(), initial_state, invalidation_state_tracker.get(), "fake_client_info", - request_context_getter_->GetNetworkTaskRunner())); + notifier_options.network_config.task_runner)); } Invalidator* GetInvalidator() { @@ -61,7 +64,7 @@ class NonBlockingInvalidatorTestDelegate { void DestroyInvalidator() { invalidator_.reset(); - request_context_getter_ = nullptr; + net_config_helper_ = nullptr; io_thread_.Stop(); base::RunLoop().RunUntilIdle(); } @@ -85,7 +88,7 @@ class NonBlockingInvalidatorTestDelegate { private: base::MessageLoop message_loop_; base::Thread io_thread_; - scoped_refptr request_context_getter_; + std::unique_ptr net_config_helper_; std::unique_ptr invalidator_; }; diff --git a/components/invalidation/impl/p2p_invalidation_service.cc b/components/invalidation/impl/p2p_invalidation_service.cc index 48607d73a79286..2fc7c892d1897b 100644 --- a/components/invalidation/impl/p2p_invalidation_service.cc +++ b/components/invalidation/impl/p2p_invalidation_service.cc @@ -9,23 +9,20 @@ #include "base/command_line.h" #include "components/invalidation/impl/invalidation_service_util.h" #include "components/invalidation/impl/p2p_invalidator.h" +#include "jingle/glue/network_service_config_test_util.h" #include "jingle/notifier/base/notifier_options.h" #include "jingle/notifier/listener/push_client.h" -#include "net/url_request/url_request_context_getter.h" - -namespace net { -class URLRequestContextGetter; -} namespace invalidation { P2PInvalidationService::P2PInvalidationService( - const scoped_refptr& request_context, + std::unique_ptr config_helper, network::NetworkConnectionTracker* network_connection_tracker, - syncer::P2PNotificationTarget notification_target) { + syncer::P2PNotificationTarget notification_target) + : config_helper_(std::move(config_helper)) { notifier::NotifierOptions notifier_options = ParseNotifierOptions(*base::CommandLine::ForCurrentProcess()); - notifier_options.request_context_getter = request_context; + config_helper_->FillInNetworkConfig(¬ifier_options.network_config); notifier_options.network_connection_tracker = network_connection_tracker; invalidator_id_ = GenerateInvalidatorClientId(); invalidator_.reset(new syncer::P2PInvalidator( diff --git a/components/invalidation/impl/p2p_invalidation_service.h b/components/invalidation/impl/p2p_invalidation_service.h index 5b0c34b81fe57e..c9c8bb9a11389d 100644 --- a/components/invalidation/impl/p2p_invalidation_service.h +++ b/components/invalidation/impl/p2p_invalidation_service.h @@ -15,8 +15,8 @@ #include "components/invalidation/public/invalidation_service.h" #include "components/keyed_service/core/keyed_service.h" -namespace net { -class URLRequestContextGetter; +namespace jingle_glue { +class NetworkServiceConfigTestUtil; } namespace network { @@ -37,7 +37,7 @@ class InvalidationLogger; class P2PInvalidationService : public InvalidationService { public: P2PInvalidationService( - const scoped_refptr& request_context, + std::unique_ptr config_helper, network::NetworkConnectionTracker* network_connection_tracker, syncer::P2PNotificationTarget notification_target); ~P2PInvalidationService() override; @@ -63,6 +63,7 @@ class P2PInvalidationService : public InvalidationService { private: std::unique_ptr invalidator_; + std::unique_ptr config_helper_; std::string invalidator_id_; SEQUENCE_CHECKER(sequence_checker_); diff --git a/components/invalidation/impl/ticl_invalidation_service.cc b/components/invalidation/impl/ticl_invalidation_service.cc index fcb2186e9db60a..c75c680f7090b8 100644 --- a/components/invalidation/impl/ticl_invalidation_service.cc +++ b/components/invalidation/impl/ticl_invalidation_service.cc @@ -19,7 +19,6 @@ #include "components/invalidation/public/invalidator_state.h" #include "components/invalidation/public/object_id_invalidation_map.h" #include "google_apis/gaia/gaia_constants.h" -#include "net/url_request/url_request_context_getter.h" #include "services/network/public/cpp/shared_url_loader_factory.h" static const char* kOAuth2Scopes[] = { @@ -61,7 +60,11 @@ TiclInvalidationService::TiclInvalidationService( IdentityProvider* identity_provider, std::unique_ptr settings_provider, gcm::GCMDriver* gcm_driver, - const scoped_refptr& request_context, + base::RepeatingCallback< + void(base::WeakPtr, + network::mojom::ProxyResolvingSocketFactoryRequest)> + get_socket_factory_callback, + scoped_refptr network_task_runner, scoped_refptr url_loader_factory, network::NetworkConnectionTracker* network_connection_tracker) : user_agent_(user_agent), @@ -71,9 +74,15 @@ TiclInvalidationService::TiclInvalidationService( request_access_token_backoff_(&kRequestAccessTokenBackoffPolicy), network_channel_type_(GCM_NETWORK_CHANNEL), gcm_driver_(gcm_driver), - request_context_(request_context), + network_task_runner_(network_task_runner), url_loader_factory_(std::move(url_loader_factory)), - network_connection_tracker_(network_connection_tracker) {} + network_connection_tracker_(network_connection_tracker), + weak_ptr_factory_(this) { + if (get_socket_factory_callback) { // sometimes null in unit tests + get_socket_factory_callback_ = base::BindRepeating( + get_socket_factory_callback, weak_ptr_factory_.GetWeakPtr()); + } +} TiclInvalidationService::~TiclInvalidationService() { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); @@ -359,7 +368,9 @@ void TiclInvalidationService::StartInvalidator( notifier::NotifierOptions options = ParseNotifierOptions(*base::CommandLine::ForCurrentProcess()); options.network_connection_tracker = network_connection_tracker_; - options.request_context_getter = request_context_; + options.network_config.get_proxy_resolving_socket_factory_callback = + get_socket_factory_callback_; + options.network_config.task_runner = network_task_runner_; options.auth_mechanism = "X-OAUTH2"; network_channel_options_.SetString("Options.HostPort", options.xmpp_host_port.ToString()); @@ -392,8 +403,7 @@ void TiclInvalidationService::StartInvalidator( invalidation_state_tracker_->GetInvalidatorClientId(), invalidation_state_tracker_->GetSavedInvalidations(), invalidation_state_tracker_->GetBootstrapData(), - invalidation_state_tracker_.get(), user_agent_, - request_context_->GetNetworkTaskRunner())); + invalidation_state_tracker_.get(), user_agent_, network_task_runner_)); UpdateInvalidatorCredentials(); diff --git a/components/invalidation/impl/ticl_invalidation_service.h b/components/invalidation/impl/ticl_invalidation_service.h index 9c96b6bfb89097..f62037a4e8be1c 100644 --- a/components/invalidation/impl/ticl_invalidation_service.h +++ b/components/invalidation/impl/ticl_invalidation_service.h @@ -11,6 +11,7 @@ #include "base/compiler_specific.h" #include "base/macros.h" #include "base/memory/ref_counted.h" +#include "base/memory/weak_ptr.h" #include "base/sequence_checker.h" #include "base/timer/timer.h" #include "base/values.h" @@ -22,15 +23,12 @@ #include "components/invalidation/public/invalidation_service.h" #include "components/keyed_service/core/keyed_service.h" #include "net/base/backoff_entry.h" +#include "services/network/public/mojom/proxy_resolving_socket.mojom.h" namespace gcm { class GCMDriver; } -namespace net { -class URLRequestContextGetter; -} - namespace network { class NetworkConnectionTracker; class SharedURLLoaderFactory; @@ -65,7 +63,13 @@ class TiclInvalidationService : public InvalidationService, IdentityProvider* identity_provider, std::unique_ptr settings_provider, gcm::GCMDriver* gcm_driver, - const scoped_refptr& request_context, + // |get_socket_factory_callback| will be safe to call on the IO thread, + // but will check its WeakPtr parameter on the UI thread. + base::RepeatingCallback< + void(base::WeakPtr, + network::mojom::ProxyResolvingSocketFactoryRequest)> + get_socket_factory_callback, + scoped_refptr network_task_runner, scoped_refptr url_loader_factory, network::NetworkConnectionTracker* network_connection_tracker); ~TiclInvalidationService() override; @@ -150,7 +154,10 @@ class TiclInvalidationService : public InvalidationService, InvalidationNetworkChannel network_channel_type_; gcm::GCMDriver* gcm_driver_; std::unique_ptr gcm_invalidation_bridge_; - scoped_refptr request_context_; + base::RepeatingCallback + get_socket_factory_callback_; + scoped_refptr network_task_runner_; scoped_refptr url_loader_factory_; network::NetworkConnectionTracker* network_connection_tracker_; @@ -164,6 +171,9 @@ class TiclInvalidationService : public InvalidationService, SEQUENCE_CHECKER(sequence_checker_); + // Used on the UI thread. + base::WeakPtrFactory weak_ptr_factory_; + DISALLOW_COPY_AND_ASSIGN(TiclInvalidationService); }; diff --git a/components/invalidation/impl/ticl_invalidation_service_unittest.cc b/components/invalidation/impl/ticl_invalidation_service_unittest.cc index 02dd216a03c576..5bcd60539ee9ea 100644 --- a/components/invalidation/impl/ticl_invalidation_service_unittest.cc +++ b/components/invalidation/impl/ticl_invalidation_service_unittest.cc @@ -75,8 +75,11 @@ class TiclInvalidationServiceTestDelegate { invalidation_service_ = std::make_unique( "TestUserAgent", identity_provider_.get(), std::unique_ptr(new FakeTiclSettingsProvider), - gcm_driver_.get(), nullptr, nullptr, - network::TestNetworkConnectionTracker::GetInstance()); + gcm_driver_.get(), + base::RepeatingCallback, + network::mojom::ProxyResolvingSocketFactoryRequest)>(), + nullptr, nullptr, network::TestNetworkConnectionTracker::GetInstance()); } void InitializeInvalidationService() { diff --git a/components/invalidation/impl/ticl_profile_settings_provider_unittest.cc b/components/invalidation/impl/ticl_profile_settings_provider_unittest.cc index 4227742cc732e1..d01d5d21d89285 100644 --- a/components/invalidation/impl/ticl_profile_settings_provider_unittest.cc +++ b/components/invalidation/impl/ticl_profile_settings_provider_unittest.cc @@ -20,6 +20,7 @@ #include "components/invalidation/impl/ticl_settings_provider.h" #include "components/prefs/pref_service.h" #include "components/sync_preferences/testing_pref_service_syncable.h" +#include "jingle/glue/network_service_config_test_util.h" #include "net/url_request/url_request_context_getter.h" #include "net/url_request/url_request_test_util.h" #include "services/identity/public/cpp/identity_test_environment.h" @@ -40,7 +41,7 @@ class TiclProfileSettingsProviderTest : public testing::Test { TiclInvalidationService::InvalidationNetworkChannel GetNetworkChannel(); base::MessageLoop message_loop_; - scoped_refptr request_context_getter_; + std::unique_ptr net_config_helper_; gcm::FakeGCMDriver gcm_driver_; // |identity_test_env_| should be declared before |identity_provider_| @@ -55,6 +56,11 @@ class TiclProfileSettingsProviderTest : public testing::Test { std::unique_ptr invalidation_service_; private: + void RequestSocket( + base::WeakPtr service, + network::mojom::ProxyResolvingSocketFactoryRequest request) { + net_config_helper_->MakeSocketFactoryCallback().Run(std::move(request)); + } DISALLOW_COPY_AND_ASSIGN(TiclProfileSettingsProviderTest); }; @@ -66,8 +72,10 @@ void TiclProfileSettingsProviderTest::SetUp() { gcm::GCMChannelStatusSyncer::RegisterProfilePrefs(pref_service_.registry()); ProfileInvalidationProvider::RegisterProfilePrefs(pref_service_.registry()); - request_context_getter_ = - new net::TestURLRequestContextGetter(base::ThreadTaskRunnerHandle::Get()); + net_config_helper_ = + std::make_unique( + base::MakeRefCounted( + base::ThreadTaskRunnerHandle::Get())); identity_provider_ = std::make_unique( identity_test_env_.identity_manager()); @@ -75,7 +83,10 @@ void TiclProfileSettingsProviderTest::SetUp() { "TestUserAgent", identity_provider_.get(), std::unique_ptr( new TiclProfileSettingsProvider(&pref_service_)), - &gcm_driver_, request_context_getter_, nullptr /* url_loader_factory */, + &gcm_driver_, + base::BindRepeating(&TiclProfileSettingsProviderTest::RequestSocket, + base::Unretained(this)), + base::ThreadTaskRunnerHandle::Get(), nullptr /* url_loader_factory */, network::TestNetworkConnectionTracker::GetInstance()); invalidation_service_->Init(std::unique_ptr( new syncer::FakeInvalidationStateTracker)); diff --git a/ios/chrome/browser/invalidation/ios_chrome_deprecated_profile_invalidation_provider_factory.mm b/ios/chrome/browser/invalidation/ios_chrome_deprecated_profile_invalidation_provider_factory.mm index 05637f87b2189c..a735ad1a8e7927 100644 --- a/ios/chrome/browser/invalidation/ios_chrome_deprecated_profile_invalidation_provider_factory.mm +++ b/ios/chrome/browser/invalidation/ios_chrome_deprecated_profile_invalidation_provider_factory.mm @@ -9,6 +9,7 @@ #include "base/callback.h" #include "base/memory/singleton.h" +#include "base/task/post_task.h" #include "components/gcm_driver/gcm_profile_service.h" #include "components/invalidation/impl/invalidator_storage.h" #include "components/invalidation/impl/profile_identity_provider.h" @@ -23,7 +24,7 @@ #include "ios/chrome/browser/gcm/ios_chrome_gcm_profile_service_factory.h" #include "ios/chrome/browser/signin/identity_manager_factory.h" #include "ios/web/public/web_client.h" -#include "net/url_request/url_request_context_getter.h" +#include "ios/web/public/web_task_traits.h" #include "services/network/public/cpp/shared_url_loader_factory.h" #if !defined(__has_feature) || !__has_feature(objc_arc) @@ -34,6 +35,29 @@ using invalidation::ProfileInvalidationProvider; using invalidation::TiclInvalidationService; +namespace { + +void RequestProxyResolvingSocketFactoryOnUIThread( + ios::ChromeBrowserState* browser_state, + base::WeakPtr service, + network::mojom::ProxyResolvingSocketFactoryRequest request) { + if (!service) + return; + browser_state->GetProxyResolvingSocketFactory(std::move(request)); +} + +// A thread-safe wrapper to request a ProxyResolvingSocketFactoryPtr. +void RequestProxyResolvingSocketFactory( + ios::ChromeBrowserState* browser_state, + base::WeakPtr service, + network::mojom::ProxyResolvingSocketFactoryRequest request) { + base::PostTaskWithTraits( + FROM_HERE, {web::WebThread::UI}, + base::BindOnce(&RequestProxyResolvingSocketFactoryOnUIThread, + browser_state, std::move(service), std::move(request))); +} +} + // static invalidation::ProfileInvalidationProvider* IOSChromeDeprecatedProfileInvalidationProviderFactory::GetForBrowserState( @@ -78,7 +102,8 @@ browser_state->GetPrefs()), IOSChromeGCMProfileServiceFactory::GetForBrowserState(browser_state) ->driver(), - browser_state->GetRequestContext(), + base::BindRepeating(&RequestProxyResolvingSocketFactory, browser_state), + base::CreateSingleThreadTaskRunnerWithTraits({web::WebThread::IO}), browser_state->GetSharedURLLoaderFactory(), GetApplicationContext()->GetNetworkConnectionTracker())); service->Init( diff --git a/ios/web_view/internal/sync/web_view_profile_invalidation_provider_factory.mm b/ios/web_view/internal/sync/web_view_profile_invalidation_provider_factory.mm index 3f90e922084a4a..1c663c59067a9b 100644 --- a/ios/web_view/internal/sync/web_view_profile_invalidation_provider_factory.mm +++ b/ios/web_view/internal/sync/web_view_profile_invalidation_provider_factory.mm @@ -9,6 +9,7 @@ #include "base/callback.h" #include "base/memory/singleton.h" +#include "base/task/post_task.h" #include "components/gcm_driver/gcm_profile_service.h" #include "components/invalidation/impl/invalidator_storage.h" #include "components/invalidation/impl/profile_identity_provider.h" @@ -19,13 +20,13 @@ #include "components/pref_registry/pref_registry_syncable.h" #include "components/prefs/pref_registry.h" #include "ios/web/public/web_client.h" +#include "ios/web/public/web_task_traits.h" #include "ios/web_view/internal/app/application_context.h" #include "ios/web_view/internal/signin/web_view_identity_manager_factory.h" #include "ios/web_view/internal/signin/web_view_oauth2_token_service_factory.h" #include "ios/web_view/internal/signin/web_view_signin_manager_factory.h" #include "ios/web_view/internal/sync/web_view_gcm_profile_service_factory.h" #include "ios/web_view/internal/web_view_browser_state.h" -#include "net/url_request/url_request_context_getter.h" #include "services/network/public/cpp/shared_url_loader_factory.h" #if !defined(__has_feature) || !__has_feature(objc_arc) @@ -38,6 +39,29 @@ namespace ios_web_view { +namespace { + +void RequestProxyResolvingSocketFactoryOnUIThread( + WebViewBrowserState* browser_state, + base::WeakPtr service, + network::mojom::ProxyResolvingSocketFactoryRequest request) { + if (!service) + return; + browser_state->GetProxyResolvingSocketFactory(std::move(request)); +} + +// A thread-safe wrapper to request a ProxyResolvingSocketFactoryPtr. +void RequestProxyResolvingSocketFactory( + WebViewBrowserState* browser_state, + base::WeakPtr service, + network::mojom::ProxyResolvingSocketFactoryRequest request) { + base::PostTaskWithTraits( + FROM_HERE, {web::WebThread::UI}, + base::BindOnce(&RequestProxyResolvingSocketFactoryOnUIThread, + browser_state, std::move(service), std::move(request))); +} +} + // static invalidation::ProfileInvalidationProvider* WebViewProfileInvalidationProviderFactory::GetForBrowserState( @@ -83,7 +107,8 @@ browser_state->GetPrefs()), WebViewGCMProfileServiceFactory::GetForBrowserState(browser_state) ->driver(), - browser_state->GetRequestContext(), + base::BindRepeating(&RequestProxyResolvingSocketFactory, browser_state), + base::CreateSingleThreadTaskRunnerWithTraits({web::WebThread::IO}), browser_state->GetSharedURLLoaderFactory(), ApplicationContext::GetInstance()->GetNetworkConnectionTracker())); service->Init( diff --git a/jingle/BUILD.gn b/jingle/BUILD.gn index 313e20cd920edb..e8786719c66050 100644 --- a/jingle/BUILD.gn +++ b/jingle/BUILD.gn @@ -7,19 +7,16 @@ import("//testing/test.gni") static_library("jingle_glue") { sources = [ - "glue/chrome_async_socket.cc", - "glue/chrome_async_socket.h", "glue/network_service_async_socket.cc", "glue/network_service_async_socket.h", - "glue/resolving_client_socket_factory.h", + "glue/network_service_config.cc", + "glue/network_service_config.h", "glue/task_pump.cc", "glue/task_pump.h", "glue/thread_wrapper.cc", "glue/thread_wrapper.h", "glue/utils.cc", "glue/utils.h", - "glue/xmpp_client_socket_factory.cc", - "glue/xmpp_client_socket_factory.h", ] public_deps = [ "//third_party/webrtc_overrides", @@ -29,7 +26,6 @@ static_library("jingle_glue") { "//base", "//base/third_party/dynamic_annotations", "//net", - "//services/network:network_service", "//services/network/public/mojom", "//third_party/libjingle_xmpp:rtc_task_runner", ] @@ -38,14 +34,10 @@ static_library("jingle_glue") { if (is_nacl) { sources -= [ - "glue/chrome_async_socket.cc", "glue/network_service_async_socket.cc", - "glue/xmpp_client_socket_factory.cc", - ] - deps -= [ - "//services/network:network_service", - "//services/network/public/mojom", + "glue/network_service_config.cc", ] + deps -= [ "//services/network/public/mojom" ] } } @@ -132,6 +124,8 @@ static_library("notifier") { static_library("notifier_test_util") { testonly = true sources = [ + "glue/network_service_config_test_util.cc", + "glue/network_service_config_test_util.h", "notifier/base/fake_base_task.cc", "notifier/base/fake_base_task.h", "notifier/listener/fake_push_client.cc", @@ -145,13 +139,14 @@ static_library("notifier_test_util") { ] deps = [ "//base", + "//services/network:network_service", + "//services/network/public/mojom", "//testing/gmock", ] } test("jingle_unittests") { sources = [ - "glue/chrome_async_socket_unittest.cc", "glue/fake_ssl_client_socket_unittest.cc", "glue/jingle_glue_mock_objects.cc", "glue/jingle_glue_mock_objects.h", @@ -182,7 +177,6 @@ test("jingle_unittests") { # TODO(jrg): # EXPECT_DEBUG_DEATH() uses features not enabled. # Should we -std=c++0x or -std=gnu++0x? - "glue/chrome_async_socket_unittest.cc", "glue/network_service_async_socket_unittest.cc", "notifier/base/xmpp_connection_unittest.cc", ] diff --git a/jingle/DEPS b/jingle/DEPS index 2c53cb747c9d99..d3bb3fdea62d6f 100644 --- a/jingle/DEPS +++ b/jingle/DEPS @@ -1,6 +1,7 @@ include_rules = [ "+mojo/core/embedder", "+net", + "+services/network/public/mojom", "+third_party/libjingle_xmpp/task_runner", "+third_party/libjingle_xmpp/xmllite", "+third_party/libjingle_xmpp/xmpp", diff --git a/jingle/glue/DEPS b/jingle/glue/DEPS index 1865d8cc8f5f66..0e659173668f53 100644 --- a/jingle/glue/DEPS +++ b/jingle/glue/DEPS @@ -1,10 +1,8 @@ # Needed by logging_unittest.cc since it tests the overrides. include_rules = [ "+mojo/public/cpp", - "+services/network/proxy_resolving_client_socket.h", - "+services/network/proxy_resolving_client_socket_factory.h", - "+services/network/proxy_resolving_socket_factory_mojo.h", "+services/network/public/mojom", + "+services/network", "+third_party/libjingle_xmpp/task_runner", "+third_party/webrtc", "+third_party/webrtc_overrides", diff --git a/jingle/glue/chrome_async_socket.cc b/jingle/glue/chrome_async_socket.cc deleted file mode 100644 index ebe8aec86138f1..00000000000000 --- a/jingle/glue/chrome_async_socket.cc +++ /dev/null @@ -1,441 +0,0 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "jingle/glue/chrome_async_socket.h" - -#include -#include -#include -#include -#include - -#include "base/bind.h" -#include "base/compiler_specific.h" -#include "base/logging.h" -#include "base/threading/thread_task_runner_handle.h" -#include "jingle/glue/resolving_client_socket_factory.h" -#include "net/base/address_list.h" -#include "net/base/host_port_pair.h" -#include "net/base/io_buffer.h" -#include "net/socket/client_socket_handle.h" -#include "net/socket/ssl_client_socket.h" -#include "net/socket/tcp_client_socket.h" -#include "net/ssl/ssl_config_service.h" -#include "third_party/webrtc/rtc_base/socketaddress.h" - -namespace jingle_glue { - -ChromeAsyncSocket::ChromeAsyncSocket( - std::unique_ptr - resolving_client_socket_factory, - size_t read_buf_size, - size_t write_buf_size, - const net::NetworkTrafficAnnotationTag& traffic_annotation) - : resolving_client_socket_factory_( - std::move(resolving_client_socket_factory)), - state_(STATE_CLOSED), - error_(ERROR_NONE), - net_error_(net::OK), - read_state_(IDLE), - read_buf_(base::MakeRefCounted(read_buf_size)), - read_start_(0U), - read_end_(0U), - write_state_(IDLE), - write_buf_(base::MakeRefCounted(write_buf_size)), - write_end_(0U), - traffic_annotation_(traffic_annotation), - weak_ptr_factory_(this) { - DCHECK(resolving_client_socket_factory_.get()); - DCHECK_GT(read_buf_size, 0U); - DCHECK_GT(write_buf_size, 0U); -} - -ChromeAsyncSocket::~ChromeAsyncSocket() {} - -ChromeAsyncSocket::State ChromeAsyncSocket::state() { - return state_; -} - -ChromeAsyncSocket::Error ChromeAsyncSocket::error() { - return error_; -} - -int ChromeAsyncSocket::GetError() { - return net_error_; -} - -bool ChromeAsyncSocket::IsOpen() const { - return (state_ == STATE_OPEN) || (state_ == STATE_TLS_OPEN); -} - -void ChromeAsyncSocket::DoNonNetError(Error error) { - DCHECK_NE(error, ERROR_NONE); - DCHECK_NE(error, ERROR_WINSOCK); - error_ = error; - net_error_ = net::OK; -} - -void ChromeAsyncSocket::DoNetError(net::Error net_error) { - error_ = ERROR_WINSOCK; - net_error_ = net_error; -} - -void ChromeAsyncSocket::DoNetErrorFromStatus(int status) { - DCHECK_LT(status, net::OK); - DoNetError(static_cast(status)); -} - -// STATE_CLOSED -> STATE_CONNECTING - -bool ChromeAsyncSocket::Connect(const rtc::SocketAddress& address) { - if (state_ != STATE_CLOSED) { - LOG(DFATAL) << "Connect() called on non-closed socket"; - DoNonNetError(ERROR_WRONGSTATE); - return false; - } - if (address.hostname().empty() || address.port() == 0) { - DoNonNetError(ERROR_DNS); - return false; - } - - DCHECK_EQ(state_, buzz::AsyncSocket::STATE_CLOSED); - DCHECK_EQ(read_state_, IDLE); - DCHECK_EQ(write_state_, IDLE); - - state_ = STATE_CONNECTING; - - DCHECK(!weak_ptr_factory_.HasWeakPtrs()); - weak_ptr_factory_.InvalidateWeakPtrs(); - - net::HostPortPair dest_host_port_pair(address.hostname(), address.port()); - - transport_socket_ = - resolving_client_socket_factory_->CreateTransportClientSocket( - dest_host_port_pair); - int status = transport_socket_->Connect( - base::Bind(&ChromeAsyncSocket::ProcessConnectDone, - weak_ptr_factory_.GetWeakPtr())); - if (status != net::ERR_IO_PENDING) { - // We defer execution of ProcessConnectDone instead of calling it - // directly here as the caller may not expect an error/close to - // happen here. This is okay, as from the caller's point of view, - // the connect always happens asynchronously. - base::ThreadTaskRunnerHandle::Get()->PostTask( - FROM_HERE, base::Bind(&ChromeAsyncSocket::ProcessConnectDone, - weak_ptr_factory_.GetWeakPtr(), status)); - } - return true; -} - -// STATE_CONNECTING -> STATE_OPEN -// read_state_ == IDLE -> read_state_ == POSTED (via PostDoRead()) - -void ChromeAsyncSocket::ProcessConnectDone(int status) { - DCHECK_NE(status, net::ERR_IO_PENDING); - DCHECK_EQ(read_state_, IDLE); - DCHECK_EQ(write_state_, IDLE); - DCHECK_EQ(state_, STATE_CONNECTING); - if (status != net::OK) { - DoNetErrorFromStatus(status); - DoClose(); - return; - } - state_ = STATE_OPEN; - PostDoRead(); - // Write buffer should be empty. - DCHECK_EQ(write_end_, 0U); - SignalConnected(); -} - -// read_state_ == IDLE -> read_state_ == POSTED - -void ChromeAsyncSocket::PostDoRead() { - DCHECK(IsOpen()); - DCHECK_EQ(read_state_, IDLE); - DCHECK_EQ(read_start_, 0U); - DCHECK_EQ(read_end_, 0U); - base::ThreadTaskRunnerHandle::Get()->PostTask( - FROM_HERE, - base::Bind(&ChromeAsyncSocket::DoRead, weak_ptr_factory_.GetWeakPtr())); - read_state_ = POSTED; -} - -// read_state_ == POSTED -> read_state_ == PENDING - -void ChromeAsyncSocket::DoRead() { - DCHECK(IsOpen()); - DCHECK_EQ(read_state_, POSTED); - DCHECK_EQ(read_start_, 0U); - DCHECK_EQ(read_end_, 0U); - // Once we call Read(), we cannot call StartTls() until the read - // finishes. This is okay, as StartTls() is called only from a read - // handler (i.e., after a read finishes and before another read is - // done). - int status = - transport_socket_->Read( - read_buf_.get(), read_buf_->size(), - base::Bind(&ChromeAsyncSocket::ProcessReadDone, - weak_ptr_factory_.GetWeakPtr())); - read_state_ = PENDING; - if (status != net::ERR_IO_PENDING) { - ProcessReadDone(status); - } -} - -// read_state_ == PENDING -> read_state_ == IDLE - -void ChromeAsyncSocket::ProcessReadDone(int status) { - DCHECK_NE(status, net::ERR_IO_PENDING); - DCHECK(IsOpen()); - DCHECK_EQ(read_state_, PENDING); - DCHECK_EQ(read_start_, 0U); - DCHECK_EQ(read_end_, 0U); - read_state_ = IDLE; - if (status > 0) { - read_end_ = static_cast(status); - SignalRead(); - } else if (status == 0) { - // Other side closed the connection. - error_ = ERROR_NONE; - net_error_ = net::OK; - DoClose(); - } else { // status < 0 - DoNetErrorFromStatus(status); - DoClose(); - } -} - -// (maybe) read_state_ == IDLE -> read_state_ == POSTED (via -// PostDoRead()) - -bool ChromeAsyncSocket::Read(char* data, size_t len, size_t* len_read) { - if (!IsOpen() && (state_ != STATE_TLS_CONNECTING)) { - // Read() may be called on a closed socket if a previous read - // causes a socket close (e.g., client sends wrong password and - // server terminates connection). - // - // TODO(akalin): Fix handling of this on the libjingle side. - if (state_ != STATE_CLOSED) { - LOG(DFATAL) << "Read() called on non-open non-tls-connecting socket"; - } - DoNonNetError(ERROR_WRONGSTATE); - return false; - } - DCHECK_LE(read_start_, read_end_); - if ((state_ == STATE_TLS_CONNECTING) || read_end_ == 0U) { - if (state_ == STATE_TLS_CONNECTING) { - DCHECK_EQ(read_state_, IDLE); - DCHECK_EQ(read_end_, 0U); - } else { - DCHECK_NE(read_state_, IDLE); - } - *len_read = 0; - return true; - } - DCHECK_EQ(read_state_, IDLE); - *len_read = std::min(len, read_end_ - read_start_); - DCHECK_GT(*len_read, 0U); - std::memcpy(data, read_buf_->data() + read_start_, *len_read); - read_start_ += *len_read; - if (read_start_ == read_end_) { - read_start_ = 0U; - read_end_ = 0U; - // We defer execution of DoRead() here for similar reasons as - // ProcessConnectDone(). - PostDoRead(); - } - return true; -} - -// (maybe) write_state_ == IDLE -> write_state_ == POSTED (via -// PostDoWrite()) - -bool ChromeAsyncSocket::Write(const char* data, size_t len) { - if (!IsOpen() && (state_ != STATE_TLS_CONNECTING)) { - LOG(DFATAL) << "Write() called on non-open non-tls-connecting socket"; - DoNonNetError(ERROR_WRONGSTATE); - return false; - } - // TODO(akalin): Avoid this check by modifying the interface to have - // a "ready for writing" signal. - if ((static_cast(write_buf_->size()) - write_end_) < len) { - LOG(DFATAL) << "queueing " << len << " bytes would exceed the " - << "max write buffer size = " << write_buf_->size() - << " by " << (len - write_buf_->size()) << " bytes"; - DoNetError(net::ERR_INSUFFICIENT_RESOURCES); - return false; - } - std::memcpy(write_buf_->data() + write_end_, data, len); - write_end_ += len; - // If we're TLS-connecting, the write buffer will get flushed once - // the TLS-connect finishes. Otherwise, start writing if we're not - // already writing and we have something to write. - if ((state_ != STATE_TLS_CONNECTING) && - (write_state_ == IDLE) && (write_end_ > 0U)) { - // We defer execution of DoWrite() here for similar reasons as - // ProcessConnectDone(). - PostDoWrite(); - } - return true; -} - -// write_state_ == IDLE -> write_state_ == POSTED - -void ChromeAsyncSocket::PostDoWrite() { - DCHECK(IsOpen()); - DCHECK_EQ(write_state_, IDLE); - DCHECK_GT(write_end_, 0U); - base::ThreadTaskRunnerHandle::Get()->PostTask( - FROM_HERE, - base::Bind(&ChromeAsyncSocket::DoWrite, weak_ptr_factory_.GetWeakPtr())); - write_state_ = POSTED; -} - -// write_state_ == POSTED -> write_state_ == PENDING - -void ChromeAsyncSocket::DoWrite() { - DCHECK(IsOpen()); - DCHECK_EQ(write_state_, POSTED); - DCHECK_GT(write_end_, 0U); - // Once we call Write(), we cannot call StartTls() until the write - // finishes. This is okay, as StartTls() is called only after we - // have received a reply to a message we sent to the server and - // before we send the next message. - int status = - transport_socket_->Write(write_buf_.get(), write_end_, - base::Bind(&ChromeAsyncSocket::ProcessWriteDone, - weak_ptr_factory_.GetWeakPtr()), - traffic_annotation_); - write_state_ = PENDING; - if (status != net::ERR_IO_PENDING) { - ProcessWriteDone(status); - } -} - -// write_state_ == PENDING -> write_state_ == IDLE or POSTED (the -// latter via PostDoWrite()) - -void ChromeAsyncSocket::ProcessWriteDone(int status) { - DCHECK_NE(status, net::ERR_IO_PENDING); - DCHECK(IsOpen()); - DCHECK_EQ(write_state_, PENDING); - DCHECK_GT(write_end_, 0U); - write_state_ = IDLE; - if (status < net::OK) { - DoNetErrorFromStatus(status); - DoClose(); - return; - } - size_t written = static_cast(status); - if (written > write_end_) { - LOG(DFATAL) << "bytes written = " << written - << " exceeds bytes requested = " << write_end_; - DoNetError(net::ERR_UNEXPECTED); - DoClose(); - return; - } - // TODO(akalin): Figure out a better way to do this; perhaps a queue - // of DrainableIOBuffers. This'll also allow us to not have an - // artificial buffer size limit. - std::memmove(write_buf_->data(), - write_buf_->data() + written, - write_end_ - written); - write_end_ -= written; - if (write_end_ > 0U) { - PostDoWrite(); - } -} - -// * -> STATE_CLOSED - -bool ChromeAsyncSocket::Close() { - DoClose(); - return true; -} - -// (not STATE_CLOSED) -> STATE_CLOSED - -void ChromeAsyncSocket::DoClose() { - weak_ptr_factory_.InvalidateWeakPtrs(); - if (transport_socket_.get()) { - transport_socket_->Disconnect(); - } - transport_socket_.reset(); - read_state_ = IDLE; - read_start_ = 0U; - read_end_ = 0U; - write_state_ = IDLE; - write_end_ = 0U; - if (state_ != STATE_CLOSED) { - state_ = STATE_CLOSED; - SignalClosed(); - } - // Reset error variables after SignalClosed() so slots connected - // to it can read it. - error_ = ERROR_NONE; - net_error_ = net::OK; -} - -// STATE_OPEN -> STATE_TLS_CONNECTING - -bool ChromeAsyncSocket::StartTls(const std::string& domain_name) { - if ((state_ != STATE_OPEN) || (read_state_ == PENDING) || - (write_state_ != IDLE)) { - LOG(DFATAL) << "StartTls() called in wrong state"; - DoNonNetError(ERROR_WRONGSTATE); - return false; - } - - state_ = STATE_TLS_CONNECTING; - read_state_ = IDLE; - read_start_ = 0U; - read_end_ = 0U; - DCHECK_EQ(write_end_, 0U); - - // Clear out any posted DoRead() tasks. - weak_ptr_factory_.InvalidateWeakPtrs(); - - DCHECK(transport_socket_.get()); - std::unique_ptr socket_handle( - new net::ClientSocketHandle()); - socket_handle->SetSocket(std::move(transport_socket_)); - transport_socket_ = resolving_client_socket_factory_->CreateSSLClientSocket( - std::move(socket_handle), net::HostPortPair(domain_name, 443)); - int status = transport_socket_->Connect( - base::Bind(&ChromeAsyncSocket::ProcessSSLConnectDone, - weak_ptr_factory_.GetWeakPtr())); - if (status != net::ERR_IO_PENDING) { - base::ThreadTaskRunnerHandle::Get()->PostTask( - FROM_HERE, base::Bind(&ChromeAsyncSocket::ProcessSSLConnectDone, - weak_ptr_factory_.GetWeakPtr(), status)); - } - return true; -} - -// STATE_TLS_CONNECTING -> STATE_TLS_OPEN -// read_state_ == IDLE -> read_state_ == POSTED (via PostDoRead()) -// (maybe) write_state_ == IDLE -> write_state_ == POSTED (via -// PostDoWrite()) - -void ChromeAsyncSocket::ProcessSSLConnectDone(int status) { - DCHECK_NE(status, net::ERR_IO_PENDING); - DCHECK_EQ(state_, STATE_TLS_CONNECTING); - DCHECK_EQ(read_state_, IDLE); - DCHECK_EQ(read_start_, 0U); - DCHECK_EQ(read_end_, 0U); - DCHECK_EQ(write_state_, IDLE); - if (status != net::OK) { - DoNetErrorFromStatus(status); - DoClose(); - return; - } - state_ = STATE_TLS_OPEN; - PostDoRead(); - if (write_end_ > 0U) { - PostDoWrite(); - } - SignalSSLConnected(); -} - -} // namespace jingle_glue diff --git a/jingle/glue/chrome_async_socket.h b/jingle/glue/chrome_async_socket.h deleted file mode 100644 index 1612357fdcbde8..00000000000000 --- a/jingle/glue/chrome_async_socket.h +++ /dev/null @@ -1,220 +0,0 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. -// -// An implementation of buzz::AsyncSocket that uses Chrome sockets. - -#ifndef JINGLE_GLUE_CHROME_ASYNC_SOCKET_H_ -#define JINGLE_GLUE_CHROME_ASYNC_SOCKET_H_ - -#include - -#include -#include -#include - -#include "base/compiler_specific.h" -#include "base/macros.h" -#include "base/memory/ref_counted.h" -#include "base/memory/weak_ptr.h" -#include "net/base/completion_callback.h" -#include "net/base/net_errors.h" -#include "net/traffic_annotation/network_traffic_annotation.h" -#include "third_party/libjingle_xmpp/xmpp/asyncsocket.h" - -namespace net { -class IOBufferWithSize; -class StreamSocket; -} // namespace net - -namespace jingle_glue { - -class ResolvingClientSocketFactory; - -class ChromeAsyncSocket : public buzz::AsyncSocket { - public: - // Takes ownership of |resolving_client_socket_factory|. - ChromeAsyncSocket(std::unique_ptr - resolving_client_socket_factory, - size_t read_buf_size, - size_t write_buf_size, - const net::NetworkTrafficAnnotationTag& traffic_annotation); - - // Does not raise any signals. - ~ChromeAsyncSocket() override; - - // buzz::AsyncSocket implementation. - - // The current state (see buzz::AsyncSocket::State; all but - // STATE_CLOSING is used). - State state() override; - - // The last generated error. Errors are generated when the main - // functions below return false or when SignalClosed is raised due - // to an asynchronous error. - Error error() override; - - // GetError() (which is of type net::Error) != net::OK only when - // error() == ERROR_WINSOCK. - int GetError() override; - - // Tries to connect to the given address. - // - // If state() is not STATE_CLOSED, sets error to ERROR_WRONGSTATE - // and returns false. - // - // If |address| has an empty hostname or a zero port, sets error to - // ERROR_DNS and returns false. (We don't use the IP address even - // if it's present, as DNS resolution is done by - // |resolving_client_socket_factory_|. But it's perfectly fine if - // the hostname is a stringified IP address.) - // - // Otherwise, starts the connection process and returns true. - // SignalConnected will be raised when the connection is successful; - // otherwise, SignalClosed will be raised with a net error set. - bool Connect(const rtc::SocketAddress& address) override; - - // Tries to read at most |len| bytes into |data|. - // - // If state() is not STATE_TLS_CONNECTING, STATE_OPEN, or - // STATE_TLS_OPEN, sets error to ERROR_WRONGSTATE and returns false. - // - // Otherwise, fills in |len_read| with the number of bytes read and - // returns true. If this is called when state() is - // STATE_TLS_CONNECTING, reads 0 bytes. (We have to handle this - // case because StartTls() is called during a slot connected to - // SignalRead after parsing the final non-TLS reply from the server - // [see XmppClient::Private::OnSocketRead()].) - bool Read(char* data, size_t len, size_t* len_read) override; - - // Queues up |len| bytes of |data| for writing. - // - // If state() is not STATE_TLS_CONNECTING, STATE_OPEN, or - // STATE_TLS_OPEN, sets error to ERROR_WRONGSTATE and returns false. - // - // If the given data is too big for the internal write buffer, sets - // error to ERROR_WINSOCK/net::ERR_INSUFFICIENT_RESOURCES and - // returns false. - // - // Otherwise, queues up the data and returns true. If this is - // called when state() == STATE_TLS_CONNECTING, the data is will be - // sent only after the TLS connection succeeds. (See StartTls() - // below for why this happens.) - // - // Note that there's no guarantee that the data will actually be - // sent; however, it is guaranteed that the any data sent will be - // sent in FIFO order. - bool Write(const char* data, size_t len) override; - - // If the socket is not already closed, closes the socket and raises - // SignalClosed. Always returns true. - bool Close() override; - - // Tries to change to a TLS connection with the given domain name. - // - // If state() is not STATE_OPEN or there are pending reads or - // writes, sets error to ERROR_WRONGSTATE and returns false. (In - // practice, this means that StartTls() can only be called from a - // slot connected to SignalRead.) - // - // Otherwise, starts the TLS connection process and returns true. - // SignalSSLConnected will be raised when the connection is - // successful; otherwise, SignalClosed will be raised with a net - // error set. - bool StartTls(const std::string& domain_name) override; - - // Signal behavior: - // - // SignalConnected: raised whenever the connect initiated by a call - // to Connect() is complete. - // - // SignalSSLConnected: raised whenever the connect initiated by a - // call to StartTls() is complete. Not actually used by - // XmppClient. (It just assumes that if SignalRead is raised after a - // call to StartTls(), the connection has been successfully - // upgraded.) - // - // SignalClosed: raised whenever the socket is closed, either due to - // an asynchronous error, the other side closing the connection, or - // when Close() is called. - // - // SignalRead: raised whenever the next call to Read() will succeed - // with a non-zero |len_read| (assuming nothing else happens in the - // meantime). - // - // SignalError: not used. - - private: - enum AsyncIOState { - // An I/O op is not in progress. - IDLE, - // A function has been posted to do the I/O. - POSTED, - // An async I/O operation is pending. - PENDING, - }; - - bool IsOpen() const; - - // Error functions. - void DoNonNetError(Error error); - void DoNetError(net::Error net_error); - void DoNetErrorFromStatus(int status); - - // Connection functions. - void ProcessConnectDone(int status); - - // Read loop functions. - void PostDoRead(); - void DoRead(); - void ProcessReadDone(int status); - - // Write loop functions. - void PostDoWrite(); - void DoWrite(); - void ProcessWriteDone(int status); - - // SSL/TLS connection functions. - void ProcessSSLConnectDone(int status); - - // Close functions. - void DoClose(); - - std::unique_ptr - resolving_client_socket_factory_; - - // buzz::AsyncSocket state. - buzz::AsyncSocket::State state_; - buzz::AsyncSocket::Error error_; - net::Error net_error_; - - // NULL iff state() == STATE_CLOSED. - std::unique_ptr transport_socket_; - - // State for the read loop. |read_start_| <= |read_end_| <= - // |read_buf_->size()|. There's a read in flight (i.e., - // |read_state_| != IDLE) iff |read_end_| == 0. - AsyncIOState read_state_; - scoped_refptr read_buf_; - size_t read_start_, read_end_; - - // State for the write loop. |write_end_| <= |write_buf_->size()|. - // There's a write in flight (i.e., |write_state_| != IDLE) iff - // |write_end_| > 0. - AsyncIOState write_state_; - scoped_refptr write_buf_; - size_t write_end_; - - // Network traffic annotation for downstream socket write. ChromeAsyncSocket - // is not reused, hence annotation can be added in constructor and used in all - // subsequent writes. - const net::NetworkTrafficAnnotationTag traffic_annotation_; - - base::WeakPtrFactory weak_ptr_factory_; - - DISALLOW_COPY_AND_ASSIGN(ChromeAsyncSocket); -}; - -} // namespace jingle_glue - -#endif // JINGLE_GLUE_CHROME_ASYNC_SOCKET_H_ diff --git a/jingle/glue/chrome_async_socket_unittest.cc b/jingle/glue/chrome_async_socket_unittest.cc deleted file mode 100644 index 65b9d9a7c07a9f..00000000000000 --- a/jingle/glue/chrome_async_socket_unittest.cc +++ /dev/null @@ -1,1100 +0,0 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "jingle/glue/chrome_async_socket.h" - -#include - -#include -#include -#include - -#include "base/containers/circular_deque.h" -#include "base/logging.h" -#include "base/macros.h" -#include "base/message_loop/message_loop.h" -#include "base/message_loop/message_pump_default.h" -#include "base/run_loop.h" -#include "jingle/glue/resolving_client_socket_factory.h" -#include "net/base/address_list.h" -#include "net/base/ip_address.h" -#include "net/base/net_errors.h" -#include "net/cert/mock_cert_verifier.h" -#include "net/http/transport_security_state.h" -#include "net/log/net_log_source.h" -#include "net/socket/socket_test_util.h" -#include "net/socket/ssl_client_socket.h" -#include "net/ssl/ssl_config_service.h" -#include "net/traffic_annotation/network_traffic_annotation_test_helper.h" -#include "net/url_request/url_request_context_getter.h" -#include "testing/gtest/include/gtest/gtest.h" -#include "third_party/webrtc/rtc_base/ipaddress.h" -#include "third_party/webrtc/rtc_base/socketaddress.h" -#include "third_party/webrtc/rtc_base/third_party/sigslot/sigslot.h" - -namespace jingle_glue { - -namespace { - -// Data provider that handles reads/writes for ChromeAsyncSocket. -class AsyncSocketDataProvider : public net::SocketDataProvider { - public: - AsyncSocketDataProvider() : has_pending_read_(false) {} - - ~AsyncSocketDataProvider() override { - EXPECT_TRUE(writes_.empty()); - EXPECT_TRUE(reads_.empty()); - } - - // If there's no read, sets the "has pending read" flag. Otherwise, - // pops the next read. - net::MockRead OnRead() override { - if (reads_.empty()) { - DCHECK(!has_pending_read_); - has_pending_read_ = true; - const net::MockRead pending_read(net::SYNCHRONOUS, net::ERR_IO_PENDING); - return pending_read; - } - net::MockRead mock_read = reads_.front(); - reads_.pop_front(); - return mock_read; - } - - // Simply pops the next write and, if applicable, compares it to - // |data|. - net::MockWriteResult OnWrite(const std::string& data) override { - DCHECK(!writes_.empty()); - net::MockWrite mock_write = writes_.front(); - writes_.pop_front(); - if (mock_write.result != net::OK) { - return net::MockWriteResult(mock_write.mode, mock_write.result); - } - std::string expected_data(mock_write.data, mock_write.data_len); - EXPECT_EQ(expected_data, data); - if (expected_data != data) { - return net::MockWriteResult(net::SYNCHRONOUS, net::ERR_UNEXPECTED); - } - return net::MockWriteResult(mock_write.mode, data.size()); - } - - // We ignore resets so we can pre-load the socket data provider with - // read/write events. - void Reset() override {} - - // If there is a pending read, completes it with the given read. - // Otherwise, queues up the given read. - void AddRead(const net::MockRead& mock_read) { - DCHECK_NE(mock_read.result, net::ERR_IO_PENDING); - if (has_pending_read_) { - socket()->OnReadComplete(mock_read); - has_pending_read_ = false; - return; - } - reads_.push_back(mock_read); - } - - // Simply queues up the given write. - void AddWrite(const net::MockWrite& mock_write) { - writes_.push_back(mock_write); - } - - bool AllReadDataConsumed() const override { - return reads_.empty(); - } - - bool AllWriteDataConsumed() const override { - return writes_.empty(); - } - - private: - base::circular_deque reads_; - bool has_pending_read_; - - base::circular_deque writes_; - - DISALLOW_COPY_AND_ASSIGN(AsyncSocketDataProvider); -}; - -class MockXmppClientSocketFactory : public ResolvingClientSocketFactory { - public: - MockXmppClientSocketFactory( - std::unique_ptr mock_client_socket_factory, - const net::AddressList& address_list) - : mock_client_socket_factory_(std::move(mock_client_socket_factory)), - address_list_(address_list), - cert_verifier_(new net::MockCertVerifier), - transport_security_state_(new net::TransportSecurityState) {} - - // ResolvingClientSocketFactory implementation. - std::unique_ptr CreateTransportClientSocket( - const net::HostPortPair& host_and_port) override { - return mock_client_socket_factory_->CreateTransportClientSocket( - address_list_, NULL, NULL, net::NetLogSource()); - } - - std::unique_ptr CreateSSLClientSocket( - std::unique_ptr transport_socket, - const net::HostPortPair& host_and_port) override { - net::SSLClientSocketContext context; - context.cert_verifier = cert_verifier_.get(); - context.transport_security_state = transport_security_state_.get(); - return mock_client_socket_factory_->CreateSSLClientSocket( - std::move(transport_socket), host_and_port, ssl_config_, context); - } - - private: - std::unique_ptr mock_client_socket_factory_; - net::AddressList address_list_; - net::SSLConfig ssl_config_; - std::unique_ptr cert_verifier_; - std::unique_ptr transport_security_state_; -}; - -class ChromeAsyncSocketTest - : public testing::Test, - public sigslot::has_slots<> { - protected: - ChromeAsyncSocketTest() - : ssl_socket_data_provider_(net::ASYNC, net::OK), - addr_("localhost", 35) { - // GTest death tests by default execute in a fork()ed but not exec()ed - // process. On macOS, a CoreFoundation-backed MessageLoop will exit with a - // __THE_PROCESS_HAS_FORKED_AND_YOU_CANNOT_USE_THIS_COREFOUNDATION_FUNCTIONALITY___YOU_MUST_EXEC__ - // when called. Use the threadsafe mode to avoid this problem. - testing::GTEST_FLAG(death_test_style) = "threadsafe"; - } - - ~ChromeAsyncSocketTest() override {} - - void SetUp() override { - std::unique_ptr mock_client_socket_factory( - new net::MockClientSocketFactory()); - mock_client_socket_factory->AddSocketDataProvider( - &async_socket_data_provider_); - mock_client_socket_factory->AddSSLSocketDataProvider( - &ssl_socket_data_provider_); - - // Fake DNS resolution for |addr_| and pass it to the factory. - const net::AddressList address_list = net::AddressList::CreateFromIPAddress( - net::IPAddress::IPv4Localhost(), addr_.port()); - std::unique_ptr - mock_xmpp_client_socket_factory(new MockXmppClientSocketFactory( - std::move(mock_client_socket_factory), address_list)); - chrome_async_socket_.reset( - new ChromeAsyncSocket(std::move(mock_xmpp_client_socket_factory), 14, - 20, TRAFFIC_ANNOTATION_FOR_TESTS)), - - chrome_async_socket_->SignalConnected.connect( - this, &ChromeAsyncSocketTest::OnConnect); - chrome_async_socket_->SignalSSLConnected.connect( - this, &ChromeAsyncSocketTest::OnSSLConnect); - chrome_async_socket_->SignalClosed.connect( - this, &ChromeAsyncSocketTest::OnClose); - chrome_async_socket_->SignalRead.connect( - this, &ChromeAsyncSocketTest::OnRead); - chrome_async_socket_->SignalError.connect( - this, &ChromeAsyncSocketTest::OnError); - } - - void TearDown() override { - // Run any tasks that we forgot to pump. - base::RunLoop().RunUntilIdle(); - ExpectClosed(); - ExpectNoSignal(); - chrome_async_socket_.reset(); - } - - enum Signal { - SIGNAL_CONNECT, - SIGNAL_SSL_CONNECT, - SIGNAL_CLOSE, - SIGNAL_READ, - SIGNAL_ERROR, - }; - - // Helper struct that records the state at the time of a signal. - - struct SignalSocketState { - SignalSocketState() - : signal(SIGNAL_ERROR), - state(ChromeAsyncSocket::STATE_CLOSED), - error(ChromeAsyncSocket::ERROR_NONE), - net_error(net::OK) {} - - SignalSocketState( - Signal signal, - ChromeAsyncSocket::State state, - ChromeAsyncSocket::Error error, - net::Error net_error) - : signal(signal), - state(state), - error(error), - net_error(net_error) {} - - bool IsEqual(const SignalSocketState& other) const { - return - (signal == other.signal) && - (state == other.state) && - (error == other.error) && - (net_error == other.net_error); - } - - static SignalSocketState FromAsyncSocket( - Signal signal, - buzz::AsyncSocket* async_socket) { - return SignalSocketState(signal, - async_socket->state(), - async_socket->error(), - static_cast( - async_socket->GetError())); - } - - static SignalSocketState NoError( - Signal signal, buzz::AsyncSocket::State state) { - return SignalSocketState(signal, state, - buzz::AsyncSocket::ERROR_NONE, - net::OK); - } - - Signal signal; - ChromeAsyncSocket::State state; - ChromeAsyncSocket::Error error; - net::Error net_error; - }; - - void CaptureSocketState(Signal signal) { - signal_socket_states_.push_back( - SignalSocketState::FromAsyncSocket( - signal, chrome_async_socket_.get())); - } - - void OnConnect() { - CaptureSocketState(SIGNAL_CONNECT); - } - - void OnSSLConnect() { - CaptureSocketState(SIGNAL_SSL_CONNECT); - } - - void OnClose() { - CaptureSocketState(SIGNAL_CLOSE); - } - - void OnRead() { - CaptureSocketState(SIGNAL_READ); - } - - void OnError() { - ADD_FAILURE(); - } - - // State expect functions. - - void ExpectState(ChromeAsyncSocket::State state, - ChromeAsyncSocket::Error error, - net::Error net_error) { - EXPECT_EQ(state, chrome_async_socket_->state()); - EXPECT_EQ(error, chrome_async_socket_->error()); - EXPECT_EQ(net_error, chrome_async_socket_->GetError()); - } - - void ExpectNonErrorState(ChromeAsyncSocket::State state) { - ExpectState(state, ChromeAsyncSocket::ERROR_NONE, net::OK); - } - - void ExpectErrorState(ChromeAsyncSocket::State state, - ChromeAsyncSocket::Error error) { - ExpectState(state, error, net::OK); - } - - void ExpectClosed() { - ExpectNonErrorState(ChromeAsyncSocket::STATE_CLOSED); - } - - // Signal expect functions. - - void ExpectNoSignal() { - if (!signal_socket_states_.empty()) { - ADD_FAILURE() << signal_socket_states_.front().signal; - } - } - - void ExpectSignalSocketState( - SignalSocketState expected_signal_socket_state) { - if (signal_socket_states_.empty()) { - ADD_FAILURE() << expected_signal_socket_state.signal; - return; - } - EXPECT_TRUE(expected_signal_socket_state.IsEqual( - signal_socket_states_.front())) - << signal_socket_states_.front().signal; - signal_socket_states_.pop_front(); - } - - void ExpectReadSignal() { - ExpectSignalSocketState( - SignalSocketState::NoError( - SIGNAL_READ, ChromeAsyncSocket::STATE_OPEN)); - } - - void ExpectSSLConnectSignal() { - ExpectSignalSocketState( - SignalSocketState::NoError(SIGNAL_SSL_CONNECT, - ChromeAsyncSocket::STATE_TLS_OPEN)); - } - - void ExpectSSLReadSignal() { - ExpectSignalSocketState( - SignalSocketState::NoError( - SIGNAL_READ, ChromeAsyncSocket::STATE_TLS_OPEN)); - } - - // Open/close utility functions. - - void DoOpenClosed() { - ExpectClosed(); - async_socket_data_provider_.set_connect_data( - net::MockConnect(net::SYNCHRONOUS, net::OK)); - EXPECT_TRUE(chrome_async_socket_->Connect(addr_)); - ExpectNonErrorState(ChromeAsyncSocket::STATE_CONNECTING); - - base::RunLoop().RunUntilIdle(); - // We may not necessarily be open; may have been other events - // queued up. - ExpectSignalSocketState( - SignalSocketState::NoError( - SIGNAL_CONNECT, ChromeAsyncSocket::STATE_OPEN)); - } - - void DoCloseOpened(SignalSocketState expected_signal_socket_state) { - // We may be in an error state, so just compare state(). - EXPECT_EQ(ChromeAsyncSocket::STATE_OPEN, chrome_async_socket_->state()); - EXPECT_TRUE(chrome_async_socket_->Close()); - ExpectSignalSocketState(expected_signal_socket_state); - ExpectNonErrorState(ChromeAsyncSocket::STATE_CLOSED); - } - - void DoCloseOpenedNoError() { - DoCloseOpened( - SignalSocketState::NoError( - SIGNAL_CLOSE, ChromeAsyncSocket::STATE_CLOSED)); - } - - void DoSSLOpenClosed() { - const char kDummyData[] = "dummy_data"; - async_socket_data_provider_.AddRead(net::MockRead(kDummyData)); - DoOpenClosed(); - ExpectReadSignal(); - EXPECT_EQ(kDummyData, DrainRead(1)); - - EXPECT_TRUE(chrome_async_socket_->StartTls("fakedomain.com")); - base::RunLoop().RunUntilIdle(); - ExpectSSLConnectSignal(); - ExpectNoSignal(); - ExpectNonErrorState(ChromeAsyncSocket::STATE_TLS_OPEN); - } - - void DoSSLCloseOpened(SignalSocketState expected_signal_socket_state) { - // We may be in an error state, so just compare state(). - EXPECT_EQ(ChromeAsyncSocket::STATE_TLS_OPEN, - chrome_async_socket_->state()); - EXPECT_TRUE(chrome_async_socket_->Close()); - ExpectSignalSocketState(expected_signal_socket_state); - ExpectNonErrorState(ChromeAsyncSocket::STATE_CLOSED); - } - - void DoSSLCloseOpenedNoError() { - DoSSLCloseOpened( - SignalSocketState::NoError( - SIGNAL_CLOSE, ChromeAsyncSocket::STATE_CLOSED)); - } - - // Read utility fucntions. - - std::string DrainRead(size_t buf_size) { - std::string read; - std::unique_ptr buf(new char[buf_size]); - size_t len_read; - while (true) { - bool success = - chrome_async_socket_->Read(buf.get(), buf_size, &len_read); - if (!success) { - ADD_FAILURE(); - break; - } - if (len_read == 0U) { - break; - } - read.append(buf.get(), len_read); - } - return read; - } - - // ChromeAsyncSocket expects a message loop. - base::MessageLoop message_loop_; - - AsyncSocketDataProvider async_socket_data_provider_; - net::SSLSocketDataProvider ssl_socket_data_provider_; - - std::unique_ptr chrome_async_socket_; - base::circular_deque signal_socket_states_; - const rtc::SocketAddress addr_; - - private: - DISALLOW_COPY_AND_ASSIGN(ChromeAsyncSocketTest); -}; - -TEST_F(ChromeAsyncSocketTest, InitialState) { - ExpectClosed(); - ExpectNoSignal(); -} - -TEST_F(ChromeAsyncSocketTest, EmptyClose) { - ExpectClosed(); - EXPECT_TRUE(chrome_async_socket_->Close()); - ExpectClosed(); -} - -TEST_F(ChromeAsyncSocketTest, ImmediateConnectAndClose) { - DoOpenClosed(); - - ExpectNonErrorState(ChromeAsyncSocket::STATE_OPEN); - - DoCloseOpenedNoError(); -} - -// After this, no need to test immediate successful connect and -// Close() so thoroughly. - -TEST_F(ChromeAsyncSocketTest, DoubleClose) { - DoOpenClosed(); - - EXPECT_TRUE(chrome_async_socket_->Close()); - ExpectClosed(); - ExpectSignalSocketState( - SignalSocketState::NoError( - SIGNAL_CLOSE, ChromeAsyncSocket::STATE_CLOSED)); - - EXPECT_TRUE(chrome_async_socket_->Close()); - ExpectClosed(); -} - -TEST_F(ChromeAsyncSocketTest, NoHostnameConnect) { - rtc::IPAddress ip_address; - EXPECT_TRUE(rtc::IPFromString("127.0.0.1", &ip_address)); - const rtc::SocketAddress no_hostname_addr(ip_address, addr_.port()); - EXPECT_FALSE(chrome_async_socket_->Connect(no_hostname_addr)); - ExpectErrorState(ChromeAsyncSocket::STATE_CLOSED, - ChromeAsyncSocket::ERROR_DNS); - - EXPECT_TRUE(chrome_async_socket_->Close()); - ExpectClosed(); -} - -TEST_F(ChromeAsyncSocketTest, ZeroPortConnect) { - const rtc::SocketAddress zero_port_addr(addr_.hostname(), 0); - EXPECT_FALSE(chrome_async_socket_->Connect(zero_port_addr)); - ExpectErrorState(ChromeAsyncSocket::STATE_CLOSED, - ChromeAsyncSocket::ERROR_DNS); - - EXPECT_TRUE(chrome_async_socket_->Close()); - ExpectClosed(); -} - -TEST_F(ChromeAsyncSocketTest, DoubleConnect) { - EXPECT_DEBUG_DEATH({ - DoOpenClosed(); - - EXPECT_FALSE(chrome_async_socket_->Connect(addr_)); - ExpectErrorState(ChromeAsyncSocket::STATE_OPEN, - ChromeAsyncSocket::ERROR_WRONGSTATE); - - DoCloseOpened( - SignalSocketState(SIGNAL_CLOSE, - ChromeAsyncSocket::STATE_CLOSED, - ChromeAsyncSocket::ERROR_WRONGSTATE, - net::OK)); - }, "non-closed socket"); -} - -TEST_F(ChromeAsyncSocketTest, ImmediateConnectCloseBeforeRead) { - DoOpenClosed(); - - EXPECT_TRUE(chrome_async_socket_->Close()); - ExpectClosed(); - ExpectSignalSocketState( - SignalSocketState::NoError( - SIGNAL_CLOSE, ChromeAsyncSocket::STATE_CLOSED)); - - base::RunLoop().RunUntilIdle(); -} - -TEST_F(ChromeAsyncSocketTest, HangingConnect) { - EXPECT_TRUE(chrome_async_socket_->Connect(addr_)); - ExpectNonErrorState(ChromeAsyncSocket::STATE_CONNECTING); - ExpectNoSignal(); - - EXPECT_TRUE(chrome_async_socket_->Close()); - ExpectClosed(); - ExpectSignalSocketState( - SignalSocketState::NoError( - SIGNAL_CLOSE, ChromeAsyncSocket::STATE_CLOSED)); -} - -TEST_F(ChromeAsyncSocketTest, PendingConnect) { - async_socket_data_provider_.set_connect_data( - net::MockConnect(net::ASYNC, net::OK)); - EXPECT_TRUE(chrome_async_socket_->Connect(addr_)); - ExpectNonErrorState(ChromeAsyncSocket::STATE_CONNECTING); - ExpectNoSignal(); - - base::RunLoop().RunUntilIdle(); - ExpectNonErrorState(ChromeAsyncSocket::STATE_OPEN); - ExpectSignalSocketState( - SignalSocketState::NoError( - SIGNAL_CONNECT, ChromeAsyncSocket::STATE_OPEN)); - ExpectNoSignal(); - - base::RunLoop().RunUntilIdle(); - - DoCloseOpenedNoError(); -} - -// After this no need to test successful pending connect so -// thoroughly. - -TEST_F(ChromeAsyncSocketTest, PendingConnectCloseBeforeRead) { - async_socket_data_provider_.set_connect_data( - net::MockConnect(net::ASYNC, net::OK)); - EXPECT_TRUE(chrome_async_socket_->Connect(addr_)); - - base::RunLoop().RunUntilIdle(); - ExpectSignalSocketState( - SignalSocketState::NoError( - SIGNAL_CONNECT, ChromeAsyncSocket::STATE_OPEN)); - - DoCloseOpenedNoError(); - - base::RunLoop().RunUntilIdle(); -} - -TEST_F(ChromeAsyncSocketTest, PendingConnectError) { - async_socket_data_provider_.set_connect_data( - net::MockConnect(net::ASYNC, net::ERR_TIMED_OUT)); - EXPECT_TRUE(chrome_async_socket_->Connect(addr_)); - - base::RunLoop().RunUntilIdle(); - - ExpectSignalSocketState( - SignalSocketState( - SIGNAL_CLOSE, ChromeAsyncSocket::STATE_CLOSED, - ChromeAsyncSocket::ERROR_WINSOCK, net::ERR_TIMED_OUT)); -} - -// After this we can assume Connect() and Close() work as expected. - -TEST_F(ChromeAsyncSocketTest, EmptyRead) { - DoOpenClosed(); - - char buf[4096]; - size_t len_read = 10000U; - EXPECT_TRUE(chrome_async_socket_->Read(buf, sizeof(buf), &len_read)); - EXPECT_EQ(0U, len_read); - - DoCloseOpenedNoError(); -} - -TEST_F(ChromeAsyncSocketTest, WrongRead) { - EXPECT_DEBUG_DEATH({ - async_socket_data_provider_.set_connect_data( - net::MockConnect(net::ASYNC, net::OK)); - EXPECT_TRUE(chrome_async_socket_->Connect(addr_)); - ExpectNonErrorState(ChromeAsyncSocket::STATE_CONNECTING); - ExpectNoSignal(); - - char buf[4096]; - size_t len_read; - EXPECT_FALSE(chrome_async_socket_->Read(buf, sizeof(buf), &len_read)); - ExpectErrorState(ChromeAsyncSocket::STATE_CONNECTING, - ChromeAsyncSocket::ERROR_WRONGSTATE); - EXPECT_TRUE(chrome_async_socket_->Close()); - ExpectSignalSocketState( - SignalSocketState( - SIGNAL_CLOSE, ChromeAsyncSocket::STATE_CLOSED, - ChromeAsyncSocket::ERROR_WRONGSTATE, net::OK)); - }, "non-open"); -} - -TEST_F(ChromeAsyncSocketTest, WrongReadClosed) { - char buf[4096]; - size_t len_read; - EXPECT_FALSE(chrome_async_socket_->Read(buf, sizeof(buf), &len_read)); - ExpectErrorState(ChromeAsyncSocket::STATE_CLOSED, - ChromeAsyncSocket::ERROR_WRONGSTATE); - EXPECT_TRUE(chrome_async_socket_->Close()); -} - -const char kReadData[] = "mydatatoread"; - -TEST_F(ChromeAsyncSocketTest, Read) { - async_socket_data_provider_.AddRead(net::MockRead(kReadData)); - DoOpenClosed(); - - ExpectReadSignal(); - ExpectNoSignal(); - - EXPECT_EQ(kReadData, DrainRead(1)); - - base::RunLoop().RunUntilIdle(); - - DoCloseOpenedNoError(); -} - -TEST_F(ChromeAsyncSocketTest, ReadTwice) { - async_socket_data_provider_.AddRead(net::MockRead(kReadData)); - DoOpenClosed(); - - ExpectReadSignal(); - ExpectNoSignal(); - - EXPECT_EQ(kReadData, DrainRead(1)); - - base::RunLoop().RunUntilIdle(); - - const char kReadData2[] = "mydatatoread2"; - async_socket_data_provider_.AddRead(net::MockRead(kReadData2)); - - ExpectReadSignal(); - ExpectNoSignal(); - - EXPECT_EQ(kReadData2, DrainRead(1)); - - DoCloseOpenedNoError(); -} - -TEST_F(ChromeAsyncSocketTest, ReadError) { - async_socket_data_provider_.AddRead(net::MockRead(kReadData)); - DoOpenClosed(); - - ExpectReadSignal(); - ExpectNoSignal(); - - EXPECT_EQ(kReadData, DrainRead(1)); - - base::RunLoop().RunUntilIdle(); - - async_socket_data_provider_.AddRead( - net::MockRead(net::SYNCHRONOUS, net::ERR_TIMED_OUT)); - - ExpectSignalSocketState( - SignalSocketState( - SIGNAL_CLOSE, ChromeAsyncSocket::STATE_CLOSED, - ChromeAsyncSocket::ERROR_WINSOCK, net::ERR_TIMED_OUT)); -} - -TEST_F(ChromeAsyncSocketTest, ReadEmpty) { - async_socket_data_provider_.AddRead(net::MockRead("")); - DoOpenClosed(); - - ExpectSignalSocketState( - SignalSocketState::NoError( - SIGNAL_CLOSE, ChromeAsyncSocket::STATE_CLOSED)); -} - -TEST_F(ChromeAsyncSocketTest, PendingRead) { - DoOpenClosed(); - - ExpectNoSignal(); - - async_socket_data_provider_.AddRead(net::MockRead(kReadData)); - - ExpectSignalSocketState( - SignalSocketState::NoError( - SIGNAL_READ, ChromeAsyncSocket::STATE_OPEN)); - ExpectNoSignal(); - - EXPECT_EQ(kReadData, DrainRead(1)); - - base::RunLoop().RunUntilIdle(); - - DoCloseOpenedNoError(); -} - -TEST_F(ChromeAsyncSocketTest, PendingEmptyRead) { - DoOpenClosed(); - - ExpectNoSignal(); - - async_socket_data_provider_.AddRead(net::MockRead("")); - - ExpectSignalSocketState( - SignalSocketState::NoError( - SIGNAL_CLOSE, ChromeAsyncSocket::STATE_CLOSED)); -} - -TEST_F(ChromeAsyncSocketTest, PendingReadError) { - DoOpenClosed(); - - ExpectNoSignal(); - - async_socket_data_provider_.AddRead( - net::MockRead(net::ASYNC, net::ERR_TIMED_OUT)); - - ExpectSignalSocketState( - SignalSocketState( - SIGNAL_CLOSE, ChromeAsyncSocket::STATE_CLOSED, - ChromeAsyncSocket::ERROR_WINSOCK, net::ERR_TIMED_OUT)); -} - -// After this we can assume non-SSL Read() works as expected. - -TEST_F(ChromeAsyncSocketTest, WrongWrite) { - EXPECT_DEBUG_DEATH({ - std::string data("foo"); - EXPECT_FALSE(chrome_async_socket_->Write(data.data(), data.size())); - ExpectErrorState(ChromeAsyncSocket::STATE_CLOSED, - ChromeAsyncSocket::ERROR_WRONGSTATE); - EXPECT_TRUE(chrome_async_socket_->Close()); - }, "non-open"); -} - -const char kWriteData[] = "mydatatowrite"; - -TEST_F(ChromeAsyncSocketTest, SyncWrite) { - async_socket_data_provider_.AddWrite( - net::MockWrite(net::SYNCHRONOUS, kWriteData, 3)); - async_socket_data_provider_.AddWrite( - net::MockWrite(net::SYNCHRONOUS, kWriteData + 3, 5)); - async_socket_data_provider_.AddWrite( - net::MockWrite(net::SYNCHRONOUS, - kWriteData + 8, arraysize(kWriteData) - 8)); - DoOpenClosed(); - - EXPECT_TRUE(chrome_async_socket_->Write(kWriteData, 3)); - base::RunLoop().RunUntilIdle(); - EXPECT_TRUE(chrome_async_socket_->Write(kWriteData + 3, 5)); - base::RunLoop().RunUntilIdle(); - EXPECT_TRUE(chrome_async_socket_->Write(kWriteData + 8, - arraysize(kWriteData) - 8)); - base::RunLoop().RunUntilIdle(); - - ExpectNoSignal(); - - DoCloseOpenedNoError(); -} - -TEST_F(ChromeAsyncSocketTest, AsyncWrite) { - DoOpenClosed(); - - async_socket_data_provider_.AddWrite( - net::MockWrite(net::ASYNC, kWriteData, 3)); - async_socket_data_provider_.AddWrite( - net::MockWrite(net::ASYNC, kWriteData + 3, 5)); - async_socket_data_provider_.AddWrite( - net::MockWrite(net::ASYNC, kWriteData + 8, arraysize(kWriteData) - 8)); - - EXPECT_TRUE(chrome_async_socket_->Write(kWriteData, 3)); - base::RunLoop().RunUntilIdle(); - EXPECT_TRUE(chrome_async_socket_->Write(kWriteData + 3, 5)); - base::RunLoop().RunUntilIdle(); - EXPECT_TRUE(chrome_async_socket_->Write(kWriteData + 8, - arraysize(kWriteData) - 8)); - base::RunLoop().RunUntilIdle(); - - ExpectNoSignal(); - - DoCloseOpenedNoError(); -} - -TEST_F(ChromeAsyncSocketTest, AsyncWriteError) { - DoOpenClosed(); - - async_socket_data_provider_.AddWrite( - net::MockWrite(net::ASYNC, kWriteData, 3)); - async_socket_data_provider_.AddWrite( - net::MockWrite(net::ASYNC, kWriteData + 3, 5)); - async_socket_data_provider_.AddWrite( - net::MockWrite(net::ASYNC, net::ERR_TIMED_OUT)); - - EXPECT_TRUE(chrome_async_socket_->Write(kWriteData, 3)); - base::RunLoop().RunUntilIdle(); - EXPECT_TRUE(chrome_async_socket_->Write(kWriteData + 3, 5)); - base::RunLoop().RunUntilIdle(); - EXPECT_TRUE(chrome_async_socket_->Write(kWriteData + 8, - arraysize(kWriteData) - 8)); - base::RunLoop().RunUntilIdle(); - - ExpectSignalSocketState( - SignalSocketState( - SIGNAL_CLOSE, ChromeAsyncSocket::STATE_CLOSED, - ChromeAsyncSocket::ERROR_WINSOCK, net::ERR_TIMED_OUT)); -} - -TEST_F(ChromeAsyncSocketTest, LargeWrite) { - EXPECT_DEBUG_DEATH({ - DoOpenClosed(); - - std::string large_data(100, 'x'); - EXPECT_FALSE(chrome_async_socket_->Write(large_data.data(), - large_data.size())); - ExpectState(ChromeAsyncSocket::STATE_OPEN, - ChromeAsyncSocket::ERROR_WINSOCK, - net::ERR_INSUFFICIENT_RESOURCES); - DoCloseOpened( - SignalSocketState( - SIGNAL_CLOSE, ChromeAsyncSocket::STATE_CLOSED, - ChromeAsyncSocket::ERROR_WINSOCK, - net::ERR_INSUFFICIENT_RESOURCES)); - }, "exceed the max write buffer"); -} - -TEST_F(ChromeAsyncSocketTest, LargeAccumulatedWrite) { - EXPECT_DEBUG_DEATH({ - DoOpenClosed(); - - std::string data(15, 'x'); - EXPECT_TRUE(chrome_async_socket_->Write(data.data(), data.size())); - EXPECT_FALSE(chrome_async_socket_->Write(data.data(), data.size())); - ExpectState(ChromeAsyncSocket::STATE_OPEN, - ChromeAsyncSocket::ERROR_WINSOCK, - net::ERR_INSUFFICIENT_RESOURCES); - DoCloseOpened( - SignalSocketState( - SIGNAL_CLOSE, ChromeAsyncSocket::STATE_CLOSED, - ChromeAsyncSocket::ERROR_WINSOCK, - net::ERR_INSUFFICIENT_RESOURCES)); - }, "exceed the max write buffer"); -} - -// After this we can assume non-SSL I/O works as expected. - -TEST_F(ChromeAsyncSocketTest, HangingSSLConnect) { - async_socket_data_provider_.AddRead(net::MockRead(kReadData)); - DoOpenClosed(); - ExpectReadSignal(); - - EXPECT_TRUE(chrome_async_socket_->StartTls("fakedomain.com")); - ExpectNoSignal(); - - ExpectNonErrorState(ChromeAsyncSocket::STATE_TLS_CONNECTING); - EXPECT_TRUE(chrome_async_socket_->Close()); - ExpectSignalSocketState( - SignalSocketState::NoError(SIGNAL_CLOSE, - ChromeAsyncSocket::STATE_CLOSED)); - ExpectNonErrorState(ChromeAsyncSocket::STATE_CLOSED); -} - -TEST_F(ChromeAsyncSocketTest, ImmediateSSLConnect) { - async_socket_data_provider_.AddRead(net::MockRead(kReadData)); - DoOpenClosed(); - ExpectReadSignal(); - - EXPECT_TRUE(chrome_async_socket_->StartTls("fakedomain.com")); - base::RunLoop().RunUntilIdle(); - ExpectSSLConnectSignal(); - ExpectNoSignal(); - ExpectNonErrorState(ChromeAsyncSocket::STATE_TLS_OPEN); - - DoSSLCloseOpenedNoError(); -} - -TEST_F(ChromeAsyncSocketTest, DoubleSSLConnect) { - EXPECT_DEBUG_DEATH({ - async_socket_data_provider_.AddRead(net::MockRead(kReadData)); - DoOpenClosed(); - ExpectReadSignal(); - - EXPECT_TRUE(chrome_async_socket_->StartTls("fakedomain.com")); - base::RunLoop().RunUntilIdle(); - ExpectSSLConnectSignal(); - ExpectNoSignal(); - ExpectNonErrorState(ChromeAsyncSocket::STATE_TLS_OPEN); - - EXPECT_FALSE(chrome_async_socket_->StartTls("fakedomain.com")); - - DoSSLCloseOpened( - SignalSocketState(SIGNAL_CLOSE, - ChromeAsyncSocket::STATE_CLOSED, - ChromeAsyncSocket::ERROR_WRONGSTATE, - net::OK)); - }, "wrong state"); -} - -TEST_F(ChromeAsyncSocketTest, FailedSSLConnect) { - ssl_socket_data_provider_.connect = - net::MockConnect(net::ASYNC, net::ERR_CERT_COMMON_NAME_INVALID), - - async_socket_data_provider_.AddRead(net::MockRead(kReadData)); - DoOpenClosed(); - ExpectReadSignal(); - - EXPECT_TRUE(chrome_async_socket_->StartTls("fakedomain.com")); - base::RunLoop().RunUntilIdle(); - ExpectSignalSocketState( - SignalSocketState( - SIGNAL_CLOSE, ChromeAsyncSocket::STATE_CLOSED, - ChromeAsyncSocket::ERROR_WINSOCK, - net::ERR_CERT_COMMON_NAME_INVALID)); - - EXPECT_TRUE(chrome_async_socket_->Close()); - ExpectClosed(); -} - -TEST_F(ChromeAsyncSocketTest, ReadDuringSSLConnecting) { - async_socket_data_provider_.AddRead(net::MockRead(kReadData)); - DoOpenClosed(); - ExpectReadSignal(); - EXPECT_EQ(kReadData, DrainRead(1)); - - EXPECT_TRUE(chrome_async_socket_->StartTls("fakedomain.com")); - ExpectNoSignal(); - - // Shouldn't do anything. - async_socket_data_provider_.AddRead(net::MockRead(kReadData)); - - char buf[4096]; - size_t len_read = 10000U; - EXPECT_TRUE(chrome_async_socket_->Read(buf, sizeof(buf), &len_read)); - EXPECT_EQ(0U, len_read); - - base::RunLoop().RunUntilIdle(); - ExpectSSLConnectSignal(); - ExpectSSLReadSignal(); - ExpectNoSignal(); - ExpectNonErrorState(ChromeAsyncSocket::STATE_TLS_OPEN); - - len_read = 10000U; - EXPECT_TRUE(chrome_async_socket_->Read(buf, sizeof(buf), &len_read)); - EXPECT_EQ(kReadData, std::string(buf, len_read)); - - DoSSLCloseOpenedNoError(); -} - -TEST_F(ChromeAsyncSocketTest, WriteDuringSSLConnecting) { - async_socket_data_provider_.AddRead(net::MockRead(kReadData)); - DoOpenClosed(); - ExpectReadSignal(); - - EXPECT_TRUE(chrome_async_socket_->StartTls("fakedomain.com")); - ExpectNoSignal(); - ExpectNonErrorState(ChromeAsyncSocket::STATE_TLS_CONNECTING); - - async_socket_data_provider_.AddWrite( - net::MockWrite(net::ASYNC, kWriteData, 3)); - - // Shouldn't do anything. - EXPECT_TRUE(chrome_async_socket_->Write(kWriteData, 3)); - - // TODO(akalin): Figure out how to test that the write happens - // *after* the SSL connect. - - base::RunLoop().RunUntilIdle(); - ExpectSSLConnectSignal(); - ExpectNoSignal(); - - base::RunLoop().RunUntilIdle(); - - DoSSLCloseOpenedNoError(); -} - -TEST_F(ChromeAsyncSocketTest, SSLConnectDuringPendingRead) { - EXPECT_DEBUG_DEATH({ - DoOpenClosed(); - - EXPECT_FALSE(chrome_async_socket_->StartTls("fakedomain.com")); - - DoCloseOpened( - SignalSocketState(SIGNAL_CLOSE, - ChromeAsyncSocket::STATE_CLOSED, - ChromeAsyncSocket::ERROR_WRONGSTATE, - net::OK)); - }, "wrong state"); -} - -TEST_F(ChromeAsyncSocketTest, SSLConnectDuringPostedWrite) { - EXPECT_DEBUG_DEATH({ - DoOpenClosed(); - - async_socket_data_provider_.AddWrite( - net::MockWrite(net::ASYNC, kWriteData, 3)); - EXPECT_TRUE(chrome_async_socket_->Write(kWriteData, 3)); - - EXPECT_FALSE(chrome_async_socket_->StartTls("fakedomain.com")); - - base::RunLoop().RunUntilIdle(); - - DoCloseOpened( - SignalSocketState(SIGNAL_CLOSE, - ChromeAsyncSocket::STATE_CLOSED, - ChromeAsyncSocket::ERROR_WRONGSTATE, - net::OK)); - }, "wrong state"); -} - -// After this we can assume SSL connect works as expected. - -TEST_F(ChromeAsyncSocketTest, SSLRead) { - DoSSLOpenClosed(); - async_socket_data_provider_.AddRead(net::MockRead(kReadData)); - base::RunLoop().RunUntilIdle(); - - ExpectSSLReadSignal(); - ExpectNoSignal(); - - EXPECT_EQ(kReadData, DrainRead(1)); - - base::RunLoop().RunUntilIdle(); - - DoSSLCloseOpenedNoError(); -} - -TEST_F(ChromeAsyncSocketTest, SSLSyncWrite) { - async_socket_data_provider_.AddWrite( - net::MockWrite(net::SYNCHRONOUS, kWriteData, 3)); - async_socket_data_provider_.AddWrite( - net::MockWrite(net::SYNCHRONOUS, kWriteData + 3, 5)); - async_socket_data_provider_.AddWrite( - net::MockWrite(net::SYNCHRONOUS, - kWriteData + 8, arraysize(kWriteData) - 8)); - DoSSLOpenClosed(); - - EXPECT_TRUE(chrome_async_socket_->Write(kWriteData, 3)); - base::RunLoop().RunUntilIdle(); - EXPECT_TRUE(chrome_async_socket_->Write(kWriteData + 3, 5)); - base::RunLoop().RunUntilIdle(); - EXPECT_TRUE(chrome_async_socket_->Write(kWriteData + 8, - arraysize(kWriteData) - 8)); - base::RunLoop().RunUntilIdle(); - - ExpectNoSignal(); - - DoSSLCloseOpenedNoError(); -} - -TEST_F(ChromeAsyncSocketTest, SSLAsyncWrite) { - DoSSLOpenClosed(); - - async_socket_data_provider_.AddWrite( - net::MockWrite(net::ASYNC, kWriteData, 3)); - async_socket_data_provider_.AddWrite( - net::MockWrite(net::ASYNC, kWriteData + 3, 5)); - async_socket_data_provider_.AddWrite( - net::MockWrite(net::ASYNC, kWriteData + 8, arraysize(kWriteData) - 8)); - - EXPECT_TRUE(chrome_async_socket_->Write(kWriteData, 3)); - base::RunLoop().RunUntilIdle(); - EXPECT_TRUE(chrome_async_socket_->Write(kWriteData + 3, 5)); - base::RunLoop().RunUntilIdle(); - EXPECT_TRUE(chrome_async_socket_->Write(kWriteData + 8, - arraysize(kWriteData) - 8)); - base::RunLoop().RunUntilIdle(); - - ExpectNoSignal(); - - DoSSLCloseOpenedNoError(); -} - -} // namespace - -} // namespace jingle_glue diff --git a/jingle/glue/network_service_async_socket.cc b/jingle/glue/network_service_async_socket.cc index 46daeee02a0238..17e94eacd9a12e 100644 --- a/jingle/glue/network_service_async_socket.cc +++ b/jingle/glue/network_service_async_socket.cc @@ -21,7 +21,7 @@ namespace jingle_glue { NetworkServiceAsyncSocket::NetworkServiceAsyncSocket( - GetProxyResolvingFactoryCallback get_socket_factory_callback, + GetProxyResolvingSocketFactoryCallback get_socket_factory_callback, bool use_fake_tls_handshake, size_t read_buf_size, size_t write_buf_size, diff --git a/jingle/glue/network_service_async_socket.h b/jingle/glue/network_service_async_socket.h index 27c4204040f5cc..7dbe4a8c5029e1 100644 --- a/jingle/glue/network_service_async_socket.h +++ b/jingle/glue/network_service_async_socket.h @@ -17,6 +17,7 @@ #include "base/macros.h" #include "base/memory/ref_counted.h" #include "base/memory/weak_ptr.h" +#include "jingle/glue/network_service_config.h" #include "mojo/public/cpp/bindings/binding.h" #include "mojo/public/cpp/system/data_pipe.h" #include "mojo/public/cpp/system/simple_watcher.h" @@ -26,14 +27,11 @@ namespace jingle_glue { -using GetProxyResolvingFactoryCallback = base::RepeatingCallback; - class NetworkServiceAsyncSocket : public buzz::AsyncSocket, public network::mojom::SocketObserver { public: NetworkServiceAsyncSocket( - GetProxyResolvingFactoryCallback get_socket_factory_callback, + GetProxyResolvingSocketFactoryCallback get_socket_factory_callback, bool use_fake_tls_handshake, size_t read_buf_size, size_t write_buf_size, @@ -202,7 +200,7 @@ class NetworkServiceAsyncSocket : public buzz::AsyncSocket, // |socket_factory_| is recreated every time via |get_socket_factory_callback| // to handle network service restarts after crashes. - GetProxyResolvingFactoryCallback get_socket_factory_callback_; + GetProxyResolvingSocketFactoryCallback get_socket_factory_callback_; network::mojom::ProxyResolvingSocketFactoryPtr socket_factory_; // The handle to the proxy resolving socket for the current connection, if one // exists. diff --git a/jingle/glue/network_service_config.cc b/jingle/glue/network_service_config.cc new file mode 100644 index 00000000000000..d6195557ed888d --- /dev/null +++ b/jingle/glue/network_service_config.cc @@ -0,0 +1,16 @@ +// Copyright (c) 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// Configuration information for talking to the network service. + +#include "jingle/glue/network_service_config.h" + +namespace jingle_glue { + +NetworkServiceConfig::NetworkServiceConfig() = default; +NetworkServiceConfig::NetworkServiceConfig(const NetworkServiceConfig& other) = + default; +NetworkServiceConfig::~NetworkServiceConfig() = default; + +} // namespace jingle_glue diff --git a/jingle/glue/network_service_config.h b/jingle/glue/network_service_config.h new file mode 100644 index 00000000000000..4a1c2a8db30048 --- /dev/null +++ b/jingle/glue/network_service_config.h @@ -0,0 +1,33 @@ +// Copyright (c) 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// Configuration information for talking to the network service. + +#ifndef JINGLE_GLUE_NETWORK_SERVICE_CONFIG_H_ +#define JINGLE_GLUE_NETWORK_SERVICE_CONFIG_H_ + +#include "base/callback.h" +#include "base/macros.h" +#include "base/single_thread_task_runner.h" +#include "services/network/public/mojom/proxy_resolving_socket.mojom.h" + +namespace jingle_glue { + +using GetProxyResolvingSocketFactoryCallback = base::RepeatingCallback; + +struct NetworkServiceConfig { + NetworkServiceConfig(); + NetworkServiceConfig(const NetworkServiceConfig& other); + ~NetworkServiceConfig(); + + // This will be run on |task_runner|. + GetProxyResolvingSocketFactoryCallback + get_proxy_resolving_socket_factory_callback; + scoped_refptr task_runner; +}; + +} // namespace jingle_glue + +#endif // JINGLE_GLUE_NETWORK_SERVICE_CONFIG_H_ diff --git a/jingle/glue/network_service_config_test_util.cc b/jingle/glue/network_service_config_test_util.cc new file mode 100644 index 00000000000000..d4b4972ca69cd1 --- /dev/null +++ b/jingle/glue/network_service_config_test_util.cc @@ -0,0 +1,107 @@ +// Copyright (c) 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// Helper for tests that want to fill in a NetworkServiceConfig + +#include "jingle/glue/network_service_config_test_util.h" + +#include "base/synchronization/waitable_event.h" +#include "base/threading/sequenced_task_runner_handle.h" +#include "base/threading/thread_restrictions.h" + +namespace jingle_glue { + +NetworkServiceConfigTestUtil::NetworkServiceConfigTestUtil( + scoped_refptr url_request_context_getter) + : url_request_context_getter_(std::move(url_request_context_getter)), + weak_ptr_factory_(this) { + net_runner_ = url_request_context_getter_->GetNetworkTaskRunner(); + mojo_runner_ = base::SequencedTaskRunnerHandle::Get(); + if (net_runner_->BelongsToCurrentThread()) { + CreateNetworkContextOnNetworkRunner( + mojo::MakeRequest(&network_context_ptr_), nullptr); + } else { + base::ScopedAllowBaseSyncPrimitivesForTesting permission; + base::WaitableEvent wait_for_create; + net_runner_->PostTask( + FROM_HERE, + base::BindOnce( + &NetworkServiceConfigTestUtil::CreateNetworkContextOnNetworkRunner, + base::Unretained(this), mojo::MakeRequest(&network_context_ptr_), + &wait_for_create)); + // Block for creation to avoid needing to worry about + // CreateNetworkContextOnNetworkRunner + // potentially happening after ~NetworkServiceConfigTestUtil. + wait_for_create.Wait(); + } +} + +NetworkServiceConfigTestUtil::~NetworkServiceConfigTestUtil() { + if (!net_runner_->BelongsToCurrentThread()) { + base::ScopedAllowBaseSyncPrimitivesForTesting permission; + base::WaitableEvent wait_for_delete; + net_runner_->PostTask( + FROM_HERE, + base::BindOnce( + &NetworkServiceConfigTestUtil::DeleteNetworkContextOnNetworkRunner, + base::Unretained(this), &wait_for_delete)); + wait_for_delete.Wait(); + } +} + +void NetworkServiceConfigTestUtil::FillInNetworkConfig( + NetworkServiceConfig* config) { + config->task_runner = net_runner_; + config->get_proxy_resolving_socket_factory_callback = + MakeSocketFactoryCallback(); +} + +GetProxyResolvingSocketFactoryCallback +NetworkServiceConfigTestUtil::MakeSocketFactoryCallback() { + DCHECK(mojo_runner_->RunsTasksInCurrentSequence()); + return base::BindRepeating(&NetworkServiceConfigTestUtil::RequestSocket, + weak_ptr_factory_.GetWeakPtr(), mojo_runner_, + net_runner_); +} + +void NetworkServiceConfigTestUtil::RequestSocket( + base::WeakPtr instance, + scoped_refptr mojo_runner, + scoped_refptr net_runner, + network::mojom::ProxyResolvingSocketFactoryRequest request) { + DCHECK(net_runner->RunsTasksInCurrentSequence()); + mojo_runner->PostTask( + FROM_HERE, + base::BindOnce(&NetworkServiceConfigTestUtil::RequestSocketOnMojoRunner, + std::move(instance), std::move(request))); +} + +void NetworkServiceConfigTestUtil::RequestSocketOnMojoRunner( + base::WeakPtr instance, + network::mojom::ProxyResolvingSocketFactoryRequest request) { + if (instance) { + instance->network_context_ptr_->CreateProxyResolvingSocketFactory( + std::move(request)); + } +} + +void NetworkServiceConfigTestUtil::CreateNetworkContextOnNetworkRunner( + network::mojom::NetworkContextRequest network_context_request, + base::WaitableEvent* notify) { + DCHECK(net_runner_->RunsTasksInCurrentSequence()); + network_context_ = std::make_unique( + nullptr, std::move(network_context_request), + url_request_context_getter_->GetURLRequestContext()); + if (notify) + notify->Signal(); +} + +void NetworkServiceConfigTestUtil::DeleteNetworkContextOnNetworkRunner( + base::WaitableEvent* notify) { + DCHECK(net_runner_->RunsTasksInCurrentSequence()); + network_context_ = nullptr; + notify->Signal(); +} + +} // namespace jingle_glue diff --git a/jingle/glue/network_service_config_test_util.h b/jingle/glue/network_service_config_test_util.h new file mode 100644 index 00000000000000..62dc1f079caafc --- /dev/null +++ b/jingle/glue/network_service_config_test_util.h @@ -0,0 +1,67 @@ +// Copyright (c) 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// Helper for tests that want to fill in a NetworkServiceConfig + +#ifndef JINGLE_GLUE_NETWORK_SERVICE_CONFIG_TEST_UTIL_H_ +#define JINGLE_GLUE_NETWORK_SERVICE_CONFIG_TEST_UTIL_H_ + +#include "base/memory/weak_ptr.h" +#include "base/single_thread_task_runner.h" +#include "jingle/glue/network_service_config.h" +#include "net/url_request/url_request_context_getter.h" +#include "services/network/network_context.h" +#include "services/network/public/mojom/network_context.mojom.h" + +namespace base { +class WaitableEvent; +} + +namespace jingle_glue { + +class NetworkServiceConfigTestUtil { + public: + // All public methods must be called on the thread this is created on, + // but the callback returned by MakeSocketFactoryCallback() is expected to be + // run on |url_request_context_getter->GetNetworkTaskRunner()|, which can be, + // but does not have to be, a separare thread. The constructor and destructor + // can block, but will not spin the event loop. + explicit NetworkServiceConfigTestUtil( + scoped_refptr url_request_context_getter); + ~NetworkServiceConfigTestUtil(); + + // Configures |config| to run the result of MakeSocketFactoryCallback() + // on the network runner of |url_request_context_getter| passed to the + // constructor. + void FillInNetworkConfig(NetworkServiceConfig* config); + GetProxyResolvingSocketFactoryCallback MakeSocketFactoryCallback(); + + private: + static void RequestSocket( + base::WeakPtr instance, + scoped_refptr mojo_runner, + scoped_refptr net_runner, + network::mojom::ProxyResolvingSocketFactoryRequest request); + static void RequestSocketOnMojoRunner( + base::WeakPtr instance, + network::mojom::ProxyResolvingSocketFactoryRequest request); + void CreateNetworkContextOnNetworkRunner( + network::mojom::NetworkContextRequest network_context_request, + base::WaitableEvent* notify); + void DeleteNetworkContextOnNetworkRunner(base::WaitableEvent* notify); + + scoped_refptr net_runner_; + scoped_refptr mojo_runner_; + scoped_refptr url_request_context_getter_; + std::unique_ptr + network_context_; // lives on |net_runner_| + network::mojom::NetworkContextPtr + network_context_ptr_; // lives on |mojo_runner_| + base::WeakPtrFactory + weak_ptr_factory_; // lives on |mojo_runner_| +}; + +} // namespace jingle_glue + +#endif // JINGLE_GLUE_NETWORK_SERVICE_CONFIG_TEST_UTIL_H_ diff --git a/jingle/glue/resolving_client_socket_factory.h b/jingle/glue/resolving_client_socket_factory.h deleted file mode 100644 index 994c40832893c1..00000000000000 --- a/jingle/glue/resolving_client_socket_factory.h +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef JINGLE_GLUE_RESOLVING_CLIENT_SOCKET_FACTORY_H_ -#define JINGLE_GLUE_RESOLVING_CLIENT_SOCKET_FACTORY_H_ - -#include - -namespace net { -class ClientSocketHandle; -class HostPortPair; -class SSLClientSocket; -class StreamSocket; -} // namespace net - -// TODO(sanjeevr): Move this to net/ - -namespace jingle_glue { - -// Interface for a ClientSocketFactory that creates ClientSockets that can -// resolve host names and tunnel through proxies. -class ResolvingClientSocketFactory { - public: - virtual ~ResolvingClientSocketFactory() { } - // Method to create a transport socket using a HostPortPair. - virtual std::unique_ptr CreateTransportClientSocket( - const net::HostPortPair& host_and_port) = 0; - - virtual std::unique_ptr CreateSSLClientSocket( - std::unique_ptr transport_socket, - const net::HostPortPair& host_and_port) = 0; -}; - -} // namespace jingle_glue - -#endif // JINGLE_GLUE_RESOLVING_CLIENT_SOCKET_FACTORY_H_ diff --git a/jingle/glue/xmpp_client_socket_factory.cc b/jingle/glue/xmpp_client_socket_factory.cc deleted file mode 100644 index 8ee3f8b57b74cc..00000000000000 --- a/jingle/glue/xmpp_client_socket_factory.cc +++ /dev/null @@ -1,66 +0,0 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "jingle/glue/xmpp_client_socket_factory.h" - -#include - -#include "base/logging.h" -#include "jingle/glue/fake_ssl_client_socket.h" -#include "net/socket/client_socket_factory.h" -#include "net/socket/client_socket_handle.h" -#include "net/socket/ssl_client_socket.h" -#include "net/url_request/url_request_context.h" -#include "net/url_request/url_request_context_getter.h" -#include "services/network/proxy_resolving_client_socket.h" - -namespace jingle_glue { - -XmppClientSocketFactory::XmppClientSocketFactory( - net::ClientSocketFactory* client_socket_factory, - const net::SSLConfig& ssl_config, - const scoped_refptr& request_context_getter, - bool use_fake_ssl_client_socket) - : client_socket_factory_(client_socket_factory), - request_context_getter_(request_context_getter), - proxy_resolving_socket_factory_( - request_context_getter->GetURLRequestContext()), - ssl_config_(ssl_config), - use_fake_ssl_client_socket_(use_fake_ssl_client_socket) { - CHECK(client_socket_factory_); -} - -XmppClientSocketFactory::~XmppClientSocketFactory() {} - -std::unique_ptr -XmppClientSocketFactory::CreateTransportClientSocket( - const net::HostPortPair& host_and_port) { - // TODO(akalin): Use socket pools. - auto transport_socket = proxy_resolving_socket_factory_.CreateSocket( - GURL("https://" + host_and_port.ToString()), false /*use_tls*/); - return (use_fake_ssl_client_socket_ - ? std::unique_ptr( - new FakeSSLClientSocket(std::move(transport_socket))) - : std::move(transport_socket)); -} - -std::unique_ptr -XmppClientSocketFactory::CreateSSLClientSocket( - std::unique_ptr transport_socket, - const net::HostPortPair& host_and_port) { - const net::URLRequestContext* url_context = - request_context_getter_->GetURLRequestContext(); - net::SSLClientSocketContext context( - url_context->cert_verifier(), - nullptr, /* TODO(rkn): ChannelIDService is not thread safe. */ - url_context->transport_security_state(), - url_context->cert_transparency_verifier(), - url_context->ct_policy_enforcer(), - std::string() /* TODO(rsleevi): Ensure a proper unique shard. */); - return client_socket_factory_->CreateSSLClientSocket( - std::move(transport_socket), host_and_port, ssl_config_, context); -} - - -} // namespace jingle_glue diff --git a/jingle/glue/xmpp_client_socket_factory.h b/jingle/glue/xmpp_client_socket_factory.h deleted file mode 100644 index 029d231f0c737e..00000000000000 --- a/jingle/glue/xmpp_client_socket_factory.h +++ /dev/null @@ -1,66 +0,0 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef JINGLE_GLUE_XMPP_CLIENT_SOCKET_FACTORY_H_ -#define JINGLE_GLUE_XMPP_CLIENT_SOCKET_FACTORY_H_ - -#include - -#include "base/compiler_specific.h" -#include "base/macros.h" -#include "base/memory/ref_counted.h" -#include "jingle/glue/resolving_client_socket_factory.h" -#include "net/ssl/ssl_config_service.h" -#include "services/network/proxy_resolving_client_socket_factory.h" - -namespace network { -class ProxyResolvingClientSocketFactory; -} // namespace network - -namespace net { -class ClientSocketFactory; -class ClientSocketHandle; -class HostPortPair; -class SSLClientSocket; -class StreamSocket; -class URLRequestContextGetter; -} // namespace net - -namespace jingle_glue { - -class XmppClientSocketFactory : public ResolvingClientSocketFactory { - public: - // Does not take ownership of |client_socket_factory|. - XmppClientSocketFactory( - net::ClientSocketFactory* client_socket_factory, - const net::SSLConfig& ssl_config, - const scoped_refptr& request_context_getter, - bool use_fake_ssl_client_socket); - - ~XmppClientSocketFactory() override; - - // ResolvingClientSocketFactory implementation. - std::unique_ptr CreateTransportClientSocket( - const net::HostPortPair& host_and_port) override; - - std::unique_ptr CreateSSLClientSocket( - std::unique_ptr transport_socket, - const net::HostPortPair& host_and_port) override; - - private: - net::ClientSocketFactory* const client_socket_factory_; - scoped_refptr request_context_getter_; - // |proxy_resolving_socket_factory_| retains a reference to the raw - // net::URLRequestContext pointer, and thus must not outlive - // |request_context_getter_|. - network::ProxyResolvingClientSocketFactory proxy_resolving_socket_factory_; - const net::SSLConfig ssl_config_; - const bool use_fake_ssl_client_socket_; - - DISALLOW_COPY_AND_ASSIGN(XmppClientSocketFactory); -}; - -} // namespace jingle_glue - -#endif // JINGLE_GLUE_XMPP_CLIENT_SOCKET_FACTORY_H_ diff --git a/jingle/notifier/base/notifier_options.h b/jingle/notifier/base/notifier_options.h index e0ff5334ee4872..3dfd346b9d1b97 100644 --- a/jingle/notifier/base/notifier_options.h +++ b/jingle/notifier/base/notifier_options.h @@ -8,9 +8,9 @@ #include #include "base/memory/ref_counted.h" +#include "jingle/glue/network_service_config.h" #include "jingle/notifier/base/notification_method.h" #include "net/base/host_port_pair.h" -#include "net/url_request/url_request_context_getter.h" namespace network { class NetworkConnectionTracker; @@ -46,8 +46,8 @@ struct NotifierOptions { // Specifies the auth mechanism to use ("X-GOOGLE-TOKEN", "X-OAUTH2", etc), std::string auth_mechanism; - // The URLRequestContextGetter to use for doing I/O. - scoped_refptr request_context_getter; + // Specifies how to get sockets out of network service. + jingle_glue::NetworkServiceConfig network_config; // Used to listen for network connection changes. network::NetworkConnectionTracker* network_connection_tracker; diff --git a/jingle/notifier/base/xmpp_connection.cc b/jingle/notifier/base/xmpp_connection.cc index 20eb3545bbf9cc..1b09cab869229b 100644 --- a/jingle/notifier/base/xmpp_connection.cc +++ b/jingle/notifier/base/xmpp_connection.cc @@ -10,13 +10,11 @@ #include "base/logging.h" #include "base/strings/string_piece.h" #include "base/threading/thread_task_runner_handle.h" -#include "jingle/glue/chrome_async_socket.h" +#include "jingle/glue/network_service_async_socket.h" #include "jingle/glue/task_pump.h" -#include "jingle/glue/xmpp_client_socket_factory.h" #include "jingle/notifier/base/weak_xmpp_client.h" #include "net/socket/client_socket_factory.h" #include "net/ssl/ssl_config_service.h" -#include "net/url_request/url_request_context.h" #include "third_party/libjingle_xmpp/xmpp/xmppclientsettings.h" namespace notifier { @@ -27,7 +25,8 @@ namespace { buzz::AsyncSocket* CreateSocket( const buzz::XmppClientSettings& xmpp_client_settings, - const scoped_refptr& request_context_getter, + jingle_glue::GetProxyResolvingSocketFactoryCallback + get_socket_factory_callback, const net::NetworkTrafficAnnotationTag& traffic_annotation) { bool use_fake_ssl_client_socket = (xmpp_client_settings.protocol() == cricket::PROTO_SSLTCP); @@ -37,21 +36,17 @@ buzz::AsyncSocket* CreateSocket( // XmppSocketAdapter. const size_t kReadBufSize = 64U * 1024U; const size_t kWriteBufSize = 64U * 1024U; - auto client_socket_factory = - std::make_unique( - net::ClientSocketFactory::GetDefaultFactory(), ssl_config, - request_context_getter, use_fake_ssl_client_socket); - - return new jingle_glue::ChromeAsyncSocket(std::move(client_socket_factory), - kReadBufSize, kWriteBufSize, - traffic_annotation); + return new jingle_glue::NetworkServiceAsyncSocket( + get_socket_factory_callback, use_fake_ssl_client_socket, kReadBufSize, + kWriteBufSize, traffic_annotation); } } // namespace XmppConnection::XmppConnection( const buzz::XmppClientSettings& xmpp_client_settings, - const scoped_refptr& request_context_getter, + jingle_glue::GetProxyResolvingSocketFactoryCallback + get_socket_factory_callback, Delegate* delegate, buzz::PreXmppAuth* pre_xmpp_auth, const net::NetworkTrafficAnnotationTag& traffic_annotation) @@ -71,7 +66,7 @@ XmppConnection::XmppConnection( const char kLanguage[] = "en"; buzz::XmppReturnStatus connect_status = weak_xmpp_client->Connect( xmpp_client_settings, kLanguage, - CreateSocket(xmpp_client_settings, request_context_getter, + CreateSocket(xmpp_client_settings, get_socket_factory_callback, traffic_annotation), pre_xmpp_auth); // buzz::XmppClient::Connect() should never fail. diff --git a/jingle/notifier/base/xmpp_connection.h b/jingle/notifier/base/xmpp_connection.h index a00dd39fb21265..b9ad538d3f1dc2 100644 --- a/jingle/notifier/base/xmpp_connection.h +++ b/jingle/notifier/base/xmpp_connection.h @@ -14,8 +14,8 @@ #include "base/memory/ref_counted.h" #include "base/memory/weak_ptr.h" #include "base/sequence_checker.h" +#include "jingle/glue/network_service_config.h" #include "net/traffic_annotation/network_traffic_annotation.h" -#include "net/url_request/url_request_context_getter.h" #include "third_party/libjingle_xmpp/xmpp/xmppengine.h" #include "third_party/webrtc/rtc_base/third_party/sigslot/sigslot.h" @@ -68,12 +68,12 @@ class XmppConnection : public sigslot::has_slots<> { // NULL. Takes ownership of |pre_xmpp_auth|, which may be NULL. // // TODO(akalin): Avoid the need for |pre_xmpp_auth|. - XmppConnection( - const buzz::XmppClientSettings& xmpp_client_settings, - const scoped_refptr& request_context_getter, - Delegate* delegate, - buzz::PreXmppAuth* pre_xmpp_auth, - const net::NetworkTrafficAnnotationTag& traffic_annotation); + XmppConnection(const buzz::XmppClientSettings& xmpp_client_settings, + jingle_glue::GetProxyResolvingSocketFactoryCallback + get_socket_factory_callback, + Delegate* delegate, + buzz::PreXmppAuth* pre_xmpp_auth, + const net::NetworkTrafficAnnotationTag& traffic_annotation); // Invalidates any weak pointers passed to the delegate by // OnConnect(), but does not trigger a call to the delegate's diff --git a/jingle/notifier/base/xmpp_connection_unittest.cc b/jingle/notifier/base/xmpp_connection_unittest.cc index 332a37939380dc..606ff3e0b24105 100644 --- a/jingle/notifier/base/xmpp_connection_unittest.cc +++ b/jingle/notifier/base/xmpp_connection_unittest.cc @@ -14,6 +14,7 @@ #include "base/message_loop/message_pump_default.h" #include "base/run_loop.h" #include "jingle/glue/mock_task.h" +#include "jingle/glue/network_service_config_test_util.h" #include "jingle/glue/task_pump.h" #include "jingle/notifier/base/weak_xmpp_client.h" #include "net/cert/cert_verifier.h" @@ -76,15 +77,15 @@ class MockXmppConnectionDelegate : public XmppConnection::Delegate { class XmppConnectionTest : public testing::Test { protected: XmppConnectionTest() - : mock_pre_xmpp_auth_(new MockPreXmppAuth()) { + : mock_pre_xmpp_auth_(new MockPreXmppAuth()), + net_config_helper_( + base::MakeRefCounted( + message_loop_.task_runner())) { // GTest death tests by default execute in a fork()ed but not exec()ed // process. On macOS, a CoreFoundation-backed MessageLoop will exit with a // __THE_PROCESS_HAS_FORKED_AND_YOU_CANNOT_USE_THIS_COREFOUNDATION_FUNCTIONALITY___YOU_MUST_EXEC__ // when called. Use the threadsafe mode to avoid this problem. testing::GTEST_FLAG(death_test_style) = "threadsafe"; - - url_request_context_getter_ = - new net::TestURLRequestContextGetter(message_loop_.task_runner()); } ~XmppConnectionTest() override {} @@ -98,13 +99,14 @@ class XmppConnectionTest : public testing::Test { base::MessageLoop message_loop_; MockXmppConnectionDelegate mock_xmpp_connection_delegate_; std::unique_ptr mock_pre_xmpp_auth_; - scoped_refptr url_request_context_getter_; + jingle_glue::NetworkServiceConfigTestUtil net_config_helper_; }; TEST_F(XmppConnectionTest, CreateDestroy) { - XmppConnection xmpp_connection( - buzz::XmppClientSettings(), url_request_context_getter_, - &mock_xmpp_connection_delegate_, NULL, TRAFFIC_ANNOTATION_FOR_TESTS); + XmppConnection xmpp_connection(buzz::XmppClientSettings(), + net_config_helper_.MakeSocketFactoryCallback(), + &mock_xmpp_connection_delegate_, NULL, + TRAFFIC_ANNOTATION_FOR_TESTS); } TEST_F(XmppConnectionTest, ImmediateFailure) { @@ -114,9 +116,10 @@ TEST_F(XmppConnectionTest, ImmediateFailure) { EXPECT_CALL(mock_xmpp_connection_delegate_, OnError(buzz::XmppEngine::ERROR_NONE, 0, NULL)); - XmppConnection xmpp_connection( - buzz::XmppClientSettings(), url_request_context_getter_, - &mock_xmpp_connection_delegate_, NULL, TRAFFIC_ANNOTATION_FOR_TESTS); + XmppConnection xmpp_connection(buzz::XmppClientSettings(), + net_config_helper_.MakeSocketFactoryCallback(), + &mock_xmpp_connection_delegate_, NULL, + TRAFFIC_ANNOTATION_FOR_TESTS); // We need to do this *before* |xmpp_connection| gets destroyed or // our delegate won't be called. @@ -133,10 +136,11 @@ TEST_F(XmppConnectionTest, PreAuthFailure) { EXPECT_CALL(mock_xmpp_connection_delegate_, OnError(buzz::XmppEngine::ERROR_AUTH, 5, NULL)); - XmppConnection xmpp_connection( - buzz::XmppClientSettings(), url_request_context_getter_, - &mock_xmpp_connection_delegate_, mock_pre_xmpp_auth_.release(), - TRAFFIC_ANNOTATION_FOR_TESTS); + XmppConnection xmpp_connection(buzz::XmppClientSettings(), + net_config_helper_.MakeSocketFactoryCallback(), + &mock_xmpp_connection_delegate_, + mock_pre_xmpp_auth_.release(), + TRAFFIC_ANNOTATION_FOR_TESTS); // We need to do this *before* |xmpp_connection| gets destroyed or // our delegate won't be called. @@ -153,10 +157,11 @@ TEST_F(XmppConnectionTest, FailureAfterPreAuth) { EXPECT_CALL(mock_xmpp_connection_delegate_, OnError(buzz::XmppEngine::ERROR_NONE, 0, NULL)); - XmppConnection xmpp_connection( - buzz::XmppClientSettings(), url_request_context_getter_, - &mock_xmpp_connection_delegate_, mock_pre_xmpp_auth_.release(), - TRAFFIC_ANNOTATION_FOR_TESTS); + XmppConnection xmpp_connection(buzz::XmppClientSettings(), + net_config_helper_.MakeSocketFactoryCallback(), + &mock_xmpp_connection_delegate_, + mock_pre_xmpp_auth_.release(), + TRAFFIC_ANNOTATION_FOR_TESTS); // We need to do this *before* |xmpp_connection| gets destroyed or // our delegate won't be called. @@ -167,9 +172,10 @@ TEST_F(XmppConnectionTest, RaisedError) { EXPECT_CALL(mock_xmpp_connection_delegate_, OnError(buzz::XmppEngine::ERROR_NONE, 0, NULL)); - XmppConnection xmpp_connection( - buzz::XmppClientSettings(), url_request_context_getter_, - &mock_xmpp_connection_delegate_, NULL, TRAFFIC_ANNOTATION_FOR_TESTS); + XmppConnection xmpp_connection(buzz::XmppClientSettings(), + net_config_helper_.MakeSocketFactoryCallback(), + &mock_xmpp_connection_delegate_, NULL, + TRAFFIC_ANNOTATION_FOR_TESTS); xmpp_connection.weak_xmpp_client_-> SignalStateChange(buzz::XmppEngine::STATE_CLOSED); @@ -182,7 +188,8 @@ TEST_F(XmppConnectionTest, Connect) { { XmppConnection xmpp_connection( - buzz::XmppClientSettings(), url_request_context_getter_, + buzz::XmppClientSettings(), + net_config_helper_.MakeSocketFactoryCallback(), &mock_xmpp_connection_delegate_, NULL, TRAFFIC_ANNOTATION_FOR_TESTS); xmpp_connection.weak_xmpp_client_-> @@ -200,7 +207,8 @@ TEST_F(XmppConnectionTest, MultipleConnect) { WillOnce(SaveArg<0>(&weak_ptr)); XmppConnection xmpp_connection( - buzz::XmppClientSettings(), url_request_context_getter_, + buzz::XmppClientSettings(), + net_config_helper_.MakeSocketFactoryCallback(), &mock_xmpp_connection_delegate_, NULL, TRAFFIC_ANNOTATION_FOR_TESTS); xmpp_connection.weak_xmpp_client_-> @@ -221,9 +229,10 @@ TEST_F(XmppConnectionTest, ConnectThenError) { EXPECT_CALL(mock_xmpp_connection_delegate_, OnError(buzz::XmppEngine::ERROR_NONE, 0, NULL)); - XmppConnection xmpp_connection( - buzz::XmppClientSettings(), url_request_context_getter_, - &mock_xmpp_connection_delegate_, NULL, TRAFFIC_ANNOTATION_FOR_TESTS); + XmppConnection xmpp_connection(buzz::XmppClientSettings(), + net_config_helper_.MakeSocketFactoryCallback(), + &mock_xmpp_connection_delegate_, NULL, + TRAFFIC_ANNOTATION_FOR_TESTS); xmpp_connection.weak_xmpp_client_-> SignalStateChange(buzz::XmppEngine::STATE_OPEN); @@ -239,7 +248,8 @@ TEST_F(XmppConnectionTest, ConnectThenError) { TEST_F(XmppConnectionTest, TasksDontRunAfterXmppConnectionDestructor) { { XmppConnection xmpp_connection( - buzz::XmppClientSettings(), url_request_context_getter_, + buzz::XmppClientSettings(), + net_config_helper_.MakeSocketFactoryCallback(), &mock_xmpp_connection_delegate_, NULL, TRAFFIC_ANNOTATION_FOR_TESTS); jingle_glue::MockTask* task = diff --git a/jingle/notifier/communicator/login.cc b/jingle/notifier/communicator/login.cc index 2dad930aa49624..d62e070ab5afbb 100644 --- a/jingle/notifier/communicator/login.cc +++ b/jingle/notifier/communicator/login.cc @@ -25,18 +25,18 @@ namespace notifier { Login::Delegate::~Delegate() {} -Login::Login( - Delegate* delegate, - const buzz::XmppClientSettings& user_settings, - const scoped_refptr& request_context_getter, - const ServerList& servers, - bool try_ssltcp_first, - const std::string& auth_mechanism, - const net::NetworkTrafficAnnotationTag& traffic_annotation, - network::NetworkConnectionTracker* network_connection_tracker) +Login::Login(Delegate* delegate, + const buzz::XmppClientSettings& user_settings, + jingle_glue::GetProxyResolvingSocketFactoryCallback + get_socket_factory_callback, + const ServerList& servers, + bool try_ssltcp_first, + const std::string& auth_mechanism, + const net::NetworkTrafficAnnotationTag& traffic_annotation, + network::NetworkConnectionTracker* network_connection_tracker) : delegate_(delegate), login_settings_(user_settings, - request_context_getter, + get_socket_factory_callback, servers, try_ssltcp_first, auth_mechanism, diff --git a/jingle/notifier/communicator/login.h b/jingle/notifier/communicator/login.h index fe4f46f5a20a42..ebc63060a748fd 100644 --- a/jingle/notifier/communicator/login.h +++ b/jingle/notifier/communicator/login.h @@ -14,6 +14,7 @@ #include "base/memory/weak_ptr.h" #include "base/time/time.h" #include "base/timer/timer.h" +#include "jingle/glue/network_service_config.h" #include "jingle/notifier/base/server_information.h" #include "jingle/notifier/communicator/login_settings.h" #include "jingle/notifier/communicator/single_login_attempt.h" @@ -27,10 +28,6 @@ class XmppClientSettings; class XmppTaskParentInterface; } // namespace buzz -namespace net { -class URLRequestContextGetter; -} // namespace net - namespace notifier { class LoginSettings; @@ -67,15 +64,15 @@ class Login }; // Does not take ownership of |delegate|, which must not be NULL. - Login( - Delegate* delegate, - const buzz::XmppClientSettings& user_settings, - const scoped_refptr& request_context_getter, - const ServerList& servers, - bool try_ssltcp_first, - const std::string& auth_mechanism, - const net::NetworkTrafficAnnotationTag& traffic_annotation, - network::NetworkConnectionTracker* network_connection_tracker); + Login(Delegate* delegate, + const buzz::XmppClientSettings& user_settings, + jingle_glue::GetProxyResolvingSocketFactoryCallback + get_socket_factory_callback, + const ServerList& servers, + bool try_ssltcp_first, + const std::string& auth_mechanism, + const net::NetworkTrafficAnnotationTag& traffic_annotation, + network::NetworkConnectionTracker* network_connection_tracker); ~Login() override; // Starts connecting (or forces a reconnection if we're backed off). diff --git a/jingle/notifier/communicator/login_settings.cc b/jingle/notifier/communicator/login_settings.cc index 66272abad9bcfa..660464d76f2c59 100644 --- a/jingle/notifier/communicator/login_settings.cc +++ b/jingle/notifier/communicator/login_settings.cc @@ -15,13 +15,14 @@ namespace notifier { LoginSettings::LoginSettings( const buzz::XmppClientSettings& user_settings, - const scoped_refptr& request_context_getter, + jingle_glue::GetProxyResolvingSocketFactoryCallback + get_socket_factory_callback, const ServerList& default_servers, bool try_ssltcp_first, const std::string& auth_mechanism, const net::NetworkTrafficAnnotationTag& traffic_annotation) : user_settings_(user_settings), - request_context_getter_(request_context_getter), + get_socket_factory_callback_(get_socket_factory_callback), default_servers_(default_servers), try_ssltcp_first_(try_ssltcp_first), auth_mechanism_(auth_mechanism), diff --git a/jingle/notifier/communicator/login_settings.h b/jingle/notifier/communicator/login_settings.h index 0c8e65140b92a5..ecd9f534c24116 100644 --- a/jingle/notifier/communicator/login_settings.h +++ b/jingle/notifier/communicator/login_settings.h @@ -8,22 +8,22 @@ #include "base/memory/ref_counted.h" #include "base/time/time.h" +#include "jingle/glue/network_service_config.h" #include "jingle/notifier/base/server_information.h" #include "net/traffic_annotation/network_traffic_annotation.h" -#include "net/url_request/url_request_context_getter.h" #include "third_party/libjingle_xmpp/xmpp/xmppclientsettings.h" namespace notifier { class LoginSettings { public: - LoginSettings( - const buzz::XmppClientSettings& user_settings, - const scoped_refptr& request_context_getter, - const ServerList& default_servers, - bool try_ssltcp_first, - const std::string& auth_mechanism, - const net::NetworkTrafficAnnotationTag& traffic_annotation); + LoginSettings(const buzz::XmppClientSettings& user_settings, + jingle_glue::GetProxyResolvingSocketFactoryCallback + get_socket_factory_callback, + const ServerList& default_servers, + bool try_ssltcp_first, + const std::string& auth_mechanism, + const net::NetworkTrafficAnnotationTag& traffic_annotation); LoginSettings(const LoginSettings& other); @@ -37,8 +37,9 @@ class LoginSettings { void set_user_settings(const buzz::XmppClientSettings& user_settings); - scoped_refptr request_context_getter() const { - return request_context_getter_; + jingle_glue::GetProxyResolvingSocketFactoryCallback + get_socket_factory_callback() const { + return get_socket_factory_callback_; } bool try_ssltcp_first() const { @@ -66,7 +67,8 @@ class LoginSettings { ServerList GetServersForTime(base::Time now) const; buzz::XmppClientSettings user_settings_; - scoped_refptr request_context_getter_; + jingle_glue::GetProxyResolvingSocketFactoryCallback + get_socket_factory_callback_; ServerList default_servers_; bool try_ssltcp_first_; std::string auth_mechanism_; diff --git a/jingle/notifier/communicator/login_settings_unittest.cc b/jingle/notifier/communicator/login_settings_unittest.cc index 2b75d3d2506d3b..a5db8641866d49 100644 --- a/jingle/notifier/communicator/login_settings_unittest.cc +++ b/jingle/notifier/communicator/login_settings_unittest.cc @@ -30,8 +30,10 @@ class LoginSettingsTest : public ::testing::Test { TEST_F(LoginSettingsTest, Basic) { const LoginSettings login_settings( - buzz::XmppClientSettings(), NULL, servers_, false /* try_ssltcp_first */, - kAuthMechanism, TRAFFIC_ANNOTATION_FOR_TESTS); + buzz::XmppClientSettings(), + jingle_glue::GetProxyResolvingSocketFactoryCallback(), servers_, + false /* try_ssltcp_first */, kAuthMechanism, + TRAFFIC_ANNOTATION_FOR_TESTS); EXPECT_EQ(base::Time(), login_settings.GetRedirectExpirationForTest()); const ServerList& servers = login_settings.GetServers(); ASSERT_EQ(servers_.size(), servers.size()); @@ -42,9 +44,11 @@ TEST_F(LoginSettingsTest, Basic) { } TEST_F(LoginSettingsTest, Redirect) { - LoginSettings login_settings(buzz::XmppClientSettings(), NULL, servers_, - false /* try_ssltcp_first */, kAuthMechanism, - TRAFFIC_ANNOTATION_FOR_TESTS); + LoginSettings login_settings( + buzz::XmppClientSettings(), + jingle_glue::GetProxyResolvingSocketFactoryCallback(), servers_, + false /* try_ssltcp_first */, kAuthMechanism, + TRAFFIC_ANNOTATION_FOR_TESTS); const ServerInformation redirect_server( net::HostPortPair("redirect.com", 200), SUPPORTS_SSLTCP); diff --git a/jingle/notifier/communicator/single_login_attempt.cc b/jingle/notifier/communicator/single_login_attempt.cc index dd713fd52437ee..d99f9f61ff1490 100644 --- a/jingle/notifier/communicator/single_login_attempt.cc +++ b/jingle/notifier/communicator/single_login_attempt.cc @@ -175,7 +175,7 @@ void SingleLoginAttempt::TryConnect( client_settings.token_service(), login_settings_.auth_mechanism()); xmpp_connection_.reset(new XmppConnection( - client_settings, login_settings_.request_context_getter(), this, + client_settings, login_settings_.get_socket_factory_callback(), this, pre_xmpp_auth, login_settings_.traffic_annotation())); } diff --git a/jingle/notifier/communicator/single_login_attempt_unittest.cc b/jingle/notifier/communicator/single_login_attempt_unittest.cc index 0608e559db3726..cb226b770a9da8 100644 --- a/jingle/notifier/communicator/single_login_attempt_unittest.cc +++ b/jingle/notifier/communicator/single_login_attempt_unittest.cc @@ -11,6 +11,7 @@ #include "base/message_loop/message_loop.h" #include "base/run_loop.h" #include "base/threading/thread_task_runner_handle.h" +#include "jingle/glue/network_service_config_test_util.h" #include "jingle/notifier/base/const_communicator.h" #include "jingle/notifier/base/fake_base_task.h" #include "jingle/notifier/communicator/login_settings.h" @@ -82,12 +83,14 @@ class MyTestURLRequestContext : public net::TestURLRequestContext { class SingleLoginAttemptTest : public ::testing::Test { protected: SingleLoginAttemptTest() - : login_settings_( - buzz::XmppClientSettings(), - new net::TestURLRequestContextGetter( + : net_config_helper_( + base::MakeRefCounted( base::ThreadTaskRunnerHandle::Get(), std::unique_ptr( - new MyTestURLRequestContext())), + new MyTestURLRequestContext()))), + login_settings_( + buzz::XmppClientSettings(), + net_config_helper_.MakeSocketFactoryCallback(), ServerList(1, ServerInformation(net::HostPortPair("example.com", 100), SUPPORTS_SSLTCP)), @@ -109,6 +112,7 @@ class SingleLoginAttemptTest : public ::testing::Test { private: base::MessageLoop message_loop_; + jingle_glue::NetworkServiceConfigTestUtil net_config_helper_; const LoginSettings login_settings_; protected: diff --git a/jingle/notifier/listener/push_client.cc b/jingle/notifier/listener/push_client.cc index b76d6d668efd4c..f4499e47273e8c 100644 --- a/jingle/notifier/listener/push_client.cc +++ b/jingle/notifier/listener/push_client.cc @@ -27,14 +27,13 @@ std::unique_ptr CreateXmppPushClient( std::unique_ptr PushClient::CreateDefault( const NotifierOptions& notifier_options) { return std::unique_ptr(new NonBlockingPushClient( - notifier_options.request_context_getter->GetNetworkTaskRunner(), + notifier_options.network_config.task_runner, base::Bind(&CreateXmppPushClient, notifier_options))); } std::unique_ptr PushClient::CreateDefaultOnIOThread( const NotifierOptions& notifier_options) { - CHECK(notifier_options.request_context_getter->GetNetworkTaskRunner()-> - BelongsToCurrentThread()); + CHECK(notifier_options.network_config.task_runner->BelongsToCurrentThread()); return CreateXmppPushClient(notifier_options); } diff --git a/jingle/notifier/listener/push_client_unittest.cc b/jingle/notifier/listener/push_client_unittest.cc index 0273618701d8ef..6df2316bb0895e 100644 --- a/jingle/notifier/listener/push_client_unittest.cc +++ b/jingle/notifier/listener/push_client_unittest.cc @@ -12,6 +12,7 @@ #include "base/message_loop/message_loop.h" #include "base/single_thread_task_runner.h" #include "base/threading/thread.h" +#include "jingle/glue/network_service_config_test_util.h" #include "jingle/notifier/base/notifier_options.h" #include "net/url_request/url_request_test_util.h" #include "testing/gtest/include/gtest/gtest.h" @@ -22,16 +23,18 @@ namespace { class PushClientTest : public testing::Test { protected: - PushClientTest() { - notifier_options_.request_context_getter = - new net::TestURLRequestContextGetter( - message_loop_.task_runner()); + PushClientTest() + : net_config_helper_( + base::MakeRefCounted( + message_loop_.task_runner())) { + net_config_helper_.FillInNetworkConfig(¬ifier_options_.network_config); } ~PushClientTest() override {} // The sockets created by the XMPP code expect an IO loop. base::MessageLoopForIO message_loop_; + jingle_glue::NetworkServiceConfigTestUtil net_config_helper_; NotifierOptions notifier_options_; }; diff --git a/jingle/notifier/listener/xmpp_push_client.cc b/jingle/notifier/listener/xmpp_push_client.cc index 64f2ae00e2f375..e32efd229dabdf 100644 --- a/jingle/notifier/listener/xmpp_push_client.cc +++ b/jingle/notifier/listener/xmpp_push_client.cc @@ -14,8 +14,8 @@ namespace notifier { XmppPushClient::XmppPushClient(const NotifierOptions& notifier_options) : notifier_options_(notifier_options) { - DCHECK(notifier_options_.request_context_getter-> - GetNetworkTaskRunner()->BelongsToCurrentThread()); + DCHECK( + notifier_options_.network_config.task_runner->BelongsToCurrentThread()); } XmppPushClient::~XmppPushClient() { @@ -129,7 +129,9 @@ void XmppPushClient::UpdateCredentials( DVLOG(1) << "Push: Starting XMPP connection"; base_task_.reset(); login_.reset(new notifier::Login( - this, xmpp_settings_, notifier_options_.request_context_getter, + this, xmpp_settings_, + notifier_options_.network_config + .get_proxy_resolving_socket_factory_callback, GetServerList(notifier_options_), notifier_options_.try_ssltcp_first, notifier_options_.auth_mechanism, traffic_annotation, notifier_options_.network_connection_tracker)); diff --git a/jingle/notifier/listener/xmpp_push_client_unittest.cc b/jingle/notifier/listener/xmpp_push_client_unittest.cc index f502f0920ba9ed..58d99095ba75c0 100644 --- a/jingle/notifier/listener/xmpp_push_client_unittest.cc +++ b/jingle/notifier/listener/xmpp_push_client_unittest.cc @@ -9,6 +9,7 @@ #include "base/compiler_specific.h" #include "base/message_loop/message_loop.h" #include "base/run_loop.h" +#include "jingle/glue/network_service_config_test_util.h" #include "jingle/notifier/base/fake_base_task.h" #include "jingle/notifier/base/notifier_options.h" #include "jingle/notifier/listener/push_client_observer.h" @@ -34,10 +35,11 @@ class MockObserver : public PushClientObserver { class XmppPushClientTest : public testing::Test { protected: - XmppPushClientTest() { - notifier_options_.request_context_getter = - new net::TestURLRequestContextGetter( - message_loop_.task_runner()); + XmppPushClientTest() + : net_config_helper_( + base::MakeRefCounted( + message_loop_.task_runner())) { + net_config_helper_.FillInNetworkConfig(¬ifier_options_.network_config); } ~XmppPushClientTest() override {} @@ -56,6 +58,8 @@ class XmppPushClientTest : public testing::Test { // The sockets created by the XMPP code expect an IO loop. base::MessageLoopForIO message_loop_; + + jingle_glue::NetworkServiceConfigTestUtil net_config_helper_; NotifierOptions notifier_options_; StrictMock mock_observer_; std::unique_ptr xmpp_push_client_; diff --git a/remoting/client/BUILD.gn b/remoting/client/BUILD.gn index b862dc182903f5..df05c6f12b5175 100644 --- a/remoting/client/BUILD.gn +++ b/remoting/client/BUILD.gn @@ -64,6 +64,7 @@ static_library("client") { "//mojo/core/embedder", "//remoting/client/input", "//remoting/client/ui", + "//services/network:network_service", "//services/network/public/mojom", ] diff --git a/remoting/host/BUILD.gn b/remoting/host/BUILD.gn index a5fec38e98cc1d..c37cdbcb186388 100644 --- a/remoting/host/BUILD.gn +++ b/remoting/host/BUILD.gn @@ -306,6 +306,7 @@ static_library("host") { "//remoting/host/security_key", "//remoting/protocol", "//remoting/resources", + "//services/network:network_service", "//third_party/webrtc/modules/desktop_capture", # //remoting uses the power_save_blocker directly. See crbug.com/689423 diff --git a/services/network/transitional_url_loader_factory_owner.cc b/services/network/transitional_url_loader_factory_owner.cc index 908451d7ee14fd..0eec76622d202d 100644 --- a/services/network/transitional_url_loader_factory_owner.cc +++ b/services/network/transitional_url_loader_factory_owner.cc @@ -105,6 +105,12 @@ TransitionalURLLoaderFactoryOwner::GetURLLoaderFactory() { return shared_url_loader_factory_; } +network::mojom::NetworkContext* +TransitionalURLLoaderFactoryOwner::GetNetworkContext() { + GetURLLoaderFactory(); + return network_context_pipe_.get(); +} + void TransitionalURLLoaderFactoryOwner::DisallowUsageInProcess() { disallowed_in_process().Set(); } diff --git a/services/network/transitional_url_loader_factory_owner.h b/services/network/transitional_url_loader_factory_owner.h index 5bdeb7da05b5e4..3105b2509838f6 100644 --- a/services/network/transitional_url_loader_factory_owner.h +++ b/services/network/transitional_url_loader_factory_owner.h @@ -42,6 +42,8 @@ class COMPONENT_EXPORT(NETWORK_SERVICE) TransitionalURLLoaderFactoryOwner { scoped_refptr GetURLLoaderFactory(); + network::mojom::NetworkContext* GetNetworkContext(); + // If this is called, any creation, use, or destruction of a // TransitionalURLLoaderFactoryOwner will DCHECK-fail. static void DisallowUsageInProcess();