Experimental support for extensions on Android: remove unwanted link hover status bar (#2660), fix the flickering of the extensions button (#2657), fix crash when loading an unpacked extension (#2579)

This commit is contained in:
Carmelo Messina
2026-01-24 18:17:48 +01:00
parent db10f20ff4
commit a975b69283
@@ -1,6 +1,6 @@
From: uazo <uazo@users.noreply.github.com>
Date: Thu, 6 Nov 2025 13:21:24 +0000
Subject: Experimental-support-for-extensions-on-Android
Subject: Experimental support for extensions on Android
Enable experimental support for extensions in Android.
@@ -13,7 +13,7 @@ folder in case of a crash on startup.
License: GPL-2.0-or-later - https://spdx.org/licenses/GPL-2.0-or-later.html
---
android_webview/BUILD.gn | 2 +-
base/android/device_info.cc | 8 ++-
base/android/device_info.cc | 8 +-
base/android/device_info.h | 3 +-
.../src/org/chromium/base/DeviceInfo.java | 6 +-
build/BUILD.gn | 2 +-
@@ -31,10 +31,10 @@ License: GPL-2.0-or-later - https://spdx.org/licenses/GPL-2.0-or-later.html
.../overlays/strip/StripLayoutUtils.java | 2 +-
.../DesktopSiteSettingsIphController.java | 2 +-
.../browser/init/AsyncInitTaskRunner.java | 2 +-
.../MediaCaptureNotificationServiceImpl.java | 8 +--
.../MediaCaptureNotificationServiceImpl.java | 8 +-
.../browser/multiwindow/MultiWindowUtils.java | 2 +-
.../ChromeSiteSettingsDelegate.java | 2 +-
.../site_settings/ManageSpaceActivity.java | 20 ++++++
.../site_settings/ManageSpaceActivity.java | 20 +++++
...InterceptNavigationDelegateClientImpl.java | 2 +-
.../browser/tab/RequestDesktopUtils.java | 2 +-
.../TabbedAppMenuPropertiesDelegate.java | 2 +-
@@ -42,21 +42,21 @@ License: GPL-2.0-or-later - https://spdx.org/licenses/GPL-2.0-or-later.html
.../chrome/browser/ui/RootUiCoordinator.java | 2 +-
chrome/app/extensions_strings.grdp | 7 ++
chrome/app/theme/theme_resources.grd | 4 +-
chrome/browser/BUILD.gn | 8 +--
chrome/browser/about_flags.cc | 4 ++
chrome/browser/BUILD.gn | 8 +-
chrome/browser/about_flags.cc | 4 +
...chrome_selection_dropdown_menu_delegate.cc | 4 +-
.../bookmarks/bar/BookmarkBarUtils.java | 6 +-
.../bar/BookmarkBarVisibilityProvider.java | 2 +-
chrome/browser/browser_process_impl.cc | 2 +-
chrome/browser/chrome_browser_field_trials.cc | 70 +++++++++----------
chrome/browser/chrome_browser_field_trials.cc | 84 +++++++++----------
.../chrome_browser_interface_binders_webui.cc | 4 +-
.../browser/chrome_content_browser_client.cc | 4 +-
chrome/browser/devtools/BUILD.gn | 2 +-
.../chrome_download_manager_delegate.cc | 2 +-
.../download_offline_content_provider.cc | 4 +-
chrome/browser/extensions/BUILD.gn | 12 +++-
chrome/browser/extensions/BUILD.gn | 12 ++-
.../chrome_extensions_api_client_android.cc | 2 +-
.../extensions/extension_management.cc | 8 ++-
.../extensions/extension_management.cc | 8 +-
.../browser/extensions/extension_management.h | 2 +-
chrome/browser/extensions/extension_util.cc | 11 +++
.../feedback/DeviceInfoFeedbackSource.java | 2 +-
@@ -67,12 +67,12 @@ License: GPL-2.0-or-later - https://spdx.org/licenses/GPL-2.0-or-later.html
.../media/webrtc/webrtc_event_log_manager.cc | 4 +-
.../policy_value_and_status_aggregator.cc | 2 +-
...hrome_browser_main_extra_parts_profiles.cc | 2 +-
.../profiles/off_the_record_profile_impl.cc | 9 ++-
.../profiles/off_the_record_profile_impl.cc | 9 +-
chrome/browser/profiles/profile_destroyer.cc | 2 +-
chrome/browser/resources/BUILD.gn | 2 +-
chrome/browser/resources/discards/BUILD.gn | 2 +-
.../resources/extensions/detail_view.css | 6 ++
.../resources/extensions/extensions.html | 8 ++-
.../resources/extensions/extensions.html | 8 +-
.../resources/extensions/item_list.css | 11 +++
.../resources/extensions/toolbar.html.ts | 7 --
...omeProvidedSharingOptionsProviderBase.java | 4 +-
@@ -80,11 +80,11 @@ License: GPL-2.0-or-later - https://spdx.org/licenses/GPL-2.0-or-later.html
chrome/browser/startup_data.h | 6 +-
.../common/task_manager_features.cc | 2 +-
chrome/browser/ui/BUILD.gn | 6 +-
.../browser/ui/android/context_menu_helper.cc | 12 +++-
.../browser/ui/android/context_menu_helper.cc | 12 ++-
.../browser/ui/android/context_menu_helper.h | 4 +-
.../desktop_site/DesktopSiteUtils.java | 4 +-
chrome/browser/ui/android/extensions/BUILD.gn | 4 +-
.../extensions/extension_actions_bridge.cc | 23 ++++++
.../extensions/extension_actions_bridge.cc | 23 +++++
.../extensions/extension_actions_bridge.h | 1 +
.../java/res/layout/extensions_menu.xml | 1 +
.../res/layout/extensions_menu_footer.xml | 4 +-
@@ -92,30 +92,30 @@ License: GPL-2.0-or-later - https://spdx.org/licenses/GPL-2.0-or-later.html
.../ui/extensions/ExtensionActionsBridge.java | 6 ++
.../extensions/windowing/internal/BUILD.gn | 2 +-
.../Enable-extensions-Android.grdp | 15 ++++
.../Extensions-Android.grdp | 9 +++
.../Extensions-Android.grdp | 9 ++
chrome/browser/ui/android/tab_model/BUILD.gn | 4 +-
.../browser/ui/android/tab_model/tab_model.cc | 6 +-
.../browser/ui/android/tab_model/tab_model.h | 2 +-
.../android/tab_model/tab_model_jni_bridge.cc | 12 ++--
.../android/tab_model/tab_model_jni_bridge.cc | 12 +--
.../android/tab_model/tab_model_test_helper.h | 2 +-
.../toolbar/java/res/layout/toolbar_phone.xml | 6 ++
.../ExtensionActionListContainer.java | 8 ++-
.../ExtensionActionListContainer.java | 8 +-
.../ExtensionToolbarCoordinatorImpl.java | 10 ++-
.../extensions/ExtensionsMenuCoordinator.java | 7 +-
.../extensions/ExtensionsMenuCoordinator.java | 44 +++++-----
.../ExtensionsMenuItemProperties.java | 5 +-
.../ExtensionsMenuItemViewBinder.java | 2 +
.../extensions/ExtensionsMenuMediator.java | 9 ++-
.../extensions/ExtensionsMenuMediator.java | 9 +-
chrome/browser/ui/browser_navigator_params.cc | 4 +-
chrome/browser/ui/browser_navigator_params.h | 4 +-
chrome/browser/ui/browser_window/BUILD.gn | 2 +-
.../ui/browser_window/internal/BUILD.gn | 2 +-
chrome/browser/ui/prefs/BUILD.gn | 4 +-
chrome/browser/ui/prefs/prefs_tab_helper.cc | 8 +--
chrome/browser/ui/prefs/prefs_tab_helper.cc | 8 +-
chrome/browser/ui/tabs/tab_list_interface.h | 4 +-
chrome/browser/ui/webid/BUILD.gn | 2 +-
.../browser/ui/webui/chrome_web_ui_configs.cc | 4 +-
.../browser/ui/webui/current_channel_logo.cc | 2 +-
.../browser/ui/webui/discards/discards_ui.cc | 8 +--
.../browser/ui/webui/discards/discards_ui.cc | 8 +-
chrome/chrome_paks.gni | 2 +-
chrome/common/chrome_switches.cc | 2 +-
chrome/common/chrome_switches.h | 2 +-
@@ -124,14 +124,14 @@ License: GPL-2.0-or-later - https://spdx.org/licenses/GPL-2.0-or-later.html
chrome/common/webui_url_constants.h | 2 +-
.../sandbox_status_extension_android.cc | 3 +-
.../sandbox_status_extension_android.h | 1 +
chrome/test/BUILD.gn | 16 ++---
chrome/test/BUILD.gn | 16 ++--
chrome/version.gni | 4 +-
.../core/browser/host_content_settings_map.cc | 6 ++
.../embedder_support/view/ContentView.java | 2 +-
.../browser/android/media_router_android.cc | 2 +-
.../browser/android/media_router_android.h | 2 +-
.../media_router/browser/media_router.h | 4 +-
.../policy/CombinedPolicyProvider.java | 8 +--
.../policy/CombinedPolicyProvider.java | 8 +-
.../components/policy/PolicyCacheUpdater.java | 2 +-
.../android/policy_cache_updater_android.cc | 4 +-
.../cloud/user_policy_signin_service_base.cc | 2 +-
@@ -150,21 +150,23 @@ License: GPL-2.0-or-later - https://spdx.org/licenses/GPL-2.0-or-later.html
.../browser/ContentUiEventHandler.java | 7 +-
content/public/common/content_features.cc | 2 +-
.../render_frame_media_playback_options.cc | 2 +-
.../about_flags_cc/Extensions-Android.inc | 12 ++++
.../about_flags_cc/Webstore-protection.inc | 8 +--
.../about_flags_cc/Extensions-Android.inc | 12 +++
.../about_flags_cc/Webstore-protection.inc | 8 +-
extensions/browser/BUILD.gn | 4 +-
...browser_context_keyed_service_factories.cc | 2 +-
extensions/browser/api/system_cpu/BUILD.gn | 2 +-
.../api/web_request/permission_helper.cc | 2 +-
extensions/browser/extension_frame_host.cc | 8 +++
extensions/browser/extension_host.cc | 24 ++++++-
extensions/browser/extension_frame_host.cc | 8 ++
extensions/browser/extension_host.cc | 24 +++++-
extensions/buildflags/BUILD.gn | 3 +-
extensions/buildflags/buildflags.gni | 4 +-
extensions/common/api/schema.gni | 2 +-
extensions/common/command.cc | 2 +-
extensions/common/extension_features.cc | 10 ++-
extensions/common/extension_features.h | 6 +-
extensions/common/extension_l10n_util.cc | 6 ++
extensions/common/features/feature.cc | 2 +-
.../default_locale_handler.cc | 3 +
.../renderer/bindings/api_binding_util.cc | 2 +-
gpu/config/gpu_finch_features.cc | 4 +-
net/features.gni | 4 +-
@@ -173,8 +175,8 @@ License: GPL-2.0-or-later - https://spdx.org/licenses/GPL-2.0-or-later.html
.../renderer/modules/modules_initializer.cc | 4 +-
tools/grit/grit_args.gni | 3 +-
.../cpp_bundle_generator.py | 2 +-
.../ui/widget/PopupSpecCalculator.java | 9 ++-
.../ui/test/util/UiDisableIfSkipCheck.java | 8 +--
.../ui/widget/PopupSpecCalculator.java | 9 +-
.../ui/test/util/UiDisableIfSkipCheck.java | 8 +-
.../chromium/ui/test/util/UiRestriction.java | 2 +-
ui/base/accelerators/command.cc | 2 +-
ui/base/device_form_factor_android.cc | 2 +-
@@ -184,7 +186,7 @@ License: GPL-2.0-or-later - https://spdx.org/licenses/GPL-2.0-or-later.html
ui/webui/resources/cr_elements/BUILD.gn | 2 +-
.../cr_elements/cr_toolbar/cr_toolbar.css | 6 ++
ui/webui/resources/css/BUILD.gn | 2 +-
172 files changed, 566 insertions(+), 287 deletions(-)
174 files changed, 597 insertions(+), 316 deletions(-)
create mode 100644 chrome/browser/ui/android/strings/cromite_android_chrome_strings_grd/Enable-extensions-Android.grdp
create mode 100644 chrome/browser/ui/android/strings/cromite_android_chrome_strings_grd/Extensions-Android.grdp
create mode 100644 cromite_flags/chrome/browser/about_flags_cc/Extensions-Android.inc
@@ -843,7 +845,7 @@ diff --git a/chrome/browser/chrome_browser_field_trials.cc b/chrome/browser/chro
// Nota bene: Anything here is expected to be short-lived, unless deemed too
// risky to launch to non-desktop platforms. New features being added here
// should be the exception, and not the norm. Instead, you should place the
@@ -133,13 +133,13 @@ void ChromeBrowserFieldTrials::RegisterFeatureOverrides(
@@ -133,17 +133,17 @@ void ChromeBrowserFieldTrials::RegisterFeatureOverrides(
// If enabled, then use desktop page webprefs for Android devices that have
// large displays, specifically tablets and desktops.
@@ -860,6 +862,11 @@ diff --git a/chrome/browser/chrome_browser_field_trials.cc b/chrome/browser/chro
// Enable the link hover status bar.
// TODO(crbug.com/404678510): Remove when the feature is stable.
- feature_overrides.EnableFeature(chrome::android::kLinkHoverStatusBar);
+ // feature_overrides.EnableFeature(chrome::android::kLinkHoverStatusBar);
// If enabled, render processes associated only with tabs in unfocused windows
// will be downgraded to "vis" priority, rather than remaining at "fg". This
@@ -153,8 +153,8 @@ void ChromeBrowserFieldTrials::RegisterFeatureOverrides(
// Enables media capture (tab+window+screen sharing).
@@ -871,8 +878,12 @@ diff --git a/chrome/browser/chrome_browser_field_trials.cc b/chrome/browser/chro
// Enable desktop tab management features.
// TODO(crbug.com/422902625): Remove when rollout is complete to all form
@@ -166,7 +166,7 @@ void ChromeBrowserFieldTrials::RegisterFeatureOverrides(
feature_overrides.EnableFeature(features::kRendererProcessLimitOnAndroid);
@@ -163,10 +163,10 @@ void ChromeBrowserFieldTrials::RegisterFeatureOverrides(
feature_overrides.EnableFeature(chrome::android::kProtectedTabsAndroid);
feature_overrides.EnableFeature(features::kSubframeImportance);
// TODO(crbug.com/422903297): Remove when tablet rollout is complete.
- feature_overrides.EnableFeature(features::kRendererProcessLimitOnAndroid);
+ // feature_overrides.EnableFeature(features::kRendererProcessLimitOnAndroid);
// Enable V8 optimizations for high-end Android Desktop devices.
// TODO(crbug.com/425860368): Remove when the feature is stable.
- feature_overrides.EnableFeature(features::kV8AndroidDesktopHighEndConfig);
@@ -916,7 +927,7 @@ diff --git a/chrome/browser/chrome_browser_field_trials.cc b/chrome/browser/chro
// Enables automatic picture-in-picture.
// TODO(crbug.com/421608904): Remove when rollout is complete to all form
// factors.
@@ -205,49 +205,49 @@ void ChromeBrowserFieldTrials::RegisterFeatureOverrides(
@@ -205,58 +205,58 @@ void ChromeBrowserFieldTrials::RegisterFeatureOverrides(
feature_overrides.EnableFeature(media::kContextMenuPictureInPictureAndroid);
// Disables the enhanced pip transition and uses the default animation.
// TODO(crbug.com/440384447): Remove when enhanced pip transition is fixed.
@@ -985,6 +996,28 @@ diff --git a/chrome/browser/chrome_browser_field_trials.cc b/chrome/browser/chro
// Enable all tabs to have WebContents at all times for desktop platforms.
// TODO(crbug.com/448420873): Remove once we enable this feature for all form
// factors. This is currently blocked by performance regressions on low-end
// Android devices.
- feature_overrides.EnableFeature(features::kWebContentsDiscard);
- feature_overrides.EnableFeature(features::kLazyBrowserInterfaceBroker);
- feature_overrides.EnableFeature(chrome::android::kTabFreezingUsesDiscard);
- feature_overrides.EnableFeature(chrome::android::kLoadAllTabsAtStartup);
+ // feature_overrides.EnableFeature(features::kWebContentsDiscard);
+ // feature_overrides.EnableFeature(features::kLazyBrowserInterfaceBroker);
+ // feature_overrides.EnableFeature(chrome::android::kTabFreezingUsesDiscard);
+ // feature_overrides.EnableFeature(chrome::android::kLoadAllTabsAtStartup);
// Enable the ability for extensions to override chrome pages.
// TODO(crbug.com/404069963): Remove flag when the feature is verified to be
@@ -275,7 +275,7 @@ void ChromeBrowserFieldTrials::RegisterFeatureOverrides(
// Enables the ability to specify a platform-specific zoom scaling that will
// apply transparently to all pages.
// TODO(crbug.com/450281745): Remove once feature is enabled by default.
- feature_overrides.EnableFeature(::features::kAndroidDesktopZoomScaling);
+ // feature_overrides.EnableFeature(::features::kAndroidDesktopZoomScaling);
#endif // BUILDFLAG(IS_DESKTOP_ANDROID)
// Desktop-first features which are past incubation should either end up here,
// or to a finch trial that enables it for all form factors.
diff --git a/chrome/browser/chrome_browser_interface_binders_webui.cc b/chrome/browser/chrome_browser_interface_binders_webui.cc
--- a/chrome/browser/chrome_browser_interface_binders_webui.cc
+++ b/chrome/browser/chrome_browser_interface_binders_webui.cc
@@ -2110,7 +2143,57 @@ diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/brow
mContext = context;
mCurrentTabSupplier = currentTabSupplier;
mTabCreator = tabCreator;
@@ -165,7 +167,8 @@ public class ExtensionsMenuCoordinator implements Destroyable {
@@ -129,6 +131,21 @@ public class ExtensionsMenuCoordinator implements Destroyable {
}
};
+ mExtensionsMenuButton.setDelegate(
+ new ListMenuDelegate() {
+ @Override
+ public RectProvider getRectProvider(
+ View listMenuHostingView) {
+ return MenuBuilderHelper.getRectProvider(
+ mExtensionsMenuButton);
+ }
+
+ @Override
+ public ListMenu getListMenu() {
+ return listMenu;
+ }
+ });
+
mMediator =
new ExtensionsMenuMediator(
mContext,
@@ -137,35 +154,14 @@ public class ExtensionsMenuCoordinator implements Destroyable {
mCurrentTabSupplier,
mExtensionModels,
() -> {
- mExtensionsMenuButton.setDelegate(
- new ListMenuDelegate() {
- @Override
- public RectProvider getRectProvider(
- View listMenuHostingView) {
- return MenuBuilderHelper.getRectProvider(
- mExtensionsMenuButton);
- }
-
- @Override
- public ListMenu getListMenu() {
- return listMenu;
- }
- });
- if (mShouldShowMenuOnInit) {
- if (mExtensionsMenuButton.getHost().isMenuShowing()) {
- mExtensionsMenuButton.dismiss();
- } else {
- mExtensionsMenuButton.showMenu();
- }
- mShouldShowMenuOnInit = false;
- }
},
(extensionsSupported) -> {
int visibility = extensionsSupported ? View.VISIBLE : View.GONE;
mExtensionsMenuButton.setVisibility(visibility);
mExtensionsMenuTabSwitcherDivider.setVisibility(visibility);
},
@@ -3263,6 +3346,32 @@ diff --git a/extensions/common/extension_features.h b/extensions/common/extensio
} // namespace extensions_features
#endif // EXTENSIONS_COMMON_EXTENSION_FEATURES_H_
diff --git a/extensions/common/extension_l10n_util.cc b/extensions/common/extension_l10n_util.cc
--- a/extensions/common/extension_l10n_util.cc
+++ b/extensions/common/extension_l10n_util.cc
@@ -471,8 +471,10 @@ bool GetValidLocales(const base::FilePath& locale_path,
}
if (valid_locales->empty()) {
+#if !BUILDFLAG(ENABLE_DESKTOP_ANDROID_EXTENSIONS_CROMITE)
*error = errors::kLocalesNoValidLocaleNamesListed;
return false;
+#endif
}
return true;
@@ -567,7 +569,11 @@ bool ShouldSkipValidation(const base::FilePath& locales_path,
// '.svn' directories.
base::FilePath relative_path;
if (!locales_path.AppendRelativePath(locale_path, &relative_path)) {
+#if BUILDFLAG(ENABLE_DESKTOP_ANDROID_EXTENSIONS_CROMITE)
+ return true;
+#else
NOTREACHED();
+#endif
}
std::string subdir = relative_path.MaybeAsASCII();
if (subdir.empty())
diff --git a/extensions/common/features/feature.cc b/extensions/common/features/feature.cc
--- a/extensions/common/features/feature.cc
+++ b/extensions/common/features/feature.cc
@@ -3275,6 +3384,19 @@ diff --git a/extensions/common/features/feature.cc b/extensions/common/features/
return DESKTOP_ANDROID_PLATFORM;
#else
return UNSPECIFIED_PLATFORM;
diff --git a/extensions/common/manifest_handlers/default_locale_handler.cc b/extensions/common/manifest_handlers/default_locale_handler.cc
--- a/extensions/common/manifest_handlers/default_locale_handler.cc
+++ b/extensions/common/manifest_handlers/default_locale_handler.cc
@@ -115,6 +115,9 @@ bool DefaultLocaleHandler::Validate(
// Only message file for default locale has to exist.
if (!has_default_locale_message_file) {
+#if BUILDFLAG(ENABLE_DESKTOP_ANDROID_EXTENSIONS_CROMITE)
+ if (base::PathExists(default_locale_path)) return true;
+#endif
*error = errors::kLocalesNoDefaultMessages;
return false;
}
diff --git a/extensions/renderer/bindings/api_binding_util.cc b/extensions/renderer/bindings/api_binding_util.cc
--- a/extensions/renderer/bindings/api_binding_util.cc
+++ b/extensions/renderer/bindings/api_binding_util.cc