1 // Copyright 2014 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "chrome/browser/chromeos/net/delay_network_call.h" 6 7 #include <utility> 8 9 #include "base/bind.h" 10 #include "base/callback.h" 11 #include "chromeos/network/network_handler.h" 12 #include "chromeos/network/network_state.h" 13 #include "chromeos/network/network_state_handler.h" 14 #include "chromeos/network/portal_detector/network_portal_detector.h" 15 #include "content/public/browser/browser_task_traits.h" 16 #include "content/public/browser/browser_thread.h" 17 #include "third_party/cros_system_api/dbus/service_constants.h" 18 19 const unsigned chromeos::kDefaultNetworkRetryDelayMS = 3000; 20 DelayNetworkCall(base::TimeDelta retry,base::OnceClosure callback)21void chromeos::DelayNetworkCall(base::TimeDelta retry, 22 base::OnceClosure callback) { 23 bool delay_network_call = false; 24 const NetworkState* default_network = 25 NetworkHandler::Get()->network_state_handler()->DefaultNetwork(); 26 if (!default_network) { 27 delay_network_call = true; 28 DVLOG(1) << "DelayNetworkCall: No default network."; 29 } else { 30 std:: string default_connection_state = default_network->connection_state(); 31 if (!NetworkState::StateIsConnected(default_connection_state)) { 32 delay_network_call = true; 33 DVLOG(1) << "DelayNetworkCall: " 34 << "Default network: " << default_network->name() 35 << " State: " << default_connection_state; 36 } 37 } 38 if (!delay_network_call && network_portal_detector::IsInitialized()) { 39 NetworkPortalDetector::CaptivePortalStatus status = 40 network_portal_detector::GetInstance()->GetCaptivePortalStatus(); 41 if (status != NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE) { 42 delay_network_call = true; 43 DVLOG(1) << "DelayNetworkCall: Captive portal status for " 44 << default_network->name() << ": " 45 << NetworkPortalDetector::CaptivePortalStatusString(status); 46 } 47 } 48 if (delay_network_call) { 49 content::GetUIThreadTaskRunner({})->PostDelayedTask( 50 FROM_HERE, 51 base::BindOnce(&chromeos::DelayNetworkCall, retry, std::move(callback)), 52 retry); 53 } else { 54 std::move(callback).Run(); 55 } 56 } 57