From: csagan5 <32685696+csagan5@users.noreply.github.com>
Date: Sat, 14 Sep 2019 10:20:08 +0200
Subject: Bromite AdBlockUpdaterService
Add option to configure the ad blocker filters URL
Disable look-alike, metrics, ablation and navigation throttles
Do not use experiments to enable/disable presets
Always enable ad filtering
Download filters by checking Last-Modified header first
Fix RestoreForeignSessionTab by recreating the tab (issue #681)
---
chrome/android/chrome_java_resources.gni | 2 +
chrome/android/chrome_java_sources.gni | 2 +
.../java/res/layout/adblock_editor.xml | 67 +++++
chrome/android/java/res/values/values.xml | 2 +
.../java/res/xml/adblock_preferences.xml | 25 ++
.../android/java/res/xml/main_preferences.xml | 5 +
.../browser/settings/AdBlockEditor.java | 92 +++++++
.../browser/settings/AdBlockPreferences.java | 61 +++++
.../chrome/browser/tabmodel/TabModelImpl.java | 2 +-
chrome/app/generated_resources.grd | 10 +
chrome/browser/after_startup_task_utils.cc | 5 +
chrome/browser/browser_process.h | 7 +
chrome/browser/browser_process_impl.cc | 29 ++
chrome/browser/browser_process_impl.h | 3 +
chrome/browser/chrome_browser_main.cc | 2 +
.../browser/chrome_content_browser_client.cc | 16 --
.../flags/android/cached_feature_flags.cc | 11 +
.../browser/flags/CachedFeatureFlags.java | 10 +
.../net/system_network_context_manager.cc | 4 +
.../sessions/session_restore_android.cc | 4 +-
.../strings/android_chrome_strings.grd | 14 +
chrome/common/pref_names.cc | 3 +
chrome/common/pref_names.h | 1 +
components/component_updater/BUILD.gn | 6 +
.../adblock_updater_service.cc | 248 ++++++++++++++++++
.../adblock_updater_service.h | 100 +++++++
.../download_filters_task.cc | 222 ++++++++++++++++
.../component_updater/download_filters_task.h | 129 +++++++++
...ent_subresource_filter_throttle_manager.cc | 11 +
.../content/browser/ruleset_service.cc | 33 ++-
.../content/browser/ruleset_service.h | 7 +-
.../content/browser/ruleset_version.h | 4 +
.../browser/verified_ruleset_dealer.cc | 3 +
.../browser/subresource_filter_features.cc | 113 +-------
.../core/common/common_features.cc | 2 +-
.../navigation_throttle_runner.cc | 5 -
36 files changed, 1120 insertions(+), 140 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
create mode 100644 chrome/android/java/src/org/chromium/chrome/browser/settings/AdBlockPreferences.java
create mode 100644 components/component_updater/adblock_updater_service.cc
create mode 100644 components/component_updater/adblock_updater_service.h
create mode 100644 components/component_updater/download_filters_task.cc
create mode 100644 components/component_updater/download_filters_task.h
diff --git a/chrome/android/chrome_java_resources.gni b/chrome/android/chrome_java_resources.gni
--- a/chrome/android/chrome_java_resources.gni
+++ b/chrome/android/chrome_java_resources.gni
@@ -781,6 +781,7 @@ chrome_java_resources = [
"java/res/layout/account_picker_new_account_row_legacy.xml",
"java/res/layout/account_picker_row.xml",
"java/res/layout/account_picker_row_legacy.xml",
+ "java/res/layout/adblock_editor.xml",
"java/res/layout/add_languages_main.xml",
"java/res/layout/add_to_homescreen_dialog.xml",
"java/res/layout/add_to_menu_dialog.xml",
@@ -1046,6 +1047,7 @@ chrome_java_resources = [
"java/res/xml/about_chrome_preferences.xml",
"java/res/xml/accessibility_preferences.xml",
"java/res/xml/account_management_preferences.xml",
+ "java/res/xml/adblock_preferences.xml",
"java/res/xml/autofill_assistant_preferences.xml",
"java/res/xml/autofill_server_profile_preferences.xml",
"java/res/xml/bookmark_widget_info.xml",
diff --git a/chrome/android/chrome_java_sources.gni b/chrome/android/chrome_java_sources.gni
--- a/chrome/android/chrome_java_sources.gni
+++ b/chrome/android/chrome_java_sources.gni
@@ -1300,6 +1300,8 @@ chrome_java_sources = [
"java/src/org/chromium/chrome/browser/payments/ui/ShoppingCart.java",
"java/src/org/chromium/chrome/browser/permissions/PermissionSettingsBridge.java",
"java/src/org/chromium/chrome/browser/photo_picker/DecoderServiceImpl.java",
+ "java/src/org/chromium/chrome/browser/settings/AdBlockEditor.java",
+ "java/src/org/chromium/chrome/browser/settings/AdBlockPreferences.java",
"java/src/org/chromium/chrome/browser/policy/EnterpriseInfo.java",
"java/src/org/chromium/chrome/browser/policy/PolicyAuditor.java",
"java/src/org/chromium/chrome/browser/prerender/ChromePrerenderServiceImpl.java",
diff --git a/chrome/android/java/res/layout/adblock_editor.xml b/chrome/android/java/res/layout/adblock_editor.xml
new file mode 100644
--- /dev/null
+++ b/chrome/android/java/res/layout/adblock_editor.xml
@@ -0,0 +1,67 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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
@@ -32,6 +32,8 @@
0
1
+ https://www.bromite.org/custom-filters
+
Proxy configuration
chrome://proxy
diff --git a/chrome/android/java/res/xml/adblock_preferences.xml b/chrome/android/java/res/xml/adblock_preferences.xml
new file mode 100644
--- /dev/null
+++ b/chrome/android/java/res/xml/adblock_preferences.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
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
+++ b/chrome/android/java/res/xml/main_preferences.xml
@@ -64,6 +64,11 @@
android:key="privacy"
android:order="12"
android:title="@string/prefs_privacy"/>
+
{
+ WebsitePreferenceBridge.setCategoryEnabled(browserContextHandle, ContentSettingsType.ADS, !(boolean) newValue);
+ return true;
+ });
+
+ mAdBlockEdit = findPreference(PREF_ADBLOCK_EDIT);
+ updateCurrentAdBlockUrl();
+ }
+
+ private void updateCurrentAdBlockUrl() {
+ mAdBlockEdit.setSummary(CachedFeatureFlags.getAdBlockFiltersURL());
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ updateCurrentAdBlockUrl();
+ }
+}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelImpl.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelImpl.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelImpl.java
@@ -815,7 +815,7 @@ public class TabModelImpl extends TabModelJniBridge {
Tab parent, Profile profile, WebContents webContents) {
return getTabCreator(profile.isOffTheRecord())
.createTabWithWebContents(
- parent, webContents, TabLaunchType.FROM_LONGPRESS_BACKGROUND);
+ parent, webContents, TabLaunchType.FROM_LINK);
}
@Override
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd
--- a/chrome/app/generated_resources.grd
+++ b/chrome/app/generated_resources.grd
@@ -10242,6 +10242,16 @@ Please help our engineers fix this problem. Tell us what happened right before y
Never show this again.
+
+
+
+ Ad Blocking
+
+
+ Configure Ad Blocking and filters URL
+
+
+
Ads blocked on this site
diff --git a/chrome/browser/after_startup_task_utils.cc b/chrome/browser/after_startup_task_utils.cc
--- a/chrome/browser/after_startup_task_utils.cc
+++ b/chrome/browser/after_startup_task_utils.cc
@@ -36,6 +36,8 @@
#include "ui/views/linux_ui/linux_ui.h"
#endif
+#include "chrome/browser/browser_process.h"
+
using content::BrowserThread;
using content::WebContents;
using content::WebContentsObserver;
@@ -138,6 +140,9 @@ void SetBrowserStartupIsComplete() {
g_after_startup_tasks.Get().clear();
g_after_startup_tasks.Get().shrink_to_fit();
+ // initialize scheduled updates for the AdBlock updater
+ g_browser_process->adblock_updater()->Start();
+
#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
// Make sure we complete the startup notification sequence, or launchers will
// get confused by not receiving the expected message from the main process.
diff --git a/chrome/browser/browser_process.h b/chrome/browser/browser_process.h
--- a/chrome/browser/browser_process.h
+++ b/chrome/browser/browser_process.h
@@ -21,6 +21,7 @@
#include "build/build_config.h"
#include "chrome/common/buildflags.h"
#include "media/media_buildflags.h"
+#include "components/component_updater/adblock_updater_service.h"
class BackgroundModeManager;
class BrowserProcessPlatformPart;
@@ -66,6 +67,10 @@ class ComponentUpdateService;
class SupervisedUserWhitelistInstaller;
}
+namespace adblock_updater {
+class AdBlockUpdaterService;
+}
+
namespace extensions {
class EventRouterForwarder;
}
@@ -244,6 +249,8 @@ class BrowserProcess {
virtual component_updater::ComponentUpdateService* component_updater() = 0;
+ virtual adblock_updater::AdBlockUpdaterService* adblock_updater() = 0;
+
#if BUILDFLAG(ENABLE_SUPERVISED_USERS)
virtual component_updater::SupervisedUserWhitelistInstaller*
supervised_user_whitelist_installer() = 0;
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
@@ -1047,6 +1047,35 @@ BrowserProcessImpl::component_updater() {
return component_updater_.get();
}
+adblock_updater::AdBlockUpdaterService*
+BrowserProcessImpl::adblock_updater() {
+ if (adblock_updater_)
+ return adblock_updater_.get();
+
+ if (!BrowserThread::CurrentlyOn(BrowserThread::UI))
+ return nullptr;
+
+ std::unique_ptr scheduler;
+#if defined(OS_ANDROID)
+ if (base::FeatureList::IsEnabled(
+ chrome::android::kBackgroundTaskComponentUpdate) &&
+ component_updater::BackgroundTaskUpdateScheduler::IsAvailable()) {
+ scheduler =
+ std::make_unique();
+ }
+#endif
+ if (!scheduler)
+ scheduler = std::make_unique();
+
+ adblock_updater_ = std::make_unique(
+ g_browser_process->system_network_context_manager()->GetSharedURLLoaderFactory(),
+ std::move(scheduler),
+ g_browser_process->subresource_filter_ruleset_service(),
+ local_state()->GetString(prefs::kAdBlockFiltersURL));
+
+ return adblock_updater_.get();
+}
+
#if BUILDFLAG(ENABLE_SUPERVISED_USERS)
component_updater::SupervisedUserWhitelistInstaller*
BrowserProcessImpl::supervised_user_whitelist_installer() {
diff --git a/chrome/browser/browser_process_impl.h b/chrome/browser/browser_process_impl.h
--- a/chrome/browser/browser_process_impl.h
+++ b/chrome/browser/browser_process_impl.h
@@ -183,6 +183,7 @@ class BrowserProcessImpl : public BrowserProcess,
#endif
component_updater::ComponentUpdateService* component_updater() override;
+ adblock_updater::AdBlockUpdaterService* adblock_updater() override;
#if BUILDFLAG(ENABLE_SUPERVISED_USERS)
component_updater::SupervisedUserWhitelistInstaller*
supervised_user_whitelist_installer() override;
@@ -367,6 +368,8 @@ class BrowserProcessImpl : public BrowserProcess,
// but some users of component updater only install per-user.
std::unique_ptr component_updater_;
+ std::unique_ptr adblock_updater_;
+
#if BUILDFLAG(ENABLE_SUPERVISED_USERS)
std::unique_ptr
supervised_user_whitelist_installer_;
diff --git a/chrome/browser/chrome_browser_main.cc b/chrome/browser/chrome_browser_main.cc
--- a/chrome/browser/chrome_browser_main.cc
+++ b/chrome/browser/chrome_browser_main.cc
@@ -1594,6 +1594,8 @@ int ChromeBrowserMainParts::PreMainMessageLoopRunImpl() {
if (!parsed_command_line().HasSwitch(switches::kDisableComponentUpdate)) {
component_updater::RegisterComponentsForUpdate(profile_->IsOffTheRecord(),
profile_->GetPrefs());
+ // force initialisation
+ g_browser_process->adblock_updater();
}
variations::VariationsService* variations_service =
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc
--- a/chrome/browser/chrome_content_browser_client.cc
+++ b/chrome/browser/chrome_content_browser_client.cc
@@ -68,7 +68,6 @@
#include "chrome/browser/hid/chrome_hid_delegate.h"
#include "chrome/browser/interstitials/enterprise_util.h"
#include "chrome/browser/lifetime/browser_shutdown.h"
-#include "chrome/browser/lookalikes/lookalike_url_navigation_throttle.h"
#include "chrome/browser/media/audio_service_util.h"
#include "chrome/browser/media/router/media_router_feature.h"
#include "chrome/browser/media/webrtc/audio_debug_recordings_handler.h"
@@ -231,7 +230,6 @@
#include "components/no_state_prefetch/common/prerender_types.mojom.h"
#include "components/no_state_prefetch/common/prerender_url_loader_throttle.h"
#include "components/no_state_prefetch/common/prerender_util.h"
-#include "components/page_load_metrics/browser/metrics_navigation_throttle.h"
#include "components/page_load_metrics/browser/metrics_web_contents_observer.h"
#include "components/payments/content/payment_request_display_manager.h"
#include "components/performance_manager/embedder/performance_manager_registry.h"
@@ -3919,16 +3917,6 @@ ChromeContentBrowserClient::CreateThrottlesForNavigation(
content::NavigationHandle* handle) {
std::vector> throttles;
- // MetricsNavigationThrottle requires that it runs before NavigationThrottles
- // that may delay or cancel navigations, so only NavigationThrottles that
- // don't delay or cancel navigations (e.g. throttles that are only observing
- // callbacks without affecting navigation behavior) should be added before
- // MetricsNavigationThrottle.
- if (handle->IsInMainFrame()) {
- throttles.push_back(
- page_load_metrics::MetricsNavigationThrottle::Create(handle));
- }
-
#if defined(OS_CHROMEOS)
MaybeAddThrottle(
chromeos::WebTimeLimitNavigationThrottle::MaybeCreateThrottleFor(handle),
@@ -4037,10 +4025,6 @@ ChromeContentBrowserClient::CreateThrottlesForNavigation(
&throttles);
#endif
- MaybeAddThrottle(
- LookalikeUrlNavigationThrottle::MaybeCreateNavigationThrottle(handle),
- &throttles);
-
MaybeAddThrottle(PDFIFrameNavigationThrottle::MaybeCreateThrottleFor(handle),
&throttles);
diff --git a/chrome/browser/flags/android/cached_feature_flags.cc b/chrome/browser/flags/android/cached_feature_flags.cc
--- a/chrome/browser/flags/android/cached_feature_flags.cc
+++ b/chrome/browser/flags/android/cached_feature_flags.cc
@@ -8,6 +8,9 @@
#include "base/android/jni_string.h"
#include "base/feature_list.h"
+#include "chrome/browser/browser_process.h"
+#include "chrome/common/pref_names.h"
+#include "components/prefs/pref_service.h"
#include "content/public/common/content_features.h"
#include "content/public/common/network_service_util.h"
@@ -41,3 +44,11 @@ static jboolean JNI_CachedFeatureFlags_IsNetworkServiceWarmUpEnabled(
return content::IsOutOfProcessNetworkService() &&
base::FeatureList::IsEnabled(features::kWarmUpNetworkProcess);
}
+
+static ScopedJavaLocalRef JNI_CachedFeatureFlags_GetAdBlockFiltersURL(JNIEnv* env) {
+ return base::android::ConvertUTF8ToJavaString(env, g_browser_process->local_state()->GetString(prefs::kAdBlockFiltersURL));
+}
+
+static void JNI_CachedFeatureFlags_SetAdBlockFiltersURL(JNIEnv* env, const JavaParamRef& url) {
+ g_browser_process->local_state()->SetString(prefs::kAdBlockFiltersURL, base::android::ConvertJavaStringToUTF8(env, url));
+}
diff --git a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/CachedFeatureFlags.java b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/CachedFeatureFlags.java
--- a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/CachedFeatureFlags.java
+++ b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/CachedFeatureFlags.java
@@ -250,6 +250,14 @@ public class CachedFeatureFlags {
ChromeFeatureList.REACHED_CODE_PROFILER, "sampling_interval_us", 0));
}
+ public static void setAdBlockFiltersURL(String url) {
+ CachedFeatureFlagsJni.get().setAdBlockFiltersURL(url);
+ }
+
+ public static String getAdBlockFiltersURL() {
+ return CachedFeatureFlagsJni.get().getAdBlockFiltersURL();
+ }
+
/**
* Caches flags that must take effect on startup but are set via native code.
*/
@@ -402,5 +410,7 @@ public class CachedFeatureFlags {
@NativeMethods
interface Natives {
boolean isNetworkServiceWarmUpEnabled();
+ void setAdBlockFiltersURL(String url);
+ String getAdBlockFiltersURL();
}
}
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
@@ -333,6 +333,8 @@ SystemNetworkContextManager::SystemNetworkContextManager(
SSLConfigServiceManager::CreateDefaultManager(local_state_)),
proxy_config_monitor_(local_state_),
stub_resolver_config_reader_(local_state_) {
+ local_state_->SetDefaultPrefValue(prefs::kAdBlockFiltersURL,
+ base::Value("https://www.bromite.org/filters/filters.dat"));
#if !defined(OS_ANDROID)
// QuicAllowed was not part of Android policy.
const base::Value* value =
@@ -397,6 +399,8 @@ SystemNetworkContextManager::~SystemNetworkContextManager() {
void SystemNetworkContextManager::RegisterPrefs(PrefRegistrySimple* registry) {
StubResolverConfigReader::RegisterPrefs(registry);
+ registry->RegisterStringPref(prefs::kAdBlockFiltersURL, std::string());
+
// Static auth params
registry->RegisterStringPref(prefs::kAuthSchemes,
"basic,digest,ntlm,negotiate");
diff --git a/chrome/browser/sessions/session_restore_android.cc b/chrome/browser/sessions/session_restore_android.cc
--- a/chrome/browser/sessions/session_restore_android.cc
+++ b/chrome/browser/sessions/session_restore_android.cc
@@ -43,7 +43,9 @@ content::WebContents* SessionRestore::RestoreForeignSessionTab(
TabAndroid* current_tab = TabAndroid::FromWebContents(web_contents);
DCHECK(current_tab);
if (disposition == WindowOpenDisposition::CURRENT_TAB) {
- current_tab->SwapWebContents(std::move(new_web_contents), false, false);
+ int active_tab_index = tab_model->GetActiveIndex();
+ tab_model->CreateTab(current_tab, new_web_contents.release());
+ tab_model->CloseTabAt(active_tab_index);
} else {
DCHECK(disposition == WindowOpenDisposition::NEW_FOREGROUND_TAB ||
disposition == WindowOpenDisposition::NEW_BACKGROUND_TAB);
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
@@ -214,6 +214,20 @@ CHAR-LIMIT guidelines:
Enter VR
+
+
+ AdBlock settings
+
+
+ Edit filters URL
+
+
+ Filters URL
+
+
+ Visit help page
+
+
General
diff --git a/chrome/common/pref_names.cc b/chrome/common/pref_names.cc
--- a/chrome/common/pref_names.cc
+++ b/chrome/common/pref_names.cc
@@ -2120,6 +2120,9 @@ const char kAudioCaptureAllowed[] = "hardware.audio_capture_enabled";
// capture devices without prompt.
const char kAudioCaptureAllowedUrls[] = "hardware.audio_capture_allowed_urls";
+// Holds the URL to an indexed subresource filters file.
+const char kAdBlockFiltersURL[] = "adblock.filters_url";
+
// 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
// prompted for device access. When disabled, access to video capture devices
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
@@ -31,6 +31,7 @@ extern const char kDownloadRestrictions[];
extern const char kForceEphemeralProfiles[];
extern const char kHomePageIsNewTabPage[];
extern const char kHomePage[];
+extern const char kAdBlockFiltersURL[];
extern const char kImportantSitesDialogHistory[];
extern const char kProfileCreationTime[];
#if defined(OS_WIN)
diff --git a/components/component_updater/BUILD.gn b/components/component_updater/BUILD.gn
--- a/components/component_updater/BUILD.gn
+++ b/components/component_updater/BUILD.gn
@@ -10,6 +10,12 @@ static_library("component_updater") {
"component_updater_command_line_config_policy.h",
"component_updater_paths.cc",
"component_updater_paths.h",
+
+ "adblock_updater_service.cc",
+ "adblock_updater_service.h",
+ "download_filters_task.cc",
+ "download_filters_task.h",
+
"component_updater_service.cc",
"component_updater_service.h",
"component_updater_service_internal.h",
diff --git a/components/component_updater/adblock_updater_service.cc b/components/component_updater/adblock_updater_service.cc
new file mode 100644
--- /dev/null
+++ b/components/component_updater/adblock_updater_service.cc
@@ -0,0 +1,248 @@
+/*
+ This file is part of Bromite.
+
+ Bromite is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ Bromite is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Bromite. If not, see .
+*/
+
+#include "components/component_updater/adblock_updater_service.h"
+
+#include
+#include