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)21 void 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