Add an option that allows changing the number of days to keep navigation history

This commit is contained in:
Carmelo Messina 2022-01-31 13:53:49 +01:00
parent 9ff0d2ee94
commit c0ea8761a9
No known key found for this signature in database
GPG key ID: 968894BE688289FD
2 changed files with 455 additions and 0 deletions

View file

@ -181,3 +181,4 @@ Remove-HashAffiliationFetcher.patch
Add-more-private-google-search-engine.patch
Enable-StrictOriginIsolation-and-SitePerProcess-flags.patch
Site-setting-for-javascript-jit.patch
Allow-change-keep-navigation-history.patch

View file

@ -0,0 +1,454 @@
From: uazo <uazo@users.noreply.github.com>
Date: Mon, 31 Jan 2022 12:49:39 +0000
Subject: Add an option that allows changing the number of days to keep
navigation history
---
.../preference_spinner_single_line.xml | 26 ++++++---
.../java/res/xml/privacy_preferences.xml | 6 +++
.../privacy/settings/PrivacySettings.java | 54 +++++++++++++++++++
.../history/history_service_factory.cc | 2 +
chrome/browser/preferences/BUILD.gn | 1 +
chrome/browser/profiles/profile_impl.cc | 1 +
.../strings/android_chrome_strings.grd | 6 +++
.../java/res/layout/preference_spinner.xml | 7 +++
.../layout/preference_spinner_single_line.xml | 7 +++
.../settings/SpinnerPreference.java | 7 +++
.../core/browser/expire_history_backend.cc | 6 +++
.../core/browser/expire_history_backend.h | 2 +
.../history/core/browser/history_backend.cc | 8 +++
.../history/core/browser/history_backend.h | 2 +
.../history/core/browser/history_service.cc | 31 +++++++++++
.../history/core/browser/history_service.h | 8 +++
components/history/core/common/pref_names.cc | 4 ++
components/history/core/common/pref_names.h | 1 +
18 files changed, 173 insertions(+), 6 deletions(-)
diff --git a/chrome/android/java/res/layout-sw360dp/preference_spinner_single_line.xml b/chrome/android/java/res/layout-sw360dp/preference_spinner_single_line.xml
--- a/chrome/android/java/res/layout-sw360dp/preference_spinner_single_line.xml
+++ b/chrome/android/java/res/layout-sw360dp/preference_spinner_single_line.xml
@@ -11,19 +11,33 @@
android:layout_height="wrap_content"
android:orientation="horizontal"
android:paddingEnd="@dimen/pref_spinner_padding_end"
- android:paddingTop="12dp"
+ android:paddingTop="0dp"
android:paddingBottom="6dp">
- <TextView
- android:id="@+id/title"
- style="@style/PreferenceTitle"
- android:textAppearance="@style/TextAppearance.TextLarge.Secondary"
+ <LinearLayout
+ android:orientation="vertical"
android:textAlignment="viewStart"
android:layout_height="wrap_content"
android:layout_width="0dp"
android:layout_weight="1"
android:paddingTop="12dp"
- android:paddingBottom="12dp"/>
+ android:paddingBottom="12dp">
+
+ <TextView
+ android:id="@+id/title"
+ style="@style/PreferenceTitle"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textAppearance="@style/TextAppearance.TextLarge.Secondary" />
+
+ <TextView
+ android:id="@+id/summary"
+ style="@style/PreferenceSummary"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:visibility="gone" />
+
+ </LinearLayout>
<Spinner
android:id="@+id/spinner"
diff --git a/chrome/android/java/res/xml/privacy_preferences.xml b/chrome/android/java/res/xml/privacy_preferences.xml
--- a/chrome/android/java/res/xml/privacy_preferences.xml
+++ b/chrome/android/java/res/xml/privacy_preferences.xml
@@ -61,6 +61,12 @@
android:title="@string/incognito_history_enabled_title"
android:summary="@string/incognito_history_enabled_summary"
android:defaultValue="false" />
+ <org.chromium.components.browser_ui.settings.SpinnerPreference
+ android:key="history_expire_days_threshold"
+ android:persistent="false"
+ android:title="@string/history_expire_days_threshold_title"
+ android:summary="@string/history_expire_days_threshold_summary"
+ app:singleLine="true" />
<Preference
android:fragment="org.chromium.chrome.browser.privacy.settings.DoNotTrackSettings"
android:key="do_not_track"
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/privacy/settings/PrivacySettings.java b/chrome/android/java/src/org/chromium/chrome/browser/privacy/settings/PrivacySettings.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/privacy/settings/PrivacySettings.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/privacy/settings/PrivacySettings.java
@@ -40,6 +40,7 @@ import org.chromium.chrome.browser.ui.messages.snackbar.INeedSnackbarManager;
import org.chromium.chrome.browser.ui.messages.snackbar.Snackbar;
import org.chromium.chrome.browser.ApplicationLifetime;
import org.chromium.components.browser_ui.settings.ChromeSwitchPreference;
+import org.chromium.components.browser_ui.settings.SpinnerPreference;
import org.chromium.components.browser_ui.settings.ManagedPreferenceDelegate;
import org.chromium.components.browser_ui.settings.SettingsLauncher;
import org.chromium.components.browser_ui.settings.SettingsUtils;
@@ -56,6 +57,9 @@ import org.chromium.chrome.browser.preferences.SharedPreferencesManager;
import org.chromium.components.browser_ui.settings.ChromeSwitchPreference;
import org.chromium.chrome.browser.preferences.ChromePreferenceKeys;
+import java.util.ArrayList;
+import java.util.List;
+
/**
* Fragment to keep track of the all the privacy related preferences.
*/
@@ -97,6 +101,8 @@ public class PrivacySettings
private ChromeSwitchPreference allowCustomTabIntentsPref;
private ChromeSwitchPreference openExternalLinksPref;
+ private static final String PREF_HISTORY_EXPIRE_DAYS_THRESHOLD = "history_expire_days_threshold";
+
@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
PrivacyPreferencesManagerImpl privacyPrefManager =
@@ -194,6 +200,37 @@ public class PrivacySettings
historyInIncognitoPref.setOnPreferenceChangeListener(this);
historyInIncognitoPref.setManagedPreferenceDelegate(mManagedPreferenceDelegate);
+ // set up history expire days threshold preference
+ List<TimeFrequencySpinnerOption> options = new ArrayList<>();
+ options.add(new TimeFrequencySpinnerOption(0));
+ options.add(new TimeFrequencySpinnerOption(1));
+ options.add(new TimeFrequencySpinnerOption(7));
+ options.add(new TimeFrequencySpinnerOption(15));
+ options.add(new TimeFrequencySpinnerOption(30));
+ options.add(new TimeFrequencySpinnerOption(60));
+ options.add(new TimeFrequencySpinnerOption(90));
+ TimeFrequencySpinnerOption[] spinnerOptions = options.toArray(new TimeFrequencySpinnerOption[0]);
+
+ int selectedTimeFrequency = UserPrefs.get(Profile.getLastUsedRegularProfile())
+ .getInteger(Pref.EXPIRE_DAYS_THRESHOLD);
+ int spinnerOptionIndex = -1;
+ for (int i = 0; i < spinnerOptions.length; ++i) {
+ if (spinnerOptions[i].getDays() == selectedTimeFrequency) {
+ spinnerOptionIndex = i;
+ break;
+ }
+ }
+
+ SpinnerPreference spinner = (SpinnerPreference) findPreference(PREF_HISTORY_EXPIRE_DAYS_THRESHOLD);
+ spinner.setOptions(spinnerOptions, spinnerOptionIndex);
+ spinner.setSummary(getResources().getString(R.string.history_expire_days_threshold_summary));
+ spinner.setOnPreferenceChangeListener((preference, newValue) -> {
+ UserPrefs.get(Profile.getLastUsedRegularProfile())
+ .setInteger(Pref.EXPIRE_DAYS_THRESHOLD,
+ ((TimeFrequencySpinnerOption) newValue).getDays());
+ return true;
+ });
+
updatePreferences();
}
@@ -352,4 +389,21 @@ public class PrivacySettings
public void setSnackbarManager(SnackbarManager manager) {
mSnackbarManager = manager;
}
+
+ class TimeFrequencySpinnerOption {
+ private int mDays;
+
+ public TimeFrequencySpinnerOption(int days) {
+ mDays = days;
+ }
+
+ public int getDays() {
+ return mDays;
+ }
+
+ @Override
+ public String toString() {
+ return Integer.toString(mDays);
+ }
+ }
}
diff --git a/chrome/browser/history/history_service_factory.cc b/chrome/browser/history/history_service_factory.cc
--- a/chrome/browser/history/history_service_factory.cc
+++ b/chrome/browser/history/history_service_factory.cc
@@ -30,6 +30,8 @@ std::unique_ptr<KeyedService> BuildHistoryService(
history::HistoryDatabaseParamsForPath(context->GetPath()))) {
return nullptr;
}
+ Profile* profile = Profile::FromBrowserContext(context);
+ history_service->InitFromPreferences(profile->GetPrefs());
return history_service;
}
diff --git a/chrome/browser/preferences/BUILD.gn b/chrome/browser/preferences/BUILD.gn
--- a/chrome/browser/preferences/BUILD.gn
+++ b/chrome/browser/preferences/BUILD.gn
@@ -40,6 +40,7 @@ java_cpp_strings("java_pref_names_srcjar") {
"//components/safe_browsing/core/common/safe_browsing_prefs.cc",
"//components/signin/public/base/signin_pref_names.cc",
"//components/translate/core/browser/translate_pref_names.cc",
+ "//components/history/core/common/pref_names.cc",
]
template = "android/java_templates/Pref.java.tmpl"
diff --git a/chrome/browser/profiles/profile_impl.cc b/chrome/browser/profiles/profile_impl.cc
--- a/chrome/browser/profiles/profile_impl.cc
+++ b/chrome/browser/profiles/profile_impl.cc
@@ -370,6 +370,7 @@ std::unique_ptr<Profile> Profile::CreateProfile(const base::FilePath& path,
void ProfileImpl::RegisterProfilePrefs(
user_prefs::PrefRegistrySyncable* registry) {
registry->RegisterBooleanPref(prefs::kSavingBrowserHistoryDisabled, false);
+ registry->RegisterIntegerPref(prefs::kExpireDaysThreshold, 90);
registry->RegisterBooleanPref(prefs::kAllowDeletingBrowserHistory, true);
registry->RegisterBooleanPref(prefs::kForceGoogleSafeSearch, false);
registry->RegisterIntegerPref(prefs::kForceYouTubeRestrict,
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chrome/browser/ui/android/strings/android_chrome_strings.grd
--- a/chrome/browser/ui/android/strings/android_chrome_strings.grd
+++ b/chrome/browser/ui/android/strings/android_chrome_strings.grd
@@ -988,6 +988,12 @@ Your Google account may have other forms of browsing history like searches and a
<message name="IDS_CLEAR_HISTORY_TITLE" desc="Title for Clear History in Clear Browsing Data dialog">
Browsing history
</message>
+ <message name="IDS_HISTORY_EXPIRE_DAYS_THRESHOLD_TITLE" desc="Title for history expire days threshold">
+ Expire history days threshold
+ </message>
+ <message name="IDS_HISTORY_EXPIRE_DAYS_THRESHOLD_SUMMARY" desc="Summary for history expire days threshold">
+ Number of days to keep navigation history
+ </message>
<message name="IDS_CLEAR_COOKIES_AND_SITE_DATA_TITLE" desc="Title for Clear Cookies and site data in Clear Browsing Data dialog">
Cookies and site data
</message>
diff --git a/components/browser_ui/settings/android/java/res/layout/preference_spinner.xml b/components/browser_ui/settings/android/java/res/layout/preference_spinner.xml
--- a/components/browser_ui/settings/android/java/res/layout/preference_spinner.xml
+++ b/components/browser_ui/settings/android/java/res/layout/preference_spinner.xml
@@ -18,6 +18,13 @@
android:layout_width="match_parent"
style="@style/PreferenceTitle" />
+ <TextView
+ android:id="@+id/summary"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ style="@style/PreferenceSummary"
+ android:visibility="gone" />
+
<Spinner
android:id="@+id/spinner"
android:layout_height="wrap_content"
diff --git a/components/browser_ui/settings/android/java/res/layout/preference_spinner_single_line.xml b/components/browser_ui/settings/android/java/res/layout/preference_spinner_single_line.xml
--- a/components/browser_ui/settings/android/java/res/layout/preference_spinner_single_line.xml
+++ b/components/browser_ui/settings/android/java/res/layout/preference_spinner_single_line.xml
@@ -20,6 +20,13 @@
android:layout_height="wrap_content"
android:layout_width="match_parent" />
+ <TextView
+ android:id="@+id/summary"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ style="@style/PreferenceSummary"
+ android:visibility="gone" />
+
<Spinner
android:id="@+id/spinner"
android:layout_height="wrap_content"
diff --git a/components/browser_ui/settings/android/widget/java/src/org/chromium/components/browser_ui/settings/SpinnerPreference.java b/components/browser_ui/settings/android/widget/java/src/org/chromium/components/browser_ui/settings/SpinnerPreference.java
--- a/components/browser_ui/settings/android/widget/java/src/org/chromium/components/browser_ui/settings/SpinnerPreference.java
+++ b/components/browser_ui/settings/android/widget/java/src/org/chromium/components/browser_ui/settings/SpinnerPreference.java
@@ -6,6 +6,7 @@ package org.chromium.components.browser_ui.settings;
import android.content.Context;
import android.content.res.TypedArray;
+import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.View;
import android.widget.AdapterView;
@@ -98,6 +99,12 @@ public class SpinnerPreference extends Preference {
super.onBindViewHolder(holder);
((TextView) holder.findViewById(R.id.title)).setText(getTitle());
+ CharSequence summary = getSummary();
+ TextView summaryView = ((TextView) holder.findViewById(R.id.summary));
+ if (summaryView != null && !TextUtils.isEmpty(summary)) {
+ summaryView.setText(summary);
+ summaryView.setVisibility(View.VISIBLE);
+ }
mSpinner = (Spinner) holder.findViewById(R.id.spinner);
mSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
diff --git a/components/history/core/browser/expire_history_backend.cc b/components/history/core/browser/expire_history_backend.cc
--- a/components/history/core/browser/expire_history_backend.cc
+++ b/components/history/core/browser/expire_history_backend.cc
@@ -405,6 +405,12 @@ void ExpireHistoryBackend::StartExpiringOldStuff(
ScheduleExpire();
}
+void ExpireHistoryBackend::SetExpireDaysThreshold(
+ base::TimeDelta expiration_threshold) {
+ expiration_threshold_ = expiration_threshold;
+ ScheduleExpire();
+}
+
void ExpireHistoryBackend::DeleteFaviconsIfPossible(DeleteEffects* effects) {
if (!favicon_db_)
return;
diff --git a/components/history/core/browser/expire_history_backend.h b/components/history/core/browser/expire_history_backend.h
--- a/components/history/core/browser/expire_history_backend.h
+++ b/components/history/core/browser/expire_history_backend.h
@@ -79,6 +79,8 @@ class ExpireHistoryBackend {
// will continue until the object is deleted.
void StartExpiringOldStuff(base::TimeDelta expiration_threshold);
+ void SetExpireDaysThreshold(base::TimeDelta expiration_threshold);
+
// Deletes everything associated with a URL until `end_time`.
void DeleteURL(const GURL& url, base::Time end_time);
diff --git a/components/history/core/browser/history_backend.cc b/components/history/core/browser/history_backend.cc
--- a/components/history/core/browser/history_backend.cc
+++ b/components/history/core/browser/history_backend.cc
@@ -905,6 +905,14 @@ void HistoryBackend::InitImpl(
LOCAL_HISTOGRAM_TIMES("History.InitTime", TimeTicks::Now() - beginning_time);
}
+void HistoryBackend::SetExpireDaysThreshold(int days) {
+ if (days == 0) {
+ task_runner_->PostTask(
+ FROM_HERE, base::BindOnce(&HistoryBackend::DeleteAllHistory, this));
+ }
+ expirer_.SetExpireDaysThreshold(base::Days(days));
+}
+
void HistoryBackend::OnMemoryPressure(
base::MemoryPressureListener::MemoryPressureLevel memory_pressure_level) {
// TODO(sebmarchand): Check if MEMORY_PRESSURE_LEVEL_MODERATE should also be
diff --git a/components/history/core/browser/history_backend.h b/components/history/core/browser/history_backend.h
--- a/components/history/core/browser/history_backend.h
+++ b/components/history/core/browser/history_backend.h
@@ -212,6 +212,8 @@ class HistoryBackend : public base::RefCountedThreadSafe<HistoryBackend>,
void Init(bool force_fail,
const HistoryDatabaseParams& history_database_params);
+ void SetExpireDaysThreshold(int days);
+
// Notification that the history system is shutting down. This will break
// the refs owned by the delegate and any pending transaction so it will
// actually be deleted.
diff --git a/components/history/core/browser/history_service.cc b/components/history/core/browser/history_service.cc
--- a/components/history/core/browser/history_service.cc
+++ b/components/history/core/browser/history_service.cc
@@ -35,6 +35,9 @@
#include "base/time/time.h"
#include "base/trace_event/trace_event.h"
#include "build/build_config.h"
+#include "components/prefs/pref_service.h"
+#include "components/prefs/pref_change_registrar.h"
+#include "components/history/core/common/pref_names.h"
#include "components/history/core/browser/download_row.h"
#include "components/history/core/browser/history_backend.h"
#include "components/history/core/browser/history_backend_client.h"
@@ -1036,6 +1039,9 @@ void HistoryService::Cleanup() {
return;
}
+ active_user_pref_change_registrar_.reset();
+ active_user_pref_service_ = nullptr;
+
NotifyHistoryServiceBeingDeleted();
weak_ptr_factory_.InvalidateWeakPtrs();
@@ -1100,6 +1106,31 @@ bool HistoryService::Init(
return true;
}
+void HistoryService::InitFromPreferences(PrefService* prefs) {
+ DCHECK(prefs);
+
+ active_user_pref_service_ = prefs;
+ OnUserPrefChanged();
+
+ active_user_pref_change_registrar_ = std::make_unique<PrefChangeRegistrar>();
+ active_user_pref_change_registrar_->Init(prefs);
+ active_user_pref_change_registrar_->Add(
+ prefs::kExpireDaysThreshold,
+ base::BindRepeating(
+ &HistoryService::OnUserPrefChanged,
+ base::Unretained(this)));
+}
+
+void HistoryService::OnUserPrefChanged() {
+ DCHECK(active_user_pref_service_);
+
+ int kExpireDaysThreshold =
+ active_user_pref_service_->GetInteger(prefs::kExpireDaysThreshold);
+ active_user_pref_service_->SetBoolean(prefs::kSavingBrowserHistoryDisabled,
+ (kExpireDaysThreshold == 0));
+ history_backend_->SetExpireDaysThreshold(kExpireDaysThreshold);
+}
+
void HistoryService::ScheduleAutocomplete(
base::OnceCallback<void(HistoryBackend*, URLDatabase*)> callback) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
diff --git a/components/history/core/browser/history_service.h b/components/history/core/browser/history_service.h
--- a/components/history/core/browser/history_service.h
+++ b/components/history/core/browser/history_service.h
@@ -32,6 +32,8 @@
#include "build/build_config.h"
#include "components/favicon_base/favicon_callback.h"
#include "components/favicon_base/favicon_usage_data.h"
+#include "components/prefs/pref_service.h"
+#include "components/prefs/pref_change_registrar.h"
#include "components/history/core/browser/history_types.h"
#include "components/history/core/browser/keyword_id.h"
#include "components/keyed_service/core/keyed_service.h"
@@ -106,6 +108,8 @@ class HistoryService : public KeyedService {
return Init(false, history_database_params);
}
+ void InitFromPreferences(PrefService* prefs);
+
// Triggers the backend to load if it hasn't already, and then returns whether
// it's finished loading.
// Note: Virtual needed for mocking.
@@ -981,6 +985,10 @@ class HistoryService : public KeyedService {
base::OnceClosure origin_queried_closure_for_testing_;
+ void OnUserPrefChanged();
+ PrefService* active_user_pref_service_ = nullptr;
+ std::unique_ptr<PrefChangeRegistrar> active_user_pref_change_registrar_;
+
// All vended weak pointers are invalidated in Cleanup().
base::WeakPtrFactory<HistoryService> weak_ptr_factory_{this};
};
diff --git a/components/history/core/common/pref_names.cc b/components/history/core/common/pref_names.cc
--- a/components/history/core/common/pref_names.cc
+++ b/components/history/core/common/pref_names.cc
@@ -9,4 +9,8 @@ namespace prefs {
// Boolean controlling whether history saving is disabled.
const char kSavingBrowserHistoryDisabled[] = "history.saving_disabled";
+// The number of days old a history entry can be before it is considered "old"
+// and is deleted.
+const char kExpireDaysThreshold[] = "history.expire_days_threshold";
+
} // namespace prefs
diff --git a/components/history/core/common/pref_names.h b/components/history/core/common/pref_names.h
--- a/components/history/core/common/pref_names.h
+++ b/components/history/core/common/pref_names.h
@@ -12,6 +12,7 @@
namespace prefs {
extern const char kSavingBrowserHistoryDisabled[];
+extern const char kExpireDaysThreshold[];
} // namespace prefs
--
2.20.1