Commit 8dc3acc9 authored by Robbie McElrath's avatar Robbie McElrath Committed by Commit Bot

Fix race during NetworkChangeNotifier construction in unit tests.

See crbug.com/989225#c25 for more details.

Bug: 989225
Change-Id: Ib2b9ef82ea881cdc59d2940dfe54d197d53f67bf
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1742381Reviewed-by: default avatarJohn Abd-El-Malek <jam@chromium.org>
Reviewed-by: default avatarWez <wez@chromium.org>
Commit-Queue: Robbie McElrath <rmcelrath@chromium.org>
Cr-Commit-Position: refs/heads/master@{#687410}
parent 61f35aa6
...@@ -1692,6 +1692,7 @@ TEST_F(TabManagerWithProactiveDiscardExperimentEnabledTest, ...@@ -1692,6 +1692,7 @@ TEST_F(TabManagerWithProactiveDiscardExperimentEnabledTest,
TabStripModel* tab_strip = browser->tab_strip_model(); TabStripModel* tab_strip = browser->tab_strip_model();
// Simulate being offline. // Simulate being offline.
net::NetworkChangeNotifier::DisableForTest net_change_notifier_disabler_;
FakeOfflineNetworkChangeNotifier fake_offline_state; FakeOfflineNetworkChangeNotifier fake_offline_state;
tab_strip->AppendWebContents(CreateWebContents(), /*foreground=*/true); tab_strip->AppendWebContents(CreateWebContents(), /*foreground=*/true);
......
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
#include "base/no_destructor.h" #include "base/no_destructor.h"
#include "base/strings/string_util.h" #include "base/strings/string_util.h"
#include "base/strings/utf_string_conversions.h" #include "base/strings/utf_string_conversions.h"
#include "base/synchronization/waitable_event.h"
#include "base/task/post_task.h" #include "base/task/post_task.h"
#include "base/threading/sequence_local_storage_slot.h" #include "base/threading/sequence_local_storage_slot.h"
#include "build/build_config.h" #include "build/build_config.h"
...@@ -91,7 +92,9 @@ network::mojom::NetworkServiceParamsPtr CreateNetworkServiceParams() { ...@@ -91,7 +92,9 @@ network::mojom::NetworkServiceParamsPtr CreateNetworkServiceParams() {
return network_service_params; return network_service_params;
} }
void CreateNetworkServiceOnIO(network::mojom::NetworkServiceRequest request) { void CreateNetworkServiceOnIOForTesting(
network::mojom::NetworkServiceRequest request,
base::WaitableEvent* completion_event) {
if (GetLocalNetworkService()) { if (GetLocalNetworkService()) {
GetLocalNetworkService()->Bind(std::move(request)); GetLocalNetworkService()->Bind(std::move(request));
return; return;
...@@ -99,6 +102,8 @@ void CreateNetworkServiceOnIO(network::mojom::NetworkServiceRequest request) { ...@@ -99,6 +102,8 @@ void CreateNetworkServiceOnIO(network::mojom::NetworkServiceRequest request) {
GetLocalNetworkService() = GetLocalNetworkService() =
std::make_unique<network::NetworkService>(nullptr, std::move(request)); std::make_unique<network::NetworkService>(nullptr, std::move(request));
if (completion_event)
completion_event->Signal();
} }
void BindNetworkChangeManagerRequest( void BindNetworkChangeManagerRequest(
...@@ -157,16 +162,6 @@ net::NetLogCaptureMode GetNetCaptureModeFromCommandLine( ...@@ -157,16 +162,6 @@ net::NetLogCaptureMode GetNetCaptureModeFromCommandLine(
} // namespace } // namespace
network::mojom::NetworkService* GetNetworkService() { network::mojom::NetworkService* GetNetworkService() {
service_manager::Connector* connector = nullptr;
if (GetSystemConnector() && // null in unit tests.
!g_force_create_network_service_directly) {
connector = GetSystemConnector();
}
return GetNetworkServiceFromConnector(connector);
}
CONTENT_EXPORT network::mojom::NetworkService* GetNetworkServiceFromConnector(
service_manager::Connector* connector) {
if (!g_network_service_ptr) if (!g_network_service_ptr)
g_network_service_ptr = new network::mojom::NetworkServicePtr; g_network_service_ptr = new network::mojom::NetworkServicePtr;
static NetworkServiceClient* g_client; static NetworkServiceClient* g_client;
...@@ -181,16 +176,27 @@ CONTENT_EXPORT network::mojom::NetworkService* GetNetworkServiceFromConnector( ...@@ -181,16 +176,27 @@ CONTENT_EXPORT network::mojom::NetworkService* GetNetworkServiceFromConnector(
auto request = mojo::MakeRequest(g_network_service_ptr); auto request = mojo::MakeRequest(g_network_service_ptr);
auto leaked_pipe = request.PassMessagePipe().release(); auto leaked_pipe = request.PassMessagePipe().release();
} else { } else {
if (connector) { if (GetSystemConnector() && // null in unit tests.
connector->BindInterface(mojom::kNetworkServiceName, !g_force_create_network_service_directly) {
g_network_service_ptr); GetSystemConnector()->BindInterface(mojom::kNetworkServiceName,
g_network_service_ptr);
g_network_service_ptr->set_connection_error_handler( g_network_service_ptr->set_connection_error_handler(
base::BindOnce(&OnNetworkServiceCrash)); base::BindOnce(&OnNetworkServiceCrash));
} else { } else {
base::PostTask( // This should only be reached in unit tests.
FROM_HERE, {BrowserThread::IO}, if (BrowserThread::CurrentlyOn(BrowserThread::IO)) {
base::BindOnce(CreateNetworkServiceOnIO, CreateNetworkServiceOnIOForTesting(
mojo::MakeRequest(g_network_service_ptr))); mojo::MakeRequest(g_network_service_ptr),
/*completion_event=*/nullptr);
} else {
base::WaitableEvent event;
base::PostTaskWithTraits(
FROM_HERE, {BrowserThread::IO},
base::BindOnce(CreateNetworkServiceOnIOForTesting,
mojo::MakeRequest(g_network_service_ptr),
base::Unretained(&event)));
event.Wait();
}
} }
network::mojom::NetworkServiceClientPtr client_ptr; network::mojom::NetworkServiceClientPtr client_ptr;
......
...@@ -28,10 +28,6 @@ class NetworkService; ...@@ -28,10 +28,6 @@ class NetworkService;
} }
} // namespace network } // namespace network
namespace service_manager {
class Connector;
} // namespace service_manager
namespace content { namespace content {
// Returns a pointer to the NetworkService, creating / re-creating it as needed. // Returns a pointer to the NetworkService, creating / re-creating it as needed.
...@@ -42,14 +38,6 @@ namespace content { ...@@ -42,14 +38,6 @@ namespace content {
// This method can only be called on the UI thread. // This method can only be called on the UI thread.
CONTENT_EXPORT network::mojom::NetworkService* GetNetworkService(); CONTENT_EXPORT network::mojom::NetworkService* GetNetworkService();
// Similar to GetNetworkService(), but will create the NetworkService from a
// service manager connector if needed. If network service is disabled,
// |connector| will be ignored and this method is identical to
// GetNetworkService().
// This method can only be called on the UI thread.
CONTENT_EXPORT network::mojom::NetworkService* GetNetworkServiceFromConnector(
service_manager::Connector* connector);
// Only on ChromeOS since it's only used there. // Only on ChromeOS since it's only used there.
#if defined(OS_CHROMEOS) #if defined(OS_CHROMEOS)
// Returns the global NetworkChangeNotifier instance. // Returns the global NetworkChangeNotifier instance.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment