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.
5 #include "chrome/browser/chromeos/net/network_portal_detector_strategy.h"
7 #include "base/logging.h"
8 #include "chromeos/network/network_handler.h"
9 #include "chromeos/network/network_state.h"
10 #include "chromeos/network/network_state_handler.h"
16 const NetworkState* DefaultNetwork() {
17 return NetworkHandler::Get()->network_state_handler()->DefaultNetwork();
20 // TODO (ygorshenin@): reuse net::BackoffEntry for strategies.
22 class LoginScreenStrategy : public PortalDetectorStrategy {
24 static const int kMaxAttempts = 3;
25 static const int kDelayBetweenAttemptsSec = 3;
26 static const int kBaseAttemptTimeoutSec = 5;
28 LoginScreenStrategy() {}
29 virtual ~LoginScreenStrategy() {}
32 // PortalDetectorStrategy overrides:
33 virtual StrategyId Id() const OVERRIDE { return STRATEGY_ID_LOGIN_SCREEN; }
34 virtual bool CanPerformAttemptImpl() OVERRIDE {
35 return delegate_->AttemptCount() < kMaxAttempts;
37 virtual base::TimeDelta GetDelayTillNextAttemptImpl() OVERRIDE {
38 return AdjustDelay(base::TimeDelta::FromSeconds(kDelayBetweenAttemptsSec));
40 virtual base::TimeDelta GetNextAttemptTimeoutImpl() OVERRIDE {
41 int timeout = DefaultNetwork()
42 ? (delegate_->AttemptCount() + 1) * kBaseAttemptTimeoutSec
43 : kBaseAttemptTimeoutSec;
44 return base::TimeDelta::FromSeconds(timeout);
48 DISALLOW_COPY_AND_ASSIGN(LoginScreenStrategy);
51 class ErrorScreenStrategy : public PortalDetectorStrategy {
53 static const int kDelayBetweenAttemptsSec = 3;
54 static const int kAttemptTimeoutSec = 15;
56 ErrorScreenStrategy() {}
57 virtual ~ErrorScreenStrategy() {}
60 // PortalDetectorStrategy overrides:
61 virtual StrategyId Id() const OVERRIDE { return STRATEGY_ID_ERROR_SCREEN; }
62 virtual bool CanPerformAttemptImpl() OVERRIDE { return true; }
63 virtual bool CanPerformAttemptAfterDetectionImpl() OVERRIDE { return true; }
64 virtual base::TimeDelta GetDelayTillNextAttemptImpl() OVERRIDE {
65 return AdjustDelay(base::TimeDelta::FromSeconds(kDelayBetweenAttemptsSec));
67 virtual base::TimeDelta GetNextAttemptTimeoutImpl() OVERRIDE {
68 return base::TimeDelta::FromSeconds(kAttemptTimeoutSec);
72 DISALLOW_COPY_AND_ASSIGN(ErrorScreenStrategy);
75 class SessionStrategy : public PortalDetectorStrategy {
77 static const int kFastDelayBetweenAttemptsSec = 1;
78 static const int kMaxFastAttempts = 3;
79 static const int kFastAttemptTimeoutSec = 3;
81 static const int kSlowDelayBetweenAttemptsSec = 10;
82 static const int kSlowAttemptTimeoutSec = 5;
85 virtual ~SessionStrategy() {}
88 virtual StrategyId Id() const OVERRIDE { return STRATEGY_ID_SESSION; }
89 virtual bool CanPerformAttemptImpl() OVERRIDE { return true; }
90 virtual bool CanPerformAttemptAfterDetectionImpl() OVERRIDE { return true; }
91 virtual base::TimeDelta GetDelayTillNextAttemptImpl() OVERRIDE {
93 if (delegate_->AttemptCount() < kMaxFastAttempts)
94 delay = kFastDelayBetweenAttemptsSec;
96 delay = kSlowDelayBetweenAttemptsSec;
97 return AdjustDelay(base::TimeDelta::FromSeconds(delay));
99 virtual base::TimeDelta GetNextAttemptTimeoutImpl() OVERRIDE {
101 if (delegate_->AttemptCount() < kMaxFastAttempts)
102 timeout = kFastAttemptTimeoutSec;
104 timeout = kSlowAttemptTimeoutSec;
105 return base::TimeDelta::FromSeconds(timeout);
109 DISALLOW_COPY_AND_ASSIGN(SessionStrategy);
114 // PortalDetectorStrategy -----------------------------------------------------
117 base::TimeDelta PortalDetectorStrategy::delay_till_next_attempt_for_testing_;
120 bool PortalDetectorStrategy::delay_till_next_attempt_for_testing_initialized_ =
124 base::TimeDelta PortalDetectorStrategy::next_attempt_timeout_for_testing_;
127 bool PortalDetectorStrategy::next_attempt_timeout_for_testing_initialized_ =
130 PortalDetectorStrategy::PortalDetectorStrategy() : delegate_(NULL) {}
132 PortalDetectorStrategy::~PortalDetectorStrategy() {}
135 scoped_ptr<PortalDetectorStrategy> PortalDetectorStrategy::CreateById(
138 case STRATEGY_ID_LOGIN_SCREEN:
139 return scoped_ptr<PortalDetectorStrategy>(new LoginScreenStrategy());
140 case STRATEGY_ID_ERROR_SCREEN:
141 return scoped_ptr<PortalDetectorStrategy>(new ErrorScreenStrategy());
142 case STRATEGY_ID_SESSION:
143 return scoped_ptr<PortalDetectorStrategy>(new SessionStrategy());
146 return scoped_ptr<PortalDetectorStrategy>(
147 static_cast<PortalDetectorStrategy*>(NULL));
151 bool PortalDetectorStrategy::CanPerformAttempt() {
152 return CanPerformAttemptImpl();
155 bool PortalDetectorStrategy::CanPerformAttemptAfterDetection() {
156 return CanPerformAttemptAfterDetectionImpl();
159 base::TimeDelta PortalDetectorStrategy::GetDelayTillNextAttempt() {
160 if (delay_till_next_attempt_for_testing_initialized_)
161 return delay_till_next_attempt_for_testing_;
162 return GetDelayTillNextAttemptImpl();
165 base::TimeDelta PortalDetectorStrategy::GetNextAttemptTimeout() {
166 if (next_attempt_timeout_for_testing_initialized_)
167 return next_attempt_timeout_for_testing_;
168 return GetNextAttemptTimeoutImpl();
171 bool PortalDetectorStrategy::CanPerformAttemptImpl() { return false; }
173 bool PortalDetectorStrategy::CanPerformAttemptAfterDetectionImpl() {
177 base::TimeDelta PortalDetectorStrategy::GetDelayTillNextAttemptImpl() {
178 return base::TimeDelta();
181 base::TimeDelta PortalDetectorStrategy::GetNextAttemptTimeoutImpl() {
182 return base::TimeDelta();
185 base::TimeDelta PortalDetectorStrategy::AdjustDelay(
186 const base::TimeDelta& delay) {
187 if (!delegate_->AttemptCount())
188 return base::TimeDelta();
190 base::TimeTicks now = delegate_->GetCurrentTimeTicks();
191 base::TimeDelta elapsed;
192 if (now > delegate_->AttemptStartTime())
193 elapsed = now - delegate_->AttemptStartTime();
195 return delay - elapsed;
196 return base::TimeDelta();
199 } // namespace chromeos