| // 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. |
| |
| #ifndef CHROMEOS_NETWORK_PORTAL_DETECTOR_NETWORK_PORTAL_DETECTOR_STRATEGY_H_ |
| #define CHROMEOS_NETWORK_PORTAL_DETECTOR_NETWORK_PORTAL_DETECTOR_STRATEGY_H_ |
| |
| #include "base/basictypes.h" |
| #include "base/compiler_specific.h" |
| #include "base/macros.h" |
| #include "base/memory/scoped_ptr.h" |
| #include "base/time/tick_clock.h" |
| #include "base/time/time.h" |
| #include "chromeos/chromeos_export.h" |
| #include "net/base/backoff_entry.h" |
| |
| namespace chromeos { |
| |
| class CHROMEOS_EXPORT PortalDetectorStrategy { |
| public: |
| enum StrategyId { |
| STRATEGY_ID_LOGIN_SCREEN, |
| STRATEGY_ID_ERROR_SCREEN, |
| STRATEGY_ID_SESSION |
| }; |
| |
| class Delegate : public base::TickClock { |
| public: |
| ~Delegate() override; |
| |
| // Returns number of attempts in a row with NO RESPONSE result. |
| // If last detection attempt has different result, returns 0. |
| virtual int NoResponseResultCount() = 0; |
| |
| // Returns time when current attempt was started. |
| virtual base::TimeTicks AttemptStartTime() = 0; |
| }; |
| |
| virtual ~PortalDetectorStrategy(); |
| |
| // Lifetime of delegate must enclose lifetime of PortalDetectorStrategy. |
| static scoped_ptr<PortalDetectorStrategy> CreateById(StrategyId id, |
| Delegate* delegate); |
| |
| // Returns delay before next detection attempt. This delay is needed |
| // to separate detection attempts in time. |
| base::TimeDelta GetDelayTillNextAttempt(); |
| |
| // Returns timeout for the next detection attempt. |
| base::TimeDelta GetNextAttemptTimeout(); |
| |
| virtual StrategyId Id() const = 0; |
| |
| // Resets strategy to the initial state. |
| void Reset(); |
| |
| const net::BackoffEntry::Policy& policy() const { return policy_; } |
| |
| // Resets strategy to the initial stater and sets custom policy. |
| void SetPolicyAndReset(const net::BackoffEntry::Policy& policy); |
| |
| // Should be called when portal detection is completed and timeout before next |
| // attempt should be adjusted. |
| void OnDetectionCompleted(); |
| |
| protected: |
| // Lifetime of delegate must enclose lifetime of PortalDetectorStrategy. |
| explicit PortalDetectorStrategy(Delegate* delegate); |
| |
| // Interface for subclasses: |
| virtual base::TimeDelta GetNextAttemptTimeoutImpl(); |
| |
| Delegate* delegate_; |
| net::BackoffEntry::Policy policy_; |
| scoped_ptr<net::BackoffEntry> backoff_entry_; |
| |
| private: |
| friend class NetworkPortalDetectorImplTest; |
| friend class NetworkPortalDetectorImplBrowserTest; |
| |
| static void set_delay_till_next_attempt_for_testing( |
| const base::TimeDelta& timeout) { |
| delay_till_next_attempt_for_testing_ = timeout; |
| delay_till_next_attempt_for_testing_initialized_ = true; |
| } |
| |
| static void set_next_attempt_timeout_for_testing( |
| const base::TimeDelta& timeout) { |
| next_attempt_timeout_for_testing_ = timeout; |
| next_attempt_timeout_for_testing_initialized_ = true; |
| } |
| |
| static void reset_fields_for_testing() { |
| delay_till_next_attempt_for_testing_initialized_ = false; |
| next_attempt_timeout_for_testing_initialized_ = false; |
| } |
| |
| // Test delay before detection attempt, used by unit tests. |
| static base::TimeDelta delay_till_next_attempt_for_testing_; |
| |
| // True when |min_time_between_attempts_for_testing_| is initialized. |
| static bool delay_till_next_attempt_for_testing_initialized_; |
| |
| // Test timeout for a detection attempt, used by unit tests. |
| static base::TimeDelta next_attempt_timeout_for_testing_; |
| |
| // True when |next_attempt_timeout_for_testing_| is initialized. |
| static bool next_attempt_timeout_for_testing_initialized_; |
| |
| DISALLOW_COPY_AND_ASSIGN(PortalDetectorStrategy); |
| }; |
| |
| } // namespace chromeos |
| |
| #endif // CHROMEOS_NETWORK_PORTAL_DETECTOR_NETWORK_PORTAL_DETECTOR_STRATEGY_H_ |