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