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 kFastAttemptTimeoutSec = 3;
79 static const int kMaxFastAttempts = 3;
81 static const int kNormalDelayBetweenAttemptsSec = 10;
82 static const int kNormalAttemptTimeoutSec = 5;
83 static const int kMaxNormalAttempts = 3;
85 static const int kSlowDelayBetweenAttemptsSec = 2 * 60;
86 static const int kSlowAttemptTimeoutSec = 5;
89 virtual ~SessionStrategy() {}
92 virtual StrategyId Id() const OVERRIDE { return STRATEGY_ID_SESSION; }
93 virtual bool CanPerformAttemptImpl() OVERRIDE { return true; }
94 virtual bool CanPerformAttemptAfterDetectionImpl() OVERRIDE { return true; }
95 virtual base::TimeDelta GetDelayTillNextAttemptImpl() OVERRIDE {
98 delay = kFastDelayBetweenAttemptsSec;
99 else if (IsNormalAttempt())
100 delay = kNormalDelayBetweenAttemptsSec;
102 delay = kSlowDelayBetweenAttemptsSec;
103 return AdjustDelay(base::TimeDelta::FromSeconds(delay));
105 virtual base::TimeDelta GetNextAttemptTimeoutImpl() OVERRIDE {
108 timeout = kFastAttemptTimeoutSec;
109 else if (IsNormalAttempt())
110 timeout = kNormalAttemptTimeoutSec;
112 timeout = kSlowAttemptTimeoutSec;
113 return base::TimeDelta::FromSeconds(timeout);
117 bool IsFastAttempt() {
118 return delegate_->AttemptCount() < kMaxFastAttempts;
121 bool IsNormalAttempt() {
122 return delegate_->AttemptCount() < kMaxFastAttempts + kMaxNormalAttempts;
125 DISALLOW_COPY_AND_ASSIGN(SessionStrategy);
130 // PortalDetectorStrategy -----------------------------------------------------
133 base::TimeDelta PortalDetectorStrategy::delay_till_next_attempt_for_testing_;
136 bool PortalDetectorStrategy::delay_till_next_attempt_for_testing_initialized_ =
140 base::TimeDelta PortalDetectorStrategy::next_attempt_timeout_for_testing_;
143 bool PortalDetectorStrategy::next_attempt_timeout_for_testing_initialized_ =
146 PortalDetectorStrategy::PortalDetectorStrategy() : delegate_(NULL) {}
148 PortalDetectorStrategy::~PortalDetectorStrategy() {}
151 scoped_ptr<PortalDetectorStrategy> PortalDetectorStrategy::CreateById(
154 case STRATEGY_ID_LOGIN_SCREEN:
155 return scoped_ptr<PortalDetectorStrategy>(new LoginScreenStrategy());
156 case STRATEGY_ID_ERROR_SCREEN:
157 return scoped_ptr<PortalDetectorStrategy>(new ErrorScreenStrategy());
158 case STRATEGY_ID_SESSION:
159 return scoped_ptr<PortalDetectorStrategy>(new SessionStrategy());
162 return scoped_ptr<PortalDetectorStrategy>(
163 static_cast<PortalDetectorStrategy*>(NULL));
167 bool PortalDetectorStrategy::CanPerformAttempt() {
168 return CanPerformAttemptImpl();
171 bool PortalDetectorStrategy::CanPerformAttemptAfterDetection() {
172 return CanPerformAttemptAfterDetectionImpl();
175 base::TimeDelta PortalDetectorStrategy::GetDelayTillNextAttempt() {
176 if (delay_till_next_attempt_for_testing_initialized_)
177 return delay_till_next_attempt_for_testing_;
178 return GetDelayTillNextAttemptImpl();
181 base::TimeDelta PortalDetectorStrategy::GetNextAttemptTimeout() {
182 if (next_attempt_timeout_for_testing_initialized_)
183 return next_attempt_timeout_for_testing_;
184 return GetNextAttemptTimeoutImpl();
187 bool PortalDetectorStrategy::CanPerformAttemptImpl() { return false; }
189 bool PortalDetectorStrategy::CanPerformAttemptAfterDetectionImpl() {
193 base::TimeDelta PortalDetectorStrategy::GetDelayTillNextAttemptImpl() {
194 return base::TimeDelta();
197 base::TimeDelta PortalDetectorStrategy::GetNextAttemptTimeoutImpl() {
198 return base::TimeDelta();
201 base::TimeDelta PortalDetectorStrategy::AdjustDelay(
202 const base::TimeDelta& delay) {
203 if (!delegate_->AttemptCount())
204 return base::TimeDelta();
206 base::TimeTicks now = delegate_->GetCurrentTimeTicks();
207 base::TimeDelta elapsed;
208 if (now > delegate_->AttemptStartTime())
209 elapsed = now - delegate_->AttemptStartTime();
211 return delay - elapsed;
212 return base::TimeDelta();
215 } // namespace chromeos