Chromium Code Reviews| Index: chrome/browser/network_time/network_time_tracker.cc |
| diff --git a/chrome/browser/network_time/network_time_tracker.cc b/chrome/browser/network_time/network_time_tracker.cc |
| index 885c9722f13b1ab7976cb95289a67c8c2ac50025..6be0a58184bd79159bb2b8941243579055c9f865 100644 |
| --- a/chrome/browser/network_time/network_time_tracker.cc |
| +++ b/chrome/browser/network_time/network_time_tracker.cc |
| @@ -5,10 +5,15 @@ |
| #include "chrome/browser/network_time/network_time_tracker.h" |
| #include "base/basictypes.h" |
| +#include "base/command_line.h" |
| #include "base/i18n/time_formatting.h" |
| #include "base/logging.h" |
| +#include "base/prefs/pref_registry_simple.h" |
| +#include "base/prefs/pref_service.h" |
| #include "base/strings/utf_string_conversions.h" |
| #include "base/time/tick_clock.h" |
| +#include "chrome/common/chrome_switches.h" |
| +#include "chrome/common/pref_names.h" |
| namespace { |
| @@ -24,36 +29,44 @@ const int kNumTimeMeasurements = 5; |
| } // namespace |
| -NetworkTimeTracker::TimeMapping::TimeMapping(base::Time local_time, |
| - base::Time network_time) |
| - : local_time(local_time), |
| - network_time(network_time) {} |
| +// static |
| +void NetworkTimeTracker::RegisterPrefs(PrefRegistrySimple* registry) { |
| + registry->RegisterDictionaryPref(prefs::kNetworkTimeMapping, |
| + new base::DictionaryValue()); |
| +} |
| -NetworkTimeTracker::NetworkTimeTracker(scoped_ptr<base::TickClock> tick_clock) |
| +NetworkTimeTracker::NetworkTimeTracker(scoped_ptr<base::TickClock> tick_clock, |
| + PrefService* pref_service) |
| : tick_clock_(tick_clock.Pass()), |
| + pref_service_(pref_service), |
| received_network_time_(false) { |
| + if (CommandLine::ForCurrentProcess()->HasSwitch( |
| + switches::kEnableNetworkTime)) { |
|
haitaol1
2014/05/27 23:09:31
This switch is probably not needed. You can turn o
hashimoto
2014/05/28 11:25:52
Done.
|
| + const base::DictionaryValue* time_mapping = |
| + pref_service_->GetDictionary(prefs::kNetworkTimeMapping); |
| + double local_time_js = 0; |
| + double network_time_js = 0; |
| + if (time_mapping->GetDouble("local", &local_time_js) && |
| + time_mapping->GetDouble("network", &network_time_js)) { |
| + base::Time local_time_saved = base::Time::FromJsTime(local_time_js); |
| + base::Time local_time_now = base::Time::Now(); |
| + if (local_time_saved > local_time_now || |
| + local_time_now - local_time_saved > base::TimeDelta::FromDays(7)) { |
| + // Drop saved mapping if clock skew has changed or the data is too old. |
| + pref_service_->ClearPref(prefs::kNetworkTimeMapping); |
| + } else { |
| + network_time_ = base::Time::FromJsTime(network_time_js) + |
| + (local_time_now - local_time_saved); |
| + network_time_ticks_ = base::TimeTicks::Now(); |
| + } |
| + } |
| + } |
| } |
| NetworkTimeTracker::~NetworkTimeTracker() { |
| DCHECK(thread_checker_.CalledOnValidThread()); |
| } |
| -void NetworkTimeTracker::InitFromSavedTime(const TimeMapping& saved) { |
| - DCHECK(thread_checker_.CalledOnValidThread()); |
| - if (!network_time_.is_null() || saved.local_time.is_null() || |
| - saved.network_time.is_null()) |
| - return; |
| - |
| - base::Time local_time_now = base::Time::Now(); |
| - if (local_time_now < saved.local_time) { |
| - DLOG(WARNING) << "Can't initialize because clock skew has changed."; |
| - return; |
| - } |
| - |
| - network_time_ = saved.network_time + (local_time_now - saved.local_time); |
| - network_time_ticks_ = base::TimeTicks::Now(); |
| -} |
| - |
| void NetworkTimeTracker::UpdateNetworkTime(base::Time network_time, |
| base::TimeDelta resolution, |
| base::TimeDelta latency, |
| @@ -85,6 +98,19 @@ void NetworkTimeTracker::UpdateNetworkTime(base::Time network_time, |
| base::TimeDelta::FromMilliseconds(kTicksResolutionMs); |
| received_network_time_ = true; |
| + |
| + base::Time network_time_now; |
| + if (CommandLine::ForCurrentProcess()->HasSwitch( |
|
haitaol1
2014/05/27 23:09:31
same here.
hashimoto
2014/05/28 11:25:52
Done.
|
| + switches::kEnableNetworkTime) && |
| + GetNetworkTime(base::TimeTicks::Now(), &network_time_now, NULL)) { |
| + // Update time mapping if tracker received time update from server, i.e. |
| + // mapping is accurate. |
| + base::Time local_now = base::Time::Now(); |
| + base::DictionaryValue time_mapping; |
| + time_mapping.SetDouble("local", local_now.ToJsTime()); |
| + time_mapping.SetDouble("network", network_time_now.ToJsTime()); |
| + pref_service_->Set(prefs::kNetworkTimeMapping, time_mapping); |
| + } |
| } |
| bool NetworkTimeTracker::GetNetworkTime(base::TimeTicks time_ticks, |