From dee3870e45f630acae7d0364926ee3f3a3993da6 Mon Sep 17 00:00:00 2001 From: Carmelo Messina Date: Wed, 6 Dec 2023 13:36:46 +0100 Subject: [PATCH] decoupled activation flag with adblock site setting first step towards completely deactivating the functionality --- .../Bromite-subresource-adblocker.patch | 151 ++++++++++++------ 1 file changed, 98 insertions(+), 53 deletions(-) diff --git a/build/patches/Bromite-subresource-adblocker.patch b/build/patches/Bromite-subresource-adblocker.patch index 70b8688d..4dd13d47 100644 --- a/build/patches/Bromite-subresource-adblocker.patch +++ b/build/patches/Bromite-subresource-adblocker.patch @@ -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. true ++ Autoupdate enabled ++ Autoupdate disabled + https://www.bromite.org/custom-filters + Proxy configuration @@ -235,19 +237,19 @@ new file mode 100644 + + -+ -+ ++ android:summaryOn="@string/adblock_on" ++ android:summaryOff="@string/adblock_off" /> + + + ++ ++ + 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 shared_url_network_factory, std::unique_ptr 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 shared_url_network_factory, ++ std::unique_ptr 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( -+ 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( ++ 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 shared_url_network_factory, std::unique_ptr scheduler, -+ subresource_filter::RulesetService* ruleset_service, std::string filters_url); ++ AdBlockUpdaterService( ++ scoped_refptr shared_url_network_factory, ++ std::unique_ptr 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 shared_url_network_factory_; + std::unique_ptr scheduler_; + ++ bool enabled_; + bool is_updating_ = false; + bool scheduled_ = false; + std::set> tasks_;