| // 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 "chromeos/network/network_handler.h" |
| #include "chromeos/network/network_state.h" |
| #include "chromeos/network/network_state_handler.h" |
| #include "chromeos/network/portal_detector/network_portal_detector.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(base::TimeDelta retry, |
| const base::Closure& callback) { |
| 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 && network_portal_detector::IsInitialized()) { |
| NetworkPortalDetector::CaptivePortalStatus status = |
| network_portal_detector::GetInstance() |
| ->GetCaptivePortalState(default_network->guid()) |
| .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, retry, callback), retry); |
| } else { |
| callback.Run(); |
| } |
| } |