diff --git a/build/GN_ARGS b/build/GN_ARGS index 197fc023..89f8cd2e 100644 --- a/build/GN_ARGS +++ b/build/GN_ARGS @@ -21,6 +21,7 @@ enable_platform_hevc=true enable_remoting=false enable_reporting=true enable_vr=false +exclude_unwind_tables=false ffmpeg_branding="Chrome" fieldtrial_testing_like_official_build=true icu_use_data_file=true @@ -37,5 +38,6 @@ use_errorprone_java_compiler=false use_gnome_keyring=false use_official_google_api_keys=false use_openh264=true +use_rtti=false use_sysroot=false webview_includes_weblayer=false diff --git a/build/RELEASE b/build/RELEASE index 6b0ce5a6..c35bc769 100644 --- a/build/RELEASE +++ b/build/RELEASE @@ -1 +1 @@ -88.0.4324.187 +88.0.4324.207 diff --git a/build/bromite_patches_list.txt b/build/bromite_patches_list.txt index d7073f40..653ad966 100644 --- a/build/bromite_patches_list.txt +++ b/build/bromite_patches_list.txt @@ -158,4 +158,6 @@ Ignore-enterprise-policies-for-secure-DNS.patch Fix-favicons-fallback-search.patch Enable-app-overflow-menu-icons-by-default.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 diff --git a/build/patches/Add-exit-menu-item.patch b/build/patches/Add-exit-menu-item.patch index 3db98bb6..d8446f18 100644 --- a/build/patches/Add-exit-menu-item.patch +++ b/build/patches/Add-exit-menu-item.patch @@ -4,27 +4,28 @@ Subject: Add exit menu item 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 +++ .../org/chromium/chrome/browser/ChromeTabbedActivity.java | 3 +++ .../src/org/chromium/chrome/browser/app/ChromeActivity.java | 6 ++++++ .../chrome/browser/init/ChromeLifetimeController.java | 6 +++++- .../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 --- a/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:title="@string/menu_exit" ++ android:icon="@drawable/ic_exit_to_app_white_24dp" /> -@@ -153,6 +155,8 @@ +@@ -153,6 +156,8 @@ @@ -42,7 +43,7 @@ diff --git a/chrome/android/java/res/menu/main_menu_regroup.xml b/chrome/android android:title="@string/managed" /> + ++ android:icon="@drawable/ic_exit_to_app_white_24dp" /> diff --git a/build/patches/Add-flag-for-save-data-header.patch b/build/patches/Add-flag-for-save-data-header.patch new file mode 100644 index 00000000..ac88c1e2 --- /dev/null +++ b/build/patches/Add-flag-for-save-data-header.patch @@ -0,0 +1,99 @@ +From: Wengling Chen +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 + 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 + 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 + diff --git a/build/patches/Add-menu-item-to-bookmark-all-tabs.patch b/build/patches/Add-menu-item-to-bookmark-all-tabs.patch index 8ed9ce30..7f4a308c 100644 --- a/build/patches/Add-menu-item-to-bookmark-all-tabs.patch +++ b/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 --- a/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" /> - +@@ -57,6 +57,9 @@ + ++ + +@@ -154,6 +157,9 @@ + android:checkable="true" /> + + + - - -@@ -155,6 +158,9 @@ -+ - - 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 +++ b/chrome/android/java/res/menu/main_menu_regroup.xml -@@ -184,6 +184,9 @@ - android:icon="@drawable/vr_headset" /> - -+ - +@@ -32,6 +32,9 @@ + android:title="@string/accessibility_menu_bookmark" + android:titleCondensed="@string/menu_bookmark" + android:icon="@drawable/btn_star"/> ++ + + ++ android:title="@string/view_source" ++ android:icon="@drawable/default_favicon" /> @@ -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/default_favicon" /> diff --git a/build/patches/Add-option-to-force-tablet-UI.patch b/build/patches/Add-option-to-force-tablet-UI.patch new file mode 100644 index 00000000..74d40bc2 --- /dev/null +++ b/build/patches/Add-option-to-force-tablet-UI.patch @@ -0,0 +1,172 @@ +From: Wengling Chen +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"/> + ++ ++ + + Turn off + ++ ++ Open chromium in Tablet Mode ++ ++ ++ Force Tablet Mode ++ + + + +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 + diff --git a/build/patches/Automated-domain-substitution.patch b/build/patches/Automated-domain-substitution.patch index 00bee35d..fa24bcf6 100644 --- a/build/patches/Automated-domain-substitution.patch +++ b/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"; const char kCrossOriginOpenerPolicyReportingName[] = -@@ -1990,7 +1990,7 @@ const char kIntensiveWakeUpThrottlingName[] = +@@ -1994,7 +1994,7 @@ const char kIntensiveWakeUpThrottlingName[] = const char kIntensiveWakeUpThrottlingDescription[] = "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 " @@ -8149,7 +8149,7 @@ diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chro 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. <link>Learn more</link> @@ -8158,7 +8158,7 @@ diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chro 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. @@ -8171,7 +8171,7 @@ diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chro 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 @@ -8198,7 +8198,7 @@ diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chro -@@ -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 @@ -8207,7 +8207,7 @@ diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chro Contacting Google. This may take a minute… -@@ -1758,7 +1758,7 @@ To change this setting, <resetlink>reset sync

