瀏覽代碼

Patches for next release 88.0.4324.207

csagan5 4 年之前
父節點
當前提交
973ede4ad1

+ 2 - 0
build/GN_ARGS

@@ -21,6 +21,7 @@ enable_platform_hevc=true
 enable_remoting=false
 enable_remoting=false
 enable_reporting=true
 enable_reporting=true
 enable_vr=false
 enable_vr=false
+exclude_unwind_tables=false
 ffmpeg_branding="Chrome"
 ffmpeg_branding="Chrome"
 fieldtrial_testing_like_official_build=true
 fieldtrial_testing_like_official_build=true
 icu_use_data_file=true
 icu_use_data_file=true
@@ -37,5 +38,6 @@ use_errorprone_java_compiler=false
 use_gnome_keyring=false
 use_gnome_keyring=false
 use_official_google_api_keys=false
 use_official_google_api_keys=false
 use_openh264=true
 use_openh264=true
+use_rtti=false
 use_sysroot=false
 use_sysroot=false
 webview_includes_weblayer=false
 webview_includes_weblayer=false

+ 1 - 1
build/RELEASE

@@ -1 +1 @@
-88.0.4324.187
+88.0.4324.207

+ 2 - 0
build/bromite_patches_list.txt

@@ -158,4 +158,6 @@ Ignore-enterprise-policies-for-secure-DNS.patch
 Fix-favicons-fallback-search.patch
 Fix-favicons-fallback-search.patch
 Enable-app-overflow-menu-icons-by-default.patch
 Enable-app-overflow-menu-icons-by-default.patch
 Add-menu-item-to-bookmark-all-tabs.patch
 Add-menu-item-to-bookmark-all-tabs.patch
+Add-flag-for-save-data-header.patch
+Add-option-to-force-tablet-UI.patch
 Automated-domain-substitution.patch
 Automated-domain-substitution.patch

+ 7 - 6
build/patches/Add-exit-menu-item.patch

@@ -4,27 +4,28 @@ Subject: Add exit menu item
 
 
 Corrected Exit functionality
 Corrected Exit functionality
 ---
 ---
- chrome/android/java/res/menu/main_menu.xml                  | 4 ++++
+ chrome/android/java/res/menu/main_menu.xml                  | 5 +++++
  chrome/android/java/res/menu/main_menu_regroup.xml          | 3 +++
  chrome/android/java/res/menu/main_menu_regroup.xml          | 3 +++
  .../org/chromium/chrome/browser/ChromeTabbedActivity.java   | 3 +++
  .../org/chromium/chrome/browser/ChromeTabbedActivity.java   | 3 +++
  .../src/org/chromium/chrome/browser/app/ChromeActivity.java | 6 ++++++
  .../src/org/chromium/chrome/browser/app/ChromeActivity.java | 6 ++++++
  .../chrome/browser/init/ChromeLifetimeController.java       | 6 +++++-
  .../chrome/browser/init/ChromeLifetimeController.java       | 6 +++++-
  .../browser/ui/android/strings/android_chrome_strings.grd   | 3 +++
  .../browser/ui/android/strings/android_chrome_strings.grd   | 3 +++
- 6 files changed, 24 insertions(+), 1 deletion(-)
+ 6 files changed, 25 insertions(+), 1 deletion(-)
 
 
 diff --git a/chrome/android/java/res/menu/main_menu.xml b/chrome/android/java/res/menu/main_menu.xml
 diff --git a/chrome/android/java/res/menu/main_menu.xml b/chrome/android/java/res/menu/main_menu.xml
 --- a/chrome/android/java/res/menu/main_menu.xml
 --- a/chrome/android/java/res/menu/main_menu.xml
 +++ b/chrome/android/java/res/menu/main_menu.xml
 +++ b/chrome/android/java/res/menu/main_menu.xml
-@@ -119,6 +119,8 @@
+@@ -119,6 +119,9 @@
              android:icon="@drawable/vr_headset" />
              android:icon="@drawable/vr_headset" />
          <item android:id="@+id/managed_by_menu_id"
          <item android:id="@+id/managed_by_menu_id"
              android:title="@string/managed" />
              android:title="@string/managed" />
 +        <item android:id="@+id/exit_id"
 +        <item android:id="@+id/exit_id"
-+            android:title="@string/menu_exit" />
++            android:title="@string/menu_exit"
++            android:icon="@drawable/ic_exit_to_app_white_24dp" />
      </group>
      </group>
  
  
      <!-- Items shown only in the tab switcher -->
      <!-- Items shown only in the tab switcher -->
-@@ -153,6 +155,8 @@
+@@ -153,6 +156,8 @@
          <item android:id="@id/preferences_id"
          <item android:id="@id/preferences_id"
              android:title="@string/menu_settings"
              android:title="@string/menu_settings"
              android:icon="@drawable/settings_cog" />
              android:icon="@drawable/settings_cog" />
@@ -42,7 +43,7 @@ diff --git a/chrome/android/java/res/menu/main_menu_regroup.xml b/chrome/android
              android:title="@string/managed" />
              android:title="@string/managed" />
 +        <item android:id="@+id/exit_id"
 +        <item android:id="@+id/exit_id"
 +            android:title="@string/menu_exit"
 +            android:title="@string/menu_exit"
-+            android:icon="@drawable/ic_exit_to_app_white_24dp"/>
++            android:icon="@drawable/ic_exit_to_app_white_24dp" />
      </group>
      </group>
  
  
      <!-- Items shown only in the tab switcher -->
      <!-- Items shown only in the tab switcher -->

+ 99 - 0
build/patches/Add-flag-for-save-data-header.patch

