| // Copyright 2014 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 "chrome/browser/chromeos/net/delay_network_call.h" |
| |
| #include "base/bind.h" |
| #include "base/callback.h" |
| #include "chrome/browser/chromeos/net/network_portal_detector.h" |
| #include "chromeos/network/network_handler.h" |
| #include "chromeos/network/network_state.h" |
| #include "chromeos/network/network_state_handler.h" |
| #include "content/public/browser/browser_thread.h" |
| #include "third_party/cros_system_api/dbus/service_constants.h" |
| |
| const unsigned chromeos::kDefaultNetworkRetryDelayMS = 3000; |
| |
| void chromeos::DelayNetworkCall(const base::Closure& callback, |
| base::TimeDelta retry) { |
| bool delay_network_call = false; |
| const NetworkState* default_network = |
| NetworkHandler::Get()->network_state_handler()->DefaultNetwork(); |
| if (!default_network) { |
| delay_network_call = true; |
| DVLOG(1) << "DelayNetworkCall: No default network."; |
| } else { |
| std:: string default_connection_state = default_network->connection_state(); |
| if (!NetworkState::StateIsConnected(default_connection_state)) { |
| delay_network_call = true; |
| DVLOG(1) << "DelayNetworkCall: " |
| << "Default network: " << default_network->name() |
| << " State: " << default_connection_state; |
| } |
| } |
| if (!delay_network_call && NetworkPortalDetector::IsInitialized()) { |
| NetworkPortalDetector* detector = NetworkPortalDetector::Get(); |
| NetworkPortalDetector::CaptivePortalStatus status = |
| detector->GetCaptivePortalState(default_network->path()).status; |
| if (status != NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE) { |
| delay_network_call = true; |
| DVLOG(1) << "DelayNetworkCall: Captive portal status for " |
| << default_network->name() << ": " |
| << NetworkPortalDetector::CaptivePortalStatusString(status); |
| } |
| } |
| if (delay_network_call) { |
| content::BrowserThread::PostDelayedTask( |
| content::BrowserThread::UI, |
| FROM_HERE, |
| base::Bind(&chromeos::DelayNetworkCall, callback, retry), |
| retry); |
| } else { |
| callback.Run(); |
| } |
| } |