| Index: components/network_time/network_time_tracker.h
|
| diff --git a/components/network_time/network_time_tracker.h b/components/network_time/network_time_tracker.h
|
| index 7f2eb8792031d2cf56c13c17dda1b49909a0e000..69268ffcb9dd7919830de5102496e9d068154a5e 100644
|
| --- a/components/network_time/network_time_tracker.h
|
| +++ b/components/network_time/network_time_tracker.h
|
| @@ -5,19 +5,35 @@
|
| #ifndef COMPONENTS_NETWORK_TIME_NETWORK_TIME_TRACKER_H_
|
| #define COMPONENTS_NETWORK_TIME_NETWORK_TIME_TRACKER_H_
|
|
|
| +#include <stdint.h>
|
| #include <memory>
|
|
|
| +#include "base/gtest_prod_util.h"
|
| #include "base/macros.h"
|
| +#include "base/memory/ref_counted.h"
|
| #include "base/threading/thread_checker.h"
|
| #include "base/time/clock.h"
|
| #include "base/time/time.h"
|
| +#include "base/timer/timer.h"
|
| +#include "net/url_request/url_fetcher_delegate.h"
|
| +#include "url/gurl.h"
|
|
|
| class PrefRegistrySimple;
|
| class PrefService;
|
|
|
| namespace base {
|
| +class MessageLoop;
|
| class TickClock;
|
| -}
|
| +} // namespace base
|
| +
|
| +namespace client_update_protocol {
|
| +class Ecdsa;
|
| +} // namespace client_update_protocol
|
| +
|
| +namespace net {
|
| +class URLFetcher;
|
| +class URLRequestContextGetter;
|
| +} // namespace net
|
|
|
| namespace network_time {
|
|
|
| @@ -30,14 +46,18 @@ const int64_t kTicksResolutionMs = 1; // Assume 1ms for non-windows platforms.
|
|
|
| // A class that receives network time updates and can provide the network time
|
| // for a corresponding local time. This class is not thread safe.
|
| -class NetworkTimeTracker {
|
| +class NetworkTimeTracker : public net::URLFetcherDelegate {
|
| public:
|
| static void RegisterPrefs(PrefRegistrySimple* registry);
|
|
|
| + // Constructor. Arguments may be stubbed out for tests. |getter|, if not
|
| + // null, will cause automatic queries to a time server. Otherwise, time is
|
| + // available only if |UpdateNetworkTime| is called.
|
| NetworkTimeTracker(std::unique_ptr<base::Clock> clock,
|
| std::unique_ptr<base::TickClock> tick_clock,
|
| - PrefService* pref_service);
|
| - ~NetworkTimeTracker();
|
| + PrefService* pref_service,
|
| + scoped_refptr<net::URLRequestContextGetter> getter);
|
| + ~NetworkTimeTracker() override;
|
|
|
| // Sets |network_time| to an estimate of the true time. Returns true if time
|
| // is available, and false otherwise. If |uncertainty| is non-NULL, it will
|
| @@ -61,7 +81,44 @@ class NetworkTimeTracker {
|
| base::TimeDelta latency,
|
| base::TimeTicks post_time);
|
|
|
| + void SetMaxResponseSizeForTesting(size_t limit);
|
| +
|
| + void SetPublicKeyForTesting(const base::StringPiece& key);
|
| +
|
| + void SetTimeServerURLForTesting(const GURL& url);
|
| +
|
| + bool QueryTimeServiceForTesting();
|
| +
|
| + void WaitForFetchForTesting(uint32_t nonce);
|
| +
|
| + base::TimeDelta GetTimerDelayForTesting() const;
|
| +
|
| private:
|
| + // If synchronization has been lost, sends a query to the secure time service.
|
| + // Upon response, execution resumes in |OnURLFetchComplete|.
|
| + void QueryTimeService();
|
| +
|
| + // Updates network time from a time server response, returning true
|
| + // if successful.
|
| + bool UpdateTimeFromResponse();
|
| +
|
| + // net::URLFetcherDelegate:
|
| + // Called to process responses from the secure time service.
|
| + void OnURLFetchComplete(const net::URLFetcher* source) override;
|
| +
|
| + // Sets the next time query to be run at the specified time.
|
| + void QueueTimeQuery(base::TimeDelta delay);
|
| +
|
| + // State variables for internally-managed secure time service queries.
|
| + GURL server_url_;
|
| + size_t max_response_size_;
|
| + base::RepeatingTimer query_timer_;
|
| + scoped_refptr<net::URLRequestContextGetter> getter_;
|
| + std::unique_ptr<net::URLFetcher> time_fetcher_;
|
| + base::TimeTicks fetch_started_;
|
| + std::unique_ptr<client_update_protocol::Ecdsa> query_signer_;
|
| + base::MessageLoop* loop_; // For testing; quit on fetch complete.
|
| +
|
| // The |Clock| and |TickClock| are used to sanity-check one another, allowing
|
| // the NetworkTimeTracker to notice e.g. suspend/resume events and clock
|
| // resets.
|
|
|