@@ -0,0 +1,99 @@
+From: Wengling Chen <feiyu2817@gmail.com>
+Date: Mon, 1 Feb 2021 19:18:55 +0200
+Subject: Add flag for save-data-header
+
+---
+ chrome/browser/about_flags.cc                                | 4 ++++
+ chrome/browser/flag_descriptions.cc                          | 4 ++++
+ chrome/browser/flag_descriptions.h                           | 3 +++
+ content/browser/loader/browser_initiated_resource_request.cc | 5 +++--
+ services/network/public/cpp/features.cc                      | 4 ++++
+ services/network/public/cpp/features.h                       | 2 ++
+ 6 files changed, 20 insertions(+), 2 deletions(-)
+
+diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
+--- a/chrome/browser/about_flags.cc
++++ b/chrome/browser/about_flags.cc
+@@ -4302,6 +4302,10 @@ const FeatureEntry kFeatureEntries[] = {
+      flag_descriptions::kDisableKeepaliveFetchDescription, kOsAll,
+      FEATURE_VALUE_TYPE(network::features::kDisableKeepaliveFetch)},
+ 
++    {"enable-save-data-header", flag_descriptions::kEnableSaveDataHeaderName,
++     flag_descriptions::kEnableSaveDataHeaderDescription, kOsAndroid,
++     FEATURE_VALUE_TYPE(network::features::kEnableSaveDataHeader)},
++
+     {"delay-async-script-execution",
+      flag_descriptions::kDelayAsyncScriptExecutionName,
+      flag_descriptions::kDelayAsyncScriptExecutionDescription, kOsAll,
+diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc
+--- a/chrome/browser/flag_descriptions.cc
++++ b/chrome/browser/flag_descriptions.cc
+@@ -904,6 +904,10 @@ const char kDisableKeepaliveFetchDescription[] =
+     "Disable fetch with keepalive set "
+     "(https://fetch.spec.whatwg.org/#request-keepalive-flag).";
+ 
++const char kEnableSaveDataHeaderName[] = "Enable save-data header";
++const char kEnableSaveDataHeaderDescription[] =
++    "Enable save-data header without enabling Data Saver.";
++
+ const char kExperimentalAccessibilityLanguageDetectionName[] =
+     "Experimental accessibility language detection";
+ const char kExperimentalAccessibilityLanguageDetectionDescription[] =
+diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h
+--- a/chrome/browser/flag_descriptions.h
++++ b/chrome/browser/flag_descriptions.h
+@@ -510,6 +510,9 @@ extern const char kDiagnosticsAppDescription[];
+ extern const char kDisableKeepaliveFetchName[];
+ extern const char kDisableKeepaliveFetchDescription[];
+ 
++extern const char kEnableSaveDataHeaderName[];
++extern const char kEnableSaveDataHeaderDescription[];
++
+ extern const char kMemlogName[];
+ extern const char kMemlogDescription[];
+ extern const char kMemlogModeMinimal[];
+diff --git a/content/browser/loader/browser_initiated_resource_request.cc b/content/browser/loader/browser_initiated_resource_request.cc
+--- a/content/browser/loader/browser_initiated_resource_request.cc
++++ b/content/browser/loader/browser_initiated_resource_request.cc
+@@ -40,9 +40,10 @@ void UpdateAdditionalHeadersForBrowserInitiatedRequest(
+ 
+   // Set the Save-Data header if appropriate.
+   // https://tools.ietf.org/html/draft-grigorik-http-client-hints-03#section-7
+-  if (GetContentClient()->browser()->IsDataSaverEnabled(browser_context) &&
++  if ((GetContentClient()->browser()->IsDataSaverEnabled(browser_context) &&
+       !base::GetFieldTrialParamByFeatureAsBool(features::kDataSaverHoldback,
+-                                               "holdback_web", false)) {
++                                               "holdback_web", false)) ||
++      base::FeatureList::IsEnabled(network::features::kEnableSaveDataHeader)) {
+     if (should_update_existing_headers) {
+       headers->RemoveHeader("Save-Data");
+     }
+diff --git a/services/network/public/cpp/features.cc b/services/network/public/cpp/features.cc
+--- a/services/network/public/cpp/features.cc
++++ b/services/network/public/cpp/features.cc
+@@ -150,6 +150,10 @@ const base::FeatureParam<std::string>
+ const base::Feature kDisableKeepaliveFetch{"DisableKeepaliveFetch",
+                                            base::FEATURE_DISABLED_BY_DEFAULT};
+ 
++// Enable save-data header seprately, without enabled data reduction service
++const base::Feature kEnableSaveDataHeader{"EnableSaveDataHeader",
++                                           base::FEATURE_DISABLED_BY_DEFAULT};
++
+ // Attach the origin of the destination URL to the "origin" header
+ const base::Feature
+     kDeriveOriginFromUrlForNeitherGetNorHeadRequestWhenHavingSpecialAccess{
+diff --git a/services/network/public/cpp/features.h b/services/network/public/cpp/features.h
+--- a/services/network/public/cpp/features.h
++++ b/services/network/public/cpp/features.h
+@@ -58,6 +58,8 @@ extern const base::FeatureParam<std::string>
+ COMPONENT_EXPORT(NETWORK_CPP)
+ extern const base::Feature kDisableKeepaliveFetch;
+ COMPONENT_EXPORT(NETWORK_CPP)
++extern const base::Feature kEnableSaveDataHeader;
++COMPONENT_EXPORT(NETWORK_CPP)
+ extern const base::Feature
+     kDeriveOriginFromUrlForNeitherGetNorHeadRequestWhenHavingSpecialAccess;
+ COMPONENT_EXPORT(NETWORK_CPP)
+-- 
+2.17.1
+

+ 24 - 24
build/patches/Add-menu-item-to-bookmark-all-tabs.patch

@@ -24,39 +24,39 @@ Subject: Add menu item to bookmark all tabs
 diff --git a/chrome/android/java/res/menu/main_menu.xml b/chrome/android/java/res/menu/main_menu.xml
 diff --git a/chrome/android/java/res/menu/main_menu.xml b/chrome/android/java/res/menu/main_menu.xml
 --- a/chrome/android/java/res/menu/main_menu.xml
 --- a/chrome/android/java/res/menu/main_menu.xml
 +++ b/chrome/android/java/res/menu/main_menu.xml
 +++ b/chrome/android/java/res/menu/main_menu.xml
-@@ -119,6 +119,9 @@
-             android:icon="@drawable/vr_headset" />
-         <item android:id="@+id/managed_by_menu_id"
-             android:title="@string/managed" />
+@@ -57,6 +57,9 @@
+         <item android:id="@+id/all_bookmarks_menu_id"
+             android:title="@string/menu_bookmarks"
+             android:icon="@drawable/btn_star_filled" />
 +        <item android:id="@+id/bookmark_all_tabs_menu_id"
 +        <item android:id="@+id/bookmark_all_tabs_menu_id"
 +            android:title="@string/menu_bookmark_all_tabs"
 +            android:title="@string/menu_bookmark_all_tabs"
 +            android:icon="@drawable/ic_folder_blue_24dp" />
 +            android:icon="@drawable/ic_folder_blue_24dp" />
-         <item android:id="@+id/exit_id"
-             android:title="@string/menu_exit" />
-     </group>
-@@ -155,6 +158,9 @@
-         <item android:id="@id/preferences_id"
-             android:title="@string/menu_settings"
-             android:icon="@drawable/settings_cog" />
+         <item android:id="@+id/recent_tabs_menu_id"
+             android:title="@string/menu_recent_tabs"
+             android:icon="@drawable/devices_black_24dp" />
+@@ -154,6 +157,9 @@
+                 android:checkable="true" />
+           </menu>
+         </item>
 +        <item android:id="@+id/bookmark_all_tabs_menu_id"
 +        <item android:id="@+id/bookmark_all_tabs_menu_id"
 +            android:title="@string/menu_bookmark_all_tabs"
 +            android:title="@string/menu_bookmark_all_tabs"
 +            android:icon="@drawable/ic_folder_blue_24dp" />
 +            android:icon="@drawable/ic_folder_blue_24dp" />
-         <item android:id="@+id/exit_id"
-             android:title="@string/menu_exit" />
-     </group>
+         <item android:id="@id/preferences_id"
+             android:title="@string/menu_settings"
+             android:icon="@drawable/settings_cog" />
 diff --git a/chrome/android/java/res/menu/main_menu_regroup.xml b/chrome/android/java/res/menu/main_menu_regroup.xml
 diff --git a/chrome/android/java/res/menu/main_menu_regroup.xml b/chrome/android/java/res/menu/main_menu_regroup.xml
 --- a/chrome/android/java/res/menu/main_menu_regroup.xml
 --- a/chrome/android/java/res/menu/main_menu_regroup.xml
 +++ b/chrome/android/java/res/menu/main_menu_regroup.xml
 +++ b/chrome/android/java/res/menu/main_menu_regroup.xml
-@@ -184,6 +184,9 @@
-             android:icon="@drawable/vr_headset" />
-         <item android:id="@+id/managed_by_menu_id"
-             android:title="@string/managed" />
-+        <item android:id="@+id/bookmark_all_tabs_menu_id"
-+            android:title="@string/menu_bookmark_all_tabs"
-+            android:icon="@drawable/ic_folder_blue_24dp" />
-         <item android:id="@+id/exit_id"
-             android:title="@string/menu_exit"
-             android:icon="@drawable/ic_exit_to_app_white_24dp"/>
+@@ -32,6 +32,9 @@
+                 android:title="@string/accessibility_menu_bookmark"
+                 android:titleCondensed="@string/menu_bookmark"
+                 android:icon="@drawable/btn_star"/>
++              <item android:id="@+id/bookmark_all_tabs_menu_id"
++                android:title="@string/menu_bookmark_all_tabs"
++                android:icon="@drawable/ic_folder_blue_24dp" />
+               <item android:id="@+id/offline_page_id"
+                 android:title="@string/download_page"
+                 android:titleCondensed="@string/menu_download"
 diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
 diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
 --- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
 --- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
 +++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
 +++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java

+ 6 - 5
build/patches/Add-menu-item-to-view-source.patch

@@ -4,14 +4,14 @@ Subject: Add menu item to view source
 
 
 ---
 ---
  chrome/android/java/res/menu/custom_tabs_menu.xml  |  3 +++
  chrome/android/java/res/menu/custom_tabs_menu.xml  |  3 +++
- chrome/android/java/res/menu/main_menu.xml         |  2 ++
+ chrome/android/java/res/menu/main_menu.xml         |  3 +++
  chrome/android/java/res/menu/main_menu_regroup.xml |  3 +++
  chrome/android/java/res/menu/main_menu_regroup.xml |  3 +++
  .../chrome/browser/ChromeTabbedActivity.java       |  2 ++
  .../chrome/browser/ChromeTabbedActivity.java       |  2 ++
  .../chrome/browser/app/ChromeActivity.java         |  2 ++
  .../chrome/browser/app/ChromeActivity.java         |  2 ++
  .../app/appmenu/AppMenuPropertiesDelegateImpl.java | 14 ++++++++++++++
  .../app/appmenu/AppMenuPropertiesDelegateImpl.java | 14 ++++++++++++++
  .../CustomTabAppMenuPropertiesDelegate.java        |  1 +
  .../CustomTabAppMenuPropertiesDelegate.java        |  1 +
  .../ui/android/strings/android_chrome_strings.grd  |  3 +++
  .../ui/android/strings/android_chrome_strings.grd  |  3 +++
- 8 files changed, 30 insertions(+)
+ 8 files changed, 31 insertions(+)
 
 
 diff --git a/chrome/android/java/res/menu/custom_tabs_menu.xml b/chrome/android/java/res/menu/custom_tabs_menu.xml
 diff --git a/chrome/android/java/res/menu/custom_tabs_menu.xml b/chrome/android/java/res/menu/custom_tabs_menu.xml
 --- a/chrome/android/java/res/menu/custom_tabs_menu.xml
 --- a/chrome/android/java/res/menu/custom_tabs_menu.xml
@@ -29,12 +29,13 @@ diff --git a/chrome/android/java/res/menu/custom_tabs_menu.xml b/chrome/android/
 diff --git a/chrome/android/java/res/menu/main_menu.xml b/chrome/android/java/res/menu/main_menu.xml
 diff --git a/chrome/android/java/res/menu/main_menu.xml b/chrome/android/java/res/menu/main_menu.xml
 --- a/chrome/android/java/res/menu/main_menu.xml
 --- a/chrome/android/java/res/menu/main_menu.xml
 +++ b/chrome/android/java/res/menu/main_menu.xml
 +++ b/chrome/android/java/res/menu/main_menu.xml
-@@ -91,6 +91,8 @@
+@@ -91,6 +91,9 @@
          <item android:id="@+id/add_to_homescreen_id"
          <item android:id="@+id/add_to_homescreen_id"
              android:title="@string/menu_add_to_homescreen"
              android:title="@string/menu_add_to_homescreen"
              android:icon="@drawable/ic_add_to_home_screen" />
              android:icon="@drawable/ic_add_to_home_screen" />
 +        <item android:id="@+id/view_source_id"
 +        <item android:id="@+id/view_source_id"
-+            android:title="@string/view_source" />
++            android:title="@string/view_source"
++            android:icon="@drawable/default_favicon" />
          <item android:id="@+id/open_webapk_id"
          <item android:id="@+id/open_webapk_id"
              android:title="@string/menu_open_webapk"
              android:title="@string/menu_open_webapk"
              android:icon="@drawable/ic_add_to_home_screen" />
              android:icon="@drawable/ic_add_to_home_screen" />
@@ -47,7 +48,7 @@ diff --git a/chrome/android/java/res/menu/main_menu_regroup.xml b/chrome/android
              android:icon="@drawable/ic_add_to_home_screen" />
              android:icon="@drawable/ic_add_to_home_screen" />
 +        <item android:id="@+id/view_source_id"
 +        <item android:id="@+id/view_source_id"
 +            android:title="@string/view_source"
 +            android:title="@string/view_source"
-+            android:icon="@drawable/ic_drive_document_24dp" />
++            android:icon="@drawable/default_favicon" />
          <item android:id="@+id/open_webapk_id"
          <item android:id="@+id/open_webapk_id"
              android:title="@string/menu_open_webapk"
              android:title="@string/menu_open_webapk"
              android:icon="@drawable/ic_add_to_home_screen" />
              android:icon="@drawable/ic_add_to_home_screen" />

+ 172 - 0
build/patches/Add-option-to-force-tablet-UI.patch

@@ -0,0 +1,172 @@
+From: Wengling Chen <feiyu2817@gmail.com>
+Date: Mon, 1 Feb 2021 19:18:55 +0200
+Subject: Add option to force tablet UI
+
+---
+ .../android/java/res/xml/accessibility_preferences.xml |  5 +++++
+ .../accessibility/settings/AccessibilitySettings.java  | 10 ++++++++++
+ .../browser/toolbar/top/ToolbarControlContainer.java   |  2 +-
+ .../browser/preferences/ChromePreferenceKeys.java      |  1 +
+ .../preferences/GrandfatheredChromePreferenceKeys.java |  1 +
+ .../ui/android/strings/android_chrome_strings.grd      |  6 ++++++
+ components/BUILD.gn                                    |  4 ++--
+ ui/android/BUILD.gn                                    |  1 +
+ .../src/org/chromium/ui/base/DeviceFormFactor.java     |  5 +++++
+ 9 files changed, 32 insertions(+), 3 deletions(-)
+
+diff --git a/chrome/android/java/res/xml/accessibility_preferences.xml b/chrome/android/java/res/xml/accessibility_preferences.xml
+--- a/chrome/android/java/res/xml/accessibility_preferences.xml
++++ b/chrome/android/java/res/xml/accessibility_preferences.xml
+@@ -29,6 +29,11 @@
+         android:key="captions"
+         android:title="@string/accessibility_captions_title"/>
+ 
++    <org.chromium.components.browser_ui.settings.ChromeBaseCheckBoxPreference
++        android:key="force_tablet_ui"
++        android:summary="@string/force_tablet_ui_summary"
++        android:title="@string/force_tablet_ui_title" />
++
+     <Preference
+         android:fragment="org.chromium.chrome.browser.image_descriptions.ImageDescriptionsSettings"
+         android:key="image_descriptions"
+diff --git a/chrome/android/java/src/org/chromium/chrome/browser/accessibility/settings/AccessibilitySettings.java b/chrome/android/java/src/org/chromium/chrome/browser/accessibility/settings/AccessibilitySettings.java
+--- a/chrome/android/java/src/org/chromium/chrome/browser/accessibility/settings/AccessibilitySettings.java
++++ b/chrome/android/java/src/org/chromium/chrome/browser/accessibility/settings/AccessibilitySettings.java
+@@ -35,6 +35,7 @@ public class AccessibilitySettings
+     static final String PREF_CAPTIONS = "captions";
+     static final String PREF_IMAGE_DESCRIPTIONS = "image_descriptions";
+ 
++    static final String PREF_FORCE_TABLET_UI = "force_tablet_ui";
+     private TextScalePreference mTextScalePref;
+     private ChromeBaseCheckBoxPreference mForceEnableZoomPref;
+     private boolean mRecordFontSizeChangeOnStop;
+@@ -80,6 +81,12 @@ public class AccessibilitySettings
+                                                       .getBoolean(Pref.READER_FOR_ACCESSIBILITY));
+         readerForAccessibilityPref.setOnPreferenceChangeListener(this);
+ 
++        ChromeBaseCheckBoxPreference forceTabletUiPref =
++                (ChromeBaseCheckBoxPreference) findPreference(PREF_FORCE_TABLET_UI);
++        forceTabletUiPref.setChecked(SharedPreferencesManager.getInstance().readBoolean(
++                            ChromePreferenceKeys.FLAGS_FORCE_TABLET_UI_ENABLED, false));
++        forceTabletUiPref.setOnPreferenceChangeListener(this);
++
+         ChromeBaseCheckBoxPreference mAccessibilityTabSwitcherPref =
+                 (ChromeBaseCheckBoxPreference) findPreference(
+                         ChromePreferenceKeys.ACCESSIBILITY_TAB_SWITCHER);
+@@ -131,6 +138,9 @@ public class AccessibilitySettings
+             mFontSizePrefs.setUserFontScaleFactor((Float) newValue);
+         } else if (PREF_FORCE_ENABLE_ZOOM.equals(preference.getKey())) {
+             mFontSizePrefs.setForceEnableZoomFromUser((Boolean) newValue);
++        } else if (PREF_FORCE_TABLET_UI.equals(preference.getKey())) {
++            SharedPreferencesManager.getInstance().writeBoolean(
++                ChromePreferenceKeys.FLAGS_FORCE_TABLET_UI_ENABLED, (Boolean) newValue);
+         } else if (PREF_READER_FOR_ACCESSIBILITY.equals(preference.getKey())) {
+             UserPrefs.get(Profile.getLastUsedRegularProfile())
+                     .setBoolean(Pref.READER_FOR_ACCESSIBILITY, (Boolean) newValue);
+diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarControlContainer.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarControlContainer.java
+--- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarControlContainer.java
++++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarControlContainer.java
+@@ -110,7 +110,7 @@ public class ToolbarControlContainer extends OptimizedFrameLayout implements Con
+             // On tablet, draw a fake tab strip and toolbar until the compositor is
+             // ready to draw the real tab strip. (On phone, the toolbar is made entirely
+             // of Android views, which are already initialized.)
+-            setBackgroundResource(R.drawable.toolbar_background);
++//             setBackgroundResource(R.drawable.toolbar_background);
+         }
+     }
+ 
+diff --git a/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceKeys.java b/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceKeys.java
+--- a/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceKeys.java
++++ b/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceKeys.java
+@@ -441,6 +441,7 @@ public final class ChromePreferenceKeys {
+     public static final String FONT_USER_SET_FORCE_ENABLE_ZOOM = "user_set_force_enable_zoom";
+ 
+     public static final String HISTORY_SHOW_HISTORY_INFO = "history_home_show_info";
++    public static final String FLAGS_FORCE_TABLET_UI_ENABLED = "force_tablet_ui_enabled";
+ 
+     /** Keys used to save settings related to homepage. */
+     public static final String HOMEPAGE_CUSTOM_URI = "homepage_custom_uri";
+diff --git a/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/GrandfatheredChromePreferenceKeys.java b/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/GrandfatheredChromePreferenceKeys.java
+--- a/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/GrandfatheredChromePreferenceKeys.java
++++ b/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/GrandfatheredChromePreferenceKeys.java
+@@ -100,6 +100,7 @@ public class GrandfatheredChromePreferenceKeys {
+                 ChromePreferenceKeys.FLAGS_CACHED_SWAP_PIXEL_FORMAT_TO_FIX_CONVERT_FROM_TRANSLUCENT,
+                 ChromePreferenceKeys.FLAGS_CACHED_TAB_GROUPS_ANDROID_ENABLED,
+                 ChromePreferenceKeys.FONT_USER_FONT_SCALE_FACTOR,
++                ChromePreferenceKeys.FLAGS_FORCE_TABLET_UI_ENABLED,
+                 ChromePreferenceKeys.FONT_USER_SET_FORCE_ENABLE_ZOOM,
+                 ChromePreferenceKeys.HISTORY_SHOW_HISTORY_INFO,
+                 ChromePreferenceKeys.HOMEPAGE_CUSTOM_URI,
+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
+@@ -1140,6 +1140,12 @@ Your Google account may have other forms of browsing history like searches and a
+       <message name="IDS_SAFE_BROWSING_NO_PROTECTION_CONFIRMATION_DIALOG_CONFIRM" desc="Message for Safe Browsing no protection confirmation button.">
+         Turn off
+       </message>
++      <message name="IDS_FORCE_TABLET_UI_SUMMARY" desc="Summary of the preference that allows the user to force chromium to use tablet UI.">
++       Open chromium in Tablet Mode
++      </message>
++      <message name="IDS_FORCE_TABLET_UI_TITLE" desc="Title of the preference that allows the user to update force tablet UI settings.">
++        Force Tablet Mode
++      </message>
+ 
+       <!-- Accessibility preferences -->
+       <message name="IDS_PREFS_ACCESSIBILITY" desc="Title of Accessibility settings, which allows the user to change webpage font sizes. [CHAR-LIMIT=32]">
+diff --git a/components/BUILD.gn b/components/BUILD.gn
+--- a/components/BUILD.gn
++++ b/components/BUILD.gn
+@@ -475,7 +475,7 @@ test("components_unittests") {
+ 
+   # On LaCrOS, tests use ash-chrome as a window manager, thus the dependency.
+   # On other platforms, no components should depend on Chrome.
+-  if (!chromeos_is_browser_only) {
++  if (!chromeos_is_browser_only && !is_android) {
+     assert_no_deps = [ "//chrome/*" ]
+   }
+ 
+@@ -719,7 +719,7 @@ if (!is_ios && !is_fuchsia) {
+ 
+     # On LaCrOS, tests use ash-chrome as a window manager, thus the dependency.
+     # On other platforms, no components should depend on Chrome.
+-    if (!chromeos_is_browser_only) {
++    if (!chromeos_is_browser_only && !is_android) {
+       assert_no_deps = [ "//chrome/*" ]
+     }
+   }
+diff --git a/ui/android/BUILD.gn b/ui/android/BUILD.gn
+--- a/ui/android/BUILD.gn
++++ b/ui/android/BUILD.gn
+@@ -359,6 +359,7 @@ android_library("ui_no_recycler_view_java") {
+     ":ui_utils_java",
+     "//base:base_java",
+     "//base:jni_java",
++    "//chrome/browser/preferences:java",
+     "//third_party/android_deps:androidx_annotation_annotation_java",
+     "//third_party/android_deps:androidx_appcompat_appcompat_java",
+     "//third_party/android_deps:androidx_appcompat_appcompat_resources_java",
+diff --git a/ui/android/java/src/org/chromium/ui/base/DeviceFormFactor.java b/ui/android/java/src/org/chromium/ui/base/DeviceFormFactor.java
+--- a/ui/android/java/src/org/chromium/ui/base/DeviceFormFactor.java
++++ b/ui/android/java/src/org/chromium/ui/base/DeviceFormFactor.java
+@@ -11,6 +11,8 @@ import androidx.annotation.UiThread;
+ import org.chromium.base.ContextUtils;
+ import org.chromium.base.ThreadUtils;
+ import org.chromium.base.annotations.CalledByNative;
++import org.chromium.chrome.browser.preferences.ChromePreferenceKeys;
++import org.chromium.chrome.browser.preferences.SharedPreferencesManager;
+ import org.chromium.ui.R;
+ import org.chromium.ui.display.DisplayAndroid;
+ import org.chromium.ui.display.DisplayUtil;
+@@ -60,6 +62,9 @@ public class DeviceFormFactor {
+      *         E.g. http://developer.samsung.com/samsung-dex/testing
+      */
+     public static boolean isNonMultiDisplayContextOnTablet(Context context) {
++        if (SharedPreferencesManager.getInstance().readBoolean(
++                ChromePreferenceKeys.FLAGS_FORCE_TABLET_UI_ENABLED, false))
++            return true;
+         return detectScreenWidthBucket(context) >= SCREEN_BUCKET_TABLET;
+     }
+ 
+-- 
+2.17.1
+

+ 11 - 11
build/patches/Automated-domain-substitution.patch

@@ -5300,7 +5300,7 @@ diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descripti
      "extension-content-script-fetches";
      "extension-content-script-fetches";
  
  
  const char kCrossOriginOpenerPolicyReportingName[] =
  const char kCrossOriginOpenerPolicyReportingName[] =
-@@ -1990,7 +1990,7 @@ const char kIntensiveWakeUpThrottlingName[] =
+@@ -1994,7 +1994,7 @@ const char kIntensiveWakeUpThrottlingName[] =
  const char kIntensiveWakeUpThrottlingDescription[] =
  const char kIntensiveWakeUpThrottlingDescription[] =
      "When enabled, wake ups from DOM Timers are limited to 1 per minute in a "
      "When enabled, wake ups from DOM Timers are limited to 1 per minute in a "
      "page that has been hidden for 5 minutes. For additional details, see "
      "page that has been hidden for 5 minutes. For additional details, see "
@@ -8149,7 +8149,7 @@ diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chro
        </message>
        </message>
        <message name="IDS_ANDROID_HISTORY_BLOCKED_SITE" desc="The text displayed in the history page indicating that a visit to a web site was blocked due to an administrator policy.">
        <message name="IDS_ANDROID_HISTORY_BLOCKED_SITE" desc="The text displayed in the history page indicating that a visit to a web site was blocked due to an administrator policy.">
          Blocked site
          Blocked site
-@@ -1347,7 +1347,7 @@ Your Google account may have other forms of browsing history like searches and a
+@@ -1353,7 +1353,7 @@ Your Google account may have other forms of browsing history like searches and a
          In Lite mode, Chrome loads pages faster and uses up to 60 percent less data. To optimize the pages that you visit, Chrome sends your web traffic to Google. <ph name="BEGIN_LINK">&lt;link&gt;</ph>Learn more<ph name="END_LINK">&lt;/link&gt;</ph>
          In Lite mode, Chrome loads pages faster and uses up to 60 percent less data. To optimize the pages that you visit, Chrome sends your web traffic to Google. <ph name="BEGIN_LINK">&lt;link&gt;</ph>Learn more<ph name="END_LINK">&lt;/link&gt;</ph>
        </message>
        </message>
        <message name="IDS_DATA_REDUCTION_PROMO_LEARN_MORE_URL" desc="URL for Lite mode help center article" translateable="false">
        <message name="IDS_DATA_REDUCTION_PROMO_LEARN_MORE_URL" desc="URL for Lite mode help center article" translateable="false">
@@ -8158,7 +8158,7 @@ diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chro
        </message>
        </message>
        <message name="IDS_DATA_REDUCTION_ENABLE_BUTTON_LITE_MODE" desc="Button the user presses if they want to enable Lite mode" >
        <message name="IDS_DATA_REDUCTION_ENABLE_BUTTON_LITE_MODE" desc="Button the user presses if they want to enable Lite mode" >
          Turn on Lite mode
          Turn on Lite mode
-@@ -1516,10 +1516,10 @@ Your Google account may have other forms of browsing history like searches and a
+@@ -1522,10 +1522,10 @@ Your Google account may have other forms of browsing history like searches and a
          Waiting for details of parents.
          Waiting for details of parents.
        </message>
        </message>
        <message name="IDS_ACCOUNT_MANAGEMENT_ONE_PARENT_NAME" desc="String for name of single parent for child account.">
        <message name="IDS_ACCOUNT_MANAGEMENT_ONE_PARENT_NAME" desc="String for name of single parent for child account.">
@@ -8171,7 +8171,7 @@ diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chro
        </message>
        </message>
        <message name="IDS_ACCOUNT_MANAGEMENT_CHILD_CONTENT_TITLE" desc="Title of the Content setting, which controls which websites a child is allowed to visit.">
        <message name="IDS_ACCOUNT_MANAGEMENT_CHILD_CONTENT_TITLE" desc="Title of the Content setting, which controls which websites a child is allowed to visit.">
          Content
          Content
-@@ -1578,22 +1578,22 @@ Your Google account may have other forms of browsing history like searches and a
+@@ -1584,22 +1584,22 @@ Your Google account may have other forms of browsing history like searches and a
          Google Terms of Service
          Google Terms of Service
        </message>
        </message>
        <message name="IDS_GOOGLE_TERMS_OF_SERVICE_URL" desc="URL for Google terms of service" translateable="false">
        <message name="IDS_GOOGLE_TERMS_OF_SERVICE_URL" desc="URL for Google terms of service" translateable="false">
@@ -8198,7 +8198,7 @@ diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chro
        </message>
        </message>
  
  
        <!-- Sign-in strings -->
        <!-- Sign-in strings -->
-@@ -1610,7 +1610,7 @@ Your Google account may have other forms of browsing history like searches and a
+@@ -1616,7 +1616,7 @@ Your Google account may have other forms of browsing history like searches and a
          Also clear your Chrome data from this device
          Also clear your Chrome data from this device
        </message>
        </message>
        <message name="IDS_SIGNOUT_MANAGED_ACCOUNT_MESSAGE" desc="Message to display for sign out of Chrome dialog when the account has enterprise management, and all user data will be erased">
        <message name="IDS_SIGNOUT_MANAGED_ACCOUNT_MESSAGE" desc="Message to display for sign out of Chrome dialog when the account has enterprise management, and all user data will be erased">
@@ -8207,7 +8207,7 @@ diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chro
        </message>
        </message>
        <message name="IDS_SIGN_IN_GETTING_ACCOUNT_MANAGEMENT_POLICY" desc="Title of progress bar dialog for getting management policy">
        <message name="IDS_SIGN_IN_GETTING_ACCOUNT_MANAGEMENT_POLICY" desc="Title of progress bar dialog for getting management policy">
          Contacting Google. This may take a minute…
          Contacting Google. This may take a minute…
-@@ -1758,7 +1758,7 @@ To change this setting, <ph name="BEGIN_LINK">&lt;resetlink&gt;</ph>reset sync<p
+@@ -1764,7 +1764,7 @@ To change this setting, <ph name="BEGIN_LINK">&lt;resetlink&gt;</ph>reset sync<p
  
  
        <!-- Bluetooth Picker UI strings -->
        <!-- Bluetooth Picker UI strings -->
        <message name="IDS_BLUETOOTH_DIALOG_TITLE" desc="The header message shown on top of the dialog that lets the user pick a Bluetooth device for the site to pair with. Shown above a list of Bluetooth devices discovered. ">
        <message name="IDS_BLUETOOTH_DIALOG_TITLE" desc="The header message shown on top of the dialog that lets the user pick a Bluetooth device for the site to pair with. Shown above a list of Bluetooth devices discovered. ">
@@ -8216,7 +8216,7 @@ diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chro
        <message name="IDS_BLUETOOTH_SEARCHING" desc="The message shown in the Bluetooth picker dialog while scanning for devices.">
        <message name="IDS_BLUETOOTH_SEARCHING" desc="The message shown in the Bluetooth picker dialog while scanning for devices.">
          <ph name="BEGIN_LINK">&lt;link&gt;</ph>Get help<ph name="END_LINK">&lt;/link&gt;</ph> while scanning for devices…
          <ph name="BEGIN_LINK">&lt;link&gt;</ph>Get help<ph name="END_LINK">&lt;/link&gt;</ph> while scanning for devices…
        </message>
        </message>
-@@ -1803,7 +1803,7 @@ To change this setting, <ph name="BEGIN_LINK">&lt;resetlink&gt;</ph>reset sync<p
+@@ -1809,7 +1809,7 @@ To change this setting, <ph name="BEGIN_LINK">&lt;resetlink&gt;</ph>reset sync<p
  
  
        <!-- Bluetooth Scanning Prompt strings -->
        <!-- Bluetooth Scanning Prompt strings -->
        <message name="IDS_BLUETOOTH_SCANNING_PROMPT_ORIGIN" desc="The label that is used to introduce Bluetooth scanning prompt details to the user when it is from a website.">
        <message name="IDS_BLUETOOTH_SCANNING_PROMPT_ORIGIN" desc="The label that is used to introduce Bluetooth scanning prompt details to the user when it is from a website.">
@@ -8225,7 +8225,7 @@ diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chro
        </message>
        </message>
        <message name="IDS_BLUETOOTH_SCANNING_DEVICE_UNKNOWN" desc="Text to identify Bluetooth devices of unknown or unsupported class.">
        <message name="IDS_BLUETOOTH_SCANNING_DEVICE_UNKNOWN" desc="Text to identify Bluetooth devices of unknown or unsupported class.">
          Unknown or unsupported device (<ph name="DEVICE_ID">%1$s<ex>A1:B2:C3:D4:E5:F6</ex></ph>)
          Unknown or unsupported device (<ph name="DEVICE_ID">%1$s<ex>A1:B2:C3:D4:E5:F6</ex></ph>)
-@@ -2262,7 +2262,7 @@ To change this setting, <ph name="BEGIN_LINK">&lt;resetlink&gt;</ph>reset sync<p
+@@ -2268,7 +2268,7 @@ To change this setting, <ph name="BEGIN_LINK">&lt;resetlink&gt;</ph>reset sync<p
          This page may differ from the online version.
          This page may differ from the online version.
        </message>
        </message>
        <message name="IDS_PAGE_INFO_PREVIEW_LOAD_ORIGINAL" desc="This text, when clicked, loads the original page from its origin without any treatments. This text is shown in the page info bubble when the currently viewed page has been modified to be a lighter and faster version of the original page.">
        <message name="IDS_PAGE_INFO_PREVIEW_LOAD_ORIGINAL" desc="This text, when clicked, loads the original page from its origin without any treatments. This text is shown in the page info bubble when the currently viewed page has been modified to be a lighter and faster version of the original page.">
@@ -8234,7 +8234,7 @@ diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chro
        </message>
        </message>
        <message name="IDS_PAGE_INFO_CONNECTION_PAINT_PREVIEW" desc="Message to display in the page info bubble when viewing a preview of a page.">
        <message name="IDS_PAGE_INFO_CONNECTION_PAINT_PREVIEW" desc="Message to display in the page info bubble when viewing a preview of a page.">
          You are viewing a preview of this page
          You are viewing a preview of this page
-@@ -3575,7 +3575,7 @@ Data from your Incognito session will only be cleared from Chrome when you <ph n
+@@ -3581,7 +3581,7 @@ Data from your Incognito session will only be cleared from Chrome when you <ph n
  
  
        <!-- WebUsb Picker UI strings -->
        <!-- WebUsb Picker UI strings -->
        <message name="IDS_USB_CHOOSER_DIALOG_PROMPT" desc="The text that is used to introduce the USB chooser dialog to the user.">
        <message name="IDS_USB_CHOOSER_DIALOG_PROMPT" desc="The text that is used to introduce the USB chooser dialog to the user.">
@@ -8243,7 +8243,7 @@ diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chro
        </message>
        </message>
        <message name="IDS_USB_CHOOSER_DIALOG_NO_DEVICES_FOUND_PROMPT" desc="The label shown to the user to inform them that no USB devices were found matching the requirements that the application provided.">
        <message name="IDS_USB_CHOOSER_DIALOG_NO_DEVICES_FOUND_PROMPT" desc="The label shown to the user to inform them that no USB devices were found matching the requirements that the application provided.">
          No compatible devices found
          No compatible devices found
-@@ -3614,7 +3614,7 @@ Data from your Incognito session will only be cleared from Chrome when you <ph n
+@@ -3620,7 +3620,7 @@ Data from your Incognito session will only be cleared from Chrome when you <ph n
          Running in Chrome
          Running in Chrome
        </message>
        </message>
        <message name="IDS_TWA_RUNNING_IN_CHROME_V2" desc="Updated message on a snackbar indicating that the current Activity may use Chrome data (the rest of the app may not be).">
        <message name="IDS_TWA_RUNNING_IN_CHROME_V2" desc="Updated message on a snackbar indicating that the current Activity may use Chrome data (the rest of the app may not be).">
@@ -8252,7 +8252,7 @@ diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chro
        </message>
        </message>
        <message name="IDS_GOT_IT" desc="Button for the user to accept a disclosure/message">
        <message name="IDS_GOT_IT" desc="Button for the user to accept a disclosure/message">
          Got it
          Got it
-@@ -3869,7 +3869,7 @@ Data from your Incognito session will only be cleared from Chrome when you <ph n
+@@ -3875,7 +3875,7 @@ Data from your Incognito session will only be cleared from Chrome when you <ph n
          Sending to <ph name="device_name">%1$s<ex>Tanya's Pixel 2</ex></ph>...
          Sending to <ph name="device_name">%1$s<ex>Tanya's Pixel 2</ex></ph>...
        </message>
        </message>
        <message name="IDS_SEND_TAB_TO_SELF_NOTIFICATION_CONTEXT_TEXT" desc="Text displayed as the second line of a notification indicating the domain and the device the tab is shared from.">
        <message name="IDS_SEND_TAB_TO_SELF_NOTIFICATION_CONTEXT_TEXT" desc="Text displayed as the second line of a notification indicating the domain and the device the tab is shared from.">

+ 88 - 140
build/patches/Bromite-AdBlockUpdaterService.patch

@@ -13,11 +13,11 @@ Fix RestoreForeignSessionTab by recreating the tab (issue #681)
  chrome/android/chrome_java_sources.gni        |   2 +
  chrome/android/chrome_java_sources.gni        |   2 +
  .../java/res/layout/adblock_editor.xml        |  67 ++++
  .../java/res/layout/adblock_editor.xml        |  67 ++++
  chrome/android/java/res/values/values.xml     |   2 +
  chrome/android/java/res/values/values.xml     |   2 +
- .../java/res/xml/adblock_preferences.xml      |  43 ++
+ .../java/res/xml/adblock_preferences.xml      |  43 +++
  .../android/java/res/xml/main_preferences.xml |   5 +
  .../android/java/res/xml/main_preferences.xml |   5 +
- .../chrome/browser/app/ChromeActivity.java    |  21 +
+ .../chrome/browser/app/ChromeActivity.java    |  21 ++
  .../browser/settings/AdBlockEditor.java       |  93 +++++
  .../browser/settings/AdBlockEditor.java       |  93 +++++
- .../browser/settings/AdBlockPreferences.java  | 173 ++++++++
+ .../browser/settings/AdBlockPreferences.java  | 173 +++++++++
  .../chrome/browser/tabmodel/TabModelImpl.java |   2 +-
  .../chrome/browser/tabmodel/TabModelImpl.java |   2 +-
  chrome/app/generated_resources.grd            |  46 +++
  chrome/app/generated_resources.grd            |  46 +++
  chrome/browser/after_startup_task_utils.cc    |   5 +
  chrome/browser/after_startup_task_utils.cc    |   5 +
@@ -27,19 +27,18 @@ Fix RestoreForeignSessionTab by recreating the tab (issue #681)
  chrome/browser/chrome_browser_main.cc         |   2 +
  chrome/browser/chrome_browser_main.cc         |   2 +
  .../browser/chrome_content_browser_client.cc  |  16 -
  .../browser/chrome_content_browser_client.cc  |  16 -
  chrome/browser/flags/BUILD.gn                 |  14 +-
  chrome/browser/flags/BUILD.gn                 |  14 +-
- .../flags/android/adblock_updater_bridge.cc   | 101 +++++
+ .../flags/android/adblock_updater_bridge.cc   | 101 ++++++
  .../flags/android/adblock_updater_bridge.h    |  33 ++
  .../flags/android/adblock_updater_bridge.h    |  33 ++
- .../flags/android/cached_feature_flags.cc     |   1 +
  .../flags/android/cached_feature_flags.h      |   2 +
  .../flags/android/cached_feature_flags.h      |   2 +
- .../browser/flags/AdblockUpdaterBridge.java   | 105 +++++
+ .../browser/flags/AdblockUpdaterBridge.java   | 105 ++++++
  chrome/browser/prefs/browser_prefs.cc         |   1 +
  chrome/browser/prefs/browser_prefs.cc         |   1 +
  .../sessions/session_restore_android.cc       |   4 +-
  .../sessions/session_restore_android.cc       |   4 +-
  .../strings/android_chrome_strings.grd        |  14 +
  .../strings/android_chrome_strings.grd        |  14 +
  components/component_updater/BUILD.gn         |   6 +
  components/component_updater/BUILD.gn         |   6 +
- .../adblock_updater_service.cc                | 378 ++++++++++++++++++
- .../adblock_updater_service.h                 | 127 ++++++
- .../download_filters_task.cc                  | 237 +++++++++++
- .../component_updater/download_filters_task.h | 131 ++++++
+ .../adblock_updater_service.cc                | 337 ++++++++++++++++++
+ .../adblock_updater_service.h                 | 126 +++++++
+ .../download_filters_task.cc                  | 236 ++++++++++++
+ .../component_updater/download_filters_task.h | 131 +++++++
  ...ent_subresource_filter_throttle_manager.cc |  11 +
  ...ent_subresource_filter_throttle_manager.cc |  11 +
  .../content/browser/ruleset_publisher.h       |   2 +
  .../content/browser/ruleset_publisher.h       |   2 +
  .../content/browser/ruleset_publisher_impl.cc |   5 +
  .../content/browser/ruleset_publisher_impl.cc |   5 +
@@ -51,7 +50,7 @@ Fix RestoreForeignSessionTab by recreating the tab (issue #681)
  .../browser/subresource_filter_features.cc    | 113 +-----
  .../browser/subresource_filter_features.cc    | 113 +-----
  .../core/common/common_features.cc            |   2 +-
  .../core/common/common_features.cc            |   2 +-
  .../navigation_throttle_runner.cc             |   5 -
  .../navigation_throttle_runner.cc             |   5 -
- 42 files changed, 1722 insertions(+), 141 deletions(-)
+ 41 files changed, 1678 insertions(+), 141 deletions(-)
  create mode 100644 chrome/android/java/res/layout/adblock_editor.xml
  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/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/AdBlockEditor.java
@@ -474,7 +473,7 @@ new file mode 100644
 +
 +
 +        SpinnerPreference spinner = (SpinnerPreference) findPreference(PREF_ADBLOCK_FREQUENCY_SPINNER);
 +        SpinnerPreference spinner = (SpinnerPreference) findPreference(PREF_ADBLOCK_FREQUENCY_SPINNER);
 +        TimeFrequencySpinnerOption[] spinnerOptions = getTimeFrequencySpinnerOptions();
 +        TimeFrequencySpinnerOption[] spinnerOptions = getTimeFrequencySpinnerOptions();
-+        int selectedTimeFrequency = AdblockUpdaterBridge.getAdBlockUpdateTimeFrequency();
++        int selectedTimeFrequency = AdblockUpdaterBridge.getAdBlockUpdateFrequencyInDays();
 +        int spinnerOptionIndex = -1;
 +        int spinnerOptionIndex = -1;
 +        for (int i = 0; i < spinnerOptions.length; ++i) {
 +        for (int i = 0; i < spinnerOptions.length; ++i) {
 +            if (spinnerOptions[i].getDays() == selectedTimeFrequency) {
 +            if (spinnerOptions[i].getDays() == selectedTimeFrequency) {
@@ -484,7 +483,7 @@ new file mode 100644
 +        }
 +        }
 +        spinner.setOptions(spinnerOptions, spinnerOptionIndex);
 +        spinner.setOptions(spinnerOptions, spinnerOptionIndex);
 +        spinner.setOnPreferenceChangeListener((preference, newValue) -> {
 +        spinner.setOnPreferenceChangeListener((preference, newValue) -> {
-+            AdblockUpdaterBridge.setAdBlockUpdateTimeFrequency(
++            AdblockUpdaterBridge.setAdBlockUpdateFrequency(
 +                    ((TimeFrequencySpinnerOption) newValue).getDays());
 +                    ((TimeFrequencySpinnerOption) newValue).getDays());
 +            return true;
 +            return true;
 +        });
 +        });
@@ -500,7 +499,7 @@ new file mode 100644
 +        startUpdateButton.setOnPreferenceClickListener(new OnPreferenceClickListener() {
 +        startUpdateButton.setOnPreferenceClickListener(new OnPreferenceClickListener() {
 +            @Override
 +            @Override
 +            public boolean onPreferenceClick(Preference preference) {
 +            public boolean onPreferenceClick(Preference preference) {
-+                AdblockUpdaterBridge.AdBlockStartCheck(AdBlockPreferences.this);
++                AdblockUpdaterBridge.AdBlockUpdate(AdBlockPreferences.this);
 +                return true;
 +                return true;
 +            }
 +            }
 +        });
 +        });
@@ -513,7 +512,7 @@ new file mode 100644
 +        currentIndexVersion.setSummary(
 +        currentIndexVersion.setSummary(
 +            AdblockUpdaterBridge.getAdBlockMostRecentIndexedVersion() +
 +            AdblockUpdaterBridge.getAdBlockMostRecentIndexedVersion() +
 +            "\n" + getString(R.string.adblock_last_checked_text) +
 +            "\n" + getString(R.string.adblock_last_checked_text) +
-+            " "  + df.format(AdblockUpdaterBridge.getAdBlockLastUpdate()));
++            " "  + df.format(AdblockUpdaterBridge.getAdBlockLastSuccessfulUpdate()));
 +    }
 +    }
 +
 +
 +    public static String GetAdBlockMessage(@AdblockEvent int event, @AdblockError int error) {
 +    public static String GetAdBlockMessage(@AdblockEvent int event, @AdblockError int error) {
@@ -938,31 +937,31 @@ new file mode 100644
 +  return base::android::ConvertUTF8ToJavaString(env, url);
 +  return base::android::ConvertUTF8ToJavaString(env, url);
 +}
 +}
 +
 +
-+static jint JNI_AdblockUpdaterBridge_GetAdBlockUpdateTimeFrequency(JNIEnv* env) {
-+  int value = g_browser_process->adblock_updater()->GetAdBlockUpdateTimeFrequency();
++static jint JNI_AdblockUpdaterBridge_GetAdBlockUpdateFrequencyInDays(JNIEnv* env) {
++  int value = g_browser_process->adblock_updater()->GetAdBlockUpdateFrequencyInDays();
 +  return value;
 +  return value;
 +}
 +}
 +
 +
-+static void JNI_AdblockUpdaterBridge_SetAdBlockUpdateTimeFrequency(JNIEnv* env, jint days) {
-+  g_browser_process->adblock_updater()->SetAdBlockUpdateTimeFrequency(days);
++static void JNI_AdblockUpdaterBridge_SetAdBlockUpdateFrequency(JNIEnv* env, jint days) {
++  g_browser_process->adblock_updater()->SetAdBlockUpdateFrequency(days);
 +}
 +}
 +
 +
-+static jlong JNI_AdblockUpdaterBridge_GetAdBlockLastOkUpdate(JNIEnv* env) {
-+  long value = g_browser_process->adblock_updater()->GetLastOkUpdate();
++static jlong JNI_AdblockUpdaterBridge_GetAdBlockLastSuccessfulUpdate(JNIEnv* env) {
++  long value = g_browser_process->adblock_updater()->GetLastSuccessfulUpdateMs();
 +  return value;
 +  return value;
 +}
 +}
 +
 +
 +static jlong JNI_AdblockUpdaterBridge_GetAdBlockLastUpdate(JNIEnv* env) {
 +static jlong JNI_AdblockUpdaterBridge_GetAdBlockLastUpdate(JNIEnv* env) {
-+  long value = g_browser_process->adblock_updater()->GetLastUpdate();
++  long value = g_browser_process->adblock_updater()->GetLastUpdateMs();
 +  return value;
 +  return value;
 +}
 +}
 +
 +
-+static void JNI_AdblockUpdaterBridge_AdBlockStartCheckOnDemand(JNIEnv* env) {
++static void JNI_AdblockUpdaterBridge_AdBlockUpdate(JNIEnv* env) {
 +  adblock_updater::AdBlockUpdaterService* client = g_browser_process->adblock_updater();
 +  adblock_updater::AdBlockUpdaterService* client = g_browser_process->adblock_updater();
 +  if (client == nullptr) return;
 +  if (client == nullptr) return;
 +
 +
 +  JNI_AdblockUpdaterBridge_AdBlockRegisterCallback(env);
 +  JNI_AdblockUpdaterBridge_AdBlockRegisterCallback(env);
-+  client->OnDemandUpdate(adblock_updater::Callback());
++  client->OnDemandUpdate(true, adblock_updater::Callback());
 +}
 +}
 +
 +
 +static void JNI_AdblockUpdaterBridge_AdBlockRegisterCallback(JNIEnv* env) {
 +static void JNI_AdblockUpdaterBridge_AdBlockRegisterCallback(JNIEnv* env) {
@@ -1012,14 +1011,6 @@ new file mode 100644
 +}  // namespace chrome
 +}  // namespace chrome
 +
 +
 +#endif  // CHROME_BROWSER_FLAGS_ANDROID_ADBLOCK_UPDATER_BRIDGE_H_
 +#endif  // CHROME_BROWSER_FLAGS_ANDROID_ADBLOCK_UPDATER_BRIDGE_H_
-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
-@@ -41,3 +41,4 @@ static jboolean JNI_CachedFeatureFlags_IsNetworkServiceWarmUpEnabled(
-   return content::IsOutOfProcessNetworkService() &&
-          base::FeatureList::IsEnabled(features::kWarmUpNetworkProcess);
- }
-+
 diff --git a/chrome/browser/flags/android/cached_feature_flags.h b/chrome/browser/flags/android/cached_feature_flags.h
 diff --git a/chrome/browser/flags/android/cached_feature_flags.h b/chrome/browser/flags/android/cached_feature_flags.h
 --- a/chrome/browser/flags/android/cached_feature_flags.h
 --- a/chrome/browser/flags/android/cached_feature_flags.h
 +++ b/chrome/browser/flags/android/cached_feature_flags.h
 +++ b/chrome/browser/flags/android/cached_feature_flags.h
@@ -1087,20 +1078,20 @@ new file mode 100644
 +        return AdblockUpdaterBridgeJni.get().getAdBlockFiltersURL();
 +        return AdblockUpdaterBridgeJni.get().getAdBlockFiltersURL();
 +    }
 +    }
 +
 +
-+    public static int getAdBlockUpdateTimeFrequency() {
-+        return AdblockUpdaterBridgeJni.get().getAdBlockUpdateTimeFrequency();
++    public static int getAdBlockUpdateFrequencyInDays() {
++        return AdblockUpdaterBridgeJni.get().getAdBlockUpdateFrequencyInDays();
 +    }
 +    }
 +
 +
-+    public static void setAdBlockUpdateTimeFrequency(int number_of_days) {
-+        AdblockUpdaterBridgeJni.get().setAdBlockUpdateTimeFrequency(number_of_days);
++    public static void setAdBlockUpdateFrequency(int days) {
++        AdblockUpdaterBridgeJni.get().setAdBlockUpdateFrequency(days);
 +    }
 +    }
 +
 +
 +    public static String getAdBlockMostRecentIndexedVersion() {
 +    public static String getAdBlockMostRecentIndexedVersion() {
 +       return AdblockUpdaterBridgeJni.get().getAdBlockMostRecentIndexedVersion();
 +       return AdblockUpdaterBridgeJni.get().getAdBlockMostRecentIndexedVersion();
 +    }
 +    }
 +
 +
-+    public static Date getAdBlockLastOkUpdate() {
-+        long millis = AdblockUpdaterBridgeJni.get().getAdBlockLastOkUpdate();
++    public static Date getAdBlockLastSuccessfulUpdate() {
++        long millis = AdblockUpdaterBridgeJni.get().getAdBlockLastSuccessfulUpdate();
 +        return new Date(millis);
 +        return new Date(millis);
 +    }
 +    }
 +
 +
@@ -1109,9 +1100,9 @@ new file mode 100644
 +        return new Date(millis);
 +        return new Date(millis);
 +    }
 +    }
 +
 +
-+    public static void AdBlockStartCheck(AdblockCallback callback) {
++    public static void AdBlockUpdate(AdblockCallback callback) {
 +        observer = new WeakReference<AdblockCallback>(callback);
 +        observer = new WeakReference<AdblockCallback>(callback);
-+        AdblockUpdaterBridgeJni.get().adBlockStartCheckOnDemand();
++        AdblockUpdaterBridgeJni.get().adBlockUpdate();
 +    }
 +    }
 +
 +
 +    public static void AdBlockRegisterCallback(AdblockCallback callback) {
 +    public static void AdBlockRegisterCallback(AdblockCallback callback) {
@@ -1135,10 +1126,10 @@ new file mode 100644
 +        String getAdBlockFiltersURL();
 +        String getAdBlockFiltersURL();
 +        String getAdBlockMostRecentIndexedVersion();
 +        String getAdBlockMostRecentIndexedVersion();
 +        long getAdBlockLastUpdate();
 +        long getAdBlockLastUpdate();
-+        long getAdBlockLastOkUpdate();
-+        int getAdBlockUpdateTimeFrequency();
-+        void setAdBlockUpdateTimeFrequency(int number_of_days);
-+        void adBlockStartCheckOnDemand();
++        long getAdBlockLastSuccessfulUpdate();
++        int getAdBlockUpdateFrequencyInDays();
++        void setAdBlockUpdateFrequency(int number_of_days);
++        void adBlockUpdate();
 +        void adBlockRegisterCallback();
 +        void adBlockRegisterCallback();
 +    }
 +    }
 +}
 +}
@@ -1211,7 +1202,7 @@ diff --git a/components/component_updater/adblock_updater_service.cc b/component
 new file mode 100644
 new file mode 100644
 --- /dev/null
 --- /dev/null
 +++ b/components/component_updater/adblock_updater_service.cc
 +++ b/components/component_updater/adblock_updater_service.cc
-@@ -0,0 +1,378 @@
+@@ -0,0 +1,337 @@
 +/*
 +/*
 +    This file is part of Bromite.
 +    This file is part of Bromite.
 +
 +
@@ -1263,16 +1254,14 @@ new file mode 100644
 +// Holds the URL to an indexed subresource filters file.
 +// Holds the URL to an indexed subresource filters file.
 +const char kAdBlockFiltersCheckFrequency[] = "adblock.check_frequency";
 +const char kAdBlockFiltersCheckFrequency[] = "adblock.check_frequency";
 +
 +
-+// Last check time
++// Last update check time
 +const char kAdBlockLastCheckTime[] = "adblock.last_check_time";
 +const char kAdBlockLastCheckTime[] = "adblock.last_check_time";
 +
 +
-+// Last check time (only with ok)
++// Last successful update check time
 +const char kAdBlockLastCheckTimeOk[] = "adblock.last_check_time_ok";
 +const char kAdBlockLastCheckTimeOk[] = "adblock.last_check_time_ok";
 +
 +
-+// all constants express seconds
-+// these could be made configurable
-+const int initial_check_delay = 5,
-+          on_demand_check_delay = 60; // minimum 1 minute between each on-demand check
++const int initial_check_delay_in_seconds = 5,
++          defaultFiltersCheckFrequencyInDays = 7;
 +
 +
 +AdBlockUpdaterService::AdBlockUpdaterService(
 +AdBlockUpdaterService::AdBlockUpdaterService(
 +      scoped_refptr<network::SharedURLLoaderFactory> shared_url_network_factory,
 +      scoped_refptr<network::SharedURLLoaderFactory> shared_url_network_factory,
@@ -1316,34 +1305,36 @@ new file mode 100644
 +void AdBlockUpdaterService::Start() {
 +void AdBlockUpdaterService::Start() {
 +  DCHECK(thread_checker_.CalledOnValidThread());
 +  DCHECK(thread_checker_.CalledOnValidThread());
 +
 +
-+  // avoid multiple scheduling
++  // avoid multiple scheduling during browser initialization
 +  if (scheduled_)
 +  if (scheduled_)
 +    return;
 +    return;
 +  scheduled_ = true;
 +  scheduled_ = true;
 +
 +
-+  StartWithDelay(initial_check_delay);
++  StartWithDelay(initial_check_delay_in_seconds);
 +}
 +}
 +
 +
-+void AdBlockUpdaterService::StartWithDelay(int delay) {
-+  int days = GetAdBlockUpdateTimeFrequency();
-+  if (days < 0) days = 7;
-+  next_check_delay_ = 60*60*24*days;
++void AdBlockUpdaterService::StartWithDelay(int delay_in_seconds) {
++  int days = GetAdBlockUpdateFrequencyInDays();
++  if (days < 0)
++    days = defaultFiltersCheckFrequencyInDays;
++  next_check_delay_in_seconds_ = 60*60*24*days;
 +
 +
-+  if (delay <= 0) delay = next_check_delay_;
++  if (delay_in_seconds < 0)
++    delay_in_seconds = 0;
 +
 +
 +  scheduler_->Stop();
 +  scheduler_->Stop();
-+  if (next_check_delay_ == 0) {
++  if (next_check_delay_in_seconds_ == 0) {
 +    LOG(INFO) << "AdBlockUpdaterService: disabled by user.";
 +    LOG(INFO) << "AdBlockUpdaterService: disabled by user.";
 +  } else {
 +  } else {
 +    LOG(INFO) << "AdBlockUpdaterService: starting up. "
 +    LOG(INFO) << "AdBlockUpdaterService: starting up. "
 +              << "First update attempt will take place in "
 +              << "First update attempt will take place in "
-+              << delay << " seconds. "
++              << delay_in_seconds << " seconds. "
 +              << "Next update attempt will take place in "
 +              << "Next update attempt will take place in "
-+              << next_check_delay_ << " seconds. ";
++              << next_check_delay_in_seconds_ << " seconds. ";
 +
 +
 +    scheduler_->Schedule(
 +    scheduler_->Schedule(
-+        base::TimeDelta::FromSeconds(delay),
-+        base::TimeDelta::FromSeconds(next_check_delay_),
++        base::TimeDelta::FromSeconds(delay_in_seconds),
++        base::TimeDelta::FromSeconds(next_check_delay_in_seconds_),
 +        base::Bind(&AdBlockUpdaterService::OnDemandScheduledUpdate,
 +        base::Bind(&AdBlockUpdaterService::OnDemandScheduledUpdate,
 +                  base::Unretained(this)), base::DoNothing());
 +                  base::Unretained(this)), base::DoNothing());
 +  }
 +  }
@@ -1356,63 +1347,25 @@ new file mode 100644
 +         AdblockError error) { std::move(on_finished).Run(); },
 +         AdblockError error) { std::move(on_finished).Run(); },
 +      std::move(on_finished));
 +      std::move(on_finished));
 +
 +
-+  OnDemandUpdateAsNeeded(false, std::move(on_finished_callback));
-+}
-+
-+bool AdBlockUpdaterService::OnDemandUpdate(Callback on_finished) {
-+  return OnDemandUpdateAsNeeded(true, std::move(on_finished));
++  OnDemandUpdate(false, std::move(on_finished_callback));
 +}
 +}
 +
 +
-+bool AdBlockUpdaterService::OnDemandUpdateAsNeeded(bool is_foreground, Callback on_finished) {
++bool AdBlockUpdaterService::OnDemandUpdate(bool is_foreground, Callback on_finished) {
 +  DCHECK(thread_checker_.CalledOnValidThread());
 +  DCHECK(thread_checker_.CalledOnValidThread());
 +
 +
 +  if (is_updating_) {
 +  if (is_updating_) {
-+    LOG(INFO) << "AdBlockUpdaterService: update in progress. Please wait.";
++    LOG(INFO) << "AdBlockUpdaterService: update in progress";
 +    NotifyObservers(AdblockEvent::ADBLOCK_CHECKING_FOR_UPDATES, AdblockError::UPDATE_IN_PROGRESS);
 +    NotifyObservers(AdblockEvent::ADBLOCK_CHECKING_FOR_UPDATES, AdblockError::UPDATE_IN_PROGRESS);
 +    return false;
 +    return false;
 +  }
 +  }
-+
-+  last_update_ = pref_service_->GetTime(kAdBlockLastCheckTime);
-+
-+  auto version = ruleset_service_->GetMostRecentlyIndexedVersion();
-+  base::Time t = base::Time();
-+  if (ConvertVersionToTime(version.content_version, &t)==true) {
-+    // Check if the request is too soon.
-+    if (!last_update_.is_null()) {
-+      int deltaCheck = is_foreground == false ? next_check_delay_ : on_demand_check_delay;
-+      base::TimeDelta delta = base::Time::Now() - last_update_;
-+      if (delta < base::TimeDelta::FromSeconds(deltaCheck)) {
-+        LOG(INFO) << "AdBlockUpdaterService: update delayed. Wait "
-+                  << (base::TimeDelta::FromSeconds(deltaCheck)-delta);
-+        return false;
-+      }
-+    }
-+  }
-+
-+  OnDemandUpdateInternal(is_foreground, std::move(on_finished));
-+  return true;
-+}
-+
-+void AdBlockUpdaterService::OnDemandUpdateInternal(bool is_foreground, Callback on_finished) {
-+  DCHECK(thread_checker_.CalledOnValidThread());
-+
-+  if (is_updating_) {
-+    base::ThreadTaskRunnerHandle::Get()->PostTask(
-+        FROM_HERE, base::BindOnce(std::move(on_finished),
-+                                    AdblockError::UPDATE_IN_PROGRESS));
-+    return;
-+  }
 +  is_updating_ = true;
 +  is_updating_ = true;
 +  last_update_ = base::Time::Now();
 +  last_update_ = base::Time::Now();
 +  pref_service_->SetTime(kAdBlockLastCheckTime, last_update_);
 +  pref_service_->SetTime(kAdBlockLastCheckTime, last_update_);
-+
-+  auto version = ruleset_service_->GetMostRecentlyIndexedVersion();
++  NotifyObservers(AdblockEvent::ADBLOCK_CHECKING_FOR_UPDATES, AdblockError::NONE);
 +  base::Time t = base::Time();
 +  base::Time t = base::Time();
-+  LOG(INFO) << "AdBlockUpdaterService: MostRecentIndexedVersion = " << version.content_version;
++  auto version = ruleset_service_->GetMostRecentlyIndexedVersion();
 +  ConvertVersionToTime(version.content_version, &t);
 +  ConvertVersionToTime(version.content_version, &t);
 +
 +
-+  NotifyObservers(AdblockEvent::ADBLOCK_CHECKING_FOR_UPDATES, AdblockError::NONE);
-+
 +  std::string filters_url_ = pref_service_->GetString(kAdBlockFiltersURL);
 +  std::string filters_url_ = pref_service_->GetString(kAdBlockFiltersURL);
 +  auto task = base::MakeRefCounted<DownloadFiltersTask>(
 +  auto task = base::MakeRefCounted<DownloadFiltersTask>(
 +      shared_url_network_factory_,
 +      shared_url_network_factory_,
@@ -1425,11 +1378,11 @@ new file mode 100644
 +  base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
 +  base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
 +      base::BindOnce(&DownloadFiltersTask::Run, base::Unretained(task.get())));
 +      base::BindOnce(&DownloadFiltersTask::Run, base::Unretained(task.get())));
 +  tasks_.insert(task);
 +  tasks_.insert(task);
++
++  return true;
 +}
 +}
 +
 +
-+bool AdBlockUpdaterService::ConvertVersionToTime(const std::string& version, base::Time* t)
-+{
-+  *t = base::Time();
++bool AdBlockUpdaterService::ConvertVersionToTime(const std::string& version, base::Time* t) {
 +  if (version.empty()) {
 +  if (version.empty()) {
 +    LOG(INFO) << "AdBlockUpdaterService: version is empty";
 +    LOG(INFO) << "AdBlockUpdaterService: version is empty";
 +    return false;
 +    return false;
@@ -1439,12 +1392,12 @@ new file mode 100644
 +  std::vector<std::string> tokens =
 +  std::vector<std::string> tokens =
 +      base::SplitString(version, ".", base::KEEP_WHITESPACE, base::SPLIT_WANT_ALL);
 +      base::SplitString(version, ".", base::KEEP_WHITESPACE, base::SPLIT_WANT_ALL);
 +  int i = 0;
 +  int i = 0;
-+  bool failed = false;
++  bool success = true;
 +  for (const std::string& token : tokens) {
 +  for (const std::string& token : tokens) {
 +    // parse as number
 +    // parse as number
 +    int n = 0;
 +    int n = 0;
 +    if (!base::StringToInt(token, &n)) {
 +    if (!base::StringToInt(token, &n)) {
-+      failed = true;
++      success = false;
 +      break;
 +      break;
 +    }
 +    }
 +
 +
@@ -1466,21 +1419,21 @@ new file mode 100644
 +        e.hour = n / 60;
 +        e.hour = n / 60;
 +        break;
 +        break;
 +      default:
 +      default:
-+        failed = true;
++        success = false;
 +        break;
 +        break;
 +    }
 +    }
 +  }
 +  }
 +
 +
-+  if (failed) {
++  if (!success) {
 +    LOG(WARNING) << "AdBlockUpdaterService: failed to parse most recent version as x.y.z.w dot-separated integers";
 +    LOG(WARNING) << "AdBlockUpdaterService: failed to parse most recent version as x.y.z.w dot-separated integers";
 +  } else {
 +  } else {
 +    if (!base::Time::FromUTCExploded(e, t)) {
 +    if (!base::Time::FromUTCExploded(e, t)) {
-+      failed = true;
++      success = false;
 +      LOG(WARNING) << "AdBlockUpdaterService: failed to convert version to time.";
 +      LOG(WARNING) << "AdBlockUpdaterService: failed to convert version to time.";
 +    }
 +    }
 +  }
 +  }
 +
 +
-+  return failed;
++  return success;
 +}
 +}
 +
 +
 +void AdBlockUpdaterService::OnUpdateComplete(Callback on_finished,
 +void AdBlockUpdaterService::OnUpdateComplete(Callback on_finished,
@@ -1549,7 +1502,6 @@ new file mode 100644
 +
 +
 +void AdBlockUpdaterService::SetAdBlockFiltersURL(const std::string url) {
 +void AdBlockUpdaterService::SetAdBlockFiltersURL(const std::string url) {
 +  pref_service_->SetString(kAdBlockFiltersURL, url);
 +  pref_service_->SetString(kAdBlockFiltersURL, url);
-+  pref_service_->SetTime(kAdBlockLastCheckTime, base::Time());
 +}
 +}
 +
 +
 +std::string AdBlockUpdaterService::GetMostRecentIndexedVersion() {
 +std::string AdBlockUpdaterService::GetMostRecentIndexedVersion() {
@@ -1557,23 +1509,21 @@ new file mode 100644
 +  return version.content_version;
 +  return version.content_version;
 +}
 +}
 +
 +
-+long AdBlockUpdaterService::GetLastUpdate() {
++long AdBlockUpdaterService::GetLastUpdateMs() {
 +  return pref_service_->GetTime(kAdBlockLastCheckTime).ToJavaTime();
 +  return pref_service_->GetTime(kAdBlockLastCheckTime).ToJavaTime();
 +}
 +}
 +
 +
-+long AdBlockUpdaterService::GetLastOkUpdate() {
-+  base::Time lastOk = pref_service_->GetTime(kAdBlockLastCheckTimeOk);
-+  return lastOk.ToJavaTime();
++long AdBlockUpdaterService::GetLastSuccessfulUpdateMs() {
++  return pref_service_->GetTime(kAdBlockLastCheckTimeOk).ToJavaTime();
 +}
 +}
 +
 +
-+int AdBlockUpdaterService::GetAdBlockUpdateTimeFrequency() {
++int AdBlockUpdaterService::GetAdBlockUpdateFrequencyInDays() {
 +  return pref_service_->GetInteger(kAdBlockFiltersCheckFrequency);
 +  return pref_service_->GetInteger(kAdBlockFiltersCheckFrequency);
 +}
 +}
 +
 +
-+void AdBlockUpdaterService::SetAdBlockUpdateTimeFrequency(int days) {
++void AdBlockUpdaterService::SetAdBlockUpdateFrequency(int days) {
 +  if (pref_service_->GetInteger(kAdBlockFiltersCheckFrequency) != days) {
 +  if (pref_service_->GetInteger(kAdBlockFiltersCheckFrequency) != days) {
 +    pref_service_->SetInteger(kAdBlockFiltersCheckFrequency, days);
 +    pref_service_->SetInteger(kAdBlockFiltersCheckFrequency, days);
-+    pref_service_->SetTime(kAdBlockLastCheckTime, base::Time());
 +    StartWithDelay(0);
 +    StartWithDelay(0);
 +  }
 +  }
 +}
 +}
@@ -1581,7 +1531,7 @@ new file mode 100644
 +// static
 +// static
 +void AdBlockUpdaterService::RegisterPrefs(PrefRegistrySimple* registry) {
 +void AdBlockUpdaterService::RegisterPrefs(PrefRegistrySimple* registry) {
 +  registry->RegisterStringPref(kAdBlockFiltersURL, std::string());
 +  registry->RegisterStringPref(kAdBlockFiltersURL, std::string());
-+  registry->RegisterIntegerPref(kAdBlockFiltersCheckFrequency, 7);
++  registry->RegisterIntegerPref(kAdBlockFiltersCheckFrequency, defaultFiltersCheckFrequencyInDays);
 +  registry->RegisterTimePref(kAdBlockLastCheckTime, base::Time());
 +  registry->RegisterTimePref(kAdBlockLastCheckTime, base::Time());
 +  registry->RegisterTimePref(kAdBlockLastCheckTimeOk, base::Time());
 +  registry->RegisterTimePref(kAdBlockLastCheckTimeOk, base::Time());
 +
 +
@@ -1594,7 +1544,7 @@ diff --git a/components/component_updater/adblock_updater_service.h b/components
 new file mode 100644
 new file mode 100644
 --- /dev/null
 --- /dev/null
 +++ b/components/component_updater/adblock_updater_service.h
 +++ b/components/component_updater/adblock_updater_service.h
-@@ -0,0 +1,127 @@
+@@ -0,0 +1,126 @@
 +/*
 +/*
 +    This file is part of Bromite.
 +    This file is part of Bromite.
 +
 +
@@ -1674,19 +1624,19 @@ new file mode 100644
 +  void SetAdBlockFiltersURL(const std::string url);
 +  void SetAdBlockFiltersURL(const std::string url);
 +  std::string GetMostRecentIndexedVersion();
 +  std::string GetMostRecentIndexedVersion();
 +
 +
-+  // return date/time (in millis) of last successfully request
-+  long GetLastOkUpdate();
++  // timestamp (in UNIX epoch milliseconds) of last successful update request
++  long GetLastSuccessfulUpdateMs();
 +
 +
-+  // return date/time (in millis) of last request
-+  long GetLastUpdate();
++  // timestamp (in UNIX epoch milliseconds) of last update request
++  long GetLastUpdateMs();
 +
 +
 +  // Get/Set check interval (in days)
 +  // Get/Set check interval (in days)
-+  int GetAdBlockUpdateTimeFrequency();
-+  void SetAdBlockUpdateTimeFrequency(int days);
++  int GetAdBlockUpdateFrequencyInDays();
++  void SetAdBlockUpdateFrequency(int days);
 +
 +
-+  // To be called for an user-triggered update.
-+  // Will not result in an actual update if the last update was too recently triggered.
-+  bool OnDemandUpdate(Callback on_finished);
++  // called with is_foreground=true for on-demand updates
++  // will always check for an update
++  bool OnDemandUpdate(bool is_foreground, Callback on_finished);
 +
 +
 +  static void RegisterPrefs(PrefRegistrySimple* registry);
 +  static void RegisterPrefs(PrefRegistrySimple* registry);
 +
 +
@@ -1695,11 +1645,10 @@ new file mode 100644
 +
 +
 +  void NotifyObservers(AdblockEvent event, AdblockError error);
 +  void NotifyObservers(AdblockEvent event, AdblockError error);
 +  void OnDemandScheduledUpdate(component_updater::UpdateScheduler::OnFinishedCallback on_finished);
 +  void OnDemandScheduledUpdate(component_updater::UpdateScheduler::OnFinishedCallback on_finished);
-+  bool OnDemandUpdateAsNeeded(bool is_foreground, Callback on_finished);
-+  void OnDemandUpdateInternal(bool is_foreground, Callback on_finished);
 +  void OnUpdateComplete(Callback callback, scoped_refptr<DownloadFiltersTask> task, AdblockError error);
 +  void OnUpdateComplete(Callback callback, scoped_refptr<DownloadFiltersTask> task, AdblockError error);
 +  void RulesetPublishedCallback();
 +  void RulesetPublishedCallback();
 +
 +
++  // returns false if conversion fails
 +  bool ConvertVersionToTime(const std::string& version, base::Time* t);
 +  bool ConvertVersionToTime(const std::string& version, base::Time* t);
 +
 +
 +  base::ObserverList<Observer>::Unchecked observer_list_;
 +  base::ObserverList<Observer>::Unchecked observer_list_;
@@ -1715,7 +1664,7 @@ new file mode 100644
 +
 +
 +  bool is_updating_ = false;
 +  bool is_updating_ = false;
 +  bool scheduled_ = false;
 +  bool scheduled_ = false;
-+  int next_check_delay_;
++  int next_check_delay_in_seconds_;
 +  std::set<scoped_refptr<DownloadFiltersTask>> tasks_;
 +  std::set<scoped_refptr<DownloadFiltersTask>> tasks_;
 +};
 +};
 +
 +
@@ -1726,7 +1675,7 @@ diff --git a/components/component_updater/download_filters_task.cc b/components/
 new file mode 100644
 new file mode 100644
 --- /dev/null
 --- /dev/null
 +++ b/components/component_updater/download_filters_task.cc
 +++ b/components/component_updater/download_filters_task.cc
-@@ -0,0 +1,237 @@
+@@ -0,0 +1,236 @@
 +/*
 +/*
 +    This file is part of Bromite.
 +    This file is part of Bromite.
 +
 +
@@ -1910,8 +1859,7 @@ new file mode 100644
 +          : base::TimeDelta();
 +          : base::TimeDelta();
 +
 +
 +  // Consider a 5xx response from the server as an indication to terminate
 +  // Consider a 5xx response from the server as an indication to terminate
-+  // the request and avoid overloading the server in this case.
-+  // is not accepting requests for the moment.
++  // the request and avoid overloading the server.
 +  int error = -1;
 +  int error = -1;
 +  if (!file_path.empty() && response_code_ == 200) {
 +  if (!file_path.empty() && response_code_ == 200) {
 +    DCHECK_EQ(0, net_error);
 +    DCHECK_EQ(0, net_error);