decoupled activation flag with adblock site setting

first step towards completely deactivating the functionality
This commit is contained in:
Carmelo Messina
2023-12-06 13:36:46 +01:00
parent 853bcab940
commit dee3870e45
@@ -17,31 +17,31 @@ License: GPL-3.0-only - https://spdx.org/licenses/GPL-3.0-only.html
chrome/android/chrome_java_sources.gni | 2 +
.../java/res/layout/adblock_editor.xml | 67 +++++
chrome/android/java/res/values/styles.xml | 18 ++
chrome/android/java/res/values/values.xml | 2 +
chrome/android/java/res/values/values.xml | 4 +
.../java/res/xml/adblock_preferences.xml | 25 ++
.../android/java/res/xml/main_preferences.xml | 5 +
.../browser/settings/AdBlockEditor.java | 91 ++++++
.../browser/settings/AdBlockPreferences.java | 61 ++++
.../browser/settings/AdBlockPreferences.java | 58 ++++
.../chrome/browser/tabmodel/TabModelImpl.java | 2 +-
chrome/app/generated_resources.grd | 10 +
chrome/browser/after_startup_task_utils.cc | 4 +
chrome/browser/browser_process.h | 6 +
chrome/browser/browser_process_impl.cc | 20 ++
chrome/browser/browser_process_impl.cc | 21 ++
chrome/browser/browser_process_impl.h | 2 +
chrome/browser/chrome_browser_main.cc | 3 +
chrome/browser/flags/BUILD.gn | 3 +
.../flags/android/adblock_native_gateway.cc | 21 ++
.../browser/flags/AdBlockNativeGateway.java | 20 ++
.../net/system_network_context_manager.cc | 3 +
.../flags/android/adblock_native_gateway.cc | 31 ++
.../browser/flags/AdBlockNativeGateway.java | 30 ++
.../net/system_network_context_manager.cc | 8 +
.../sessions/session_restore_android.cc | 6 +-
.../strings/android_chrome_strings.grd | 14 +
chrome/common/pref_names.h | 3 +
chrome/common/pref_names.h | 5 +
.../strings/android/site_settings.grdp | 3 +
components/component_updater/BUILD.gn | 7 +
.../adblock_updater_service.cc | 268 ++++++++++++++++++
.../adblock_updater_service.h | 98 +++++++
.../download_filters_task.cc | 239 ++++++++++++++++
.../component_updater/download_filters_task.h | 129 +++++++++
.../adblock_updater_service.cc | 281 ++++++++++++++++++
.../adblock_updater_service.h | 103 +++++++
.../download_filters_task.cc | 239 +++++++++++++++
.../component_updater/download_filters_task.h | 129 ++++++++
...ent_subresource_filter_throttle_manager.cc | 15 +
...tent_subresource_filter_throttle_manager.h | 2 +
.../content/browser/ruleset_service.cc | 42 ++-
@@ -52,7 +52,7 @@ License: GPL-3.0-only - https://spdx.org/licenses/GPL-3.0-only.html
.../browser/subresource_filter_features.cc | 116 +-------
.../core/common/indexed_ruleset.cc | 5 +-
.../Bromite-subresource-adblocker.inc | 3 +
40 files changed, 1209 insertions(+), 127 deletions(-)
40 files changed, 1254 insertions(+), 127 deletions(-)
create mode 100644 chrome/android/java/res/layout/adblock_editor.xml
create mode 100644 chrome/android/java/res/xml/adblock_preferences.xml
create mode 100644 chrome/android/java/src/org/chromium/chrome/browser/settings/AdBlockEditor.java
@@ -210,10 +210,12 @@ diff --git a/chrome/android/java/res/values/styles.xml b/chrome/android/java/res
diff --git a/chrome/android/java/res/values/values.xml b/chrome/android/java/res/values/values.xml
--- a/chrome/android/java/res/values/values.xml
+++ b/chrome/android/java/res/values/values.xml
@@ -27,6 +27,8 @@ found in the LICENSE file.
@@ -27,6 +27,10 @@ found in the LICENSE file.
<!-- Compositor Tab Title Text -->
<bool name="compositor_tab_title_fake_bold_text">true</bool>
+ <string name="adblock_on">Autoupdate enabled</string>
+ <string name="adblock_off">Autoupdate disabled</string>
+ <string name="adblock_help_url">https://www.bromite.org/custom-filters</string>
+
<string name="proxy_title">Proxy configuration</string>
@@ -235,19 +237,19 @@ new file mode 100644
+
+ <org.chromium.components.browser_ui.settings.ChromeSwitchPreference
+ android:key="adblock_switch"
+ android:summaryOn="@string/text_on"
+ android:summaryOff="@string/text_off" />
+
+ <org.chromium.chrome.browser.about_settings.HyperlinkPreference
+ android:key="adblock_help"
+ android:title="@string/adblock_help"
+ app:url="@string/adblock_help_url" />
+ android:summaryOn="@string/adblock_on"
+ android:summaryOff="@string/adblock_off" />
+
+ <Preference
+ android:key="adblock_edit"
+ android:title="@string/options_adblock_edit_label"
+ android:fragment="org.chromium.chrome.browser.settings.AdBlockEditor" />
+
+ <org.chromium.chrome.browser.about_settings.HyperlinkPreference
+ android:key="adblock_help"
+ android:title="@string/adblock_help"
+ app:url="@string/adblock_help_url" />
+
+</PreferenceScreen>
diff --git a/chrome/android/java/res/xml/main_preferences.xml b/chrome/android/java/res/xml/main_preferences.xml
--- a/chrome/android/java/res/xml/main_preferences.xml
@@ -323,7 +325,7 @@ new file mode 100644
+
+ @Override
+ public void onTextChanged(CharSequence s, int start, int before, int count) {
+ mSaveButton.setEnabled(s.length() != 0);
+ mSaveButton.setEnabled(true); // was (s.length() != 0);
+ mResetButton.setEnabled(true);
+ }
+
@@ -364,7 +366,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/settings/AdBloc
new file mode 100644
--- /dev/null
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/AdBlockPreferences.java
@@ -0,0 +1,61 @@
@@ -0,0 +1,58 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
@@ -400,15 +402,12 @@ new file mode 100644
+ getActivity().setTitle(R.string.options_adblock_title);
+ SettingsUtils.addPreferencesFromResource(this, R.xml.adblock_preferences);
+
+ BrowserContextHandle browserContextHandle =
+ getSiteSettingsDelegate().getBrowserContextHandle();
+
+ ChromeSwitchPreference mAdBlockSwitch =
+ (ChromeSwitchPreference) findPreference(PREF_ADBLOCK_SWITCH);
+ boolean isAdBlockEnabled = !WebsitePreferenceBridge.isCategoryEnabled(browserContextHandle, ContentSettingsType.ADS);
+ boolean isAdBlockEnabled = AdBlockNativeGateway.getAdBlockEnabled();
+ mAdBlockSwitch.setChecked(isAdBlockEnabled);
+ mAdBlockSwitch.setOnPreferenceChangeListener((preference, newValue) -> {
+ WebsitePreferenceBridge.setCategoryEnabled(browserContextHandle, ContentSettingsType.ADS, !(boolean) newValue);
+ AdBlockNativeGateway.setAdBlockEnabled((boolean) newValue);
+ return true;
+ });
+
@@ -512,7 +511,7 @@ diff --git a/chrome/browser/browser_process.h b/chrome/browser/browser_process.h
diff --git a/chrome/browser/browser_process_impl.cc b/chrome/browser/browser_process_impl.cc
--- a/chrome/browser/browser_process_impl.cc
+++ b/chrome/browser/browser_process_impl.cc
@@ -1134,6 +1134,26 @@ BrowserProcessImpl::component_updater() {
@@ -1134,6 +1134,27 @@ BrowserProcessImpl::component_updater() {
return component_updater_.get();
}
@@ -531,6 +530,7 @@ diff --git a/chrome/browser/browser_process_impl.cc b/chrome/browser/browser_pro
+ g_browser_process->system_network_context_manager()->GetSharedURLLoaderFactory(),
+ std::move(scheduler),
+ g_browser_process->subresource_filter_ruleset_service(),
+ local_state()->GetBoolean(prefs::kAdBlockEnabled),
+ local_state()->GetString(prefs::kAdBlockFiltersURL));
+
+ return adblock_updater_.get();
@@ -602,7 +602,7 @@ diff --git a/chrome/browser/flags/android/adblock_native_gateway.cc b/chrome/bro
new file mode 100755
--- /dev/null
+++ b/chrome/browser/flags/android/adblock_native_gateway.cc
@@ -0,0 +1,21 @@
@@ -0,0 +1,31 @@
+#include "chrome/browser/flags/jni_headers/AdBlockNativeGateway_jni.h"
+
+#include "base/android/jni_string.h"
@@ -624,11 +624,21 @@ new file mode 100755
+ g_browser_process->local_state()->SetString(prefs::kAdBlockFiltersURL,
+ base::android::ConvertJavaStringToUTF8(env, url));
+}
+
+static jboolean JNI_AdBlockNativeGateway_GetAdBlockEnabled(
+ JNIEnv* env) {
+ return g_browser_process->local_state()->GetBoolean(prefs::kAdBlockEnabled);
+}
+
+static void JNI_AdBlockNativeGateway_SetAdBlockEnabled(
+ JNIEnv* env, jboolean enabled) {
+ g_browser_process->local_state()->SetBoolean(prefs::kAdBlockEnabled, enabled);
+}
diff --git a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/AdBlockNativeGateway.java b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/AdBlockNativeGateway.java
new file mode 100755
--- /dev/null
+++ b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/AdBlockNativeGateway.java
@@ -0,0 +1,20 @@
@@ -0,0 +1,30 @@
+package org.chromium.chrome.browser.flags;
+
+import org.jni_zero.CalledByNative;
@@ -643,19 +653,34 @@ new file mode 100755
+ return AdBlockNativeGatewayJni.get().getAdBlockFiltersURL();
+ }
+
+ public static void setAdBlockEnabled(boolean enabled) {
+ AdBlockNativeGatewayJni.get().setAdBlockEnabled(enabled);
+ }
+
+ public static boolean getAdBlockEnabled() {
+ return AdBlockNativeGatewayJni.get().getAdBlockEnabled();
+ }
+
+ @NativeMethods
+ interface Natives {
+ void setAdBlockFiltersURL(String url);
+ String getAdBlockFiltersURL();
+ void setAdBlockEnabled(boolean enabled);
+ boolean getAdBlockEnabled();
+ }
+}
diff --git a/chrome/browser/net/system_network_context_manager.cc b/chrome/browser/net/system_network_context_manager.cc
--- a/chrome/browser/net/system_network_context_manager.cc
+++ b/chrome/browser/net/system_network_context_manager.cc
@@ -609,6 +609,9 @@ SystemNetworkContextManager::~SystemNetworkContextManager() {
@@ -609,6 +609,14 @@ SystemNetworkContextManager::~SystemNetworkContextManager() {
void SystemNetworkContextManager::RegisterPrefs(PrefRegistrySimple* registry) {
StubResolverConfigReader::RegisterPrefs(registry);
+#if BUILDFLAG(IS_ANDROID)
+ registry->RegisterBooleanPref(prefs::kAdBlockEnabled, true);
+#else
+ registry->RegisterBooleanPref(prefs::kAdBlockEnabled, false);
+#endif
+ registry->RegisterStringPref(prefs::kAdBlockFiltersURL,
+ "https://www.bromite.org/filters/filters.dat");
+
@@ -705,12 +730,14 @@ diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chro
diff --git a/chrome/common/pref_names.h b/chrome/common/pref_names.h
--- a/chrome/common/pref_names.h
+++ b/chrome/common/pref_names.h
@@ -2625,6 +2625,9 @@ inline constexpr char kAudioCaptureAllowed[] = "hardware.audio_capture_enabled";
@@ -2625,6 +2625,11 @@ inline constexpr char kAudioCaptureAllowed[] = "hardware.audio_capture_enabled";
inline constexpr char kAudioCaptureAllowedUrls[] =
"hardware.audio_capture_allowed_urls";
+// Holds the URL to an indexed subresource filters file.
+inline constexpr char kAdBlockFiltersURL[] = "adblock.filters_url";
+
+inline constexpr char kAdBlockEnabled[] = "adblock.enabled";
+
// A pref holding the value of the policy used to explicitly allow or deny
// access to video capture devices. When enabled or not set, the user is
@@ -756,7 +783,7 @@ diff --git a/components/component_updater/adblock_updater_service.cc b/component
new file mode 100644
--- /dev/null
+++ b/components/component_updater/adblock_updater_service.cc
@@ -0,0 +1,268 @@
@@ -0,0 +1,281 @@
+/*
+ This file is part of Bromite.
+
@@ -800,9 +827,16 @@ new file mode 100644
+ next_check_delay = 60*60*24*7, // 1 week
+ on_demand_check_delay = 60; // minimum 1 minute between each on-demand check
+
+AdBlockUpdaterService::AdBlockUpdaterService(scoped_refptr<network::SharedURLLoaderFactory> shared_url_network_factory, std::unique_ptr<component_updater::UpdateScheduler> scheduler,
+ subresource_filter::RulesetService* ruleset_service, std::string filters_url)
+ : ruleset_service_(ruleset_service), shared_url_network_factory_(shared_url_network_factory), scheduler_(std::move(scheduler)) {
+AdBlockUpdaterService::AdBlockUpdaterService(
+ scoped_refptr<network::SharedURLLoaderFactory> shared_url_network_factory,
+ std::unique_ptr<component_updater::UpdateScheduler> scheduler,
+ subresource_filter::RulesetService* ruleset_service,
+ bool enabled,
+ std::string filters_url)
+ : ruleset_service_(ruleset_service),
+ shared_url_network_factory_(shared_url_network_factory),
+ scheduler_(std::move(scheduler)),
+ enabled_(enabled) {
+ DCHECK(ruleset_service);
+
+ filters_url_ = filters_url;
@@ -861,6 +895,11 @@ new file mode 100644
+bool AdBlockUpdaterService::OnDemandUpdateAsNeeded(bool is_foreground, Callback on_finished) {
+ DCHECK(thread_checker_.CalledOnValidThread());
+
+ if (!enabled_) {
+ LOG(INFO) << "AdBlockUpdaterService: update is disabled.";
+ return false;
+ }
+
+ // Check if the request is too early
+ if (!last_update_.is_null()) {
+ base::TimeDelta delta =
@@ -940,22 +979,23 @@ new file mode 100644
+ }
+
+ last_update_ = base::TimeTicks::Now();
+ auto task = base::MakeRefCounted<DownloadFiltersTask>(
+ shared_url_network_factory_,
+ is_foreground, filters_url_,
+ min_last_modified,
+ base::BindOnce(&AdBlockUpdaterService::OnUpdateComplete, base::Unretained(this),
+ std::move(on_finished)));
+ if (!filters_url_.empty()) {
+ auto task = base::MakeRefCounted<DownloadFiltersTask>(
+ shared_url_network_factory_,
+ is_foreground, filters_url_,
+ min_last_modified,
+ base::BindOnce(&AdBlockUpdaterService::OnUpdateComplete, base::Unretained(this),
+ std::move(on_finished)));
+
+ // run task now; task is responsible for downloading the filters (if Last-Modified header is more recent)
+ // and then clearing the 'is_updating' status
+ base::SequencedTaskRunner::GetCurrentDefault()->PostTask(FROM_HERE,
+ base::BindOnce(&DownloadFiltersTask::Run, base::Unretained(task.get())));
+ tasks_.insert(task);
+
+ base::SequencedTaskRunner::GetCurrentDefault()->PostTask(
+ FROM_HERE, base::BindOnce(&AdBlockUpdaterService::NotifyObservers, base::Unretained(this), Event::ADBLOCK_UPDATE_DOWNLOADING));
+ // run task now; task is responsible for downloading the filters (if Last-Modified header is more recent)
+ // and then clearing the 'is_updating' status
+ base::SequencedTaskRunner::GetCurrentDefault()->PostTask(FROM_HERE,
+ base::BindOnce(&DownloadFiltersTask::Run, base::Unretained(task.get())));
+ tasks_.insert(task);
+
+ base::SequencedTaskRunner::GetCurrentDefault()->PostTask(
+ FROM_HERE, base::BindOnce(&AdBlockUpdaterService::NotifyObservers, base::Unretained(this), Event::ADBLOCK_UPDATE_DOWNLOADING));
+ }
+ return true;
+}
+
@@ -1029,7 +1069,7 @@ diff --git a/components/component_updater/adblock_updater_service.h b/components
new file mode 100644
--- /dev/null
+++ b/components/component_updater/adblock_updater_service.h
@@ -0,0 +1,98 @@
@@ -0,0 +1,103 @@
+/*
+ This file is part of Bromite.
+
@@ -1085,8 +1125,12 @@ new file mode 100644
+// All methods are safe to call ONLY from the browser's main thread.
+class AdBlockUpdaterService {
+ public:
+ AdBlockUpdaterService(scoped_refptr<network::SharedURLLoaderFactory> shared_url_network_factory, std::unique_ptr<component_updater::UpdateScheduler> scheduler,
+ subresource_filter::RulesetService* ruleset_service, std::string filters_url);
+ AdBlockUpdaterService(
+ scoped_refptr<network::SharedURLLoaderFactory> shared_url_network_factory,
+ std::unique_ptr<component_updater::UpdateScheduler> scheduler,
+ subresource_filter::RulesetService* ruleset_service,
+ bool enabled,
+ std::string filters_url);
+ ~AdBlockUpdaterService();
+
+ // Adds an observer for this class. An observer should not be added more
@@ -1120,6 +1164,7 @@ new file mode 100644
+ scoped_refptr<network::SharedURLLoaderFactory> shared_url_network_factory_;
+ std::unique_ptr<component_updater::UpdateScheduler> scheduler_;
+
+ bool enabled_;
+ bool is_updating_ = false;
+ bool scheduled_ = false;
+ std::set<scoped_refptr<DownloadFiltersTask>> tasks_;