1 // Copyright 2018 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.
4 
5 #include "components/offline_pages/core/prefetch/prefetch_prefs.h"
6 #include "components/offline_pages/core/offline_clock.h"
7 #include "components/offline_pages/core/offline_page_feature.h"
8 #include "components/prefs/pref_registry_simple.h"
9 #include "components/prefs/pref_service.h"
10 #include "components/version_info/version_info.h"
11 
12 namespace offline_pages {
13 namespace prefetch_prefs {
14 namespace {
15 // Prefs only accessed in this file
16 const char kLimitlessPrefetchingEnabledTimePref[] =
17     "offline_prefetch.limitless_prefetching_enabled_time";
18 const char kPrefetchTestingHeaderPref[] =
19     "offline_prefetch.testing_header_value";
20 const char kEnabledByServer[] = "offline_prefetch.enabled_by_server";
21 const char kNextForbiddenCheckTimePref[] = "offline_prefetch.next_gpb_check";
22 const base::TimeDelta kForbiddenCheckDelay = base::TimeDelta::FromDays(7);
23 const char kPrefetchCachedGCMToken[] = "offline_prefetch.gcm_token";
24 
25 }  // namespace
26 
27 const char kUserSettingEnabled[] = "offline_prefetch.enabled";
28 const char kBackoff[] = "offline_prefetch.backoff";
29 
RegisterPrefs(PrefRegistrySimple * registry)30 void RegisterPrefs(PrefRegistrySimple* registry) {
31   registry->RegisterListPref(kBackoff);
32   registry->RegisterBooleanPref(kUserSettingEnabled, true);
33   registry->RegisterTimePref(kLimitlessPrefetchingEnabledTimePref,
34                              base::Time());
35   registry->RegisterStringPref(kPrefetchTestingHeaderPref, std::string());
36   registry->RegisterBooleanPref(kEnabledByServer, false);
37   registry->RegisterTimePref(kNextForbiddenCheckTimePref, base::Time());
38   registry->RegisterStringPref(kPrefetchCachedGCMToken, std::string());
39 }
40 
SetPrefetchingEnabledInSettings(PrefService * prefs,bool enabled)41 void SetPrefetchingEnabledInSettings(PrefService* prefs, bool enabled) {
42   prefs->SetBoolean(kUserSettingEnabled, enabled);
43 }
44 
IsPrefetchingEnabledInSettings(PrefService * prefs)45 bool IsPrefetchingEnabledInSettings(PrefService* prefs) {
46   return prefs->GetBoolean(kUserSettingEnabled);
47 }
48 
IsEnabled(PrefService * prefs)49 bool IsEnabled(PrefService* prefs) {
50   return IsPrefetchingOfflinePagesEnabled() &&
51          prefs->GetBoolean(kUserSettingEnabled) && IsEnabledByServer(prefs);
52 }
53 
SetLimitlessPrefetchingEnabled(PrefService * prefs,bool enabled)54 void SetLimitlessPrefetchingEnabled(PrefService* prefs, bool enabled) {
55   DCHECK(prefs);
56   if (enabled)
57     prefs->SetTime(kLimitlessPrefetchingEnabledTimePref, OfflineTimeNow());
58   else
59     prefs->SetTime(kLimitlessPrefetchingEnabledTimePref, base::Time());
60 }
61 
IsLimitlessPrefetchingEnabled(PrefService * prefs)62 bool IsLimitlessPrefetchingEnabled(PrefService* prefs) {
63   base::TimeDelta max_duration;
64   if (version_info::IsOfficialBuild())
65     max_duration = base::TimeDelta::FromDays(1);
66   else
67     max_duration = base::TimeDelta::FromDays(365);
68 
69   DCHECK(prefs);
70   const base::Time enabled_time =
71       prefs->GetTime(kLimitlessPrefetchingEnabledTimePref);
72   const base::Time now = OfflineTimeNow();
73 
74   return (now >= enabled_time) && (now < (enabled_time + max_duration));
75 }
76 
SetPrefetchTestingHeader(PrefService * prefs,const std::string & value)77 void SetPrefetchTestingHeader(PrefService* prefs, const std::string& value) {
78   DCHECK(prefs);
79   prefs->SetString(kPrefetchTestingHeaderPref, value);
80 }
81 
GetPrefetchTestingHeader(PrefService * prefs)82 std::string GetPrefetchTestingHeader(PrefService* prefs) {
83   DCHECK(prefs);
84   return prefs->GetString(kPrefetchTestingHeaderPref);
85 }
86 
IsForbiddenCheckDue(PrefService * prefs)87 bool IsForbiddenCheckDue(PrefService* prefs) {
88   DCHECK(prefs);
89   base::Time checkTime = prefs->GetTime(kNextForbiddenCheckTimePref);
90   return IsPrefetchingOfflinePagesEnabled() &&
91          prefs->GetBoolean(kUserSettingEnabled) && !IsEnabledByServer(prefs) &&
92          (checkTime < OfflineTimeNow() ||  // did the delay expire?
93           checkTime >
94               OfflineTimeNow() +
95                   kForbiddenCheckDelay);  // is the next time unreasonably far
96                                           // in the future (e.g. clock change)?
97 }
98 
IsEnabledByServerUnknown(PrefService * prefs)99 bool IsEnabledByServerUnknown(PrefService* prefs) {
100   DCHECK(prefs);
101   return IsForbiddenCheckDue(prefs) &&
102          (prefs->GetTime(kNextForbiddenCheckTimePref) == base::Time());
103 }
104 
SetEnabledByServer(PrefService * prefs,bool enabled)105 void SetEnabledByServer(PrefService* prefs, bool enabled) {
106   DCHECK(prefs);
107   prefs->SetBoolean(kEnabledByServer, enabled);
108   if (!enabled) {
109     prefs->SetTime(kNextForbiddenCheckTimePref,
110                    OfflineTimeNow() + kForbiddenCheckDelay);
111   }
112 }
113 
IsEnabledByServer(PrefService * prefs)114 bool IsEnabledByServer(PrefService* prefs) {
115   DCHECK(prefs);
116   return prefs->GetBoolean(kEnabledByServer);
117 }
118 
ResetForbiddenStateForTesting(PrefService * prefs)119 void ResetForbiddenStateForTesting(PrefService* prefs) {
120   DCHECK(prefs);
121   SetEnabledByServer(prefs, false);
122   prefs->SetTime(kNextForbiddenCheckTimePref, base::Time());
123 }
124 
SetCachedPrefetchGCMToken(PrefService * prefs,const std::string & value)125 void SetCachedPrefetchGCMToken(PrefService* prefs, const std::string& value) {
126   DCHECK(prefs);
127   prefs->SetString(kPrefetchCachedGCMToken, value);
128 }
129 
GetCachedPrefetchGCMToken(PrefService * prefs)130 std::string GetCachedPrefetchGCMToken(PrefService* prefs) {
131   DCHECK(prefs);
132   return prefs->GetString(kPrefetchCachedGCMToken);
133 }
134 
135 }  // namespace prefetch_prefs
136 }  // namespace offline_pages
137