1a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 2a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// found in the LICENSE file. 4a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 5a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#ifndef CHROME_BROWSER_CHROMEOS_NET_NETWORK_PORTAL_DETECTOR_STRATEGY_H_ 6a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#define CHROME_BROWSER_CHROMEOS_NET_NETWORK_PORTAL_DETECTOR_STRATEGY_H_ 7a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 8a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/compiler_specific.h" 9a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/macros.h" 10a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 11a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/time/time.h" 12a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 13a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace chromeos { 14a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 15a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class PortalDetectorStrategy { 16a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) public: 17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) enum StrategyId { 18a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) STRATEGY_ID_LOGIN_SCREEN, 19a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) STRATEGY_ID_ERROR_SCREEN, 20010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) STRATEGY_ID_SESSION 21a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) }; 22a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 23a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) class Delegate { 24a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) public: 25a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual ~Delegate() {} 26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 27a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Returns number of performed attempts. 28a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual int AttemptCount() = 0; 29a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 30a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Returns time when current attempt was started. 31a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual base::TimeTicks AttemptStartTime() = 0; 32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 33a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Returns current TimeTicks. 34a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual base::TimeTicks GetCurrentTimeTicks() = 0; 35a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) }; 36a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 37a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual ~PortalDetectorStrategy(); 38a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 39a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) static scoped_ptr<PortalDetectorStrategy> CreateById(StrategyId id); 40a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 41a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void set_delegate(Delegate* delegate) { delegate_ = delegate; } 42a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 43a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Returns true when detection attempt can be performed according to 44a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // current strategy. 45a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool CanPerformAttempt(); 46a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 47a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Returns true if additional attempt could be scheduled after 48a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // detection. 49a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool CanPerformAttemptAfterDetection(); 50a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 51a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Returns delay before next detection attempt. This delay is needed 52a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // to separate detection attempts in time. 53a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::TimeDelta GetDelayTillNextAttempt(); 54a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 55a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Returns timeout for the next detection attempt. 56a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::TimeDelta GetNextAttemptTimeout(); 57a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 58a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual StrategyId Id() const = 0; 59a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 60a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) protected: 61a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) PortalDetectorStrategy(); 62a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 63a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Interface for subclasses: 64a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual bool CanPerformAttemptImpl(); 65a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual bool CanPerformAttemptAfterDetectionImpl(); 66a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual base::TimeDelta GetDelayTillNextAttemptImpl(); 67a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual base::TimeDelta GetNextAttemptTimeoutImpl(); 68a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 69a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Adjusts |delay| according to current attempt count and elapsed time 70a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // since previous attempt. 71a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::TimeDelta AdjustDelay(const base::TimeDelta& delay); 72a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 73a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Delegate* delegate_; 74a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 75a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) private: 76a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) friend class NetworkPortalDetectorImplTest; 77a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) friend class NetworkPortalDetectorImplBrowserTest; 78a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 79a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) static void set_delay_till_next_attempt_for_testing( 80a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const base::TimeDelta& timeout) { 81a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) delay_till_next_attempt_for_testing_ = timeout; 82a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) delay_till_next_attempt_for_testing_initialized_ = true; 83a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 84a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 85a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) static void set_next_attempt_timeout_for_testing( 86a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const base::TimeDelta& timeout) { 87a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) next_attempt_timeout_for_testing_ = timeout; 88a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) next_attempt_timeout_for_testing_initialized_ = true; 89a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 90a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 91a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) static void reset_fields_for_testing() { 92a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) delay_till_next_attempt_for_testing_initialized_ = false; 93a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) next_attempt_timeout_for_testing_initialized_ = false; 94a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 95a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 96a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Test delay before detection attempt, used by unit tests. 97a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) static base::TimeDelta delay_till_next_attempt_for_testing_; 98a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 99a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // True when |min_time_between_attempts_for_testing_| is initialized. 100a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) static bool delay_till_next_attempt_for_testing_initialized_; 101a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 102a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Test timeout for a detection attempt, used by unit tests. 103a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) static base::TimeDelta next_attempt_timeout_for_testing_; 104a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 105a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // True when |next_attempt_timeout_for_testing_| is initialized. 106a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) static bool next_attempt_timeout_for_testing_initialized_; 107a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 108a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(PortalDetectorStrategy); 109a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}; 110a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 111a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} // namespace chromeos 112a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 113a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif // CHROME_BROWSER_CHROMEOS_NET_NETWORK_PORTAL_DETECTOR_STRATEGY_H_ 114