blob: f4835a6f970ee31352b10eac5711af3efa150135 [file] [log] [blame]
// Copyright 2017 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 "content/network/network_change_manager.h"
#include <algorithm>
#include <utility>
#include "base/logging.h"
#include "net/base/network_change_notifier.h"
namespace content {
NetworkChangeManager::NetworkChangeManager(
std::unique_ptr<net::NetworkChangeNotifier> network_change_notifier)
: network_change_notifier_(std::move(network_change_notifier)) {
net::NetworkChangeNotifier::AddNetworkChangeObserver(this);
connection_type_ = network::mojom::ConnectionType(
net::NetworkChangeNotifier::GetConnectionType());
}
NetworkChangeManager::~NetworkChangeManager() {
net::NetworkChangeNotifier::RemoveNetworkChangeObserver(this);
}
void NetworkChangeManager::AddRequest(
network::mojom::NetworkChangeManagerRequest request) {
bindings_.AddBinding(this, std::move(request));
}
void NetworkChangeManager::RequestNotifications(
network::mojom::NetworkChangeManagerClientPtr client_ptr) {
client_ptr.set_connection_error_handler(
base::Bind(&NetworkChangeManager::NotificationPipeBroken,
// base::Unretained is safe as destruction of the
// NetworkChangeManager will also destroy the
// |clients_| list (which this object will be
// inserted into, below), which will destroy the
// client_ptr, rendering this callback moot.
base::Unretained(this), base::Unretained(client_ptr.get())));
client_ptr->OnInitialConnectionType(connection_type_);
clients_.push_back(std::move(client_ptr));
}
size_t NetworkChangeManager::GetNumClientsForTesting() const {
return clients_.size();
}
void NetworkChangeManager::NotificationPipeBroken(
network::mojom::NetworkChangeManagerClient* client) {
clients_.erase(std::find_if(
clients_.begin(), clients_.end(),
[client](network::mojom::NetworkChangeManagerClientPtr& ptr) {
return ptr.get() == client;
}));
}
void NetworkChangeManager::OnNetworkChanged(
net::NetworkChangeNotifier::ConnectionType type) {
connection_type_ = network::mojom::ConnectionType(type);
for (const auto& client : clients_) {
client->OnNetworkChanged(connection_type_);
}
}
} // namespace content