<resetlink>reset sync

@@ -8216,7 +8216,7 @@ diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chro <link>Get help</link> while scanning for devices… -@@ -1803,7 +1803,7 @@ To change this setting, <resetlink>reset sync

<resetlink>reset sync

@@ -8225,7 +8225,7 @@ diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chro Unknown or unsupported device (%1$sA1:B2:C3:D4:E5:F6) -@@ -2262,7 +2262,7 @@ To change this setting, <resetlink>reset sync

<resetlink>reset sync

@@ -8234,7 +8234,7 @@ diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chro 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 @@ -8243,7 +8243,7 @@ diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chro No compatible devices found -@@ -3614,7 +3614,7 @@ Data from your Incognito session will only be cleared from Chrome when you @@ -8252,7 +8252,7 @@ diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chro Got it -@@ -3869,7 +3869,7 @@ Data from your Incognito session will only be cleared from Chrome when you %1$sTanya's Pixel 2... diff --git a/build/patches/Bromite-AdBlockUpdaterService.patch b/build/patches/Bromite-AdBlockUpdaterService.patch index 23e83966..e2a4f853 100644 --- a/build/patches/Bromite-AdBlockUpdaterService.patch +++ b/build/patches/Bromite-AdBlockUpdaterService.patch @@ -13,11 +13,11 @@ Fix RestoreForeignSessionTab by recreating the tab (issue #681) 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 | 43 ++ + .../java/res/xml/adblock_preferences.xml | 43 +++ .../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/AdBlockPreferences.java | 173 ++++++++ + .../browser/settings/AdBlockPreferences.java | 173 +++++++++ .../chrome/browser/tabmodel/TabModelImpl.java | 2 +- chrome/app/generated_resources.grd | 46 +++ 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 + .../browser/chrome_content_browser_client.cc | 16 - 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/cached_feature_flags.cc | 1 + .../flags/android/cached_feature_flags.h | 2 + - .../browser/flags/AdblockUpdaterBridge.java | 105 +++++ + .../browser/flags/AdblockUpdaterBridge.java | 105 ++++++ chrome/browser/prefs/browser_prefs.cc | 1 + .../sessions/session_restore_android.cc | 4 +- .../strings/android_chrome_strings.grd | 14 + 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 + .../content/browser/ruleset_publisher.h | 2 + .../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 +----- .../core/common/common_features.cc | 2 +- .../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/xml/adblock_preferences.xml 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); + TimeFrequencySpinnerOption[] spinnerOptions = getTimeFrequencySpinnerOptions(); -+ int selectedTimeFrequency = AdblockUpdaterBridge.getAdBlockUpdateTimeFrequency(); ++ int selectedTimeFrequency = AdblockUpdaterBridge.getAdBlockUpdateFrequencyInDays(); + int spinnerOptionIndex = -1; + for (int i = 0; i < spinnerOptions.length; ++i) { + if (spinnerOptions[i].getDays() == selectedTimeFrequency) { @@ -484,7 +483,7 @@ new file mode 100644 + } + spinner.setOptions(spinnerOptions, spinnerOptionIndex); + spinner.setOnPreferenceChangeListener((preference, newValue) -> { -+ AdblockUpdaterBridge.setAdBlockUpdateTimeFrequency( ++ AdblockUpdaterBridge.setAdBlockUpdateFrequency( + ((TimeFrequencySpinnerOption) newValue).getDays()); + return true; + }); @@ -500,7 +499,7 @@ new file mode 100644 + startUpdateButton.setOnPreferenceClickListener(new OnPreferenceClickListener() { + @Override + public boolean onPreferenceClick(Preference preference) { -+ AdblockUpdaterBridge.AdBlockStartCheck(AdBlockPreferences.this); ++ AdblockUpdaterBridge.AdBlockUpdate(AdBlockPreferences.this); + return true; + } + }); @@ -513,7 +512,7 @@ new file mode 100644 + currentIndexVersion.setSummary( + AdblockUpdaterBridge.getAdBlockMostRecentIndexedVersion() + + "\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) { @@ -938,31 +937,31 @@ new file mode 100644 + 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; +} + -+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; +} + +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; +} + -+static void JNI_AdblockUpdaterBridge_AdBlockStartCheckOnDemand(JNIEnv* env) { ++static void JNI_AdblockUpdaterBridge_AdBlockUpdate(JNIEnv* env) { + adblock_updater::AdBlockUpdaterService* client = g_browser_process->adblock_updater(); + if (client == nullptr) return; + + JNI_AdblockUpdaterBridge_AdBlockRegisterCallback(env); -+ client->OnDemandUpdate(adblock_updater::Callback()); ++ client->OnDemandUpdate(true, adblock_updater::Callback()); +} + +static void JNI_AdblockUpdaterBridge_AdBlockRegisterCallback(JNIEnv* env) { @@ -1012,14 +1011,6 @@ new file mode 100644 +} // namespace chrome + +#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 --- a/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(); + } + -+ 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() { + 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); + } + @@ -1109,9 +1100,9 @@ new file mode 100644 + return new Date(millis); + } + -+ public static void AdBlockStartCheck(AdblockCallback callback) { ++ public static void AdBlockUpdate(AdblockCallback callback) { + observer = new WeakReference(callback); -+ AdblockUpdaterBridgeJni.get().adBlockStartCheckOnDemand(); ++ AdblockUpdaterBridgeJni.get().adBlockUpdate(); + } + + public static void AdBlockRegisterCallback(AdblockCallback callback) { @@ -1135,10 +1126,10 @@ new file mode 100644 + String getAdBlockFiltersURL(); + String getAdBlockMostRecentIndexedVersion(); + 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(); + } +} @@ -1211,7 +1202,7 @@ diff --git a/components/component_updater/adblock_updater_service.cc b/component new file mode 100644 --- /dev/null +++ b/components/component_updater/adblock_updater_service.cc -@@ -0,0 +1,378 @@ +@@ -0,0 +1,337 @@ +/* + This file is part of Bromite. + @@ -1263,16 +1254,14 @@ new file mode 100644 +// Holds the URL to an indexed subresource filters file. +const char kAdBlockFiltersCheckFrequency[] = "adblock.check_frequency"; + -+// Last check time ++// Last update 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"; + -+// 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( + scoped_refptr shared_url_network_factory, @@ -1316,34 +1305,36 @@ new file mode 100644 +void AdBlockUpdaterService::Start() { + DCHECK(thread_checker_.CalledOnValidThread()); + -+ // avoid multiple scheduling ++ // avoid multiple scheduling during browser initialization + if (scheduled_) + return; + 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(); -+ if (next_check_delay_ == 0) { ++ if (next_check_delay_in_seconds_ == 0) { + LOG(INFO) << "AdBlockUpdaterService: disabled by user."; + } else { + LOG(INFO) << "AdBlockUpdaterService: starting up. " + << "First update attempt will take place in " -+ << delay << " seconds. " ++ << delay_in_seconds << " seconds. " + << "Next update attempt will take place in " -+ << next_check_delay_ << " seconds. "; ++ << next_check_delay_in_seconds_ << " seconds. "; + + 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::Unretained(this)), base::DoNothing()); + } @@ -1356,62 +1347,24 @@ new file mode 100644 + AdblockError error) { std::move(on_finished).Run(); }, + std::move(on_finished)); + -+ OnDemandUpdateAsNeeded(false, std::move(on_finished_callback)); ++ OnDemandUpdate(false, std::move(on_finished_callback)); +} + -+bool AdBlockUpdaterService::OnDemandUpdate(Callback on_finished) { -+ return OnDemandUpdateAsNeeded(true, std::move(on_finished)); -+} -+ -+bool AdBlockUpdaterService::OnDemandUpdateAsNeeded(bool is_foreground, Callback on_finished) { ++bool AdBlockUpdaterService::OnDemandUpdate(bool is_foreground, Callback on_finished) { + DCHECK(thread_checker_.CalledOnValidThread()); + + 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); + 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; + last_update_ = base::Time::Now(); + pref_service_->SetTime(kAdBlockLastCheckTime, last_update_); -+ -+ auto version = ruleset_service_->GetMostRecentlyIndexedVersion(); -+ base::Time t = base::Time(); -+ LOG(INFO) << "AdBlockUpdaterService: MostRecentIndexedVersion = " << version.content_version; -+ ConvertVersionToTime(version.content_version, &t); -+ + NotifyObservers(AdblockEvent::ADBLOCK_CHECKING_FOR_UPDATES, AdblockError::NONE); ++ base::Time t = base::Time(); ++ auto version = ruleset_service_->GetMostRecentlyIndexedVersion(); ++ ConvertVersionToTime(version.content_version, &t); + + std::string filters_url_ = pref_service_->GetString(kAdBlockFiltersURL); + auto task = base::MakeRefCounted( @@ -1425,11 +1378,11 @@ new file mode 100644 + base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, + base::BindOnce(&DownloadFiltersTask::Run, base::Unretained(task.get()))); + 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()) { + LOG(INFO) << "AdBlockUpdaterService: version is empty"; + return false; @@ -1439,12 +1392,12 @@ new file mode 100644 + std::vector tokens = + base::SplitString(version, ".", base::KEEP_WHITESPACE, base::SPLIT_WANT_ALL); + int i = 0; -+ bool failed = false; ++ bool success = true; + for (const std::string& token : tokens) { + // parse as number + int n = 0; + if (!base::StringToInt(token, &n)) { -+ failed = true; ++ success = false; + break; + } + @@ -1466,21 +1419,21 @@ new file mode 100644 + e.hour = n / 60; + break; + default: -+ failed = true; ++ success = false; + break; + } + } + -+ if (failed) { ++ if (!success) { + LOG(WARNING) << "AdBlockUpdaterService: failed to parse most recent version as x.y.z.w dot-separated integers"; + } else { + if (!base::Time::FromUTCExploded(e, t)) { -+ failed = true; ++ success = false; + LOG(WARNING) << "AdBlockUpdaterService: failed to convert version to time."; + } + } + -+ return failed; ++ return success; +} + +void AdBlockUpdaterService::OnUpdateComplete(Callback on_finished, @@ -1549,7 +1502,6 @@ new file mode 100644 + +void AdBlockUpdaterService::SetAdBlockFiltersURL(const std::string url) { + pref_service_->SetString(kAdBlockFiltersURL, url); -+ pref_service_->SetTime(kAdBlockLastCheckTime, base::Time()); +} + +std::string AdBlockUpdaterService::GetMostRecentIndexedVersion() { @@ -1557,23 +1509,21 @@ new file mode 100644 + return version.content_version; +} + -+long AdBlockUpdaterService::GetLastUpdate() { ++long AdBlockUpdaterService::GetLastUpdateMs() { + 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); +} + -+void AdBlockUpdaterService::SetAdBlockUpdateTimeFrequency(int days) { ++void AdBlockUpdaterService::SetAdBlockUpdateFrequency(int days) { + if (pref_service_->GetInteger(kAdBlockFiltersCheckFrequency) != days) { + pref_service_->SetInteger(kAdBlockFiltersCheckFrequency, days); -+ pref_service_->SetTime(kAdBlockLastCheckTime, base::Time()); + StartWithDelay(0); + } +} @@ -1581,7 +1531,7 @@ new file mode 100644 +// static +void AdBlockUpdaterService::RegisterPrefs(PrefRegistrySimple* registry) { + registry->RegisterStringPref(kAdBlockFiltersURL, std::string()); -+ registry->RegisterIntegerPref(kAdBlockFiltersCheckFrequency, 7); ++ registry->RegisterIntegerPref(kAdBlockFiltersCheckFrequency, defaultFiltersCheckFrequencyInDays); + registry->RegisterTimePref(kAdBlockLastCheckTime, 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 --- /dev/null +++ b/components/component_updater/adblock_updater_service.h -@@ -0,0 +1,127 @@ +@@ -0,0 +1,126 @@ +/* + This file is part of Bromite. + @@ -1674,19 +1624,19 @@ new file mode 100644 + void SetAdBlockFiltersURL(const std::string url); + 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) -+ 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); + @@ -1695,11 +1645,10 @@ new file mode 100644 + + void NotifyObservers(AdblockEvent event, AdblockError error); + 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 task, AdblockError error); + void RulesetPublishedCallback(); + ++ // returns false if conversion fails + bool ConvertVersionToTime(const std::string& version, base::Time* t); + + base::ObserverList::Unchecked observer_list_; @@ -1715,7 +1664,7 @@ new file mode 100644 + + bool is_updating_ = false; + bool scheduled_ = false; -+ int next_check_delay_; ++ int next_check_delay_in_seconds_; + std::set> tasks_; +}; + @@ -1726,7 +1675,7 @@ diff --git a/components/component_updater/download_filters_task.cc b/components/ new file mode 100644 --- /dev/null +++ b/components/component_updater/download_filters_task.cc -@@ -0,0 +1,237 @@ +@@ -0,0 +1,236 @@ +/* + This file is part of Bromite. + @@ -1910,8 +1859,7 @@ new file mode 100644 + : base::TimeDelta(); + + // 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; + if (!file_path.empty() && response_code_ == 200) { + DCHECK_EQ(0, net_error);