| // Copyright 2014 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "chrome/browser/ash/net/delay_network_call.h" |
| |
| #include <utility> |
| |
| #include "base/functional/bind.h" |
| #include "base/functional/callback.h" |
| #include "base/logging.h" |
| #include "base/time/time.h" |
| #include "chromeos/ash/components/network/network_handler.h" |
| #include "chromeos/ash/components/network/network_state.h" |
| #include "chromeos/ash/components/network/network_state_handler.h" |
| #include "content/public/browser/browser_task_traits.h" |
| #include "content/public/browser/browser_thread.h" |
| |
| namespace ash { |
| |
| namespace { |
| |
| constexpr base::TimeDelta kDefaultRetryDelay = base::Seconds(3); |
| |
| bool delay_network_calls_for_testing = false; |
| |
| bool IsOnline(const NetworkState* default_network) { |
| if (default_network->IsOnline()) { |
| return true; |
| } |
| DVLOG(1) << "DelayNetworkCall: Not online. Connection state for " |
| << default_network->name() << " = " |
| << default_network->connection_state(); |
| return false; |
| } |
| |
| } // namespace |
| |
| bool AreNetworkCallsDelayed() { |
| if (delay_network_calls_for_testing) { |
| return true; |
| } |
| |
| const NetworkState* default_network = |
| NetworkHandler::Get()->network_state_handler()->DefaultNetwork(); |
| if (!default_network) { |
| DVLOG(1) << "DelayNetworkCall: No default network."; |
| return true; |
| } |
| |
| if (const std::string default_connection_state = |
| default_network->connection_state(); |
| !NetworkState::StateIsConnected(default_connection_state)) { |
| DVLOG(1) << "DelayNetworkCall: " << "Default network: " |
| << default_network->name() |
| << " State: " << default_connection_state; |
| return true; |
| } |
| |
| if (!IsOnline(default_network)) { |
| return true; |
| } |
| |
| return false; |
| } |
| |
| void DelayNetworkCall(base::OnceClosure callback) { |
| DelayNetworkCallWithCustomDelay(std::move(callback), kDefaultRetryDelay); |
| } |
| |
| void DelayNetworkCallWithCustomDelay(base::OnceClosure callback, |
| base::TimeDelta retry_delay) { |
| if (AreNetworkCallsDelayed()) { |
| content::GetUIThreadTaskRunner({})->PostDelayedTask( |
| FROM_HERE, |
| base::BindOnce(&DelayNetworkCallWithCustomDelay, std::move(callback), |
| retry_delay), |
| retry_delay); |
| return; |
| } |
| content::GetUIThreadTaskRunner({})->PostTask( |
| FROM_HERE, base::BindOnce(std::move(callback))); |
| } |
| |
| void SetDelayNetworkCallsForTesting(bool delay_network_calls) { |
| delay_network_calls_for_testing = delay_network_calls; |
| } |
| |
| } // namespace ash |