Commit 24613209 authored by Gyuyoung Kim's avatar Gyuyoung Kim Committed by Commit Bot

Migrate NetworkChangeManager to new Mojo types

This CL applies pending_remote to RequestNotifications in
NetworkChagneManager interface.

  - Convert FooPtr to mojo::PendingRemote or mojo::Remote.
  - Convert mojo::Binding to mojo::Receiver

Bug: 955171
Change-Id: I3b730b082bdb64b8b49c7df181bb2fb3bd0e7eb4
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1883951
Commit-Queue: Gyuyoung Kim <gyuyoung@igalia.com>
Reviewed-by: default avatarJohn Abd-El-Malek <jam@chromium.org>
Reviewed-by: default avatarKen Rockot <rockot@google.com>
Reviewed-by: default avatarSam McNally <sammc@chromium.org>
Cr-Commit-Position: refs/heads/master@{#710184}
parent 9f6f6082
...@@ -305,23 +305,23 @@ Decryptor* MojoCdm::GetDecryptor() { ...@@ -305,23 +305,23 @@ Decryptor* MojoCdm::GetDecryptor() {
if (decryptor_) if (decryptor_)
return decryptor_.get(); return decryptor_.get();
mojom::DecryptorPtr decryptor_ptr; mojo::PendingRemote<mojom::Decryptor> decryptor_remote;
// Can be called on a different thread. // Can be called on a different thread.
if (decryptor_ptr_info_.is_valid()) { if (decryptor_ptr_info_.is_valid()) {
DVLOG(1) << __func__ << ": Using Decryptor exposed by the CDM directly"; DVLOG(1) << __func__ << ": Using Decryptor exposed by the CDM directly";
decryptor_ptr.Bind(std::move(decryptor_ptr_info_)); decryptor_remote = std::move(decryptor_ptr_info_);
} else if (interface_factory_ && cdm_id_ != CdmContext::kInvalidCdmId) { } else if (interface_factory_ && cdm_id_ != CdmContext::kInvalidCdmId) {
// TODO(xhwang): Pass back info on whether Decryptor is supported by the // TODO(xhwang): Pass back info on whether Decryptor is supported by the
// remote CDM. // remote CDM.
DVLOG(1) << __func__ << ": Using Decryptor associated with CDM ID " DVLOG(1) << __func__ << ": Using Decryptor associated with CDM ID "
<< cdm_id_ << ", typically hosted by CdmProxy in MediaService"; << cdm_id_ << ", typically hosted by CdmProxy in MediaService";
interface_factory_->CreateDecryptor(cdm_id_, interface_factory_->CreateDecryptor(
mojo::MakeRequest(&decryptor_ptr)); cdm_id_, decryptor_remote.InitWithNewPipeAndPassReceiver());
} }
if (decryptor_ptr) if (decryptor_remote)
decryptor_.reset(new MojoDecryptor(std::move(decryptor_ptr))); decryptor_.reset(new MojoDecryptor(std::move(decryptor_remote)));
return decryptor_.get(); return decryptor_.get();
} }
......
...@@ -156,7 +156,7 @@ class MojoCdm : public ContentDecryptionModule, ...@@ -156,7 +156,7 @@ class MojoCdm : public ContentDecryptionModule,
// The DecryptorPtrInfo exposed by the remote CDM. Set after initialization // The DecryptorPtrInfo exposed by the remote CDM. Set after initialization
// is completed and cleared after |decryptor_| is created. May be invalid // is completed and cleared after |decryptor_| is created. May be invalid
// after initialization if the CDM doesn't support a Decryptor. // after initialization if the CDM doesn't support a Decryptor.
mojom::DecryptorPtrInfo decryptor_ptr_info_; mojo::PendingRemote<mojom::Decryptor> decryptor_ptr_info_;
// Decryptor based on |decryptor_ptr_|, lazily created in GetDecryptor(). // Decryptor based on |decryptor_ptr_|, lazily created in GetDecryptor().
// Since GetDecryptor() can be called on a different thread, use // Since GetDecryptor() can be called on a different thread, use
......
...@@ -42,8 +42,9 @@ base::OnceCallback<T> ToOnceCallback(const base::RepeatingCallback<T>& cb) { ...@@ -42,8 +42,9 @@ base::OnceCallback<T> ToOnceCallback(const base::RepeatingCallback<T>& cb) {
// TODO(xhwang): Consider adding an Initialize() to reduce the amount of work // TODO(xhwang): Consider adding an Initialize() to reduce the amount of work
// done in the constructor. // done in the constructor.
MojoDecryptor::MojoDecryptor(mojom::DecryptorPtr remote_decryptor, MojoDecryptor::MojoDecryptor(
uint32_t writer_capacity) mojo::PendingRemote<mojom::Decryptor> remote_decryptor,
uint32_t writer_capacity)
: remote_decryptor_(std::move(remote_decryptor)) { : remote_decryptor_(std::move(remote_decryptor)) {
DVLOG(1) << __func__; DVLOG(1) << __func__;
...@@ -75,7 +76,7 @@ MojoDecryptor::MojoDecryptor(mojom::DecryptorPtr remote_decryptor, ...@@ -75,7 +76,7 @@ MojoDecryptor::MojoDecryptor(mojom::DecryptorPtr remote_decryptor,
GetDefaultDecoderBufferConverterCapacity(DemuxerStream::VIDEO), GetDefaultDecoderBufferConverterCapacity(DemuxerStream::VIDEO),
&decrypted_producer_handle); &decrypted_producer_handle);
remote_decryptor_.set_connection_error_with_reason_handler( remote_decryptor_.set_disconnect_with_reason_handler(
base::Bind(&MojoDecryptor::OnConnectionError, base::Unretained(this))); base::Bind(&MojoDecryptor::OnConnectionError, base::Unretained(this)));
// Pass the other end of each pipe to |remote_decryptor_|. // Pass the other end of each pipe to |remote_decryptor_|.
......
...@@ -14,6 +14,8 @@ ...@@ -14,6 +14,8 @@
#include "media/base/decryptor.h" #include "media/base/decryptor.h"
#include "media/mojo/mojom/decryptor.mojom.h" #include "media/mojo/mojom/decryptor.mojom.h"
#include "mojo/public/cpp/bindings/binding.h" #include "mojo/public/cpp/bindings/binding.h"
#include "mojo/public/cpp/bindings/pending_remote.h"
#include "mojo/public/cpp/bindings/remote.h"
namespace media { namespace media {
...@@ -28,7 +30,7 @@ class MojoDecryptor : public Decryptor { ...@@ -28,7 +30,7 @@ class MojoDecryptor : public Decryptor {
public: public:
// |writer_capacity| can be used for testing. If 0, default writer capacity // |writer_capacity| can be used for testing. If 0, default writer capacity
// will be used. // will be used.
MojoDecryptor(mojom::DecryptorPtr remote_decryptor, MojoDecryptor(mojo::PendingRemote<mojom::Decryptor> remote_decryptor,
uint32_t writer_capacity = 0); uint32_t writer_capacity = 0);
~MojoDecryptor() final; ~MojoDecryptor() final;
...@@ -89,7 +91,7 @@ class MojoDecryptor : public Decryptor { ...@@ -89,7 +91,7 @@ class MojoDecryptor : public Decryptor {
base::ThreadChecker thread_checker_; base::ThreadChecker thread_checker_;
mojom::DecryptorPtr remote_decryptor_; mojo::Remote<mojom::Decryptor> remote_decryptor_;
// Helper class to send DecoderBuffer to the |remote_decryptor_| for // Helper class to send DecoderBuffer to the |remote_decryptor_| for
// DecryptAndDecodeAudio(), DecryptAndDecodeVideo() and Decrypt(). // DecryptAndDecodeAudio(), DecryptAndDecodeVideo() and Decrypt().
......
...@@ -20,7 +20,7 @@ ...@@ -20,7 +20,7 @@
#include "media/mojo/common/mojo_shared_buffer_video_frame.h" #include "media/mojo/common/mojo_shared_buffer_video_frame.h"
#include "media/mojo/mojom/decryptor.mojom.h" #include "media/mojo/mojom/decryptor.mojom.h"
#include "media/mojo/services/mojo_decryptor_service.h" #include "media/mojo/services/mojo_decryptor_service.h"
#include "mojo/public/cpp/bindings/binding.h" #include "mojo/public/cpp/bindings/receiver.h"
#include "testing/gmock/include/gmock/gmock.h" #include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h" #include "testing/gtest/include/gtest/gtest.h"
...@@ -44,16 +44,15 @@ class MojoDecryptorTest : public ::testing::Test { ...@@ -44,16 +44,15 @@ class MojoDecryptorTest : public ::testing::Test {
void Initialize() { void Initialize() {
decryptor_.reset(new StrictMock<MockDecryptor>()); decryptor_.reset(new StrictMock<MockDecryptor>());
mojom::DecryptorPtr remote_decryptor;
mojo_decryptor_service_.reset( mojo_decryptor_service_.reset(
new MojoDecryptorService(decryptor_.get(), nullptr)); new MojoDecryptorService(decryptor_.get(), nullptr));
binding_ = std::make_unique<mojo::Binding<mojom::Decryptor>>(
mojo_decryptor_service_.get(), MakeRequest(&remote_decryptor));
binding_->set_connection_error_handler(base::BindOnce(
&MojoDecryptorTest::OnConnectionClosed, base::Unretained(this)));
mojo_decryptor_.reset( receiver_ = std::make_unique<mojo::Receiver<mojom::Decryptor>>(
new MojoDecryptor(std::move(remote_decryptor), writer_capacity_)); mojo_decryptor_service_.get());
mojo_decryptor_ = std::make_unique<MojoDecryptor>(
receiver_->BindNewPipeAndPassRemote(), writer_capacity_);
receiver_->set_disconnect_handler(base::BindOnce(
&MojoDecryptorTest::OnConnectionClosed, base::Unretained(this)));
} }
void DestroyClient() { void DestroyClient() {
...@@ -64,7 +63,7 @@ class MojoDecryptorTest : public ::testing::Test { ...@@ -64,7 +63,7 @@ class MojoDecryptorTest : public ::testing::Test {
void DestroyService() { void DestroyService() {
// MojoDecryptor has no way to notify callers that the connection is closed. // MojoDecryptor has no way to notify callers that the connection is closed.
// TODO(jrummell): Determine if notification is needed. // TODO(jrummell): Determine if notification is needed.
binding_.reset(); receiver_.reset();
mojo_decryptor_service_.reset(); mojo_decryptor_service_.reset();
} }
...@@ -122,7 +121,7 @@ class MojoDecryptorTest : public ::testing::Test { ...@@ -122,7 +121,7 @@ class MojoDecryptorTest : public ::testing::Test {
// The matching MojoDecryptorService for |mojo_decryptor_|. // The matching MojoDecryptorService for |mojo_decryptor_|.
std::unique_ptr<MojoDecryptorService> mojo_decryptor_service_; std::unique_ptr<MojoDecryptorService> mojo_decryptor_service_;
std::unique_ptr<mojo::Binding<mojom::Decryptor>> binding_; std::unique_ptr<mojo::Receiver<mojom::Decryptor>> receiver_;
// The actual Decryptor object used by |mojo_decryptor_service_|. // The actual Decryptor object used by |mojo_decryptor_service_|.
std::unique_ptr<StrictMock<MockDecryptor>> decryptor_; std::unique_ptr<StrictMock<MockDecryptor>> decryptor_;
......
...@@ -233,10 +233,10 @@ class MediaServiceTest : public testing::Test { ...@@ -233,10 +233,10 @@ class MediaServiceTest : public testing::Test {
void CreateDecryptor(int cdm_id, bool expected_result) { void CreateDecryptor(int cdm_id, bool expected_result) {
base::RunLoop run_loop; base::RunLoop run_loop;
mojom::DecryptorPtr decryptor_ptr; mojo::PendingRemote<mojom::Decryptor> decryptor_remote;
interface_factory_->CreateDecryptor(cdm_id, interface_factory_->CreateDecryptor(
mojo::MakeRequest(&decryptor_ptr)); cdm_id, decryptor_remote.InitWithNewPipeAndPassReceiver());
MojoDecryptor mojo_decryptor(std::move(decryptor_ptr)); MojoDecryptor mojo_decryptor(std::move(decryptor_remote));
// In the success case, there's no decryption key to decrypt the buffer so // In the success case, there's no decryption key to decrypt the buffer so
// we would expect no-key. // we would expect no-key.
......
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
#include "base/bind.h" #include "base/bind.h"
#include "base/logging.h" #include "base/logging.h"
#include "mojo/public/cpp/bindings/pending_remote.h"
#include "net/base/network_change_notifier.h" #include "net/base/network_change_notifier.h"
#include "net/base/network_change_notifier_posix.h" #include "net/base/network_change_notifier_posix.h"
...@@ -32,17 +33,20 @@ void NetworkChangeManager::AddReceiver( ...@@ -32,17 +33,20 @@ void NetworkChangeManager::AddReceiver(
} }
void NetworkChangeManager::RequestNotifications( void NetworkChangeManager::RequestNotifications(
mojom::NetworkChangeManagerClientPtr client_ptr) { mojo::PendingRemote<mojom::NetworkChangeManagerClient>
client_ptr.set_connection_error_handler( client_pending_remote) {
base::Bind(&NetworkChangeManager::NotificationPipeBroken, mojo::Remote<mojom::NetworkChangeManagerClient> client_remote(
// base::Unretained is safe as destruction of the std::move(client_pending_remote));
// NetworkChangeManager will also destroy the client_remote.set_disconnect_handler(base::Bind(
// |clients_| list (which this object will be &NetworkChangeManager::NotificationPipeBroken,
// inserted into, below), which will destroy the // base::Unretained is safe as destruction of the
// client_ptr, rendering this callback moot. // NetworkChangeManager will also destroy the
base::Unretained(this), base::Unretained(client_ptr.get()))); // |clients_| list (which this object will be
client_ptr->OnInitialConnectionType(connection_type_); // inserted into, below), which will destroy the
clients_.push_back(std::move(client_ptr)); // client_remote, rendering this callback moot.
base::Unretained(this), base::Unretained(client_remote.get())));
client_remote->OnInitialConnectionType(connection_type_);
clients_.push_back(std::move(client_remote));
} }
#if defined(OS_CHROMEOS) || defined(OS_ANDROID) #if defined(OS_CHROMEOS) || defined(OS_ANDROID)
...@@ -82,11 +86,11 @@ size_t NetworkChangeManager::GetNumClientsForTesting() const { ...@@ -82,11 +86,11 @@ size_t NetworkChangeManager::GetNumClientsForTesting() const {
void NetworkChangeManager::NotificationPipeBroken( void NetworkChangeManager::NotificationPipeBroken(
mojom::NetworkChangeManagerClient* client) { mojom::NetworkChangeManagerClient* client) {
clients_.erase( clients_.erase(std::find_if(
std::find_if(clients_.begin(), clients_.end(), clients_.begin(), clients_.end(),
[client](mojom::NetworkChangeManagerClientPtr& ptr) { [client](mojo::Remote<mojom::NetworkChangeManagerClient>& remote) {
return ptr.get() == client; return remote.get() == client;
})); }));
} }
void NetworkChangeManager::OnNetworkChanged( void NetworkChangeManager::OnNetworkChanged(
......
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
#include "base/macros.h" #include "base/macros.h"
#include "build/build_config.h" #include "build/build_config.h"
#include "mojo/public/cpp/bindings/receiver_set.h" #include "mojo/public/cpp/bindings/receiver_set.h"
#include "mojo/public/cpp/bindings/remote.h"
#include "net/base/network_change_notifier.h" #include "net/base/network_change_notifier.h"
#include "services/network/public/mojom/network_change_manager.mojom.h" #include "services/network/public/mojom/network_change_manager.mojom.h"
...@@ -39,7 +40,8 @@ class COMPONENT_EXPORT(NETWORK_SERVICE) NetworkChangeManager ...@@ -39,7 +40,8 @@ class COMPONENT_EXPORT(NETWORK_SERVICE) NetworkChangeManager
// mojom::NetworkChangeManager implementation: // mojom::NetworkChangeManager implementation:
void RequestNotifications( void RequestNotifications(
mojom::NetworkChangeManagerClientPtr client_ptr) override; mojo::PendingRemote<mojom::NetworkChangeManagerClient> client_remote)
override;
#if defined(OS_CHROMEOS) || defined(OS_ANDROID) #if defined(OS_CHROMEOS) || defined(OS_ANDROID)
void OnNetworkChanged( void OnNetworkChanged(
...@@ -63,7 +65,7 @@ class COMPONENT_EXPORT(NETWORK_SERVICE) NetworkChangeManager ...@@ -63,7 +65,7 @@ class COMPONENT_EXPORT(NETWORK_SERVICE) NetworkChangeManager
std::unique_ptr<net::NetworkChangeNotifier> network_change_notifier_; std::unique_ptr<net::NetworkChangeNotifier> network_change_notifier_;
mojo::ReceiverSet<mojom::NetworkChangeManager> receivers_; mojo::ReceiverSet<mojom::NetworkChangeManager> receivers_;
std::vector<mojom::NetworkChangeManagerClientPtr> clients_; std::vector<mojo::Remote<mojom::NetworkChangeManagerClient>> clients_;
mojom::ConnectionType connection_type_; mojom::ConnectionType connection_type_;
DISALLOW_COPY_AND_ASSIGN(NetworkChangeManager); DISALLOW_COPY_AND_ASSIGN(NetworkChangeManager);
......
...@@ -38,16 +38,13 @@ class TestNetworkChangeManagerClient ...@@ -38,16 +38,13 @@ class TestNetworkChangeManagerClient
: num_network_changed_(0), : num_network_changed_(0),
run_loop_(std::make_unique<base::RunLoop>()), run_loop_(std::make_unique<base::RunLoop>()),
notification_type_to_wait_(NONE), notification_type_to_wait_(NONE),
connection_type_(mojom::ConnectionType::CONNECTION_UNKNOWN), connection_type_(mojom::ConnectionType::CONNECTION_UNKNOWN) {
binding_(this) {
mojo::Remote<mojom::NetworkChangeManager> manager; mojo::Remote<mojom::NetworkChangeManager> manager;
network_change_manager->AddReceiver(manager.BindNewPipeAndPassReceiver()); network_change_manager->AddReceiver(manager.BindNewPipeAndPassReceiver());
mojom::NetworkChangeManagerClientPtr client_ptr; mojo::PendingRemote<mojom::NetworkChangeManagerClient> client_remote;
mojom::NetworkChangeManagerClientRequest client_request( receiver_.Bind(client_remote.InitWithNewPipeAndPassReceiver());
mojo::MakeRequest(&client_ptr)); manager->RequestNotifications(std::move(client_remote));
binding_.Bind(std::move(client_request));
manager->RequestNotifications(std::move(client_ptr));
} }
~TestNetworkChangeManagerClient() override {} ~TestNetworkChangeManagerClient() override {}
...@@ -82,7 +79,7 @@ class TestNetworkChangeManagerClient ...@@ -82,7 +79,7 @@ class TestNetworkChangeManagerClient
std::unique_ptr<base::RunLoop> run_loop_; std::unique_ptr<base::RunLoop> run_loop_;
NotificationType notification_type_to_wait_; NotificationType notification_type_to_wait_;
mojom::ConnectionType connection_type_; mojom::ConnectionType connection_type_;
mojo::Binding<mojom::NetworkChangeManagerClient> binding_; mojo::Receiver<mojom::NetworkChangeManagerClient> receiver_{this};
DISALLOW_COPY_AND_ASSIGN(TestNetworkChangeManagerClient); DISALLOW_COPY_AND_ASSIGN(TestNetworkChangeManagerClient);
}; };
......
...@@ -1318,17 +1318,14 @@ class TestNetworkChangeManagerClient ...@@ -1318,17 +1318,14 @@ class TestNetworkChangeManagerClient
public: public:
explicit TestNetworkChangeManagerClient( explicit TestNetworkChangeManagerClient(
mojom::NetworkService* network_service) mojom::NetworkService* network_service)
: connection_type_(mojom::ConnectionType::CONNECTION_UNKNOWN), : connection_type_(mojom::ConnectionType::CONNECTION_UNKNOWN) {
binding_(this) {
mojo::Remote<mojom::NetworkChangeManager> manager_remote; mojo::Remote<mojom::NetworkChangeManager> manager_remote;
network_service->GetNetworkChangeManager( network_service->GetNetworkChangeManager(
manager_remote.BindNewPipeAndPassReceiver()); manager_remote.BindNewPipeAndPassReceiver());
mojom::NetworkChangeManagerClientPtr client_ptr; mojo::PendingRemote<mojom::NetworkChangeManagerClient> client_remote;
mojom::NetworkChangeManagerClientRequest client_request( receiver_.Bind(client_remote.InitWithNewPipeAndPassReceiver());
mojo::MakeRequest(&client_ptr)); manager_remote->RequestNotifications(std::move(client_remote));
binding_.Bind(std::move(client_request));
manager_remote->RequestNotifications(std::move(client_ptr));
} }
~TestNetworkChangeManagerClient() override {} ~TestNetworkChangeManagerClient() override {}
...@@ -1350,12 +1347,12 @@ class TestNetworkChangeManagerClient ...@@ -1350,12 +1347,12 @@ class TestNetworkChangeManagerClient
run_loop_.Run(); run_loop_.Run();
} }
void Flush() { binding_.FlushForTesting(); } void Flush() { receiver_.FlushForTesting(); }
private: private:
base::RunLoop run_loop_; base::RunLoop run_loop_;
mojom::ConnectionType connection_type_; mojom::ConnectionType connection_type_;
mojo::Binding<mojom::NetworkChangeManagerClient> binding_; mojo::Receiver<mojom::NetworkChangeManagerClient> receiver_{this};
DISALLOW_COPY_AND_ASSIGN(TestNetworkChangeManagerClient); DISALLOW_COPY_AND_ASSIGN(TestNetworkChangeManagerClient);
}; };
......
...@@ -9,6 +9,8 @@ ...@@ -9,6 +9,8 @@
#include "base/bind.h" #include "base/bind.h"
#include "base/task_runner.h" #include "base/task_runner.h"
#include "base/threading/thread_task_runner_handle.h" #include "base/threading/thread_task_runner_handle.h"
#include "mojo/public/cpp/bindings/pending_remote.h"
#include "mojo/public/cpp/bindings/remote.h"
#include "services/network/public/mojom/network_change_manager.mojom.h" #include "services/network/public/mojom/network_change_manager.mojom.h"
#include "services/network/public/mojom/network_service.mojom.h" #include "services/network/public/mojom/network_service.mojom.h"
...@@ -45,10 +47,9 @@ NetworkConnectionTracker::NetworkConnectionTracker(BindingCallback callback) ...@@ -45,10 +47,9 @@ NetworkConnectionTracker::NetworkConnectionTracker(BindingCallback callback)
base::ObserverListPolicy::EXISTING_ONLY)), base::ObserverListPolicy::EXISTING_ONLY)),
leaky_network_change_observer_list_( leaky_network_change_observer_list_(
new base::ObserverListThreadSafe<NetworkConnectionObserver>( new base::ObserverListThreadSafe<NetworkConnectionObserver>(
base::ObserverListPolicy::EXISTING_ONLY)), base::ObserverListPolicy::EXISTING_ONLY)) {
binding_(this) {
Initialize(); Initialize();
DCHECK(binding_.is_bound()); DCHECK(receiver_.is_bound());
} }
NetworkConnectionTracker::~NetworkConnectionTracker() { NetworkConnectionTracker::~NetworkConnectionTracker() {
...@@ -138,8 +139,7 @@ NetworkConnectionTracker::NetworkConnectionTracker() ...@@ -138,8 +139,7 @@ NetworkConnectionTracker::NetworkConnectionTracker()
base::ObserverListPolicy::EXISTING_ONLY)), base::ObserverListPolicy::EXISTING_ONLY)),
leaky_network_change_observer_list_( leaky_network_change_observer_list_(
new base::ObserverListThreadSafe<NetworkConnectionObserver>( new base::ObserverListThreadSafe<NetworkConnectionObserver>(
base::ObserverListPolicy::EXISTING_ONLY)), base::ObserverListPolicy::EXISTING_ONLY)) {}
binding_(this) {}
void NetworkConnectionTracker::OnInitialConnectionType( void NetworkConnectionTracker::OnInitialConnectionType(
network::mojom::ConnectionType type) { network::mojom::ConnectionType type) {
...@@ -164,30 +164,26 @@ void NetworkConnectionTracker::OnNetworkChanged( ...@@ -164,30 +164,26 @@ void NetworkConnectionTracker::OnNetworkChanged(
void NetworkConnectionTracker::Initialize() { void NetworkConnectionTracker::Initialize() {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
DCHECK(!binding_.is_bound()); DCHECK(!receiver_.is_bound());
// Get NetworkChangeManagerPtr. // Get mojo::Remote<NetworkChangeManager>.
network::mojom::NetworkChangeManagerPtr manager_ptr; mojo::Remote<network::mojom::NetworkChangeManager> manager_remote;
network::mojom::NetworkChangeManagerRequest request( bind_request_callback_.Run(manager_remote.BindNewPipeAndPassReceiver());
mojo::MakeRequest(&manager_ptr));
bind_request_callback_.Run(std::move(request)); // Request notification from mojo::Remote<NetworkChangeManager>.
mojo::PendingRemote<network::mojom::NetworkChangeManagerClient> client_remote;
// Request notification from NetworkChangeManagerPtr. receiver_.Bind(client_remote.InitWithNewPipeAndPassReceiver());
network::mojom::NetworkChangeManagerClientPtr client_ptr; manager_remote->RequestNotifications(std::move(client_remote));
network::mojom::NetworkChangeManagerClientRequest client_request(
mojo::MakeRequest(&client_ptr)); // base::Unretained is safe as |receiver_| is owned by |this|.
binding_.Bind(std::move(client_request)); receiver_.set_disconnect_handler(base::BindRepeating(
manager_ptr->RequestNotifications(std::move(client_ptr));
// base::Unretained is safe as |binding_| is owned by |this|.
binding_.set_connection_error_handler(base::BindRepeating(
&NetworkConnectionTracker::HandleNetworkServicePipeBroken, &NetworkConnectionTracker::HandleNetworkServicePipeBroken,
base::Unretained(this))); base::Unretained(this)));
} }
void NetworkConnectionTracker::HandleNetworkServicePipeBroken() { void NetworkConnectionTracker::HandleNetworkServicePipeBroken() {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
binding_.Close(); receiver_.reset();
// Reset |connection_type_| to invalid, so future GetConnectionType() can be // Reset |connection_type_| to invalid, so future GetConnectionType() can be
// delayed after network service has restarted, and that there isn't an // delayed after network service has restarted, and that there isn't an
// incorrectly cached state. // incorrectly cached state.
......
...@@ -16,7 +16,7 @@ ...@@ -16,7 +16,7 @@
#include "base/observer_list_threadsafe.h" #include "base/observer_list_threadsafe.h"
#include "base/sequence_checker.h" #include "base/sequence_checker.h"
#include "base/synchronization/lock.h" #include "base/synchronization/lock.h"
#include "mojo/public/cpp/bindings/binding.h" #include "mojo/public/cpp/bindings/receiver.h"
#include "services/network/public/mojom/network_change_manager.mojom.h" #include "services/network/public/mojom/network_change_manager.mojom.h"
namespace network { namespace network {
...@@ -148,7 +148,7 @@ class COMPONENT_EXPORT(NETWORK_CPP) NetworkConnectionTracker ...@@ -148,7 +148,7 @@ class COMPONENT_EXPORT(NETWORK_CPP) NetworkConnectionTracker
const scoped_refptr<base::ObserverListThreadSafe<NetworkConnectionObserver>> const scoped_refptr<base::ObserverListThreadSafe<NetworkConnectionObserver>>
leaky_network_change_observer_list_; leaky_network_change_observer_list_;
mojo::Binding<network::mojom::NetworkChangeManagerClient> binding_; mojo::Receiver<network::mojom::NetworkChangeManagerClient> receiver_{this};
// Only the initialization and re-initialization of |this| are required to // Only the initialization and re-initialization of |this| are required to
// be bound to the same sequence. // be bound to the same sequence.
......
...@@ -84,7 +84,8 @@ interface NetworkChangeManagerClient { ...@@ -84,7 +84,8 @@ interface NetworkChangeManagerClient {
// An interface for facilitating notifications of network change events. // An interface for facilitating notifications of network change events.
interface NetworkChangeManager { interface NetworkChangeManager {
// Requests to receive notification when there is a network change. // Requests to receive notification when there is a network change.
RequestNotifications(NetworkChangeManagerClient client_ptr); RequestNotifications(
pending_remote<NetworkChangeManagerClient> client_remote);
// Notifies the network service that the network configuration has changed. // Notifies the network service that the network configuration has changed.
// This is needed for ChromeOS because only one process can listen for network // This is needed for ChromeOS because only one process can listen for network
......
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