From 3d1185d5946c7b85c0ecb32687b84c4a56cfe8e2 Mon Sep 17 00:00:00 2001 From: Carmelo Messina Date: Wed, 11 Mar 2026 12:43:59 +0100 Subject: [PATCH] Patches for v146 (need some work) --- .../Add-an-always-incognito-mode.patch | 171 +- .../Add-bookmark-import-export-actions.patch | 84 +- ...Add-lifetime-options-for-permissions.patch | 473 +-- .../Add-menu-item-to-bookmark-all-tabs.patch | 102 +- .../Add-option-to-force-tablet-UI.patch | 69 +- ...tting-to-enable-Credman-for-passkeys.patch | 36 +- ...isable-some-signed-exchange-features.patch | 14 +- ...ndroid-Dynamic-Performance-Framework.patch | 14 +- ...Enable-HighEfficiencyMode-by-default.patch | 23 +- .../Enable-extension-in-incognito.patch | 488 +-- .../Enable-native-Android-autofill.patch | 99 +- ...al-support-for-extensions-on-Android.patch | 478 +-- .../Guard-for-user-agent-reduction.patch | 22 +- .../Move-navigation-bar-to-bottom.patch | 332 +- ...ulti-Screen-Window-Placement-API-fix.patch | 16 +- build/patches/OpenSearch-miscellaneous.patch | 12 +- .../Set-the-screen-frame-rate-to-60-Hz.patch | 65 +- build/patches/Show-NTP-at-startup.patch | 95 +- build/patches/add-browser-policy.patch | 71 +- .../eyeo-133.0.6943.49-android_api.patch | 3749 +---------------- 20 files changed, 1256 insertions(+), 5157 deletions(-) diff --git a/build/patches/Add-an-always-incognito-mode.patch b/build/patches/Add-an-always-incognito-mode.patch index 8ed68f0f..d19d41c7 100644 --- a/build/patches/Add-an-always-incognito-mode.patch +++ b/build/patches/Add-an-always-incognito-mode.patch @@ -32,7 +32,7 @@ License: GPL-3.0-only - https://spdx.org/licenses/GPL-3.0-only.html .../CustomTabAppMenuPropertiesDelegate.java | 5 + .../CustomTabIntentDataProvider.java | 10 + .../browser/download/DownloadUtils.java | 13 +- - .../history/HistoryContentManager.java | 20 +- + .../history/HistoryContentManager.java | 10 +- .../browser/history/HistoryManager.java | 27 ++- .../chrome/browser/history/HistoryPage.java | 16 ++ .../native_page/NativePageFactory.java | 4 +- @@ -68,7 +68,7 @@ License: GPL-3.0-only - https://spdx.org/licenses/GPL-3.0-only.html chrome/browser/prefs/browser_prefs.cc | 5 + chrome/browser/profiles/profile_selections.cc | 10 + chrome/browser/profiles/profile_selections.h | 7 +- - .../signin/services/ProfileDataCache.java | 3 +- + .../signin/services/ProfileDataCache.java | 5 +- .../browser/ui/android/native_page/BUILD.gn | 2 + .../browser/ui/native_page/NativePage.java | 17 +- .../browser/omnibox/LocationBarMediator.java | 8 + @@ -89,7 +89,7 @@ License: GPL-3.0-only - https://spdx.org/licenses/GPL-3.0-only.html .../add-an-always-incognito-mode.inc | 1 + .../add-an-always-incognito-mode.inc | 3 + .../add-an-always-incognito-mode.inc | 1 + - 70 files changed, 808 insertions(+), 116 deletions(-) + 70 files changed, 808 insertions(+), 108 deletions(-) create mode 100644 chrome/android/java/res/xml/incognito_preferences.xml create mode 100644 chrome/android/java/src/org/chromium/chrome/browser/AlwaysIncognitoLinkInterceptor.java create mode 100644 chrome/android/java/src/org/chromium/chrome/browser/privacy/settings/IncognitoSettings.java @@ -102,7 +102,7 @@ License: GPL-3.0-only - https://spdx.org/licenses/GPL-3.0-only.html diff --git a/chrome/android/chrome_java_resources.gni b/chrome/android/chrome_java_resources.gni --- a/chrome/android/chrome_java_resources.gni +++ b/chrome/android/chrome_java_resources.gni -@@ -644,6 +644,7 @@ chrome_java_resources = [ +@@ -653,6 +653,7 @@ chrome_java_resources = [ "java/res/xml/main_preferences.xml", "java/res/xml/manage_sync_preferences.xml", "java/res/xml/personalize_google_services_preferences.xml", @@ -121,7 +121,7 @@ diff --git a/chrome/android/chrome_java_sources.gni b/chrome/android/chrome_java "java/src/com/google/android/apps/chrome/appwidget/bookmarks/BookmarkThumbnailWidgetProvider.java", "java/src/org/chromium/chrome/browser/ActivityTabProvider.java", "java/src/org/chromium/chrome/browser/ActivityUtils.java", -@@ -958,6 +959,7 @@ chrome_java_sources = [ +@@ -969,6 +970,7 @@ chrome_java_sources = [ "java/src/org/chromium/chrome/browser/privacy/settings/PasswordEchoSettingHandlerFactory.java", "java/src/org/chromium/chrome/browser/privacy/settings/PrivacyPreferencesManagerImpl.java", "java/src/org/chromium/chrome/browser/privacy/settings/PrivacySettings.java", @@ -248,7 +248,7 @@ new file mode 100644 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 +++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java -@@ -80,6 +80,10 @@ import org.chromium.build.annotations.Nullable; +@@ -84,6 +84,10 @@ import org.chromium.build.annotations.Nullable; import org.chromium.build.annotations.UsedByReflection; import org.chromium.cc.input.BrowserControlsState; import org.chromium.chrome.R; @@ -259,14 +259,14 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedAct import org.chromium.chrome.browser.IntentHandler.ExternalAppId; import org.chromium.chrome.browser.IntentHandler.TabOpenType; import org.chromium.chrome.browser.accessibility.settings.CaretBrowsingDialog; -@@ -813,12 +817,17 @@ public class ChromeTabbedActivity extends ChromeActivity implements PreAttachInt - BrowserWindowType.NORMAL, currentTabModel, mMultiInstanceManager); +@@ -850,13 +854,18 @@ public class ChromeTabbedActivity extends ChromeActivity implements PreAttachInt + mMultiInstanceManager); // For saving non-incognito tab closures for Recent Tabs. - mHistoricalTabModelObserver = - new HistoricalTabModelObserver(mTabModelSelector.getTabGroupModelFilter(false)); - mHistoricalTabModelObserver.addSecondaryTabModelSupplier( -- ArchivedTabModelOrchestrator.getForProfile(currentTabModel.getProfile()) +- ArchivedTabModelOrchestrator.getForProfile( + boolean alwaysIncognito = AlwaysIncognitoLinkInterceptor.isAlwaysIncognito(); + PrefService prefService = UserPrefs.get(ProfileManager.getLastUsedRegularProfile()); + boolean historyEnabledInIncognito = @@ -275,14 +275,15 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedAct + mHistoricalTabModelObserver = + new HistoricalTabModelObserver(mTabModelSelector.getTabGroupModelFilter(alwaysIncognito)); + mHistoricalTabModelObserver.addSecondaryTabModelSupplier( -+ ArchivedTabModelOrchestrator.getForProfile(currentTabModel.getProfile()) ++ ArchivedTabModelOrchestrator.getForProfile( + mTabModelSelector.getCurrentModel().getProfile()) ::getTabModel); - + } // Defer creation of this helper so it triggers after TabGroupModelFilter observers. mUndoRefocusHelper = new UndoRefocusHelper( -@@ -3306,7 +3315,7 @@ public class ChromeTabbedActivity extends ChromeActivity implements PreAttachInt +@@ -3426,7 +3435,7 @@ public class ChromeTabbedActivity extends ChromeActivity implements PreAttachInt shouldPersistAcrossReboots() && persistentState != null && persistentState.getBoolean(IS_INCOGNITO_SELECTED, false); @@ -294,7 +295,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedAct diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java --- a/chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java -@@ -110,6 +110,7 @@ import org.chromium.chrome.browser.contextualsearch.ContextualSearchManager; +@@ -107,6 +107,7 @@ import org.chromium.chrome.browser.contextualsearch.ContextualSearchManager; import org.chromium.chrome.browser.desktop_site.DesktopSiteUtils; import org.chromium.chrome.browser.device.DeviceClassManager; import org.chromium.chrome.browser.devtools.DevToolsWindowAndroid; @@ -302,7 +303,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActiv import org.chromium.chrome.browser.dom_distiller.DomDistillerUiUtils; import org.chromium.chrome.browser.dom_distiller.ReaderModeManager; import org.chromium.chrome.browser.download.DownloadManagerService; -@@ -2212,6 +2213,9 @@ public abstract class ChromeActivity extends AsyncInitializationActivity +@@ -2222,6 +2223,9 @@ public abstract class ChromeActivity extends AsyncInitializationActivity throw new IllegalStateException( "Attempting to access TabCreator before initialization"); } @@ -315,7 +316,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActiv diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateImpl.java --- a/chrome/android/java/src/org/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateImpl.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateImpl.java -@@ -94,6 +94,8 @@ import java.util.Iterator; +@@ -99,6 +99,8 @@ import java.util.Iterator; import java.util.List; import java.util.function.Supplier; @@ -324,7 +325,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/appmenu/App /** * Base implementation of {@link AppMenuPropertiesDelegate} that handles hiding and showing menu * items based on activity state. -@@ -675,8 +677,9 @@ public abstract class AppMenuPropertiesDelegateImpl implements AppMenuProperties +@@ -686,8 +688,9 @@ public abstract class AppMenuPropertiesDelegateImpl implements AppMenuProperties && !isNativePage && !isFileScheme && !isContentScheme @@ -442,7 +443,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/Cust import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; -@@ -1362,6 +1365,13 @@ public class CustomTabIntentDataProvider extends BrowserServicesIntentDataProvid +@@ -1373,6 +1376,13 @@ public class CustomTabIntentDataProvider extends BrowserServicesIntentDataProvid return getInitialActivityWidth() > 0; } @@ -496,25 +497,15 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/Downlo diff --git a/chrome/android/java/src/org/chromium/chrome/browser/history/HistoryContentManager.java b/chrome/android/java/src/org/chromium/chrome/browser/history/HistoryContentManager.java --- a/chrome/android/java/src/org/chromium/chrome/browser/history/HistoryContentManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/history/HistoryContentManager.java -@@ -240,16 +240,7 @@ public class HistoryContentManager implements SignInStateObserver, PrefObserver +@@ -374,6 +374,7 @@ public class HistoryContentManager implements SignInStateObserver, PrefObserver }; mTabSupplier = tabSupplier; -- mHistorySyncPromoCoordinator = -- new SigninPromoCoordinator( -- mActivity, -- profile, -- new HistoryPageSigninPromoDelegate( -- mActivity, -- profile, -- SigninAndHistorySyncActivityLauncherImpl.get(), -- this::updateHistorySyncPromoVisibility, -- /* isCreatedInCct= */ launchedForApp)); -+ mHistorySyncPromoCoordinator = null; - - // History service is not keyed for Incognito profiles and {@link HistoryServiceFactory} - // explicitly redirects to use regular profile for Incognito case. -@@ -308,8 +299,9 @@ public class HistoryContentManager implements SignInStateObserver, PrefObserver ++ canShowSigninPromo = false; + if (canShowSigninPromo) { + mHistorySyncPromoCoordinator = + new SigninPromoCoordinator( +@@ -453,8 +454,9 @@ public class HistoryContentManager implements SignInStateObserver, PrefObserver mHistoryAdapter.generateFooterItems(); // Listen to changes in sign in state. @@ -526,7 +517,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/history/History // Create PrefChangeRegistrar to receive notifications on preference changes. mPrefChangeRegistrar = PrefServiceUtil.createFor(profile); -@@ -386,8 +378,8 @@ public class HistoryContentManager implements SignInStateObserver, PrefObserver +@@ -531,8 +533,8 @@ public class HistoryContentManager implements SignInStateObserver, PrefObserver mHistoryAdapter.onDestroyed(); mLargeIconBridge.destroy(); mLargeIconBridge = null; @@ -540,7 +531,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/history/History diff --git a/chrome/android/java/src/org/chromium/chrome/browser/history/HistoryManager.java b/chrome/android/java/src/org/chromium/chrome/browser/history/HistoryManager.java --- a/chrome/android/java/src/org/chromium/chrome/browser/history/HistoryManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/history/HistoryManager.java -@@ -63,6 +63,14 @@ import java.util.List; +@@ -66,6 +66,14 @@ import java.util.List; import java.util.function.Function; import java.util.function.Supplier; @@ -555,7 +546,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/history/History /** Combines and manages the different UI components of browsing history. */ @NullMarked public class HistoryManager -@@ -168,7 +176,7 @@ public class HistoryManager +@@ -177,7 +185,7 @@ public class HistoryManager mUmaRecorder.recordOpenHistory(); // If incognito placeholder is shown, we don't need to create History UI elements. @@ -564,7 +555,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/history/History mSelectableListLayout = null; mRootView = getIncognitoHistoryPlaceholderView(); return; -@@ -460,9 +468,22 @@ public class HistoryManager +@@ -472,9 +480,22 @@ public class HistoryManager onBackPressStateChanged(); } @@ -588,7 +579,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/history/History // If Incognito placeholder is shown no need to call any destroy method. return; } -@@ -523,7 +544,7 @@ public class HistoryManager +@@ -542,7 +563,7 @@ public class HistoryManager * @return True if manager handles this event, false if it decides to ignore. */ private boolean onBackPressed() { @@ -600,7 +591,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/history/History diff --git a/chrome/android/java/src/org/chromium/chrome/browser/history/HistoryPage.java b/chrome/android/java/src/org/chromium/chrome/browser/history/HistoryPage.java --- a/chrome/android/java/src/org/chromium/chrome/browser/history/HistoryPage.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/history/HistoryPage.java -@@ -21,6 +21,14 @@ import org.chromium.components.embedder_support.util.UrlConstants; +@@ -25,6 +25,14 @@ import org.chromium.ui.modaldialog.ModalDialogManager; import java.util.function.Supplier; @@ -615,7 +606,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/history/History /** Native page for managing browsing history. */ @NullMarked public class HistoryPage extends BasicNativePage { -@@ -51,6 +59,14 @@ public class HistoryPage extends BasicNativePage { +@@ -61,6 +69,14 @@ public class HistoryPage extends BasicNativePage { BackPressManager backPressManager) { super(host); @@ -641,7 +632,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/native_page/Nat import org.chromium.chrome.browser.app.ChromeActivity; import org.chromium.chrome.browser.app.download.home.DownloadPage; import org.chromium.chrome.browser.back_press.BackPressManager; -@@ -457,7 +458,8 @@ public class NativePageFactory { +@@ -465,7 +466,8 @@ public class NativePageFactory { NativePage page; @@ -654,7 +645,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/native_page/Nat diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/RecentTabsManager.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/RecentTabsManager.java --- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/RecentTabsManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/RecentTabsManager.java -@@ -48,6 +48,16 @@ import org.chromium.ui.base.WindowAndroid; +@@ -43,6 +43,16 @@ import org.chromium.ui.base.WindowAndroid; import org.chromium.ui.modaldialog.ModalDialogManager; import org.chromium.url.GURL; @@ -671,7 +662,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/RecentTabsM import java.util.HashMap; import java.util.List; import java.util.Map; -@@ -120,7 +130,8 @@ public class RecentTabsManager +@@ -114,7 +124,8 @@ public class RecentTabsManager SnackbarManager snackbarManager, Runnable showHistoryManager, RecentlyClosedEntriesManager recentlyClosedEntriesManager) { @@ -681,7 +672,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/RecentTabsM mActiveTab = tab; mShowHistoryManager = showHistoryManager; mForeignSessionHelper = new ForeignSessionHelper(profile); -@@ -310,6 +321,22 @@ public class RecentTabsManager +@@ -285,6 +296,22 @@ public class RecentTabsManager */ public void openRecentlyClosedTab(RecentlyClosedTab tab, int windowDisposition) { if (mIsDestroyed) return; @@ -895,7 +886,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/settings/Fragme import org.chromium.components.browser_ui.accessibility.AccessibilitySettings; import org.chromium.components.browser_ui.bottomsheet.BottomSheetController; import org.chromium.components.browser_ui.settings.FragmentSettingsNavigation; -@@ -223,6 +224,9 @@ public class FragmentDependencyProvider extends FragmentManager.FragmentLifecycl +@@ -225,6 +226,9 @@ public class FragmentDependencyProvider extends FragmentManager.FragmentLifecycl SigninAndHistorySyncActivityLauncherImpl.get(), new SettingsCustomTabLauncherImpl())); } @@ -944,7 +935,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/tab_restore diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/tab_restore/HistoricalTabSaverImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/tab_restore/HistoricalTabSaverImpl.java --- a/chrome/android/java/src/org/chromium/chrome/browser/tab/tab_restore/HistoricalTabSaverImpl.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/tab_restore/HistoricalTabSaverImpl.java -@@ -30,6 +30,8 @@ import java.util.Collections; +@@ -27,6 +27,8 @@ import java.util.Collections; import java.util.List; import java.util.function.Supplier; @@ -953,7 +944,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/tab_restore /** Creates historical entries in TabRestoreService. */ @NullMarked @JNINamespace("historical_tab_saver") -@@ -87,10 +89,10 @@ public class HistoricalTabSaverImpl implements HistoricalTabSaver { +@@ -75,10 +77,10 @@ public class HistoricalTabSaverImpl implements HistoricalTabSaver { } @Override @@ -966,7 +957,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/tab_restore } @Override -@@ -151,7 +153,7 @@ public class HistoricalTabSaverImpl implements HistoricalTabSaver { +@@ -139,7 +141,7 @@ public class HistoricalTabSaverImpl implements HistoricalTabSaver { // If there is only a single valid tab remaining save it individually. if (validEntries.size() == 1 && validEntries.get(0).isSingleTab()) { @@ -975,7 +966,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/tab_restore return; } -@@ -191,7 +193,7 @@ public class HistoricalTabSaverImpl implements HistoricalTabSaver { +@@ -179,7 +181,7 @@ public class HistoricalTabSaverImpl implements HistoricalTabSaver { CollectionUtil.integerCollectionToIntArray(savedStateVersions)); } @@ -984,7 +975,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/tab_restore RecordHistogram.recordEnumeratedHistogram( "Tabs.RecentlyClosed.HistoricalSaverCloseType", HistoricalSaverCloseType.TAB, -@@ -204,7 +206,8 @@ public class HistoricalTabSaverImpl implements HistoricalTabSaver { +@@ -192,7 +194,8 @@ public class HistoricalTabSaverImpl implements HistoricalTabSaver { tab, index, getWebContentsState(tab).buffer(), @@ -994,7 +985,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/tab_restore } /** -@@ -212,7 +215,7 @@ public class HistoricalTabSaverImpl implements HistoricalTabSaver { +@@ -200,7 +203,7 @@ public class HistoricalTabSaverImpl implements HistoricalTabSaver { * internal Chrome scheme, about:blank, or a native page and it cannot be incognito. */ private boolean shouldSave(Tab tab) { @@ -1003,7 +994,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/tab_restore // Check the secondary tab model to see if the tab was moved instead of deleted. if (tabIdExistsInSecondaryModel(tab.getId())) return false; -@@ -300,7 +303,7 @@ public class HistoricalTabSaverImpl implements HistoricalTabSaver { +@@ -280,7 +283,7 @@ public class HistoricalTabSaverImpl implements HistoricalTabSaver { @NativeMethods interface Natives { @@ -1023,7 +1014,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/Tab import org.chromium.chrome.browser.ActivityTabProvider; import org.chromium.chrome.browser.ai.AiAssistantService; import org.chromium.chrome.browser.app.appmenu.AppMenuPropertiesDelegateImpl; -@@ -247,7 +248,8 @@ public class TabbedAppMenuPropertiesDelegate extends AppMenuPropertiesDelegateIm +@@ -256,7 +257,8 @@ public class TabbedAppMenuPropertiesDelegate extends AppMenuPropertiesDelegateIm // When the feature is enabled, show either "New Incognito tab" in incognito mode // or "New tab" in normal mode. When the feature is disabled, show both. @@ -1036,7 +1027,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/Tab diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator.java --- a/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator.java -@@ -219,6 +219,8 @@ import org.chromium.content_public.common.ContentSwitches; +@@ -236,6 +236,8 @@ import org.chromium.content_public.common.ContentSwitches; import org.chromium.ui.UiUtils; import org.chromium.ui.base.ActivityWindowAndroid; import org.chromium.ui.base.DeviceFormFactor; @@ -1045,7 +1036,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/Tab import org.chromium.ui.base.IntentRequestTracker; import org.chromium.ui.base.UiAndroidFeatureList; import org.chromium.ui.display.DisplayUtil; -@@ -1318,7 +1320,7 @@ public class TabbedRootUiCoordinator extends RootUiCoordinator { +@@ -1401,7 +1403,7 @@ public class TabbedRootUiCoordinator extends RootUiCoordinator { () -> { mTabCreatorManagerSupplier .get() @@ -1087,7 +1078,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabMod import org.chromium.chrome.browser.flags.ActivityType; import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.multiwindow.MultiInstanceManager; -@@ -139,6 +140,8 @@ public class TabModelSelectorImpl extends TabModelSelectorBase implements TabMod +@@ -142,6 +143,8 @@ public class TabModelSelectorImpl extends TabModelSelectorBase implements TabMod ProfileProvider profileProvider = mProfileProviderSupplier.get(); assert profileProvider != null; @@ -1107,7 +1098,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabPer import org.chromium.chrome.browser.app.tabmodel.AsyncTabParamsManagerSingleton; import org.chromium.chrome.browser.crypto.CipherFactory; import org.chromium.chrome.browser.flags.ChromeFeatureList; -@@ -723,6 +724,12 @@ public class TabPersistentStoreImpl implements TabPersistentStore { +@@ -727,6 +728,12 @@ public class TabPersistentStoreImpl implements TabPersistentStore { } } } @@ -1123,7 +1114,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabPer diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java --- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java -@@ -59,6 +59,7 @@ import org.chromium.build.annotations.Nullable; +@@ -58,6 +58,7 @@ import org.chromium.build.annotations.Nullable; import org.chromium.cc.input.BrowserControlsState; import org.chromium.chrome.R; import org.chromium.chrome.browser.ActivityTabProvider; @@ -1230,10 +1221,10 @@ diff --git a/chrome/browser/android/historical_tab_saver.cc b/chrome/browser/and DCHECK_EQ(tab_group_ids.size(), tab_group_ids.size()); @@ -281,12 +292,13 @@ static void JNI_HistoricalTabSaverImpl_CreateHistoricalTab( const JavaRef& jtab_android, - jint index, + int32_t index, const JavaRef& state, -- jint saved_state_version) { -+ jint saved_state_version, +- int32_t saved_state_version) { ++ int32_t saved_state_version, + jboolean is_always_incognito) { WebContentsStateByteBuffer web_contents_state = WebContentsStateByteBuffer(ScopedJavaLocalRef(state), @@ -1328,7 +1319,7 @@ diff --git a/chrome/browser/content_settings/host_content_settings_map_factory.c +++ b/chrome/browser/content_settings/host_content_settings_map_factory.cc @@ -17,6 +17,7 @@ #include "chrome/browser/search_engines/template_url_service_factory.h" - #include "chrome/browser/supervised_user/supervised_user_settings_service_factory.h" + #include "chrome/browser/supervised_user/family_link_settings_service_factory.h" #include "chrome/common/buildflags.h" +#include "chrome/common/pref_names.h" #include "components/content_settings/core/browser/content_settings_pref_provider.h" @@ -1387,7 +1378,7 @@ diff --git a/chrome/browser/extensions/api/webstore_private/webstore_private_api static_assert(BUILDFLAG(ENABLE_EXTENSIONS_CORE)); using safe_browsing::SafeBrowsingNavigationObserverManager; -@@ -233,6 +239,16 @@ const int kExtensionReferrerUserGestureLimit = 2; +@@ -235,6 +241,16 @@ const int kExtensionReferrerUserGestureLimit = 2; WebstorePrivateApi::Delegate* test_delegate = nullptr; @@ -1404,7 +1395,7 @@ diff --git a/chrome/browser/extensions/api/webstore_private/webstore_private_api // We allow the web store to set a string containing login information when a // purchase is made, so that when a user logs into sync with a different // account we can recognize the situation. The Get function returns the login if -@@ -454,7 +470,7 @@ WebstorePrivateBeginInstallWithManifest3Function::Run() { +@@ -456,7 +472,7 @@ WebstorePrivateBeginInstallWithManifest3Function::Run() { params_ = Params::Create(args()); EXTENSION_FUNCTION_VALIDATE(params_); @@ -1413,7 +1404,7 @@ diff --git a/chrome/browser/extensions/api/webstore_private/webstore_private_api if (!crx_file::id_util::IdIsValid(details().id)) { return RespondNow(BuildResponse(api::webstore_private::Result::kInvalidId, -@@ -976,7 +992,7 @@ void WebstorePrivateBeginInstallWithManifest3Function:: +@@ -987,7 +1003,7 @@ void WebstorePrivateBeginInstallWithManifest3Function:: DCHECK(extension); DCHECK(contents); @@ -1422,7 +1413,7 @@ diff --git a/chrome/browser/extensions/api/webstore_private/webstore_private_api std::string message_from_admin = ExtensionManagementFactory::GetForBrowserContext(profile) -@@ -1012,7 +1028,7 @@ WebstorePrivateCompleteInstallFunction::Run() { +@@ -1023,7 +1039,7 @@ WebstorePrivateCompleteInstallFunction::Run() { std::optional params = CompleteInstall::Params::Create(args()); EXTENSION_FUNCTION_VALIDATE(params); @@ -1431,7 +1422,7 @@ diff --git a/chrome/browser/extensions/api/webstore_private/webstore_private_api if (profile->IsGuestSession() || profile->IsOffTheRecord()) { return RespondNow(Error(kIncognitoError)); } -@@ -1330,7 +1346,7 @@ ExtensionFunction::ResponseValue +@@ -1332,7 +1348,7 @@ ExtensionFunction::ResponseValue WebstorePrivateGetExtensionStatusFunction::BuildResponseWithoutManifest( const ExtensionId& extension_id) { ExtensionInstallStatus status = GetWebstoreExtensionInstallStatus( @@ -1440,7 +1431,7 @@ diff --git a/chrome/browser/extensions/api/webstore_private/webstore_private_api api::webstore_private::ExtensionInstallStatus api_status = ConvertExtensionInstallStatusForAPI(status); return ArgumentList(GetExtensionStatus::Results::Create(api_status)); -@@ -1344,7 +1360,7 @@ void WebstorePrivateGetExtensionStatusFunction::OnManifestParsed( +@@ -1346,7 +1362,7 @@ void WebstorePrivateGetExtensionStatusFunction::OnManifestParsed( return; } @@ -1462,7 +1453,7 @@ diff --git a/chrome/browser/history/history_tab_helper.cc b/chrome/browser/histo #else #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser_finder.h" -@@ -640,6 +643,13 @@ void HistoryTabHelper::TitleWasSet(NavigationEntry* entry) { +@@ -636,6 +639,13 @@ void HistoryTabHelper::TitleWasSet(NavigationEntry* entry) { history::HistoryService* HistoryTabHelper::GetHistoryService() { Profile* profile = Profile::FromBrowserContext(web_contents()->GetBrowserContext()); @@ -1476,7 +1467,7 @@ diff --git a/chrome/browser/history/history_tab_helper.cc b/chrome/browser/histo if (profile->IsOffTheRecord()) { return nullptr; } -@@ -648,6 +658,16 @@ history::HistoryService* HistoryTabHelper::GetHistoryService() { +@@ -644,6 +654,16 @@ history::HistoryService* HistoryTabHelper::GetHistoryService() { profile, ServiceAccessType::IMPLICIT_ACCESS); } @@ -1540,7 +1531,7 @@ diff --git a/chrome/browser/offline_pages/android/offline_page_bridge.cc b/chrom // Must come after all headers that specialize FromJniType() / ToJniType(). #include "chrome/android/chrome_jni_headers/OfflinePageBridge_jni.h" -@@ -727,9 +730,15 @@ void OfflinePageBridge::GetPageByOfflineIdDone( +@@ -728,9 +731,15 @@ void OfflinePageBridge::GetPageByOfflineIdDone( } if (offline_page_model_->IsArchiveInInternalDir(offline_page->file_path)) { @@ -1825,7 +1816,7 @@ diff --git a/chrome/browser/offline_pages/request_coordinator_factory.h b/chrome diff --git a/chrome/browser/prefs/browser_prefs.cc b/chrome/browser/prefs/browser_prefs.cc --- a/chrome/browser/prefs/browser_prefs.cc +++ b/chrome/browser/prefs/browser_prefs.cc -@@ -236,6 +236,7 @@ +@@ -239,6 +239,7 @@ #if BUILDFLAG(IS_ANDROID) #include "chrome/browser/accessibility/accessibility_prefs/android/accessibility_prefs_controller.h" @@ -1833,7 +1824,7 @@ diff --git a/chrome/browser/prefs/browser_prefs.cc b/chrome/browser/prefs/browse #include "chrome/browser/android/ntp/recent_tabs_page_prefs.h" #include "chrome/browser/android/oom_intervention/oom_intervention_decider.h" #include "chrome/browser/android/preferences/browser_prefs_android.h" -@@ -1818,6 +1819,10 @@ void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry, +@@ -1878,6 +1879,10 @@ void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry, usage_stats::UsageStatsBridge::RegisterProfilePrefs(registry); variations::VariationsService::RegisterProfilePrefs(registry); webapps::InstallPromptPrefs::RegisterProfilePrefs(registry); @@ -1898,21 +1889,29 @@ diff --git a/chrome/browser/profiles/profile_selections.h b/chrome/browser/profi diff --git a/chrome/browser/signin/services/android/java/src/org/chromium/chrome/browser/signin/services/ProfileDataCache.java b/chrome/browser/signin/services/android/java/src/org/chromium/chrome/browser/signin/services/ProfileDataCache.java --- a/chrome/browser/signin/services/android/java/src/org/chromium/chrome/browser/signin/services/ProfileDataCache.java +++ b/chrome/browser/signin/services/android/java/src/org/chromium/chrome/browser/signin/services/ProfileDataCache.java -@@ -134,13 +134,12 @@ public class ProfileDataCache implements AccountInfoService.Observer { - @VisibleForTesting +@@ -134,7 +134,6 @@ public class ProfileDataCache implements IdentityManager.Observer, AccountsChang + + private final Context mContext; + private final AccountManagerFacade mAccountManagerFacade; +- private final IdentityManager mIdentityManager; + private final int mImageSize; + // The badge for a given account is selected as follows: + // * If there is a config for that specific account, use that +@@ -150,13 +149,11 @@ public class ProfileDataCache implements IdentityManager.Observer, AccountsChang ProfileDataCache( Context context, + AccountManagerFacade accountManagerFacade, - IdentityManager identityManager, + IdentityManager identityManagerNotUsed, @Px int imageSize, @Nullable BadgeConfig badgeConfig) { - // TODO(crbug.com/341948846): Remove AccountInfoService and update - // populateCache/populateCacheForAllAccounts to use identityManager to get the list of - // accounts - assert identityManager != null; mContext = context; + mAccountManagerFacade = accountManagerFacade; +- mIdentityManager = identityManager; mImageSize = imageSize; mDefaultBadgeConfig = badgeConfig; + mPlaceholderImage = getScaledPlaceholderImage(context, imageSize); diff --git a/chrome/browser/ui/android/native_page/BUILD.gn b/chrome/browser/ui/android/native_page/BUILD.gn --- a/chrome/browser/ui/android/native_page/BUILD.gn +++ b/chrome/browser/ui/android/native_page/BUILD.gn @@ -1997,7 +1996,7 @@ diff --git a/chrome/browser/ui/android/native_page/java/src/org/chromium/chrome/ diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarMediator.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarMediator.java --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarMediator.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarMediator.java -@@ -110,6 +110,11 @@ import org.chromium.ui.interpolators.Interpolators; +@@ -112,6 +112,11 @@ import org.chromium.ui.interpolators.Interpolators; import org.chromium.ui.modaldialog.ModalDialogManager; import org.chromium.url.GURL; @@ -2009,7 +2008,7 @@ diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/brow import java.util.ArrayList; import java.util.Collection; import java.util.List; -@@ -530,6 +535,9 @@ class LocationBarMediator +@@ -532,6 +537,9 @@ class LocationBarMediator if (!DeviceFormFactor.isNonMultiDisplayContextOnTablet(mContext)) return; Tab tab = mLocationBarDataProvider.getTab(); if (tab == null) return; @@ -2022,7 +2021,7 @@ diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/brow 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 -@@ -7027,6 +7027,31 @@ To change this setting, BEGIN_LINKdelete the Chrome d +@@ -7057,6 +7057,31 @@ To change this setting, BEGIN_LINKdelete the Chrome d Cookies, cache, and other site data @@ -2124,7 +2123,7 @@ diff --git a/chrome/browser/ui/search_engines/search_engine_tab_helper.cc b/chro diff --git a/chrome/common/pref_names.h b/chrome/common/pref_names.h --- a/chrome/common/pref_names.h +++ b/chrome/common/pref_names.h -@@ -4118,6 +4118,12 @@ inline constexpr char kOutOfProcessSystemDnsResolutionEnabled[] = +@@ -4125,6 +4125,12 @@ inline constexpr char kOutOfProcessSystemDnsResolutionEnabled[] = "net.out_of_process_system_dns_resolution_enabled"; #endif // BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_LINUX) @@ -2140,7 +2139,7 @@ diff --git a/chrome/common/pref_names.h b/chrome/common/pref_names.h diff --git a/components/content_settings/core/browser/content_settings_pref_provider.cc b/components/content_settings/core/browser/content_settings_pref_provider.cc --- a/components/content_settings/core/browser/content_settings_pref_provider.cc +++ b/components/content_settings/core/browser/content_settings_pref_provider.cc -@@ -134,10 +134,12 @@ void PrefProvider::RegisterProfilePrefs( +@@ -137,10 +137,12 @@ void PrefProvider::RegisterProfilePrefs( PrefProvider::PrefProvider(PrefService* prefs, bool off_the_record, @@ -2153,7 +2152,7 @@ diff --git a/components/content_settings/core/browser/content_settings_pref_prov store_last_modified_(store_last_modified), clock_(base::DefaultClock::GetInstance()) { TRACE_EVENT_BEGIN("startup", "PrefProvider::PrefProvider"); -@@ -160,10 +162,12 @@ PrefProvider::PrefProvider(PrefService* prefs, +@@ -163,10 +165,12 @@ PrefProvider::PrefProvider(PrefService* prefs, WebsiteSettingsRegistry* website_settings = WebsiteSettingsRegistry::GetInstance(); for (const WebsiteSettingsInfo* info : *website_settings) { @@ -2189,7 +2188,7 @@ diff --git a/components/content_settings/core/browser/content_settings_pref_prov diff --git a/components/content_settings/core/browser/host_content_settings_map.cc b/components/content_settings/core/browser/host_content_settings_map.cc --- a/components/content_settings/core/browser/host_content_settings_map.cc +++ b/components/content_settings/core/browser/host_content_settings_map.cc -@@ -286,6 +286,7 @@ struct ContentSettingEntry { +@@ -285,6 +285,7 @@ struct ContentSettingEntry { HostContentSettingsMap::HostContentSettingsMap(PrefService* prefs, bool is_off_the_record, @@ -2197,7 +2196,7 @@ diff --git a/components/content_settings/core/browser/host_content_settings_map. bool store_last_modified, bool restore_session, bool should_record_metrics) -@@ -295,6 +296,7 @@ HostContentSettingsMap::HostContentSettingsMap(PrefService* prefs, +@@ -294,6 +295,7 @@ HostContentSettingsMap::HostContentSettingsMap(PrefService* prefs, #endif prefs_(prefs), is_off_the_record_(is_off_the_record), @@ -2205,7 +2204,7 @@ diff --git a/components/content_settings/core/browser/host_content_settings_map. store_last_modified_(store_last_modified), allow_invalid_secondary_pattern_for_testing_(false), clock_(base::DefaultClock::GetInstance()) { -@@ -308,7 +310,7 @@ HostContentSettingsMap::HostContentSettingsMap(PrefService* prefs, +@@ -307,7 +309,7 @@ HostContentSettingsMap::HostContentSettingsMap(PrefService* prefs, policy_provider->AddObserver(this); auto pref_provider_ptr = std::make_unique( diff --git a/build/patches/Add-bookmark-import-export-actions.patch b/build/patches/Add-bookmark-import-export-actions.patch index 93b5acde..8a047e2f 100644 --- a/build/patches/Add-bookmark-import-export-actions.patch +++ b/build/patches/Add-bookmark-import-export-actions.patch @@ -94,7 +94,7 @@ diff --git a/chrome/android/java/res/menu/bookmark_toolbar_menu_improved.xml b/c diff --git a/chrome/android/java/src/org/chromium/chrome/browser/TabbedModeTabDelegateFactory.java b/chrome/android/java/src/org/chromium/chrome/browser/TabbedModeTabDelegateFactory.java --- a/chrome/android/java/src/org/chromium/chrome/browser/TabbedModeTabDelegateFactory.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/TabbedModeTabDelegateFactory.java -@@ -11,6 +11,7 @@ import org.chromium.base.supplier.ObservableSupplier; +@@ -11,6 +11,7 @@ import org.chromium.base.supplier.NonNullObservableSupplier; import org.chromium.base.supplier.OneshotSupplier; import org.chromium.build.annotations.NullMarked; import org.chromium.build.annotations.Nullable; @@ -109,7 +109,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/TabbedModeTabDe - private final Activity mActivity; + private final ChromeActivity mActivity; private final BrowserControlsVisibilityDelegate mAppBrowserControlsVisibilityDelegate; - private final Supplier mShareDelegateSupplier; + private final Supplier<@Nullable ShareDelegate> mShareDelegateSupplier; private final Supplier mEphemeralTabCoordinatorSupplier; @@ -97,7 +98,7 @@ public class TabbedModeTabDelegateFactory implements TabDelegateFactory { private final RecentlyClosedEntriesManager mRecentlyClosedEntriesManager; @@ -118,7 +118,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/TabbedModeTabDe - Activity activity, + ChromeActivity activity, BrowserControlsVisibilityDelegate appBrowserControlsVisibilityDelegate, - Supplier shareDelegateSupplier, + Supplier<@Nullable ShareDelegate> shareDelegateSupplier, Supplier ephemeralTabCoordinatorSupplier, diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/bookmarks/BookmarkActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/app/bookmarks/BookmarkActivity.java --- a/chrome/android/java/src/org/chromium/chrome/browser/app/bookmarks/BookmarkActivity.java @@ -132,9 +132,9 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/bookmarks/B import android.content.ComponentName; import android.content.Intent; import android.text.TextUtils; -@@ -36,6 +38,9 @@ import org.chromium.components.browser_ui.modaldialog.AppModalPresenter; - import org.chromium.ui.modaldialog.ModalDialogManager; +@@ -51,6 +53,9 @@ import org.chromium.ui.modaldialog.ModalDialogManager; import org.chromium.ui.modaldialog.ModalDialogManager.ModalDialogType; + import org.chromium.ui.util.ColorUtils; +import org.chromium.ui.base.ActivityWindowAndroid; +import org.chromium.ui.base.IntentRequestTracker; @@ -142,9 +142,9 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/bookmarks/B /** * The activity that displays the bookmark UI on the phone. It keeps a {@link * BookmarkManagerCoordinator} inside of it and creates a snackbar manager. This activity should -@@ -51,6 +56,9 @@ public class BookmarkActivity extends SnackbarActivity { - private @Nullable BookmarkOpener mBookmarkOpener; +@@ -67,6 +72,9 @@ public class BookmarkActivity extends SnackbarActivity { private @Nullable OnKeyDownHandler mOnKeyDownHandler; + private @Nullable ActivityWindowAndroid mWindowAndroid; + private ActivityWindowAndroid mWindowAndroid; + private IntentRequestTracker mIntentRequestTracker; @@ -152,7 +152,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/bookmarks/B @Override protected void onProfileAvailable(Profile profile) { super.onProfileAvailable(profile); -@@ -84,6 +92,14 @@ public class BookmarkActivity extends SnackbarActivity { +@@ -131,6 +139,14 @@ public class BookmarkActivity extends SnackbarActivity { mOnKeyDownHandler = BackPressHelper.create( this, getOnBackPressedDispatcher(), mBookmarkManagerCoordinator); @@ -167,7 +167,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/bookmarks/B } @Override -@@ -111,6 +127,7 @@ public class BookmarkActivity extends SnackbarActivity { +@@ -163,6 +179,7 @@ public class BookmarkActivity extends SnackbarActivity { @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); @@ -175,7 +175,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/bookmarks/B if (requestCode == EDIT_BOOKMARK_REQUEST_CODE && resultCode == RESULT_OK) { assumeNonNull(data); BookmarkId bookmarkId = -@@ -120,6 +137,21 @@ public class BookmarkActivity extends SnackbarActivity { +@@ -172,6 +189,21 @@ public class BookmarkActivity extends SnackbarActivity { } } @@ -235,7 +235,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/native_page/Nat private final BottomSheetController mBottomSheetController; private final Supplier mNewTabPageCreationTracker; private final BrowserControlsManager mBrowserControlsManager; -@@ -326,7 +327,7 @@ public class NativePageFactory { +@@ -331,7 +332,7 @@ public class NativePageFactory { mTabModelSelector, mEdgeToEdgeControllerSupplier), mActivity.getComponentName(), @@ -247,7 +247,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/native_page/Nat diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn --- a/chrome/browser/BUILD.gn +++ b/chrome/browser/BUILD.gn -@@ -208,6 +208,8 @@ static_library("browser") { +@@ -209,6 +209,8 @@ static_library("browser") { "bad_message.h", "bookmarks/bookmark_model_factory.cc", "bookmarks/bookmark_model_factory.h", @@ -256,7 +256,7 @@ diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn "bookmarks/chrome_bookmark_client.cc", "bookmarks/chrome_bookmark_client.h", "bookmarks/managed_bookmark_service_factory.cc", -@@ -1531,6 +1533,13 @@ static_library("browser") { +@@ -1507,6 +1509,13 @@ static_library("browser") { "webdata_services/web_data_service_factory.cc", ] @@ -270,7 +270,7 @@ diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn configs += [ "//build/config/compiler:wexit_time_destructors", "//build/config:precompiled_headers", -@@ -3703,8 +3712,6 @@ static_library("browser") { +@@ -3684,8 +3693,6 @@ static_library("browser") { "bookmarks/bookmark_expanded_state_tracker.h", "bookmarks/bookmark_expanded_state_tracker_factory.cc", "bookmarks/bookmark_expanded_state_tracker_factory.h", @@ -322,7 +322,7 @@ diff --git a/chrome/browser/bookmarks/android/bookmark_bridge.cc b/chrome/browse } void BookmarkBridge::Destroy(JNIEnv* env) { -@@ -844,6 +870,173 @@ jint BookmarkBridge::GetTotalBookmarkCount( +@@ -841,6 +867,173 @@ int32_t BookmarkBridge::GetTotalBookmarkCount(JNIEnv* env, return count; } @@ -494,8 +494,8 @@ diff --git a/chrome/browser/bookmarks/android/bookmark_bridge.cc b/chrome/browse +void BookmarkBridge::FileSelectionCanceled() {} + void BookmarkBridge::SetBookmarkTitle(JNIEnv* env, - jlong id, - jint type, + int64_t id, + int32_t type, diff --git a/chrome/browser/bookmarks/android/bookmark_bridge.h b/chrome/browser/bookmarks/android/bookmark_bridge.h --- a/chrome/browser/bookmarks/android/bookmark_bridge.h +++ b/chrome/browser/bookmarks/android/bookmark_bridge.h @@ -540,8 +540,8 @@ diff --git a/chrome/browser/bookmarks/android/bookmark_bridge.h b/chrome/browser void LoadEmptyPartnerBookmarkShimForTesting(JNIEnv* env); @@ -119,6 +129,17 @@ class BookmarkBridge : public ProfileObserver, - jlong id, - jint type); + int64_t id, + int32_t type); + void ImportBookmarks(JNIEnv* env, + const base::android::JavaRef& obj, @@ -557,7 +557,7 @@ diff --git a/chrome/browser/bookmarks/android/bookmark_bridge.h b/chrome/browser void GetAllFoldersWithDepths( JNIEnv* env, const base::android::JavaRef& j_folders_obj, -@@ -379,6 +400,8 @@ class BookmarkBridge : public ProfileObserver, +@@ -372,6 +393,8 @@ class BookmarkBridge : public ProfileObserver, void CreateOrDestroyAccountReadingListManagerIfNeeded(); const raw_ptr profile_; // weak @@ -566,7 +566,7 @@ diff --git a/chrome/browser/bookmarks/android/bookmark_bridge.h b/chrome/browser base::android::ScopedJavaGlobalRef java_bookmark_model_; const raw_ptr bookmark_model_; // weak const raw_ptr -@@ -393,6 +416,7 @@ class BookmarkBridge : public ProfileObserver, +@@ -386,6 +409,7 @@ class BookmarkBridge : public ProfileObserver, std::unique_ptr grouped_bookmark_actions_; PrefChangeRegistrar pref_change_registrar_; @@ -574,7 +574,7 @@ diff --git a/chrome/browser/bookmarks/android/bookmark_bridge.h b/chrome/browser // Information about the Partner bookmarks (must check for IsLoaded()). // This is owned by profile. -@@ -427,6 +451,10 @@ class BookmarkBridge : public ProfileObserver, +@@ -420,6 +444,10 @@ class BookmarkBridge : public ProfileObserver, base::TimeTicks load_start_time_; bool loading_notification_sent_ = false; @@ -678,16 +678,16 @@ diff --git a/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/brows diff --git a/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerCoordinator.java b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerCoordinator.java --- a/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerCoordinator.java +++ b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerCoordinator.java -@@ -60,6 +60,8 @@ import org.chromium.components.image_fetcher.ImageFetcherConfig; - import org.chromium.components.image_fetcher.ImageFetcherFactory; - import org.chromium.ui.KeyboardVisibilityDelegate; +@@ -66,6 +66,8 @@ import org.chromium.ui.base.ActivityResultTracker; + import org.chromium.ui.base.Clipboard; + import org.chromium.ui.base.WindowAndroid; import org.chromium.ui.edge_to_edge.EdgeToEdgePadAdjuster; +import org.chromium.ui.base.ActivityWindowAndroid; +import org.chromium.ui.modaldialog.ModalDialogManager; import org.chromium.ui.modaldialog.ModalDialogManager; import org.chromium.ui.modaldialog.ModalDialogManager.ModalDialogType; import org.chromium.ui.modelutil.MVCListAdapter.ListItem; -@@ -354,6 +356,13 @@ public class BookmarkManagerCoordinator +@@ -369,6 +371,13 @@ public class BookmarkManagerCoordinator // Public API implementation. @@ -704,16 +704,16 @@ diff --git a/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/brows diff --git a/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerMediator.java b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerMediator.java --- a/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerMediator.java +++ b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerMediator.java -@@ -64,6 +64,8 @@ import org.chromium.components.commerce.core.ShoppingService; +@@ -67,6 +67,8 @@ import org.chromium.components.commerce.core.ShoppingService; import org.chromium.components.commerce.core.SubscriptionsObserver; import org.chromium.components.power_bookmarks.PowerBookmarkMeta; import org.chromium.components.power_bookmarks.PowerBookmarkType; +import org.chromium.ui.base.ActivityWindowAndroid; +import org.chromium.ui.modaldialog.ModalDialogManager; import org.chromium.ui.accessibility.AccessibilityState; + import org.chromium.ui.base.Clipboard; import org.chromium.ui.base.DeviceFormFactor; - import org.chromium.ui.base.DeviceInput; -@@ -85,6 +87,47 @@ import java.util.function.BooleanSupplier; +@@ -89,6 +91,47 @@ import java.util.function.BooleanSupplier; import java.util.function.Consumer; import java.util.function.Predicate; @@ -761,7 +761,7 @@ diff --git a/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/brows /** Responsible for BookmarkManager business logic. */ // TODO(crbug.com/40256938): Remove BookmarkDelegate if possible. @NullMarked -@@ -95,6 +138,9 @@ class BookmarkManagerMediator +@@ -99,6 +142,9 @@ class BookmarkManagerMediator private static boolean sPreventLoadingForTesting; @@ -771,7 +771,7 @@ diff --git a/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/brows /** Keeps track of whether drag is enabled / active for bookmark lists. */ private class BookmarkDragStateDelegate implements DragStateDelegate { private BookmarkDelegate mBookmarkDelegate; -@@ -647,6 +693,14 @@ class BookmarkManagerMediator +@@ -641,6 +687,14 @@ class BookmarkManagerMediator mNativePage = nativePage; } @@ -786,7 +786,7 @@ diff --git a/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/brows /** See BookmarkManager(Coordinator)#updateForUrl */ void updateForUrl(String url) { // Bookmark model is null if the manager has been destroyed. -@@ -819,6 +873,235 @@ class BookmarkManagerMediator +@@ -809,6 +863,235 @@ class BookmarkManagerMediator } } @@ -1025,17 +1025,17 @@ diff --git a/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/brows diff --git a/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkPage.java b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkPage.java --- a/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkPage.java +++ b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkPage.java -@@ -16,6 +16,9 @@ import org.chromium.chrome.browser.ui.messages.snackbar.SnackbarManager; - import org.chromium.chrome.browser.ui.native_page.BasicNativePage; - import org.chromium.chrome.browser.ui.native_page.NativePageHost; - import org.chromium.components.embedder_support.util.UrlConstants; +@@ -22,6 +22,9 @@ import org.chromium.ui.base.ActivityResultTracker; + import org.chromium.ui.base.WindowAndroid; + + import java.util.function.Supplier; +import org.chromium.chrome.browser.app.ChromeActivity; +import org.chromium.ui.modaldialog.ModalDialogManager; +import org.chromium.components.browser_ui.modaldialog.AppModalPresenter; /** A native page holding a {@link BookmarkManagerCoordinator} on _tablet_. */ @NullMarked -@@ -37,7 +40,8 @@ public class BookmarkPage extends BasicNativePage { +@@ -52,7 +55,8 @@ public class BookmarkPage extends BasicNativePage { Profile profile, NativePageHost host, @Nullable ComponentName componentName, @@ -1045,7 +1045,7 @@ diff --git a/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/brows super(host); mTitle = host.getContext().getString(R.string.bookmarks); -@@ -65,6 +69,9 @@ public class BookmarkPage extends BasicNativePage { +@@ -83,6 +87,9 @@ public class BookmarkPage extends BasicNativePage { backPressManager); mBookmarkManagerCoordinator.setBasicNativePage(this); @@ -1247,7 +1247,7 @@ diff --git a/chrome/browser/download/android/java/src/org/chromium/chrome/browse diff --git a/chrome/browser/flags/android/chrome_feature_list.cc b/chrome/browser/flags/android/chrome_feature_list.cc --- a/chrome/browser/flags/android/chrome_feature_list.cc +++ b/chrome/browser/flags/android/chrome_feature_list.cc -@@ -257,6 +257,7 @@ const base::Feature* const kFeaturesExposedToJava[] = { +@@ -263,6 +263,7 @@ const base::Feature* const kFeaturesExposedToJava[] = { &kAvoidDoubleMultiwindowChanges, &kBlockIntentsWhileLocked, &kBookmarkPaneAndroid, @@ -1258,7 +1258,7 @@ diff --git a/chrome/browser/flags/android/chrome_feature_list.cc b/chrome/browse diff --git a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java --- a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java +++ b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java -@@ -694,6 +694,7 @@ public abstract class ChromeFeatureList { +@@ -698,6 +698,7 @@ public abstract class ChromeFeatureList { "UseLibunwindstackNativeUnwinderAndroid"; public static final String VERIFY_QWACS = "VerifyQWACs"; public static final String VISITED_URL_RANKING_SERVICE = "VisitedURLRankingService"; @@ -1321,7 +1321,7 @@ diff --git a/chrome/browser/preferences/android/java/src/org/chromium/chrome/bro /** Whether Chrome is set as the default browser. Default value is false. */ public static final String CHROME_DEFAULT_BROWSER = "applink.chrome_default_browser"; -@@ -1167,6 +1169,7 @@ public final class ChromePreferenceKeys { +@@ -1191,6 +1193,7 @@ public final class ChromePreferenceKeys { AUXILIARY_SEARCH_SCHEMA_VERSION, APP_LAUNCH_LAST_KNOWN_ACTIVE_TAB_STATE, APP_LAUNCH_SEARCH_ENGINE_HAD_LOGO, @@ -1360,7 +1360,7 @@ diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chro diff --git a/chrome/utility/BUILD.gn b/chrome/utility/BUILD.gn --- a/chrome/utility/BUILD.gn +++ b/chrome/utility/BUILD.gn -@@ -212,6 +212,13 @@ static_library("utility") { +@@ -215,6 +215,13 @@ static_library("utility") { deps += [ "//chrome/services/pdf:lib" ] } diff --git a/build/patches/Add-lifetime-options-for-permissions.patch b/build/patches/Add-lifetime-options-for-permissions.patch index 9d98e809..a74841ea 100644 --- a/build/patches/Add-lifetime-options-for-permissions.patch +++ b/build/patches/Add-lifetime-options-for-permissions.patch @@ -72,24 +72,24 @@ License: GPL-3.0-only - https://spdx.org/licenses/GPL-3.0-only.html components/page_info/page_info.h | 1 + .../permissions/PermissionDialogDelegate.java | 13 +++ .../PermissionDialogModelFactory.java | 83 ++++++++++++++++++- - .../embedded_permission_prompt_android.cc | 3 +- + .../embedded_permission_prompt_android.cc | 2 +- .../embedded_permission_prompt_android.h | 2 +- .../permission_dialog_delegate.cc | 24 +++++- .../permission_dialog_delegate.h | 1 + - .../permission_prompt_android.cc | 8 +- + .../permission_prompt_android.cc | 5 +- .../permission_prompt_android.h | 3 +- .../android/permissions_android_strings.grd | 17 ++++ - .../geolocation_permission_context_android.cc | 30 +++++-- + .../geolocation_permission_context_android.cc | 28 +++++-- .../geolocation_permission_context_android.h | 8 ++ .../embedded_permission_prompt_flow_model.cc | 2 +- - .../permissions/permission_context_base.cc | 64 ++++++++++++-- + .../permissions/permission_context_base.cc | 59 +++++++++++-- .../permissions/permission_context_base.h | 26 +++++- components/permissions/permission_prompt.h | 3 +- components/permissions/permission_request.cc | 34 +++++++- components/permissions/permission_request.h | 18 +++- .../permissions/permission_request_manager.cc | 49 ++++++----- .../permissions/permission_request_manager.h | 11 ++- - 37 files changed, 508 insertions(+), 75 deletions(-) + 37 files changed, 501 insertions(+), 71 deletions(-) diff --git a/chrome/browser/permissions/last_tab_standing_tracker.cc b/chrome/browser/permissions/last_tab_standing_tracker.cc --- a/chrome/browser/permissions/last_tab_standing_tracker.cc @@ -233,43 +233,43 @@ diff --git a/chrome/browser/permissions/one_time_permissions_tracker_factory.cc diff --git a/chrome/browser/ui/views/permissions/chip/chip_controller.cc b/chrome/browser/ui/views/permissions/chip/chip_controller.cc --- a/chrome/browser/ui/views/permissions/chip/chip_controller.cc +++ b/chrome/browser/ui/views/permissions/chip/chip_controller.cc -@@ -227,7 +227,7 @@ void ChipController::OnWidgetDestroyed(views::Widget* widget) { - active_chip_permission_request_manager_.value()->Accept(); +@@ -236,7 +236,7 @@ void ChipController::OnWidgetDestroyed(views::Widget* widget) { break; case permissions::PermissionAction::GRANTED_ONCE: -- active_chip_permission_request_manager_.value()->AcceptThisTime(); -+ active_chip_permission_request_manager_.value()->AcceptThisTime(content_settings::mojom::LifetimeMode::ONLY_THIS_TIME); + active_chip_permission_request_manager_.value()->AcceptThisTime( +- /*prompt_options=*/std::monostate()); ++ /*prompt_options=*/std::monostate(), content_settings::mojom::LifetimeMode::ONLY_THIS_TIME); break; case permissions::PermissionAction::DENIED: - active_chip_permission_request_manager_.value()->Deny(); + active_chip_permission_request_manager_.value()->Deny( diff --git a/chrome/browser/ui/views/permissions/exclusive_access_permission_prompt_view.cc b/chrome/browser/ui/views/permissions/exclusive_access_permission_prompt_view.cc --- a/chrome/browser/ui/views/permissions/exclusive_access_permission_prompt_view.cc +++ b/chrome/browser/ui/views/permissions/exclusive_access_permission_prompt_view.cc -@@ -117,7 +117,7 @@ void ExclusiveAccessPermissionPromptView::RunButtonCallback(int button_id) { +@@ -119,7 +119,7 @@ void ExclusiveAccessPermissionPromptView::RunButtonCallback(int button_id) { request_type(), GetPermissionActionString(button), record_browser_always_active_value()); if (button == ButtonType::kAllowThisTime) { -- delegate_->AcceptThisTime(); -+ delegate_->AcceptThisTime(content_settings::mojom::LifetimeMode::ONLY_THIS_TIME); +- delegate_->AcceptThisTime(/*prompt_options=*/std::monostate()); ++ delegate_->AcceptThisTime(/*prompt_options=*/std::monostate(), content_settings::mojom::LifetimeMode::ONLY_THIS_TIME); } else if (button == ButtonType::kAlwaysAllow) { - delegate_->Accept(); + delegate_->Accept(/*prompt_options=*/std::monostate()); } else if (button == ButtonType::kNeverAllow) { diff --git a/chrome/browser/ui/views/permissions/permission_prompt_bubble_base_view.cc b/chrome/browser/ui/views/permissions/permission_prompt_bubble_base_view.cc --- a/chrome/browser/ui/views/permissions/permission_prompt_bubble_base_view.cc +++ b/chrome/browser/ui/views/permissions/permission_prompt_bubble_base_view.cc -@@ -295,7 +295,7 @@ void PermissionPromptBubbleBaseView::RunButtonCallback(int button_id) { - delegate_->Accept(); +@@ -302,7 +302,7 @@ void PermissionPromptBubbleBaseView::RunButtonCallback(int button_id) { + delegate_->Accept(/*prompt_options=*/std::monostate()); return; case PermissionDialogButton::kAcceptOnce: -- delegate_->AcceptThisTime(); -+ delegate_->AcceptThisTime(content_settings::mojom::LifetimeMode::ONLY_THIS_TIME); +- delegate_->AcceptThisTime(/*prompt_options=*/std::monostate()); ++ delegate_->AcceptThisTime(/*prompt_options=*/std::monostate(), content_settings::mojom::LifetimeMode::ONLY_THIS_TIME); return; case PermissionDialogButton::kDeny: #if BUILDFLAG(IS_CHROMEOS) diff --git a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/SingleWebsiteSettings.java b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/SingleWebsiteSettings.java --- a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/SingleWebsiteSettings.java +++ b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/SingleWebsiteSettings.java -@@ -721,6 +721,11 @@ public class SingleWebsiteSettings extends BaseSiteSettingsFragment +@@ -724,6 +724,11 @@ public class SingleWebsiteSettings extends BaseSiteSettingsFragment } @RequiresNonNull({"mSite"}) @@ -281,7 +281,7 @@ diff --git a/components/browser_ui/site_settings/android/java/src/org/chromium/c private void setUpClearDataPreference() { ClearWebsiteStorage preference = findPreference(PREF_CLEAR_DATA); long usage = mSite.getTotalUsage(); -@@ -1398,6 +1403,10 @@ public class SingleWebsiteSettings extends BaseSiteSettingsFragment +@@ -1401,6 +1406,10 @@ public class SingleWebsiteSettings extends BaseSiteSettingsFragment .getDefaultColor()); } } @@ -295,7 +295,7 @@ diff --git a/components/browser_ui/site_settings/android/java/src/org/chromium/c diff --git a/components/browser_ui/site_settings/android/website_preference_bridge.cc b/components/browser_ui/site_settings/android/website_preference_bridge.cc --- a/components/browser_ui/site_settings/android/website_preference_bridge.cc +++ b/components/browser_ui/site_settings/android/website_preference_bridge.cc -@@ -241,7 +241,7 @@ void GetOrigins(JNIEnv* env, +@@ -240,7 +240,7 @@ void GetOrigins(JNIEnv* env, seen_origins.push_back(origin); insertionFunc(env, static_cast(content_type), list, ConvertOriginToJavaString(env, origin), jembedder, @@ -307,7 +307,7 @@ diff --git a/components/browser_ui/site_settings/android/website_preference_brid diff --git a/components/browser_ui/strings/android/browser_ui_strings.grd b/components/browser_ui/strings/android/browser_ui_strings.grd --- a/components/browser_ui/strings/android/browser_ui_strings.grd +++ b/components/browser_ui/strings/android/browser_ui_strings.grd -@@ -626,6 +626,11 @@ +@@ -635,6 +635,11 @@ URL truncated @@ -483,7 +483,7 @@ diff --git a/components/page_info/android/java/src/org/chromium/components/page_ diff --git a/components/page_info/android/page_info_controller_android.cc b/components/page_info/android/page_info_controller_android.cc --- a/components/page_info/android/page_info_controller_android.cc +++ b/components/page_info/android/page_info_controller_android.cc -@@ -221,6 +221,8 @@ void PageInfoControllerAndroid::SetPermissionInfo( +@@ -218,6 +218,8 @@ void PageInfoControllerAndroid::SetPermissionInfo( // being requested. This is needed for the Clapper experiment // (crbug.com/458351800) and (crbug.com/463333225). bool requested_notifications = false; @@ -491,8 +491,8 @@ diff --git a/components/page_info/android/page_info_controller_android.cc b/comp + user_specified_settings_is_user_session; for (const auto& permission : permission_info_list) { - if (base::Contains(permissions_to_display, permission.type)) { -@@ -233,6 +235,8 @@ void PageInfoControllerAndroid::SetPermissionInfo( + if (std::ranges::contains(permissions_to_display, permission.type)) { +@@ -230,6 +232,8 @@ void PageInfoControllerAndroid::SetPermissionInfo( user_specified_settings_to_display[permission.type] = info->delegate().IsAnyPermissionAllowed(*setting_to_display); @@ -501,9 +501,9 @@ diff --git a/components/page_info/android/page_info_controller_android.cc b/comp } // Notifications permission can have the setting to display as DEFAULT -@@ -259,7 +263,8 @@ void PageInfoControllerAndroid::SetPermissionInfo( +@@ -256,7 +260,8 @@ void PageInfoControllerAndroid::SetPermissionInfo( ConvertUTF16ToJavaString(env, setting_title_mid_sentence), - static_cast(permission), + static_cast(permission), user_specified_settings_to_display[permission], - requested_notifications); + requested_notifications, @@ -511,12 +511,12 @@ diff --git a/components/page_info/android/page_info_controller_android.cc b/comp } } -@@ -272,7 +277,8 @@ void PageInfoControllerAndroid::SetPermissionInfo( +@@ -269,7 +274,8 @@ void PageInfoControllerAndroid::SetPermissionInfo( env, controller_jobject_, ConvertUTF16ToJavaString(env, object_title), ConvertUTF16ToJavaString(env, object_title), - static_cast(chosen_object->ui_info->content_settings_type), -- static_cast(CONTENT_SETTING_ALLOW), requested_notifications); -+ static_cast(CONTENT_SETTING_ALLOW), requested_notifications, + static_cast(chosen_object->ui_info->content_settings_type), +- static_cast(CONTENT_SETTING_ALLOW), requested_notifications); ++ static_cast(CONTENT_SETTING_ALLOW), requested_notifications, + /* is_user_session */ false); } @@ -524,7 +524,7 @@ diff --git a/components/page_info/android/page_info_controller_android.cc b/comp diff --git a/components/page_info/page_info.cc b/components/page_info/page_info.cc --- a/components/page_info/page_info.cc +++ b/components/page_info/page_info.cc -@@ -1294,6 +1294,8 @@ void PageInfo::PopulatePermissionInfo(PermissionInfo& permission_info, +@@ -1305,6 +1305,8 @@ void PageInfo::PopulatePermissionInfo(PermissionInfo& permission_info, permission_info.is_one_time = (info.metadata.session_model() == content_settings::mojom::SessionModel::ONE_TIME); @@ -684,13 +684,12 @@ diff --git a/components/permissions/android/java/src/org/chromium/components/per diff --git a/components/permissions/android/permission_prompt/embedded_permission_prompt_android.cc b/components/permissions/android/permission_prompt/embedded_permission_prompt_android.cc --- a/components/permissions/android/permission_prompt/embedded_permission_prompt_android.cc +++ b/components/permissions/android/permission_prompt/embedded_permission_prompt_android.cc -@@ -123,7 +123,8 @@ void EmbeddedPermissionPromptAndroid::Acknowledge() { - delegate()->FinalizeCurrentRequests(); +@@ -126,7 +126,7 @@ void EmbeddedPermissionPromptAndroid::Acknowledge( } --void EmbeddedPermissionPromptAndroid::AcceptThisTime() { -+void EmbeddedPermissionPromptAndroid::AcceptThisTime( -+ content_settings::mojom::LifetimeMode lifetimeOption) { + void EmbeddedPermissionPromptAndroid::AcceptThisTime( +- const PromptOptions& prompt_options) { ++ const PromptOptions& prompt_options, content_settings::mojom::LifetimeMode lifetimeOption) { prompt_model_->PrecalculateVariantsForMetrics(); prompt_model_->RecordPermissionActionUKM( permissions::ElementAnchoredBubbleAction::kGrantedOnce); @@ -699,12 +698,12 @@ diff --git a/components/permissions/android/permission_prompt/embedded_permissio +++ b/components/permissions/android/permission_prompt/embedded_permission_prompt_android.h @@ -45,7 +45,7 @@ class EmbeddedPermissionPromptAndroid : public PermissionPromptAndroid { const override; - void Dismiss() override; - void Accept() override; -- void AcceptThisTime() override; -+ void AcceptThisTime(content_settings::mojom::LifetimeMode lifetimeOption) override; - void Acknowledge() override; - void Deny() override; + void Dismiss(const PromptOptions& prompt_options) override; + void Accept(const PromptOptions& prompt_options) override; +- void AcceptThisTime(const PromptOptions& prompt_options) override; ++ void AcceptThisTime(const PromptOptions& prompt_options, content_settings::mojom::LifetimeMode lifetimeOption) override; + void Acknowledge(const PromptOptions& prompt_options) override; + void Deny(const PromptOptions& prompt_options) override; void Resumed() override; diff --git a/components/permissions/android/permission_prompt/permission_dialog_delegate.cc b/components/permissions/android/permission_prompt/permission_dialog_delegate.cc --- a/components/permissions/android/permission_prompt/permission_dialog_delegate.cc @@ -732,16 +731,16 @@ diff --git a/components/permissions/android/permission_prompt/permission_dialog_ + permission_prompt_->AcceptThisTime(lifetimeOption); + return; + } - permission_prompt_->Accept(); + permission_prompt_->Accept(prompt_options_); } void PermissionDialogDelegate::AcceptThisTime(JNIEnv* env) { CHECK(permission_prompt_); -- permission_prompt_->AcceptThisTime(); +- permission_prompt_->AcceptThisTime(prompt_options_); + content_settings::mojom::LifetimeMode lifetimeOption = + static_cast( + java_delegate_->GetSelectedLifetimeOption()); -+ permission_prompt_->AcceptThisTime(lifetimeOption); ++ permission_prompt_->AcceptThisTime(prompt_options_, lifetimeOption); } void PermissionDialogDelegate::Acknowledge(JNIEnv* env) { @@ -756,13 +755,13 @@ diff --git a/components/permissions/android/permission_prompt/permission_dialog_ + permission_prompt_->DenyThisTime(lifetimeOption); + return; + } - permission_prompt_->Deny(); + permission_prompt_->Deny(prompt_options_); } diff --git a/components/permissions/android/permission_prompt/permission_dialog_delegate.h b/components/permissions/android/permission_prompt/permission_dialog_delegate.h --- a/components/permissions/android/permission_prompt/permission_dialog_delegate.h +++ b/components/permissions/android/permission_prompt/permission_dialog_delegate.h -@@ -43,6 +43,7 @@ class PermissionDialogJavaDelegate { +@@ -46,6 +46,7 @@ class PermissionDialogJavaDelegate { const favicon_base::FaviconRawBitmapResult& favicon_result); virtual void DismissDialog(); @@ -773,33 +772,30 @@ diff --git a/components/permissions/android/permission_prompt/permission_dialog_ diff --git a/components/permissions/android/permission_prompt/permission_prompt_android.cc b/components/permissions/android/permission_prompt/permission_prompt_android.cc --- a/components/permissions/android/permission_prompt/permission_prompt_android.cc +++ b/components/permissions/android/permission_prompt/permission_prompt_android.cc -@@ -85,8 +85,12 @@ void PermissionPromptAndroid::Accept() { - delegate_->Accept(); +@@ -86,8 +86,9 @@ void PermissionPromptAndroid::Accept(const PromptOptions& prompt_options) { } --void PermissionPromptAndroid::AcceptThisTime() { -- delegate_->AcceptThisTime(); -+void PermissionPromptAndroid::AcceptThisTime(content_settings::mojom::LifetimeMode lifetimeOption) { -+ delegate_->AcceptThisTime(lifetimeOption); -+} -+ -+void PermissionPromptAndroid::DenyThisTime(content_settings::mojom::LifetimeMode lifetimeOption) { -+ delegate_->DenyThisTime(lifetimeOption); + void PermissionPromptAndroid::AcceptThisTime( +- const PromptOptions& prompt_options) { +- delegate_->AcceptThisTime(prompt_options); ++ const PromptOptions& prompt_options, ++ content_settings::mojom::LifetimeMode lifetimeOption) { ++ delegate_->AcceptThisTime(prompt_options, lifetimeOption); } - void PermissionPromptAndroid::Deny() { + void PermissionPromptAndroid::Deny(const PromptOptions& prompt_options) { diff --git a/components/permissions/android/permission_prompt/permission_prompt_android.h b/components/permissions/android/permission_prompt/permission_prompt_android.h --- a/components/permissions/android/permission_prompt/permission_prompt_android.h +++ b/components/permissions/android/permission_prompt/permission_prompt_android.h @@ -57,10 +57,11 @@ class PermissionPromptAndroid : public PermissionPrompt { const; - virtual void Dismiss(); - virtual void Accept(); -- virtual void AcceptThisTime(); -+ virtual void AcceptThisTime(content_settings::mojom::LifetimeMode lifetimeOption); - virtual void Acknowledge() {} - virtual void Deny(); - virtual void Ignore(); + virtual void Dismiss(const PromptOptions& prompt_options); + virtual void Accept(const PromptOptions& prompt_options); +- virtual void AcceptThisTime(const PromptOptions& prompt_options); ++ virtual void AcceptThisTime(const PromptOptions& prompt_options, content_settings::mojom::LifetimeMode lifetimeOption); + virtual void Acknowledge(const PromptOptions& prompt_options) {} + virtual void Deny(const PromptOptions& prompt_options); + virtual void Ignore(const PromptOptions& prompt_options); + virtual void DenyThisTime(content_settings::mojom::LifetimeMode lifetimeOption); virtual void Resumed() {} virtual void SystemSettingsShown() {} @@ -807,7 +803,7 @@ diff --git a/components/permissions/android/permission_prompt/permission_prompt_ diff --git a/components/permissions/android/permissions_android_strings.grd b/components/permissions/android/permissions_android_strings.grd --- a/components/permissions/android/permissions_android_strings.grd +++ b/components/permissions/android/permissions_android_strings.grd -@@ -267,6 +267,23 @@ +@@ -272,6 +272,23 @@ Unknown or unsupported device (%1$sA1:B2:C3:D4:E5:F6) @@ -834,10 +830,10 @@ diff --git a/components/permissions/android/permissions_android_strings.grd b/co diff --git a/components/permissions/contexts/geolocation_permission_context_android.cc b/components/permissions/contexts/geolocation_permission_context_android.cc --- a/components/permissions/contexts/geolocation_permission_context_android.cc +++ b/components/permissions/contexts/geolocation_permission_context_android.cc -@@ -195,7 +195,18 @@ void GeolocationPermissionContextAndroid::NotifyPermissionSet( - PermissionDecision decision, - bool is_final_decision) { - DCHECK(is_final_decision); +@@ -213,7 +213,18 @@ void GeolocationPermissionContextAndroid::NotifyPermissionSet( + bool persist, + const permissions::PermissionPromptDecision& decision) { + DCHECK(decision.is_final); + NotifyPermissionSetWithLifetime(request_data, + std::move(callback), persist, decision, is_final_decision, + content_settings::mojom::LifetimeMode::ALWAYS); @@ -852,32 +848,31 @@ diff --git a/components/permissions/contexts/geolocation_permission_context_andr + content_settings::mojom::LifetimeMode lifetime_option) { bool is_default_search = IsRequestingOriginDSE(request_data.requesting_origin); - if (decision == PermissionDecision::kAllow && -@@ -210,7 +221,7 @@ void GeolocationPermissionContextAndroid::NotifyPermissionSet( - FinishNotifyPermissionSet( - request_data.id, request_data.requesting_origin, + if (decision.overall_decision == PermissionDecision::kAllow && +@@ -230,7 +241,7 @@ void GeolocationPermissionContextAndroid::NotifyPermissionSet( request_data.embedding_origin, std::move(callback), -- false /* persist */, PermissionDecision::kDeny, -+ false /* persist */, PermissionDecision::kDeny, lifetime_option, - request_data.prompt_options, + false /* persist */, + permissions::PermissionPromptDecision{ +- .overall_decision = PermissionDecision::kDeny, ++ .overall_decision = PermissionDecision::kDeny, lifetime_option, + .prompt_options = decision.prompt_options, + .is_final = true}, request_data.embedded_permission_request_descriptor.Clone()); - return; -@@ -232,7 +243,7 @@ void GeolocationPermissionContextAndroid::NotifyPermissionSet( - FinishNotifyPermissionSet( - request_data.id, request_data.requesting_origin, +@@ -255,7 +266,7 @@ void GeolocationPermissionContextAndroid::NotifyPermissionSet( request_data.embedding_origin, std::move(callback), -- false /* persist */, PermissionDecision::kDeny, -+ false /* persist */, PermissionDecision::kDeny, lifetime_option, - request_data.prompt_options, + false /* persist */, + permissions::PermissionPromptDecision{ +- .overall_decision = PermissionDecision::kDeny, ++ .overall_decision = PermissionDecision::kDeny, lifetime_option, + .prompt_options = decision.prompt_options, + .is_final = true}, request_data.embedded_permission_request_descriptor.Clone()); - return; -@@ -246,14 +257,14 @@ void GeolocationPermissionContextAndroid::NotifyPermissionSet( +@@ -270,13 +281,13 @@ void GeolocationPermissionContextAndroid::NotifyPermissionSet( base::BindOnce( &GeolocationPermissionContextAndroid::OnLocationSettingsDialogShown, weak_factory_.GetWeakPtr(), request_data.requesting_origin, -- request_data.embedding_origin, persist, decision, -+ request_data.embedding_origin, persist, decision, lifetime_option, - request_data.prompt_options)); +- request_data.embedding_origin, persist, decision)); ++ request_data.embedding_origin, persist, decision, lifetime_option)); return; } @@ -885,45 +880,42 @@ diff --git a/components/permissions/contexts/geolocation_permission_context_andr request_data.id, request_data.requesting_origin, - request_data.embedding_origin, std::move(callback), persist, decision, + request_data.embedding_origin, std::move(callback), persist, decision, lifetime_option, - request_data.prompt_options, request_data.embedded_permission_request_descriptor.Clone()); } -@@ -432,7 +443,7 @@ void GeolocationPermissionContextAndroid::OnLocationSettingsDialogShown( - const GURL& requesting_origin, + +@@ -459,6 +470,7 @@ void GeolocationPermissionContextAndroid::OnLocationSettingsDialogShown( const GURL& embedding_origin, bool persist, -- PermissionDecision decision, -+ PermissionDecision decision, content_settings::mojom::LifetimeMode lifetime_option, - std::optional prompt_options, + const permissions::PermissionPromptDecision& decision, ++ content_settings::mojom::LifetimeMode lifetime_option, LocationSettingsDialogOutcome prompt_outcome) { bool is_default_search = IsRequestingOriginDSE(requesting_origin); -@@ -452,7 +463,7 @@ void GeolocationPermissionContextAndroid::OnLocationSettingsDialogShown( - FinishNotifyPermissionSet(location_settings_dialog_request_id_, - requesting_origin, embedding_origin, - std::move(location_settings_dialog_callback_), -- persist, decision, prompt_options); -+ persist, decision, lifetime_option, prompt_options); + PermissionPromptDecision result_decision = decision; +@@ -477,7 +489,7 @@ void GeolocationPermissionContextAndroid::OnLocationSettingsDialogShown( + + FinishNotifyPermissionSet( + location_settings_dialog_request_id_, requesting_origin, embedding_origin, +- std::move(location_settings_dialog_callback_), persist, result_decision); ++ std::move(location_settings_dialog_callback_), persist, result_decision, lifetime_option); location_settings_dialog_request_id_ = PermissionRequestID(content::GlobalRenderFrameHostId(0, 0), -@@ -465,7 +476,7 @@ void GeolocationPermissionContextAndroid::FinishNotifyPermissionSet( - const GURL& embedding_origin, +@@ -491,6 +503,7 @@ void GeolocationPermissionContextAndroid::FinishNotifyPermissionSet( BrowserPermissionCallback callback, bool persist, -- PermissionDecision decision, -+ PermissionDecision decision, content_settings::mojom::LifetimeMode lifetime_option, - std::optional prompt_options, + const permissions::PermissionPromptDecision& decision, ++ content_settings::mojom::LifetimeMode lifetime_option, blink::mojom::EmbeddedPermissionRequestDescriptorPtr embedded_permission_request_descriptor) { -@@ -478,9 +489,10 @@ void GeolocationPermissionContextAndroid::FinishNotifyPermissionSet( + PermissionRequestData request_data( +@@ -502,8 +515,9 @@ void GeolocationPermissionContextAndroid::FinishNotifyPermissionSet( + requesting_origin, embedding_origin); request_data.embedded_permission_request_descriptor = std::move(embedded_permission_request_descriptor); - request_data.prompt_options = prompt_options.value_or(std::monostate()); - GeolocationPermissionContext::NotifyPermissionSet( +- request_data, std::move(callback), persist, decision); + GeolocationPermissionContext::NotifyPermissionSetImpl( - request_data, -- std::move(callback), persist, decision, /*is_final_decision=*/true); -+ std::move(callback), persist, decision, /*is_final_decision=*/true, ++ request_data, std::move(callback), persist, decision, + /*use_lifetime_option*/ true, lifetime_option); } @@ -931,10 +923,10 @@ diff --git a/components/permissions/contexts/geolocation_permission_context_andr diff --git a/components/permissions/contexts/geolocation_permission_context_android.h b/components/permissions/contexts/geolocation_permission_context_android.h --- a/components/permissions/contexts/geolocation_permission_context_android.h +++ b/components/permissions/contexts/geolocation_permission_context_android.h -@@ -92,6 +92,12 @@ class GeolocationPermissionContextAndroid - bool persist, - PermissionDecision decision, - bool is_final_decision) override; +@@ -94,6 +94,12 @@ class GeolocationPermissionContextAndroid + BrowserPermissionCallback callback, + bool persist, + const permissions::PermissionPromptDecision& decision) override; + void NotifyPermissionSetWithLifetime(const PermissionRequestData& request_data, + BrowserPermissionCallback callback, + bool persist, @@ -944,38 +936,38 @@ diff --git a/components/permissions/contexts/geolocation_permission_context_andr content::PermissionResult UpdatePermissionStatusWithDeviceStatus( content::WebContents* web_contents, content::PermissionResult result, -@@ -136,6 +142,7 @@ class GeolocationPermissionContextAndroid +@@ -139,6 +145,7 @@ class GeolocationPermissionContextAndroid const GURL& embedding_origin, bool persist, - PermissionDecision decision, + const permissions::PermissionPromptDecision& decision, + content_settings::mojom::LifetimeMode lifetime_option, - std::optional prompt_options, LocationSettingsDialogOutcome prompt_outcome); -@@ -146,6 +153,7 @@ class GeolocationPermissionContextAndroid + void FinishNotifyPermissionSet( +@@ -148,6 +155,7 @@ class GeolocationPermissionContextAndroid BrowserPermissionCallback callback, bool persist, - PermissionDecision decision, + const permissions::PermissionPromptDecision& decision, + content_settings::mojom::LifetimeMode lifetime_option, - std::optional prompt_options, blink::mojom::EmbeddedPermissionRequestDescriptorPtr embedded_permission_request_descriptor = nullptr); + diff --git a/components/permissions/embedded_permission_prompt_flow_model.cc b/components/permissions/embedded_permission_prompt_flow_model.cc --- a/components/permissions/embedded_permission_prompt_flow_model.cc +++ b/components/permissions/embedded_permission_prompt_flow_model.cc -@@ -293,7 +293,7 @@ void EmbeddedPermissionPromptFlowModel::SetDelegateAction( - delegate_->Accept(); +@@ -297,7 +297,7 @@ void EmbeddedPermissionPromptFlowModel::SetDelegateAction( + delegate_->Accept(prompt_options); break; case DelegateAction::kAllowThisTime: -- delegate_->AcceptThisTime(); -+ delegate_->AcceptThisTime(content_settings::mojom::LifetimeMode::ONLY_THIS_TIME); +- delegate_->AcceptThisTime(prompt_options); ++ delegate_->AcceptThisTime(prompt_options, content_settings::mojom::LifetimeMode::ONLY_THIS_TIME); break; case DelegateAction::kDeny: - delegate_->Deny(); + delegate_->Deny(prompt_options); diff --git a/components/permissions/permission_context_base.cc b/components/permissions/permission_context_base.cc --- a/components/permissions/permission_context_base.cc +++ b/components/permissions/permission_context_base.cc -@@ -281,6 +281,17 @@ PermissionContextBase::CreatePermissionRequest( +@@ -306,6 +306,17 @@ PermissionContextBase::CreatePermissionRequest( std::move(request_finished_callback), UsesAutomaticEmbargo()); } @@ -993,37 +985,33 @@ diff --git a/components/permissions/permission_context_base.cc b/components/perm bool PermissionContextBase::UsesAutomaticEmbargo() const { return true; } -@@ -627,7 +638,8 @@ void PermissionContextBase::DecidePermission( +@@ -651,7 +662,8 @@ void PermissionContextBase::DecidePermission( + void PermissionContextBase::PermissionDecided( - PermissionDecision decision, - bool is_final_decision, + const permissions::PermissionPromptDecision& decision, - const PermissionRequestData& request_data) { + const PermissionRequestData& request_data, + content_settings::mojom::LifetimeMode lifetime_option) { UserMadePermissionDecision(request_data.id, request_data.requesting_origin, - request_data.embedding_origin, decision); - // If a permission request originates from an embedded element, its -@@ -651,11 +663,12 @@ void PermissionContextBase::PermissionDecided( + request_data.embedding_origin, + decision.overall_decision); +@@ -675,10 +687,10 @@ void PermissionContextBase::PermissionDecided( + // Check if `request` has `BrowserPermissionCallback`. The call back might be // missing if a permission prompt was preignored and we already notified an // origin about it. - if (request->second.second) { -- NotifyPermissionSet(request_data, std::move(request->second.second), -- persist, decision, is_final_decision); -+ NotifyPermissionSetWithLifetime(request_data, std::move(request->second.second), -+ persist, decision, is_final_decision, -+ lifetime_option); - } else { -- NotifyPermissionSet(request_data, base::DoNothing(), persist, decision, -- is_final_decision); -+ NotifyPermissionSetWithLifetime(request_data, base::DoNothing(), persist, decision, -+ is_final_decision, lifetime_option); - } +- NotifyPermissionSet(request_data, ++ NotifyPermissionSetWithLifetime(request_data, + request->second.second ? std::move(request->second.second) + : base::DoNothing(), +- persist, decision); ++ persist, decision, lifetime_option); } -@@ -740,6 +753,30 @@ void PermissionContextBase::NotifyPermissionSet( + content::BrowserContext* PermissionContextBase::browser_context() const { +@@ -761,6 +773,30 @@ void PermissionContextBase::NotifyPermissionSet( + BrowserPermissionCallback callback, bool persist, - PermissionDecision decision, - bool is_final_decision) { + const permissions::PermissionPromptDecision& decision) { + NotifyPermissionSetImpl(request_data, std::move(callback), + persist, decision, is_final_decision, /*use_lifetime_option*/ false, + content_settings::mojom::LifetimeMode::ALWAYS); @@ -1049,20 +1037,21 @@ diff --git a/components/permissions/permission_context_base.cc b/components/perm + bool is_final_decision, bool use_lifetime_option, + content_settings::mojom::LifetimeMode lifetime_option) { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); - // Note that rfh may be null, see crbug.com/426909787. -@@ -755,8 +792,8 @@ void PermissionContextBase::NotifyPermissionSet( + auto* rfh = content::RenderFrameHost::FromID( +@@ -776,9 +812,9 @@ void PermissionContextBase::NotifyPermissionSet( if (persist) { // Clone new value, because we need it again for the callback. -- UpdateSetting(request_data, new_value, -- decision == PermissionDecision::kAllowThisTime); -+ UpdateSettingImpl(request_data, new_value, -+ decision == PermissionDecision::kAllowThisTime, use_lifetime_option, lifetime_option); +- UpdateSetting( ++ UpdateSettingImpl( + request_data, new_value, +- decision.overall_decision == PermissionDecision::kAllowThisTime); ++ decision.overall_decision == PermissionDecision::kAllowThisTime, use_lifetime_option, lifetime_option); } - if (is_final_decision) { -@@ -814,6 +851,17 @@ void PermissionContextBase::UpdateSetting( + if (decision.is_final) { +@@ -838,6 +874,17 @@ void PermissionContextBase::UpdateSetting( const PermissionRequestData& request_data, PermissionSetting setting, bool is_one_time) { @@ -1080,7 +1069,7 @@ diff --git a/components/permissions/permission_context_base.cc b/components/perm DCHECK_EQ(request_data.requesting_origin, request_data.requesting_origin.DeprecatedGetOriginAsURL()); DCHECK_EQ(request_data.embedding_origin, -@@ -823,6 +871,8 @@ void PermissionContextBase::UpdateSetting( +@@ -847,6 +894,8 @@ void PermissionContextBase::UpdateSetting( constraints.set_session_model( is_one_time ? content_settings::mojom::SessionModel::ONE_TIME : content_settings::mojom::SessionModel::DURABLE); @@ -1092,7 +1081,7 @@ diff --git a/components/permissions/permission_context_base.cc b/components/perm diff --git a/components/permissions/permission_context_base.h b/components/permissions/permission_context_base.h --- a/components/permissions/permission_context_base.h +++ b/components/permissions/permission_context_base.h -@@ -203,6 +203,18 @@ class PermissionContextBase : public content_settings::Observer { +@@ -205,6 +205,18 @@ class PermissionContextBase : public content_settings::Observer { // Updates stored setting if persist is set, updates tab indicators // and runs the callback to finish the request. @@ -1108,10 +1097,10 @@ diff --git a/components/permissions/permission_context_base.h b/components/permi + PermissionDecision decision, + bool is_final_decision, + content_settings::mojom::LifetimeMode lifetime_option); - virtual void NotifyPermissionSet(const PermissionRequestData& request_data, - BrowserPermissionCallback callback, - bool persist, -@@ -219,6 +231,11 @@ class PermissionContextBase : public content_settings::Observer { + virtual void NotifyPermissionSet( + const PermissionRequestData& request_data, + BrowserPermissionCallback callback, +@@ -221,6 +233,11 @@ class PermissionContextBase : public content_settings::Observer { // Store the decided permission state. Virtual since the permission might be // stored with different restrictions (for example for desktop notifications). @@ -1123,7 +1112,7 @@ diff --git a/components/permissions/permission_context_base.h b/components/permi virtual void UpdateSetting(const PermissionRequestData& request_data, PermissionSetting setting, bool is_one_time); -@@ -248,6 +265,12 @@ class PermissionContextBase : public content_settings::Observer { +@@ -250,6 +267,12 @@ class PermissionContextBase : public content_settings::Observer { PermissionRequest::PermissionDecidedCallback permission_decided_callback, base::OnceClosure request_finished_callback) const; @@ -1136,10 +1125,10 @@ diff --git a/components/permissions/permission_context_base.h b/components/permi // Implementors can override this method to avoid using automatic embargo. virtual bool UsesAutomaticEmbargo() const; -@@ -297,7 +320,8 @@ class PermissionContextBase : public content_settings::Observer { +@@ -298,7 +321,8 @@ class PermissionContextBase : public content_settings::Observer { + // This is the callback for PermissionRequest and is called once the user // allows/blocks/dismisses a permission prompt. - void PermissionDecided(PermissionDecision decision, - bool is_final_decision, + void PermissionDecided(const permissions::PermissionPromptDecision& decision, - const PermissionRequestData& request_data); + const PermissionRequestData& request_data, + content_settings::mojom::LifetimeMode lifetime_option); @@ -1152,18 +1141,18 @@ diff --git a/components/permissions/permission_prompt.h b/components/permissions @@ -70,8 +70,9 @@ class PermissionPrompt { virtual GURL GetEmbeddingOrigin() const = 0; - virtual void Accept() = 0; -- virtual void AcceptThisTime() = 0; -+ virtual void AcceptThisTime(content_settings::mojom::LifetimeMode lifetime_option) = 0; - virtual void Deny() = 0; -+ virtual void DenyThisTime(content_settings::mojom::LifetimeMode lifetime_option) = 0; - virtual void Dismiss() = 0; - virtual void Ignore() = 0; + virtual void Accept(const PromptOptions& prompt_options) = 0; +- virtual void AcceptThisTime(const PromptOptions& prompt_options) = 0; ++ virtual void AcceptThisTime(const PromptOptions& prompt_options, content_settings::mojom::LifetimeMode lifetime_option) = 0; + virtual void Deny(const PromptOptions& prompt_options) = 0; ++ virtual void DenyThisTime(const PromptOptions& prompt_options, content_settings::mojom::LifetimeMode lifetime_option) = 0; + virtual void Dismiss(const PromptOptions& prompt_options) = 0; + virtual void Ignore(const PromptOptions& prompt_options) = 0; diff --git a/components/permissions/permission_request.cc b/components/permissions/permission_request.cc --- a/components/permissions/permission_request.cc +++ b/components/permissions/permission_request.cc -@@ -35,6 +35,16 @@ PermissionRequest::PermissionRequest( +@@ -37,6 +37,16 @@ PermissionRequest::PermissionRequest( request_finished_callback_(std::move(request_finished_callback)), uses_automatic_embargo_(uses_automatic_embargo) {} @@ -1180,12 +1169,12 @@ diff --git a/components/permissions/permission_request.cc b/components/permissio PermissionRequest::~PermissionRequest() { std::move(request_finished_callback_).Run(); } -@@ -445,20 +455,40 @@ bool PermissionRequest::ShouldUseTwoOriginPrompt() const { - return request_type() == RequestType::kStorageAccess; +@@ -448,7 +458,15 @@ bool PermissionRequest::ShouldUseTwoOriginPrompt() const { } --void PermissionRequest::PermissionGranted(bool is_one_time) { -+void PermissionRequest::PermissionGranted(bool is_one_time, + void PermissionRequest::PermissionGranted(const PromptOptions& prompt_options, +- bool is_one_time) { ++ bool is_one_time, + content_settings::mojom::LifetimeMode lifetime_option) { + if (permission_decided_callback_withlifetime_) { + std::move(permission_decided_callback_withlifetime_) @@ -1195,9 +1184,10 @@ diff --git a/components/permissions/permission_request.cc b/components/permissio + return; + } std::move(permission_decided_callback_) - .Run(is_one_time ? PermissionDecision::kAllowThisTime - : PermissionDecision::kAllow, - /*is_final_decision=*/true, /*request_data=*/*data_); + .Run(PermissionPromptDecision{.overall_decision = + is_one_time +@@ -459,7 +477,13 @@ void PermissionRequest::PermissionGranted(const PromptOptions& prompt_options, + /*request_data=*/*data_); } -void PermissionRequest::PermissionDenied() { @@ -1209,8 +1199,9 @@ diff --git a/components/permissions/permission_request.cc b/components/permissio + return; + } std::move(permission_decided_callback_) - .Run(PermissionDecision::kDeny, - /*is_final_decision=*/true, /*request_data=*/*data_); + .Run(PermissionPromptDecision{.overall_decision = + PermissionDecision::kDeny, +@@ -469,6 +493,12 @@ void PermissionRequest::PermissionDenied() { } void PermissionRequest::Cancelled(bool is_final_decision) { @@ -1221,14 +1212,14 @@ diff --git a/components/permissions/permission_request.cc b/components/permissio + return; + } if (permission_decided_callback_) { - permission_decided_callback_.Run(PermissionDecision::kNone, - is_final_decision, + permission_decided_callback_.Run( + PermissionPromptDecision{.overall_decision = PermissionDecision::kNone, diff --git a/components/permissions/permission_request.h b/components/permissions/permission_request.h --- a/components/permissions/permission_request.h +++ b/components/permissions/permission_request.h -@@ -53,6 +53,12 @@ class PermissionRequest { - bool /*is_final_decision*/, - const PermissionRequestData& /*request_data*/)>; +@@ -54,6 +54,12 @@ class PermissionRequest { + base::RepeatingCallback; + using PermissionDecidedCallbackWithLifetime = base::RepeatingCallbackHasSwitch( switches::kDenyPermissionPrompts)) { @@ -1292,51 +1283,51 @@ diff --git a/components/permissions/permission_request_manager.cc b/components/p return; } -@@ -284,9 +284,9 @@ void PermissionRequestManager::AddRequest( - - if (should_auto_approve_request) { +@@ -307,9 +307,9 @@ void PermissionRequestManager::AddRequest( + .selected_accuracy = GeolocationAccuracy::kPrecise}) + : std::monostate(); if (should_auto_approve_request == PermissionAction::GRANTED) { -- request->PermissionGranted(/*is_one_time=*/false); -+ request->PermissionGranted(/*is_one_time=*/false, content_settings::mojom::LifetimeMode::UNTIL_ORIGIN_CLOSED); +- request->PermissionGranted(prompt_options, /*is_one_time=*/false); ++ request->PermissionGranted(prompt_options, /*is_one_time=*/false, content_settings::mojom::LifetimeMode::UNTIL_ORIGIN_CLOSED); } else if (should_auto_approve_request == PermissionAction::GRANTED_ONCE) { -- request->PermissionGranted(/*is_one_time=*/true); -+ request->PermissionGranted(/*is_one_time=*/true, content_settings::mojom::LifetimeMode::UNTIL_ORIGIN_CLOSED); +- request->PermissionGranted(prompt_options, /*is_one_time=*/true); ++ request->PermissionGranted(prompt_options, /*is_one_time=*/true, content_settings::mojom::LifetimeMode::UNTIL_ORIGIN_CLOSED); } return; } -@@ -619,7 +619,8 @@ void PermissionRequestManager::Accept() { +@@ -650,7 +650,8 @@ void PermissionRequestManager::Accept(const PromptOptions& prompt_options) { StorePermissionActionForUMA(request->requesting_origin(), request->request_type(), action); - PermissionGrantedIncludingDuplicates(request.get(), + PermissionGrantedIncludingDuplicates(request.get(), prompt_options, - /*is_one_time=*/false); + /*is_one_time=*/false, + content_settings::mojom::LifetimeMode::ALWAYS); #if !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_IOS) std::optional content_settings_type = -@@ -637,7 +638,7 @@ void PermissionRequestManager::Accept() { - CurrentRequestsDecided(action); +@@ -669,7 +670,7 @@ void PermissionRequestManager::Accept(const PromptOptions& prompt_options) { } --void PermissionRequestManager::AcceptThisTime() { -+void PermissionRequestManager::AcceptThisTime(content_settings::mojom::LifetimeMode mode) { - if (ignore_callbacks_from_prompt_) { - return; - } -@@ -649,7 +650,8 @@ void PermissionRequestManager::AcceptThisTime() { + void PermissionRequestManager::AcceptThisTime( +- const PromptOptions& prompt_options) { ++ const PromptOptions& prompt_options, content_settings::mojom::LifetimeMode mode) { + CHECK_EQ(std::holds_alternative(prompt_options), + requests_[0]->GetContentSettingsType() == + ContentSettingsType::GEOLOCATION_WITH_OPTIONS) +@@ -688,7 +689,8 @@ void PermissionRequestManager::AcceptThisTime( StorePermissionActionForUMA(request->requesting_origin(), request->request_type(), action); - PermissionGrantedIncludingDuplicates(request.get(), + PermissionGrantedIncludingDuplicates(request.get(), prompt_options, - /*is_one_time=*/true); + /*is_one_time=*/true, + mode); } NotifyRequestDecided(action); -@@ -657,6 +659,15 @@ void PermissionRequestManager::AcceptThisTime() { - } +@@ -700,6 +702,15 @@ void PermissionRequestManager::Deny(const PromptOptions& prompt_options) { + requests_[0]->GetContentSettingsType() == + ContentSettingsType::GEOLOCATION_WITH_OPTIONS); - void PermissionRequestManager::Deny() { + Deny_(/*is_one_time*/ false, content_settings::mojom::LifetimeMode::ALWAYS); +} + @@ -1349,7 +1340,7 @@ diff --git a/components/permissions/permission_request_manager.cc b/components/p if (ignore_callbacks_from_prompt_) { return; } -@@ -677,7 +688,7 @@ void PermissionRequestManager::Deny() { +@@ -720,7 +731,7 @@ void PermissionRequestManager::Deny(const PromptOptions& prompt_options) { for (const auto& request : requests_) { StorePermissionActionForUMA(request->requesting_origin(), request->request_type(), action); @@ -1358,27 +1349,27 @@ diff --git a/components/permissions/permission_request_manager.cc b/components/p } NotifyRequestDecided(action); -@@ -1370,32 +1381,32 @@ PermissionRequestManager::VisitDuplicateRequests( - +@@ -1464,32 +1475,32 @@ PermissionRequestManager::VisitDuplicateRequests( void PermissionRequestManager::PermissionGrantedIncludingDuplicates( PermissionRequest* request, + const PromptOptions& prompt_options, - bool is_one_time) { + bool is_one_time, content_settings::mojom::LifetimeMode lifetime_option) { CHECK(RequestExistsExactlyOnce(request, pending_permission_requests_, requests_)) << "Only requests in [pending_permission_]requests_ can have duplicates"; -- request->PermissionGranted(is_one_time); -+ request->PermissionGranted(is_one_time, lifetime_option); +- request->PermissionGranted(prompt_options, is_one_time); ++ request->PermissionGranted(prompt_options, is_one_time, lifetime_option); VisitDuplicateRequests( base::BindRepeating( -- [](bool is_one_time, -+ [](bool is_one_time, content_settings::mojom::LifetimeMode lifetime_option, +- [](const PromptOptions& prompt_options, bool is_one_time, ++ [](const PromptOptions& prompt_options, bool is_one_time, content_settings::mojom::LifetimeMode lifetime_option, const std::unique_ptr& request) { -- request->PermissionGranted(is_one_time); -+ request->PermissionGranted(is_one_time, lifetime_option); +- request->PermissionGranted(prompt_options, is_one_time); ++ request->PermissionGranted(prompt_options, is_one_time, lifetime_option); }, -- is_one_time), -+ is_one_time, lifetime_option), +- prompt_options, is_one_time), ++ prompt_options, is_one_time, lifetime_option), request); } @@ -1401,34 +1392,34 @@ diff --git a/components/permissions/permission_request_manager.cc b/components/p request); } -@@ -1683,7 +1694,7 @@ void PermissionRequestManager::DoAutoResponseForTesting() { +@@ -1779,7 +1790,7 @@ void PermissionRequestManager::DoAutoResponseForTesting() { } switch (auto_response_for_test_) { case ACCEPT_ONCE: -- AcceptThisTime(); -+ AcceptThisTime(content_settings::mojom::LifetimeMode::ONLY_THIS_TIME); +- AcceptThisTime(auto_response_prompt_options_for_test_); ++ AcceptThisTime(auto_response_prompt_options_for_test_, content_settings::mojom::LifetimeMode::ONLY_THIS_TIME); break; case ACCEPT_ALL: - Accept(); + Accept(auto_response_prompt_options_for_test_); diff --git a/components/permissions/permission_request_manager.h b/components/permissions/permission_request_manager.h --- a/components/permissions/permission_request_manager.h +++ b/components/permissions/permission_request_manager.h -@@ -175,8 +175,10 @@ class PermissionRequestManager +@@ -185,8 +185,10 @@ class PermissionRequestManager GURL GetRequestingOrigin() const override; GURL GetEmbeddingOrigin() const override; - void Accept() override; -- void AcceptThisTime() override; -+ void AcceptThisTime(content_settings::mojom::LifetimeMode lifetime_option) override; - void Deny() override; + void Accept(const PromptOptions& prompt_options) override; +- void AcceptThisTime(const PromptOptions& prompt_options) override; ++ void AcceptThisTime(const PromptOptions& prompt_options, content_settings::mojom::LifetimeMode lifetime_option) override; + void Deny(const PromptOptions& prompt_options) override; + void Deny_(bool is_one_time, content_settings::mojom::LifetimeMode lifetime_option); -+ void DenyThisTime(content_settings::mojom::LifetimeMode lifetime_option) override; - void Dismiss() override; - void Ignore() override; ++ void DenyThisTime(const PromptOptions& prompt_options, content_settings::mojom::LifetimeMode lifetime_option) override; + void Dismiss(const PromptOptions& prompt_options) override; + void Ignore(const PromptOptions& prompt_options) override; void FinalizeCurrentRequests() override; -@@ -441,9 +443,12 @@ class PermissionRequestManager - +@@ -447,9 +449,12 @@ class PermissionRequestManager // Calls PermissionGranted on a request and all its duplicates. void PermissionGrantedIncludingDuplicates(PermissionRequest* request, + const PromptOptions& prompt_options, - bool is_one_time); + bool is_one_time, + content_settings::mojom::LifetimeMode lifetime_option); 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 96f5e8ae..fcf45eeb 100644 --- a/build/patches/Add-menu-item-to-bookmark-all-tabs.patch +++ b/build/patches/Add-menu-item-to-bookmark-all-tabs.patch @@ -36,10 +36,10 @@ License: GPL-3.0-only - https://spdx.org/licenses/GPL-3.0-only.html diff --git a/chrome/android/java/res/values/ids.xml b/chrome/android/java/res/values/ids.xml --- a/chrome/android/java/res/values/ids.xml +++ b/chrome/android/java/res/values/ids.xml -@@ -197,6 +197,7 @@ found in the LICENSE file. - - +@@ -200,6 +200,7 @@ found in the LICENSE file. + + + @@ -47,7 +47,7 @@ diff --git a/chrome/android/java/res/values/ids.xml b/chrome/android/java/res/va 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 +++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java -@@ -109,6 +109,7 @@ import org.chromium.chrome.browser.bookmarks.BookmarkPane; +@@ -113,6 +113,7 @@ import org.chromium.chrome.browser.bookmarks.BookmarkPane; import org.chromium.chrome.browser.bookmarks.BookmarkUtils; import org.chromium.chrome.browser.browserservices.intents.WebappConstants; import org.chromium.chrome.browser.compositor.CompositorViewHolder; @@ -55,26 +55,26 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedAct import org.chromium.chrome.browser.compositor.layouts.Layout; import org.chromium.chrome.browser.compositor.layouts.LayoutManagerChrome; import org.chromium.chrome.browser.compositor.layouts.LayoutManagerChromePhone; -@@ -309,6 +310,9 @@ import org.chromium.chrome.browser.ui.appmenu.AppMenuPropertiesDelegate; - import org.chromium.chrome.browser.ui.browser_window.BrowserWindowType; +@@ -321,6 +322,9 @@ import org.chromium.chrome.browser.ui.default_browser_promo.DefaultBrowserPromoU import org.chromium.chrome.browser.ui.desktop_windowing.AppHeaderUtils; import org.chromium.chrome.browser.ui.edge_to_edge.EdgeToEdgeUtils; + import org.chromium.chrome.browser.ui.edge_to_edge.TransitiveTopInsetProvider; +import org.chromium.chrome.browser.ui.messages.snackbar.Snackbar; +import org.chromium.chrome.browser.ui.messages.snackbar.SnackbarManager; +import org.chromium.chrome.browser.ui.messages.snackbar.SnackbarManager.SnackbarController; import org.chromium.chrome.browser.ui.searchactivityutils.SearchActivityClient; import org.chromium.chrome.browser.ui.searchactivityutils.SearchActivityExtras.IntentOrigin; import org.chromium.chrome.browser.ui.signin.BottomSheetSigninAndHistorySyncConfig; -@@ -325,6 +329,8 @@ import org.chromium.chrome.browser.util.ChromeAccessibilityUtil; - import org.chromium.chrome.browser.xr.scenecore.XrSceneCoreSessionInitializerImpl; - import org.chromium.chrome.browser.xr.scenecore.XrSceneCoreSessionManagerImpl; +@@ -336,6 +340,8 @@ import org.chromium.chrome.browser.usage_stats.UsageStatsService; + import org.chromium.chrome.browser.util.ChromeAccessibilityUtil; + import org.chromium.chrome.browser.xr.scenecore.XrModule; import org.chromium.components.browser_ui.accessibility.AccessibilityFeatureMap; +import org.chromium.components.bookmarks.BookmarkId; +import org.chromium.components.bookmarks.BookmarkItem; import org.chromium.components.browser_ui.bottomsheet.BottomSheetController; import org.chromium.components.browser_ui.share.ShareParams; import org.chromium.components.browser_ui.util.BrowserControlsVisibilityDelegate; -@@ -3906,6 +3912,8 @@ public class ChromeTabbedActivity extends ChromeActivity implements PreAttachInt +@@ -4030,6 +4036,8 @@ public class ChromeTabbedActivity extends ChromeActivity implements PreAttachInt CloseAllTabsDialog.show( this, getModalDialogManagerSupplier(), tabModelSelector, closeAllTabsRunnable); RecordUserAction.record("MobileMenuCloseAllTabs"); @@ -83,7 +83,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedAct } else if (id == R.id.close_all_incognito_tabs_menu_id) { boolean allowUndo = TabClosureParamsUtils.shouldAllowUndo(triggeringMotion); -@@ -4038,6 +4046,41 @@ public class ChromeTabbedActivity extends ChromeActivity implements PreAttachInt +@@ -4164,6 +4172,41 @@ public class ChromeTabbedActivity extends ChromeActivity implements PreAttachInt getTabModalLifetimeHandler().onOmniboxFocusChanged(hasFocus); } @@ -128,7 +128,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedAct diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedAppMenuPropertiesDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedAppMenuPropertiesDelegate.java --- a/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedAppMenuPropertiesDelegate.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedAppMenuPropertiesDelegate.java -@@ -294,6 +294,14 @@ public class TabbedAppMenuPropertiesDelegate extends AppMenuPropertiesDelegateIm +@@ -303,6 +303,14 @@ public class TabbedAppMenuPropertiesDelegate extends AppMenuPropertiesDelegateIm // Bookmarks modelList.add(buildBookmarksItem()); @@ -143,7 +143,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/Tab // Recent Tabs if (shouldShowRecentTabsItem()) modelList.add(buildRecentTabsItem()); -@@ -479,6 +487,13 @@ public class TabbedAppMenuPropertiesDelegate extends AppMenuPropertiesDelegateIm +@@ -503,6 +511,13 @@ public class TabbedAppMenuPropertiesDelegate extends AppMenuPropertiesDelegateIm modelList.add(buildNewTabGroupItem()); modelList.add(buildCloseAllTabsItem()); if (shouldShowTinkerTank()) modelList.add(buildTinkerTankItem()); @@ -194,7 +194,7 @@ diff --git a/chrome/browser/bookmarks/android/bookmark_bridge.cc b/chrome/browse base::android::ScopedJavaLocalRef BookmarkBridge::GetMostRecentlyAddedUserBookmarkIdForUrl(JNIEnv* env, const GURL& url) { -@@ -449,6 +476,7 @@ void BookmarkBridge::GetAllFoldersWithDepths( +@@ -448,6 +475,7 @@ void BookmarkBridge::GetAllFoldersWithDepths( // Vector to temporarily contain all child bookmarks at same level for sorting std::vector bookmarks = { bookmark_model_->mobile_node(), @@ -202,7 +202,7 @@ diff --git a/chrome/browser/bookmarks/android/bookmark_bridge.cc b/chrome/browse bookmark_model_->bookmark_bar_node(), bookmark_model_->other_node(), }; -@@ -557,6 +585,9 @@ std::vector BookmarkBridge::GetTopLevelFolderIdsImpl( +@@ -556,6 +584,9 @@ std::vector BookmarkBridge::GetTopLevelFolderIdsImpl( top_level_folders.push_back(other_node); } @@ -212,7 +212,7 @@ diff --git a/chrome/browser/bookmarks/android/bookmark_bridge.cc b/chrome/browse const BookmarkNode* reading_list_node = local_or_syncable_reading_list_manager_->GetRoot(); if (IsPermanentFolderVisible( -@@ -1229,6 +1260,17 @@ void BookmarkBridge::GetBookmarksOfType( +@@ -1223,6 +1254,17 @@ void BookmarkBridge::GetBookmarksOfType( AddBookmarkNodesToBookmarkIdList(env, j_list, results); } @@ -244,9 +244,9 @@ diff --git a/chrome/browser/bookmarks/android/bookmark_bridge.h b/chrome/browser base::android::ScopedJavaLocalRef GetMostRecentlyAddedUserBookmarkIdForUrl(JNIEnv* env, const GURL& url); const bookmarks::BookmarkNode* GetMostRecentlyAddedUserBookmarkIdForUrlImpl( -@@ -240,6 +244,10 @@ class BookmarkBridge : public ProfileObserver, +@@ -232,6 +236,10 @@ class BookmarkBridge : public ProfileObserver, const base::android::JavaRef& j_list, - jint type); + int32_t type); + base::android::ScopedJavaLocalRef GetTabsCollectionFolderId( + JNIEnv* env, @@ -370,14 +370,14 @@ diff --git a/chrome/browser/bookmarks/bookmark_html_writer.cc b/chrome/browser/b CHECK(!model->account_other_node()); CHECK(!model->account_mobile_node()); @@ -210,6 +211,9 @@ class Writer : public base::RefCountedThreadSafe { - base::Value::Dict* mobile_folder_value = local_permanent_folders->FindDict( + base::DictValue* mobile_folder_value = local_permanent_folders->FindDict( BookmarkCodec::kMobileBookmarkFolderNameKey); CHECK(mobile_folder_value); + base::Value::Dict* tabs_collection_value = + local_permanent_folders->FindDict(BookmarkCodec::kTabsBookmarkFolderNameKey); + CHECK(tabs_collection_value); - base::Value::Dict* account_permanent_folders = + base::DictValue* account_permanent_folders = account_bookmarks_.FindDict(BookmarkCodec::kRootsKey); @@ -285,6 +289,10 @@ class Writer : public base::RefCountedThreadSafe { return bookmark_html_writer::Result::kCouldNotWriteNodes; @@ -460,7 +460,7 @@ diff --git a/chrome/browser/download/android/java/src/org/chromium/chrome/browse 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 -@@ -4585,6 +4585,9 @@ To change this setting, BEGIN_LINKdelete the Chrome d +@@ -4615,6 +4615,9 @@ To change this setting, BEGIN_LINKdelete the Chrome d Select tabs @@ -528,15 +528,15 @@ diff --git a/components/bookmarks/browser/bookmark_codec.cc b/components/bookmar const char BookmarkCodec::kVersionKey[] = "version"; const char BookmarkCodec::kChecksumKey[] = "checksum"; const char BookmarkCodec::kChecksumSHA256Key[] = "checksum_sha256"; -@@ -98,6 +99,7 @@ base::Value::Dict BookmarkCodec::Encode( - const BookmarkNode* bookmark_bar_node, - const BookmarkNode* other_folder_node, - const BookmarkNode* mobile_folder_node, -+ const BookmarkNode* tabs_folder_node, - std::string sync_metadata_str) { +@@ -97,6 +98,7 @@ BookmarkCodec::~BookmarkCodec() = default; + base::DictValue BookmarkCodec::Encode(const BookmarkNode* bookmark_bar_node, + const BookmarkNode* other_folder_node, + const BookmarkNode* mobile_folder_node, ++ const BookmarkNode* tabs_folder_node, + std::string sync_metadata_str) { ids_reassigned_ = false; uuids_reassigned_ = false; -@@ -123,6 +125,8 @@ base::Value::Dict BookmarkCodec::Encode( +@@ -122,6 +124,8 @@ base::DictValue BookmarkCodec::Encode(const BookmarkNode* bookmark_bar_node, roots.Set(kBookmarkBarFolderNameKey, EncodeNode(bookmark_bar_node)); roots.Set(kOtherBookmarkFolderNameKey, EncodeNode(other_folder_node)); roots.Set(kMobileBookmarkFolderNameKey, EncodeNode(mobile_folder_node)); @@ -545,7 +545,7 @@ diff --git a/components/bookmarks/browser/bookmark_codec.cc b/components/bookmar } else { // No permanent node should have been provided. CHECK(!other_folder_node); -@@ -143,6 +147,7 @@ bool BookmarkCodec::Decode(const base::Value::Dict& value, +@@ -142,6 +146,7 @@ bool BookmarkCodec::Decode(const base::DictValue& value, BookmarkNode* bb_node, BookmarkNode* other_folder_node, BookmarkNode* mobile_folder_node, @@ -553,7 +553,7 @@ diff --git a/components/bookmarks/browser/bookmark_codec.cc b/components/bookmar int64_t* max_id, std::string* sync_metadata_str) { if (sync_metadata_str) { -@@ -155,13 +160,15 @@ bool BookmarkCodec::Decode(const base::Value::Dict& value, +@@ -154,13 +159,15 @@ bool BookmarkCodec::Decode(const base::DictValue& value, base::Uuid::ParseLowercase(kBookmarkBarNodeUuid), base::Uuid::ParseLowercase(kOtherBookmarksNodeUuid), base::Uuid::ParseLowercase(kMobileBookmarksNodeUuid), @@ -570,24 +570,24 @@ diff --git a/components/bookmarks/browser/bookmark_codec.cc b/components/bookmar value, sync_metadata_str); ReassignIDsIfRequired(); -@@ -219,6 +226,7 @@ base::Value::Dict BookmarkCodec::EncodeMetaInfo( +@@ -218,6 +225,7 @@ base::DictValue BookmarkCodec::EncodeMetaInfo( bool BookmarkCodec::DecodeHelper(BookmarkNode* bb_node, BookmarkNode* other_folder_node, BookmarkNode* mobile_folder_node, + BookmarkNode* tabs_folder_node, - const base::Value::Dict& value, + const base::DictValue& value, std::string* sync_metadata_str) { std::optional version = value.FindInt(kVersionKey); -@@ -242,6 +250,8 @@ bool BookmarkCodec::DecodeHelper(BookmarkNode* bb_node, +@@ -240,6 +248,8 @@ bool BookmarkCodec::DecodeHelper(BookmarkNode* bb_node, roots->FindDict(kOtherBookmarkFolderNameKey); - const base::Value::Dict* mobile_folder_value = + const base::DictValue* mobile_folder_value = roots->FindDict(kMobileBookmarkFolderNameKey); + const base::Value::Dict* tabs_folder_value = + roots->FindDict(kTabsBookmarkFolderNameKey); if (!bb_value || !other_folder_value || !mobile_folder_value) return false; -@@ -249,6 +259,8 @@ bool BookmarkCodec::DecodeHelper(BookmarkNode* bb_node, +@@ -247,6 +257,8 @@ bool BookmarkCodec::DecodeHelper(BookmarkNode* bb_node, DecodeNode(*bb_value, nullptr, bb_node); DecodeNode(*other_folder_value, nullptr, other_folder_node); DecodeNode(*mobile_folder_value, nullptr, mobile_folder_node); @@ -599,15 +599,15 @@ diff --git a/components/bookmarks/browser/bookmark_codec.cc b/components/bookmar diff --git a/components/bookmarks/browser/bookmark_codec.h b/components/bookmarks/browser/bookmark_codec.h --- a/components/bookmarks/browser/bookmark_codec.h +++ b/components/bookmarks/browser/bookmark_codec.h -@@ -44,6 +44,7 @@ class BookmarkCodec { - const BookmarkNode* bookmark_bar_node, - const BookmarkNode* other_folder_node, - const BookmarkNode* mobile_folder_node, -+ const BookmarkNode* tabs_folder_node, - std::string sync_metadata_str); +@@ -43,6 +43,7 @@ class BookmarkCodec { + base::DictValue Encode(const BookmarkNode* bookmark_bar_node, + const BookmarkNode* other_folder_node, + const BookmarkNode* mobile_folder_node, ++ const BookmarkNode* tabs_folder_node, + std::string sync_metadata_str); // Decodes the previously encoded value to the specified nodes as well as -@@ -62,6 +63,7 @@ class BookmarkCodec { +@@ -61,6 +62,7 @@ class BookmarkCodec { BookmarkNode* bb_node, BookmarkNode* other_folder_node, BookmarkNode* mobile_folder_node, @@ -615,7 +615,7 @@ diff --git a/components/bookmarks/browser/bookmark_codec.h b/components/bookmark int64_t* max_node_id, std::string* sync_metadata_str); -@@ -95,6 +97,7 @@ class BookmarkCodec { +@@ -94,6 +96,7 @@ class BookmarkCodec { static const char kBookmarkBarFolderNameKey[]; static const char kOtherBookmarkFolderNameKey[]; static const char kMobileBookmarkFolderNameKey[]; @@ -623,12 +623,12 @@ diff --git a/components/bookmarks/browser/bookmark_codec.h b/components/bookmark static const char kVersionKey[]; static const char kChecksumKey[]; static const char kChecksumSHA256Key[]; -@@ -128,6 +131,7 @@ class BookmarkCodec { +@@ -127,6 +130,7 @@ class BookmarkCodec { bool DecodeHelper(BookmarkNode* bb_node, BookmarkNode* other_folder_node, BookmarkNode* mobile_folder_node, + BookmarkNode* tabs_folder_node, - const base::Value::Dict& value, + const base::DictValue& value, std::string* sync_metadata_str); diff --git a/components/bookmarks/browser/bookmark_load_details.cc b/components/bookmarks/browser/bookmark_load_details.cc @@ -808,7 +808,7 @@ diff --git a/components/bookmarks/browser/bookmark_node.h b/components/bookmarks diff --git a/components/bookmarks/browser/bookmark_storage.cc b/components/bookmarks/browser/bookmark_storage.cc --- a/components/bookmarks/browser/bookmark_storage.cc +++ b/components/bookmarks/browser/bookmark_storage.cc -@@ -45,6 +45,7 @@ base::Value::Dict EncodeModelToDict( +@@ -45,6 +45,7 @@ base::DictValue EncodeModelToDict( case BookmarkStorage::kSelectLocalOrSyncableNodes: return codec.Encode( model->bookmark_bar_node(), model->other_node(), model->mobile_node(), @@ -816,7 +816,7 @@ diff --git a/components/bookmarks/browser/bookmark_storage.cc b/components/bookm model->client()->EncodeLocalOrSyncableBookmarkSyncMetadata()); case BookmarkStorage::kSelectAccountNodes: // Either all permanent folders or none should exist. -@@ -61,6 +62,7 @@ base::Value::Dict EncodeModelToDict( +@@ -61,6 +62,7 @@ base::DictValue EncodeModelToDict( return codec.Encode(model->account_bookmark_bar_node(), model->account_other_node(), model->account_mobile_node(), @@ -851,7 +851,7 @@ diff --git a/components/bookmarks/browser/bookmark_uuids.h b/components/bookmark diff --git a/components/bookmarks/browser/model_loader.cc b/components/bookmarks/browser/model_loader.cc --- a/components/bookmarks/browser/model_loader.cc +++ b/components/bookmarks/browser/model_loader.cc -@@ -74,6 +74,9 @@ std::unique_ptr LoadBookmarks( +@@ -73,6 +73,9 @@ std::unique_ptr LoadBookmarks( std::unique_ptr account_mobile_folder_node = BookmarkPermanentNode::CreateMobileBookmarks( 0, /*is_account_node=*/true); @@ -859,9 +859,9 @@ diff --git a/components/bookmarks/browser/model_loader.cc b/components/bookmarks + BookmarkPermanentNode::CreateTabsCollectionBookmarks( + 0, /*is_account_node=*/true); - std::optional root_dict = + std::optional root_dict = LoadFileToDict(account_file_path); -@@ -81,7 +84,8 @@ std::unique_ptr LoadBookmarks( +@@ -80,7 +83,8 @@ std::unique_ptr LoadBookmarks( if (root_dict.has_value() && codec.Decode(*root_dict, /*already_assigned_ids=*/{}, account_bb_node.get(), account_other_folder_node.get(), @@ -871,7 +871,7 @@ diff --git a/components/bookmarks/browser/model_loader.cc b/components/bookmarks &sync_metadata_str)) { ids_assigned_to_account_nodes = codec.release_assigned_ids(); -@@ -123,7 +127,8 @@ std::unique_ptr LoadBookmarks( +@@ -122,7 +126,8 @@ std::unique_ptr LoadBookmarks( if (root_dict.has_value() && codec.Decode(*root_dict, std::move(ids_assigned_to_account_nodes), details->bb_node(), details->other_folder_node(), diff --git a/build/patches/Add-option-to-force-tablet-UI.patch b/build/patches/Add-option-to-force-tablet-UI.patch index 5baa83ec..99dcdbae 100644 --- a/build/patches/Add-option-to-force-tablet-UI.patch +++ b/build/patches/Add-option-to-force-tablet-UI.patch @@ -6,7 +6,7 @@ License: GPL-2.0-or-later - https://spdx.org/licenses/GPL-2.0-or-later.html --- .../layout/custom_tabs_control_container.xml | 2 +- .../java/res/layout/recent_tabs_page.xml | 2 +- - .../java/res/values-sw600dp/dimens.xml | 4 ++-- + .../java/res/values-sw600dp/dimens.xml | 3 ++- chrome/android/java/res/values/dimens.xml | 6 +++++- .../browser/ChromeBaseAppCompatActivity.java | 3 +++ .../chrome/browser/WarmupManager.java | 7 +++++-- @@ -37,7 +37,7 @@ License: GPL-2.0-or-later - https://spdx.org/licenses/GPL-2.0-or-later.html .../accessibility/AccessibilitySettings.java | 13 +++++++++++++ .../AccessibilitySettingsDelegate.java | 2 ++ .../chromium/ui/base/DeviceFormFactor.java | 14 ++++++++++++++ - 33 files changed, 172 insertions(+), 25 deletions(-) + 33 files changed, 172 insertions(+), 24 deletions(-) diff --git a/chrome/android/java/res/layout/custom_tabs_control_container.xml b/chrome/android/java/res/layout/custom_tabs_control_container.xml --- a/chrome/android/java/res/layout/custom_tabs_control_container.xml @@ -66,12 +66,11 @@ diff --git a/chrome/android/java/res/layout/recent_tabs_page.xml b/chrome/androi diff --git a/chrome/android/java/res/values-sw600dp/dimens.xml b/chrome/android/java/res/values-sw600dp/dimens.xml --- a/chrome/android/java/res/values-sw600dp/dimens.xml +++ b/chrome/android/java/res/values-sw600dp/dimens.xml -@@ -14,8 +14,8 @@ found in the LICENSE file. +@@ -14,7 +14,8 @@ found in the LICENSE file. 14sp - 96dp -- 64dp + 96dp + 96dp @@ -98,7 +97,7 @@ diff --git a/chrome/android/java/res/values/dimens.xml b/chrome/android/java/res diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeBaseAppCompatActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeBaseAppCompatActivity.java --- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeBaseAppCompatActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeBaseAppCompatActivity.java -@@ -66,6 +66,7 @@ import org.chromium.chrome.browser.ui.edge_to_edge.EdgeToEdgeController; +@@ -65,6 +65,7 @@ import org.chromium.chrome.browser.ui.edge_to_edge.EdgeToEdgeController; import org.chromium.chrome.browser.ui.edge_to_edge.EdgeToEdgeControllerCreator; import org.chromium.chrome.browser.ui.edge_to_edge.EdgeToEdgeFieldTrialImpl; import org.chromium.chrome.browser.ui.edge_to_edge.EdgeToEdgeUtils; @@ -106,7 +105,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeBaseAppCo import org.chromium.chrome.browser.ui.edge_to_edge.SimpleEdgeToEdgeController; import org.chromium.components.browser_ui.styles.SemanticColorUtils; import org.chromium.components.browser_ui.util.AutomotiveUtils; -@@ -155,6 +156,8 @@ public class ChromeBaseAppCompatActivity extends AppCompatActivity +@@ -154,6 +155,8 @@ public class ChromeBaseAppCompatActivity extends AppCompatActivity protected void attachBaseContext(Context newBase) { super.attachBaseContext(newBase); @@ -142,7 +141,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/WarmupManager.j diff --git a/chrome/android/java/src/org/chromium/chrome/browser/accessibility/settings/ChromeAccessibilitySettingsDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/accessibility/settings/ChromeAccessibilitySettingsDelegate.java --- a/chrome/android/java/src/org/chromium/chrome/browser/accessibility/settings/ChromeAccessibilitySettingsDelegate.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/accessibility/settings/ChromeAccessibilitySettingsDelegate.java -@@ -65,6 +65,25 @@ public class ChromeAccessibilitySettingsDelegate implements AccessibilitySetting +@@ -67,6 +67,25 @@ public class ChromeAccessibilitySettingsDelegate implements AccessibilitySetting } } @@ -171,7 +170,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/accessibility/s diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java --- a/chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java -@@ -842,7 +842,10 @@ public abstract class ChromeActivity extends AsyncInitializationActivity +@@ -841,7 +841,10 @@ public abstract class ChromeActivity extends AsyncInitializationActivity // Inflate the correct toolbar layout for the device. int toolbarLayoutId = getToolbarLayoutId(); if (toolbarLayoutId != ActivityUtils.NO_RESOURCE_ID && controlContainer != null) { @@ -186,7 +185,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActiv diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelper.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelper.java --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelper.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelper.java -@@ -141,6 +141,7 @@ import org.chromium.components.tab_group_sync.TabGroupSyncService; +@@ -144,6 +144,7 @@ import org.chromium.components.tab_group_sync.TabGroupSyncService; import org.chromium.components.tab_group_sync.TriggerSource; import org.chromium.components.tab_groups.TabGroupColorId; import org.chromium.ui.accessibility.AccessibilityState; @@ -194,7 +193,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/over import org.chromium.ui.base.LocalizationUtils; import org.chromium.ui.base.WindowAndroid; import org.chromium.ui.util.ColorUtils; -@@ -5249,8 +5250,13 @@ public class StripLayoutHelper +@@ -5335,8 +5336,13 @@ public class StripLayoutHelper mCloseButtonMenu.setAnchorView(tabView); // 3. Set the vertical offset to align the close button menu with bottom of the tab strip int tabHeight = mManagerHost.getHeight(); @@ -213,15 +212,15 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/over diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelperManager.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelperManager.java --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelperManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelperManager.java -@@ -107,6 +107,7 @@ import org.chromium.components.browser_ui.styles.SemanticColorUtils; +@@ -109,6 +109,7 @@ import org.chromium.components.browser_ui.desktop_windowing.DesktopWindowStateMa + import org.chromium.components.browser_ui.styles.SemanticColorUtils; import org.chromium.components.browser_ui.widget.gesture.BackPressHandler; - import org.chromium.components.browser_ui.widget.scrim.ScrimProperties; import org.chromium.content_public.browser.LoadUrlParams; +import org.chromium.ui.base.DeviceFormFactor; import org.chromium.ui.base.LocalizationUtils; import org.chromium.ui.base.PageTransition; import org.chromium.ui.base.WindowAndroid; -@@ -505,7 +506,10 @@ public class StripLayoutHelperManager +@@ -548,7 +549,10 @@ public class StripLayoutHelperManager mIsHeaderCustomizationSupported = ToolbarFeatures.isAppHeaderCustomizationSupported( /* isTablet= */ true, DisplayUtil.isContextInDefaultDisplay(mContext)); @@ -273,7 +272,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/init/ChromeBrow diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator.java --- a/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator.java -@@ -811,7 +811,9 @@ public class TabbedRootUiCoordinator extends RootUiCoordinator { +@@ -872,7 +872,9 @@ public class TabbedRootUiCoordinator extends RootUiCoordinator { @Override public int getControlContainerHeightResource() { @@ -287,7 +286,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/Tab diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ui/RootUiCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/ui/RootUiCoordinator.java --- a/chrome/android/java/src/org/chromium/chrome/browser/ui/RootUiCoordinator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ui/RootUiCoordinator.java -@@ -125,6 +125,8 @@ import org.chromium.chrome.browser.paint_preview.DemoPaintPreview; +@@ -131,6 +131,8 @@ import org.chromium.chrome.browser.paint_preview.DemoPaintPreview; import org.chromium.chrome.browser.password_manager.ManagePasswordsReferrer; import org.chromium.chrome.browser.password_manager.PasswordManagerLauncher; import org.chromium.chrome.browser.pdf.PdfPage; @@ -296,7 +295,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ui/RootUiCoordi import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.quick_delete.QuickDeleteController; import org.chromium.chrome.browser.quick_delete.QuickDeleteDelegateImpl; -@@ -1959,7 +1961,9 @@ public class RootUiCoordinator +@@ -2046,7 +2048,9 @@ public class RootUiCoordinator protected int getFindToolbarStub() { int stubId = R.id.find_toolbar_stub; @@ -321,7 +320,7 @@ diff --git a/chrome/browser/preferences/BUILD.gn b/chrome/browser/preferences/BU 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 -@@ -393,6 +393,7 @@ public final class ChromePreferenceKeys { +@@ -402,6 +402,7 @@ public final class ChromePreferenceKeys { /** Whether the app-specific history info text was already seen by users. */ public static final String HISTORY_APP_SPECIFIC_INFO_SEEN = "Chrome.History.AppSpecificInfoSeen"; @@ -372,15 +371,15 @@ diff --git a/chrome/browser/preferences/android/java/src/org/chromium/chrome/bro diff --git a/chrome/browser/ui/android/desktop_windowing/java/src/org/chromium/chrome/browser/ui/desktop_windowing/AppHeaderUtils.java b/chrome/browser/ui/android/desktop_windowing/java/src/org/chromium/chrome/browser/ui/desktop_windowing/AppHeaderUtils.java --- a/chrome/browser/ui/android/desktop_windowing/java/src/org/chromium/chrome/browser/ui/desktop_windowing/AppHeaderUtils.java +++ b/chrome/browser/ui/android/desktop_windowing/java/src/org/chromium/chrome/browser/ui/desktop_windowing/AppHeaderUtils.java -@@ -26,6 +26,7 @@ import org.chromium.chrome.browser.lifecycle.ActivityLifecycleDispatcher.Activit - import org.chromium.chrome.browser.preferences.ChromePreferenceKeys; - import org.chromium.chrome.browser.preferences.ChromeSharedPreferences; +@@ -20,6 +20,7 @@ import org.chromium.build.annotations.Nullable; + import org.chromium.chrome.browser.lifecycle.ActivityLifecycleDispatcher; + import org.chromium.chrome.browser.lifecycle.ActivityLifecycleDispatcher.ActivityState; import org.chromium.components.browser_ui.desktop_windowing.DesktopWindowStateManager; +import org.chromium.ui.base.DeviceFormFactor; import org.chromium.ui.display.DisplayUtil; import org.chromium.ui.insets.InsetsRectProvider; -@@ -245,6 +246,7 @@ public class AppHeaderUtils { +@@ -169,6 +170,7 @@ public class AppHeaderUtils { */ static @DesktopWindowHeuristicResult int checkIsInDesktopWindow( InsetsRectProvider insetsRectProvider, Context context) { @@ -391,7 +390,7 @@ diff --git a/chrome/browser/ui/android/desktop_windowing/java/src/org/chromium/c diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarCoordinator.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarCoordinator.java --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarCoordinator.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarCoordinator.java -@@ -1022,7 +1022,7 @@ public class LocationBarCoordinator +@@ -1024,7 +1024,7 @@ public class LocationBarCoordinator } private boolean isTabletWindow() { @@ -403,7 +402,7 @@ diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/brow 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 -@@ -1504,6 +1504,13 @@ Your Google account may have other forms of browsing history like searches and a +@@ -1519,6 +1519,13 @@ Your Google account may have other forms of browsing history like searches and a Privacy guide explanation closed @@ -457,14 +456,14 @@ diff --git a/chrome/browser/ui/android/toolbar/java/res/layout/control_container diff --git a/chrome/browser/ui/android/toolbar/java/res/layout/toolbar_tablet.xml b/chrome/browser/ui/android/toolbar/java/res/layout/toolbar_tablet.xml --- a/chrome/browser/ui/android/toolbar/java/res/layout/toolbar_tablet.xml +++ b/chrome/browser/ui/android/toolbar/java/res/layout/toolbar_tablet.xml -@@ -15,7 +15,7 @@ found in the LICENSE file. +@@ -14,7 +14,7 @@ found in the LICENSE file. android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="@dimen/toolbar_height_no_shadow" - android:layout_marginTop="@dimen/tab_strip_height" + android:layout_marginTop="@dimen/tab_strip_height_tabletui" android:background="@macro/default_bg_color" - > + > diff --git a/chrome/browser/ui/android/toolbar/java/res/values-sw600dp/dimens.xml b/chrome/browser/ui/android/toolbar/java/res/values-sw600dp/dimens.xml --- a/chrome/browser/ui/android/toolbar/java/res/values-sw600dp/dimens.xml @@ -598,7 +597,7 @@ diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/brow diff --git a/components/browser_ui/accessibility/android/java/res/xml/accessibility_preferences.xml b/components/browser_ui/accessibility/android/java/res/xml/accessibility_preferences.xml --- a/components/browser_ui/accessibility/android/java/res/xml/accessibility_preferences.xml +++ b/components/browser_ui/accessibility/android/java/res/xml/accessibility_preferences.xml -@@ -41,6 +41,11 @@ found in the LICENSE file. +@@ -46,6 +46,11 @@ found in the LICENSE file. android:summary="@string/caret_browsing_summary" android:title="@string/caret_browsing_title" /> @@ -613,7 +612,7 @@ diff --git a/components/browser_ui/accessibility/android/java/res/xml/accessibil diff --git a/components/browser_ui/accessibility/android/java/src/org/chromium/components/browser_ui/accessibility/AccessibilitySettings.java b/components/browser_ui/accessibility/android/java/src/org/chromium/components/browser_ui/accessibility/AccessibilitySettings.java --- a/components/browser_ui/accessibility/android/java/src/org/chromium/components/browser_ui/accessibility/AccessibilitySettings.java +++ b/components/browser_ui/accessibility/android/java/src/org/chromium/components/browser_ui/accessibility/AccessibilitySettings.java -@@ -35,6 +35,7 @@ import org.chromium.content_public.browser.ContentFeatureMap; +@@ -39,6 +39,7 @@ import org.chromium.content_public.browser.ContentFeatureMap; import org.chromium.ui.base.UiAndroidFeatureList; import org.chromium.chrome.browser.settings.ChromeBaseSettingsFragment; @@ -621,9 +620,9 @@ diff --git a/components/browser_ui/accessibility/android/java/src/org/chromium/c /** Fragment to keep track of all the accessibility related preferences. */ @NullMarked -@@ -55,6 +56,9 @@ public class AccessibilitySettings extends ChromeBaseSettingsFragment - public static final String PREF_TOUCHPAD_OVERSCROLL_HISTORY_NAVIGATION = - "touchpad_overscroll_history_navigation"; +@@ -80,6 +81,9 @@ public class AccessibilitySettings extends ChromeBaseSettingsFragment + } + }; + private BooleanPreferenceDelegate mForceTabletUIDelegate; + static final String PREF_FORCE_TABLET_UI = "force_tablet_ui"; @@ -631,9 +630,9 @@ diff --git a/components/browser_ui/accessibility/android/java/src/org/chromium/c private PageZoomPreference mPageZoomDefaultZoomPref; private ChromeSwitchPreference mPageZoomIncludeOSAdjustment; private ChromeSwitchPreference mPageZoomAlwaysShowPref; -@@ -131,6 +135,12 @@ public class AccessibilitySettings extends ChromeBaseSettingsFragment - mDelegate.getReaderAccessibilityDelegate().getValue()); - readerForAccessibilityPref.setOnPreferenceChangeListener(this); +@@ -167,6 +171,12 @@ public class AccessibilitySettings extends ChromeBaseSettingsFragment + readerEnableLinks.setOnPreferenceChangeListener(this); + } + ChromeSwitchPreference forceTabletUiPref = + (ChromeSwitchPreference) findPreference(PREF_FORCE_TABLET_UI); @@ -644,7 +643,7 @@ diff --git a/components/browser_ui/accessibility/android/java/src/org/chromium/c Preference captions = findPreference(PREF_CAPTIONS); captions.setOnPreferenceClickListener( preference -> { -@@ -217,6 +227,9 @@ public class AccessibilitySettings extends ChromeBaseSettingsFragment +@@ -262,6 +272,9 @@ public class AccessibilitySettings extends ChromeBaseSettingsFragment public boolean onPreferenceChange(Preference preference, Object newValue) { if (PREF_FORCE_ENABLE_ZOOM.equals(preference.getKey())) { mDelegate.getForceEnableZoomAccessibilityDelegate().setValue((Boolean) newValue); @@ -657,7 +656,7 @@ diff --git a/components/browser_ui/accessibility/android/java/src/org/chromium/c diff --git a/components/browser_ui/accessibility/android/java/src/org/chromium/components/browser_ui/accessibility/AccessibilitySettingsDelegate.java b/components/browser_ui/accessibility/android/java/src/org/chromium/components/browser_ui/accessibility/AccessibilitySettingsDelegate.java --- a/components/browser_ui/accessibility/android/java/src/org/chromium/components/browser_ui/accessibility/AccessibilitySettingsDelegate.java +++ b/components/browser_ui/accessibility/android/java/src/org/chromium/components/browser_ui/accessibility/AccessibilitySettingsDelegate.java -@@ -41,6 +41,8 @@ public interface AccessibilitySettingsDelegate { +@@ -42,6 +42,8 @@ public interface AccessibilitySettingsDelegate { */ BrowserContextHandle getBrowserContextHandle(); diff --git a/build/patches/Add-setting-to-enable-Credman-for-passkeys.patch b/build/patches/Add-setting-to-enable-Credman-for-passkeys.patch index d5a9a9d1..9026769e 100644 --- a/build/patches/Add-setting-to-enable-Credman-for-passkeys.patch +++ b/build/patches/Add-setting-to-enable-Credman-for-passkeys.patch @@ -10,18 +10,18 @@ Conditional immediate support is disabled. License: GPL-2.0-or-later - https://spdx.org/licenses/GPL-2.0-or-later.html --- - .../settings/PasswordSettings.java | 27 +++++++++++++++++ + .../settings/PasswordSettings.java | 27 +++++++++++++++++++ .../touch_to_fill_controller.cc | 2 ++ - ...etting-to-enable-Credman-for-passkeys.grdp | 12 ++++++++ - .../webauthn/AuthenticatorImpl.java | 29 +++++++------------ + ...etting-to-enable-Credman-for-passkeys.grdp | 12 +++++++++ + .../webauthn/AuthenticatorImpl.java | 25 ++++++++--------- .../components/webauthn/WebauthnFeatures.java | 2 ++ - .../cred_man/CredManSupportProvider.java | 25 ++++------------ + .../cred_man/CredManSupportProvider.java | 25 +++++------------ .../webauthn/android/webauthn_feature_map.cc | 1 + components/webauthn/features.cc | 4 +++ - components/webauthn/features.h | 3 ++ + components/webauthn/features.h | 3 +++ device/fido/public/features.cc | 2 ++ .../authentication_credentials_container.cc | 5 ++++ - 11 files changed, 75 insertions(+), 37 deletions(-) + 11 files changed, 75 insertions(+), 33 deletions(-) create mode 100644 chrome/browser/ui/android/strings/cromite_android_chrome_strings_grd/Add-setting-to-enable-Credman-for-passkeys.grdp diff --git a/chrome/android/java/src/org/chromium/chrome/browser/password_manager/settings/PasswordSettings.java b/chrome/android/java/src/org/chromium/chrome/browser/password_manager/settings/PasswordSettings.java @@ -140,7 +140,7 @@ diff --git a/components/webauthn/android/java/src/org/chromium/components/webaut mRequestCallback.onComplete( WebauthnRequestResponse.forFailedMakeCredential( AuthenticatorStatus.NOT_IMPLEMENTED, -@@ -250,8 +251,7 @@ public final class AuthenticatorImpl implements Authenticator, AuthenticationCon +@@ -246,8 +247,7 @@ public final class AuthenticatorImpl implements Authenticator, AuthenticationCon && DeviceFeatureMap.isEnabled( DeviceFeatureList .WEBAUTHN_AUTHENTICATOR_PASSWORDS_ONLY_IMMEDIATE_REQUESTS); @@ -150,7 +150,7 @@ diff --git a/components/webauthn/android/java/src/org/chromium/components/webaut || (options.publicKey == null && !isPasswordOnlyFlux)) { RequestMetrics metrics = new RequestMetrics.Builder() -@@ -291,12 +291,11 @@ public final class AuthenticatorImpl implements Authenticator, AuthenticationCon +@@ -287,12 +287,11 @@ public final class AuthenticatorImpl implements Authenticator, AuthenticationCon } private boolean couldSupportConditionalMediation() { @@ -165,7 +165,7 @@ diff --git a/components/webauthn/android/java/src/org/chromium/components/webaut } @Override -@@ -370,26 +369,20 @@ public final class AuthenticatorImpl implements Authenticator, AuthenticationCon +@@ -366,22 +365,20 @@ public final class AuthenticatorImpl implements Authenticator, AuthenticationCon capabilities.add( createWebAuthnClientCapability( AuthenticatorConstants.CAPABILITY_CONDITIONAL_GET, @@ -175,15 +175,11 @@ diff --git a/components/webauthn/android/java/src/org/chromium/components/webaut createWebAuthnClientCapability( AuthenticatorConstants.CAPABILITY_UVPAA, - couldSupportUvpaa() && isUvpaa)); -- boolean conditionalCreateEnabled = -- couldSupportConditionalMediation() -- && DeviceFeatureMap.isEnabled( -- DeviceFeatureList.WEBAUTHN_PASSKEY_UPGRADE); + true)); capabilities.add( createWebAuthnClientCapability( AuthenticatorConstants.CAPABILITY_CONDITIONAL_CREATE, -- isUvpaa && conditionalCreateEnabled)); +- isUvpaa && couldSupportConditionalMediation())); + DeviceFeatureMap.isEnabled( + DeviceFeatureList.WEBAUTHN_PASSKEY_UPGRADE))); capabilities.add( @@ -322,15 +318,15 @@ diff --git a/components/webauthn/features.h b/components/webauthn/features.h diff --git a/device/fido/public/features.cc b/device/fido/public/features.cc --- a/device/fido/public/features.cc +++ b/device/fido/public/features.cc -@@ -188,6 +188,7 @@ BASE_FEATURE(kWebAuthnImmediateGet, - #else +@@ -136,6 +136,7 @@ BASE_FEATURE(kWebAuthnAndroidSignal, + "WebAuthenticationAndroidSignal", base::FEATURE_ENABLED_BY_DEFAULT); #endif // BUILDFLAG(IS_ANDROID) +SET_CROMITE_FEATURE_DISABLED(kWebAuthnImmediateGet); - BASE_FEATURE_PARAM(int, - kWebAuthnImmediateMediationTimeoutMilliseconds, -@@ -200,6 +201,7 @@ BASE_FEATURE_PARAM(int, + // Disabled by default. + BASE_FEATURE(kDigitalCredentialsHybridLinking, +@@ -184,6 +185,7 @@ BASE_FEATURE_PARAM(int, BASE_FEATURE(kWebAuthnImmediateGetAutoselect, "WebAuthenticationImmediateGetAutoselect", base::FEATURE_ENABLED_BY_DEFAULT); @@ -341,7 +337,7 @@ diff --git a/device/fido/public/features.cc b/device/fido/public/features.cc diff --git a/third_party/blink/renderer/modules/credentialmanagement/authentication_credentials_container.cc b/third_party/blink/renderer/modules/credentialmanagement/authentication_credentials_container.cc --- a/third_party/blink/renderer/modules/credentialmanagement/authentication_credentials_container.cc +++ b/third_party/blink/renderer/modules/credentialmanagement/authentication_credentials_container.cc -@@ -1135,6 +1135,11 @@ DOMException* AuthenticatorStatusToDOMException( +@@ -1129,6 +1129,11 @@ DOMException* AuthenticatorStatusToDOMException( const WebAuthnDOMExceptionDetailsPtr& dom_exception_details) { DCHECK_EQ(status != AuthenticatorStatus::ERROR_WITH_DOM_EXCEPTION_DETAILS, dom_exception_details.is_null()); diff --git a/build/patches/Disable-some-signed-exchange-features.patch b/build/patches/Disable-some-signed-exchange-features.patch index 9cc0a016..af69dcc7 100644 --- a/build/patches/Disable-some-signed-exchange-features.patch +++ b/build/patches/Disable-some-signed-exchange-features.patch @@ -4,14 +4,22 @@ Subject: Disable some signed exchange features License: GPL-3.0-only - https://spdx.org/licenses/GPL-3.0-only.html --- - chrome/browser/chrome_content_browser_client.cc | 2 +- + chrome/browser/chrome_content_browser_client.cc | 3 ++- content/browser/web_package/signed_exchange_utils.cc | 2 +- - 2 files changed, 2 insertions(+), 2 deletions(-) + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc --- a/chrome/browser/chrome_content_browser_client.cc +++ b/chrome/browser/chrome_content_browser_client.cc -@@ -1460,7 +1460,7 @@ void ChromeContentBrowserClient::RegisterProfilePrefs( +@@ -1406,6 +1406,7 @@ ChromeContentBrowserClient::ChromeContentBrowserClient() { + extra_parts_.push_back( + std::make_unique()); + #endif ++ + #if !BUILDFLAG(IS_ANDROID) + extra_parts_.push_back( + std::make_unique()); +@@ -1460,7 +1461,7 @@ void ChromeContentBrowserClient::RegisterProfilePrefs( site_isolation::prefs::kWebTriggeredIsolatedOrigins); registry->RegisterDictionaryPref( prefs::kDevToolsBackgroundServicesExpirationDict); diff --git a/build/patches/Enable-Android-Dynamic-Performance-Framework.patch b/build/patches/Enable-Android-Dynamic-Performance-Framework.patch index e63567a7..f99e4a6f 100644 --- a/build/patches/Enable-Android-Dynamic-Performance-Framework.patch +++ b/build/patches/Enable-Android-Dynamic-Performance-Framework.patch @@ -45,7 +45,7 @@ diff --git a/chrome/version.gni b/chrome/version.gni diff --git a/components/viz/common/features.cc b/components/viz/common/features.cc --- a/components/viz/common/features.cc +++ b/components/viz/common/features.cc -@@ -241,6 +241,7 @@ BASE_FEATURE(kEnableADPFRendererMain, base::FEATURE_ENABLED_BY_DEFAULT); +@@ -231,6 +231,7 @@ BASE_FEATURE(kEnableADPFRendererMain, base::FEATURE_ENABLED_BY_DEFAULT); // If enabled, Chrome puts Renderer Main threads into a separate // ADPF(Android Dynamic Performance Framework) hint session, and does not // report any timing hints from this session. @@ -53,18 +53,18 @@ diff --git a/components/viz/common/features.cc b/components/viz/common/features. BASE_FEATURE(kEnableADPFSeparateRendererMainSession, base::FEATURE_DISABLED_BY_DEFAULT); -@@ -538,6 +539,7 @@ bool IsBrowserControlsInVizEnabled() { - +@@ -538,6 +539,7 @@ bool ShouldRemoveRedirectionBitmap() { + #if BUILDFLAG(IS_ANDROID) bool ShouldUseAdpfForSoc(std::string_view soc_allowlist, std::string_view soc) { -+ // if ((true)) return true; temporarily disabled due #2713 ++ if ((true)) return true; std::vector allowlist = base::SplitStringPiece( soc_allowlist, "|", base::TRIM_WHITESPACE, base::SPLIT_WANT_NONEMPTY); - return base::Contains(allowlist, soc); + return std::ranges::contains(allowlist, soc); diff --git a/components/viz/service/performance_hint/hint_session.cc b/components/viz/service/performance_hint/hint_session.cc --- a/components/viz/service/performance_hint/hint_session.cc +++ b/components/viz/service/performance_hint/hint_session.cc -@@ -437,16 +437,13 @@ bool IsAdpfEnabled() { +@@ -525,16 +525,13 @@ bool IsAdpfEnabled() { switches::kDisableAdpf)) { return false; } @@ -85,7 +85,7 @@ diff --git a/components/viz/service/performance_hint/hint_session.cc b/component diff --git a/third_party/blink/renderer/platform/widget/input/widget_input_handler_manager.cc b/third_party/blink/renderer/platform/widget/input/widget_input_handler_manager.cc --- a/third_party/blink/renderer/platform/widget/input/widget_input_handler_manager.cc +++ b/third_party/blink/renderer/platform/widget/input/widget_input_handler_manager.cc -@@ -221,6 +221,11 @@ class SynchronousCompositorProxyRegistry +@@ -222,6 +222,11 @@ class SynchronousCompositorProxyRegistry renderer_threads.push_back( viz::Thread{io_thread_id_, viz::Thread::Type::kIO}); } diff --git a/build/patches/Enable-HighEfficiencyMode-by-default.patch b/build/patches/Enable-HighEfficiencyMode-by-default.patch index 6d055297..5d0770d6 100644 --- a/build/patches/Enable-HighEfficiencyMode-by-default.patch +++ b/build/patches/Enable-HighEfficiencyMode-by-default.patch @@ -11,17 +11,17 @@ active by default. License: GPL-2.0-or-later - https://spdx.org/licenses/GPL-2.0-or-later.html --- components/performance_manager/features.cc | 6 ++++++ - .../performance_manager/freezing/freezing_policy.cc | 4 ++-- + .../performance_manager/freezing/freezing_policy.cc | 2 +- components/performance_manager/public/features.h | 3 +++ components/performance_manager/user_tuning/prefs.cc | 6 +++--- .../Enable-freeze-high-cpu-background-usage.inc | 8 ++++++++ - 5 files changed, 22 insertions(+), 5 deletions(-) + 5 files changed, 21 insertions(+), 4 deletions(-) create mode 100644 cromite_flags/chrome/browser/about_flags_cc/Enable-freeze-high-cpu-background-usage.inc diff --git a/components/performance_manager/features.cc b/components/performance_manager/features.cc --- a/components/performance_manager/features.cc +++ b/components/performance_manager/features.cc -@@ -180,6 +180,7 @@ BASE_FEATURE(kBFCachePerformanceManagerPolicy, +@@ -174,6 +174,7 @@ BASE_FEATURE(kPMLoadingPageVoter, base::FEATURE_DISABLED_BY_DEFAULT); BASE_FEATURE(kUrgentPageDiscarding, base::FEATURE_ENABLED_BY_DEFAULT); BASE_FEATURE(kCPUMeasurementInFreezingPolicy, base::FEATURE_ENABLED_BY_DEFAULT); @@ -29,7 +29,7 @@ diff --git a/components/performance_manager/features.cc b/components/performance BASE_FEATURE(kMemoryMeasurementInFreezingPolicy, base::FEATURE_ENABLED_BY_DEFAULT); -@@ -257,8 +258,13 @@ BASE_FEATURE_PARAM(int, +@@ -245,8 +246,13 @@ BASE_FEATURE_PARAM(int, "percent_threshold", 15); @@ -46,24 +46,19 @@ diff --git a/components/performance_manager/features.cc b/components/performance diff --git a/components/performance_manager/freezing/freezing_policy.cc b/components/performance_manager/freezing/freezing_policy.cc --- a/components/performance_manager/freezing/freezing_policy.cc +++ b/components/performance_manager/freezing/freezing_policy.cc -@@ -446,11 +446,11 @@ void FreezingPolicy::UpdateFrozenState( +@@ -444,7 +444,7 @@ void FreezingPolicy::UpdateFrozenState( if (browsing_instance_state .highest_cpu_without_battery_saver_cannot_freeze >= high_cpu_proportion && -- is_battery_saver_active_ && -+ (base::FeatureList::IsEnabled(features::kFreezingWithoutBatterySaver) || (is_battery_saver_active_ && - // Note: Feature state is checked last so that only clients that - // have a browsing instance that is CPU intensive in background - // while Battery Saver is active are enrolled in the experiment. -- base::FeatureList::IsEnabled(features::kFreezingOnBatterySaver)) { -+ base::FeatureList::IsEnabled(features::kFreezingOnBatterySaver))) ) { +- is_battery_saver_active_) { ++ (base::FeatureList::IsEnabled(features::kFreezingWithoutBatterySaver) || is_battery_saver_active_)) { eligible_for_freezing_on_battery_saver = true; } - + } diff --git a/components/performance_manager/public/features.h b/components/performance_manager/public/features.h --- a/components/performance_manager/public/features.h +++ b/components/performance_manager/public/features.h -@@ -215,6 +215,9 @@ BASE_DECLARE_FEATURE_PARAM(base::TimeDelta, +@@ -197,6 +197,9 @@ BASE_DECLARE_FEATURE_PARAM(base::TimeDelta, // enabled. BASE_DECLARE_FEATURE_PARAM(int, kInfiniteTabsFreezingOnMemoryPressurePercent); diff --git a/build/patches/Enable-extension-in-incognito.patch b/build/patches/Enable-extension-in-incognito.patch index 7ef73f72..7c78ccfe 100644 --- a/build/patches/Enable-extension-in-incognito.patch +++ b/build/patches/Enable-extension-in-incognito.patch @@ -6,8 +6,8 @@ Full activation of incognito mode in experimental extension License: GPL-3.0-only - https://spdx.org/licenses/GPL-3.0-only.html --- - .../chrome/browser/ChromeTabbedActivity.java | 37 +++++++- - .../chrome/browser/app/ChromeActivity.java | 34 +++++-- + .../chrome/browser/ChromeTabbedActivity.java | 36 +++++++- + .../chrome/browser/app/ChromeActivity.java | 34 ++++++- .../customtabs/BaseCustomTabActivity.java | 2 +- .../BaseCustomTabRootUiCoordinator.java | 4 +- .../CustomTabIntentDataProvider.java | 3 + @@ -18,30 +18,30 @@ License: GPL-3.0-only - https://spdx.org/licenses/GPL-3.0-only.html .../chrome/browser/ui/RootUiCoordinator.java | 6 +- .../developer_private_functions.cc | 3 +- .../browser/extensions/extension_tab_util.cc | 2 +- - .../tabmodel/IncognitoTabModelImpl.java | 10 ++- + .../tabmodel/IncognitoTabModelImpl.java | 10 +- .../tabmodel/IncognitoTabModelObserver.java | 2 + .../extensions/extension_actions_bridge.cc | 23 +++-- .../extensions/extension_actions_bridge.h | 4 +- .../ui/extensions/ExtensionActionsBridge.java | 26 +++++- .../android/tab_model/tab_model_jni_bridge.cc | 4 + - .../ExtensionActionListCoordinator.java | 12 ++- - .../ExtensionActionListMediator.java | 23 +++-- - .../ExtensionActionsUpdateHelper.java | 64 +++++++++++-- - .../ExtensionToolbarCoordinator.java | 13 ++- - .../ExtensionToolbarCoordinatorImpl.java | 34 +++++-- - .../extensions/ExtensionsMenuCoordinator.java | 7 +- - .../extensions/ExtensionsMenuMediator.java | 14 ++- + .../ExtensionActionListCoordinator.java | 10 +- + .../ExtensionActionListMediator.java | 16 +++- + .../ExtensionActionsUpdateHelper.java | 62 +++++++++++-- + .../ExtensionToolbarCoordinator.java | 11 ++- + .../ExtensionToolbarCoordinatorImpl.java | 37 +++++--- + .../extensions/ExtensionsMenuCoordinator.java | 6 +- + .../extensions/ExtensionsMenuMediator.java | 12 ++- .../browser_window/ChromeAndroidTaskImpl.java | 3 + - .../ChromeAndroidTaskTrackerImpl.java | 90 ++++++++++++++----- + .../ChromeAndroidTaskTrackerImpl.java | 92 ++++++++++++++----- .../ChromeAndroidTaskTracker.java | 7 +- components/tabs/impl/tab_collection.cc | 16 ++++ components/tabs/impl/tab_strip_collection.cc | 4 +- - 30 files changed, 381 insertions(+), 93 deletions(-) + 30 files changed, 367 insertions(+), 95 deletions(-) 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 +++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java -@@ -118,6 +118,7 @@ import org.chromium.chrome.browser.compositor.overlays.strip.StripLayoutHelperMa +@@ -122,6 +122,7 @@ import org.chromium.chrome.browser.compositor.overlays.strip.StripLayoutHelperMa import org.chromium.chrome.browser.compositor.overlays.strip.StripLayoutHelperManager.TabModelStartupInfo; import org.chromium.chrome.browser.cookies.CookiesFetcher; import org.chromium.chrome.browser.crypto.CipherFactory; @@ -49,7 +49,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedAct import org.chromium.chrome.browser.data_sharing.DataSharingIntentUtils; import org.chromium.chrome.browser.data_sharing.DataSharingTabGroupUtils; import org.chromium.chrome.browser.data_sharing.DataSharingTabManager; -@@ -300,11 +301,13 @@ import org.chromium.chrome.browser.tasks.tab_management.TabSwitcherPaneBase; +@@ -310,11 +311,13 @@ import org.chromium.chrome.browser.tasks.tab_management.TabSwitcherPaneBase; import org.chromium.chrome.browser.tasks.tab_management.TabUiUtils; import org.chromium.chrome.browser.tasks.tab_management.TabsSettings; import org.chromium.chrome.browser.tasks.tab_management.archived_tabs_auto_delete_promo.ArchivedTabsAutoDeletePromoManager; @@ -63,13 +63,17 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedAct import org.chromium.chrome.browser.ui.IncognitoRestoreAppLaunchDrawBlockerFactory; import org.chromium.chrome.browser.ui.RootUiCoordinator; import org.chromium.chrome.browser.ui.appmenu.AppMenuPropertiesDelegate; -@@ -822,7 +825,33 @@ public class ChromeTabbedActivity extends ChromeActivity implements PreAttachInt +@@ -855,12 +858,39 @@ public class ChromeTabbedActivity extends ChromeActivity implements PreAttachInt + mTabModelOrchestrator.onNativeLibraryReady(getTabContentManager()); + mTabModelNotificationDotManager.initWithNative(mTabModelSelector); - TabModel currentTabModel = mTabModelSelector.getCurrentModel(); - initializeChromeAndroidTask( -- BrowserWindowType.NORMAL, currentTabModel, mMultiInstanceManager); -+ BrowserWindowType.NORMAL, mTabModelSelector.getModel(false), mMultiInstanceManager); + + initializeChromeAndroidTask( + BrowserWindowType.NORMAL, + mTabModelSelector, + mSupportedProfileType, + mMultiInstanceManager); + + ProfileManager.addObserver( + new ProfileManager.Observer() { + @Override @@ -95,10 +99,11 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedAct + mTabModelSelector.getModel(true)); + } + }); - ++ // For saving non-incognito tab closures for Recent Tabs. boolean alwaysIncognito = AlwaysIncognitoLinkInterceptor.isAlwaysIncognito(); -@@ -2969,7 +2998,7 @@ public class ChromeTabbedActivity extends ChromeActivity implements PreAttachInt + PrefService prefService = UserPrefs.get(ProfileManager.getLastUsedRegularProfile()); +@@ -3070,7 +3100,7 @@ public class ChromeTabbedActivity extends ChromeActivity implements PreAttachInt mLayoutStateProviderSupplier, getBrowserControlsManager(), getWindowAndroid(), @@ -107,7 +112,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedAct getLifecycleDispatcher(), getLayoutManagerSupplier(), /* menuOrKeyboardActionController= */ this, -@@ -3885,6 +3914,10 @@ public class ChromeTabbedActivity extends ChromeActivity implements PreAttachInt +@@ -4009,6 +4039,10 @@ public class ChromeTabbedActivity extends ChromeActivity implements PreAttachInt } RecordUserAction.record("MobileMenuRecentTabs"); } else if (id == R.id.extensions_menu_id) { @@ -121,7 +126,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedAct diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java --- a/chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java -@@ -458,7 +458,7 @@ public abstract class ChromeActivity extends AsyncInitializationActivity +@@ -452,7 +452,7 @@ public abstract class ChromeActivity extends AsyncInitializationActivity private @Nullable TabStateThemeResourceProvider mThemeResourceProvider; @@ -130,8 +135,8 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActiv new OneshotSupplierImpl<>(); protected ChromeActivity() { -@@ -1123,13 +1123,29 @@ public abstract class ChromeActivity extends AsyncInitializationActivity - () -> ExtensionWindowControllerBridgeFactory.create(chromeAndroidTask)); +@@ -1130,13 +1130,29 @@ public abstract class ChromeActivity extends AsyncInitializationActivity + chromeAndroidTask, profile)); // 5. Make the ChromeAndroidTask available via OneshotSupplier. - mChromeAndroidTaskSupplier.set(chromeAndroidTask); @@ -163,7 +168,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActiv } @Override -@@ -1799,6 +1815,14 @@ public abstract class ChromeActivity extends AsyncInitializationActivity +@@ -1806,6 +1822,14 @@ public abstract class ChromeActivity extends AsyncInitializationActivity @SuppressLint("NewApi") @Override protected final void onDestroy() { @@ -178,7 +183,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActiv if (mSnackbarManager != null) { SnackbarManagerProvider.detach(mSnackbarManager); } -@@ -2055,7 +2079,7 @@ public abstract class ChromeActivity extends AsyncInitializationActivity +@@ -2062,7 +2086,7 @@ public abstract class ChromeActivity extends AsyncInitializationActivity getProfileProviderSupplier().runSyncOrOnAvailable(this::initializeManualFillingComponent); @@ -190,7 +195,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActiv diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/BaseCustomTabActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/BaseCustomTabActivity.java --- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/BaseCustomTabActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/BaseCustomTabActivity.java -@@ -392,7 +392,7 @@ public abstract class BaseCustomTabActivity extends ChromeActivity { +@@ -393,7 +393,7 @@ public abstract class BaseCustomTabActivity extends ChromeActivity { getTabModelSelectorSupplier(), getBrowserControlsManager(), getWindowAndroid(), @@ -202,7 +207,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/Base diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/BaseCustomTabRootUiCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/BaseCustomTabRootUiCoordinator.java --- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/BaseCustomTabRootUiCoordinator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/BaseCustomTabRootUiCoordinator.java -@@ -92,6 +92,7 @@ import org.chromium.chrome.browser.tab.EmptyTabObserver; +@@ -95,6 +95,7 @@ import org.chromium.chrome.browser.tab.EmptyTabObserver; import org.chromium.chrome.browser.tab.RequestDesktopUtils; import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tab_ui.TabContentManager; @@ -210,7 +215,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/Base import org.chromium.chrome.browser.tabmodel.TabCreatorManager; import org.chromium.chrome.browser.tabmodel.TabModelSelector; import org.chromium.chrome.browser.toolbar.adaptive.AdaptiveToolbarBehavior; -@@ -124,6 +125,7 @@ import org.chromium.ui.modaldialog.ModalDialogManager; +@@ -128,6 +129,7 @@ import org.chromium.ui.modaldialog.ModalDialogManager; import java.util.function.BooleanSupplier; import java.util.function.Supplier; @@ -218,14 +223,14 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/Base /** A {@link RootUiCoordinator} variant that controls UI for {@link BaseCustomTabActivity}. */ public class BaseCustomTabRootUiCoordinator extends RootUiCoordinator { -@@ -210,7 +212,7 @@ public class BaseCustomTabRootUiCoordinator extends RootUiCoordinator { - @NonNull ObservableSupplier tabModelSelectorSupplier, +@@ -214,7 +216,7 @@ public class BaseCustomTabRootUiCoordinator extends RootUiCoordinator { + @NonNull MonotonicObservableSupplier tabModelSelectorSupplier, @NonNull BrowserControlsManager browserControlsManager, @NonNull ActivityWindowAndroid windowAndroid, - @NonNull OneshotSupplier chromeAndroidTaskSupplier, + @NonNull Function chromeAndroidTaskSupplier, @NonNull ActivityLifecycleDispatcher activityLifecycleDispatcher, - @NonNull ObservableSupplier layoutManagerSupplier, + @NonNull MonotonicObservableSupplier layoutManagerSupplier, @NonNull MenuOrKeyboardActionController menuOrKeyboardActionController, diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabIntentDataProvider.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabIntentDataProvider.java --- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabIntentDataProvider.java @@ -246,7 +251,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/Cust logCustomTabFeatures(intent, colorScheme); String packageName = getClientPackageNameFromSessionOrCallingActivity(mIntent, mSession); RecordHistogram.recordBooleanHistogram( -@@ -1367,6 +1369,7 @@ public class CustomTabIntentDataProvider extends BrowserServicesIntentDataProvid +@@ -1378,6 +1380,7 @@ public class CustomTabIntentDataProvider extends BrowserServicesIntentDataProvid @Override public @CustomTabProfileType int getCustomTabMode() { @@ -257,7 +262,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/Cust diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator.java --- a/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator.java -@@ -185,6 +185,7 @@ import org.chromium.chrome.browser.toolbar.adaptive.AdaptiveToolbarBehavior; +@@ -197,6 +197,7 @@ import org.chromium.chrome.browser.toolbar.adaptive.AdaptiveToolbarBehavior; import org.chromium.chrome.browser.ui.RootUiCoordinator; import org.chromium.chrome.browser.ui.appmenu.AppMenuBlocker; import org.chromium.chrome.browser.ui.appmenu.AppMenuDelegate; @@ -265,19 +270,19 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/Tab import org.chromium.chrome.browser.ui.default_browser_promo.DefaultBrowserPromoUtils; import org.chromium.chrome.browser.ui.desktop_windowing.AppHeaderCoordinator; import org.chromium.chrome.browser.ui.desktop_windowing.AppHeaderUtils; -@@ -421,7 +422,7 @@ public class TabbedRootUiCoordinator extends RootUiCoordinator { +@@ -446,7 +447,7 @@ public class TabbedRootUiCoordinator extends RootUiCoordinator { @NonNull OneshotSupplier layoutStateProviderOneshotSupplier, @NonNull BrowserControlsManager browserControlsManager, @NonNull ActivityWindowAndroid windowAndroid, - @NonNull OneshotSupplier chromeAndroidTaskSupplier, + @NonNull Function chromeAndroidTaskSupplier, @NonNull ActivityLifecycleDispatcher activityLifecycleDispatcher, - @NonNull ObservableSupplier layoutManagerSupplier, + @NonNull MonotonicObservableSupplier layoutManagerSupplier, @NonNull MenuOrKeyboardActionController menuOrKeyboardActionController, diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelJniBridge.java b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelJniBridge.java --- a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelJniBridge.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelJniBridge.java -@@ -133,10 +133,10 @@ public abstract class TabModelJniBridge implements TabModelInternal { +@@ -132,10 +132,10 @@ public abstract class TabModelJniBridge implements TabModelInternal { @Override public void associateWithBrowserWindow(long nativeAndroidBrowserWindow) { // Ensure this isn't set multiple times. @@ -310,7 +315,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabMod diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java --- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java -@@ -141,6 +141,7 @@ import org.chromium.chrome.browser.tab.TabObscuringHandler; +@@ -139,6 +139,7 @@ import org.chromium.chrome.browser.tab.TabObscuringHandler; import org.chromium.chrome.browser.tab.TabSelectionType; import org.chromium.chrome.browser.tab_ui.TabContentManager; import org.chromium.chrome.browser.tab_ui.TabModelDotInfo; @@ -326,8 +331,8 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/Toolbar import org.chromium.chrome.browser.flags.ChromeFeatureList; import android.view.Gravity; -@@ -366,7 +368,7 @@ public class ToolbarManager - private TopInsetCoordinator.@Nullable Observer mTopInsetCoordinatorObserver; +@@ -365,7 +367,7 @@ public class ToolbarManager + private final TopInsetProvider mTopInsetProvider; private final SettableNonNullObservableSupplier<@ControlsPosition Integer> mToolbarPositionSupplier = ObservableSuppliers.createNonNull(ControlsPosition.NONE); - private final OneshotSupplier mChromeAndroidTaskSupplier; @@ -335,16 +340,16 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/Toolbar private @MonotonicNonNull HomeButtonCoordinator mHomeButtonCoordinator; private @MonotonicNonNull HomePageButtonsCoordinator mHomePageButtonsCoordinator; -@@ -802,7 +804,7 @@ public class ToolbarManager - ObservableSupplier omniboxFocusStateSupplier, +@@ -804,7 +806,7 @@ public class ToolbarManager + NonNullObservableSupplier omniboxFocusStateSupplier, OneshotSupplier promoShownOneshotSupplier, WindowAndroid windowAndroid, - OneshotSupplier chromeAndroidTaskSupplier, + Function chromeAndroidTaskSupplier, Supplier isInOverviewModeSupplier, - Supplier modalDialogManagerSupplier, + Supplier<@Nullable ModalDialogManager> modalDialogManagerSupplier, StatusBarColorController statusBarColorController, -@@ -2424,22 +2426,19 @@ public class ToolbarManager +@@ -2403,15 +2405,13 @@ public class ToolbarManager ViewStub extensionToolbarStub = mControlContainer.findViewById(R.id.extension_toolbar_container_stub); if (extensionToolbarStub != null) { @@ -359,9 +364,10 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/Toolbar - task, + mChromeAndroidTaskSupplier, + mProfileSupplier, + assertNonNull(mTabModelSelector.getCurrentModel().getProfile()), mActivityTabProvider.asObservable(), mTabCreatorManager.getTabCreator(false), - getBrowsingModeThemeColorProvider()); +@@ -2419,7 +2419,6 @@ public class ToolbarManager if (mExtensionToolbarCoordinator != null) { mToolbar.setExtensionToolbarCoordinator(mExtensionToolbarCoordinator); } @@ -372,7 +378,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/Toolbar diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ui/RootUiCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/ui/RootUiCoordinator.java --- a/chrome/android/java/src/org/chromium/chrome/browser/ui/RootUiCoordinator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ui/RootUiCoordinator.java -@@ -149,6 +149,7 @@ import org.chromium.chrome.browser.tab.TabSelectionType; +@@ -155,6 +155,7 @@ import org.chromium.chrome.browser.tab.TabSelectionType; import org.chromium.chrome.browser.tab_ui.RecyclerViewPosition; import org.chromium.chrome.browser.tab_ui.TabContentManager; import org.chromium.chrome.browser.tab_ui.TabSwitcher; @@ -380,7 +386,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ui/RootUiCoordi import org.chromium.chrome.browser.tabmodel.TabCreator; import org.chromium.chrome.browser.tabmodel.TabCreatorManager; import org.chromium.chrome.browser.tabmodel.TabModel; -@@ -243,6 +244,7 @@ import org.chromium.url.GURL; +@@ -253,6 +254,7 @@ import org.chromium.url.GURL; import java.lang.ref.WeakReference; import java.util.function.BooleanSupplier; import java.util.function.Supplier; @@ -388,7 +394,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ui/RootUiCoordi /** * The root UI coordinator. This class will eventually be responsible for inflating and managing -@@ -276,7 +278,7 @@ public class RootUiCoordinator +@@ -287,7 +289,7 @@ public class RootUiCoordinator protected @Nullable AppMenuCoordinator mAppMenuCoordinator; private final MenuOrKeyboardActionController mMenuOrKeyboardActionController; protected final ActivityWindowAndroid mWindowAndroid; @@ -396,20 +402,20 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ui/RootUiCoordi + private final Function mChromeAndroidTaskSupplier; protected final ActivityTabProvider mActivityTabProvider; - protected ObservableSupplier mShareDelegateSupplier; -@@ -468,7 +470,7 @@ public class RootUiCoordinator + protected MonotonicObservableSupplier mShareDelegateSupplier; +@@ -483,7 +485,7 @@ public class RootUiCoordinator @NonNull OneshotSupplier layoutStateProviderOneshotSupplier, @NonNull BrowserControlsManager browserControlsManager, @NonNull ActivityWindowAndroid windowAndroid, - @NonNull OneshotSupplier chromeAndroidTaskSupplier, + @NonNull Function chromeAndroidTaskSupplier, @NonNull ActivityLifecycleDispatcher activityLifecycleDispatcher, - @NonNull ObservableSupplier layoutManagerSupplier, + @NonNull MonotonicObservableSupplier layoutManagerSupplier, @NonNull MenuOrKeyboardActionController menuOrKeyboardActionController, diff --git a/chrome/browser/extensions/api/developer_private/developer_private_functions.cc b/chrome/browser/extensions/api/developer_private/developer_private_functions.cc --- a/chrome/browser/extensions/api/developer_private/developer_private_functions.cc +++ b/chrome/browser/extensions/api/developer_private/developer_private_functions.cc -@@ -1746,7 +1746,8 @@ DeveloperPrivateDismissSafetyHubExtensionsMenuNotificationFunction::Run() { +@@ -1745,7 +1745,8 @@ DeveloperPrivateDismissSafetyHubExtensionsMenuNotificationFunction::Run() { } Profile* profile = Profile::FromBrowserContext(browser_context()); @@ -422,7 +428,7 @@ diff --git a/chrome/browser/extensions/api/developer_private/developer_private_f diff --git a/chrome/browser/extensions/extension_tab_util.cc b/chrome/browser/extensions/extension_tab_util.cc --- a/chrome/browser/extensions/extension_tab_util.cc +++ b/chrome/browser/extensions/extension_tab_util.cc -@@ -1256,7 +1256,7 @@ bool ExtensionTabUtil::OpenOptionsPageFromWebContents( +@@ -1257,7 +1257,7 @@ bool ExtensionTabUtil::OpenOptionsPageFromWebContents( if (!url) { return false; } @@ -434,7 +440,7 @@ diff --git a/chrome/browser/extensions/extension_tab_util.cc b/chrome/browser/ex diff --git a/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/IncognitoTabModelImpl.java b/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/IncognitoTabModelImpl.java --- a/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/IncognitoTabModelImpl.java +++ b/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/IncognitoTabModelImpl.java -@@ -145,8 +145,12 @@ class IncognitoTabModelImpl implements IncognitoTabModelInternal { +@@ -147,8 +147,12 @@ class IncognitoTabModelImpl implements IncognitoTabModelInternal { return; } @@ -448,7 +454,7 @@ diff --git a/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browse } mDelegateModel -@@ -157,6 +161,10 @@ class IncognitoTabModelImpl implements IncognitoTabModelInternal { +@@ -159,6 +163,10 @@ class IncognitoTabModelImpl implements IncognitoTabModelInternal { mCurrentTabSupplier.set(null); mTabCountSupplier.set(0); @@ -512,14 +518,14 @@ diff --git a/chrome/browser/ui/android/extensions/extension_actions_bridge.cc b/ ExtensionActionsBridge::HandleKeyDownEvent( JNIEnv* env, @@ -309,11 +320,9 @@ void ExtensionActionsBridge::OnToolbarIconUpdated( - static jlong JNI_ExtensionActionsBridge_Init( + static int64_t JNI_ExtensionActionsBridge_Init( JNIEnv* env, const base::android::JavaRef& java_object, -- jlong j_browser_window_interface) { +- int64_t j_browser_window_interface) { - BrowserWindowInterface* browser = - reinterpret_cast(j_browser_window_interface); + Profile* profile) { - return reinterpret_cast( + return reinterpret_cast( - new ExtensionActionsBridge(browser, java_object)); + new ExtensionActionsBridge(profile, java_object)); } @@ -586,7 +592,7 @@ diff --git a/chrome/browser/ui/android/extensions/java/src/org/chromium/chrome/b private long mNativeExtensionActionsBridge; private final ObserverList mObservers = new ObserverList<>(); -- public ExtensionActionsBridge(ChromeAndroidTask task) { +- public ExtensionActionsBridge(ChromeAndroidTask task, Profile profile) { + private static final ProfileKeyedMap mExtensionActionsBridges = + new ProfileKeyedMap<>((e) -> e.destroy()); + @@ -596,10 +602,10 @@ diff --git a/chrome/browser/ui/android/extensions/java/src/org/chromium/chrome/b + ExtensionActionsBridge::new); + } + -+ private ExtensionActionsBridge(Profile profile) { ++ private ExtensionActionsBridge(Profile profile, Profile profile) { mNativeExtensionActionsBridge = ExtensionActionsBridgeJni.get() -- .init(this, task.getOrCreateNativeBrowserWindowPtr()); +- .init(this, task.getOrCreateNativeBrowserWindowPtr(profile)); + .init(this, profile); } @@ -641,7 +647,7 @@ diff --git a/chrome/browser/ui/android/extensions/java/src/org/chromium/chrome/b diff --git a/chrome/browser/ui/android/tab_model/tab_model_jni_bridge.cc b/chrome/browser/ui/android/tab_model/tab_model_jni_bridge.cc --- a/chrome/browser/ui/android/tab_model/tab_model_jni_bridge.cc +++ b/chrome/browser/ui/android/tab_model/tab_model_jni_bridge.cc -@@ -126,6 +126,10 @@ void TabModelJniBridge::AssociateWithBrowserWindow( +@@ -130,6 +130,10 @@ void TabModelJniBridge::AssociateWithBrowserWindow( // BrowserWindowInterface is available on desktop Android, but not other Android // builds. For non-desktop Android, this function should be a no-op. #if BUILDFLAG(IS_DESKTOP_ANDROID_CROMITE) @@ -655,126 +661,107 @@ diff --git a/chrome/browser/ui/android/tab_model/tab_model_jni_bridge.cc b/chrom diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/extensions/ExtensionActionListCoordinator.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/extensions/ExtensionActionListCoordinator.java --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/extensions/ExtensionActionListCoordinator.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/extensions/ExtensionActionListCoordinator.java -@@ -12,6 +12,7 @@ import org.chromium.base.lifetime.LifetimeAssert; - import org.chromium.base.supplier.NullableObservableSupplier; - import org.chromium.build.annotations.NullMarked; - import org.chromium.build.annotations.Nullable; -+import org.chromium.chrome.browser.profiles.Profile; - import org.chromium.chrome.browser.tab.Tab; - import org.chromium.chrome.browser.toolbar.extensions.ExtensionActionButtonProperties.ListItemType; - import org.chromium.chrome.browser.ui.browser_window.ChromeAndroidTask; -@@ -21,6 +22,8 @@ import org.chromium.ui.listmenu.ListMenuButton; +@@ -30,6 +30,8 @@ import org.chromium.ui.listmenu.ListMenuButton; import org.chromium.ui.modelutil.MVCListAdapter.ModelList; - import org.chromium.ui.modelutil.ViewGroupAdapter; + import org.chromium.ui.modelutil.PropertyModel; +import java.util.function.Function; + /** * Root component for the extension action buttons. Exposes public API for external consumers to * interact with the buttons and affect their states. -@@ -28,6 +31,7 @@ import org.chromium.ui.modelutil.ViewGroupAdapter; - @NullMarked +@@ -38,6 +40,7 @@ import org.chromium.ui.modelutil.PropertyModel; public class ExtensionActionListCoordinator implements Destroyable { - private final ExtensionActionListContainer mContainer; + private final Context mContext; + private final ExtensionActionListRecyclerView mContainer; + private final ListMenuButton mExtensionsMenuButton; private final ModelList mModels; private final ExtensionActionListMediator mMediator; - private final ViewGroupAdapter mAdapter; -@@ -36,15 +40,18 @@ public class ExtensionActionListCoordinator implements Destroyable { + private final DragReorderableRecyclerViewAdapter mAdapter; +@@ -46,13 +49,15 @@ public class ExtensionActionListCoordinator implements Destroyable { public ExtensionActionListCoordinator( Context context, - ExtensionActionListContainer container, + ExtensionActionListRecyclerView container, + ListMenuButton extensionsMenuButton, WindowAndroid windowAndroid, - ChromeAndroidTask task, + Function task, -+ NullableObservableSupplier profileSupplier, - NullableObservableSupplier currentTabSupplier) { + Profile profile, + NullableObservableSupplier currentTabSupplier, + ExtensionsToolbarBridge extensionsToolbarBridge) { + mContext = context; mContainer = container; + mExtensionsMenuButton = extensionsMenuButton; mModels = new ModelList(); mMediator = - new ExtensionActionListMediator( -- context, windowAndroid, mModels, task, currentTabSupplier); -+ context, windowAndroid, mModels, task, profileSupplier, currentTabSupplier); - mAdapter = - new ViewGroupAdapter.Builder(mContainer, mModels) - .registerType( -@@ -69,6 +76,7 @@ public class ExtensionActionListCoordinator implements Destroyable { +@@ -60,7 +65,7 @@ public class ExtensionActionListCoordinator implements Destroyable { + context, + windowAndroid, + mModels, +- task, ++ task, profileSupplier, + profile, + currentTabSupplier, + container, +@@ -124,6 +129,7 @@ public class ExtensionActionListCoordinator implements Destroyable { /** Performs a click on the button for the given action. */ public void click(String actionId) { + mExtensionsMenuButton.dismiss(); for (int i = 0; i < mModels.size(); i++) { if (mModels.get(i).model.get(ExtensionActionButtonProperties.ID).equals(actionId)) { - mContainer.getChildAt(i).performClick(); + RecyclerView.ViewHolder holder = mContainer.findViewHolderForAdapterPosition(i); diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/extensions/ExtensionActionListMediator.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/extensions/ExtensionActionListMediator.java --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/extensions/ExtensionActionListMediator.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/extensions/ExtensionActionListMediator.java -@@ -15,6 +15,7 @@ import org.chromium.base.supplier.NullableObservableSupplier; - import org.chromium.build.annotations.NullMarked; - import org.chromium.build.annotations.Nullable; - import org.chromium.chrome.browser.extensions.ContextMenuSource; -+import org.chromium.chrome.browser.profiles.Profile; - import org.chromium.chrome.browser.tab.Tab; - import org.chromium.chrome.browser.toolbar.MenuBuilderHelper; - import org.chromium.chrome.browser.toolbar.extensions.ExtensionActionButtonProperties.ListItemType; -@@ -31,6 +32,8 @@ import org.chromium.ui.modelutil.MVCListAdapter.ListItem; - import org.chromium.ui.modelutil.MVCListAdapter.ModelList; - import org.chromium.ui.modelutil.PropertyModel; - +@@ -37,13 +37,14 @@ import org.chromium.ui.modelutil.PropertyModel; + import java.util.Arrays; + import java.util.HashSet; + import java.util.Set; +import java.util.function.Function; -+ + @NullMarked class ExtensionActionListMediator implements Destroyable { - private static final String TAG = "EALMediator"; -@@ -38,7 +41,7 @@ class ExtensionActionListMediator implements Destroyable { private final Context mContext; private final WindowAndroid mWindowAndroid; private final ModelList mModels; - private final ChromeAndroidTask mTask; -+ private final Function mTaskSupplier; - private final ExtensionActionsUpdateHelper mExtensionActionsUpdateHelper; - - private final ActionsUpdateDelegate mActionsUpdateDelegate = new ActionsUpdateDelegate(); -@@ -51,16 +54,17 @@ class ExtensionActionListMediator implements Destroyable { ++ private final FunctionmTaskmTaskSupplier + private final Profile mProfile; + private final NullableObservableSupplier mCurrentTabSupplier; + private final ExtensionActionListRecyclerView mContainer; +@@ -61,7 +62,7 @@ class ExtensionActionListMediator implements Destroyable { Context context, WindowAndroid windowAndroid, ModelList models, - ChromeAndroidTask task, + Function task, -+ NullableObservableSupplier profileSupplier, - NullableObservableSupplier currentTabSupplier) { + Profile profile, + NullableObservableSupplier currentTabSupplier, + ExtensionActionListRecyclerView container, +@@ -69,7 +70,7 @@ class ExtensionActionListMediator implements Destroyable { mContext = context; mWindowAndroid = windowAndroid; mModels = models; - mTask = task; + mTaskSupplier = task; + mProfile = profile; + mCurrentTabSupplier = currentTabSupplier; + mContainer = container; +@@ -245,6 +246,11 @@ class ExtensionActionListMediator implements Destroyable { - mExtensionActionsUpdateHelper = - new ExtensionActionsUpdateHelper( -- mModels, task, currentTabSupplier, mActionsUpdateDelegate); -+ mModels, profileSupplier, currentTabSupplier, mActionsUpdateDelegate); - } - - @Override -@@ -111,8 +115,13 @@ class ExtensionActionListMediator implements Destroyable { - } - int tabId = currentTab.getId(); + ExtensionActionPopupContents contents = ExtensionActionPopupContents.create(nativeHostPtr); + ChromeAndroidTask task = mTaskSupplier.apply(currentTab); + if (task == null) { + return; + } + - ExtensionActionPopupContents contents = -- ExtensionActionPopupContents.create(mTask, actionId, tabId); -+ ExtensionActionPopupContents.create(task, actionId, tabId); - assert mCurrentPopup == null; - mCurrentPopup = - new ExtensionActionPopup(mContext, mWindowAndroid, buttonView, actionId, contents); -@@ -131,9 +140,11 @@ class ExtensionActionListMediator implements Destroyable { + View buttonView = getButtonViewForId(actionId); + if (buttonView == null) { + contents.destroy(); +@@ -289,9 +295,11 @@ class ExtensionActionListMediator implements Destroyable { return; } @@ -782,23 +769,15 @@ diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/brow + ExtensionActionContextMenuBridge bridge = new ExtensionActionContextMenuBridge( -- mTask, actionId, webContents, ContextMenuSource.TOOLBAR_ACTION); -+ task, actionId, webContents, ContextMenuSource.TOOLBAR_ACTION); +- mTask, mProfile, actionId, webContents, ContextMenuSource.TOOLBAR_ACTION); ++ task, mProfile, actionId, webContents, ContextMenuSource.TOOLBAR_ACTION); - ExtensionActionContextMenuUtils.showContextMenu( - mContext, buttonView, bridge, MenuBuilderHelper.getRectProvider(buttonView), null); + ListMenuButton buttonView = (ListMenuButton) getButtonViewForId(actionId); + if (buttonView == null) { diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/extensions/ExtensionActionsUpdateHelper.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/extensions/ExtensionActionsUpdateHelper.java --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/extensions/ExtensionActionsUpdateHelper.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/extensions/ExtensionActionsUpdateHelper.java -@@ -9,6 +9,7 @@ import org.chromium.base.lifetime.Destroyable; - import org.chromium.base.supplier.NullableObservableSupplier; - import org.chromium.build.annotations.NullMarked; - import org.chromium.build.annotations.Nullable; -+import org.chromium.chrome.browser.profiles.Profile; - import org.chromium.chrome.browser.tab.Tab; - import org.chromium.chrome.browser.ui.browser_window.ChromeAndroidTask; - import org.chromium.chrome.browser.ui.extensions.ExtensionActionsBridge; -@@ -46,32 +47,35 @@ public class ExtensionActionsUpdateHelper implements Destroyable { +@@ -47,19 +47,22 @@ public class ExtensionActionsUpdateHelper implements Destroyable { void onUpdateFinished(); } @@ -820,14 +799,14 @@ diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/brow ModelList models, - ChromeAndroidTask task, + NullableObservableSupplier profileSupplier, + Profile profile, NullableObservableSupplier currentTabSupplier, ActionsUpdateDelegate delegate) { - mModels = models; -+ mProfileSupplier = profileSupplier; - mCurrentTabSupplier = currentTabSupplier; +@@ -68,12 +71,13 @@ public class ExtensionActionsUpdateHelper implements Destroyable { mActionsUpdateDelegate = delegate; -- mExtensionActionsBridge = new ExtensionActionsBridge(task); + mExtensionActionsBridge = new ExtensionActionsBridge(task, profile); ++ mProfileSupplier = profileSupplier; + mProfileSupplier.addObserver(mProfileUpdatedCallback); mCurrentTabSupplier.addObserver(mTabChangedCallback); - mExtensionActionsBridge.addObserver(mActionsObserver); @@ -839,7 +818,7 @@ diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/brow mModels.clear(); return; } -@@ -98,6 +102,35 @@ public class ExtensionActionsUpdateHelper implements Destroyable { +@@ -100,6 +104,35 @@ public class ExtensionActionsUpdateHelper implements Destroyable { mActionsUpdateDelegate.onUpdateFinished(); } @@ -875,7 +854,7 @@ diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/brow private void onTabChanged(@Nullable Tab tab) { if (tab == mCurrentTab) { return; -@@ -116,9 +149,21 @@ public class ExtensionActionsUpdateHelper implements Destroyable { +@@ -118,9 +151,21 @@ public class ExtensionActionsUpdateHelper implements Destroyable { } mCurrentTab = tab; @@ -897,7 +876,7 @@ diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/brow /** Returns the current tab. */ public @Nullable Tab getCurrentTab() { return mCurrentTab; -@@ -131,11 +176,16 @@ public class ExtensionActionsUpdateHelper implements Destroyable { +@@ -133,11 +178,16 @@ public class ExtensionActionsUpdateHelper implements Destroyable { @Override public void destroy() { @@ -919,11 +898,9 @@ diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/brow diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/extensions/ExtensionToolbarCoordinator.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/extensions/ExtensionToolbarCoordinator.java --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/extensions/ExtensionToolbarCoordinator.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/extensions/ExtensionToolbarCoordinator.java -@@ -14,13 +14,17 @@ import org.chromium.base.supplier.NullableObservableSupplier; - import org.chromium.build.annotations.Initializer; - import org.chromium.build.annotations.NullMarked; +@@ -16,12 +16,15 @@ import org.chromium.build.annotations.NullMarked; import org.chromium.build.annotations.Nullable; -+import org.chromium.chrome.browser.profiles.Profile; + import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.tab.Tab; +import org.chromium.chrome.browser.tabmodel.TabModel; import org.chromium.chrome.browser.tabmodel.TabCreator; @@ -937,36 +914,32 @@ diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/brow /** * The coordinator of the extension-related toolbar UI. * -@@ -41,12 +45,13 @@ public interface ExtensionToolbarCoordinator extends Destroyable { +@@ -42,8 +45,8 @@ public interface ExtensionToolbarCoordinator extends Destroyable { Context context, ViewStub extensionToolbarStub, WindowAndroid windowAndroid, - ChromeAndroidTask task, +- Profile profile, + Function task, + NullableObservableSupplier profileSupplier, NullableObservableSupplier currentTabSupplier, TabCreator tabCreator, ThemeColorProvider themeColorProvider) { - // Check if the extension UI is enabled first. -- if (!ExtensionUi.isEnabled(task.getProfile())) { -+ if (!ExtensionUi.isEnabled(profileSupplier.get())) { - return null; - } - -@@ -60,6 +65,7 @@ public interface ExtensionToolbarCoordinator extends Destroyable { - extensionToolbarStub, +@@ -63,6 +66,7 @@ public interface ExtensionToolbarCoordinator extends Destroyable { windowAndroid, task, + profile, + profileSupplier, currentTabSupplier, tabCreator, themeColorProvider); -@@ -77,7 +83,8 @@ public interface ExtensionToolbarCoordinator extends Destroyable { +@@ -80,8 +84,9 @@ public interface ExtensionToolbarCoordinator extends Destroyable { Context context, ViewStub extensionToolbarStub, WindowAndroid windowAndroid, - ChromeAndroidTask task, + Function task, + Profile profile, + NullableObservableSupplier profileSupplier, NullableObservableSupplier currentTabSupplier, TabCreator tabCreator, @@ -974,17 +947,15 @@ diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/brow diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/extensions/ExtensionToolbarCoordinatorImpl.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/extensions/ExtensionToolbarCoordinatorImpl.java --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/extensions/ExtensionToolbarCoordinatorImpl.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/extensions/ExtensionToolbarCoordinatorImpl.java -@@ -15,7 +15,9 @@ import org.chromium.base.supplier.NullableObservableSupplier; - import org.chromium.build.annotations.NullMarked; - import org.chromium.build.annotations.Nullable; +@@ -17,6 +17,7 @@ import org.chromium.build.annotations.Nullable; import org.chromium.build.annotations.ServiceImpl; -+import org.chromium.chrome.browser.profiles.Profile; + import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.tab.Tab; +import org.chromium.chrome.browser.tabmodel.TabModel; import org.chromium.chrome.browser.tabmodel.TabCreator; import org.chromium.chrome.browser.theme.ThemeColorProvider; import org.chromium.chrome.browser.ui.browser_window.ChromeAndroidTask; -@@ -24,40 +26,42 @@ import org.chromium.chrome.browser.ui.extensions.ExtensionUi; +@@ -26,6 +27,8 @@ import org.chromium.chrome.browser.ui.extensions.ExtensionUi; import org.chromium.chrome.browser.ui.extensions.R; import org.chromium.ui.base.WindowAndroid; @@ -993,12 +964,16 @@ diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/brow /** The implementation of {@link ExtensionToolbarCoordinator}. */ @NullMarked @ServiceImpl(ExtensionToolbarCoordinator.class) - public class ExtensionToolbarCoordinatorImpl implements ExtensionToolbarCoordinator { +@@ -33,43 +36,39 @@ public class ExtensionToolbarCoordinatorImpl implements ExtensionToolbarCoordina private final @Nullable LifetimeAssert mLifetimeAssert = LifetimeAssert.create(this); + // TODO(crbug.com/473396591): Remove once {link ExtensionActionsBridge} is deprecated. - private ExtensionActionsBridge mBridge; + + private ExtensionsToolbarBridge mExtensionsToolbarBridge; private ExtensionActionListCoordinator mExtensionActionListCoordinator; - private ExtensionsMenuCoordinator mExtensionsMenuCoordinator; + private ExtensionsMenuAndAccessControlButtonCoordinator + mExtensionsMenuAndAccessControlButtonCoordinator; + private NullableObservableSupplier mCurrentTabSupplier; + Function mTaskSupplier; @@ -1009,21 +984,26 @@ diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/brow WindowAndroid windowAndroid, - ChromeAndroidTask task, + Function task, + Profile profile, + NullableObservableSupplier profileSupplier, NullableObservableSupplier currentTabSupplier, TabCreator tabCreator, ThemeColorProvider themeColorProvider) { -- mBridge = new ExtensionActionsBridge(task); +- mBridge = new ExtensionActionsBridge(task, profile); + mCurrentTabSupplier = currentTabSupplier; + mTaskSupplier = task; extensionToolbarStub.setLayoutResource(R.layout.extension_toolbar_container); LinearLayout container = (LinearLayout) extensionToolbarStub.inflate(); + +- mExtensionsToolbarBridge = new ExtensionsToolbarBridge(task, profile); +- - mProfileSupplier.addObserver((profile) -> { - if (!ExtensionUi.isEnabled(profileSupplier.get())) { - container.setVisibility(View.GONE); - } - }); +- mExtensionActionListCoordinator = new ExtensionActionListCoordinator( context, @@ -1031,27 +1011,28 @@ diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/brow + container.findViewById(R.id.extensions_menu_button), windowAndroid, task, +- profile, + profileSupplier, - currentTabSupplier); - mExtensionsMenuCoordinator = - new ExtensionsMenuCoordinator( -@@ -65,6 +69,7 @@ public class ExtensionToolbarCoordinatorImpl implements ExtensionToolbarCoordina - container.findViewById(R.id.extensions_menu_button), + currentTabSupplier, + mExtensionsToolbarBridge); + mExtensionsMenuAndAccessControlButtonCoordinator = +@@ -79,6 +78,7 @@ public class ExtensionToolbarCoordinatorImpl implements ExtensionToolbarCoordina themeColorProvider, task, + profile, + profileSupplier, currentTabSupplier, tabCreator, - mExtensionActionListCoordinator); -@@ -74,7 +79,6 @@ public class ExtensionToolbarCoordinatorImpl implements ExtensionToolbarCoordina - public void destroy() { - mExtensionsMenuCoordinator.destroy(); + mExtensionsToolbarBridge, +@@ -91,7 +91,6 @@ public class ExtensionToolbarCoordinatorImpl implements ExtensionToolbarCoordina + mExtensionsMenuAndAccessControlButtonCoordinator.destroy(); mExtensionActionListCoordinator.destroy(); + mExtensionsToolbarBridge.destroy(); - mBridge.destroy(); LifetimeAssert.setSafeToGc(mLifetimeAssert, true); } -@@ -85,6 +89,18 @@ public class ExtensionToolbarCoordinatorImpl implements ExtensionToolbarCoordina +@@ -102,6 +101,18 @@ public class ExtensionToolbarCoordinatorImpl implements ExtensionToolbarCoordina return false; } @@ -1073,15 +1054,7 @@ diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/brow diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/extensions/ExtensionsMenuCoordinator.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/extensions/ExtensionsMenuCoordinator.java --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/extensions/ExtensionsMenuCoordinator.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/extensions/ExtensionsMenuCoordinator.java -@@ -18,6 +18,7 @@ import org.chromium.base.lifetime.Destroyable; - import org.chromium.base.supplier.NullableObservableSupplier; - import org.chromium.build.annotations.NullMarked; - import org.chromium.build.annotations.Nullable; -+import org.chromium.chrome.browser.profiles.Profile; - import org.chromium.chrome.browser.tab.Tab; - import org.chromium.chrome.browser.tab.TabLaunchType; - import org.chromium.chrome.browser.tabmodel.TabCreator; -@@ -40,6 +41,8 @@ import org.chromium.ui.modelutil.PropertyModelChangeProcessor; +@@ -42,6 +42,8 @@ import org.chromium.ui.modelutil.PropertyModelChangeProcessor; import org.chromium.ui.modelutil.SimpleRecyclerViewAdapter; import org.chromium.ui.widget.RectProvider; @@ -1090,36 +1063,37 @@ diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/brow /** * Coordinator for the extensions menu, accessed from the puzzle icon in the toolbar. This class is * responsible for the button and the menu. -@@ -75,7 +78,8 @@ public class ExtensionsMenuCoordinator implements Destroyable { +@@ -80,8 +82,9 @@ public class ExtensionsMenuCoordinator implements Destroyable { Context context, ListMenuButton extensionsMenuButton, ThemeColorProvider themeColorProvider, - ChromeAndroidTask task, + Function task, + Profile profile, + NullableObservableSupplier profileSupplier, NullableObservableSupplier currentTabSupplier, TabCreator tabCreator, ExtensionActionListCoordinator extensionActionListCoordinator) { -@@ -138,6 +142,7 @@ public class ExtensionsMenuCoordinator implements Destroyable { - new ExtensionsMenuMediator( +@@ -177,6 +180,7 @@ public class ExtensionsMenuCoordinator implements Destroyable { mContext, - task, + mTask, + mProfile, + profileSupplier, mCurrentTabSupplier, mExtensionModels, - () -> { + mPropertyModel, diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/extensions/ExtensionsMenuMediator.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/extensions/ExtensionsMenuMediator.java --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/extensions/ExtensionsMenuMediator.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/extensions/ExtensionsMenuMediator.java -@@ -13,6 +13,7 @@ import org.chromium.base.lifetime.Destroyable; - import org.chromium.base.supplier.NullableObservableSupplier; +@@ -13,6 +13,7 @@ import org.chromium.base.supplier.NullableObservableSupplier; import org.chromium.build.annotations.NullMarked; import org.chromium.chrome.browser.extensions.ContextMenuSource; + import org.chromium.chrome.browser.profiles.Profile; +import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.tab.Tab; - import org.chromium.chrome.browser.ui.browser_window.ChromeAndroidTask; import org.chromium.chrome.browser.toolbar.extensions.ExtensionActionListCoordinator; -@@ -26,6 +27,8 @@ import org.chromium.ui.modelutil.MVCListAdapter.ModelList; + import org.chromium.chrome.browser.ui.browser_window.ChromeAndroidTask; +@@ -25,6 +26,8 @@ import org.chromium.ui.modelutil.MVCListAdapter.ModelList; import org.chromium.ui.modelutil.PropertyModel; import org.chromium.ui.widget.RectProvider; @@ -1128,51 +1102,43 @@ diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/brow /** * Mediator for the extensions menu. This class is responsible for listening to changes in the * extensions and updating the model accordingly. -@@ -34,7 +37,7 @@ import org.chromium.ui.widget.RectProvider; - class ExtensionsMenuMediator implements Destroyable { - private final ActionsUpdateDelegate mActionsUpdateDelegate = new ActionsUpdateDelegate(); +@@ -33,7 +36,7 @@ import org.chromium.ui.widget.RectProvider; + class ExtensionsMenuMediator implements Destroyable, ExtensionsMenuBridge.Observer { + private final ModelList mActionModels; private final Context mContext; -- private final ChromeAndroidTask mTask; -+ private final Function mTask; - private final Runnable mOnUpdateFinishedRunnable; - private final ExtensionActionsUpdateHelper mExtensionActionsUpdateHelper; - private final View mRootView; -@@ -42,7 +45,8 @@ class ExtensionsMenuMediator implements Destroyable { - +- private final NullableObservableSupplier mCurrentTabSupplier; ++ private final Function> mCurrentTabSupplier; + private final ExtensionsMenuBridge mMenuBridge; + private final PropertyModel mMenuPropertyModel; + private final Runnable mOnReady; +@@ -52,8 +55,9 @@ class ExtensionsMenuMediator implements Destroyable, ExtensionsMenuBridge.Observ + */ public ExtensionsMenuMediator( Context context, - ChromeAndroidTask task, + Function task, + Profile profile, + NullableObservableSupplier profileSupplier, NullableObservableSupplier currentTabSupplier, - ModelList extensionModels, - Runnable onUpdateFinishedRunnable, -@@ -56,7 +60,7 @@ class ExtensionsMenuMediator implements Destroyable { - - mExtensionActionsUpdateHelper = - new ExtensionActionsUpdateHelper( -- extensionModels, task, currentTabSupplier, mActionsUpdateDelegate); -+ extensionModels, profileSupplier, currentTabSupplier, mActionsUpdateDelegate); - } - - private static class RelativeViewRectProvider extends RectProvider { -@@ -99,9 +103,11 @@ class ExtensionsMenuMediator implements Destroyable { + ModelList actionModels, + PropertyModel propertyModel, +@@ -126,9 +130,11 @@ class ExtensionsMenuMediator implements Destroyable, ExtensionsMenuBridge.Observ return; } + ChromeAndroidTask task = mTask.apply(currentTab); + - ExtensionActionContextMenuBridge bridge = + ExtensionActionContextMenuBridge contextMenuBridge = new ExtensionActionContextMenuBridge( -- mTask, actionId, webContents, ContextMenuSource.MENU_ITEM); -+ task, actionId, webContents, ContextMenuSource.MENU_ITEM); +- mTask, mProfile, actionId, webContents, ContextMenuSource.MENU_ITEM); ++ task, mProfile, actionId, webContents, ContextMenuSource.MENU_ITEM); ExtensionActionContextMenuUtils.showContextMenu( mContext, diff --git a/chrome/browser/ui/browser_window/internal/android/java/src/org/chromium/chrome/browser/ui/browser_window/ChromeAndroidTaskImpl.java b/chrome/browser/ui/browser_window/internal/android/java/src/org/chromium/chrome/browser/ui/browser_window/ChromeAndroidTaskImpl.java --- a/chrome/browser/ui/browser_window/internal/android/java/src/org/chromium/chrome/browser/ui/browser_window/ChromeAndroidTaskImpl.java +++ b/chrome/browser/ui/browser_window/internal/android/java/src/org/chromium/chrome/browser/ui/browser_window/ChromeAndroidTaskImpl.java -@@ -440,6 +440,9 @@ final class ChromeAndroidTaskImpl +@@ -525,6 +525,9 @@ final class ChromeAndroidTaskImpl if (isActivityToRemoveAtTop) { registerListenersForTopActivity(); } @@ -1185,18 +1151,18 @@ diff --git a/chrome/browser/ui/browser_window/internal/android/java/src/org/chro diff --git a/chrome/browser/ui/browser_window/internal/android/java/src/org/chromium/chrome/browser/ui/browser_window/ChromeAndroidTaskTrackerImpl.java b/chrome/browser/ui/browser_window/internal/android/java/src/org/chromium/chrome/browser/ui/browser_window/ChromeAndroidTaskTrackerImpl.java --- a/chrome/browser/ui/browser_window/internal/android/java/src/org/chromium/chrome/browser/ui/browser_window/ChromeAndroidTaskTrackerImpl.java +++ b/chrome/browser/ui/browser_window/internal/android/java/src/org/chromium/chrome/browser/ui/browser_window/ChromeAndroidTaskTrackerImpl.java -@@ -23,6 +23,7 @@ import org.chromium.build.annotations.Nullable; +@@ -22,6 +22,7 @@ import org.chromium.build.annotations.NullMarked; + import org.chromium.build.annotations.Nullable; import org.chromium.chrome.browser.customtabs.PopupIntentCreatorProvider; import org.chromium.chrome.browser.incognito.IncognitoUtils; - import org.chromium.chrome.browser.multiwindow.MultiInstanceManager; +import org.chromium.chrome.browser.tabmodel.TabModel; import org.chromium.chrome.browser.ui.browser_window.ChromeAndroidTask.PendingTaskInfo; import org.chromium.chrome.browser.util.WindowFeatures; import org.chromium.ui.base.ActivityWindowAndroid; -@@ -39,6 +40,30 @@ import java.util.Map; +@@ -36,6 +37,30 @@ import java.util.Map; + /** Implements {@link ChromeAndroidTaskTracker} as a singleton. */ + @NullMarked final class ChromeAndroidTaskTrackerImpl implements ChromeAndroidTaskTracker { - private static final String TAG = "CrAndroidTaskTracker"; - + private static class Key { + public final Integer mTaskId; + public final TabModel mTabModel; @@ -1224,7 +1190,7 @@ diff --git a/chrome/browser/ui/browser_window/internal/android/java/src/org/chro private static @Nullable ChromeAndroidTaskTrackerImpl sInstance; private static boolean sPausePendingTaskActivityCreationForTesting; -@@ -56,7 +81,7 @@ final class ChromeAndroidTaskTrackerImpl implements ChromeAndroidTaskTracker { +@@ -53,7 +78,7 @@ final class ChromeAndroidTaskTrackerImpl implements ChromeAndroidTaskTracker { * Maps {@link ChromeAndroidTask} IDs to their instances. This reflects the {@link * ChromeAndroidTask}'s ID when it is alive, and is different from its ID in the pending state. */ @@ -1233,7 +1199,7 @@ diff --git a/chrome/browser/ui/browser_window/internal/android/java/src/org/chro /** * Maps pending {@link ChromeAndroidTask} IDs to their instances. This reflects the {@link -@@ -86,7 +111,8 @@ final class ChromeAndroidTaskTrackerImpl implements ChromeAndroidTaskTracker { +@@ -83,7 +108,8 @@ final class ChromeAndroidTaskTrackerImpl implements ChromeAndroidTaskTracker { ThreadUtils.assertOnUiThread(); int taskId = getTaskId(activityScopedObjects.mActivityWindowAndroid); @@ -1243,22 +1209,25 @@ diff --git a/chrome/browser/ui/browser_window/internal/android/java/src/org/chro if (existingTask != null) { assert existingTask.getBrowserWindowType() == browserWindowType : "The browser window type of an existing task can't be changed."; -@@ -98,12 +124,12 @@ final class ChromeAndroidTaskTrackerImpl implements ChromeAndroidTaskTracker { +@@ -95,7 +121,7 @@ final class ChromeAndroidTaskTrackerImpl implements ChromeAndroidTaskTracker { ChromeAndroidTask pendingTask = mPendingTasks.remove(pendingId); assert pendingTask != null : "Invalid pendingId provided."; pendingTask.addActivityScopedObjects(activityScopedObjects); - mTasks.put(taskId, pendingTask); + mTasksCromite.put(key, pendingTask); - return pendingTask; + for (var observer : mObservers) { + observer.onTaskAdded(pendingTask); + } +@@ -103,7 +129,7 @@ final class ChromeAndroidTaskTrackerImpl implements ChromeAndroidTaskTracker { } var newTask = new ChromeAndroidTaskImpl(browserWindowType, activityScopedObjects); - mTasks.put(taskId, newTask); + mTasksCromite.put(key, newTask); - mObservers.forEach((observer) -> observer.onTaskAdded(newTask)); - return newTask; - } -@@ -141,23 +167,38 @@ final class ChromeAndroidTaskTrackerImpl implements ChromeAndroidTaskTracker { + for (var observer : mObservers) { + observer.onTaskAdded(newTask); + } +@@ -143,23 +169,38 @@ final class ChromeAndroidTaskTrackerImpl implements ChromeAndroidTaskTracker { @Override @Nullable @@ -1305,7 +1274,7 @@ diff --git a/chrome/browser/ui/browser_window/internal/android/java/src/org/chro if (task == null) { return; } -@@ -177,7 +218,7 @@ final class ChromeAndroidTaskTrackerImpl implements ChromeAndroidTaskTracker { +@@ -179,7 +220,7 @@ final class ChromeAndroidTaskTrackerImpl implements ChromeAndroidTaskTracker { // In the future, we can register a Task listener when a ChromeAndroidTask is created, // then destroy it when notified of the Task removal. if (task.getTopActivityWindowAndroid() == null) { @@ -1314,18 +1283,29 @@ diff --git a/chrome/browser/ui/browser_window/internal/android/java/src/org/chro } } -@@ -239,8 +280,8 @@ final class ChromeAndroidTaskTrackerImpl implements ChromeAndroidTaskTracker { +@@ -231,7 +272,7 @@ final class ChromeAndroidTaskTrackerImpl implements ChromeAndroidTaskTracker { + + /** Returns all PENDING and ALIVE Tasks. */ + /*package*/ List getAllTasks() { +- List tasks = new ArrayList<>(mTasks.values()); ++ List tasks = new ArrayList<>(mTasksCromite.values()); + tasks.addAll(mPendingTasks.values()); + return tasks; + } +@@ -246,10 +287,8 @@ final class ChromeAndroidTaskTrackerImpl implements ChromeAndroidTaskTracker { */ void removeAllForTesting() { ThreadUtils.assertOnUiThread(); -- mTasks.forEach((taskId, task) -> task.destroy()); +- for (var task : mTasks.values()) { +- task.destroy(); +- } - mTasks.clear(); + mTasksCromite.forEach((taskId, task) -> task.destroy()); + mTasksCromite.clear(); - mPendingTasks.forEach((taskId, task) -> task.destroy()); - mPendingTasks.clear(); - } -@@ -275,11 +316,17 @@ final class ChromeAndroidTaskTrackerImpl implements ChromeAndroidTaskTracker { + for (var task : mPendingTasks.values()) { + task.destroy(); + } +@@ -290,13 +329,17 @@ final class ChromeAndroidTaskTrackerImpl implements ChromeAndroidTaskTracker { pendingTaskInfo.mIntent, pendingTaskInfo.mCreateParams.getInitialBounds()); } @@ -1333,8 +1313,8 @@ diff --git a/chrome/browser/ui/browser_window/internal/android/java/src/org/chro - var taskRemoved = mTasks.remove(taskId); + private void removeInternal(ChromeAndroidTask taskRemoved) { if (taskRemoved != null) { -- mObservers.forEach((observer) -> observer.onTaskRemoved(taskRemoved)); -- taskRemoved.destroy(); +- for (var observer : mObservers) { +- observer.onTaskRemoved(taskRemoved); + for (Key key : mTasksCromite.keySet()) { + if (key == null) continue; + if (mTasksCromite.get(key) == taskRemoved) { @@ -1343,11 +1323,12 @@ diff --git a/chrome/browser/ui/browser_window/internal/android/java/src/org/chro + mObservers.forEach((observer) -> observer.onTaskRemoved(taskRemoved)); + taskRemoved.destroy(); + } -+ } + } +- taskRemoved.destroy(); } } -@@ -314,7 +361,8 @@ final class ChromeAndroidTaskTrackerImpl implements ChromeAndroidTaskTracker { +@@ -332,7 +375,8 @@ final class ChromeAndroidTaskTrackerImpl implements ChromeAndroidTaskTracker { @BrowserWindowType int browserWindowType = createParams.getWindowType(); switch (browserWindowType) { case BrowserWindowType.NORMAL: @@ -1357,15 +1338,6 @@ diff --git a/chrome/browser/ui/browser_window/internal/android/java/src/org/chro var intent = task.createIntentForNormalBrowserWindow(isIncognito); if (intent != null) { return intent; -@@ -360,7 +408,7 @@ final class ChromeAndroidTaskTrackerImpl implements ChromeAndroidTaskTracker { - - /** Returns all PENDING and ALIVE Tasks. */ - private List getAllTasks() { -- List tasks = new ArrayList<>(mTasks.values()); -+ List tasks = new ArrayList<>(mTasksCromite.values()); - tasks.addAll(mPendingTasks.values()); - return tasks; - } diff --git a/chrome/browser/ui/browser_window/public/android/java/src/org/chromium/chrome/browser/ui/browser_window/ChromeAndroidTaskTracker.java b/chrome/browser/ui/browser_window/public/android/java/src/org/chromium/chrome/browser/ui/browser_window/ChromeAndroidTaskTracker.java --- a/chrome/browser/ui/browser_window/public/android/java/src/org/chromium/chrome/browser/ui/browser_window/ChromeAndroidTaskTracker.java +++ b/chrome/browser/ui/browser_window/public/android/java/src/org/chromium/chrome/browser/ui/browser_window/ChromeAndroidTaskTracker.java @@ -1433,7 +1405,7 @@ diff --git a/components/tabs/impl/tab_collection.cc b/components/tabs/impl/tab_c diff --git a/components/tabs/impl/tab_strip_collection.cc b/components/tabs/impl/tab_strip_collection.cc --- a/components/tabs/impl/tab_strip_collection.cc +++ b/components/tabs/impl/tab_strip_collection.cc -@@ -327,13 +327,13 @@ std::unique_ptr TabStripCollection::RemoveTabAtIndexRecursive( +@@ -329,13 +329,13 @@ std::unique_ptr TabStripCollection::RemoveTabAtIndexRecursive( std::unique_ptr TabStripCollection::MaybeRemoveTab( TabInterface* tab) { CHECK(tab); diff --git a/build/patches/Enable-native-Android-autofill.patch b/build/patches/Enable-native-Android-autofill.patch index 3566bb1e..902fe1a3 100644 --- a/build/patches/Enable-native-Android-autofill.patch +++ b/build/patches/Enable-native-Android-autofill.patch @@ -15,16 +15,16 @@ See also: https://github.com/bromite/bromite/issues/547 Original License: GPL-2.0-or-later - https://spdx.org/licenses/GPL-2.0-or-later.html License: GPL-3.0-only - https://spdx.org/licenses/GPL-3.0-only.html --- - .../settings/PasswordSettings.java | 84 +++++++++++++++++- + .../settings/PasswordSettings.java | 84 +++++++++++++++- .../chrome/browser/settings/MainSettings.java | 17 +--- - .../chromium/chrome/browser/tab/TabImpl.java | 42 +++++++-- + .../chromium/chrome/browser/tab/TabImpl.java | 41 ++++++-- chrome/browser/android/tab_android.cc | 4 +- chrome/browser/autofill/android/BUILD.gn | 2 +- .../autofill/AutofillClientProviderUtils.java | 2 +- ...AutofillThirdPartyModeContentProvider.java | 1 + .../glic/actor_form_filling_service_impl.cc | 16 ++-- .../strings/android_chrome_strings.grd | 6 ++ - .../ui/autofill/autofill_client_provider.cc | 87 +------------------ + .../ui/autofill/autofill_client_provider.cc | 96 +------------------ .../ui/autofill/autofill_client_provider.h | 6 -- chrome/browser/ui/tab_helpers.cc | 4 +- components/android_autofill/browser/BUILD.gn | 1 + @@ -34,9 +34,9 @@ License: GPL-3.0-only - https://spdx.org/licenses/GPL-3.0-only.html .../components/autofill/AutofillProvider.java | 7 ++ .../BrowserSelectionActionMenuDelegate.java | 27 ++++++ .../browser/content_autofill_driver.cc | 11 +++ - .../content/browser/content_autofill_driver.h | 10 +++ + .../content/browser/content_autofill_driver.h | 10 ++ .../content_autofill_driver_factory.cc | 12 +++ - .../content/renderer/autofill_agent.cc | 5 ++ + .../content/renderer/autofill_agent.cc | 10 +- .../renderer/password_autofill_agent.cc | 5 +- .../browser/foundations/autofill_driver.h | 2 + .../foundations/autofill_driver_factory.cc | 4 + @@ -44,8 +44,8 @@ License: GPL-3.0-only - https://spdx.org/licenses/GPL-3.0-only.html .../foundations/browser_autofill_manager.cc | 2 + .../foundations/browser_autofill_manager.h | 2 + .../autofill/core/common/autofill_prefs.cc | 4 +- - .../autofill/core/common/autofill_prefs.h | 5 ++ - 30 files changed, 246 insertions(+), 133 deletions(-) + .../autofill/core/common/autofill_prefs.h | 5 + + 30 files changed, 248 insertions(+), 144 deletions(-) create mode 100644 components/android_autofill/browser/java/src/org/chromium/components/autofill/BrowserSelectionActionMenuDelegate.java diff --git a/chrome/android/java/src/org/chromium/chrome/browser/password_manager/settings/PasswordSettings.java b/chrome/android/java/src/org/chromium/chrome/browser/password_manager/settings/PasswordSettings.java @@ -187,7 +187,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/password_manage diff --git a/chrome/android/java/src/org/chromium/chrome/browser/settings/MainSettings.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/MainSettings.java --- a/chrome/android/java/src/org/chromium/chrome/browser/settings/MainSettings.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/MainSettings.java -@@ -596,21 +596,8 @@ public class MainSettings extends ChromeBaseSettingsFragment +@@ -626,21 +626,8 @@ public class MainSettings extends ChromeBaseSettingsFragment } private void updateAutofillPreferences() { @@ -214,9 +214,9 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/settings/MainSe diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabImpl.java --- a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabImpl.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabImpl.java -@@ -122,6 +122,13 @@ import java.nio.ByteBuffer; +@@ -122,6 +122,13 @@ import java.lang.ref.WeakReference; + import java.nio.ByteBuffer; import java.util.Objects; - import java.util.function.Supplier; +import org.chromium.components.autofill.AutofillSelectionMenuItemHelper; +import org.chromium.components.autofill.BrowserSelectionActionMenuDelegate; @@ -228,7 +228,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabImpl.jav /** * Implementation of the interface {@link Tab}. Contains and manages a {@link ContentView}. This * class is not intended to be extended. -@@ -1331,6 +1338,11 @@ class TabImpl implements Tab { +@@ -1330,6 +1337,11 @@ class TabImpl implements Tab { } mObservers.clear(); @@ -240,16 +240,15 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabImpl.jav if (!abortNavigationsFromTabClosures) mUserDataHost.destroy(); mTabViewManager.destroy(); hideNativePage(false, null); -@@ -1717,7 +1729,7 @@ class TabImpl implements Tab { +@@ -1715,6 +1727,7 @@ class TabImpl implements Tab { * @return iff the AutofillProvider should provide a ViewStructure when prompted. */ boolean providesAutofillStructure() { -- + if ((true)) return true; - if (mProfile == null || !mProfile.isNativeInitialized()) { + if (!mProfile.isNativeInitialized()) { return false; } -@@ -2483,16 +2495,21 @@ class TabImpl implements Tab { +@@ -2497,16 +2510,21 @@ class TabImpl implements Tab { * @return true if the the provider is available for the given WebContents. */ private boolean prepareAutofillProvider(WebContents newWebContents) { @@ -277,7 +276,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabImpl.jav // TODO: crbug.com/432447902 — Provide only an activity context and push changes. mAutofillProvider = new AutofillProvider( -@@ -2502,7 +2519,16 @@ class TabImpl implements Tab { +@@ -2516,7 +2534,16 @@ class TabImpl implements Tab { getContext().getString(R.string.app_name)); TabImplJni.get().initializeAutofillIfNecessary(mNativeTabAndroid); } @@ -298,7 +297,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabImpl.jav diff --git a/chrome/browser/android/tab_android.cc b/chrome/browser/android/tab_android.cc --- a/chrome/browser/android/tab_android.cc +++ b/chrome/browser/android/tab_android.cc -@@ -38,6 +38,7 @@ +@@ -39,6 +39,7 @@ #include "chrome/browser/resource_coordinator/tab_load_tracker.h" #include "chrome/browser/sync/glue/synced_tab_delegate_android.h" #include "chrome/browser/tab_contents/tab_util.h" @@ -306,7 +305,7 @@ diff --git a/chrome/browser/android/tab_android.cc b/chrome/browser/android/tab_ #include "chrome/browser/ui/android/context_menu_helper.h" #include "chrome/browser/ui/android/tab_model/tab_model.h" #include "chrome/browser/ui/android/tab_model/tab_model_list.h" -@@ -461,8 +462,7 @@ void TabAndroid::InitializeAutofillIfNecessary() { +@@ -418,8 +419,7 @@ void TabAndroid::InitializeAutofillIfNecessary() { ->MaybeInitKeyboardSuppressor(); return; } @@ -319,7 +318,7 @@ diff --git a/chrome/browser/android/tab_android.cc b/chrome/browser/android/tab_ diff --git a/chrome/browser/autofill/android/BUILD.gn b/chrome/browser/autofill/android/BUILD.gn --- a/chrome/browser/autofill/android/BUILD.gn +++ b/chrome/browser/autofill/android/BUILD.gn -@@ -167,7 +167,7 @@ android_library("bottom_sheet_utils_java") { +@@ -181,7 +181,7 @@ android_library("bottom_sheet_utils_java") { generate_jni("jni_headers") { sources = [ "java/src/org/chromium/chrome/browser/autofill/AddressNormalizerFactory.java", @@ -331,7 +330,7 @@ diff --git a/chrome/browser/autofill/android/BUILD.gn b/chrome/browser/autofill/ diff --git a/chrome/browser/autofill/android/java/src/org/chromium/chrome/browser/autofill/AutofillClientProviderUtils.java b/chrome/browser/autofill/android/java/src/org/chromium/chrome/browser/autofill/AutofillClientProviderUtils.java --- a/chrome/browser/autofill/android/java/src/org/chromium/chrome/browser/autofill/AutofillClientProviderUtils.java +++ b/chrome/browser/autofill/android/java/src/org/chromium/chrome/browser/autofill/AutofillClientProviderUtils.java -@@ -76,9 +76,9 @@ public class AutofillClientProviderUtils { +@@ -90,9 +90,9 @@ public class AutofillClientProviderUtils { * @return {@link AndroidAutofillAvailabilityStatus.AVAILABLE} if Android Autofill can be used * or a reason why it can't. */ @@ -356,7 +355,7 @@ diff --git a/chrome/browser/autofill/android/java/src/org/chromium/chrome/browse diff --git a/chrome/browser/autofill/glic/actor_form_filling_service_impl.cc b/chrome/browser/autofill/glic/actor_form_filling_service_impl.cc --- a/chrome/browser/autofill/glic/actor_form_filling_service_impl.cc +++ b/chrome/browser/autofill/glic/actor_form_filling_service_impl.cc -@@ -379,14 +379,14 @@ GetAutofillManager(const tabs::TabInterface& tab) { +@@ -412,14 +412,14 @@ GetAutofillManager(const tabs::TabInterface& tab) { if (!profile) { return base::unexpected(kAutofillNotAvailable); } @@ -398,7 +397,7 @@ diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chro diff --git a/chrome/browser/ui/autofill/autofill_client_provider.cc b/chrome/browser/ui/autofill/autofill_client_provider.cc --- a/chrome/browser/ui/autofill/autofill_client_provider.cc +++ b/chrome/browser/ui/autofill/autofill_client_provider.cc -@@ -17,85 +17,14 @@ +@@ -17,92 +17,14 @@ #include "chrome/browser/autofill/android/android_autofill_availability_status.h" #include "components/android_autofill/browser/android_autofill_client.h" #include "components/prefs/android/pref_service_android.h" @@ -421,7 +420,7 @@ diff --git a/chrome/browser/ui/autofill/autofill_client_provider.cc b/chrome/bro -void RecordWhetherAndroidPrefResets(PrefService& prefs, - bool uses_platform_autofill) { - const bool will_reset_pref = -- prefs.GetBoolean(prefs::kAutofillUsingVirtualViewStructure) && +- prefs.GetBoolean(prefs::kAutofillUsingPlatformAutofill) && - !uses_platform_autofill; - base::UmaHistogramBoolean("Autofill.ResetAutofillPrefToChrome", - will_reset_pref); @@ -478,15 +477,23 @@ diff --git a/chrome/browser/ui/autofill/autofill_client_provider.cc b/chrome/bro -#if BUILDFLAG(IS_ANDROID) - RecordWhetherAndroidPrefResets(*prefs, uses_platform_autofill_); - // Ensure the pref is reset if platform autofill is restricted. - prefs->SetBoolean(prefs::kAutofillUsingVirtualViewStructure, +- prefs->SetBoolean(prefs::kAutofillUsingPlatformAutofill, - uses_platform_autofill_); +- if (uses_platform_autofill_) { +- // Update the package of the actively used Autofill Service while platform +- // autofill is used. This allows restoring platform autofill later if it's +- // temporarily unavailable. Calling this for AwG would reset the pref. +- Java_AutofillClientProviderUtils_updatePackageUsedForAutofill( +- base::android::AttachCurrentThread(), prefs, uses_platform_autofill_); +- } - SetSharedPrefForSettingsContentProvider(uses_platform_autofill_); - SetSharedPrefForDeepLink(); ++ prefs->SetBoolean(prefs::kAutofillUsingVirtualViewStructure, + true); #endif // BUILDFLAG(IS_ANDROID) } -@@ -103,19 +32,7 @@ AutofillClientProvider::~AutofillClientProvider() = default; +@@ -110,19 +32,7 @@ AutofillClientProvider::~AutofillClientProvider() = default; void AutofillClientProvider::CreateClientForWebContents( content::WebContents* web_contents) { @@ -526,7 +533,7 @@ diff --git a/chrome/browser/ui/autofill/autofill_client_provider.h b/chrome/brow diff --git a/chrome/browser/ui/tab_helpers.cc b/chrome/browser/ui/tab_helpers.cc --- a/chrome/browser/ui/tab_helpers.cc +++ b/chrome/browser/ui/tab_helpers.cc -@@ -369,9 +369,7 @@ void TabHelpers::AttachTabHelpers(WebContents* web_contents) { +@@ -377,9 +377,7 @@ void TabHelpers::AttachTabHelpers(WebContents* web_contents) { web_contents); ChainedBackNavigationTracker::CreateForWebContents(web_contents); chrome_browser_net::NetErrorTabHelper::CreateForWebContents(web_contents); @@ -764,12 +771,16 @@ diff --git a/components/autofill/content/browser/content_autofill_driver_factory diff --git a/components/autofill/content/renderer/autofill_agent.cc b/components/autofill/content/renderer/autofill_agent.cc --- a/components/autofill/content/renderer/autofill_agent.cc +++ b/components/autofill/content/renderer/autofill_agent.cc -@@ -1483,14 +1483,19 @@ void AutofillAgent::ShowSuggestions( +@@ -1516,17 +1516,19 @@ void AutofillAgent::ShowSuggestions( password_generation_agent_->ShowPasswordGenerationSuggestions( input_element, form_cache)) { is_popup_possibly_visible_ = true; +- if (!base::FeatureList::IsEnabled( +- features::kAutofillAndroidKeyboardAccessoryDynamicPositioning)) { +- return; +- } +#if !BUILDFLAG(IS_ANDROID) - return; ++ return; +#endif } + [[maybe_unused]] @@ -791,14 +802,14 @@ diff --git a/components/autofill/content/renderer/password_autofill_agent.cc b/c void PasswordAutofillAgent::TrackAutofilledElement( const WebFormControlElement& element) { -- autofill_agent_->TrackAutofilledElement(element); +- autofill_agent_->TrackAutofilledElement( + // fix for https://github.com/bromite/bromite/issues/1570 + AutofillAgent* agent = autofill_agent_.get(); + if (agent) -+ agent->TrackAutofilledElement(element); ++ agent->TrackAutofilledElement( + form_util::GetFieldRendererId(element)); } - void PasswordAutofillAgent::FillPasswordSuggestion( diff --git a/components/autofill/core/browser/foundations/autofill_driver.h b/components/autofill/core/browser/foundations/autofill_driver.h --- a/components/autofill/core/browser/foundations/autofill_driver.h +++ b/components/autofill/core/browser/foundations/autofill_driver.h @@ -828,7 +839,7 @@ diff --git a/components/autofill/core/browser/foundations/autofill_driver_factor diff --git a/components/autofill/core/browser/foundations/autofill_manager.h b/components/autofill/core/browser/foundations/autofill_manager.h --- a/components/autofill/core/browser/foundations/autofill_manager.h +++ b/components/autofill/core/browser/foundations/autofill_manager.h -@@ -239,6 +239,8 @@ class AutofillManager +@@ -241,6 +241,8 @@ class AutofillManager LifecycleState new_state, base::PassKey pass_key); @@ -840,7 +851,7 @@ diff --git a/components/autofill/core/browser/foundations/autofill_manager.h b/c diff --git a/components/autofill/core/browser/foundations/browser_autofill_manager.cc b/components/autofill/core/browser/foundations/browser_autofill_manager.cc --- a/components/autofill/core/browser/foundations/browser_autofill_manager.cc +++ b/components/autofill/core/browser/foundations/browser_autofill_manager.cc -@@ -903,6 +903,8 @@ base::WeakPtr BrowserAutofillManager::GetWeakPtr() { +@@ -877,6 +877,8 @@ base::WeakPtr BrowserAutofillManager::GetWeakPtr() { return weak_ptr_factory_.GetWeakPtr(); } @@ -852,19 +863,19 @@ diff --git a/components/autofill/core/browser/foundations/browser_autofill_manag diff --git a/components/autofill/core/browser/foundations/browser_autofill_manager.h b/components/autofill/core/browser/foundations/browser_autofill_manager.h --- a/components/autofill/core/browser/foundations/browser_autofill_manager.h +++ b/components/autofill/core/browser/foundations/browser_autofill_manager.h -@@ -464,6 +464,8 @@ class BrowserAutofillManager : public AutofillManager { +@@ -440,6 +440,8 @@ class BrowserAutofillManager : public AutofillManager { // latter check is needed because IPC messages can arrive out of order. void UpdateInitialInteractionTimestamp(base::TimeTicks interaction_timestamp); + bool IsAndroidAutofill() const override; + - // Whether the `trigger_field` should show an entry to scan a credit card. - bool ShouldShowScanCreditCard(const FormStructure& form, - const AutofillField& trigger_field); + // Checks whether JavaScript cleared an autofilled value within + // kLimitBeforeRefill after the filling and records metrics for this. This + // method should be called after we learned that JavaScript modified an diff --git a/components/autofill/core/common/autofill_prefs.cc b/components/autofill/core/common/autofill_prefs.cc --- a/components/autofill/core/common/autofill_prefs.cc +++ b/components/autofill/core/common/autofill_prefs.cc -@@ -85,6 +85,8 @@ void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry) { +@@ -89,6 +89,8 @@ void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry) { registry->RegisterBooleanPref(kAutofillCreditCardFidoAuthOfferCheckboxState, true); #endif @@ -873,19 +884,19 @@ diff --git a/components/autofill/core/common/autofill_prefs.cc b/components/auto registry->RegisterIntegerPref(kAutocompleteLastVersionRetentionPolicy, 0); registry->RegisterStringPref(kAutofillUploadEncodingSeed, ""); registry->RegisterDictionaryPref(kAutofillVoteUploadEvents); -@@ -124,7 +126,7 @@ void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry) { - #endif // BUILDFLAG(IS_ANDROID) +@@ -117,7 +119,7 @@ void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry) { + #endif #if BUILDFLAG(IS_ANDROID) -- registry->RegisterBooleanPref(kAutofillUsingVirtualViewStructure, false); -+ registry->RegisterBooleanPref(kAutofillUsingVirtualViewStructure, true); +- registry->RegisterBooleanPref(kAutofillUsingPlatformAutofill, false); ++ registry->RegisterBooleanPref(kAutofillUsingPlatformAutofill, true); registry->RegisterBooleanPref(kAutofillThirdPartyPasswordManagersAllowed, true); - registry->RegisterBooleanPref( + registry->RegisterStringPref( diff --git a/components/autofill/core/common/autofill_prefs.h b/components/autofill/core/common/autofill_prefs.h --- a/components/autofill/core/common/autofill_prefs.h +++ b/components/autofill/core/common/autofill_prefs.h -@@ -162,6 +162,11 @@ inline constexpr char kAutofillWasNameAndEmailProfileUsed[] = +@@ -152,6 +152,11 @@ inline constexpr char kAutofillWasNameAndEmailProfileUsed[] = // retention policy was run. inline constexpr char kAutocompleteLastVersionRetentionPolicy[] = "autocomplete.retention_policy_last_version"; diff --git a/build/patches/Experimental-support-for-extensions-on-Android.patch b/build/patches/Experimental-support-for-extensions-on-Android.patch index b6590f85..63263f43 100644 --- a/build/patches/Experimental-support-for-extensions-on-Android.patch +++ b/build/patches/Experimental-support-for-extensions-on-Android.patch @@ -16,7 +16,6 @@ License: GPL-2.0-or-later - https://spdx.org/licenses/GPL-2.0-or-later.html base/android/device_info.cc | 8 ++- base/android/device_info.h | 3 +- .../src/org/chromium/base/DeviceInfo.java | 6 +- - .../base/test/util/ApplicationTestUtils.java | 2 +- build/BUILD.gn | 2 +- build/config/android/rules.gni | 4 +- build/config/chrome_build.gni | 7 +- @@ -49,7 +48,7 @@ License: GPL-2.0-or-later - https://spdx.org/licenses/GPL-2.0-or-later.html .../bookmarks/bar/BookmarkBarUtils.java | 6 +- .../bar/BookmarkBarVisibilityProvider.java | 2 +- chrome/browser/browser_process_impl.cc | 2 +- - chrome/browser/chrome_browser_field_trials.cc | 72 +++++++++---------- + chrome/browser/chrome_browser_field_trials.cc | 66 +++++++++---------- .../chrome_browser_interface_binders_webui.cc | 4 +- .../browser/chrome_content_browser_client.cc | 4 +- chrome/browser/devtools/BUILD.gn | 2 +- @@ -61,7 +60,7 @@ License: GPL-2.0-or-later - https://spdx.org/licenses/GPL-2.0-or-later.html .../extensions/api/identity/web_auth_flow.h | 4 +- .../extensions/extension_management.cc | 8 ++- .../browser/extensions/extension_management.h | 2 +- - chrome/browser/extensions/extension_util.cc | 11 +++ + chrome/browser/extensions/extension_util.cc | 11 ++++ .../feedback/DeviceInfoFeedbackSource.java | 2 +- chrome/browser/media/router/BUILD.gn | 4 +- .../browser/media/router/discovery/BUILD.gn | 2 +- @@ -76,7 +75,7 @@ License: GPL-2.0-or-later - https://spdx.org/licenses/GPL-2.0-or-later.html chrome/browser/resources/discards/BUILD.gn | 2 +- .../resources/extensions/detail_view.css | 6 ++ .../resources/extensions/extensions.html | 8 ++- - .../resources/extensions/item_list.css | 11 +++ + .../resources/extensions/item_list.css | 11 ++++ .../resources/extensions/toolbar.html.ts | 7 -- ...omeProvidedSharingOptionsProviderBase.java | 4 +- chrome/browser/startup_data.cc | 6 +- @@ -87,31 +86,31 @@ License: GPL-2.0-or-later - https://spdx.org/licenses/GPL-2.0-or-later.html .../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 +- .../extensions/java/res/values/dimens.xml | 1 + .../ui/extensions/ExtensionActionsBridge.java | 6 ++ .../extensions/windowing/internal/BUILD.gn | 2 +- - .../Enable-extensions-Android.grdp | 15 ++++ + .../Enable-extensions-Android.grdp | 15 +++++ .../Extensions-Android.grdp | 9 +++ .../browser/ui/android/tab_model/tab_model.cc | 4 +- .../browser/ui/android/tab_model/tab_model.h | 2 +- .../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 ++- - .../ExtensionToolbarCoordinatorImpl.java | 10 ++- - .../extensions/ExtensionsMenuCoordinator.java | 44 ++++++------ + .../ExtensionActionListRecyclerView.java | 2 +- + .../ExtensionToolbarCoordinatorImpl.java | 11 +++- + .../extensions/ExtensionsMenuCoordinator.java | 8 ++- .../ExtensionsMenuItemProperties.java | 5 +- .../ExtensionsMenuItemViewBinder.java | 2 + - .../extensions/ExtensionsMenuMediator.java | 10 ++- + .../extensions/ExtensionsMenuMediator.java | 9 ++- .../ChromeAndroidTaskTrackerFactory.java | 4 -- chrome/browser/ui/prefs/BUILD.gn | 4 +- chrome/browser/ui/prefs/prefs_tab_helper.cc | 8 +-- .../browser/ui/webui/chrome_web_ui_configs.cc | 4 +- - .../browser/ui/webui/current_channel_logo.cc | 2 +- + .../browser/ui/webui/current_channel_logo.cc | 3 +- .../browser/ui/webui/discards/discards_ui.cc | 8 +-- chrome/chrome_paks.gni | 2 +- chrome/common/chrome_switches.cc | 2 +- @@ -186,7 +185,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 +- - 174 files changed, 596 insertions(+), 309 deletions(-) + 173 files changed, 573 insertions(+), 283 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 @@ -194,7 +193,7 @@ License: GPL-2.0-or-later - https://spdx.org/licenses/GPL-2.0-or-later.html diff --git a/android_webview/BUILD.gn b/android_webview/BUILD.gn --- a/android_webview/BUILD.gn +++ b/android_webview/BUILD.gn -@@ -1303,7 +1303,7 @@ declare_args() { +@@ -1308,7 +1308,7 @@ declare_args() { # logic more easily on an emulator, so the decision to use the arm64 # orderfile for x64 (instead of arm32) is somewhat arbitrary. We just # needed to use some real orderfile. @@ -263,18 +262,6 @@ diff --git a/base/android/java/src/org/chromium/base/DeviceInfo.java b/base/andr public static int getVulkanDeqpLevel() { return getInstance().mIDeviceInfo.vulkanDeqpLevel; } -diff --git a/base/test/android/javatests/src/org/chromium/base/test/util/ApplicationTestUtils.java b/base/test/android/javatests/src/org/chromium/base/test/util/ApplicationTestUtils.java ---- a/base/test/android/javatests/src/org/chromium/base/test/util/ApplicationTestUtils.java -+++ b/base/test/android/javatests/src/org/chromium/base/test/util/ApplicationTestUtils.java -@@ -167,7 +167,7 @@ public class ApplicationTestUtils { - // called, it is just the notification to the test instrumentation that is - // missing. PersistAcrossReboots is currently only enabled on desktop builds. - boolean hasSkippedOnCreate = -- DeviceInfo.isDesktop() -+ DeviceInfo.isDesktopFalse() - && !hadOnCreateCall.get() - && (newStage == Stage.STARTED) - && stages.contains(Stage.CREATED); diff --git a/build/BUILD.gn b/build/BUILD.gn --- a/build/BUILD.gn +++ b/build/BUILD.gn @@ -332,7 +319,7 @@ diff --git a/build/config/chrome_build.gni b/build/config/chrome_build.gni diff --git a/build/config/compiler/BUILD.gn b/build/config/compiler/BUILD.gn --- a/build/config/compiler/BUILD.gn +++ b/build/config/compiler/BUILD.gn -@@ -241,7 +241,7 @@ if (is_android) { +@@ -242,7 +242,7 @@ if (is_android) { # logic more easily on an emulator, so the decision to use the arm64 # orderfile for x64 (instead of arm32) is somewhat arbitrary. We just # needed to use some real orderfile. @@ -344,7 +331,7 @@ diff --git a/build/config/compiler/BUILD.gn b/build/config/compiler/BUILD.gn diff --git a/build/config/compiler/pgo/BUILD.gn b/build/config/compiler/pgo/BUILD.gn --- a/build/config/compiler/pgo/BUILD.gn +++ b/build/config/compiler/pgo/BUILD.gn -@@ -64,7 +64,7 @@ config("pgo_optimization_flags") { +@@ -78,7 +78,7 @@ config("pgo_optimization_flags") { _pgo_target = "linux" } else if (is_android) { # Use |current_cpu| and not |target_cpu|; for Android we may built both. @@ -368,7 +355,7 @@ diff --git a/cc/resources/ui_resource_bitmap.cc b/cc/resources/ui_resource_bitma diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn --- a/chrome/android/BUILD.gn +++ b/chrome/android/BUILD.gn -@@ -954,7 +954,7 @@ if (_is_default_toolchain) { +@@ -971,7 +971,7 @@ if (_is_default_toolchain) { "//chrome/browser/password_entry_edit/android/internal:java", ] @@ -377,7 +364,7 @@ diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn deps += [ "//chrome/browser/ui/android/extensions/windowing/internal:java" ] } else { -@@ -2300,7 +2300,7 @@ if (_is_default_toolchain) { +@@ -2342,7 +2342,7 @@ if (_is_default_toolchain) { "//components/embedder_support/android:virtual_structure_javatests", ] @@ -438,7 +425,7 @@ diff --git a/chrome/android/java/res/xml/developer_preferences.xml b/chrome/andr diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeBaseAppCompatActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeBaseAppCompatActivity.java --- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeBaseAppCompatActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeBaseAppCompatActivity.java -@@ -620,7 +620,7 @@ public class ChromeBaseAppCompatActivity extends AppCompatActivity +@@ -619,7 +619,7 @@ public class ChromeBaseAppCompatActivity extends AppCompatActivity applySingleThemeOverlay(R.style.ThemeOverlay_BrowserUI_OptOutEdgeToEdge); } @@ -450,19 +437,19 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeBaseAppCo diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java --- a/chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java -@@ -2099,7 +2099,7 @@ public abstract class ChromeActivity extends AsyncInitializationActivity - && DeviceFormFactor.isNonMultiDisplayContextOnTablet(this)) { +@@ -2107,7 +2107,7 @@ public abstract class ChromeActivity extends AsyncInitializationActivity HostZoomMap.setTransparentZoomAdjustment( - ContentFeatureList.sAndroidMonitorZoomScalingFactor.getValue() / 100.0f); + (float) ContentFeatureList.sAndroidMonitorZoomScalingFactor.getValue() + / 100.0f); - } else if (DeviceInfo.isDesktop()) { + } else if (DeviceInfo.isDesktopFalse()) { HostZoomMap.setTransparentZoomAdjustment( - ContentFeatureList.sAndroidDesktopZoomScalingFactor.getValue() / 100.0f); - } + (float) ContentFeatureList.sAndroidDesktopZoomScalingFactor.getValue() + / 100.0f); diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateImpl.java --- a/chrome/android/java/src/org/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateImpl.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateImpl.java -@@ -1180,7 +1180,7 @@ public abstract class AppMenuPropertiesDelegateImpl implements AppMenuProperties +@@ -1202,7 +1202,7 @@ public abstract class AppMenuPropertiesDelegateImpl implements AppMenuProperties && !shouldShowReaderModePrefs(currentTab) && currentTab != null && currentTab.getWebContents() != null @@ -474,7 +461,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/appmenu/App diff --git a/chrome/android/java/src/org/chromium/chrome/browser/appearance/settings/AppearanceSettingsFragment.java b/chrome/android/java/src/org/chromium/chrome/browser/appearance/settings/AppearanceSettingsFragment.java --- a/chrome/android/java/src/org/chromium/chrome/browser/appearance/settings/AppearanceSettingsFragment.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/appearance/settings/AppearanceSettingsFragment.java -@@ -62,7 +62,7 @@ public class AppearanceSettingsFragment extends ChromeBaseSettingsFragment +@@ -64,7 +64,7 @@ public class AppearanceSettingsFragment extends ChromeBaseSettingsFragment // This fragment may be used on Desktop or tablets. For Desktop we use the current Profile's // UserPrefs. For tablets, we use the local device preference. @@ -519,7 +506,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/media/MediaCapt int lastIndex = mNotifications.size() - 1; boolean isRemovingLatestNotification = lastIndex >= 0 && mNotifications.get(lastIndex).first == notificationId; -@@ -314,7 +314,7 @@ public class MediaCaptureNotificationServiceImpl extends SplitCompatService.Impl +@@ -315,7 +315,7 @@ public class MediaCaptureNotificationServiceImpl extends SplitCompatService.Impl contentIntent, stopIntent); mNotificationsType.put(notificationId, mediaTypes); @@ -531,7 +518,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/media/MediaCapt diff --git a/chrome/android/java/src/org/chromium/chrome/browser/multiwindow/MultiWindowUtils.java b/chrome/android/java/src/org/chromium/chrome/browser/multiwindow/MultiWindowUtils.java --- a/chrome/android/java/src/org/chromium/chrome/browser/multiwindow/MultiWindowUtils.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/multiwindow/MultiWindowUtils.java -@@ -200,7 +200,7 @@ public class MultiWindowUtils implements ActivityStateListener { +@@ -201,7 +201,7 @@ public class MultiWindowUtils implements ActivityStateListener { return TabWindowManager.MAX_SELECTORS_S; } @@ -630,7 +617,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/RequestDesk diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedAppMenuPropertiesDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedAppMenuPropertiesDelegate.java --- a/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedAppMenuPropertiesDelegate.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedAppMenuPropertiesDelegate.java -@@ -843,7 +843,7 @@ public class TabbedAppMenuPropertiesDelegate extends AppMenuPropertiesDelegateIm +@@ -867,7 +867,7 @@ public class TabbedAppMenuPropertiesDelegate extends AppMenuPropertiesDelegateIm return false; } @@ -642,7 +629,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/Tab diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator.java --- a/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator.java -@@ -2036,7 +2036,7 @@ public class TabbedRootUiCoordinator extends RootUiCoordinator { +@@ -2133,7 +2133,7 @@ public class TabbedRootUiCoordinator extends RootUiCoordinator { } else if (id == R.id.toggle_bookmark_bar) { // isActivityStateBookmarkBarCompatible already checks the flag sAndroidBookmarkBar. if (BookmarkBarUtils.isActivityStateBookmarkBarCompatible(mActivity)) { @@ -654,7 +641,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/Tab diff --git a/chrome/app/extensions_strings.grdp b/chrome/app/extensions_strings.grdp --- a/chrome/app/extensions_strings.grdp +++ b/chrome/app/extensions_strings.grdp -@@ -409,9 +409,16 @@ +@@ -400,9 +400,16 @@ No recent activities @@ -674,7 +661,7 @@ diff --git a/chrome/app/extensions_strings.grdp b/chrome/app/extensions_strings. diff --git a/chrome/app/theme/theme_resources.grd b/chrome/app/theme/theme_resources.grd --- a/chrome/app/theme/theme_resources.grd +++ b/chrome/app/theme/theme_resources.grd -@@ -373,7 +373,7 @@ +@@ -379,7 +379,7 @@ @@ -683,7 +670,7 @@ diff --git a/chrome/app/theme/theme_resources.grd b/chrome/app/theme/theme_resou -@@ -382,7 +382,7 @@ +@@ -388,7 +388,7 @@ @@ -695,7 +682,7 @@ diff --git a/chrome/app/theme/theme_resources.grd b/chrome/app/theme/theme_resou diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn --- a/chrome/browser/BUILD.gn +++ b/chrome/browser/BUILD.gn -@@ -7627,7 +7627,7 @@ static_library("browser") { +@@ -7615,7 +7615,7 @@ static_library("browser") { deps += [ "//media/mojo/mojom:remoting" ] } @@ -704,7 +691,7 @@ diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn sources += [ "download/download_crx_util_android.cc" ] } -@@ -7945,7 +7945,7 @@ static_library("browser") { +@@ -7946,7 +7946,7 @@ static_library("browser") { # TODO(https://crbug.com/356905053): Add more dependencies here and merge this # block with the `enable_extensions` block above. @@ -713,7 +700,7 @@ diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn sources += [ # TODO(https://crbug.com/356905053): These files are temporary workarounds # allow for a lightweight extensions runtime in desktop-android builds. -@@ -8726,7 +8726,7 @@ static_library("browser_generated_files") { +@@ -8718,7 +8718,7 @@ static_library("browser_generated_files") { [ "//chrome/browser/ui/webui/new_tab_page/foo:mojo_bindings" ] } } @@ -725,7 +712,7 @@ diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn 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 -@@ -370,6 +370,10 @@ +@@ -375,6 +375,10 @@ #include "extensions/common/switches.h" #endif // BUILDFLAG(ENABLE_EXTENSIONS_CORE) @@ -760,7 +747,7 @@ diff --git a/chrome/browser/android/selection/chrome_selection_dropdown_menu_del diff --git a/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/bar/BookmarkBarUtils.java b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/bar/BookmarkBarUtils.java --- a/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/bar/BookmarkBarUtils.java +++ b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/bar/BookmarkBarUtils.java -@@ -209,7 +209,7 @@ public class BookmarkBarUtils { +@@ -212,7 +212,7 @@ public class BookmarkBarUtils { // On Desktop, we sync with the UserPrefs. // On tablets we use the device preference logic (policy (pref service) > local pref // (shared pref) > FeatureParam). @@ -769,8 +756,8 @@ diff --git a/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/brows ? isUserPrefsShowBookmarksBarEnabled(profile) : isDevicePrefShowBookmarksBarEnabled(profile); } -@@ -427,13 +427,13 @@ public class BookmarkBarUtils { - boolean isCurrentlyVisible = isBookmarkBarVisible(context, profile); +@@ -431,13 +431,13 @@ public class BookmarkBarUtils { + boolean isCurrentlyVisible = isBookmarkBarVisible(context, profile, isXrFullSpaceMode); // Record if the Bookmark Bar is visible, but not in cases of a forced feature param. - if (DeviceInfo.isDesktop() || hasUserSetDevicePrefShowBookmarksBar()) { @@ -788,8 +775,8 @@ diff --git a/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/brows diff --git a/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/bar/BookmarkBarVisibilityProvider.java b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/bar/BookmarkBarVisibilityProvider.java --- a/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/bar/BookmarkBarVisibilityProvider.java +++ b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/bar/BookmarkBarVisibilityProvider.java -@@ -92,7 +92,7 @@ public class BookmarkBarVisibilityProvider { - mProfileSupplier.addObserver(mProfileSupplierObserver); +@@ -100,7 +100,7 @@ public class BookmarkBarVisibilityProvider { + mXrSpaceModeObservableSupplier.addSyncObserverAndPostIfNonNull(mXrSpaceModeObserver); // On tablets we use local device prefs. - if (!DeviceInfo.isDesktop()) { @@ -800,7 +787,7 @@ diff --git a/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/brows diff --git a/chrome/browser/browser_process_impl.cc b/chrome/browser/browser_process_impl.cc --- a/chrome/browser/browser_process_impl.cc +++ b/chrome/browser/browser_process_impl.cc -@@ -381,7 +381,7 @@ void BrowserProcessImpl::Init() { +@@ -387,7 +387,7 @@ void BrowserProcessImpl::Init() { // TODO(devlin): Move this block out of BrowserProcessImpl to somewhere like // //chrome/browser/initialize_extensions_browser_client, analogous to // `EnsureExtensionsClientInitialized()` above? @@ -821,12 +808,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 -@@ -134,11 +134,11 @@ void ChromeBrowserFieldTrials::RegisterFeatureOverrides( - // Enables the caret browsing a11y feature - can use arrow keys to navigate - // through web pages. - // TODO(crbug.com/369139090): Remove when rollout is complete -- feature_overrides.EnableFeature(features::kAndroidCaretBrowsing); -+ // feature_overrides.EnableFeature(features::kAndroidCaretBrowsing); +@@ -133,7 +133,7 @@ void ChromeBrowserFieldTrials::RegisterFeatureOverrides( // Enable the link hover status bar. // TODO(crbug.com/404678510): Remove when the feature is stable. @@ -835,7 +817,7 @@ diff --git a/chrome/browser/chrome_browser_field_trials.cc b/chrome/browser/chro // If enabled, render processes associated only with tabs in unfocused windows // will be downgraded to "vis" priority, rather than remaining at "fg". This -@@ -149,16 +149,16 @@ void ChromeBrowserFieldTrials::RegisterFeatureOverrides( +@@ -144,24 +144,24 @@ void ChromeBrowserFieldTrials::RegisterFeatureOverrides( // Enable desktop tab management features. // TODO(crbug.com/422902625): Remove when rollout is complete to all form // factors. @@ -855,11 +837,6 @@ diff --git a/chrome/browser/chrome_browser_field_trials.cc b/chrome/browser/chro // TODO(crbug.com/425860368): Remove when the feature is stable. - feature_overrides.EnableFeature(features::kV8AndroidDesktopHighEndConfig); + // feature_overrides.EnableFeature(features::kV8AndroidDesktopHighEndConfig); - // TODO(b/432367402): Use a new Android API to replace this hack with a proper - // solution. - feature_overrides.EnableFeature(features::kAndroidCaptureKeyEvents); -@@ -167,12 +167,12 @@ void ChromeBrowserFieldTrials::RegisterFeatureOverrides( - feature_overrides.EnableFeature(features::kAndroidDevToolsFrontend); // TODO(crbug.com/430304112): Remove when rollout is complete to all form // factors. - feature_overrides.EnableFeature( @@ -871,11 +848,11 @@ diff --git a/chrome/browser/chrome_browser_field_trials.cc b/chrome/browser/chro - feature_overrides.EnableFeature( - chrome::android::kLockTopControlsOnLargeTablets); + // feature_overrides.EnableFeature( -+ // chrome::android::kLockTopControlsOnLargeTablets); ++ // chrome::android::kLockTopControlsOnLargeTablets); // TODO(crbug.com/445446479): Remove when rollout is complete to all form // factors. feature_overrides.EnableFeature( -@@ -180,13 +180,13 @@ void ChromeBrowserFieldTrials::RegisterFeatureOverrides( +@@ -169,13 +169,13 @@ void ChromeBrowserFieldTrials::RegisterFeatureOverrides( // Bypass the WebAudio output buffer, to reduce audio latency. // TODO(crbug.com/436988695): Remove when the long term solution is // implemented. @@ -894,7 +871,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. -@@ -197,48 +197,48 @@ void ChromeBrowserFieldTrials::RegisterFeatureOverrides( +@@ -186,47 +186,47 @@ 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. @@ -911,10 +888,7 @@ diff --git a/chrome/browser/chrome_browser_field_trials.cc b/chrome/browser/chro // Enable by default for desktop platforms, pending a tablet rollout using the // same flag. // TODO(crbug.com/445475304): Remove when tablet rollout is complete. -- feature_overrides.EnableFeature(feed::kAndroidOpenIncognitoAsWindow); -- feature_overrides.EnableFeature(chrome::android::kTabStripIncognitoMigration); -+ // feature_overrides.EnableFeature(feed::kAndroidOpenIncognitoAsWindow); -+ // feature_overrides.EnableFeature(chrome::android::kTabStripIncognitoMigration); + feature_overrides.EnableFeature(feed::kAndroidOpenIncognitoAsWindow); // TODO(crbug.com/427242080): Remove when tablet rollout is complete. - feature_overrides.EnableFeature( - chrome::android::kAndroidPinnedTabsTabletTabStrip); @@ -960,7 +934,7 @@ diff --git a/chrome/browser/chrome_browser_field_trials.cc b/chrome/browser/chro // Enable desktop full screen to a screen feature flag by default for desktop // platforms. -@@ -250,7 +250,7 @@ void ChromeBrowserFieldTrials::RegisterFeatureOverrides( +@@ -238,7 +238,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. @@ -972,7 +946,7 @@ diff --git a/chrome/browser/chrome_browser_field_trials.cc b/chrome/browser/chro 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 -@@ -41,7 +41,7 @@ +@@ -43,7 +43,7 @@ #include "mojo/public/cpp/bindings/binder_map.h" #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \ @@ -981,7 +955,7 @@ diff --git a/chrome/browser/chrome_browser_interface_binders_webui.cc b/chrome/b #include "chrome/browser/ui/webui/discards/discards.mojom.h" #include "chrome/browser/ui/webui/discards/discards_ui.h" #include "chrome/browser/ui/webui/discards/site_data.mojom.h" -@@ -139,7 +139,7 @@ void PopulateChromeWebUIFrameBinders( +@@ -150,7 +150,7 @@ void PopulateChromeWebUIFrameBinders( #endif // BUILDFLAG(IS_CHROMEOS) #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \ @@ -993,7 +967,7 @@ diff --git a/chrome/browser/chrome_browser_interface_binders_webui.cc b/chrome/b diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc --- a/chrome/browser/chrome_content_browser_client.cc +++ b/chrome/browser/chrome_content_browser_client.cc -@@ -4263,7 +4263,7 @@ base::OnceClosure ChromeContentBrowserClient::SelectClientCertificate( +@@ -4308,7 +4308,7 @@ base::OnceClosure ChromeContentBrowserClient::SelectClientCertificate( // TODO(wenz): This should instead proceed with the selected certificate // when there are matching certificates in the OS. #if BUILDFLAG(ENABLE_EXTENSIONS) && \ @@ -1002,10 +976,10 @@ diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/ch if (matching_certificates.empty() && nonmatching_certificates.empty()) { extensions::ProcessMap* process_map = extensions::ProcessMap::Get(profile); -@@ -4495,7 +4495,7 @@ void ChromeContentBrowserClient::OverrideWebPreferences( +@@ -4540,7 +4540,7 @@ void ChromeContentBrowserClient::OverrideWebPreferences( // Fill font preferences. These are not registered on Android unless we're built // with extensions (the chrome.fontSettings API can change these). - // - http://crbug.com/308033, http://crbug.com/696364. + // - http://crbug.com/40337093, http://crbug.com/41304476. -#if !BUILDFLAG(IS_ANDROID) || BUILDFLAG(ENABLE_DESKTOP_ANDROID_EXTENSIONS) +#if !BUILDFLAG(IS_ANDROID) || BUILDFLAG(ENABLE_DESKTOP_ANDROID_EXTENSIONS_CROMITE) // Enabling the FontFamilyCache needs some KeyedService that might not be @@ -1014,7 +988,7 @@ diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/ch diff --git a/chrome/browser/devtools/BUILD.gn b/chrome/browser/devtools/BUILD.gn --- a/chrome/browser/devtools/BUILD.gn +++ b/chrome/browser/devtools/BUILD.gn -@@ -347,7 +347,7 @@ static_library("devtools") { +@@ -354,7 +354,7 @@ static_library("devtools") { } } @@ -1026,7 +1000,7 @@ diff --git a/chrome/browser/devtools/BUILD.gn b/chrome/browser/devtools/BUILD.gn diff --git a/chrome/browser/download/chrome_download_manager_delegate.cc b/chrome/browser/download/chrome_download_manager_delegate.cc --- a/chrome/browser/download/chrome_download_manager_delegate.cc +++ b/chrome/browser/download/chrome_download_manager_delegate.cc -@@ -743,7 +743,7 @@ bool ChromeDownloadManagerDelegate::DetermineDownloadTarget( +@@ -749,7 +749,7 @@ bool ChromeDownloadManagerDelegate::DetermineDownloadTarget( DownloadPathReservationTracker::FilenameConflictAction action = kDefaultPlatformConflictAction; #if BUILDFLAG(IS_ANDROID) @@ -1059,8 +1033,8 @@ diff --git a/chrome/browser/download/download_offline_content_provider.cc b/chro diff --git a/chrome/browser/extensions/BUILD.gn b/chrome/browser/extensions/BUILD.gn --- a/chrome/browser/extensions/BUILD.gn +++ b/chrome/browser/extensions/BUILD.gn -@@ -1727,7 +1727,7 @@ source_set("chrome_extensions_browser_client") { - "//extensions/browser/updater:keepalive", +@@ -1735,7 +1735,7 @@ source_set("chrome_extensions_browser_client") { + "//extensions/browser/updater", ] - if (enable_desktop_android_extensions) { @@ -1068,7 +1042,7 @@ diff --git a/chrome/browser/extensions/BUILD.gn b/chrome/browser/extensions/BUIL sources += [ "chrome_extensions_browser_client_android.cc" ] deps += [ -@@ -1742,6 +1742,16 @@ source_set("chrome_extensions_browser_client") { +@@ -1750,6 +1750,16 @@ source_set("chrome_extensions_browser_client") { "//extensions/browser", "//extensions/browser/kiosk", ] @@ -1108,7 +1082,7 @@ diff --git a/chrome/browser/extensions/api/identity/web_auth_flow.cc b/chrome/br +static_assert(BUILDFLAG(ENABLE_DESKTOP_ANDROID_EXTENSIONS_CROMITE)); #include "base/functional/callback_forward.h" #include "chrome/browser/android/tab_android.h" - #include "chrome/browser/ui/android/tab_model/tab_model.h" + #include "chrome/browser/tab_list/tab_list_interface.h" @@ -166,7 +166,7 @@ void WebAuthFlow::CloseInfoBar() { } } @@ -1151,7 +1125,7 @@ diff --git a/chrome/browser/extensions/api/identity/web_auth_flow.h b/chrome/bro diff --git a/chrome/browser/extensions/extension_management.cc b/chrome/browser/extensions/extension_management.cc --- a/chrome/browser/extensions/extension_management.cc +++ b/chrome/browser/extensions/extension_management.cc -@@ -176,8 +176,12 @@ ManagedInstallationMode ExtensionManagement::GetInstallationMode( +@@ -177,8 +177,12 @@ ManagedInstallationMode ExtensionManagement::GetInstallationMode( update_url ? *update_url : std::string()); } @@ -1165,7 +1139,7 @@ diff --git a/chrome/browser/extensions/extension_management.cc b/chrome/browser/ // If Finch has enabled extensions for corp, allow them. if (base::FeatureList::IsEnabled( extensions_features::kEnableExtensionsForCorpDesktopAndroid)) { -@@ -200,7 +204,7 @@ bool ExtensionManagement::ExtensionsEnabledForDesktopAndroid() const { +@@ -201,7 +205,7 @@ bool ExtensionManagement::ExtensionsEnabledForDesktopAndroid() const { ManagedInstallationMode ExtensionManagement::GetInstallationMode( const ExtensionId& extension_id, const std::string& update_url) { @@ -1189,7 +1163,7 @@ diff --git a/chrome/browser/extensions/extension_management.h b/chrome/browser/e diff --git a/chrome/browser/extensions/extension_util.cc b/chrome/browser/extensions/extension_util.cc --- a/chrome/browser/extensions/extension_util.cc +++ b/chrome/browser/extensions/extension_util.cc -@@ -51,6 +51,10 @@ +@@ -50,6 +50,10 @@ #include "chromeos/ash/components/file_manager/app_id.h" #endif @@ -1200,7 +1174,7 @@ diff --git a/chrome/browser/extensions/extension_util.cc b/chrome/browser/extens static_assert(BUILDFLAG(ENABLE_EXTENSIONS_CORE)); namespace extensions::util { -@@ -351,6 +355,13 @@ void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry) { +@@ -350,6 +354,13 @@ void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry) { bool AreExtensionsDisabled(const base::CommandLine& command_line, content::BrowserContext* context) { @@ -1343,19 +1317,19 @@ diff --git a/chrome/browser/media/webrtc/webrtc_event_log_manager.cc b/chrome/br diff --git a/chrome/browser/policy/policy_value_and_status_aggregator.cc b/chrome/browser/policy/policy_value_and_status_aggregator.cc --- a/chrome/browser/policy/policy_value_and_status_aggregator.cc +++ b/chrome/browser/policy/policy_value_and_status_aggregator.cc -@@ -45,7 +45,7 @@ +@@ -47,7 +47,7 @@ #include "chrome/browser/policy/status_provider/updater_status_and_value_provider.h" #endif // BUILDFLAG(IS_WIN) && BUILDFLAG(GOOGLE_CHROME_BRANDING) -#if BUILDFLAG(ENABLE_EXTENSIONS) +#if BUILDFLAG(ENABLE_EXTENSIONS_CORE) + #include "chrome/browser/policy/cloud/extension_install_policy_service_factory.h" + #include "chrome/browser/policy/value_provider/extension_install_policies_value_provider.h" #include "chrome/browser/policy/value_provider/extension_policies_value_provider.h" - #endif // BUILDFLAG(ENABLE_EXTENSIONS) - diff --git a/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc b/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc --- a/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc +++ b/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc -@@ -649,7 +649,7 @@ void ChromeBrowserMainExtraPartsProfiles:: +@@ -655,7 +655,7 @@ void ChromeBrowserMainExtraPartsProfiles:: chromeos_extensions::EnsureBrowserContextKeyedServiceFactoriesBuilt(); #endif extensions::EnsureBrowserContextKeyedServiceFactoriesBuilt(); @@ -1412,7 +1386,7 @@ diff --git a/chrome/browser/profiles/profile_destroyer.cc b/chrome/browser/profi diff --git a/chrome/browser/resources/BUILD.gn b/chrome/browser/resources/BUILD.gn --- a/chrome/browser/resources/BUILD.gn +++ b/chrome/browser/resources/BUILD.gn -@@ -127,7 +127,7 @@ group("resources") { +@@ -126,7 +126,7 @@ group("resources") { ] } @@ -1554,7 +1528,7 @@ diff --git a/chrome/browser/startup_data.cc b/chrome/browser/startup_data.cc // On desktop Android the ExtensionsBrowserClient is created here because it // must be initialized before BrowserContextKeyedServiceFactories are built. // Some factories use ExtensionsBrowserClient::Get() in their DependsOn(). -@@ -248,7 +248,7 @@ void StartupData::CreateServicesInternal() { +@@ -249,7 +249,7 @@ void StartupData::CreateServicesInternal() { } #endif @@ -1608,7 +1582,7 @@ diff --git a/chrome/browser/task_manager/common/task_manager_features.cc b/chrom diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn --- a/chrome/browser/ui/BUILD.gn +++ b/chrome/browser/ui/BUILD.gn -@@ -683,7 +683,7 @@ static_library("ui") { +@@ -680,7 +680,7 @@ static_library("ui") { } # Desktop-Android-only dependencies. @@ -1617,7 +1591,7 @@ diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn deps += [ "//chrome/browser/ui/android/extensions/windowing/internal" ] } if (is_android) { -@@ -2926,7 +2926,7 @@ static_library("ui") { +@@ -2922,7 +2922,7 @@ static_library("ui") { allow_circular_includes_from += [ "//chrome/browser/ui/wallet" ] } @@ -1719,7 +1693,7 @@ diff --git a/chrome/browser/ui/android/desktop_site/java/src/org/chromium/chrome diff --git a/chrome/browser/ui/android/extensions/BUILD.gn b/chrome/browser/ui/android/extensions/BUILD.gn --- a/chrome/browser/ui/android/extensions/BUILD.gn +++ b/chrome/browser/ui/android/extensions/BUILD.gn -@@ -82,8 +82,8 @@ if (enable_extensions_core) { +@@ -86,8 +86,8 @@ if (enable_extensions_core) { # BuildConfig. java_cpp_template("generate_buildflags") { sources = [ "java/templates/ExtensionsBuildflags.template" ] @@ -1789,7 +1763,7 @@ diff --git a/chrome/browser/ui/android/extensions/extension_actions_bridge.h b/c diff --git a/chrome/browser/ui/android/extensions/java/res/layout/extensions_menu.xml b/chrome/browser/ui/android/extensions/java/res/layout/extensions_menu.xml --- a/chrome/browser/ui/android/extensions/java/res/layout/extensions_menu.xml +++ b/chrome/browser/ui/android/extensions/java/res/layout/extensions_menu.xml -@@ -49,6 +49,7 @@ found in the LICENSE file. +@@ -65,6 +65,7 @@ found in the LICENSE file. GetAllTabsFromHandles(const Container& handles) { +@@ -91,7 +91,7 @@ std::vector GetAllTabsFromHandles(const Container& handles) { return tabs; } @@ -1955,7 +1929,7 @@ diff --git a/chrome/browser/ui/android/tab_model/tab_model_jni_bridge.cc b/chrom AndroidBrowserWindow* GetAndroidBrowserWindow(SessionID session_id) { for (BrowserWindowInterface* window : GetAllBrowserWindowInterfaces()) { if (window->GetSessionID() == session_id) { -@@ -125,7 +125,7 @@ void TabModelJniBridge::AssociateWithBrowserWindow( +@@ -129,7 +129,7 @@ void TabModelJniBridge::AssociateWithBrowserWindow( long native_android_browser_window) { // BrowserWindowInterface is available on desktop Android, but not other Android // builds. For non-desktop Android, this function should be a no-op. @@ -1964,7 +1938,7 @@ diff --git a/chrome/browser/ui/android/tab_model/tab_model_jni_bridge.cc b/chrom BrowserWindowInterface* android_browser_window = reinterpret_cast(native_android_browser_window); CHECK(android_browser_window != nullptr); -@@ -161,7 +161,7 @@ void TabModelJniBridge::MoveTabToWindowForTesting( +@@ -165,7 +165,7 @@ void TabModelJniBridge::MoveTabToWindowForTesting( TabAndroid* tab, long android_browser_window_ptr, int new_index) { @@ -1973,7 +1947,7 @@ diff --git a/chrome/browser/ui/android/tab_model/tab_model_jni_bridge.cc b/chrom SessionID destination_window_id = reinterpret_cast(android_browser_window_ptr) ->GetSessionID(); -@@ -176,7 +176,7 @@ void TabModelJniBridge::MoveTabGroupToWindowForTesting( +@@ -180,7 +180,7 @@ void TabModelJniBridge::MoveTabGroupToWindowForTesting( const base::Token& group_id, long android_browser_window_ptr, int new_index) { @@ -1982,7 +1956,7 @@ diff --git a/chrome/browser/ui/android/tab_model/tab_model_jni_bridge.cc b/chrom SessionID destination_window_id = reinterpret_cast(android_browser_window_ptr) ->GetSessionID(); -@@ -766,7 +766,7 @@ void TabModelJniBridge::MoveTabGroupToWindow(tab_groups::TabGroupId group_id, +@@ -804,7 +804,7 @@ void TabModelJniBridge::MoveTabGroupToWindow(tab_groups::TabGroupId group_id, ScopedJavaLocalRef TabModelJniBridge::GetActivityForWindow( SessionID window_id) { ScopedJavaLocalRef jactivity; @@ -1994,7 +1968,7 @@ diff --git a/chrome/browser/ui/android/tab_model/tab_model_jni_bridge.cc b/chrom diff --git a/chrome/browser/ui/android/tab_model/tab_model_test_helper.h b/chrome/browser/ui/android/tab_model/tab_model_test_helper.h --- a/chrome/browser/ui/android/tab_model/tab_model_test_helper.h +++ b/chrome/browser/ui/android/tab_model/tab_model_test_helper.h -@@ -120,7 +120,7 @@ class TestTabModel : public TabModel { +@@ -124,7 +124,7 @@ class TestTabModel : public TabModel { // BrowserWindowInterface is available on desktop Android, but not other Android // builds. @@ -2019,31 +1993,18 @@ diff --git a/chrome/browser/ui/android/toolbar/java/res/layout/toolbar_phone.xml { + if (!ExtensionUi.isEnabled(profileSupplier.get())) { + container.setVisibility(View.GONE); + } + }); ++ mExtensionActionListCoordinator = new ExtensionActionListCoordinator( context, -@@ -59,7 +66,8 @@ public class ExtensionToolbarCoordinatorImpl implements ExtensionToolbarCoordina - themeColorProvider, - task, +@@ -74,7 +82,8 @@ public class ExtensionToolbarCoordinatorImpl implements ExtensionToolbarCoordina currentTabSupplier, -- tabCreator); -+ tabCreator, + tabCreator, + mExtensionsToolbarBridge, +- container.findViewById(R.id.extensions_request_access_button)); ++ container.findViewById(R.id.extensions_request_access_button), + mExtensionActionListCoordinator); } @@ -2088,7 +2050,7 @@ diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/brow diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/extensions/ExtensionsMenuCoordinator.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/extensions/ExtensionsMenuCoordinator.java --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/extensions/ExtensionsMenuCoordinator.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/extensions/ExtensionsMenuCoordinator.java -@@ -24,6 +24,7 @@ import org.chromium.chrome.browser.tabmodel.TabCreator; +@@ -25,6 +25,7 @@ import org.chromium.chrome.browser.tabmodel.TabCreator; import org.chromium.chrome.browser.theme.ThemeColorProvider; import org.chromium.chrome.browser.toolbar.MenuBuilderHelper; import org.chromium.chrome.browser.ui.browser_window.ChromeAndroidTask; @@ -2096,71 +2058,34 @@ diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/brow import org.chromium.chrome.browser.ui.extensions.R; import org.chromium.chrome.browser.ui.theme.BrandedColorScheme; import org.chromium.components.embedder_support.util.UrlConstants; -@@ -76,7 +77,8 @@ public class ExtensionsMenuCoordinator implements Destroyable { - ThemeColorProvider themeColorProvider, +@@ -61,6 +62,7 @@ public class ExtensionsMenuCoordinator implements Destroyable { + private final ChromeAndroidTask mTask; + + private final ThemeColorProvider.TintObserver mTintObserver = this::onTintChanged; ++ private final ExtensionActionListCoordinator mExtensionActionListCoordinator; + + @Nullable @VisibleForTesting ExtensionsMenuMediator mMediator; + +@@ -81,7 +83,9 @@ public class ExtensionsMenuCoordinator implements Destroyable { ChromeAndroidTask task, + Profile profile, NullableObservableSupplier currentTabSupplier, - TabCreator tabCreator) { + TabCreator tabCreator, + ExtensionActionListCoordinator extensionActionListCoordinator) { ++ mExtensionActionListCoordinator = extensionActionListCoordinator; mContext = context; mCurrentTabSupplier = currentTabSupplier; - mTabCreator = tabCreator; -@@ -117,6 +119,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, -@@ -124,30 +141,9 @@ 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; -- } - }, -- mExtensionsMenuButton.getRootView()); -+ mExtensionsMenuButton.getRootView(), -+ extensionActionListCoordinator); + mProfile = profile; +@@ -179,7 +183,7 @@ public class ExtensionsMenuCoordinator implements Destroyable { + mExtensionsMenuButton.getRootView(), + /* onReady= */ () -> { + mExtensionsMenuButton.showMenu(); +- }); ++ }, mExtensionActionListCoordinator); } - private void openUrlFromMenu(String url) { + /** diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/extensions/ExtensionsMenuItemProperties.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/extensions/ExtensionsMenuItemProperties.java --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/extensions/ExtensionsMenuItemProperties.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/extensions/ExtensionsMenuItemProperties.java @@ -2192,45 +2117,43 @@ diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/brow diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/extensions/ExtensionsMenuMediator.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/extensions/ExtensionsMenuMediator.java --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/extensions/ExtensionsMenuMediator.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/extensions/ExtensionsMenuMediator.java -@@ -15,6 +15,7 @@ import org.chromium.build.annotations.NullMarked; +@@ -14,6 +14,7 @@ import org.chromium.build.annotations.NullMarked; import org.chromium.chrome.browser.extensions.ContextMenuSource; + import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.tab.Tab; - import org.chromium.chrome.browser.ui.browser_window.ChromeAndroidTask; +import org.chromium.chrome.browser.toolbar.extensions.ExtensionActionListCoordinator; - import org.chromium.chrome.browser.ui.extensions.ExtensionAction; + import org.chromium.chrome.browser.ui.browser_window.ChromeAndroidTask; import org.chromium.chrome.browser.ui.extensions.ExtensionActionContextMenuBridge; - import org.chromium.chrome.browser.ui.extensions.ExtensionActionsBridge; -@@ -37,6 +38,7 @@ class ExtensionsMenuMediator implements Destroyable { - private final Runnable mOnUpdateFinishedRunnable; - private final ExtensionActionsUpdateHelper mExtensionActionsUpdateHelper; + import org.chromium.chrome.browser.ui.extensions.ExtensionsMenuBridge; +@@ -39,6 +40,7 @@ class ExtensionsMenuMediator implements Destroyable, ExtensionsMenuBridge.Observ + private final ChromeAndroidTask mTask; + private final Profile mProfile; private final View mRootView; + private final ExtensionActionListCoordinator mExtensionActionListCoordinator; - public ExtensionsMenuMediator( - Context context, -@@ -44,9 +46,10 @@ class ExtensionsMenuMediator implements Destroyable { - NullableObservableSupplier currentTabSupplier, - ModelList extensionModels, - Runnable onUpdateFinishedRunnable, -- View rootView) { -+ View rootView, + /** + * @param context The context to use. +@@ -56,7 +58,9 @@ class ExtensionsMenuMediator implements Destroyable, ExtensionsMenuBridge.Observ + ModelList actionModels, + PropertyModel propertyModel, + View rootView, +- Runnable onReady) { ++ Runnable onReady, + ExtensionActionListCoordinator extensionActionListCoordinator) { - mTask = task; -- + mExtensionActionListCoordinator = extensionActionListCoordinator; - mOnUpdateFinishedRunnable = onUpdateFinishedRunnable; + mActionModels = actionModels; mContext = context; - mRootView = rootView; -@@ -136,6 +139,9 @@ class ExtensionsMenuMediator implements Destroyable { + mCurrentTabSupplier = currentTabSupplier; +@@ -158,6 +162,9 @@ class ExtensionsMenuMediator implements Destroyable, ExtensionsMenuBridge.Observ + PropertyModel model = new PropertyModel.Builder(ExtensionsMenuItemProperties.ALL_KEYS) - .with(ExtensionsMenuItemProperties.TITLE, action.getTitle()) - .with(ExtensionsMenuItemProperties.ICON, icon) + .with(ExtensionsMenuItemProperties.TITLE, name) + .with( + ExtensionsMenuItemProperties.ITEM_CLICK_LISTENER, + (view) -> mExtensionActionListCoordinator.click(actionId)) .with( ExtensionsMenuItemProperties.CLICK_LISTENER, - (view) -> onPrimaryClick((ListMenuButton) view, actionId)) + (view) -> onContextMenuButtonClicked((ListMenuButton) view, id)) diff --git a/chrome/browser/ui/browser_window/internal/android/java/src/org/chromium/chrome/browser/ui/browser_window/ChromeAndroidTaskTrackerFactory.java b/chrome/browser/ui/browser_window/internal/android/java/src/org/chromium/chrome/browser/ui/browser_window/ChromeAndroidTaskTrackerFactory.java --- a/chrome/browser/ui/browser_window/internal/android/java/src/org/chromium/chrome/browser/ui/browser_window/ChromeAndroidTaskTrackerFactory.java +++ b/chrome/browser/ui/browser_window/internal/android/java/src/org/chromium/chrome/browser/ui/browser_window/ChromeAndroidTaskTrackerFactory.java @@ -2240,7 +2163,7 @@ diff --git a/chrome/browser/ui/browser_window/internal/android/java/src/org/chro public static ChromeAndroidTaskTracker getInstance() { - // TODO(crbug.com/473636857): Remove once this is properly implemented on non-desktop - // platforms. -- if (!DeviceInfo.isDesktop()) return null; +- if (!BuildConfig.IS_DESKTOP_ANDROID) return null; - return ChromeAndroidTaskTrackerImpl.getInstance(); } @@ -2308,7 +2231,7 @@ diff --git a/chrome/browser/ui/prefs/prefs_tab_helper.cc b/chrome/browser/ui/pre diff --git a/chrome/browser/ui/webui/chrome_web_ui_configs.cc b/chrome/browser/ui/webui/chrome_web_ui_configs.cc --- a/chrome/browser/ui/webui/chrome_web_ui_configs.cc +++ b/chrome/browser/ui/webui/chrome_web_ui_configs.cc -@@ -182,7 +182,7 @@ +@@ -181,7 +181,7 @@ // BUILDFLAG(IS_ANDROID) #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \ @@ -2317,7 +2240,7 @@ diff --git a/chrome/browser/ui/webui/chrome_web_ui_configs.cc b/chrome/browser/u #include "chrome/browser/ui/webui/discards/discards_ui.h" #endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || // BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_DESKTOP_ANDROID) -@@ -415,7 +415,7 @@ void RegisterChromeWebUIConfigs() { +@@ -422,7 +422,7 @@ void RegisterChromeWebUIConfigs() { // BUILDFLAG(IS_ANDROID) #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \ @@ -2329,11 +2252,12 @@ diff --git a/chrome/browser/ui/webui/chrome_web_ui_configs.cc b/chrome/browser/u diff --git a/chrome/browser/ui/webui/current_channel_logo.cc b/chrome/browser/ui/webui/current_channel_logo.cc --- a/chrome/browser/ui/webui/current_channel_logo.cc +++ b/chrome/browser/ui/webui/current_channel_logo.cc -@@ -26,7 +26,7 @@ int CurrentChannelLogoResourceId() { +@@ -28,8 +28,7 @@ int CurrentChannelLogoResourceId() { case version_info::Channel::DEV: case version_info::Channel::BETA: case version_info::Channel::STABLE: -- NOTREACHED(); +- CHECK_IS_TEST(); +- [[fallthrough]]; + return IDR_PRODUCT_LOGO_32; #endif case version_info::Channel::UNKNOWN: @@ -2380,7 +2304,7 @@ diff --git a/chrome/browser/ui/webui/discards/discards_ui.cc b/chrome/browser/ui diff --git a/chrome/chrome_paks.gni b/chrome/chrome_paks.gni --- a/chrome/chrome_paks.gni +++ b/chrome/chrome_paks.gni -@@ -512,7 +512,7 @@ template("chrome_extra_paks") { +@@ -516,7 +516,7 @@ template("chrome_extra_paks") { deps += [ "//chrome/browser/resources/app_settings:resources" ] } @@ -2392,7 +2316,7 @@ diff --git a/chrome/chrome_paks.gni b/chrome/chrome_paks.gni diff --git a/chrome/common/chrome_switches.cc b/chrome/common/chrome_switches.cc --- a/chrome/common/chrome_switches.cc +++ b/chrome/common/chrome_switches.cc -@@ -802,7 +802,7 @@ const char kMarketUrlForTesting[] = "market-url-for-testing"; +@@ -809,7 +809,7 @@ const char kMarketUrlForTesting[] = "market-url-for-testing"; const char kRequestDesktopSites[] = "request-desktop-sites"; #endif // BUILDFLAG(IS_ANDROID) @@ -2404,7 +2328,7 @@ diff --git a/chrome/common/chrome_switches.cc b/chrome/common/chrome_switches.cc diff --git a/chrome/common/chrome_switches.h b/chrome/common/chrome_switches.h --- a/chrome/common/chrome_switches.h +++ b/chrome/common/chrome_switches.h -@@ -238,7 +238,7 @@ extern const char kMarketUrlForTesting[]; +@@ -240,7 +240,7 @@ extern const char kMarketUrlForTesting[]; extern const char kRequestDesktopSites[]; #endif // BUILDFLAG(IS_ANDROID) @@ -2416,7 +2340,7 @@ diff --git a/chrome/common/chrome_switches.h b/chrome/common/chrome_switches.h diff --git a/chrome/common/extensions/api/api_sources.gni b/chrome/common/extensions/api/api_sources.gni --- a/chrome/common/extensions/api/api_sources.gni +++ b/chrome/common/extensions/api/api_sources.gni -@@ -68,6 +68,13 @@ uncompiled_sources_ = [ +@@ -73,6 +73,13 @@ uncompiled_sources_ = [ "top_sites.json", ] @@ -2433,7 +2357,7 @@ diff --git a/chrome/common/extensions/api/api_sources.gni b/chrome/common/extens diff --git a/chrome/common/webui_url_constants.cc b/chrome/common/webui_url_constants.cc --- a/chrome/common/webui_url_constants.cc +++ b/chrome/common/webui_url_constants.cc -@@ -207,7 +207,7 @@ base::span ChromeURLHosts() { +@@ -208,7 +208,7 @@ base::span ChromeURLHosts() { kChromeUIInternetDetailDialogHost, #endif #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \ @@ -2445,7 +2369,7 @@ diff --git a/chrome/common/webui_url_constants.cc b/chrome/common/webui_url_cons diff --git a/chrome/common/webui_url_constants.h b/chrome/common/webui_url_constants.h --- a/chrome/common/webui_url_constants.h +++ b/chrome/common/webui_url_constants.h -@@ -562,7 +562,7 @@ inline constexpr char kChromeUIOsUrlAppURL[] = "chrome://internal/"; +@@ -566,7 +566,7 @@ inline constexpr char kChromeUIOsUrlAppURL[] = "chrome://internal/"; #endif // BUILDFLAG(IS_CHROMEOS) #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \ @@ -2488,7 +2412,7 @@ diff --git a/chrome/renderer/sandbox_status_extension_android.h b/chrome/rendere diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn --- a/chrome/test/BUILD.gn +++ b/chrome/test/BUILD.gn -@@ -366,7 +366,7 @@ static_library("test_support") { +@@ -371,7 +371,7 @@ static_library("test_support") { ] } @@ -2497,7 +2421,7 @@ diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn public_deps += [ "//extensions/browser:test_support", "//extensions/common:test_support", -@@ -479,7 +479,7 @@ static_library("test_support") { +@@ -483,7 +483,7 @@ static_library("test_support") { # TODO(https://crbug.com/356905053): Continue pulling more common test # support pieces into here and eventually merge this with the # `enable_extensions` block above. @@ -2506,7 +2430,7 @@ diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn deps += [ "//chrome/renderer/extensions" ] public_deps += [ -@@ -1555,7 +1555,7 @@ source_set("platform_browser_tests") { +@@ -1563,7 +1563,7 @@ source_set("platform_browser_tests") { sources += [ "../browser/enterprise/remote_commands/user_remote_commands_service_browsertest.cc" ] } @@ -2515,16 +2439,16 @@ diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn deps += [ "//chrome/browser/ui/prefs:browser_tests" ] } -@@ -1827,7 +1827,7 @@ source_set("platform_browser_tests") { - "//chrome/browser/ui/browser_window", - ] +@@ -1854,7 +1854,7 @@ source_set("platform_browser_tests") { + if (enable_guest_view) { + deps += [ "//components/guest_view/browser" ] } - if (!is_android || enable_desktop_android_extensions) { + if (!is_android || enable_desktop_android_extensions_cromite) { sources += [ "../browser/devtools/global_confirm_info_bar_browsertest.cc" ] } -@@ -2120,7 +2120,7 @@ if (is_android) { +@@ -2153,7 +2153,7 @@ if (is_android) { extra_args = [] # TODO(crbug.com/473636857): Include once all Android builds correctly use BrowserWindowInterface. @@ -2532,8 +2456,8 @@ diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn + if (is_desktop_android_cromite) { sources += [ "../browser/ui/android/browser_navigator_android_browsertest.cc" ] - deps += -@@ -2214,7 +2214,7 @@ if (is_android) { + deps += [ +@@ -2249,7 +2249,7 @@ if (is_android) { ] } @@ -2542,7 +2466,7 @@ diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn sources += [ # These API tests can't be part of platform_browser_tests because they # run in interactive_ui_tests on Win/Mac/Linux. -@@ -8114,7 +8114,7 @@ test("unit_tests") { +@@ -8186,7 +8186,7 @@ test("unit_tests") { deps += [ "//chrome/browser/android/extensions:android" ] } @@ -2575,7 +2499,7 @@ diff --git a/chrome/version.gni b/chrome/version.gni diff --git a/components/content_settings/core/browser/host_content_settings_map.cc b/components/content_settings/core/browser/host_content_settings_map.cc --- a/components/content_settings/core/browser/host_content_settings_map.cc +++ b/components/content_settings/core/browser/host_content_settings_map.cc -@@ -328,6 +328,12 @@ HostContentSettingsMap::HostContentSettingsMap(PrefService* prefs, +@@ -327,6 +327,12 @@ HostContentSettingsMap::HostContentSettingsMap(PrefService* prefs, RecordExceptionMetrics(); } @@ -2603,7 +2527,7 @@ diff --git a/components/embedder_support/android/java/src/org/chromium/component diff --git a/components/embedder_support/user_agent_utils.cc b/components/embedder_support/user_agent_utils.cc --- a/components/embedder_support/user_agent_utils.cc +++ b/components/embedder_support/user_agent_utils.cc -@@ -321,7 +321,7 @@ std::string GetUnifiedPlatform() { +@@ -304,7 +304,7 @@ std::string GetUnifiedPlatform() { #if BUILDFLAG(IS_ANDROID) // The Android XR device by default also has the unified platform of desktop // form factor. @@ -2612,7 +2536,7 @@ diff --git a/components/embedder_support/user_agent_utils.cc b/components/embedd base::android::device_info::is_xr()) { return kUnifiedPlatformLinuxX64; } -@@ -580,7 +580,7 @@ bool GetMobileBitForUAMetadata() { +@@ -563,7 +563,7 @@ bool GetMobileBitForUAMetadata() { // Android and not a desktop form factor, AND the kUseMobileUserAgent switch // is present. #if BUILDFLAG(IS_ANDROID) @@ -2621,7 +2545,7 @@ diff --git a/components/embedder_support/user_agent_utils.cc b/components/embedd base::android::device_info::is_xr()) { return false; } -@@ -603,7 +603,7 @@ std::string GetPlatformVersion() { +@@ -586,7 +586,7 @@ std::string GetPlatformVersion() { #endif #if BUILDFLAG(IS_ANDROID) @@ -2630,16 +2554,16 @@ diff --git a/components/embedder_support/user_agent_utils.cc b/components/embedd base::android::device_info::is_xr()) { return std::string(); } -@@ -623,7 +623,7 @@ std::string GetPlatformVersion() { +@@ -606,7 +606,7 @@ std::string GetPlatformVersion() { std::string GetPlatformForUAMetadata() { #if BUILDFLAG(IS_ANDROID) - if (base::android::device_info::is_desktop() || + if (base::android::device_info::is_desktop_false() || base::android::device_info::is_xr()) { - return "Linux"; - } -@@ -743,7 +743,7 @@ std::string GetCpuArchitecture() { + return base::FeatureList::IsEnabled( + blink::features::kAndroidDesktopUAPlatform) +@@ -729,7 +729,7 @@ std::string GetCpuArchitecture() { // TODO(crbug.com/433345971) The user agent string should contain the actual // cpu type information obtained from the Android device. Same for the cpu bit // count in #GetCpuBitness below. @@ -2648,7 +2572,7 @@ diff --git a/components/embedder_support/user_agent_utils.cc b/components/embedd base::android::device_info::is_xr()) { return "x86"; } -@@ -783,7 +783,7 @@ std::string GetCpuBitness() { +@@ -769,7 +769,7 @@ std::string GetCpuBitness() { #elif BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_FUCHSIA) return "64"; #elif BUILDFLAG(IS_ANDROID) @@ -2657,7 +2581,7 @@ diff --git a/components/embedder_support/user_agent_utils.cc b/components/embedd base::android::device_info::is_xr()) { return "64"; } -@@ -857,7 +857,7 @@ std::string BuildModelInfo() { +@@ -843,7 +843,7 @@ std::string BuildModelInfo() { if ((true)) return std::string(); #if BUILDFLAG(IS_ANDROID) // Model information is not exposed on Android desktop. @@ -2769,7 +2693,7 @@ diff --git a/components/policy/core/browser/cloud/user_policy_signin_service_bas diff --git a/components/policy/core/browser/configuration_policy_handler_list.cc b/components/policy/core/browser/configuration_policy_handler_list.cc --- a/components/policy/core/browser/configuration_policy_handler_list.cc +++ b/components/policy/core/browser/configuration_policy_handler_list.cc -@@ -144,7 +144,7 @@ bool ConfigurationPolicyHandlerList::IsBlockedFuturePolicy( +@@ -173,7 +173,7 @@ bool ConfigurationPolicyHandlerList::IsBlockedFuturePolicy( const base::flat_set& future_policies_allowed, const PolicyDetails& policy_details, PolicyMap::const_reference entry) const { @@ -2793,15 +2717,15 @@ diff --git a/components/policy/core/common/cloud/cloud_policy_constants.cc b/com diff --git a/components/policy/core/common/features.cc b/components/policy/core/common/features.cc --- a/components/policy/core/common/features.cc +++ b/components/policy/core/common/features.cc -@@ -40,7 +40,7 @@ BASE_FEATURE(kSafeSitesCaptivePortalCheck, base::FEATURE_ENABLED_BY_DEFAULT); +@@ -39,7 +39,7 @@ const base::FeatureParam kPolicyRegistrationDelay{ + // Used to add a captive portal check in SafeSitesNavigationThrottle. + BASE_FEATURE(kSafeSitesCaptivePortalCheck, base::FEATURE_ENABLED_BY_DEFAULT); - // TODO(https://crbug.com/452666657): Remove this feature flag after launching - // policies to supported on Android Desktop. -#if BUILDFLAG(IS_DESKTOP_ANDROID) +#if BUILDFLAG(IS_DESKTOP_ANDROID_CROMITE) + // TODO(https://crbug.com/452666657): Remove this feature flag after launching + // policies to supported on Android Desktop. BASE_FEATURE(kFuturePoliciesOnDesktopAndroid, - base::FEATURE_DISABLED_BY_DEFAULT); - #endif // BUILDFLAG(IS_DESKTOP_ANDROID) diff --git a/components/policy/core/common/policy_merger.cc b/components/policy/core/common/policy_merger.cc --- a/components/policy/core/common/policy_merger.cc +++ b/components/policy/core/common/policy_merger.cc @@ -2835,7 +2759,7 @@ diff --git a/components/webapps/browser/installable/installable_icon_fetcher.cc // Generates a homescreen icon for `page_url` and posts a task to invoke // `callback` on `ui_thread_task_runner.` void GenerateHomeScreenIconInBackground( -@@ -253,7 +253,7 @@ void InstallableIconFetcher::OnIconFetched(const GURL& icon_url, +@@ -261,7 +261,7 @@ void InstallableIconFetcher::OnIconFetched(const GURL& icon_url, } void InstallableIconFetcher::MaybeEndWithError(InstallableStatusCode code) { @@ -2844,7 +2768,7 @@ diff --git a/components/webapps/browser/installable/installable_icon_fetcher.cc // Desktop android will generate an icon if none is available. base::ThreadPool::PostTask( FROM_HERE, -@@ -277,7 +277,7 @@ void InstallableIconFetcher::EndWithError(InstallableStatusCode code) { +@@ -285,7 +285,7 @@ void InstallableIconFetcher::EndWithError(InstallableStatusCode code) { std::move(finish_callback_).Run(code); } @@ -2906,7 +2830,7 @@ diff --git a/content/browser/android/selection/selection_popup_controller.h b/co diff --git a/content/browser/browser_main_loop.cc b/content/browser/browser_main_loop.cc --- a/content/browser/browser_main_loop.cc +++ b/content/browser/browser_main_loop.cc -@@ -851,7 +851,7 @@ int BrowserMainLoop::PreCreateThreads() { +@@ -849,7 +849,7 @@ int BrowserMainLoop::PreCreateThreads() { base::UmaHistogramBoolean("SiteIsolation.IsSitePerProcessOrStricter", SiteIsolationPolicy::IsSitePerProcessOrStricter()); @@ -2918,7 +2842,7 @@ diff --git a/content/browser/browser_main_loop.cc b/content/browser/browser_main diff --git a/content/browser/renderer_host/media/video_capture_manager.cc b/content/browser/renderer_host/media/video_capture_manager.cc --- a/content/browser/renderer_host/media/video_capture_manager.cc +++ b/content/browser/renderer_host/media/video_capture_manager.cc -@@ -121,7 +121,7 @@ void VideoCaptureManager::RegisterListener( +@@ -120,7 +120,7 @@ void VideoCaptureManager::RegisterListener( DCHECK_CURRENTLY_ON(BrowserThread::IO); DCHECK(listener); listeners_.AddObserver(listener); @@ -2927,7 +2851,7 @@ diff --git a/content/browser/renderer_host/media/video_capture_manager.cc b/cont application_state_has_running_activities_ = true; app_status_listener_ = base::android::ApplicationStatusListener::New(base::BindRepeating( -@@ -953,7 +953,7 @@ VideoCaptureManager::GetOrCreateController( +@@ -952,7 +952,7 @@ VideoCaptureManager::GetOrCreateController( return new_controller; } @@ -2969,7 +2893,7 @@ diff --git a/content/browser/renderer_host/media/video_capture_manager.h b/conte diff --git a/content/browser/renderer_host/render_widget_host_view_android.cc b/content/browser/renderer_host/render_widget_host_view_android.cc --- a/content/browser/renderer_host/render_widget_host_view_android.cc +++ b/content/browser/renderer_host/render_widget_host_view_android.cc -@@ -183,7 +183,7 @@ bool IsTooltipsEnabled() { +@@ -184,7 +184,7 @@ bool IsTooltipsEnabled() { // Only show on desktop devices up to B due to tooltips bug b/445244223. if (base::android::android_info::sdk_int() <= base::android::android_info::SDK_VERSION_BAKLAVA) { @@ -2998,7 +2922,7 @@ diff --git a/content/public/android/java/src/org/chromium/content/browser/Conten diff --git a/content/public/android/java/src/org/chromium/content/browser/selection/SelectionPopupControllerImpl.java b/content/public/android/java/src/org/chromium/content/browser/selection/SelectionPopupControllerImpl.java --- a/content/public/android/java/src/org/chromium/content/browser/selection/SelectionPopupControllerImpl.java +++ b/content/public/android/java/src/org/chromium/content/browser/selection/SelectionPopupControllerImpl.java -@@ -758,6 +758,9 @@ public class SelectionPopupControllerImpl extends ActionModeCallbackHelper +@@ -762,6 +762,9 @@ public class SelectionPopupControllerImpl extends ActionModeCallbackHelper */ @Override public void finishActionMode() { @@ -3008,7 +2932,7 @@ diff --git a/content/public/android/java/src/org/chromium/content/browser/select mHidden = false; mHandler.removeCallbacks(mRepeatingHideRunnable); -@@ -1964,6 +1967,8 @@ public class SelectionPopupControllerImpl extends ActionModeCallbackHelper +@@ -1976,6 +1979,8 @@ public class SelectionPopupControllerImpl extends ActionModeCallbackHelper void setTextHandlesTemporarilyHidden(long nativeSelectionPopupController, boolean hidden); @@ -3020,7 +2944,7 @@ diff --git a/content/public/android/java/src/org/chromium/content/browser/select diff --git a/content/public/common/content_features.cc b/content/public/common/content_features.cc --- a/content/public/common/content_features.cc +++ b/content/public/common/content_features.cc -@@ -591,7 +591,7 @@ BASE_FEATURE(kLoadingPredictorLimitPreconnectSocketCount, +@@ -588,7 +588,7 @@ BASE_FEATURE(kLoadingPredictorLimitPreconnectSocketCount, base::FEATURE_DISABLED_BY_DEFAULT); BASE_FEATURE(kLogJsConsoleMessages, @@ -3095,7 +3019,7 @@ diff --git a/extensions/browser/BUILD.gn b/extensions/browser/BUILD.gn import("//build/config/android/rules.gni") } -@@ -1168,7 +1168,7 @@ source_set("unit_tests") { +@@ -1186,7 +1186,7 @@ source_set("unit_tests") { configs += [ "//build/config/compiler:no_exit_time_destructors" ] } @@ -3119,7 +3043,7 @@ diff --git a/extensions/browser/api/api_browser_context_keyed_service_factories. diff --git a/extensions/browser/api/system_cpu/BUILD.gn b/extensions/browser/api/system_cpu/BUILD.gn --- a/extensions/browser/api/system_cpu/BUILD.gn +++ b/extensions/browser/api/system_cpu/BUILD.gn -@@ -34,7 +34,7 @@ source_set("system_cpu") { +@@ -36,7 +36,7 @@ source_set("system_cpu") { sources += [ "cpu_info_provider_mac.cc" ] } @@ -3241,7 +3165,7 @@ diff --git a/extensions/buildflags/buildflags.gni b/extensions/buildflags/buildf diff --git a/extensions/common/api/schema.gni b/extensions/common/api/schema.gni --- a/extensions/common/api/schema.gni +++ b/extensions/common/api/schema.gni -@@ -104,7 +104,7 @@ if (enable_extensions) { +@@ -110,7 +110,7 @@ if (enable_extensions) { # the C++ types for certain APIs, since they are used from outside the # extensions layer. These should be removed as we add support for the full # API by moving these entries to the `extensions_api_schema_files_` above. @@ -3265,7 +3189,7 @@ diff --git a/extensions/common/command.cc b/extensions/common/command.cc diff --git a/extensions/common/extension_features.cc b/extensions/common/extension_features.cc --- a/extensions/common/extension_features.cc +++ b/extensions/common/extension_features.cc -@@ -58,7 +58,7 @@ BASE_FEATURE(kSkipResetServiceWorkerURLLoaderFactories, +@@ -60,7 +60,7 @@ BASE_FEATURE(kSkipResetServiceWorkerURLLoaderFactories, BASE_FEATURE(kEnableWebHidInWebView, base::FEATURE_ENABLED_BY_DEFAULT); @@ -3274,7 +3198,7 @@ diff --git a/extensions/common/extension_features.cc b/extensions/common/extensi // Disabled by default because on first-run we don't have a Finch seed yet, so // we want to default to the safe behavior of no extensions. BASE_FEATURE(kEnableExtensionsForCorpDesktopAndroid, -@@ -148,7 +148,7 @@ BASE_FEATURE(kDisableExtensionsOnChromeUrlsSwitch, +@@ -177,7 +177,7 @@ BASE_FEATURE(kDisableExtensionsOnChromeUrlsSwitch, // TODO (crbug.com/426554244): Determine if this switch should be // removed for desktop-android builds as well. #if BUILDFLAG(GOOGLE_CHROME_BRANDING) && !BUILDFLAG(IS_CHROMEOS) && \ @@ -3283,7 +3207,7 @@ diff --git a/extensions/common/extension_features.cc b/extensions/common/extensi base::FEATURE_ENABLED_BY_DEFAULT #else base::FEATURE_DISABLED_BY_DEFAULT -@@ -193,4 +193,10 @@ CROMITE_FEATURE(kEnableExtensionAutoupdate, +@@ -225,4 +225,10 @@ CROMITE_FEATURE(kEnableExtensionAutoupdate, CROMITE_FEATURE(kEnableExtensionManagementToChromeStore, "EnableExtensionToChromeStore", base::FEATURE_DISABLED_BY_DEFAULT); @@ -3297,7 +3221,7 @@ diff --git a/extensions/common/extension_features.cc b/extensions/common/extensi diff --git a/extensions/common/extension_features.h b/extensions/common/extension_features.h --- a/extensions/common/extension_features.h +++ b/extensions/common/extension_features.h -@@ -100,7 +100,7 @@ BASE_DECLARE_FEATURE(kSkipResetServiceWorkerURLLoaderFactories); +@@ -103,7 +103,7 @@ BASE_DECLARE_FEATURE(kSkipResetServiceWorkerURLLoaderFactories); // embedding Chrome App to request access to Human Interface Devices. BASE_DECLARE_FEATURE(kEnableWebHidInWebView); @@ -3306,7 +3230,7 @@ diff --git a/extensions/common/extension_features.h b/extensions/common/extensio // If enabled, extensions will be enabled for @google.com and @managedchrome.com // users on desktop Android. Otherwise they will be blocked. BASE_DECLARE_FEATURE(kEnableExtensionsForCorpDesktopAndroid); -@@ -320,6 +320,10 @@ BASE_DECLARE_FEATURE(kEnableExtensionAutoupdate); +@@ -343,6 +343,10 @@ BASE_DECLARE_FEATURE(kEnableExtensionAutoupdate); // Allows the installation of new extensions. // If active, exposes all features to the chrome web store like chromium. BASE_DECLARE_FEATURE(kEnableExtensionManagementToChromeStore); @@ -3383,7 +3307,7 @@ diff --git a/extensions/renderer/bindings/api_binding_util.cc b/extensions/rende diff --git a/gpu/config/gpu_finch_features.cc b/gpu/config/gpu_finch_features.cc --- a/gpu/config/gpu_finch_features.cc +++ b/gpu/config/gpu_finch_features.cc -@@ -586,7 +586,7 @@ bool IsSkiaGraphiteSupportedByDevice(const base::CommandLine* command_line) { +@@ -607,7 +607,7 @@ bool IsSkiaGraphiteSupportedByDevice(const base::CommandLine* command_line) { // Desktop Android isn't ready to pick up the fieldtrial_testing_config.json // change that enables graphite. However, it's the same platform as regular // Android and does. Skip enabling the feature there for now. @@ -3392,7 +3316,7 @@ diff --git a/gpu/config/gpu_finch_features.cc b/gpu/config/gpu_finch_features.cc return false; } -@@ -699,7 +699,7 @@ bool ShouldEnableDrDc() { +@@ -720,7 +720,7 @@ bool ShouldEnableDrDc() { // Chrome on Android desktop aims to be Vulkan-only, which can result // in crashes when enabled together with DrDc. Re-enable DrDc after // crbug.com/380295059 is fixed if it is shown beneficial on desktop. @@ -3430,7 +3354,7 @@ diff --git a/skia/features.gni b/skia/features.gni diff --git a/third_party/blink/common/features.cc b/third_party/blink/common/features.cc --- a/third_party/blink/common/features.cc +++ b/third_party/blink/common/features.cc -@@ -2336,7 +2336,7 @@ BASE_FEATURE(kStopInBackground, +@@ -2365,7 +2365,7 @@ BASE_FEATURE(kStopInBackground, // b/248036988 - Disable this for Chromecast on Android builds to prevent apps // that play audio in the background from stopping. #if BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_CAST_ANDROID) && \ @@ -3614,7 +3538,7 @@ diff --git a/ui/webui/resources/cr_elements/BUILD.gn b/ui/webui/resources/cr_ele --- a/ui/webui/resources/cr_elements/BUILD.gn +++ b/ui/webui/resources/cr_elements/BUILD.gn @@ -49,7 +49,7 @@ build_webui("build") { - "cr_icon_button/cr_icon_button.css", + "cr_tabs/cr_tabs.css", ] - if ((!is_ios) || is_desktop_android) { diff --git a/build/patches/Guard-for-user-agent-reduction.patch b/build/patches/Guard-for-user-agent-reduction.patch index 98ba63ca..2b52bd7f 100644 --- a/build/patches/Guard-for-user-agent-reduction.patch +++ b/build/patches/Guard-for-user-agent-reduction.patch @@ -4,14 +4,14 @@ Subject: Guard for user-agent reduction License: GPL-3.0-only - https://spdx.org/licenses/GPL-3.0-only.html --- - components/embedder_support/user_agent_utils.cc | 5 +++++ - .../platform/runtime_enabled_features.json5 | 14 +++++++------- - 2 files changed, 12 insertions(+), 7 deletions(-) + components/embedder_support/user_agent_utils.cc | 5 +++++ + .../renderer/platform/runtime_enabled_features.json5 | 8 ++++---- + 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/components/embedder_support/user_agent_utils.cc b/components/embedder_support/user_agent_utils.cc --- a/components/embedder_support/user_agent_utils.cc +++ b/components/embedder_support/user_agent_utils.cc -@@ -855,6 +855,7 @@ std::string BuildUserAgentFromProduct(const std::string& product) { +@@ -841,6 +841,7 @@ std::string BuildUserAgentFromProduct(const std::string& product) { } std::string BuildModelInfo() { @@ -19,7 +19,7 @@ diff --git a/components/embedder_support/user_agent_utils.cc b/components/embedd #if BUILDFLAG(IS_ANDROID) // Model information is not exposed on Android desktop. if (base::android::device_info::is_desktop()) { -@@ -897,6 +898,10 @@ std::string GetAndroidOSInfo( +@@ -883,6 +884,10 @@ std::string GetAndroidOSInfo( IncludeAndroidModel include_android_model) { std::string android_info_str; @@ -33,17 +33,7 @@ diff --git a/components/embedder_support/user_agent_utils.cc b/components/embedd diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5 --- a/third_party/blink/renderer/platform/runtime_enabled_features.json5 +++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5 -@@ -4240,22 +4240,22 @@ - // If enabled, the deviceModel will be reduced to "K" and the - // androidVersion will be reduced to a static "10" string in android - // User-Agent string. -- name: "ReduceUserAgentAndroidVersionDeviceModel", -- depends_on: ["ReduceUserAgentMinorVersion"], -- status: {"Android": "stable"}, -+ name: "ReduceUserAgentAndroidVersionDeviceModel", // keep -+ depends_on: ["ReduceUserAgentMinorVersion"], // enabled -+ status: {"Android": "stable"}, // in bromite - }, +@@ -4381,15 +4381,15 @@ // If enabled, the platform version in User-Agent Data will be removed. // This feature is limited to Linux only. { diff --git a/build/patches/Move-navigation-bar-to-bottom.patch b/build/patches/Move-navigation-bar-to-bottom.patch index bc17e4bb..95697c3e 100644 --- a/build/patches/Move-navigation-bar-to-bottom.patch +++ b/build/patches/Move-navigation-bar-to-bottom.patch @@ -99,12 +99,12 @@ License: GPL-3.0-only - https://spdx.org/licenses/GPL-3.0-only.html .../toolbar/top/TopToolbarSceneLayer.java | 10 +- .../res/xml/accessibility_preferences.xml | 8 + .../accessibility/AccessibilitySettings.java | 27 ++++ - .../AccessibilitySettingsDelegate.java | 9 ++ - components/viz/common/features.cc | 1 + + .../AccessibilitySettingsDelegate.java | 8 + + components/viz/common/features.cc | 3 +- .../render_widget_host_view_android.cc | 3 + .../Move-navigation-bar-to-bottom.inc | 17 ++ .../renderer/core/frame/viewport_data.cc | 1 + - 91 files changed, 1065 insertions(+), 88 deletions(-) + 91 files changed, 1065 insertions(+), 89 deletions(-) create mode 100644 chrome/browser/hub/internal/android/java/src/org/chromium/chrome/browser/hub/ReversedLinearLayout.java create mode 100644 cromite_flags/chrome/browser/about_flags_cc/Move-navigation-bar-to-bottom.inc @@ -164,9 +164,9 @@ diff --git a/cc/input/browser_controls_offset_manager.cc b/cc/input/browser_cont diff --git a/cc/trees/layer_tree_host_impl.cc b/cc/trees/layer_tree_host_impl.cc --- a/cc/trees/layer_tree_host_impl.cc +++ b/cc/trees/layer_tree_host_impl.cc -@@ -5464,6 +5464,9 @@ bool LayerTreeHostImpl::AnimateBrowserControls(base::TimeTicks time) { - if (scroll_delta.IsZero()) +@@ -5588,6 +5588,9 @@ bool LayerTreeHostImpl::AnimateBrowserControls(base::TimeTicks time) { return false; + } + if (base::FeatureList::IsEnabled(::features::kMoveTopToolbarToBottom)) + return false; @@ -177,10 +177,10 @@ diff --git a/cc/trees/layer_tree_host_impl.cc b/cc/trees/layer_tree_host_impl.cc diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupUiCoordinator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupUiCoordinator.java --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupUiCoordinator.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupUiCoordinator.java -@@ -26,6 +26,7 @@ import org.chromium.base.supplier.ObservableSupplier; - import org.chromium.base.supplier.ObservableSupplierImpl; +@@ -26,6 +26,7 @@ import org.chromium.base.supplier.NonNullObservableSupplier; import org.chromium.base.supplier.ObservableSuppliers; import org.chromium.base.supplier.OneshotSupplier; + import org.chromium.base.supplier.SettableMonotonicObservableSupplier; +import org.chromium.base.supplier.NullableObservableSupplier; import org.chromium.base.supplier.SettableNonNullObservableSupplier; import org.chromium.base.supplier.SettableNullableObservableSupplier; @@ -193,17 +193,17 @@ diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser import java.util.List; import java.util.function.Supplier; -@@ -198,7 +200,8 @@ public class TabGroupUiCoordinator implements TabGroupUiMediator.ResetHandler, T +@@ -199,7 +201,8 @@ public class TabGroupUiCoordinator implements TabGroupUiMediator.ResetHandler, T @Initializer public void initializeWithNative( BottomControlsCoordinator.BottomControlsVisibilityController visibilityController, - Callback onSnapshotTokenChange) { + Callback onSnapshotTokenChange, + TopUiThemeColorProvider topUiThemeColorProvider, NullableObservableSupplier tabSupplier) { - ObservableSupplierImpl tabStripTokenSupplier = new ObservableSupplierImpl<>(); + SettableMonotonicObservableSupplier tabStripTokenSupplier = + ObservableSuppliers.createMonotonic(); - var currentTabGroupModelFilterSupplier = -@@ -294,7 +297,8 @@ public class TabGroupUiCoordinator implements TabGroupUiMediator.ResetHandler, T +@@ -296,7 +299,8 @@ public class TabGroupUiCoordinator implements TabGroupUiMediator.ResetHandler, T sharedImageTilesConfigBuilder, mThemeColorProvider, onSnapshotTokenChange, @@ -221,9 +221,9 @@ diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser import org.chromium.base.metrics.RecordUserAction; import org.chromium.base.supplier.LazyOneshotSupplier; +import org.chromium.base.supplier.NullableObservableSupplier; + import org.chromium.base.supplier.MonotonicObservableSupplier; import org.chromium.base.supplier.NonNullObservableSupplier; - import org.chromium.base.supplier.ObservableSupplier; - import org.chromium.base.supplier.ObservableSupplierImpl; + import org.chromium.base.supplier.ObservableSuppliers; @@ -79,6 +80,12 @@ import java.util.List; import java.util.Objects; import java.util.function.Supplier; @@ -239,7 +239,7 @@ diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser public class TabGroupUiMediator implements BackPressHandler { @@ -154,6 +161,11 @@ public class TabGroupUiMediator implements BackPressHandler { private final Callback mOnSnapshotTokenChange; - private final ObservableSupplier mChildTokenSupplier; + private final MonotonicObservableSupplier mChildTokenSupplier; + private final TopUiThemeColorProvider mTopUiThemeColorProvider; + @@ -253,8 +253,8 @@ diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser SharedImageTilesConfig.@Nullable Builder sharedImageTilesConfigBuilder, ThemeColorProvider themeColorProvider, Callback onSnapshotTokenChange, -- ObservableSupplierImpl childTokenSupplier) { -+ ObservableSupplierImpl childTokenSupplier, +- MonotonicObservableSupplier childTokenSupplier) { ++ MonotonicObservableSupplier childTokenSupplier, + TopUiThemeColorProvider topUiThemeColorProvider, NullableObservableSupplier tabSupplier) { + mTopUiThemeColorProvider = topUiThemeColorProvider; mResetHandler = resetHandler; @@ -309,7 +309,7 @@ diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser mHandleBackPressChangedSupplier = handleBackPressChangedSupplier; if (mTabGridDialogControllerSupplier != null) { mTabGridDialogControllerSupplier.onAvailable( -@@ -393,6 +430,18 @@ public class TabGroupUiMediator implements BackPressHandler { +@@ -394,6 +431,18 @@ public class TabGroupUiMediator implements BackPressHandler { mModel.set(TINT, mThemeColorProvider.getTint()); } @@ -328,7 +328,7 @@ diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser private void setupToolbarButtons() { View.OnClickListener showGroupDialogOnClickListener = view -> { -@@ -584,6 +633,7 @@ public class TabGroupUiMediator implements BackPressHandler { +@@ -580,6 +629,7 @@ public class TabGroupUiMediator implements BackPressHandler { @SuppressWarnings("NullAway") public void destroy() { @@ -421,7 +421,7 @@ diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListContainerViewBinder.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListContainerViewBinder.java --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListContainerViewBinder.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListContainerViewBinder.java -@@ -157,7 +157,7 @@ class TabListContainerViewBinder { +@@ -251,7 +251,7 @@ class TabListContainerViewBinder { .getDimensionPixelSize(R.dimen.hub_search_box_gap); recyclerView.setPadding( recyclerView.getPaddingLeft(), @@ -448,7 +448,7 @@ diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser import android.graphics.Rect; import android.util.Size; import android.view.InputDevice; -@@ -76,6 +82,8 @@ import org.chromium.ui.modelutil.SimpleRecyclerViewAdapter; +@@ -78,6 +84,8 @@ import org.chromium.ui.modelutil.SimpleRecyclerViewAdapter; import org.chromium.ui.recyclerview.widget.ItemTouchHelper2; import org.chromium.ui.widget.ViewLookupCachingFrameLayout; @@ -457,7 +457,7 @@ diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; -@@ -164,6 +172,124 @@ public class TabListCoordinator implements PriceWelcomeMessageProvider, DestroyO +@@ -166,6 +174,124 @@ public class TabListCoordinator implements PriceWelcomeMessageProvider, DestroyO private int mAwaitingTabId = Tab.INVALID_TAB_ID; private @TabActionState int mTabActionState; @@ -582,7 +582,7 @@ diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser /** * Construct a coordinator for UI that shows a list of tabs. * -@@ -424,6 +550,12 @@ public class TabListCoordinator implements PriceWelcomeMessageProvider, DestroyO +@@ -399,6 +525,12 @@ public class TabListCoordinator implements PriceWelcomeMessageProvider, DestroyO checkAwaitingLayout(); } }; @@ -595,7 +595,7 @@ diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser mRecyclerView.setLayoutManager(gridLayoutManager); mMediator.registerOrientationListener(gridLayoutManager); mMediator.updateSpanCount( -@@ -443,6 +575,17 @@ public class TabListCoordinator implements PriceWelcomeMessageProvider, DestroyO +@@ -418,6 +550,17 @@ public class TabListCoordinator implements PriceWelcomeMessageProvider, DestroyO } }; mRecyclerView.setLayoutManager(layoutManager); @@ -613,7 +613,7 @@ diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser } mMediator.setRecyclerViewItemAnimationToggle(mRecyclerView::setDisableItemAnimations); } -@@ -465,7 +608,7 @@ public class TabListCoordinator implements PriceWelcomeMessageProvider, DestroyO +@@ -440,7 +583,7 @@ public class TabListCoordinator implements PriceWelcomeMessageProvider, DestroyO mRecyclerView, emptyViewParent, mModelList, @@ -622,7 +622,7 @@ diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser } mTabListHighlighter = new TabListHighlighter(mModelList); mTabListMergeAnimationManager = new TabListMergeAnimationManager(mRecyclerView); -@@ -802,6 +945,9 @@ public class TabListCoordinator implements PriceWelcomeMessageProvider, DestroyO +@@ -831,6 +974,9 @@ public class TabListCoordinator implements PriceWelcomeMessageProvider, DestroyO void prepareTabSwitcherPaneView() { registerLayoutChangeListener(); mRecyclerView.setupCustomItemAnimator(); @@ -707,12 +707,12 @@ diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser @@ -146,6 +147,7 @@ public abstract class TabSwitcherPaneBase extends PaneBase private @Nullable PaneHubController mPaneHubController; private @Nullable Long mWaitForTabStateInitializedStartTimeMs; - private final @Nullable ObservableSupplier mXrSpaceModeObservableSupplier; + private final NonNullObservableSupplier mXrSpaceModeObservableSupplier; + private boolean isFirstRequest = true; /** * @param context The activity context. -@@ -454,6 +456,13 @@ public abstract class TabSwitcherPaneBase extends PaneBase +@@ -469,6 +471,13 @@ public abstract class TabSwitcherPaneBase extends PaneBase Log.d(TAG, "Geometry not ready using fallback animation."); useFallbackAnimation = true; } @@ -729,15 +729,15 @@ diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser diff --git a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedSurfaceCoordinator.java b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedSurfaceCoordinator.java --- a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedSurfaceCoordinator.java +++ b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedSurfaceCoordinator.java -@@ -21,6 +21,7 @@ import android.os.Looper; +@@ -18,6 +18,7 @@ import android.os.Handler; + import android.os.Looper; import android.os.SystemClock; - import android.view.Gravity; import android.view.LayoutInflater; +import android.view.Gravity; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; -@@ -774,6 +775,9 @@ public class FeedSurfaceCoordinator +@@ -750,6 +751,9 @@ public class FeedSurfaceCoordinator ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); layoutParams.setMarginStart(margin); layoutParams.setMarginEnd(margin); @@ -761,7 +761,7 @@ diff --git a/chrome/android/java/res/layout/search_activity.xml b/chrome/android diff --git a/chrome/android/java/res/xml/main_preferences.xml b/chrome/android/java/res/xml/main_preferences.xml --- a/chrome/android/java/res/xml/main_preferences.xml +++ b/chrome/android/java/res/xml/main_preferences.xml -@@ -45,7 +45,8 @@ found in the LICENSE file. +@@ -44,7 +44,8 @@ found in the LICENSE file. android:fragment="org.chromium.chrome.browser.toolbar.settings.AddressBarSettingsFragment" android:key="address_bar" android:order="7" @@ -774,7 +774,7 @@ diff --git a/chrome/android/java/res/xml/main_preferences.xml b/chrome/android/j 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 +++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java -@@ -1067,7 +1067,8 @@ public class ChromeTabbedActivity extends ChromeActivity implements PreAttachInt +@@ -1101,7 +1101,8 @@ public class ChromeTabbedActivity extends ChromeActivity implements PreAttachInt mRootUiCoordinator.getBottomSheetController(), mRootUiCoordinator.getShareDelegateSupplier(), mXrSceneCoreSessionManagerSupplier.get(), @@ -787,7 +787,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedAct diff --git a/chrome/android/java/src/org/chromium/chrome/browser/accessibility/settings/ChromeAccessibilitySettingsDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/accessibility/settings/ChromeAccessibilitySettingsDelegate.java --- a/chrome/android/java/src/org/chromium/chrome/browser/accessibility/settings/ChromeAccessibilitySettingsDelegate.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/accessibility/settings/ChromeAccessibilitySettingsDelegate.java -@@ -20,6 +20,14 @@ import org.chromium.chrome.browser.flags.CromiteNativeUtils; +@@ -22,6 +22,14 @@ import org.chromium.chrome.browser.flags.CromiteNativeUtils; import org.chromium.chrome.browser.preferences.ChromePreferenceKeys; import org.chromium.chrome.browser.preferences.ChromeSharedPreferences; @@ -802,7 +802,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/accessibility/s /** The Chrome implementation of AccessibilitySettingsDelegate. */ @NullMarked public class ChromeAccessibilitySettingsDelegate implements AccessibilitySettingsDelegate { -@@ -84,6 +92,12 @@ public class ChromeAccessibilitySettingsDelegate implements AccessibilitySetting +@@ -86,6 +94,12 @@ public class ChromeAccessibilitySettingsDelegate implements AccessibilitySetting return new ForceTabletUIDelegate(); } @@ -815,7 +815,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/accessibility/s private final Profile mProfile; /** -@@ -95,6 +109,62 @@ public class ChromeAccessibilitySettingsDelegate implements AccessibilitySetting +@@ -97,6 +111,62 @@ public class ChromeAccessibilitySettingsDelegate implements AccessibilitySetting mProfile = profile; } @@ -896,7 +896,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/tabmodel/He diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorViewHolder.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorViewHolder.java --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorViewHolder.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorViewHolder.java -@@ -273,6 +273,10 @@ public class CompositorViewHolder extends FrameLayout +@@ -272,6 +272,10 @@ public class CompositorViewHolder extends FrameLayout @Override public void setCurrentTouchEventOffsets(float top) { EventForwarder forwarder = getEventForwarder(); @@ -907,7 +907,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/Comp if (forwarder != null) forwarder.setCurrentTouchOffsetY(top); } -@@ -992,6 +996,9 @@ public class CompositorViewHolder extends FrameLayout +@@ -993,6 +997,9 @@ public class CompositorViewHolder extends FrameLayout mApplicationBottomInsetSupplier != null ? mApplicationBottomInsetSupplier.getInsets().webContentsHeightInset : 0; @@ -920,15 +920,15 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/Comp diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerChrome.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerChrome.java --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerChrome.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerChrome.java -@@ -43,6 +43,7 @@ import org.chromium.components.browser_ui.widget.gesture.SwipeGestureListener.Sc - import org.chromium.components.browser_ui.widget.gesture.SwipeGestureListener.SwipeHandler; +@@ -46,6 +46,7 @@ import org.chromium.components.browser_ui.widget.gesture.SwipeGestureListener.Sw + import org.chromium.ui.base.DeviceFormFactor; import org.chromium.ui.resources.dynamics.DynamicResourceLoader; import org.chromium.ui.util.AccessibilityUtil; +import org.chromium.chrome.browser.flags.ChromeFeatureList; import java.util.List; import java.util.function.Supplier; -@@ -161,7 +162,9 @@ public class LayoutManagerChrome extends LayoutManagerImpl implements Accessibil +@@ -164,7 +165,9 @@ public class LayoutManagerChrome extends LayoutManagerImpl implements Accessibil @Override public SwipeHandler createToolbarSwipeHandler(boolean supportsSwipeToShowTabSwitcher) { @@ -939,7 +939,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layo } @Override -@@ -390,9 +393,11 @@ public class LayoutManagerChrome extends LayoutManagerImpl implements Accessibil +@@ -414,9 +417,11 @@ public class LayoutManagerChrome extends LayoutManagerImpl implements Accessibil private static final float SWIPE_RANGE_DEG = 25; private final boolean mSupportsSwipeToShowTabSwitcher; @@ -952,7 +952,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layo } @Override -@@ -499,7 +504,8 @@ public class LayoutManagerChrome extends LayoutManagerImpl implements Accessibil +@@ -523,7 +528,8 @@ public class LayoutManagerChrome extends LayoutManagerImpl implements Accessibil return direction == showTabSwitcherScrollDirection || direction == ScrollDirection.LEFT @@ -996,7 +996,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layo diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/ToolbarSwipeLayout.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/ToolbarSwipeLayout.java --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/ToolbarSwipeLayout.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/ToolbarSwipeLayout.java -@@ -55,6 +55,8 @@ import org.chromium.ui.base.LocalizationUtils; +@@ -57,6 +57,8 @@ import org.chromium.ui.base.LocalizationUtils; import org.chromium.ui.interpolators.Interpolators; import org.chromium.ui.resources.ResourceManager; @@ -1005,7 +1005,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layo import java.util.ArrayList; import java.util.List; -@@ -528,7 +530,11 @@ public class ToolbarSwipeLayout extends Layout { +@@ -541,7 +543,11 @@ public class ToolbarSwipeLayout extends Layout { mLeftToolbarOverlay.setXOffset(leftX * dpToPx); } mLeftTab.setX(leftX); @@ -1018,7 +1018,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layo needUpdate = updateSnap(dt, mLeftTab) || needUpdate; } else if (mLeftToolbarOverlay != null) { mLeftToolbarOverlay.setManualVisibility(false); -@@ -541,7 +547,11 @@ public class ToolbarSwipeLayout extends Layout { +@@ -554,7 +560,11 @@ public class ToolbarSwipeLayout extends Layout { mRightToolbarOverlay.setXOffset(rightX * dpToPx); } mRightTab.setX(rightX); @@ -1046,7 +1046,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/over diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelperManager.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelperManager.java --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelperManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelperManager.java -@@ -118,6 +118,8 @@ import org.chromium.ui.interpolators.Interpolators; +@@ -120,6 +120,8 @@ import org.chromium.ui.interpolators.Interpolators; import org.chromium.ui.resources.ResourceManager; import org.chromium.ui.util.ColorUtils; import org.chromium.url.GURL; @@ -1055,7 +1055,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/over import java.util.ArrayList; import java.util.List; -@@ -282,12 +284,17 @@ public class StripLayoutHelperManager +@@ -293,12 +295,17 @@ public class StripLayoutHelperManager // Drag-Drop private @Nullable TabStripDragHandler mTabStripDragHandler; @@ -1070,26 +1070,26 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/over return; } + y -= mStripFilterArea.top; - if (mModelSelectorButton != null && mModelSelectorButton.onDown(x, y, buttons)) { + if (mGlicButton != null && mGlicButton.onDown(x, y, buttons)) { return; } -@@ -312,6 +319,7 @@ public class StripLayoutHelperManager +@@ -330,6 +337,7 @@ public class StripLayoutHelperManager if (DragDropGlobalState.hasValue()) { return; } + y -= mStripFilterArea.top; - if (mModelSelectorButton != null) { - mModelSelectorButton.drag(x, y); + if (mGlicButton != null) { + mGlicButton.drag(x, y); } -@@ -323,6 +331,7 @@ public class StripLayoutHelperManager +@@ -344,6 +352,7 @@ public class StripLayoutHelperManager if (DragDropGlobalState.hasValue()) { return; } + y -= mStripFilterArea.top; long time = time(); - if (mModelSelectorButton != null && mModelSelectorButton.click(x, y, buttons)) { - mModelSelectorButton.handleClick(time, buttons, modifiers); -@@ -336,6 +345,7 @@ public class StripLayoutHelperManager + if (mGlicButton != null && mGlicButton.click(x, y, buttons)) { + mGlicButton.handleClick(time, buttons, modifiers); +@@ -361,6 +370,7 @@ public class StripLayoutHelperManager if (DragDropGlobalState.hasValue()) { return; } @@ -1097,7 +1097,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/over getActiveStripLayoutHelper().fling(time(), velocityX); } -@@ -344,6 +354,7 @@ public class StripLayoutHelperManager +@@ -369,6 +379,7 @@ public class StripLayoutHelperManager if (DragDropGlobalState.hasValue()) { return; } @@ -1105,17 +1105,17 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/over getActiveStripLayoutHelper().onLongPress(x, y); } -@@ -484,7 +495,8 @@ public class StripLayoutHelperManager +@@ -509,7 +520,8 @@ public class StripLayoutHelperManager BottomSheetController bottomSheetController, Supplier shareDelegateSupplier, - @Nullable ObservableSupplier xrSpaceModeObservableSupplier, + @Nullable NonNullObservableSupplier xrSpaceModeObservableSupplier, - BackPressManager backPressManager) { + BackPressManager backPressManager, + Supplier browserControlsManagerSupplier) { mContext = context; Resources res = context.getResources(); mManagerHost = managerHost; -@@ -608,6 +620,8 @@ public class StripLayoutHelperManager +@@ -663,6 +675,8 @@ public class StripLayoutHelperManager multiInstanceManager, shareDelegateSupplier, TabGroupListBottomSheetCoordinator::new); @@ -1124,7 +1124,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/over tabHoverCardViewStub.setOnInflateListener( (viewStub, view) -> { -@@ -827,6 +841,7 @@ public class StripLayoutHelperManager +@@ -940,6 +954,7 @@ public class StripLayoutHelperManager RectF viewport, RectF visibleViewport, ResourceManager resourceManager) { assert mTabStripTreeProvider != null; mResourceManager = resourceManager; @@ -1132,7 +1132,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/over // When refactor is enabled, the mSceneLayerYOffset / mSceneLayerVisibleHeight wil be // calculated externally, so we can skip the adjustment here. -@@ -870,6 +885,10 @@ public class StripLayoutHelperManager +@@ -983,6 +998,10 @@ public class StripLayoutHelperManager getStripTransitionScrimColor(), mStripTransitionScrimOpacity); } @@ -1142,8 +1142,8 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/over + } mTabStripTreeProvider.pushAndUpdateStrip( this, - mLayerTitleCacheSupplier.get(), -@@ -883,7 +902,9 @@ public class StripLayoutHelperManager + assertNonNull(mLayerTitleCacheSupplier.get()), +@@ -996,7 +1015,9 @@ public class StripLayoutHelperManager mStripTransitionScrimOpacity, getActiveStripLayoutHelper().getLeftPaddingToDraw(), getActiveStripLayoutHelper().getRightPaddingToDraw(), @@ -1154,7 +1154,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/over } private float getVisibleHeightDp(float topControlOffsetDp) { -@@ -985,11 +1006,21 @@ public class StripLayoutHelperManager +@@ -1121,11 +1142,21 @@ public class StripLayoutHelperManager mRightPadding, mTopPadding); @@ -1305,7 +1305,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/fullscreen/Brow /** A class that manages browser control visibility and positioning. */ @NullMarked public class BrowserControlsManager implements ActivityStateListener, BrowserControlsSizer { -@@ -581,6 +583,14 @@ public class BrowserControlsManager implements ActivityStateListener, BrowserCon +@@ -580,6 +582,14 @@ public class BrowserControlsManager implements ActivityStateListener, BrowserCon } } @@ -1320,7 +1320,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/fullscreen/Brow @Override public int getTopControlsMinHeight() { return mTopControlsMinHeight; -@@ -682,6 +692,8 @@ public class BrowserControlsManager implements ActivityStateListener, BrowserCon +@@ -681,6 +691,8 @@ public class BrowserControlsManager implements ActivityStateListener, BrowserCon @Override public float getTopVisibleContentOffset() { @@ -1332,7 +1332,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/fullscreen/Brow diff --git a/chrome/android/java/src/org/chromium/chrome/browser/messages/MessageContainerCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/messages/MessageContainerCoordinator.java --- a/chrome/android/java/src/org/chromium/chrome/browser/messages/MessageContainerCoordinator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/messages/MessageContainerCoordinator.java -@@ -18,6 +18,9 @@ import org.chromium.chrome.browser.fullscreen.BrowserControlsManager; +@@ -19,6 +19,9 @@ import org.chromium.chrome.browser.fullscreen.BrowserControlsManager; import org.chromium.components.messages.MessageContainer; import org.chromium.ui.base.ViewUtils; @@ -1342,7 +1342,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/messages/Messag /** * Coordinator of {@link MessageContainer}, which can adjust margins of the message container and * control the visibility of browser control when message is being shown. -@@ -62,7 +65,12 @@ public class MessageContainerCoordinator implements BrowserControlsStateProvider +@@ -63,7 +66,12 @@ public class MessageContainerCoordinator implements BrowserControlsStateProvider } CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) mContainer.getLayoutParams(); @@ -1356,7 +1356,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/messages/Messag mContainer.setLayoutParams(params); } -@@ -141,7 +149,10 @@ public class MessageContainerCoordinator implements BrowserControlsStateProvider +@@ -172,7 +180,10 @@ public class MessageContainerCoordinator implements BrowserControlsStateProvider */ private int getContainerTopOffset() { assert mContainer != null; @@ -1383,7 +1383,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/modaldialog/Chr diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPage.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPage.java --- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPage.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPage.java -@@ -136,6 +136,7 @@ import org.chromium.ui.base.DeviceFormFactor; +@@ -135,6 +135,7 @@ import org.chromium.ui.base.DeviceFormFactor; import org.chromium.ui.base.WindowAndroid; import org.chromium.ui.modaldialog.ModalDialogManager; import org.chromium.url.GURL; @@ -1391,7 +1391,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPage. import androidx.annotation.NonNull; import org.chromium.chrome.browser.bookmarks.BookmarkManagerOpener; -@@ -931,11 +932,16 @@ public class NewTabPage +@@ -929,11 +930,16 @@ public class NewTabPage final int topControlsDistanceToRest = mBrowserControlsStateProvider.getContentOffset() - mBrowserControlsStateProvider.getTopControlsHeight(); @@ -1410,7 +1410,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPage. if (topMargin != layoutParams.topMargin || bottomMargin != layoutParams.bottomMargin) { layoutParams.topMargin = topMargin; -@@ -951,9 +957,7 @@ public class NewTabPage +@@ -949,9 +955,7 @@ public class NewTabPage * strip. */ private int getToolbarExtraYOffset() { @@ -1424,7 +1424,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPage. diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPageLayout.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPageLayout.java --- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPageLayout.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPageLayout.java -@@ -14,6 +14,9 @@ import android.text.Editable; +@@ -15,6 +15,9 @@ import android.text.Editable; import android.util.AttributeSet; import android.view.DragEvent; import android.view.ViewStub; @@ -1434,7 +1434,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPageL import android.view.View; import android.view.ViewGroup; import android.view.ViewStub; -@@ -230,7 +233,12 @@ public class NewTabPageLayout extends LinearLayout +@@ -223,7 +226,12 @@ public class NewTabPageLayout extends LinearLayout Log.i(TAG, "NewTabPageLayout.onFinishInflate before insertSiteSectionView"); initializeSiteSectionView(); @@ -1489,8 +1489,8 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/RecentTabsP newHeight, mView.getPaddingRight(), mView.getPaddingBottom()); -- mTabStripHeightSupplier.addObserver(mTabStripHeightChangeCallback); -+ mTabStripHeightSupplier.addObserver(mTabStripHeightChangeCallback); +- mTabStripHeightSupplier.addSyncObserverAndPostIfNonNull(mTabStripHeightChangeCallback); ++ mTabStripHeightSupplier.addSyncObserverAndPostIfNonNull(mTabStripHeightChangeCallback); + } mEdgeToEdgeSupplier = edgeToEdgeSupplier; mPadAdjuster = @@ -1546,7 +1546,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/page_info/Chrom diff --git a/chrome/android/java/src/org/chromium/chrome/browser/searchwidget/SearchActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/searchwidget/SearchActivity.java --- a/chrome/android/java/src/org/chromium/chrome/browser/searchwidget/SearchActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/searchwidget/SearchActivity.java -@@ -89,6 +89,11 @@ import org.chromium.url.GURL; +@@ -91,6 +91,11 @@ import org.chromium.url.GURL; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -1558,7 +1558,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/searchwidget/Se import java.lang.ref.WeakReference; import java.util.function.Supplier; -@@ -306,6 +311,15 @@ public class SearchActivity extends AsyncInitializationActivity +@@ -310,6 +315,15 @@ public class SearchActivity extends AsyncInitializationActivity // Build the search box. mSearchBox = contentView.findViewById(R.id.search_location_bar); mAnchorView = contentView.findViewById(R.id.toolbar); @@ -1577,7 +1577,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/searchwidget/Se diff --git a/chrome/android/java/src/org/chromium/chrome/browser/settings/FragmentDependencyProvider.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/FragmentDependencyProvider.java --- a/chrome/android/java/src/org/chromium/chrome/browser/settings/FragmentDependencyProvider.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/FragmentDependencyProvider.java -@@ -201,6 +201,11 @@ public class FragmentDependencyProvider extends FragmentManager.FragmentLifecycl +@@ -203,6 +203,11 @@ public class FragmentDependencyProvider extends FragmentManager.FragmentLifecycl if (fragment instanceof INeedSnackbarManager) { ((INeedSnackbarManager)fragment).setSnackbarManagerSupplier(mSnackbarManagerSupplier); } @@ -1651,7 +1651,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/Toolbar /** * Contains logic for managing the toolbar visual component. This class manages the interactions * with the rest of the application to ensure the toolbar is always visually up to date. -@@ -896,6 +899,17 @@ public class ToolbarManager +@@ -900,6 +903,17 @@ public class ToolbarManager /* matchTrustedCdnUrl= */ mIsCustomTab); mControlContainer = controlContainer; mToolbarHairline = mControlContainer.findViewById(R.id.toolbar_hairline); @@ -1669,7 +1669,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/Toolbar mBookmarkModelSupplier = bookmarkModelSupplier; mBookmarkModelSupplier.addObserver(mBookmarkModelSupplierObserver); -@@ -1602,6 +1616,7 @@ public class ToolbarManager +@@ -1611,6 +1625,7 @@ public class ToolbarManager // the height won't be measured by the background image. if (mControlContainer.getBackground() == null) { setControlContainerTopMargin(getToolbarExtraYOffset()); @@ -1677,7 +1677,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/Toolbar } else if (mLayoutChangeListener == null) { mLayoutChangeListener = (view, -@@ -1615,6 +1630,7 @@ public class ToolbarManager +@@ -1624,6 +1639,7 @@ public class ToolbarManager oldBottom) -> { if (mControlContainer.getBackground() == null) { setControlContainerTopMargin(getToolbarExtraYOffset()); @@ -1685,7 +1685,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/Toolbar mControlContainer.removeOnLayoutChangeListener( mLayoutChangeListener); mLayoutChangeListener = null; -@@ -2278,9 +2294,21 @@ public class ToolbarManager +@@ -2257,9 +2273,21 @@ public class ToolbarManager return ((LocationBarCoordinator) mLocationBar).getUrlBarViewRectProvider(); } @@ -1708,7 +1708,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/Toolbar assert mTabGroupUiOneshotSupplier == null; assert mUndoBarThrottle != null; assert mLayoutManager != null; -@@ -2297,7 +2325,7 @@ public class ToolbarManager +@@ -2276,7 +2304,7 @@ public class ToolbarManager mActivityTabProvider, mTabModelSelector, mActivity, @@ -1717,7 +1717,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/Toolbar mBrowserControlsSizer, mScrimManager, mOmniboxFocusStateSupplier, -@@ -2324,7 +2352,7 @@ public class ToolbarManager +@@ -2303,7 +2331,7 @@ public class ToolbarManager mControlsVisibilityDelegate, mFullscreenManager, mEdgeToEdgeControllerSupplier, @@ -1726,7 +1726,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/Toolbar bottomControlsContentDelegateSupplier, mTabObscuringHandler, mOverlayPanelVisibilitySupplier, -@@ -2332,7 +2360,8 @@ public class ToolbarManager +@@ -2311,7 +2339,8 @@ public class ToolbarManager /* readAloudRestoringSupplier= */ () -> { final var readAloud = mReadAloudControllerSupplier.get(); return readAloud != null && readAloud.isRestoringPlayer(); @@ -1747,7 +1747,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ui/BottomContai /** * The container that holds both infobars and snackbars. It will be translated up and down when the -@@ -79,11 +80,28 @@ public class BottomContainer extends FrameLayout +@@ -80,11 +81,28 @@ public class BottomContainer extends FrameLayout setTranslationY(mBaseYOffset); } @@ -1787,7 +1787,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ui/system/Statu import androidx.annotation.ColorInt; import androidx.annotation.VisibleForTesting; -@@ -24,6 +25,7 @@ import org.chromium.build.annotations.NullMarked; +@@ -25,6 +26,7 @@ import org.chromium.build.annotations.NullMarked; import org.chromium.build.annotations.Nullable; import org.chromium.chrome.R; import org.chromium.chrome.browser.ActivityTabProvider; @@ -1795,7 +1795,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ui/system/Statu import org.chromium.chrome.browser.layouts.LayoutManager; import org.chromium.chrome.browser.layouts.LayoutStateProvider; import org.chromium.chrome.browser.layouts.LayoutStateProvider.LayoutStateObserver; -@@ -617,6 +619,12 @@ public class StatusBarColorController +@@ -621,6 +623,12 @@ public class StatusBarColorController UiUtils.setStatusBarColor(window, color); } @@ -1819,7 +1819,7 @@ diff --git a/chrome/browser/android/compositor/layer/toolbar_layer.cc b/chrome/b #include "cc/resources/scoped_ui_resource.h" #include "cc/slim/layer.h" #include "cc/slim/nine_patch_layer.h" -@@ -160,6 +161,10 @@ void ToolbarLayer::PushResource(int toolbar_resource_id, +@@ -159,6 +160,10 @@ void ToolbarLayer::PushResource(int toolbar_resource_id, y_offset = legacy_content_offset - layer_->bounds().height(); } @@ -1841,7 +1841,7 @@ diff --git a/chrome/browser/android/compositor/scene_layer/tab_strip_scene_layer // Must come after all headers that specialize FromJniType() / ToJniType(). #include "chrome/android/chrome_jni_headers/TabStripSceneLayer_jni.h" -@@ -149,8 +150,10 @@ void TabStripSceneLayer::SetContentTree(JNIEnv* env, +@@ -157,8 +158,10 @@ void TabStripSceneLayer::SetContentTree(JNIEnv* env, content_tree_ = content_tree; if (content_tree) { layer()->InsertChild(content_tree->layer(), 0); @@ -1854,9 +1854,9 @@ diff --git a/chrome/browser/android/compositor/scene_layer/tab_strip_scene_layer } } } -@@ -205,7 +208,12 @@ void TabStripSceneLayer::UpdateTabStripLayer(JNIEnv* env, - jfloat right_padding, - jfloat top_padding) { +@@ -213,7 +216,12 @@ void TabStripSceneLayer::UpdateTabStripLayer(JNIEnv* env, + float right_padding, + float top_padding) { gfx::RectF content(0, y_offset, width, height); - layer()->SetPosition(gfx::PointF(0, y_offset)); + if (base::FeatureList::IsEnabled(::features::kMoveTopToolbarToBottom)) { @@ -1868,7 +1868,7 @@ diff --git a/chrome/browser/android/compositor/scene_layer/tab_strip_scene_layer background_layer_->SetBounds(gfx::Size(width, height)); background_layer_->SetBackgroundColor(SkColor4f::FromColor(background_color)); -@@ -214,7 +222,7 @@ void TabStripSceneLayer::UpdateTabStripLayer(JNIEnv* env, +@@ -222,7 +230,7 @@ void TabStripSceneLayer::UpdateTabStripLayer(JNIEnv* env, tab_strip_layer_->SetPosition(gfx::PointF(0, top_padding)); // Content tree should not be affected by tab strip scene layer visibility. @@ -1893,13 +1893,13 @@ diff --git a/chrome/browser/browser_controls/android/java/src/org/chromium/chrom --- a/chrome/browser/browser_controls/android/java/src/org/chromium/chrome/browser/browser_controls/BrowserControlsMarginAdapter.java +++ b/chrome/browser/browser_controls/android/java/src/org/chromium/chrome/browser/browser_controls/BrowserControlsMarginAdapter.java @@ -10,6 +10,7 @@ import org.chromium.base.lifetime.Destroyable; - import org.chromium.base.supplier.ObservableSupplier; - import org.chromium.base.supplier.ObservableSupplierImpl; + import org.chromium.base.supplier.MonotonicObservableSupplier; + import org.chromium.base.supplier.SettableMonotonicObservableSupplier; import org.chromium.build.annotations.NullMarked; +import org.chromium.chrome.browser.flags.ChromeFeatureList; /** - * An implementation of {@link ObservableSupplier} that monitors changes to browser controls and + * An implementation of {@link MonotonicObservableSupplier} that monitors changes to browser @@ -75,6 +76,10 @@ public class BrowserControlsMarginAdapter int bottomMargin = mBrowserControlsStateProvider.getBottomControlsHeight() @@ -1961,7 +1961,7 @@ diff --git a/chrome/browser/flags/android/chrome_feature_list.cc b/chrome/browse #include "chrome/browser/android/webapk/webapk_features.h" #include "chrome/browser/browser_features.h" #include "chrome/browser/contextmenu/context_menu_features.h" -@@ -371,6 +372,8 @@ const base::Feature* const kFeaturesExposedToJava[] = { +@@ -378,6 +379,8 @@ const base::Feature* const kFeaturesExposedToJava[] = { &kNewTabPageCustomizationToolbarButton, &kNewTabPageCustomizationV2, &kNotificationPermissionBottomSheet, @@ -1969,11 +1969,11 @@ diff --git a/chrome/browser/flags/android/chrome_feature_list.cc b/chrome/browse + &features::kDisableToolbarSwipeUp, &kNotificationPermissionVariant, &kNotificationTrampoline, - &kOfflineIndicatorV2, + &kNotificationTrampolineNoNewTask, diff --git a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java --- a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java +++ b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java -@@ -502,6 +502,10 @@ public abstract class ChromeFeatureList { +@@ -508,6 +508,10 @@ public abstract class ChromeFeatureList { public static final String NAV_BAR_COLOR_ANIMATION = "NavBarColorAnimation"; public static final String NEW_TAB_PAGE_CUSTOMIZATION = "NewTabPageCustomization"; public static final String NEW_TAB_PAGE_CUSTOMIZATION_FOR_MVT = "NewTabPageCustomizationForMvt"; @@ -1984,9 +1984,9 @@ diff --git a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/f public static final String NEW_TAB_PAGE_CUSTOMIZATION_TOOLBAR_BUTTON = "NewTabPageCustomizationToolbarButton"; public static final String NEW_TAB_PAGE_CUSTOMIZATION_V2 = "NewTabPageCustomizationV2"; -@@ -1008,6 +1012,10 @@ public abstract class ChromeFeatureList { - public static final CachedFlag sNotificationTrampoline = - newCachedFlag(NOTIFICATION_TRAMPOLINE, false); +@@ -1014,6 +1018,10 @@ public abstract class ChromeFeatureList { + public static final CachedFlag sNotificationTrampolineNoNewTask = + newCachedFlag(NOTIFICATION_TRAMPOLINE_NO_NEW_TASK, false); public static final CachedFlag sPCctMinimumHeight = newCachedFlag(PCCT_MINIMUM_HEIGHT, true); + public static final CachedFlag sDisableToolbarSwipeUp = + newCachedFlag(DISABLE_TOOLBAR_SWIPE_UP, false); @@ -1995,15 +1995,15 @@ diff --git a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/f public static final CachedFlag sPaintPreviewDemo = newCachedFlag(PAINT_PREVIEW_DEMO, false); public static final CachedFlag sPersistAcrossReboots = newCachedFlag(PERSIST_ACROSS_REBOOTS, false); -@@ -1241,6 +1249,8 @@ public abstract class ChromeFeatureList { - sNewTabPageCustomizationV2, +@@ -1249,6 +1257,8 @@ public abstract class ChromeFeatureList { sNotificationTrampoline, + sNotificationTrampolineNoNewTask, sPCctMinimumHeight, + sMoveTopToolbarToBottom, + sDisableToolbarSwipeUp, sPaintPreviewDemo, sPersistAcrossReboots, - sPostGetMyMemoryStateToBackground, + sPersistAcrossRebootsDebugLogs, diff --git a/chrome/browser/hub/internal/BUILD.gn b/chrome/browser/hub/internal/BUILD.gn --- a/chrome/browser/hub/internal/BUILD.gn +++ b/chrome/browser/hub/internal/BUILD.gn @@ -2045,7 +2045,7 @@ diff --git a/chrome/browser/hub/internal/android/java/src/org/chromium/chrome/br import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.profiles.ProfileProvider; import org.chromium.chrome.browser.tab.Tab; -@@ -181,6 +183,13 @@ public class HubCoordinator implements PaneHubController, BackPressHandler, OnPa +@@ -180,6 +182,13 @@ public class HubCoordinator implements PaneHubController, BackPressHandler, OnPa paneManager.getFocusedPaneSupplier(), hubColorMixer, defaultPaneId); @@ -2070,7 +2070,7 @@ diff --git a/chrome/browser/hub/internal/android/java/src/org/chromium/chrome/br import android.widget.FrameLayout.LayoutParams; import androidx.annotation.ColorInt; -@@ -20,6 +21,7 @@ import org.chromium.base.supplier.OneshotSupplier; +@@ -22,6 +23,7 @@ import org.chromium.base.supplier.SettableNonNullObservableSupplier; import org.chromium.build.annotations.MonotonicNonNull; import org.chromium.build.annotations.NullMarked; import org.chromium.build.annotations.Nullable; @@ -2078,7 +2078,7 @@ diff --git a/chrome/browser/hub/internal/android/java/src/org/chromium/chrome/br import org.chromium.chrome.browser.back_press.BackPressManager; import org.chromium.chrome.browser.profiles.ProfileProvider; import org.chromium.chrome.browser.tab.Tab; -@@ -144,7 +146,10 @@ public class HubManagerImpl implements HubManager, HubController { +@@ -146,7 +148,10 @@ public class HubManagerImpl implements HubManager, HubController { LayoutParams params = (LayoutParams) mHubContainerView.getLayoutParams(); assert params != null : "HubContainerView should always have layout params."; mStatusIndicatorHeight = height; @@ -2090,7 +2090,7 @@ diff --git a/chrome/browser/hub/internal/android/java/src/org/chromium/chrome/br mHubContainerView.setLayoutParams(params); } -@@ -154,7 +159,10 @@ public class HubManagerImpl implements HubManager, HubController { +@@ -156,7 +161,10 @@ public class HubManagerImpl implements HubManager, HubController { LayoutParams params = (LayoutParams) mHubContainerView.getLayoutParams(); assert params != null : "HubContainerView should always have layout params."; mAppHeaderHeight = height; @@ -2102,7 +2102,7 @@ diff --git a/chrome/browser/hub/internal/android/java/src/org/chromium/chrome/br mHubContainerView.setLayoutParams(params); } -@@ -302,6 +310,8 @@ public class HubManagerImpl implements HubManager, HubController { +@@ -304,6 +312,8 @@ public class HubManagerImpl implements HubManager, HubController { } mSnackbarOverrideToken = mSnackbarManager.pushParentViewToOverrideStack( @@ -2213,7 +2213,7 @@ diff --git a/chrome/browser/hub/internal/android/res/layout/hub_toolbar_layout.x diff --git a/chrome/browser/prefs/browser_prefs.cc b/chrome/browser/prefs/browser_prefs.cc --- a/chrome/browser/prefs/browser_prefs.cc +++ b/chrome/browser/prefs/browser_prefs.cc -@@ -2075,7 +2075,7 @@ void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry, +@@ -2137,7 +2137,7 @@ void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry, #if BUILDFLAG(IS_ANDROID) registry->RegisterBooleanPref(prefs::kVirtualKeyboardResizesLayoutByDefault, @@ -2415,14 +2415,14 @@ diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/brow diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarCoordinator.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarCoordinator.java --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarCoordinator.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarCoordinator.java -@@ -259,6 +259,7 @@ public class LocationBarCoordinator +@@ -286,6 +286,7 @@ public class LocationBarCoordinator ? ControlsPosition.TOP : mBrowserControlsStateProvider.getControlsPosition(), mDeferredIMEWindowInsetApplicationCallback::getCurrentKeyboardHeight, + mDeferredIMEWindowInsetApplicationCallback::getSystemBarInsetsBottom, bottomWindowPaddingSupplier, - locationBarDataProvider); - + locationBarDataProvider, + fuseboxStateSupplier); diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/OmniboxSuggestionsDropdownEmbedderImpl.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/OmniboxSuggestionsDropdownEmbedderImpl.java --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/OmniboxSuggestionsDropdownEmbedderImpl.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/OmniboxSuggestionsDropdownEmbedderImpl.java @@ -2434,15 +2434,15 @@ diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/brow import androidx.core.view.WindowInsetsCompat; import org.chromium.base.Callback; -@@ -27,6 +28,7 @@ import org.chromium.chrome.browser.browser_controls.BrowserControlsStateProvider - import org.chromium.chrome.browser.flags.ChromeFeatureList; +@@ -29,6 +30,7 @@ import org.chromium.chrome.browser.flags.ChromeFeatureList; + import org.chromium.chrome.browser.omnibox.fusebox.FuseboxCoordinator.FuseboxState; import org.chromium.chrome.browser.omnibox.styles.OmniboxResourceProvider; import org.chromium.chrome.browser.omnibox.suggestions.OmniboxSuggestionsDropdownEmbedder; +import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.ui.base.DeviceFormFactor; import org.chromium.ui.base.ViewUtils; import org.chromium.ui.base.WindowAndroid; -@@ -51,6 +53,7 @@ class OmniboxSuggestionsDropdownEmbedderImpl +@@ -53,6 +55,7 @@ class OmniboxSuggestionsDropdownEmbedderImpl private final boolean mForcePhoneStyleOmnibox; private final Supplier<@ControlsPosition Integer> mControlsPositionSupplier; private final Supplier mKeyboardHeightSupplier; @@ -2450,15 +2450,15 @@ diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/brow private final Supplier mBottomWindowPaddingSupplier; private final Context mContext; // Reusable int array to pass to positioning methods that operate on a two element int array. -@@ -92,6 +95,7 @@ class OmniboxSuggestionsDropdownEmbedderImpl +@@ -95,6 +98,7 @@ class OmniboxSuggestionsDropdownEmbedderImpl @Nullable View baseChromeLayout, Supplier<@ControlsPosition Integer> controlsPositionSupplier, Supplier keyboardHeightSupplier, + Supplier systemBarInsetsBottomSupplier, Supplier bottomWindowPaddingSupplier, - LocationBarDataProvider locationBarDataProvider) { - mWindowAndroid = windowAndroid; -@@ -100,6 +104,7 @@ class OmniboxSuggestionsDropdownEmbedderImpl + LocationBarDataProvider locationBarDataProvider, + Supplier fuseboxStateSupplier) { +@@ -104,6 +108,7 @@ class OmniboxSuggestionsDropdownEmbedderImpl mForcePhoneStyleOmnibox = forcePhoneStyleOmnibox; mControlsPositionSupplier = controlsPositionSupplier; mKeyboardHeightSupplier = keyboardHeightSupplier; @@ -2466,7 +2466,7 @@ diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/brow mBottomWindowPaddingSupplier = bottomWindowPaddingSupplier; mContext = mAnchorView.getContext(); mContext.registerComponentCallbacks(this); -@@ -121,6 +126,11 @@ class OmniboxSuggestionsDropdownEmbedderImpl +@@ -126,6 +131,11 @@ class OmniboxSuggestionsDropdownEmbedderImpl mOmniboxAlignmentSupplier.removeObserver(obs); } @@ -2478,7 +2478,7 @@ diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/brow @Override public OmniboxAlignment getCurrentAlignment() { return assertNonNull(mOmniboxAlignmentSupplier.get()); -@@ -152,6 +162,10 @@ class OmniboxSuggestionsDropdownEmbedderImpl +@@ -157,6 +167,10 @@ class OmniboxSuggestionsDropdownEmbedderImpl @Override public void onDetachedFromWindow() { @@ -2489,7 +2489,7 @@ diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/brow mAnchorView.removeOnLayoutChangeListener(this); mAlignmentView.removeOnLayoutChangeListener(this); mAnchorView.getViewTreeObserver().removeOnGlobalLayoutListener(this); -@@ -257,6 +271,9 @@ class OmniboxSuggestionsDropdownEmbedderImpl +@@ -263,6 +277,9 @@ class OmniboxSuggestionsDropdownEmbedderImpl } else { ViewUtils.getRelativeLayoutPosition(contentView, mAnchorView, mPositionArray); top = mPositionArray[1] + mAnchorView.getMeasuredHeight() - contentView.getPaddingTop(); @@ -2499,7 +2499,7 @@ diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/brow } if (isTablet()) { -@@ -335,6 +352,13 @@ class OmniboxSuggestionsDropdownEmbedderImpl +@@ -353,6 +370,13 @@ class OmniboxSuggestionsDropdownEmbedderImpl height = Math.min(windowSpace, contentSpace) - top; } @@ -2513,7 +2513,7 @@ diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/brow // TODO(pnoland@, https://crbug.com/1416985): avoid pushing changes that are identical to // the previous alignment value. OmniboxAlignment omniboxAlignment = -@@ -343,6 +367,14 @@ class OmniboxSuggestionsDropdownEmbedderImpl +@@ -361,6 +385,14 @@ class OmniboxSuggestionsDropdownEmbedderImpl mOmniboxAlignmentSupplier.set(omniboxAlignment); } @@ -2539,7 +2539,7 @@ diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/brow import androidx.annotation.ColorInt; import androidx.annotation.VisibleForTesting; import androidx.core.view.ViewCompat; -@@ -51,6 +52,7 @@ import org.chromium.ui.modaldialog.ModalDialogManager; +@@ -53,6 +54,7 @@ import org.chromium.ui.modaldialog.ModalDialogManager; import org.chromium.ui.modelutil.LazyConstructionPropertyMcp; import org.chromium.ui.modelutil.MVCListAdapter.ModelList; import org.chromium.ui.modelutil.PropertyModel; @@ -2547,7 +2547,7 @@ diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/brow import java.util.ArrayList; import java.util.List; -@@ -70,6 +72,7 @@ public class AutocompleteCoordinator implements OmniboxSuggestionsVisualState { +@@ -75,6 +77,7 @@ public class AutocompleteCoordinator implements OmniboxSuggestionsVisualState { private @Nullable OmniboxSuggestionsDropdown mDropdown; private final ObserverList mScrollListenerList = new ObserverList<>(); @@ -2555,7 +2555,7 @@ diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/brow /** An observer watching for changes to the visual state of the omnibox suggestions. */ public interface OmniboxSuggestionsVisualStateObserver { -@@ -104,6 +107,7 @@ public class AutocompleteCoordinator implements OmniboxSuggestionsVisualState { +@@ -112,6 +115,7 @@ public class AutocompleteCoordinator implements OmniboxSuggestionsVisualState { Context context = parent.getContext(); ModelList listItems = new ModelList(); @@ -2563,7 +2563,7 @@ diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/brow PropertyModel listModel = new PropertyModel.Builder(SuggestionListProperties.ALL_KEYS) .with(SuggestionListProperties.EMBEDDER, dropdownEmbedder) -@@ -229,6 +233,18 @@ public class AutocompleteCoordinator implements OmniboxSuggestionsVisualState { +@@ -242,6 +246,18 @@ public class AutocompleteCoordinator implements OmniboxSuggestionsVisualState { container.findViewById(R.id.omnibox_suggestions_dropdown); dropdown.setAdapter(mAdapter); @@ -2585,7 +2585,7 @@ diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/brow diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediator.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediator.java --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediator.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediator.java -@@ -74,6 +74,8 @@ import org.chromium.ui.modelutil.PropertyModel; +@@ -76,6 +76,8 @@ import org.chromium.ui.modelutil.PropertyModel; import org.chromium.ui.mojom.WindowOpenDisposition; import org.chromium.url.GURL; @@ -2594,10 +2594,10 @@ diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/brow import java.util.List; import java.util.function.Supplier; -@@ -1311,7 +1313,9 @@ class AutocompleteMediator - @Override +@@ -1364,7 +1366,9 @@ class AutocompleteMediator public void onSuggestionDropdownScroll() { - mSuggestionsListScrolled = true; + if (mAutocompleteInput == null) return; + mAutocompleteInput.setSuggestionsListScrolled(); - mDelegate.setKeyboardVisibility(false, false); + if (!ChromeFeatureList.sMoveTopToolbarToBottom.isEnabled()) { + mDelegate.setKeyboardVisibility(false, false); @@ -2608,7 +2608,7 @@ diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/brow diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/OmniboxSuggestionsDropdown.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/OmniboxSuggestionsDropdown.java --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/OmniboxSuggestionsDropdown.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/OmniboxSuggestionsDropdown.java -@@ -294,6 +294,9 @@ public class OmniboxSuggestionsDropdown extends RecyclerView { +@@ -293,6 +293,9 @@ public class OmniboxSuggestionsDropdown extends RecyclerView { resources.getDimensionPixelOffset(R.dimen.omnibox_suggestion_list_padding_bottom); int paddingTop = resources.getDimensionPixelOffset(R.dimen.omnibox_suggestion_list_padding_top); @@ -2618,7 +2618,7 @@ diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/brow this.setPaddingRelative(0, paddingTop, 0, mBaseBottomPadding); // Disable the scrollbar since it causes the hover events happening near the -@@ -525,6 +528,8 @@ public class OmniboxSuggestionsDropdown extends RecyclerView { +@@ -503,6 +506,8 @@ public class OmniboxSuggestionsDropdown extends RecyclerView { mToolbarOnTop = !(ChromeFeatureList.sAndroidBottomToolbarV2ReverseOrderSuggestionsList.getValue() && toolbarPosition == ControlsPosition.BOTTOM); @@ -2682,7 +2682,7 @@ diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/brow 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 -@@ -1536,6 +1536,12 @@ Your Google account may have other forms of browsing history like searches and a +@@ -1551,6 +1551,12 @@ Your Google account may have other forms of browsing history like searches and a Force Tablet Mode @@ -2698,7 +2698,7 @@ diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chro diff --git a/chrome/browser/ui/android/toolbar/BUILD.gn b/chrome/browser/ui/android/toolbar/BUILD.gn --- a/chrome/browser/ui/android/toolbar/BUILD.gn +++ b/chrome/browser/ui/android/toolbar/BUILD.gn -@@ -219,6 +219,7 @@ android_library("java") { +@@ -227,6 +227,7 @@ android_library("core_java") { "//content/public/android:content_java", "//third_party/android_deps:material_design_java", "//third_party/androidx:androidx_annotation_annotation_experimental_java", @@ -2717,7 +2717,7 @@ diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/brow /** Handles showing and hiding a scrim when url bar focus changes. */ @NullMarked -@@ -68,6 +69,10 @@ public class LocationBarFocusScrimHandler implements UrlFocusChangeListener { +@@ -66,6 +67,10 @@ public class LocationBarFocusScrimHandler implements UrlFocusChangeListener { mContext = context; int topMargin = tabStripHeightSupplier.get(); @@ -2801,7 +2801,7 @@ diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/brow public BottomControlsCoordinator( @@ -107,7 +111,9 @@ public class BottomControlsCoordinator implements BackPressHandler { TabObscuringHandler tabObscuringHandler, - ObservableSupplier overlayPanelVisibilitySupplier, + NonNullObservableSupplier overlayPanelVisibilitySupplier, NullableObservableSupplier<@BrowserControlsState Integer> constraintsSupplier, - Supplier readAloudRestoringSupplier) { + Supplier readAloudRestoringSupplier, @@ -2823,7 +2823,7 @@ diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/brow diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/bottom/BottomControlsMediator.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/bottom/BottomControlsMediator.java --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/bottom/BottomControlsMediator.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/bottom/BottomControlsMediator.java -@@ -26,6 +26,7 @@ import org.chromium.ui.KeyboardVisibilityDelegate; +@@ -27,6 +27,7 @@ import org.chromium.ui.KeyboardVisibilityDelegate; import org.chromium.ui.base.WindowAndroid; import org.chromium.ui.edge_to_edge.EdgeToEdgeSupplier.ChangeObserver; import org.chromium.ui.modelutil.PropertyModel; @@ -2831,7 +2831,7 @@ diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/brow import java.util.function.Supplier; -@@ -154,6 +155,12 @@ class BottomControlsMediator +@@ -156,6 +157,12 @@ class BottomControlsMediator void setBottomControlsVisible(boolean visible) { boolean visibilityChanged = mIsBottomControlsVisible != visible; @@ -2844,7 +2844,7 @@ diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/brow mIsBottomControlsVisible = visible; updateCompositedViewVisibility(); updateAndroidViewVisibility(); -@@ -183,6 +190,20 @@ class BottomControlsMediator +@@ -185,6 +192,20 @@ class BottomControlsMediator mTabObscuringHandler.removeObserver(this); } @@ -2865,7 +2865,7 @@ diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/brow @Override public void onBottomControlsHeightChanged( int bottomControlsHeight, int bottomControlsMinHeight) { -@@ -272,11 +293,13 @@ class BottomControlsMediator +@@ -274,11 +295,13 @@ class BottomControlsMediator && !mIsInSwipeLayout && getBrowserControls().getBottomControlOffset() == 0; if (visible) { @@ -3019,10 +3019,10 @@ diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/brow /** The public interface for the top toolbar texture component. */ @NullMarked public class TopToolbarOverlayCoordinator implements SceneOverlay { -@@ -77,6 +80,12 @@ public class TopToolbarOverlayCoordinator implements SceneOverlay { +@@ -76,6 +79,12 @@ public class TopToolbarOverlayCoordinator implements SceneOverlay { browserControlsStateProvider.getContentOffset()) .with(TopToolbarOverlayProperties.ANONYMIZE, false) - .with(TopToolbarOverlayProperties.SHOW_SHADOW, showHairline) + .with(TopToolbarOverlayProperties.SHOW_SHADOW, true) + .with(TopToolbarOverlayProperties.VIEWPORT_HEIGHT, 0) + .with(TopToolbarOverlayProperties.TOOLBAR_HEIGHT, + browserControlsStateProvider.getTopControlsHeight() @@ -3032,7 +3032,7 @@ diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/brow .build(); mSceneLayer = new TopToolbarSceneLayer(resourceManagerSupplier); mChangeProcessor = -@@ -152,6 +161,7 @@ public class TopToolbarOverlayCoordinator implements SceneOverlay { +@@ -151,6 +160,7 @@ public class TopToolbarOverlayCoordinator implements SceneOverlay { @Override public SceneOverlayLayer getUpdatedSceneOverlayTree( RectF viewport, RectF visibleViewport, ResourceManager resourceManager) { @@ -3100,7 +3100,7 @@ diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/brow diff --git a/components/browser_ui/accessibility/android/java/res/xml/accessibility_preferences.xml b/components/browser_ui/accessibility/android/java/res/xml/accessibility_preferences.xml --- a/components/browser_ui/accessibility/android/java/res/xml/accessibility_preferences.xml +++ b/components/browser_ui/accessibility/android/java/res/xml/accessibility_preferences.xml -@@ -71,4 +71,12 @@ found in the LICENSE file. +@@ -76,4 +76,12 @@ found in the LICENSE file. app:featureName="disable-pull-to-refresh-effect" app:needRestart="true" /> @@ -3116,7 +3116,7 @@ diff --git a/components/browser_ui/accessibility/android/java/res/xml/accessibil diff --git a/components/browser_ui/accessibility/android/java/src/org/chromium/components/browser_ui/accessibility/AccessibilitySettings.java b/components/browser_ui/accessibility/android/java/src/org/chromium/components/browser_ui/accessibility/AccessibilitySettings.java --- a/components/browser_ui/accessibility/android/java/src/org/chromium/components/browser_ui/accessibility/AccessibilitySettings.java +++ b/components/browser_ui/accessibility/android/java/src/org/chromium/components/browser_ui/accessibility/AccessibilitySettings.java -@@ -59,6 +59,11 @@ public class AccessibilitySettings extends ChromeBaseSettingsFragment +@@ -84,6 +84,11 @@ public class AccessibilitySettings extends ChromeBaseSettingsFragment private BooleanPreferenceDelegate mForceTabletUIDelegate; static final String PREF_FORCE_TABLET_UI = "force_tablet_ui"; @@ -3128,7 +3128,7 @@ diff --git a/components/browser_ui/accessibility/android/java/src/org/chromium/c private PageZoomPreference mPageZoomDefaultZoomPref; private ChromeSwitchPreference mPageZoomIncludeOSAdjustment; private ChromeSwitchPreference mPageZoomAlwaysShowPref; -@@ -76,6 +81,10 @@ public class AccessibilitySettings extends ChromeBaseSettingsFragment +@@ -102,6 +107,10 @@ public class AccessibilitySettings extends ChromeBaseSettingsFragment mDelegate = delegate; } @@ -3139,7 +3139,7 @@ diff --git a/components/browser_ui/accessibility/android/java/src/org/chromium/c @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); -@@ -141,6 +150,18 @@ public class AccessibilitySettings extends ChromeBaseSettingsFragment +@@ -177,6 +186,18 @@ public class AccessibilitySettings extends ChromeBaseSettingsFragment forceTabletUiPref.setChecked(mForceTabletUIDelegate.getValue()); forceTabletUiPref.setOnPreferenceChangeListener(this); @@ -3158,7 +3158,7 @@ diff --git a/components/browser_ui/accessibility/android/java/src/org/chromium/c Preference captions = findPreference(PREF_CAPTIONS); captions.setOnPreferenceClickListener( preference -> { -@@ -243,6 +264,12 @@ public class AccessibilitySettings extends ChromeBaseSettingsFragment +@@ -296,6 +317,12 @@ public class AccessibilitySettings extends ChromeBaseSettingsFragment mDelegate.getBrowserContextHandle(), (Integer) newValue); } else if (PREF_PAGE_ZOOM_ALWAYS_SHOW.equals(preference.getKey())) { PageZoomUtils.setShouldAlwaysShowZoomMenuItem((Boolean) newValue); @@ -3174,7 +3174,7 @@ diff --git a/components/browser_ui/accessibility/android/java/src/org/chromium/c diff --git a/components/browser_ui/accessibility/android/java/src/org/chromium/components/browser_ui/accessibility/AccessibilitySettingsDelegate.java b/components/browser_ui/accessibility/android/java/src/org/chromium/components/browser_ui/accessibility/AccessibilitySettingsDelegate.java --- a/components/browser_ui/accessibility/android/java/src/org/chromium/components/browser_ui/accessibility/AccessibilitySettingsDelegate.java +++ b/components/browser_ui/accessibility/android/java/src/org/chromium/components/browser_ui/accessibility/AccessibilitySettingsDelegate.java -@@ -5,7 +5,11 @@ +@@ -5,6 +5,9 @@ package org.chromium.components.browser_ui.accessibility; import org.chromium.build.annotations.NullMarked; @@ -3182,11 +3182,9 @@ diff --git a/components/browser_ui/accessibility/android/java/src/org/chromium/c +import android.app.Activity; + import org.chromium.components.browser_ui.settings.SettingsNavigation; -+ + import org.chromium.components.dom_distiller.core.DistilledPagePrefs; import org.chromium.content_public.browser.BrowserContextHandle; - - /** -@@ -36,6 +40,11 @@ public interface AccessibilitySettingsDelegate { +@@ -37,6 +40,11 @@ public interface AccessibilitySettingsDelegate { void setValue(boolean value); } @@ -3201,18 +3199,20 @@ diff --git a/components/browser_ui/accessibility/android/java/src/org/chromium/c diff --git a/components/viz/common/features.cc b/components/viz/common/features.cc --- a/components/viz/common/features.cc +++ b/components/viz/common/features.cc -@@ -38,6 +38,7 @@ namespace features { - // offsets provided by the embedded renderer, circumventing browser main - // involvement. For now, this applies only to top controls. - BASE_FEATURE(kAndroidBrowserControlsInViz, base::FEATURE_ENABLED_BY_DEFAULT); -+SET_CROMITE_FEATURE_DISABLED(kAndroidBrowserControlsInViz); +@@ -33,7 +33,8 @@ + namespace features { + +-#if BUILDFLAG(IS_ANDROID) ++#if BUILDFLAG(IS_ANDROID)SET_CROMITE_FEATURE_DISABLED(kAndroidBrowserControlsInViz); ++ // If this flag is enabled, a DumpWithoutCrashing() is captured when a bad // state is detected when moving the composited UI. For example, this could + // mean scrolling without a resource, or OffsetTagValues trying to position diff --git a/content/browser/renderer_host/render_widget_host_view_android.cc b/content/browser/renderer_host/render_widget_host_view_android.cc --- a/content/browser/renderer_host/render_widget_host_view_android.cc +++ b/content/browser/renderer_host/render_widget_host_view_android.cc -@@ -34,6 +34,7 @@ +@@ -35,6 +35,7 @@ #include "base/task/thread_pool.h" #include "base/threading/scoped_blocking_call.h" #include "base/trace_event/trace_event.h" @@ -3220,7 +3220,7 @@ diff --git a/content/browser/renderer_host/render_widget_host_view_android.cc b/ #include "cc/base/math_util.h" #include "cc/slim/layer.h" #include "components/input/cursor_manager.h" -@@ -957,6 +958,8 @@ void RenderWidgetHostViewAndroid::OnRenderFrameMetadataChangedBeforeActivation( +@@ -954,6 +955,8 @@ void RenderWidgetHostViewAndroid::OnRenderFrameMetadataChangedBeforeActivation( // factor. Thus, |top_content_offset| in CSS pixels is also in DIPs. float top_content_offset = metadata.top_controls_height * metadata.top_controls_shown_ratio; diff --git a/build/patches/Multi-Screen-Window-Placement-API-fix.patch b/build/patches/Multi-Screen-Window-Placement-API-fix.patch index 9e90c1b7..1afe5051 100644 --- a/build/patches/Multi-Screen-Window-Placement-API-fix.patch +++ b/build/patches/Multi-Screen-Window-Placement-API-fix.patch @@ -9,16 +9,16 @@ License: GPL-2.0-or-later - https://spdx.org/licenses/GPL-2.0-or-later.html --- .../permissions/permission_service_impl.cc | 1 - .../renderer_host/render_frame_host_impl.cc | 3 +- - .../core/frame/cached_permission_status.cc | 6 ++-- + .../core/frame/cached_permission_status.cc | 8 ++--- .../core/frame/cached_permission_status.h | 1 + .../blink/renderer/core/frame/screen.cc | 35 +++++++++++++++++-- .../blink/renderer/core/frame/screen.h | 17 ++++++++- - 6 files changed, 55 insertions(+), 8 deletions(-) + 6 files changed, 56 insertions(+), 9 deletions(-) diff --git a/content/browser/permissions/permission_service_impl.cc b/content/browser/permissions/permission_service_impl.cc --- a/content/browser/permissions/permission_service_impl.cc +++ b/content/browser/permissions/permission_service_impl.cc -@@ -384,7 +384,6 @@ void PermissionServiceImpl::AddPermissionObserver( +@@ -438,7 +438,6 @@ void PermissionServiceImpl::AddPermissionObserver( ReceivedBadMessage(); return; } @@ -29,7 +29,7 @@ diff --git a/content/browser/permissions/permission_service_impl.cc b/content/br diff --git a/content/browser/renderer_host/render_frame_host_impl.cc b/content/browser/renderer_host/render_frame_host_impl.cc --- a/content/browser/renderer_host/render_frame_host_impl.cc +++ b/content/browser/renderer_host/render_frame_host_impl.cc -@@ -19326,7 +19326,8 @@ RenderFrameHostImpl::GetCachedPermissionStatuses() { +@@ -19453,7 +19453,8 @@ RenderFrameHostImpl::GetCachedPermissionStatuses() { {PermissionName::WEB_APP_INSTALLATION, PermissionType::WEB_APP_INSTALLATION}, #endif @@ -42,16 +42,18 @@ diff --git a/content/browser/renderer_host/render_frame_host_impl.cc b/content/b diff --git a/third_party/blink/renderer/core/frame/cached_permission_status.cc b/third_party/blink/renderer/core/frame/cached_permission_status.cc --- a/third_party/blink/renderer/core/frame/cached_permission_status.cc +++ b/third_party/blink/renderer/core/frame/cached_permission_status.cc -@@ -37,9 +37,9 @@ CachedPermissionStatus::CachedPermissionStatus(ExecutionContext* context) +@@ -37,10 +37,10 @@ CachedPermissionStatus::CachedPermissionStatus(ExecutionContext* context) permission_service_(context), permission_observer_receivers_(this, context) { CHECK(context); - CHECK(RuntimeEnabledFeatures::PermissionElementEnabled(context) || - RuntimeEnabledFeatures::GeolocationElementEnabled(context) || -- RuntimeEnabledFeatures::UserMediaElementEnabled(context)); +- RuntimeEnabledFeatures::UserMediaElementEnabled(context) || +- RuntimeEnabledFeatures::InstallElementEnabled(context)); + // CHECK(RuntimeEnabledFeatures::PermissionElementEnabled(context) || + // RuntimeEnabledFeatures::GeolocationElementEnabled(context) || -+ // RuntimeEnabledFeatures::UserMediaElementEnabled(context)); see https://source.chromium.org/chromium/chromium/src/+/81a9e9b66a03e12cb438eef0834f5e5f7a0506ee ++ // RuntimeEnabledFeatures::UserMediaElementEnabled(context) || ++ RuntimeEnabledFeatures::InstallElementEnabled(context)); see https://source.chromium.org/chromium/chromium/src/+/81a9e9b66a03e12cb438eef0834f5e5f7a0506ee } void CachedPermissionStatus::Trace(Visitor* visitor) const { diff --git a/build/patches/OpenSearch-miscellaneous.patch b/build/patches/OpenSearch-miscellaneous.patch index 9d9caec3..9e213c73 100644 --- a/build/patches/OpenSearch-miscellaneous.patch +++ b/build/patches/OpenSearch-miscellaneous.patch @@ -22,10 +22,10 @@ License: GPL-3.0-only - https://spdx.org/licenses/GPL-3.0-only.html diff --git a/chrome/browser/search_engines/android/java/src/org/chromium/chrome/browser/search_engines/settings/SearchEngineAdapter.java b/chrome/browser/search_engines/android/java/src/org/chromium/chrome/browser/search_engines/settings/SearchEngineAdapter.java --- a/chrome/browser/search_engines/android/java/src/org/chromium/chrome/browser/search_engines/settings/SearchEngineAdapter.java +++ b/chrome/browser/search_engines/android/java/src/org/chromium/chrome/browser/search_engines/settings/SearchEngineAdapter.java -@@ -334,7 +334,9 @@ public class SearchEngineAdapter extends BaseAdapter - continue; +@@ -320,7 +320,9 @@ public class SearchEngineAdapter extends BaseAdapter } - if (recentEngineNum < MAX_RECENT_ENGINE_NUM + if (shouldShowRecentSearchEngines + && recentEngineNum < MAX_RECENT_ENGINE_NUM - && templateUrl.getLastVisitedTime() > displayTime) { + // newly added search engines have never been visited + && (templateUrl.getLastVisitedTime() == 0 || @@ -176,7 +176,7 @@ diff --git a/chrome/renderer/chrome_render_frame_observer.cc b/chrome/renderer/c #include "base/metrics/histogram_macros.h" #include "base/no_destructor.h" #include "base/strings/string_number_conversions.h" -@@ -272,6 +273,7 @@ void ChromeRenderFrameObserver::DidFinishLoad() { +@@ -274,6 +275,7 @@ void ChromeRenderFrameObserver::DidFinishLoad() { GURL osdd_url = frame->GetDocument().OpenSearchDescriptionURL(); if (!osdd_url.is_empty()) { @@ -309,7 +309,7 @@ diff --git a/components/search_engines/template_url_parser.cc b/components/searc diff --git a/components/search_engines/template_url_service.h b/components/search_engines/template_url_service.h --- a/components/search_engines/template_url_service.h +++ b/components/search_engines/template_url_service.h -@@ -383,7 +383,10 @@ class TemplateURLService final : public WebDataServiceConsumer, +@@ -385,7 +385,10 @@ class TemplateURLService final : public WebDataServiceConsumer, void UpdateProviderFavicons(const GURL& potential_search_url, const GURL& favicon_url); @@ -321,7 +321,7 @@ diff --git a/components/search_engines/template_url_service.h b/components/searc // regardless of |url| if the default search provider is managed by policy or // controlled by an extension. bool CanMakeDefault(const TemplateURL* url) const; -@@ -781,9 +784,6 @@ class TemplateURLService final : public WebDataServiceConsumer, +@@ -783,9 +786,6 @@ class TemplateURLService final : public WebDataServiceConsumer, // SetKeywordSearchTermsForURL is invoked. void UpdateKeywordSearchTermsForURL(const URLVisitedDetails& details); diff --git a/build/patches/Set-the-screen-frame-rate-to-60-Hz.patch b/build/patches/Set-the-screen-frame-rate-to-60-Hz.patch index bf07ac65..95736e4a 100644 --- a/build/patches/Set-the-screen-frame-rate-to-60-Hz.patch +++ b/build/patches/Set-the-screen-frame-rate-to-60-Hz.patch @@ -15,9 +15,9 @@ License: GPL-2.0-or-later - https://spdx.org/licenses/GPL-2.0-or-later.html chrome/browser/about_flags.cc | 6 +++--- .../browser/chrome_content_browser_client.cc | 11 +++++++++++ .../Set-the-screen-frame-rate-to-60-Hz.grdp | 9 +++++++++ - components/viz/common/features.cc | 1 + .../common/frame_sinks/begin_frame_source.cc | 14 +++++++++++++- .../common/frame_sinks/begin_frame_source.h | 1 + + .../frame_sinks/delay_based_time_source.cc | 2 +- components/viz/service/display/display.cc | 18 ++++++++++++++++-- .../external_begin_frame_source_android.cc | 13 +++++++++++++ .../external_begin_frame_source_android.h | 2 ++ @@ -25,7 +25,7 @@ License: GPL-2.0-or-later - https://spdx.org/licenses/GPL-2.0-or-later.html .../Set-the-screen-frame-rate-to-60-Hz.inc | 7 +++++++ .../core/animation/animation_clock.cc | 11 ++++++++--- .../core/view_transition/view_transition.cc | 2 ++ - 16 files changed, 120 insertions(+), 19 deletions(-) + 16 files changed, 120 insertions(+), 20 deletions(-) create mode 100644 chrome/browser/ui/android/strings/cromite_android_chrome_strings_grd/Set-the-screen-frame-rate-to-60-Hz.grdp create mode 100644 cromite_flags/chrome/browser/about_flags_cc/Set-the-screen-frame-rate-to-60-Hz.inc @@ -58,7 +58,7 @@ diff --git a/cc/base/features.cc b/cc/base/features.cc diff --git a/cc/scheduler/scheduler_state_machine.cc b/cc/scheduler/scheduler_state_machine.cc --- a/cc/scheduler/scheduler_state_machine.cc +++ b/cc/scheduler/scheduler_state_machine.cc -@@ -34,7 +34,7 @@ const int kMaxPendingSubmitFrames = 1; +@@ -35,7 +35,7 @@ const int kMaxPendingSubmitFrames = 1; bool IsEligibleToThrottleMainFrameRate() { #if BUILDFLAG(IS_ANDROID) // Still requires balancing tradeoffs for desktop Android, not enabled yet. @@ -67,7 +67,7 @@ diff --git a/cc/scheduler/scheduler_state_machine.cc b/cc/scheduler/scheduler_st #else return true; #endif -@@ -1578,6 +1578,15 @@ void SchedulerStateMachine::FrameIntervalUpdated( +@@ -1586,6 +1586,15 @@ void SchedulerStateMachine::FrameIntervalUpdated( // // Apply some slack, so that if for some reason the interval is a bit larger // than 8.33333333333333ms, then we catch it still. @@ -83,7 +83,7 @@ diff --git a/cc/scheduler/scheduler_state_machine.cc b/cc/scheduler/scheduler_st constexpr float kSlackFactor = .9; bool fast_vsync_interval = frame_interval < base::Hertz(120) * (1 / kSlackFactor); -@@ -1903,6 +1912,14 @@ base::TimeTicks SchedulerStateMachine::Now() const { +@@ -1917,6 +1926,14 @@ void SchedulerStateMachine::SetRequestHighFramerate(bool flag) { } base::TimeDelta SchedulerStateMachine::MainFrameThrottledInterval() const { @@ -96,8 +96,8 @@ diff --git a/cc/scheduler/scheduler_state_machine.cc b/cc/scheduler/scheduler_st + } + if ((true)) return base::TimeDelta(); if (!throttle_frame_rate_) { - return main_frame_throttled_interval_; - } else { + if (high_framerate_requests_count_ && + base::FeatureList::IsEnabled( diff --git a/chrome/android/java/res/xml/privacy_preferences.xml b/chrome/android/java/res/xml/privacy_preferences.xml --- a/chrome/android/java/res/xml/privacy_preferences.xml +++ b/chrome/android/java/res/xml/privacy_preferences.xml @@ -117,7 +117,7 @@ diff --git a/chrome/android/java/res/xml/privacy_preferences.xml b/chrome/androi 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 -@@ -11647,9 +11647,9 @@ const FeatureEntry kFeatureEntries[] = { +@@ -10985,9 +10985,9 @@ const FeatureEntry kFeatureEntries[] = { FEATURE_VALUE_TYPE(::features::kBlockRootWindowAccessibleNameChangeEvent)}, #endif // BUILDFLAG(IS_MAC) @@ -133,7 +133,7 @@ diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc --- a/chrome/browser/chrome_content_browser_client.cc +++ b/chrome/browser/chrome_content_browser_client.cc -@@ -51,6 +51,7 @@ +@@ -53,6 +53,7 @@ #include "build/branding_buildflags.h" #include "build/build_config.h" #include "build/config/chromebox_for_meetings/buildflags.h" // PLATFORM_CFM @@ -141,7 +141,7 @@ diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/ch #include "chrome/browser/after_startup_task_utils.h" #include "chrome/browser/ai/ai_manager.h" #include "chrome/browser/app_mode/app_mode_utils.h" -@@ -302,6 +303,7 @@ +@@ -310,6 +311,7 @@ #include "components/variations/variations_associated_data.h" #include "components/variations/variations_switches.h" #include "components/version_info/version_info.h" @@ -149,7 +149,7 @@ diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/ch #include "components/webapps/common/web_app_id.h" #include "components/webui/chrome_urls/pref_names.h" #include "content/public/browser/attribution_data_model.h" -@@ -2720,6 +2722,15 @@ void ChromeContentBrowserClient::AppendExtraCommandLineSwitches( +@@ -2749,6 +2751,15 @@ void ChromeContentBrowserClient::AppendExtraCommandLineSwitches( command_line->AppendSwitchASCII(ash::switches::kHomedir, homedir.value()); #endif @@ -179,17 +179,6 @@ new file mode 100644 + Throttle compositor frame rate to 60fps, even when VSync rate is higher. + + -diff --git a/components/viz/common/features.cc b/components/viz/common/features.cc ---- a/components/viz/common/features.cc -+++ b/components/viz/common/features.cc -@@ -84,6 +84,7 @@ const char kMaxOverlaysParam[] = "max_overlays"; - BASE_FEATURE(kDelegatedCompositing, base::FEATURE_DISABLED_BY_DEFAULT); - - BASE_FEATURE(kAvoidDuplicateDelayBeginFrame, base::FEATURE_ENABLED_BY_DEFAULT); -+SET_CROMITE_FEATURE_ENABLED(kAvoidDuplicateDelayBeginFrame); - - const char kDrawQuadSplit[] = "num_of_splits"; - diff --git a/components/viz/common/frame_sinks/begin_frame_source.cc b/components/viz/common/frame_sinks/begin_frame_source.cc --- a/components/viz/common/frame_sinks/begin_frame_source.cc +++ b/components/viz/common/frame_sinks/begin_frame_source.cc @@ -201,7 +190,7 @@ diff --git a/components/viz/common/frame_sinks/begin_frame_source.cc b/component namespace viz { -@@ -260,7 +261,10 @@ BackToBackBeginFrameSource::BackToBackBeginFrameSource( +@@ -261,7 +262,10 @@ BackToBackBeginFrameSource::BackToBackBeginFrameSource( time_source_->SetClient(this); // The time_source_ ticks immediately, so we SetActive(true) for a single // tick when we need it, and keep it as SetActive(false) otherwise. @@ -213,7 +202,7 @@ diff --git a/components/viz/common/frame_sinks/begin_frame_source.cc b/component } BackToBackBeginFrameSource::~BackToBackBeginFrameSource() = default; -@@ -318,6 +322,14 @@ void BackToBackBeginFrameSource::OnTimerTick() { +@@ -319,6 +323,14 @@ void BackToBackBeginFrameSource::OnTimerTick() { } base::TimeTicks frame_time = time_source_->LastTickTime(); base::TimeDelta interval = max_vrr_interval_.value_or(vsync_interval_); @@ -227,11 +216,11 @@ diff --git a/components/viz/common/frame_sinks/begin_frame_source.cc b/component + } BeginFrameArgs args = BeginFrameArgs::Create( BEGINFRAME_FROM_HERE, source_id(), next_sequence_number_, frame_time, - frame_time + interval, interval, BeginFrameArgs::NORMAL); + frame_time + interval, interval, BeginFrameArgs::NORMAL, vsync_interval_); diff --git a/components/viz/common/frame_sinks/begin_frame_source.h b/components/viz/common/frame_sinks/begin_frame_source.h --- a/components/viz/common/frame_sinks/begin_frame_source.h +++ b/components/viz/common/frame_sinks/begin_frame_source.h -@@ -362,6 +362,7 @@ class VIZ_COMMON_EXPORT BackToBackBeginFrameSource +@@ -363,6 +363,7 @@ class VIZ_COMMON_EXPORT BackToBackBeginFrameSource pending_begin_frame_observers_; uint64_t next_sequence_number_; base::TimeDelta vsync_interval_ = BeginFrameArgs::DefaultInterval(); @@ -239,6 +228,18 @@ diff --git a/components/viz/common/frame_sinks/begin_frame_source.h b/components std::optional max_vrr_interval_ = std::nullopt; base::WeakPtrFactory weak_factory_{this}; }; +diff --git a/components/viz/common/frame_sinks/delay_based_time_source.cc b/components/viz/common/frame_sinks/delay_based_time_source.cc +--- a/components/viz/common/frame_sinks/delay_based_time_source.cc ++++ b/components/viz/common/frame_sinks/delay_based_time_source.cc +@@ -165,7 +165,7 @@ void DelayBasedTimeSource::PostNextTickTask(base::TimeTicks now) { + // double tick. See crbug.com/398090404 for details. + const auto kMaxJudderAllowed = base::Microseconds(500); + if (now + kMaxJudderAllowed >= next_tick_time_) { +- next_tick_time_ += interval_; ++ next_tick_time_ += interval_; // kAvoidDuplicateDelayBeginFrame + } + + DCHECK_GT(next_tick_time_, now); diff --git a/components/viz/service/display/display.cc b/components/viz/service/display/display.cc --- a/components/viz/service/display/display.cc +++ b/components/viz/service/display/display.cc @@ -250,9 +251,9 @@ diff --git a/components/viz/service/display/display.cc b/components/viz/service/ #include "cc/base/math_util.h" #include "cc/base/region.h" #include "cc/base/simple_enclosed_region.h" -@@ -272,8 +273,21 @@ void Display::PresentationGroupTiming::OnSwap(gfx::SwapTimings timings, - - auto frame_latency = timings.swap_start - frame_time_; +@@ -295,8 +296,21 @@ void Display::PresentationGroupTiming::OnSwap(gfx::SwapTimings timings, + "latency_ms", frame_latency.InMillisecondsF()); + } if (frame_latency < base::Seconds(0)) { - LOG(ERROR) << "Frame latency is negative: " - << frame_latency.InMillisecondsF() << " ms"; @@ -314,7 +315,7 @@ diff --git a/components/viz/service/frame_sinks/external_begin_frame_source_andr diff --git a/components/viz/service/frame_sinks/external_begin_frame_source_android.h b/components/viz/service/frame_sinks/external_begin_frame_source_android.h --- a/components/viz/service/frame_sinks/external_begin_frame_source_android.h +++ b/components/viz/service/frame_sinks/external_begin_frame_source_android.h -@@ -54,6 +54,8 @@ class VIZ_SERVICE_EXPORT ExternalBeginFrameSourceAndroid +@@ -52,6 +52,8 @@ class VIZ_SERVICE_EXPORT ExternalBeginFrameSourceAndroid std::unique_ptr achoreographer_; base::android::ScopedJavaGlobalRef j_object_; BeginFrameArgsGenerator begin_frame_args_generator_; @@ -334,7 +335,7 @@ diff --git a/components/viz/service/frame_sinks/root_compositor_frame_sink_impl. #include "components/viz/common/features.h" #include "components/viz/common/frame_sinks/begin_frame_source.h" #include "components/viz/service/display/display.h" -@@ -757,7 +758,10 @@ void RootCompositorFrameSinkImpl::FrameIntervalDeciderResultCallback( +@@ -772,7 +773,10 @@ void RootCompositorFrameSinkImpl::FrameIntervalDeciderResultCallback( result); interval = interval_and_compat.first; gfx::SurfaceControlFrameRateCompatibility compat = interval_and_compat.second; @@ -346,7 +347,7 @@ diff --git a/components/viz/service/frame_sinks/root_compositor_frame_sink_impl. if (decided_display_interval_ == interval && decided_display_frame_rate_compat_ == compat) { return; -@@ -779,7 +783,9 @@ void RootCompositorFrameSinkImpl::FrameIntervalDeciderResultCallback( +@@ -794,7 +798,9 @@ void RootCompositorFrameSinkImpl::FrameIntervalDeciderResultCallback( return interval.interval; }), result); diff --git a/build/patches/Show-NTP-at-startup.patch b/build/patches/Show-NTP-at-startup.patch index 4c373277..54e7e242 100644 --- a/build/patches/Show-NTP-at-startup.patch +++ b/build/patches/Show-NTP-at-startup.patch @@ -19,11 +19,8 @@ License: GPL-2.0-or-later - https://spdx.org/licenses/GPL-2.0-or-later.html .../policies/background_tab_loading_policy.cc | 2 ++ .../preferences/ChromePreferenceKeys.java | 2 ++ .../LegacyChromePreferenceKeys.java | 1 + - .../session_restore_policy.h | 2 +- .../on_startup_page/on_startup_page.ts | 1 + chrome/browser/sessions/session_restore.cc | 9 ++++- - chrome/browser/sessions/tab_loader.cc | 7 ++-- - chrome/browser/sessions/tab_loader.h | 2 +- .../res/layout/single_tab_module_layout.xml | 17 +++++----- .../SingleTabSwitcherCoordinator.java | 2 +- .../SingleTabSwitcherOnNtpMediator.java | 5 +-- @@ -33,7 +30,7 @@ License: GPL-2.0-or-later - https://spdx.org/licenses/GPL-2.0-or-later.html .../about_flags_cc/show-ntp-at-startup.inc | 12 +++++++ .../show-ntp-at-startup.inc | 5 +++ .../show-ntp-at-startup.inc | 1 + - 25 files changed, 141 insertions(+), 21 deletions(-) + 22 files changed, 135 insertions(+), 16 deletions(-) create mode 100644 chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/cromite/sShowNtpAtStartupAndroid.java create mode 100644 chrome/browser/ui/android/strings/cromite_android_chrome_strings_grd/show-ntp-at-startup.grdp create mode 100644 cromite_flags/chrome/browser/about_flags_cc/show-ntp-at-startup.inc @@ -103,7 +100,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeInactivit 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 +++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java -@@ -3107,6 +3107,8 @@ public class ChromeTabbedActivity extends ChromeActivity implements PreAttachInt +@@ -3208,6 +3208,8 @@ public class ChromeTabbedActivity extends ChromeActivity implements PreAttachInt mInactivityTrackerSupplier.set( new ChromeInactivityTracker( ChromePreferenceKeys.TABBED_ACTIVITY_LAST_BACKGROUNDED_TIME_MS_PREF)); @@ -115,7 +112,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedAct diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tasks/ReturnToChromeUtil.java b/chrome/android/java/src/org/chromium/chrome/browser/tasks/ReturnToChromeUtil.java --- a/chrome/android/java/src/org/chromium/chrome/browser/tasks/ReturnToChromeUtil.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tasks/ReturnToChromeUtil.java -@@ -20,9 +20,11 @@ import org.chromium.base.metrics.RecordHistogram; +@@ -22,9 +22,11 @@ import org.chromium.base.metrics.RecordHistogram; import org.chromium.build.annotations.NullMarked; import org.chromium.build.annotations.Nullable; import org.chromium.chrome.R; @@ -127,7 +124,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tasks/ReturnToC import org.chromium.chrome.browser.magic_stack.HomeModulesMetricsUtils; import org.chromium.chrome.browser.ntp.NewTabPage; import org.chromium.chrome.browser.profiles.Profile; -@@ -129,6 +131,18 @@ public final class ReturnToChromeUtil { +@@ -134,6 +136,18 @@ public final class ReturnToChromeUtil { return false; } @@ -146,7 +143,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tasks/ReturnToC // Checks whether to show the NTP homepage due to feature flag // HOME_SURFACE_RETURN_TIME_SECONDS. long lastVisibleTimeMs = inactivityTracker.getLastVisibleTimeMs(); -@@ -247,7 +261,7 @@ public final class ReturnToChromeUtil { +@@ -252,7 +266,7 @@ public final class ReturnToChromeUtil { TabModel currentTabModel, TabCreator tabCreator, HomeSurfaceTracker homeSurfaceTracker) { @@ -158,7 +155,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tasks/ReturnToC diff --git a/chrome/app/settings_strings.grdp b/chrome/app/settings_strings.grdp --- a/chrome/app/settings_strings.grdp +++ b/chrome/app/settings_strings.grdp -@@ -1031,7 +1031,7 @@ +@@ -997,7 +997,7 @@ Open a specific page or set of pages @@ -170,7 +167,7 @@ diff --git a/chrome/app/settings_strings.grdp b/chrome/app/settings_strings.grdp diff --git a/chrome/browser/flags/android/chrome_feature_list.cc b/chrome/browser/flags/android/chrome_feature_list.cc --- a/chrome/browser/flags/android/chrome_feature_list.cc +++ b/chrome/browser/flags/android/chrome_feature_list.cc -@@ -421,6 +421,7 @@ const base::Feature* const kFeaturesExposedToJava[] = { +@@ -426,6 +426,7 @@ const base::Feature* const kFeaturesExposedToJava[] = { &kSearchInCCTIfEnabledByEmbedder, &kSearchResumptionModuleAndroid, &kSettingsMultiColumn, @@ -219,7 +216,7 @@ new file mode 100644 diff --git a/chrome/browser/performance_manager/policies/background_tab_loading_policy.cc b/chrome/browser/performance_manager/policies/background_tab_loading_policy.cc --- a/chrome/browser/performance_manager/policies/background_tab_loading_policy.cc +++ b/chrome/browser/performance_manager/policies/background_tab_loading_policy.cc -@@ -395,6 +395,7 @@ base::Value::Dict BackgroundTabLoadingPolicy::DescribeSystemNodeData( +@@ -382,6 +382,7 @@ base::DictValue BackgroundTabLoadingPolicy::DescribeSystemNodeData( bool BackgroundTabLoadingPolicy::ShouldLoad( const PageNodeToLoadData& page_node_data) { @@ -227,7 +224,7 @@ diff --git a/chrome/browser/performance_manager/policies/background_tab_loading_ if (tab_loads_started_ < min_tabs_to_load_) { return true; } -@@ -596,6 +597,7 @@ void BackgroundTabLoadingPolicy::MaybeLoadSomeTabs() { +@@ -583,6 +584,7 @@ void BackgroundTabLoadingPolicy::MaybeLoadSomeTabs() { // Continue to load tabs while possible. This is in a loop with a // recalculation of GetMaxNewTabLoads() as reentrancy can cause conditions // to change as each tab load is initiated. @@ -238,7 +235,7 @@ diff --git a/chrome/browser/performance_manager/policies/background_tab_loading_ 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 -@@ -1000,6 +1000,8 @@ public final class ChromePreferenceKeys { +@@ -1024,6 +1024,8 @@ public final class ChromePreferenceKeys { public static final String TABBED_ACTIVITY_LAST_BACKGROUNDED_TIME_MS_PREF = "ChromeTabbedActivity.BackgroundTimeMs"; @@ -258,22 +255,10 @@ diff --git a/chrome/browser/preferences/android/java/src/org/chromium/chrome/bro ChromePreferenceKeys.TABMODEL_ACTIVE_TAB_ID, ChromePreferenceKeys.TABMODEL_HAS_COMPUTED_MAX_ID, ChromePreferenceKeys.TABMODEL_HAS_RUN_FILE_MIGRATION, -diff --git a/chrome/browser/resource_coordinator/session_restore_policy.h b/chrome/browser/resource_coordinator/session_restore_policy.h ---- a/chrome/browser/resource_coordinator/session_restore_policy.h -+++ b/chrome/browser/resource_coordinator/session_restore_policy.h -@@ -29,7 +29,7 @@ class SessionRestorePolicy { - public: - // Minimum site engagement score for a tab to be restored, if it doesn't - // communicate in the background. -- static constexpr uint32_t kMinSiteEngagementToRestore = 15; -+ static constexpr uint32_t kMinSiteEngagementToRestore = 999999; - - // Callback that is used by the policy engine to notify its embedder (the - // TabLoaderDelegate) of changes to tab priorities as they occur. Zero or one diff --git a/chrome/browser/resources/settings/on_startup_page/on_startup_page.ts b/chrome/browser/resources/settings/on_startup_page/on_startup_page.ts --- a/chrome/browser/resources/settings/on_startup_page/on_startup_page.ts +++ b/chrome/browser/resources/settings/on_startup_page/on_startup_page.ts -@@ -97,6 +97,7 @@ export class SettingsOnStartupPageElement extends +@@ -115,6 +115,7 @@ export class SettingsOnStartupPageElement extends */ private showContinueAndOpenSpecific_(pref: chrome.settingsPrivate.PrefObject): boolean { @@ -284,7 +269,7 @@ diff --git a/chrome/browser/resources/settings/on_startup_page/on_startup_page.t diff --git a/chrome/browser/sessions/session_restore.cc b/chrome/browser/sessions/session_restore.cc --- a/chrome/browser/sessions/session_restore.cc +++ b/chrome/browser/sessions/session_restore.cc -@@ -928,7 +928,13 @@ class SessionRestoreImpl : public BrowserListObserver { +@@ -937,7 +937,13 @@ class SessionRestoreImpl : public BrowserCollectionObserver { // be selected as ShowBrowser() will load the selected tab. bool is_selected_tab = (initial_tab_count == 0) && (i == selected_tab_index); @@ -299,7 +284,7 @@ diff --git a/chrome/browser/sessions/session_restore.cc b/chrome/browser/session // Convert the last active time because WebContents needs a TimeTicks. const base::TimeDelta delta = tab.last_active_time - epoch_time; const base::TimeTicks last_active_time_ticks = epoch_time_ticks + delta; -@@ -1248,6 +1254,7 @@ class SessionRestoreImpl : public BrowserListObserver { +@@ -1257,6 +1263,7 @@ class SessionRestoreImpl : public BrowserCollectionObserver { } if (last_normal_browser && !normal_startup_tabs.empty()) { AppendURLsToBrowser(last_normal_browser, normal_startup_tabs); @@ -307,56 +292,6 @@ diff --git a/chrome/browser/sessions/session_restore.cc b/chrome/browser/session } if (!startup_tabs_from_last_and_urls_pref.empty()) { Browser::CreateParams params = -diff --git a/chrome/browser/sessions/tab_loader.cc b/chrome/browser/sessions/tab_loader.cc ---- a/chrome/browser/sessions/tab_loader.cc -+++ b/chrome/browser/sessions/tab_loader.cc -@@ -51,7 +51,7 @@ struct ScoredTabComparator { - }; - - // Testing seams. --size_t g_max_loaded_tab_count_for_testing = 0; -+int g_max_loaded_tab_count_for_testing = 0; - base::RepeatingCallback* g_construction_callback = nullptr; - - // Determines if the given browser (can be null) is closing. -@@ -374,7 +374,7 @@ void TabLoader::OnMemoryPressure( - - bool TabLoader::ShouldStopLoadingTabs() const { - DCHECK(reentry_depth_ > 0); // This can only be called internally. -- if (g_max_loaded_tab_count_for_testing != 0 && -+ if (g_max_loaded_tab_count_for_testing != -1 && - scheduled_to_load_count_ >= g_max_loaded_tab_count_for_testing) { - return true; - } -@@ -412,7 +412,7 @@ size_t TabLoader::GetMaxNewTabLoads() const { - tabs_to_load = std::min(tabs_to_load, tabs_to_load_.size()); - - // Finally, enforce testing tab load limits. -- if (g_max_loaded_tab_count_for_testing != 0) { -+ if (g_max_loaded_tab_count_for_testing != -1) { - size_t tabs_remaining_for_testing = - g_max_loaded_tab_count_for_testing - scheduled_to_load_count_; - tabs_to_load = std::min(tabs_to_load, tabs_remaining_for_testing); -@@ -770,6 +770,7 @@ void TabLoader::MoveToSortedPosition(TabVector::iterator it) { - } - - size_t TabLoader::MaxSimultaneousLoads() const { -+ if ((true)) return 0; - if (max_simultaneous_loads_for_testing_ != 0) - return max_simultaneous_loads_for_testing_; - return delegate_->GetMaxSimultaneousTabLoads(); -diff --git a/chrome/browser/sessions/tab_loader.h b/chrome/browser/sessions/tab_loader.h ---- a/chrome/browser/sessions/tab_loader.h -+++ b/chrome/browser/sessions/tab_loader.h -@@ -281,7 +281,7 @@ class TabLoader : public base::RefCounted, - // This is monotonically increasing, and can never exceed the combined number - // of tabs passed into this TabLoader via StartLoading(). This is only used in - // order to support a combined maximum total number of tab loads for testing. -- size_t scheduled_to_load_count_ = 0; -+ int scheduled_to_load_count_ = 0; - - // Timer used to force progress despite tabs that take too long to load. - base::OneShotTimer force_load_timer_; diff --git a/chrome/browser/single_tab/android/java/res/layout/single_tab_module_layout.xml b/chrome/browser/single_tab/android/java/res/layout/single_tab_module_layout.xml --- a/chrome/browser/single_tab/android/java/res/layout/single_tab_module_layout.xml +++ b/chrome/browser/single_tab/android/java/res/layout/single_tab_module_layout.xml @@ -477,7 +412,7 @@ new file mode 100644 diff --git a/chrome/browser/ui/browser_tabrestore.cc b/chrome/browser/ui/browser_tabrestore.cc --- a/chrome/browser/ui/browser_tabrestore.cc +++ b/chrome/browser/ui/browser_tabrestore.cc -@@ -239,7 +239,7 @@ WebContents* AddRestoredTabImpl(std::unique_ptr web_contents, +@@ -248,7 +248,7 @@ WebContents* AddRestoredTabImpl(std::unique_ptr web_contents, // Immediate load if the browser activeness is true or unknown. That is, do // not do immediate load for browsers that are known to be inactive. @@ -489,7 +424,7 @@ diff --git a/chrome/browser/ui/browser_tabrestore.cc b/chrome/browser/ui/browser diff --git a/chrome/browser/ui/startup/startup_browser_creator_impl.cc b/chrome/browser/ui/startup/startup_browser_creator_impl.cc --- a/chrome/browser/ui/startup/startup_browser_creator_impl.cc +++ b/chrome/browser/ui/startup/startup_browser_creator_impl.cc -@@ -567,6 +567,14 @@ StartupBrowserCreatorImpl::DetermineStartupTabs( +@@ -629,6 +629,14 @@ StartupBrowserCreatorImpl::DetermineStartupTabs( AppendTabs(provider.GetNewTabPageTabs(*command_line_, profile_), &tabs); } diff --git a/build/patches/add-browser-policy.patch b/build/patches/add-browser-policy.patch index c35dcb4f..d749411a 100644 --- a/build/patches/add-browser-policy.patch +++ b/build/patches/add-browser-policy.patch @@ -15,7 +15,7 @@ License: GPL-2.0-or-later - https://spdx.org/licenses/GPL-2.0-or-later.html ...ccount_consistency_mode_manager_factory.cc | 2 +- .../throttled_gaia_auth_fetcher.cc | 5 + chrome/browser/signin/chrome_signin_client.cc | 7 +- - .../browser/signin/dice_response_handler.cc | 4 +- + .../browser/signin/dice_response_handler.cc | 2 +- .../ui/webui/policy/policy_ui_handler.cc | 104 ++++++++++++- .../ui/webui/policy/policy_ui_handler.h | 2 + .../strings/android/browser_ui_strings.grd | 2 +- @@ -38,7 +38,7 @@ License: GPL-2.0-or-later - https://spdx.org/licenses/GPL-2.0-or-later.html extensions/common/extension_features.cc | 1 + google_apis/gaia/gaia_auth_fetcher.cc | 1 + net/socket/ssl_client_socket_impl.cc | 3 + - 34 files changed, 327 insertions(+), 162 deletions(-) + 34 files changed, 325 insertions(+), 162 deletions(-) diff --git a/base/win/win_util.cc b/base/win/win_util.cc --- a/base/win/win_util.cc @@ -154,8 +154,8 @@ diff --git a/chrome/android/java/AndroidManifest.xml b/chrome/android/java/Andro - - {% block extra_uses_permissions %} - {% endblock %} + + diff --git a/chrome/browser/android/preferences/privacy_preferences_manager_impl.cc b/chrome/browser/android/preferences/privacy_preferences_manager_impl.cc --- a/chrome/browser/android/preferences/privacy_preferences_manager_impl.cc +++ b/chrome/browser/android/preferences/privacy_preferences_manager_impl.cc @@ -183,7 +183,7 @@ diff --git a/chrome/browser/metrics/chrome_feature_list_creator.cc b/chrome/brow #if BUILDFLAG(IS_WIN) #include "chrome/installer/util/google_update_settings.h" -@@ -202,6 +204,16 @@ void ChromeFeatureListCreator::CreatePrefService() { +@@ -198,6 +200,16 @@ void ChromeFeatureListCreator::CreatePrefService() { // ManagementService's cache. if (local_state_pref_store->ReadPrefs() == JsonPrefStore::PREF_READ_ERROR_NONE) { @@ -203,7 +203,7 @@ diff --git a/chrome/browser/metrics/chrome_feature_list_creator.cc b/chrome/brow diff --git a/chrome/browser/navigation_predictor/search_engine_preconnector.cc b/chrome/browser/navigation_predictor/search_engine_preconnector.cc --- a/chrome/browser/navigation_predictor/search_engine_preconnector.cc +++ b/chrome/browser/navigation_predictor/search_engine_preconnector.cc -@@ -64,6 +64,9 @@ namespace features { +@@ -79,6 +79,9 @@ namespace features { BASE_FEATURE(kPreconnectFromKeyedService, base::FEATURE_ENABLED_BY_DEFAULT); BASE_FEATURE(kPreconnectToSearch, base::FEATURE_ENABLED_BY_DEFAULT); @@ -216,7 +216,7 @@ diff --git a/chrome/browser/navigation_predictor/search_engine_preconnector.cc b diff --git a/chrome/browser/policy/chrome_browser_policy_connector.cc b/chrome/browser/policy/chrome_browser_policy_connector.cc --- a/chrome/browser/policy/chrome_browser_policy_connector.cc +++ b/chrome/browser/policy/chrome_browser_policy_connector.cc -@@ -133,9 +133,6 @@ bool ChromeBrowserPolicyConnector::HasMachineLevelPolicies() { +@@ -134,9 +134,6 @@ bool ChromeBrowserPolicyConnector::HasMachineLevelPolicies() { return true; } #endif // !BUILDFLAG(IS_CHROMEOS) @@ -229,7 +229,7 @@ diff --git a/chrome/browser/policy/chrome_browser_policy_connector.cc b/chrome/b diff --git a/chrome/browser/policy/configuration_policy_handler_list_factory.cc b/chrome/browser/policy/configuration_policy_handler_list_factory.cc --- a/chrome/browser/policy/configuration_policy_handler_list_factory.cc +++ b/chrome/browser/policy/configuration_policy_handler_list_factory.cc -@@ -2523,9 +2523,9 @@ bool AreFuturePoliciesEnabledByDefault() { +@@ -2530,9 +2530,9 @@ bool AreFuturePoliciesEnabledByDefault() { if (base::CommandLine::ForCurrentProcess()->HasSwitch(switches::kTestType)) { return true; } @@ -242,7 +242,7 @@ diff --git a/chrome/browser/policy/configuration_policy_handler_list_factory.cc } } // namespace -@@ -3369,7 +3369,10 @@ std::unique_ptr BuildHandlerList( +@@ -3378,7 +3378,10 @@ std::unique_ptr BuildHandlerList( key::kExtensionInstallCloudPolicyChecksEnabled, extensions::pref_names::kExtensionInstallCloudPolicyChecksEnabled, base::Value::Type::BOOLEAN)); @@ -339,7 +339,7 @@ diff --git a/chrome/browser/signin/bound_session_credentials/throttled_gaia_auth diff --git a/chrome/browser/signin/chrome_signin_client.cc b/chrome/browser/signin/chrome_signin_client.cc --- a/chrome/browser/signin/chrome_signin_client.cc +++ b/chrome/browser/signin/chrome_signin_client.cc -@@ -292,7 +292,9 @@ void ChromeSigninClient::DoFinalInit() { +@@ -293,7 +293,9 @@ void ChromeSigninClient::DoFinalInit() { bool ChromeSigninClient::ProfileAllowsSigninCookies(Profile* profile) { scoped_refptr cookie_settings = CookieSettingsFactory::GetForProfile(profile); @@ -350,7 +350,7 @@ diff --git a/chrome/browser/signin/chrome_signin_client.cc b/chrome/browser/sign } PrefService* ChromeSigninClient::GetPrefs() { -@@ -410,6 +412,9 @@ bool ChromeSigninClient::AreNetworkCallsDelayed() { +@@ -411,6 +413,9 @@ bool ChromeSigninClient::AreNetworkCallsDelayed() { } void ChromeSigninClient::DelayNetworkCall(base::OnceClosure callback) { @@ -372,17 +372,6 @@ diff --git a/chrome/browser/signin/dice_response_handler.cc b/chrome/browser/sig "Signin.DiceTokenBindingOutcome"; // Used for UMA. Do not reorder, append new values at the end. -@@ -386,8 +386,10 @@ void DiceResponseHandler::ProcessDiceSignoutHeader( - // - If there is a policy restriction on removing the primary account. - bool invalidate_only_primary_account = - identity_manager_->HasPrimaryAccount(signin::ConsentLevel::kSync) || -+#if BUILDFLAG(ENABLE_BOUND_SESSION_CREDENTIALS) - !signin::IsImplicitBrowserSigninOrExplicitDisabled( - identity_manager_, signin_client_->GetPrefs()) || -+#endif - !signin_client_->IsClearPrimaryAccountAllowed(); - - CoreAccountId primary_account = diff --git a/chrome/browser/ui/webui/policy/policy_ui_handler.cc b/chrome/browser/ui/webui/policy/policy_ui_handler.cc --- a/chrome/browser/ui/webui/policy/policy_ui_handler.cc +++ b/chrome/browser/ui/webui/policy/policy_ui_handler.cc @@ -413,7 +402,7 @@ diff --git a/chrome/browser/ui/webui/policy/policy_ui_handler.cc b/chrome/browse web_ui()->RegisterMessageCallback( "listenPoliciesUpdates", base::BindRepeating(&PolicyUIHandler::HandleListenPoliciesUpdates, -@@ -503,8 +509,102 @@ void PolicyUIHandler::SendPolicies() { +@@ -501,8 +507,102 @@ void PolicyUIHandler::SendPolicies() { "policies-updated", base::Value( policy_value_and_status_aggregator_->GetAggregatedPolicyNames()), @@ -524,16 +513,16 @@ diff --git a/chrome/browser/ui/webui/policy/policy_ui_handler.h b/chrome/browser @@ -81,6 +81,8 @@ class PolicyUIHandler : public content::WebUIMessageHandler, private: - void HandleExportPoliciesJson(const base::Value::List& args); + void HandleExportPoliciesJson(const base::ListValue& args); + void HandleSetEnabledPolicy(const base::Value::List& args); + base::Value::Dict GetPolicyValues(); - void HandleListenPoliciesUpdates(const base::Value::List& args); - void HandleReloadPolicies(const base::Value::List& args); - void HandleCopyPoliciesJson(const base::Value::List& args); + void HandleListenPoliciesUpdates(const base::ListValue& args); + void HandleReloadPolicies(const base::ListValue& args); + void HandleCopyPoliciesJson(const base::ListValue& args); diff --git a/components/browser_ui/strings/android/browser_ui_strings.grd b/components/browser_ui/strings/android/browser_ui_strings.grd --- a/components/browser_ui/strings/android/browser_ui_strings.grd +++ b/components/browser_ui/strings/android/browser_ui_strings.grd -@@ -386,7 +386,7 @@ +@@ -395,7 +395,7 @@ @@ -545,7 +534,7 @@ diff --git a/components/browser_ui/strings/android/browser_ui_strings.grd b/comp diff --git a/components/commerce/core/commerce_feature_list.cc b/components/commerce/core/commerce_feature_list.cc --- a/components/commerce/core/commerce_feature_list.cc +++ b/components/commerce/core/commerce_feature_list.cc -@@ -69,56 +69,6 @@ const CountryLocaleMap& GetAllowedCountryToLocaleMap() { +@@ -68,56 +68,6 @@ const CountryLocaleMap& GetAllowedCountryToLocaleMap() { return *allowed_map; } @@ -602,7 +591,7 @@ diff --git a/components/commerce/core/commerce_feature_list.cc b/components/comm } // namespace BASE_FEATURE(kCommerceAllowLocalImages, base::FEATURE_DISABLED_BY_DEFAULT); -@@ -280,16 +230,15 @@ const base::FeatureParam kRevertIconOnFailure{ +@@ -279,16 +229,15 @@ const base::FeatureParam kRevertIconOnFailure{ &kShoppingList, kRevertIconOnFailureParam, false}; bool IsPartnerMerchant(const GURL& url) { @@ -622,7 +611,7 @@ diff --git a/components/commerce/core/commerce_feature_list.cc b/components/comm } bool IsCartDiscountFeatureEnabled() { -@@ -341,6 +290,7 @@ bool IsEnabledForCountryAndLocale(const base::Feature& feature, +@@ -340,6 +289,7 @@ bool IsEnabledForCountryAndLocale(const base::Feature& feature, bool IsRegionLockedFeatureEnabled(const base::Feature& feature, const std::string& country_code, const std::string& locale) { @@ -630,7 +619,7 @@ diff --git a/components/commerce/core/commerce_feature_list.cc b/components/comm auto* feature_list = base::FeatureList::GetInstance(); // If the feature has a server-side config, this check will ensure that -@@ -373,6 +323,7 @@ base::TimeDelta GetDiscountFetchDelay() { +@@ -372,6 +322,7 @@ base::TimeDelta GetDiscountFetchDelay() { } bool IsNoDiscountMerchant(const GURL& url) { @@ -638,7 +627,7 @@ diff --git a/components/commerce/core/commerce_feature_list.cc b/components/comm auto* pattern_from_component = commerce_heuristics::CommerceHeuristicsData::GetInstance() .GetNoDiscountMerchantPattern(); -@@ -384,4 +335,6 @@ bool IsNoDiscountMerchant(const GURL& url) { +@@ -383,4 +334,6 @@ bool IsNoDiscountMerchant(const GURL& url) { return RE2::PartialMatch(url.host(), *pattern_from_component); } #endif @@ -845,7 +834,7 @@ diff --git a/components/policy/core/common/policy_pref_names.h b/components/poli diff --git a/components/policy/core/common/policy_service_impl.cc b/components/policy/core/common/policy_service_impl.cc --- a/components/policy/core/common/policy_service_impl.cc +++ b/components/policy/core/common/policy_service_impl.cc -@@ -51,6 +51,9 @@ namespace { +@@ -50,6 +50,9 @@ namespace { // Metrics should not be enforced so if this policy is set as mandatory // downgrade it to a recommended level policy. void DowngradeMetricsReportingToRecommendedPolicy(PolicyMap* policies) { @@ -983,7 +972,7 @@ diff --git a/components/policy_strings.grdp b/components/policy_strings.grdp diff --git a/components/search/ntp_features.cc b/components/search/ntp_features.cc --- a/components/search/ntp_features.cc +++ b/components/search/ntp_features.cc -@@ -80,6 +80,7 @@ BASE_FEATURE(kNtpCalendarModule, base::FEATURE_ENABLED_BY_DEFAULT); +@@ -72,6 +72,7 @@ BASE_FEATURE(kNtpCalendarModule, base::FEATURE_ENABLED_BY_DEFAULT); // If enabled, chrome cart module will be shown. BASE_FEATURE(kNtpChromeCartModule, base::FEATURE_ENABLED_BY_DEFAULT); @@ -1006,7 +995,7 @@ diff --git a/components/signin/features.gni b/components/signin/features.gni diff --git a/components/signin/internal/identity_manager/gaia_cookie_manager_service.cc b/components/signin/internal/identity_manager/gaia_cookie_manager_service.cc --- a/components/signin/internal/identity_manager/gaia_cookie_manager_service.cc +++ b/components/signin/internal/identity_manager/gaia_cookie_manager_service.cc -@@ -463,6 +463,8 @@ void GaiaCookieManagerService::RegisterPrefs(PrefRegistrySimple* registry) { +@@ -462,6 +462,8 @@ void GaiaCookieManagerService::RegisterPrefs(PrefRegistrySimple* registry) { } void GaiaCookieManagerService::InitCookieListener() { @@ -1015,7 +1004,7 @@ diff --git a/components/signin/internal/identity_manager/gaia_cookie_manager_ser DCHECK(!cookie_listener_receiver_.is_bound()); network::mojom::CookieManager* cookie_manager = -@@ -857,6 +859,8 @@ void GaiaCookieManagerService::OnSetAccountsFinished( +@@ -856,6 +858,8 @@ void GaiaCookieManagerService::OnSetAccountsFinished( } void GaiaCookieManagerService::HandleNextRequest() { @@ -1027,7 +1016,7 @@ diff --git a/components/signin/internal/identity_manager/gaia_cookie_manager_ser diff --git a/extensions/common/extension_features.cc b/extensions/common/extension_features.cc --- a/extensions/common/extension_features.cc +++ b/extensions/common/extension_features.cc -@@ -47,6 +47,7 @@ BASE_FEATURE(kWebRequestSecurityInfo, base::FEATURE_DISABLED_BY_DEFAULT); +@@ -49,6 +49,7 @@ BASE_FEATURE(kWebRequestSecurityInfo, base::FEATURE_DISABLED_BY_DEFAULT); BASE_FEATURE(kAllowWithholdingExtensionPermissionsOnInstall, base::FEATURE_DISABLED_BY_DEFAULT); @@ -1038,7 +1027,7 @@ diff --git a/extensions/common/extension_features.cc b/extensions/common/extensi diff --git a/google_apis/gaia/gaia_auth_fetcher.cc b/google_apis/gaia/gaia_auth_fetcher.cc --- a/google_apis/gaia/gaia_auth_fetcher.cc +++ b/google_apis/gaia/gaia_auth_fetcher.cc -@@ -469,6 +469,7 @@ void GaiaAuthFetcher::StartListAccounts() { +@@ -472,6 +472,7 @@ void GaiaAuthFetcher::StartListAccounts() { })"); net::HttpRequestHeaders headers; headers.SetHeader("Origin", "https://www.google.com"); @@ -1049,7 +1038,7 @@ diff --git a/google_apis/gaia/gaia_auth_fetcher.cc b/google_apis/gaia/gaia_auth_ diff --git a/net/socket/ssl_client_socket_impl.cc b/net/socket/ssl_client_socket_impl.cc --- a/net/socket/ssl_client_socket_impl.cc +++ b/net/socket/ssl_client_socket_impl.cc -@@ -796,6 +796,7 @@ int SSLClientSocketImpl::Init() { +@@ -795,6 +795,7 @@ int SSLClientSocketImpl::Init() { return ERR_UNEXPECTED; } @@ -1057,7 +1046,7 @@ diff --git a/net/socket/ssl_client_socket_impl.cc b/net/socket/ssl_client_socket // Disable SHA-1 server signatures. // TODO(crbug.com/boringssl/699): Once the default is flipped in BoringSSL, we // no longer need to override it. -@@ -1218,6 +1219,8 @@ ssl_verify_result_t SSLClientSocketImpl::HandleVerifyResult() { +@@ -1234,6 +1235,8 @@ ssl_verify_result_t SSLClientSocketImpl::HandleVerifyResult() { cert_verifier_request_.reset(); diff --git a/build/patches/eyeo-133.0.6943.49-android_api.patch b/build/patches/eyeo-133.0.6943.49-android_api.patch index 8437f65d..4273a8e2 100644 --- a/build/patches/eyeo-133.0.6943.49-android_api.patch +++ b/build/patches/eyeo-133.0.6943.49-android_api.patch @@ -12,41 +12,19 @@ Pre-requisites: eyeo Browser Ad filtering Solution: Base Module chrome/browser/BUILD.gn | 4 + .../android/adblock/tab_id_translator_jni.cc | 43 ++ chrome/browser/ui/BUILD.gn | 6 + - components/adblock/android/BUILD.gn | 107 ++++ - .../adblock/android/adblock_controller_jni.cc | 133 +++++ - .../filtering_configuration_android.cc | 246 ++++++++ - .../android/filtering_configuration_android.h | 94 +++ - .../components/adblock/AdblockController.java | 283 +++++++++ + components/adblock/android/BUILD.gn | 107 +++++ + .../adblock/android/adblock_controller_jni.cc | 133 ++++++ + .../filtering_configuration_android.cc | 246 ++++++++++ + .../android/filtering_configuration_android.h | 94 ++++ + .../components/adblock/AdblockController.java | 283 ++++++++++++ .../components/adblock/AdblockSwitches.java | 22 + - .../components/adblock/ContentType.java | 61 ++ - .../adblock/FilteringConfiguration.java | 424 +++++++++++++ - .../ResourceClassificationNotifier.java | 233 ++++++++ - .../adblock/ResourceFilteringCounters.java | 111 ++++ - .../adblock/AdblockControllerTestBase.java | 64 ++ - .../adblock/DefaultSettingsTestBase.java | 73 +++ - .../FilteringConfigurationTestBase.java | 421 +++++++++++++ - .../TestPagesCircumventionTestBase.java | 65 ++ - .../adblock/TestPagesCspTestBase.java | 86 +++ - .../TestPagesElemhideEmuInvTestBase.java | 116 ++++ - .../adblock/TestPagesElemhideEmuTestBase.java | 161 +++++ - .../adblock/TestPagesElemhideTestBase.java | 159 +++++ - .../adblock/TestPagesExceptionTestBase.java | 190 ++++++ - .../adblock/TestPagesFilterTestBase.java | 277 +++++++++ - .../TestPagesHeaderFilterTestBase.java | 102 ++++ - .../adblock/TestPagesHelperBase.java | 230 +++++++ - .../adblock/TestPagesInlineCssTestBase.java | 94 +++ - .../adblock/TestPagesRemoveTestBase.java | 94 +++ - .../adblock/TestPagesRewriteTestBase.java | 175 ++++++ - .../TestPagesServiceWorkersTestBase.java | 71 +++ - .../adblock/TestPagesSiteKeyTestBase.java | 51 ++ - .../adblock/TestPagesSnippetsTestBase.java | 560 ++++++++++++++++++ - .../adblock/TestPagesWebsocketTestBase.java | 54 ++ - .../TestPagesWildcardDomainTestBase.java | 116 ++++ - .../TestResourceFilteringObserver.java | 180 ++++++ - .../adblock/TestVerificationUtils.java | 220 +++++++ - ...esource_classification_notifier_android.cc | 166 ++++++ + .../components/adblock/ContentType.java | 61 +++ + .../adblock/FilteringConfiguration.java | 424 ++++++++++++++++++ + .../ResourceClassificationNotifier.java | 233 ++++++++++ + .../adblock/ResourceFilteringCounters.java | 111 +++++ + ...esource_classification_notifier_android.cc | 166 +++++++ ...resource_classification_notifier_android.h | 72 +++ - 40 files changed, 5616 insertions(+) + 18 files changed, 2057 insertions(+) create mode 100644 chrome/android/java/src/org/chromium/chrome/browser/adblock/TabIdTranslator.java create mode 100644 chrome/browser/android/adblock/tab_id_translator_jni.cc create mode 100644 components/adblock/android/BUILD.gn @@ -59,28 +37,6 @@ Pre-requisites: eyeo Browser Ad filtering Solution: Base Module create mode 100644 components/adblock/android/java/src/org/chromium/components/adblock/FilteringConfiguration.java create mode 100644 components/adblock/android/java/src/org/chromium/components/adblock/ResourceClassificationNotifier.java create mode 100644 components/adblock/android/java/src/org/chromium/components/adblock/ResourceFilteringCounters.java - create mode 100644 components/adblock/android/javatests/src/org/chromium/components/adblock/AdblockControllerTestBase.java - create mode 100644 components/adblock/android/javatests/src/org/chromium/components/adblock/DefaultSettingsTestBase.java - create mode 100644 components/adblock/android/javatests/src/org/chromium/components/adblock/FilteringConfigurationTestBase.java - create mode 100644 components/adblock/android/javatests/src/org/chromium/components/adblock/TestPagesCircumventionTestBase.java - create mode 100644 components/adblock/android/javatests/src/org/chromium/components/adblock/TestPagesCspTestBase.java - create mode 100644 components/adblock/android/javatests/src/org/chromium/components/adblock/TestPagesElemhideEmuInvTestBase.java - create mode 100644 components/adblock/android/javatests/src/org/chromium/components/adblock/TestPagesElemhideEmuTestBase.java - create mode 100644 components/adblock/android/javatests/src/org/chromium/components/adblock/TestPagesElemhideTestBase.java - create mode 100644 components/adblock/android/javatests/src/org/chromium/components/adblock/TestPagesExceptionTestBase.java - create mode 100644 components/adblock/android/javatests/src/org/chromium/components/adblock/TestPagesFilterTestBase.java - create mode 100644 components/adblock/android/javatests/src/org/chromium/components/adblock/TestPagesHeaderFilterTestBase.java - create mode 100644 components/adblock/android/javatests/src/org/chromium/components/adblock/TestPagesHelperBase.java - create mode 100644 components/adblock/android/javatests/src/org/chromium/components/adblock/TestPagesInlineCssTestBase.java - create mode 100644 components/adblock/android/javatests/src/org/chromium/components/adblock/TestPagesRemoveTestBase.java - create mode 100644 components/adblock/android/javatests/src/org/chromium/components/adblock/TestPagesRewriteTestBase.java - create mode 100644 components/adblock/android/javatests/src/org/chromium/components/adblock/TestPagesServiceWorkersTestBase.java - create mode 100644 components/adblock/android/javatests/src/org/chromium/components/adblock/TestPagesSiteKeyTestBase.java - create mode 100644 components/adblock/android/javatests/src/org/chromium/components/adblock/TestPagesSnippetsTestBase.java - create mode 100644 components/adblock/android/javatests/src/org/chromium/components/adblock/TestPagesWebsocketTestBase.java - create mode 100644 components/adblock/android/javatests/src/org/chromium/components/adblock/TestPagesWildcardDomainTestBase.java - create mode 100644 components/adblock/android/javatests/src/org/chromium/components/adblock/TestResourceFilteringObserver.java - create mode 100644 components/adblock/android/javatests/src/org/chromium/components/adblock/TestVerificationUtils.java create mode 100644 components/adblock/android/resource_classification_notifier_android.cc create mode 100644 components/adblock/android/resource_classification_notifier_android.h @@ -97,15 +53,15 @@ diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn import("//build/config/android/config.gni") import("//build/config/cronet/config.gni") -@@ -546,6 +549,7 @@ if (_is_default_toolchain) { +@@ -562,6 +565,7 @@ if (_is_default_toolchain) { "//chrome/browser/xsurface:java", "//chrome/browser/xsurface_provider:dependency_provider_impl_java", "//chrome/browser/xsurface_provider:java", + "//components/adblock/android:adblock_controller_java", - "//components/android_autofill/browser:features_java", "//components/android_autofill/browser:java", "//components/autofill/android:autofill_features_java", -@@ -1460,6 +1464,7 @@ if (_is_default_toolchain) { + "//components/autofill/android:autofill_java", +@@ -1498,6 +1502,7 @@ if (_is_default_toolchain) { "//chrome/test/data/translate/", "//chrome/test/data/webauthn/", "//chrome/test/media_router/resources/", @@ -113,7 +69,7 @@ diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn "//components/test/data/autofill/", "//components/test/data/payments/", "//content/test/data/browsing_data/", -@@ -3056,6 +3061,12 @@ if (_is_default_toolchain) { +@@ -3099,6 +3104,12 @@ if (_is_default_toolchain) { sources += [ "java/src/org/chromium/chrome/browser/media/MediaCapturePickerManagerBridge.java" ] } @@ -126,7 +82,7 @@ diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn # Used for testing only, should not be shipped to end users. if (enable_offline_pages_harness) { sources += [ "java/src/org/chromium/chrome/browser/offlinepages/evaluation/OfflinePageEvaluationBridge.java" ] -@@ -3148,6 +3159,7 @@ if (_is_default_toolchain) { +@@ -3190,6 +3201,7 @@ if (_is_default_toolchain) { "//chrome/browser/ui/plus_addresses/android:jni_headers", "//chrome/browser/util:jni_headers", "//chrome/browser/webauthn/android:jni_headers", @@ -199,7 +155,7 @@ new file mode 100644 diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn --- a/chrome/browser/BUILD.gn +++ b/chrome/browser/BUILD.gn -@@ -3357,6 +3357,10 @@ static_library("browser") { +@@ -3339,6 +3339,10 @@ static_library("browser") { ] deps += [ "//chrome/browser/password_entry_edit/android" ] @@ -261,7 +217,7 @@ new file mode 100644 diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn --- a/chrome/browser/ui/BUILD.gn +++ b/chrome/browser/ui/BUILD.gn -@@ -1057,6 +1057,12 @@ static_library("ui") { +@@ -1045,6 +1045,12 @@ static_library("ui") { deps += [ "//components/themes:ntp_background_proto", ] @@ -2038,3675 +1994,6 @@ new file mode 100644 + } + } +} -diff --git a/components/adblock/android/javatests/src/org/chromium/components/adblock/AdblockControllerTestBase.java b/components/adblock/android/javatests/src/org/chromium/components/adblock/AdblockControllerTestBase.java -new file mode 100644 ---- /dev/null -+++ b/components/adblock/android/javatests/src/org/chromium/components/adblock/AdblockControllerTestBase.java -@@ -0,0 +1,64 @@ -+/* -+ * This file is part of eyeo Chromium SDK, -+ * Copyright (C) 2006-present eyeo GmbH -+ * -+ * eyeo Chromium SDK is free software: you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 3 as -+ * published by the Free Software Foundation. -+ * -+ * eyeo Chromium SDK is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with eyeo Chromium SDK. If not, see . -+ */ -+ -+package org.chromium.components.adblock; -+ -+import androidx.test.filters.LargeTest; -+ -+import org.junit.Assert; -+import org.junit.Test; -+ -+import org.chromium.base.ThreadUtils; -+import org.chromium.base.test.util.CallbackHelper; -+import org.chromium.base.test.util.Feature; -+import org.chromium.base.test.util.IntegrationTest; -+ -+import java.util.ArrayList; -+import java.util.List; -+import java.util.concurrent.TimeUnit; -+import java.util.concurrent.TimeoutException; -+ -+public abstract class AdblockControllerTestBase { -+ private final CallbackHelper mHelper = new CallbackHelper(); -+ protected AdblockController mAdblockController; -+ -+ @Test -+ @IntegrationTest -+ @LargeTest -+ @Feature({"adblock"}) -+ public void addingAllowedDomains() throws TimeoutException { -+ final List allowedDomains = new ArrayList<>(); -+ ThreadUtils.runOnUiThreadBlocking( -+ () -> { -+ mAdblockController.addAllowedDomain("foobar.com"); -+ mAdblockController.addAllowedDomain("domain.com/path/to/page.html"); -+ mAdblockController.addAllowedDomain("domain.com/duplicate.html"); -+ mAdblockController.addAllowedDomain("https://scheme.com/path.html"); -+ mAdblockController.addAllowedDomain("gibberish"); -+ allowedDomains.addAll(mAdblockController.getAllowedDomains()); -+ mHelper.notifyCalled(); -+ }); -+ mHelper.waitForCallback(0, 1, 10, TimeUnit.SECONDS); -+ // We expect to see a sorted collection of domains (not URLs) without duplicates. -+ ArrayList expectedAllowedDomains = new ArrayList(); -+ expectedAllowedDomains.add("domain.com"); -+ expectedAllowedDomains.add("foobar.com"); -+ expectedAllowedDomains.add("scheme.com"); -+ expectedAllowedDomains.add("www.gibberish.com"); -+ Assert.assertEquals(expectedAllowedDomains, allowedDomains); -+ } -+} -diff --git a/components/adblock/android/javatests/src/org/chromium/components/adblock/DefaultSettingsTestBase.java b/components/adblock/android/javatests/src/org/chromium/components/adblock/DefaultSettingsTestBase.java -new file mode 100644 ---- /dev/null -+++ b/components/adblock/android/javatests/src/org/chromium/components/adblock/DefaultSettingsTestBase.java -@@ -0,0 +1,73 @@ -+/* -+ * This file is part of eyeo Chromium SDK, -+ * Copyright (C) 2006-present eyeo GmbH -+ * -+ * eyeo Chromium SDK is free software: you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 3 as -+ * published by the Free Software Foundation. -+ * -+ * eyeo Chromium SDK is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with eyeo Chromium SDK. If not, see . -+ */ -+ -+package org.chromium.components.adblock; -+ -+import org.junit.Assert; -+import org.junit.Test; -+ -+import org.chromium.base.ThreadUtils; -+import org.chromium.base.test.util.Feature; -+import org.chromium.base.test.util.IntegrationTest; -+import org.chromium.content_public.browser.BrowserContextHandle; -+ -+import java.net.MalformedURLException; -+import java.net.URL; -+import java.util.List; -+ -+public abstract class DefaultSettingsTestBase { -+ protected abstract BrowserContextHandle getBrowserContext(); -+ -+ @Test -+ @IntegrationTest -+ @Feature({"adblock"}) -+ public void checkAdblockEnabledByDefault() { -+ ThreadUtils.runOnUiThreadBlocking( -+ () -> { -+ FilteringConfiguration adblockConfiguration = -+ FilteringConfiguration.createConfiguration( -+ "adblock", getBrowserContext()); -+ -+ Assert.assertNotNull(adblockConfiguration); -+ Assert.assertTrue(adblockConfiguration.isEnabled()); -+ Assert.assertNotEquals(adblockConfiguration.getFilterLists().size(), 0); -+ }); -+ } -+ -+ @Test -+ @IntegrationTest -+ @Feature({"adblock"}) -+ public void checkAcceptableAdsEnabledByDefault() { -+ ThreadUtils.runOnUiThreadBlocking( -+ () -> { -+ FilteringConfiguration adblockConfiguration = -+ FilteringConfiguration.createConfiguration( -+ "adblock", getBrowserContext()); -+ -+ Assert.assertNotNull(adblockConfiguration); -+ List filterLists = adblockConfiguration.getFilterLists(); -+ -+ try { -+ URL acceptableAdsUrl = new URL(adblockConfiguration.getAcceptableAdsUrl()); -+ Assert.assertTrue(filterLists.contains(acceptableAdsUrl)); -+ } catch (MalformedURLException e) { -+ e.printStackTrace(); -+ Assert.fail(); -+ } -+ }); -+ } -+} -diff --git a/components/adblock/android/javatests/src/org/chromium/components/adblock/FilteringConfigurationTestBase.java b/components/adblock/android/javatests/src/org/chromium/components/adblock/FilteringConfigurationTestBase.java -new file mode 100644 ---- /dev/null -+++ b/components/adblock/android/javatests/src/org/chromium/components/adblock/FilteringConfigurationTestBase.java -@@ -0,0 +1,421 @@ -+/* -+ * This file is part of eyeo Chromium SDK, -+ * Copyright (C) 2006-present eyeo GmbH -+ * -+ * eyeo Chromium SDK is free software: you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 3 as -+ * published by the Free Software Foundation. -+ * -+ * eyeo Chromium SDK is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with eyeo Chromium SDK. If not, see . -+ */ -+ -+package org.chromium.components.adblock; -+ -+import androidx.test.InstrumentationRegistry; -+import androidx.test.filters.LargeTest; -+ -+import org.junit.Assert; -+import org.junit.Test; -+ -+import org.chromium.base.ThreadUtils; -+import org.chromium.base.test.util.CallbackHelper; -+import org.chromium.base.test.util.Feature; -+import org.chromium.base.test.util.IntegrationTest; -+import org.chromium.content_public.browser.BrowserContextHandle; -+import org.chromium.net.test.EmbeddedTestServer; -+ -+import java.net.URL; -+import java.util.ArrayList; -+import java.util.List; -+import java.util.concurrent.TimeUnit; -+import java.util.concurrent.TimeoutException; -+ -+public abstract class FilteringConfigurationTestBase { -+ private final CallbackHelper mCallbackHelper = new CallbackHelper(); -+ private TestPagesHelperBase mHelper; -+ public FilteringConfiguration mConfigurationA; -+ public FilteringConfiguration mConfigurationB; -+ private EmbeddedTestServer mTestServer; -+ protected String mTestUrl; -+ -+ protected abstract void loadTestUrl() throws Exception; -+ -+ protected abstract BrowserContextHandle getBrowserContext(); -+ -+ public void setUp(TestPagesHelperBase helper, String filePath) throws TimeoutException { -+ mHelper = helper; -+ mTestServer = EmbeddedTestServer.createAndStartServer(InstrumentationRegistry.getContext()); -+ mTestUrl = mTestServer.getURLWithHostName("test.org", filePath); -+ ThreadUtils.runOnUiThreadBlocking( -+ () -> { -+ mConfigurationA = -+ FilteringConfiguration.createConfiguration("a", getBrowserContext()); -+ mConfigurationB = -+ FilteringConfiguration.createConfiguration("b", getBrowserContext()); -+ mCallbackHelper.notifyCalled(); -+ }); -+ mCallbackHelper.waitForCallback(0, 1, 10, TimeUnit.SECONDS); -+ } -+ -+ public void tearDown() { -+ mTestServer.stopAndDestroyServer(); -+ } -+ -+ private static class TestConfigurationChangeObserver -+ implements FilteringConfiguration.ConfigurationChangeObserver { -+ public volatile boolean mOnEnabledStateChangedCalled; -+ public volatile boolean mOnFilterListsChanged; -+ public volatile boolean mOnAllowedDomainsChanged; -+ public volatile boolean mOnCustomFiltersChanged; -+ -+ public TestConfigurationChangeObserver() { -+ mOnEnabledStateChangedCalled = false; -+ mOnFilterListsChanged = false; -+ mOnAllowedDomainsChanged = false; -+ mOnCustomFiltersChanged = false; -+ } -+ -+ @Override -+ public void onEnabledStateChanged() { -+ mOnEnabledStateChangedCalled = true; -+ } -+ -+ @Override -+ public void onFilterListsChanged() { -+ mOnFilterListsChanged = true; -+ } -+ -+ @Override -+ public void onAllowedDomainsChanged() { -+ mOnAllowedDomainsChanged = true; -+ } -+ -+ @Override -+ public void onCustomFiltersChanged() { -+ mOnCustomFiltersChanged = true; -+ } -+ } -+ -+ @Test -+ @IntegrationTest -+ @LargeTest -+ @Feature({"adblock"}) -+ public void addingAllowedDomains() throws Exception { -+ final List allowedDomainsA = new ArrayList<>(); -+ final List allowedDomainsB = new ArrayList<>(); -+ ThreadUtils.runOnUiThreadBlocking( -+ () -> { -+ mConfigurationA.addAllowedDomain("foobar.com"); -+ mConfigurationA.addAllowedDomain("domain.com/path/to/page.html"); -+ mConfigurationA.addAllowedDomain("domain.com/duplicate.html"); -+ allowedDomainsA.addAll(mConfigurationA.getAllowedDomains()); -+ -+ mConfigurationB.addAllowedDomain("https://scheme.com/path.html"); -+ mConfigurationB.addAllowedDomain("https://second.com"); -+ mConfigurationB.removeAllowedDomain("https://second.com"); -+ mConfigurationB.addAllowedDomain("gibberish"); -+ allowedDomainsB.addAll(mConfigurationB.getAllowedDomains()); -+ -+ mCallbackHelper.notifyCalled(); -+ }); -+ mCallbackHelper.waitForCallback(0, 1, 10, TimeUnit.SECONDS); -+ // We expect to see a sorted collection of domains (not URLs) without duplicates. -+ ArrayList expectedAllowedDomainsA = new ArrayList(); -+ expectedAllowedDomainsA.add("domain.com"); -+ expectedAllowedDomainsA.add("foobar.com"); -+ Assert.assertEquals(expectedAllowedDomainsA, allowedDomainsA); -+ -+ // We expect not to see second.com because it was removed after being added. -+ ArrayList expectedAllowedDomainsB = new ArrayList(); -+ expectedAllowedDomainsB.add("scheme.com"); -+ expectedAllowedDomainsB.add("www.gibberish.com"); -+ Assert.assertEquals(expectedAllowedDomainsB, allowedDomainsB); -+ } -+ -+ @Test -+ @IntegrationTest -+ @LargeTest -+ @Feature({"adblock"}) -+ public void addingCustomFilters() throws Exception { -+ final List customFiltersA = new ArrayList<>(); -+ final List customFiltersB = new ArrayList<>(); -+ ThreadUtils.runOnUiThreadBlocking( -+ () -> { -+ mConfigurationA.addCustomFilter("foobar.com"); -+ mConfigurationA.addCustomFilter("foobar.com"); -+ mConfigurationA.addCustomFilter("abc"); -+ customFiltersA.addAll(mConfigurationA.getCustomFilters()); -+ -+ mConfigurationB.addCustomFilter("https://scheme.com/path.html"); -+ mConfigurationB.addCustomFilter("https://second.com"); -+ mConfigurationB.removeCustomFilter("https://second.com"); -+ customFiltersB.addAll(mConfigurationB.getCustomFilters()); -+ -+ mCallbackHelper.notifyCalled(); -+ }); -+ mCallbackHelper.waitForCallback(0, 1, 10, TimeUnit.SECONDS); -+ // We expect to see a collection of custom filters without duplicates. -+ // The order represents order of addition. -+ ArrayList expectedCustomFiltersA = new ArrayList(); -+ expectedCustomFiltersA.add("foobar.com"); -+ expectedCustomFiltersA.add("abc"); -+ Assert.assertEquals(expectedCustomFiltersA, customFiltersA); -+ -+ // We expect not to see https://second.com because it was removed after being added. -+ ArrayList expectedCustomFiltersB = new ArrayList(); -+ expectedCustomFiltersB.add("https://scheme.com/path.html"); -+ Assert.assertEquals(expectedCustomFiltersB, customFiltersB); -+ } -+ -+ @Test -+ @IntegrationTest -+ @LargeTest -+ @Feature({"adblock"}) -+ public void addingFilterLists() throws Exception { -+ final URL filterList1 = new URL("http://filters.com/list1.txt"); -+ final URL filterList2 = new URL("http://filters.com/list2.txt"); -+ final List filterListsA = new ArrayList(); -+ final List filterListsB = new ArrayList(); -+ ThreadUtils.runOnUiThreadBlocking( -+ () -> { -+ mConfigurationA.addFilterList(filterList1); -+ mConfigurationA.addFilterList(filterList2); -+ mConfigurationA.addFilterList(filterList1); -+ filterListsA.addAll(mConfigurationA.getFilterLists()); -+ -+ mConfigurationB.addFilterList(filterList1); -+ mConfigurationB.addFilterList(filterList2); -+ mConfigurationB.removeFilterList(filterList1); -+ filterListsB.addAll(mConfigurationB.getFilterLists()); -+ -+ mCallbackHelper.notifyCalled(); -+ }); -+ mCallbackHelper.waitForCallback(0, 1, 10, TimeUnit.SECONDS); -+ ArrayList expectedFilterListsA = new ArrayList(); -+ expectedFilterListsA.add(filterList1); -+ expectedFilterListsA.add(filterList2); -+ Assert.assertEquals(expectedFilterListsA, filterListsA); -+ -+ ArrayList expectedFilterListsB = new ArrayList(); -+ expectedFilterListsB.add(filterList2); -+ Assert.assertEquals(expectedFilterListsB, filterListsB); -+ } -+ -+ @Test -+ @IntegrationTest -+ @LargeTest -+ @Feature({"adblock"}) -+ public void aliasedConfigurations() throws Exception { -+ final URL filterList1 = new URL("http://filters.com/list1.txt"); -+ final URL filterList2 = new URL("http://filters.com/list2.txt"); -+ final List filterListsA = new ArrayList(); -+ final List filterListsB = new ArrayList(); -+ ThreadUtils.runOnUiThreadBlocking( -+ () -> { -+ // Create a new FilteringConfiguration with a name of one that -+ // already exist. -+ FilteringConfiguration aliasedConfiguration = -+ FilteringConfiguration.createConfiguration("a", getBrowserContext()); -+ -+ // We add filter lists only to the original configuration instance. -+ mConfigurationA.addFilterList(filterList1); -+ mConfigurationA.addFilterList(filterList2); -+ -+ // We check what filter lists are present in the original and in the aliased -+ // instance. -+ filterListsA.addAll(mConfigurationA.getFilterLists()); -+ filterListsB.addAll(aliasedConfiguration.getFilterLists()); -+ -+ mCallbackHelper.notifyCalled(); -+ }); -+ mCallbackHelper.waitForCallback(0, 1, 10, TimeUnit.SECONDS); -+ ArrayList expectedFilterLists = new ArrayList(); -+ expectedFilterLists.add(filterList1); -+ expectedFilterLists.add(filterList2); -+ Assert.assertEquals(expectedFilterLists, filterListsA); -+ Assert.assertEquals(expectedFilterLists, filterListsB); -+ } -+ -+ @Test -+ @IntegrationTest -+ @LargeTest -+ @Feature({"adblock"}) -+ public void configurationChangeObserverNotified() throws Exception { -+ final URL filterList1 = new URL("http://filters.com/list1.txt"); -+ final TestConfigurationChangeObserver observer = new TestConfigurationChangeObserver(); -+ Assert.assertFalse(observer.mOnEnabledStateChangedCalled); -+ Assert.assertFalse(observer.mOnAllowedDomainsChanged); -+ Assert.assertFalse(observer.mOnCustomFiltersChanged); -+ Assert.assertFalse(observer.mOnFilterListsChanged); -+ -+ ThreadUtils.runOnUiThreadBlocking( -+ () -> { -+ // We'll create an aliased instance which will receive notifications triggered -+ // by -+ // changes made to the original instance. -+ FilteringConfiguration aliasedConfiguration = -+ FilteringConfiguration.createConfiguration("a", getBrowserContext()); -+ aliasedConfiguration.addObserver(observer); -+ -+ mConfigurationA.addFilterList(filterList1); -+ mConfigurationA.addAllowedDomain("test.com"); -+ mConfigurationA.addCustomFilter("test.com"); -+ mConfigurationA.setEnabled(false); -+ -+ mCallbackHelper.notifyCalled(); -+ }); -+ mCallbackHelper.waitForCallback(0, 1, 10, TimeUnit.SECONDS); -+ Assert.assertTrue(observer.mOnEnabledStateChangedCalled); -+ Assert.assertTrue(observer.mOnAllowedDomainsChanged); -+ Assert.assertTrue(observer.mOnCustomFiltersChanged); -+ Assert.assertTrue(observer.mOnFilterListsChanged); -+ } -+ -+ @Test -+ @IntegrationTest -+ @LargeTest -+ @Feature({"adblock"}) -+ public void resourceBlockedByFilter() throws Exception { -+ ThreadUtils.runOnUiThreadBlocking( -+ () -> { -+ mConfigurationA.addCustomFilter("resource.png"); -+ mCallbackHelper.notifyCalled(); -+ }); -+ mCallbackHelper.waitForCallback(0, 1, 10, TimeUnit.SECONDS); -+ loadTestUrl(); -+ TestVerificationUtils.expectResourceBlocked(mHelper, "subresource"); -+ } -+ -+ @Test -+ @IntegrationTest -+ @LargeTest -+ @Feature({"adblock"}) -+ public void resourceAllowedByFilter() throws Exception { -+ ThreadUtils.runOnUiThreadBlocking( -+ () -> { -+ mConfigurationA.addCustomFilter("resource.png"); -+ // Allowing filter for the mocked test.org domain that mTestServer hosts. -+ mConfigurationA.addCustomFilter("@@test.org$document"); -+ mCallbackHelper.notifyCalled(); -+ }); -+ mCallbackHelper.waitForCallback(0, 1, 10, TimeUnit.SECONDS); -+ loadTestUrl(); -+ TestVerificationUtils.expectResourceShown(mHelper, "subresource"); -+ } -+ -+ @Test -+ @IntegrationTest -+ @LargeTest -+ @Feature({"adblock"}) -+ public void resourceAllowedByAllowedDomain() throws Exception { -+ ThreadUtils.runOnUiThreadBlocking( -+ () -> { -+ mConfigurationA.addCustomFilter("resource.png"); -+ mConfigurationA.addAllowedDomain("test.org"); -+ mCallbackHelper.notifyCalled(); -+ }); -+ mCallbackHelper.waitForCallback(0, 1, 10, TimeUnit.SECONDS); -+ loadTestUrl(); -+ TestVerificationUtils.expectResourceShown(mHelper, "subresource"); -+ } -+ -+ @Test -+ @IntegrationTest -+ @LargeTest -+ @Feature({"adblock"}) -+ public void resourceBlockedBySecondConfiguration() throws Exception { -+ ThreadUtils.runOnUiThreadBlocking( -+ () -> { -+ // ConfigurationA allows the resource. -+ // Allowing rules take precedence within a FilteringConfiguration. -+ mConfigurationA.addCustomFilter("resource.png"); -+ mConfigurationA.addAllowedDomain("test.org"); -+ // But ConfigurationB blocks the resource. -+ // Blocking takes precedence across FilteringConfigurations. -+ mConfigurationB.addCustomFilter("resource.png"); -+ mCallbackHelper.notifyCalled(); -+ }); -+ mCallbackHelper.waitForCallback(0, 1, 10, TimeUnit.SECONDS); -+ loadTestUrl(); -+ TestVerificationUtils.expectResourceBlocked(mHelper, "subresource"); -+ } -+ -+ @Test -+ @IntegrationTest -+ @LargeTest -+ @Feature({"adblock"}) -+ public void noBlockingWithoutFilters() throws Exception { -+ loadTestUrl(); -+ TestVerificationUtils.expectResourceShown(mHelper, "subresource"); -+ } -+ -+ @Test -+ @IntegrationTest -+ @LargeTest -+ @Feature({"adblock"}) -+ public void createAndRemoveConfiguration() throws Exception { -+ ThreadUtils.runOnUiThreadBlocking( -+ () -> { -+ // Check initial state. -+ FilteringConfiguration.removeConfiguration("adblock", getBrowserContext()); -+ ArrayList expectedConfigurations = -+ new ArrayList(); -+ expectedConfigurations.add(mConfigurationA); -+ expectedConfigurations.add(mConfigurationB); -+ Assert.assertEquals( -+ expectedConfigurations, -+ FilteringConfiguration.getConfigurations(getBrowserContext())); -+ // Add new configuration (twice) and check. -+ FilteringConfiguration configurationC = -+ FilteringConfiguration.createConfiguration("c", getBrowserContext()); -+ FilteringConfiguration configurationC2 = -+ FilteringConfiguration.createConfiguration("c", getBrowserContext()); -+ // Confirm this is the same reference. -+ Assert.assertEquals(configurationC, configurationC2); -+ expectedConfigurations.add(configurationC); -+ Assert.assertEquals( -+ expectedConfigurations, -+ FilteringConfiguration.getConfigurations(getBrowserContext())); -+ // Remove configuration "c" twice (2nd attempt has no effect) and check. -+ FilteringConfiguration.removeConfiguration("c", getBrowserContext()); -+ FilteringConfiguration.removeConfiguration("c", getBrowserContext()); -+ expectedConfigurations.remove(configurationC); -+ Assert.assertEquals( -+ expectedConfigurations, -+ FilteringConfiguration.getConfigurations(getBrowserContext())); -+ }); -+ } -+ -+ @Test -+ @IntegrationTest -+ @LargeTest -+ @Feature({"adblock"}) -+ public void cannotUseRemovedConfiguration() throws Exception { -+ ThreadUtils.runOnUiThreadBlocking( -+ () -> { -+ FilteringConfiguration configurationC = -+ FilteringConfiguration.createConfiguration("c", getBrowserContext()); -+ configurationC.setEnabled(false); -+ Assert.assertFalse(configurationC.isEnabled()); -+ FilteringConfiguration.removeConfiguration("c", getBrowserContext()); -+ try { -+ configurationC.setEnabled(true); -+ Assert.fail(); -+ } catch (final IllegalStateException e) { -+ // Expected -+ } -+ // Recreate. -+ configurationC = -+ FilteringConfiguration.createConfiguration("c", getBrowserContext()); -+ Assert.assertTrue(configurationC.isEnabled()); -+ configurationC.setEnabled(false); -+ Assert.assertFalse(configurationC.isEnabled()); -+ }); -+ } -+} -diff --git a/components/adblock/android/javatests/src/org/chromium/components/adblock/TestPagesCircumventionTestBase.java b/components/adblock/android/javatests/src/org/chromium/components/adblock/TestPagesCircumventionTestBase.java -new file mode 100644 ---- /dev/null -+++ b/components/adblock/android/javatests/src/org/chromium/components/adblock/TestPagesCircumventionTestBase.java -@@ -0,0 +1,65 @@ -+/* -+ * This file is part of eyeo Chromium SDK, -+ * Copyright (C) 2006-present eyeo GmbH -+ * -+ * eyeo Chromium SDK is free software: you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 3 as -+ * published by the Free Software Foundation. -+ * -+ * eyeo Chromium SDK is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with eyeo Chromium SDK. If not, see . -+ */ -+ -+package org.chromium.components.adblock; -+ -+import androidx.test.filters.LargeTest; -+ -+import org.junit.Assert; -+import org.junit.Test; -+ -+import org.chromium.base.test.util.Feature; -+import org.chromium.content_public.browser.test.util.JavaScriptUtils; -+ -+public abstract class TestPagesCircumventionTestBase { -+ private TestPagesHelperBase mHelper; -+ -+ public void setUp(TestPagesHelperBase helper) { -+ mHelper = helper; -+ mHelper.addFilterList(TestPagesHelperBase.TESTPAGES_SUBSCRIPTION); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testVerifyCircumventionInlineStyleNotImportant() throws Exception { -+ mHelper.loadUrl( -+ TestPagesHelperBase.CIRCUMVENTION_TESTPAGES_TESTCASES_ROOT -+ + "inline-style-important"); -+ TestVerificationUtils.verifyHiddenCount(mHelper, 2, "div"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testVerifyCircumventionAnonymousFrameDocumentWrite() throws Exception { -+ mHelper.loadUrl( -+ TestPagesHelperBase.CIRCUMVENTION_TESTPAGES_TESTCASES_ROOT -+ + "anoniframe-documentwrite"); -+ TestVerificationUtils.verifyHiddenCount(mHelper, 1, "span[data-expectedresult='fail']"); -+ String numHidden = -+ JavaScriptUtils.executeJavaScriptAndWaitForResult( -+ mHelper.getWebContents(), -+ "var hiddenCount = 0;var elements =" -+ + " document.getElementById(\"write\").contentWindow" -+ + ".document.getElementsByTagName(\"span\");for (let i = 0; i <" -+ + " elements.length; ++i) { if" -+ + " (window.getComputedStyle(elements[i]).display == \"none\") " -+ + "++hiddenCount;}hiddenCount;"); -+ Assert.assertEquals("1", numHidden); -+ } -+} -diff --git a/components/adblock/android/javatests/src/org/chromium/components/adblock/TestPagesCspTestBase.java b/components/adblock/android/javatests/src/org/chromium/components/adblock/TestPagesCspTestBase.java -new file mode 100644 ---- /dev/null -+++ b/components/adblock/android/javatests/src/org/chromium/components/adblock/TestPagesCspTestBase.java -@@ -0,0 +1,86 @@ -+/* -+ * This file is part of eyeo Chromium SDK, -+ * Copyright (C) 2006-present eyeo GmbH -+ * -+ * eyeo Chromium SDK is free software: you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 3 as -+ * published by the Free Software Foundation. -+ * -+ * eyeo Chromium SDK is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with eyeo Chromium SDK. If not, see . -+ */ -+ -+package org.chromium.components.adblock; -+ -+import androidx.test.filters.LargeTest; -+ -+import org.junit.Test; -+ -+import org.chromium.base.test.util.Feature; -+ -+public abstract class TestPagesCspTestBase { -+ private TestPagesHelperBase mHelper; -+ -+ protected void setUp(TestPagesHelperBase helper) { -+ mHelper = helper; -+ mHelper.addFilterList(TestPagesHelperBase.TESTPAGES_SUBSCRIPTION); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testCspAllSites() throws Exception { -+ mHelper.loadUrl(TestPagesHelperBase.FILTER_TESTPAGES_TESTCASES_ROOT + "csp_all"); -+ TestVerificationUtils.verifyDisplayedCount(mHelper, 0, "img[id='all-sites-fail-1']"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testCspSpecificSite() throws Exception { -+ mHelper.loadUrl(TestPagesHelperBase.FILTER_TESTPAGES_TESTCASES_ROOT + "csp_specific"); -+ TestVerificationUtils.verifyDisplayedCount( -+ mHelper, -+ 0, -+ "img[id='specific-site-fail-1']", -+ TestVerificationUtils.IncludeSubframes.NO); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testCspSpecificSiteFrameSrc() throws Exception { -+ mHelper.loadUrl(TestPagesHelperBase.FILTER_TESTPAGES_TESTCASES_ROOT + "csp_specific"); -+ TestVerificationUtils.verifyDisplayedCount( -+ mHelper, 0, "div[id='sub-frame-error']", TestVerificationUtils.IncludeSubframes.NO); -+ TestVerificationUtils.verifyDisplayedCount( -+ mHelper, -+ 0, -+ "div[id='sub-frame-error-details']", -+ TestVerificationUtils.IncludeSubframes.NO); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testCspException() throws Exception { -+ mHelper.loadUrl(TestPagesHelperBase.EXCEPTION_TESTPAGES_TESTCASES_ROOT + "csp"); -+ TestVerificationUtils.verifyDisplayedCount( -+ mHelper, 1, "div[id='unblock-javascript'] > img"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testCspGenericBlockException() throws Exception { -+ mHelper.loadUrl( -+ TestPagesHelperBase.EXCEPTION_TESTPAGES_TESTCASES_ROOT + "csp_genericblock"); -+ TestVerificationUtils.verifyDisplayedCount( -+ mHelper, 1, "div[id='genericblock-javascript'] > img"); -+ } -+} -diff --git a/components/adblock/android/javatests/src/org/chromium/components/adblock/TestPagesElemhideEmuInvTestBase.java b/components/adblock/android/javatests/src/org/chromium/components/adblock/TestPagesElemhideEmuInvTestBase.java -new file mode 100644 ---- /dev/null -+++ b/components/adblock/android/javatests/src/org/chromium/components/adblock/TestPagesElemhideEmuInvTestBase.java -@@ -0,0 +1,116 @@ -+/* -+ * This file is part of eyeo Chromium SDK, -+ * Copyright (C) 2006-present eyeo GmbH -+ * -+ * eyeo Chromium SDK is free software: you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 3 as -+ * published by the Free Software Foundation. -+ * -+ * eyeo Chromium SDK is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with eyeo Chromium SDK. If not, see . -+ */ -+ -+package org.chromium.components.adblock; -+ -+import androidx.test.filters.LargeTest; -+ -+import org.junit.Test; -+ -+import org.chromium.base.test.util.Feature; -+ -+public abstract class TestPagesElemhideEmuInvTestBase { -+ public static final String ELEMENT_HIDING_EMULATION_TESTPAGES_URL = -+ TestPagesHelperBase.FILTER_TESTPAGES_TESTCASES_ROOT -+ + "element-hiding-emulation-inversion"; -+ private TestPagesHelperBase mHelper; -+ -+ protected void setUp(TestPagesHelperBase helper) { -+ mHelper = helper; -+ mHelper.addFilterList(TestPagesHelperBase.TESTPAGES_SUBSCRIPTION); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testElemHideEmuNotAbpProperties() throws Exception { -+ mHelper.loadUrl(ELEMENT_HIDING_EMULATION_TESTPAGES_URL); -+ TestVerificationUtils.verifyHiddenCount( -+ mHelper, 1, "div[id='basic-not-abp-properties-usage-fail']"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testElemHideEmuNotAbpHas() throws Exception { -+ mHelper.loadUrl(ELEMENT_HIDING_EMULATION_TESTPAGES_URL); -+ TestVerificationUtils.verifyHiddenCount( -+ mHelper, 1, "div[id='basic-not-abp-has-usage-fail']"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testElemHideEmuNotAbpContains() throws Exception { -+ mHelper.loadUrl(ELEMENT_HIDING_EMULATION_TESTPAGES_URL); -+ TestVerificationUtils.verifyHiddenCount( -+ mHelper, 1, "span[id='basic-not-abp-contains-usage-fail']"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testElemHideEmuNotChained() throws Exception { -+ mHelper.loadUrl(ELEMENT_HIDING_EMULATION_TESTPAGES_URL); -+ TestVerificationUtils.verifyHiddenCount( -+ mHelper, 1, "div[id='chained-extended-selectors-with-not-selector-fail-1']"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testElemHideEmuNotCaseIsensitive() throws Exception { -+ mHelper.loadUrl(ELEMENT_HIDING_EMULATION_TESTPAGES_URL); -+ TestVerificationUtils.verifyHiddenCount( -+ mHelper, 1, "div[id='case-insensitive-extended-selectors-with-not-selector-fail']"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testElemHideEmuNotWildcard() throws Exception { -+ mHelper.loadUrl(ELEMENT_HIDING_EMULATION_TESTPAGES_URL); -+ TestVerificationUtils.verifyHiddenCount( -+ mHelper, -+ 1, -+ "div[id='wildcard-in-extended-selector-combined-with-not-selector-fail']"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testElemHideEmuNotRegexAbpProperties() throws Exception { -+ mHelper.loadUrl(ELEMENT_HIDING_EMULATION_TESTPAGES_URL); -+ TestVerificationUtils.verifyHiddenCount( -+ mHelper, 1, "div[id='regular-expression-in-not-abp-properties-fail-1']"); -+ TestVerificationUtils.verifyHiddenCount( -+ mHelper, 1, "div[id='regular-expression-in-not-abp-properties-fail-2']"); -+ TestVerificationUtils.verifyDisplayedCount(mHelper, 1, ".ehei-regex3"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testElemHideEmuNotRegexAbpContains() throws Exception { -+ mHelper.loadUrl(ELEMENT_HIDING_EMULATION_TESTPAGES_URL); -+ TestVerificationUtils.verifyHiddenCount( -+ mHelper, 1, "span[id='regular-expression-in-not-abp-contains-fail-1']"); -+ TestVerificationUtils.verifyHiddenCount( -+ mHelper, 1, "span[id='regular-expression-in-not-abp-contains-fail-2']"); -+ TestVerificationUtils.verifyDisplayedCount(mHelper, 2, ".ehei-contains-regex"); -+ } -+} -diff --git a/components/adblock/android/javatests/src/org/chromium/components/adblock/TestPagesElemhideEmuTestBase.java b/components/adblock/android/javatests/src/org/chromium/components/adblock/TestPagesElemhideEmuTestBase.java -new file mode 100644 ---- /dev/null -+++ b/components/adblock/android/javatests/src/org/chromium/components/adblock/TestPagesElemhideEmuTestBase.java -@@ -0,0 +1,161 @@ -+/* -+ * This file is part of eyeo Chromium SDK, -+ * Copyright (C) 2006-present eyeo GmbH -+ * -+ * eyeo Chromium SDK is free software: you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 3 as -+ * published by the Free Software Foundation. -+ * -+ * eyeo Chromium SDK is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with eyeo Chromium SDK. If not, see . -+ */ -+ -+package org.chromium.components.adblock; -+ -+import androidx.test.filters.LargeTest; -+ -+import org.junit.Test; -+ -+import org.chromium.base.test.util.Feature; -+ -+public abstract class TestPagesElemhideEmuTestBase { -+ public static final String ELEMENT_HIDING_EMULATION_TESTPAGES_URL = -+ TestPagesHelperBase.FILTER_TESTPAGES_TESTCASES_ROOT + "element-hiding-emulation"; -+ public static final String ELEMENT_HIDING_EMULATION_EXCEPTIONS_TESTPAGES_URL = -+ TestPagesHelperBase.EXCEPTION_TESTPAGES_TESTCASES_ROOT + "element-hiding"; -+ private TestPagesHelperBase mHelper; -+ -+ protected void setUp(TestPagesHelperBase helper) { -+ mHelper = helper; -+ mHelper.addFilterList(TestPagesHelperBase.TESTPAGES_SUBSCRIPTION); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testElemHideEmuFiltersBasicAbpProperties() throws Exception { -+ mHelper.loadUrl(ELEMENT_HIDING_EMULATION_TESTPAGES_URL); -+ TestVerificationUtils.verifyHiddenCount( -+ mHelper, 1, "div[id='basic-abp-properties-usage-fail-1']"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testElemHideEmuFiltersBasicAbpHas() throws Exception { -+ mHelper.loadUrl(ELEMENT_HIDING_EMULATION_TESTPAGES_URL); -+ TestVerificationUtils.verifyHiddenCount(mHelper, 1, "div[id='basic-abp-has-usage-fail-1']"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testElemHideEmuFiltersBasicHas() throws Exception { -+ mHelper.loadUrl(ELEMENT_HIDING_EMULATION_TESTPAGES_URL); -+ TestVerificationUtils.verifyHiddenCount(mHelper, 1, "div[id='basic-has-usage-fail-1']"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testElemHideEmuFiltersBasicAbpContains() throws Exception { -+ mHelper.loadUrl(ELEMENT_HIDING_EMULATION_TESTPAGES_URL); -+ TestVerificationUtils.verifyHiddenCount( -+ mHelper, 1, "span[id='basic-abp-contains-usage-fail-1']"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testElemHideEmuFiltersBasicXpath() throws Exception { -+ mHelper.loadUrl(ELEMENT_HIDING_EMULATION_TESTPAGES_URL); -+ TestVerificationUtils.verifyHiddenCount(mHelper, 1, "span[id='basic-xpath-usage-fail']"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testElemHideEmuFiltersBasicHasText() throws Exception { -+ mHelper.loadUrl(ELEMENT_HIDING_EMULATION_TESTPAGES_URL); -+ TestVerificationUtils.verifyHiddenCount( -+ mHelper, 1, "span[id='basic-has-text-usage-fail-1']"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testElemHideEmuFiltersChainedExtendedSelectors() throws Exception { -+ mHelper.loadUrl(ELEMENT_HIDING_EMULATION_TESTPAGES_URL); -+ TestVerificationUtils.verifyHiddenCount( -+ mHelper, 1, "div[id='chained-extended-selectors-fail-1']"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testElemHideEmuFiltersCaseInsensitiveExtendedSelectors() throws Exception { -+ mHelper.loadUrl(ELEMENT_HIDING_EMULATION_TESTPAGES_URL); -+ TestVerificationUtils.verifyHiddenCount( -+ mHelper, 1, "div[id='case-insensitive-extended-selectors-fail-1']"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testElemHideEmuFiltersWildcardInExtendedSelector() throws Exception { -+ mHelper.loadUrl(ELEMENT_HIDING_EMULATION_TESTPAGES_URL); -+ TestVerificationUtils.verifyHiddenCount( -+ mHelper, 1, "div[id='wildcard-in-extended-selector-fail-1']"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testElemHideEmuFiltersRegularExpressionInAbpProperties() throws Exception { -+ mHelper.loadUrl(ELEMENT_HIDING_EMULATION_TESTPAGES_URL); -+ TestVerificationUtils.verifyHiddenCount( -+ mHelper, 1, "div[id='regular-expression-in-abp-properties-fail-1']"); -+ TestVerificationUtils.verifyHiddenCount( -+ mHelper, 1, "div[id='regular-expression-in-abp-properties-fail-2']"); -+ // "Not a target" div is not hidden, does not match regular expression. -+ TestVerificationUtils.verifyDisplayedCount( -+ mHelper, 1, "div[class='testcase-examplecontent ehe-regex3']"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testElemHideEmuFiltersRegularExpressionInAbpContains() throws Exception { -+ mHelper.loadUrl(ELEMENT_HIDING_EMULATION_TESTPAGES_URL); -+ TestVerificationUtils.verifyHiddenCount( -+ mHelper, 1, "div[id='regular-expression-in-abp-contains-fail-1']"); -+ TestVerificationUtils.verifyHiddenCount( -+ mHelper, 1, "div[id='regular-expression-in-abp-contains-fail-2']"); -+ } -+ -+ // Exceptions: -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testElemHideEmuFiltersException() throws Exception { -+ mHelper.loadUrl(ELEMENT_HIDING_EMULATION_EXCEPTIONS_TESTPAGES_URL); -+ TestVerificationUtils.verifyDisplayedCount(mHelper, 1, "div[id='exception-usage-pass-1']"); -+ } -+ -+ // DPD-2543 -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testElemHideEmuFiltersBasicAbpPropertiesWithUsupportedFilter() throws Exception { -+ // Add broken ElemHideEmu filter -+ mHelper.addCustomFilter("abptestpages.org#?#div:-unsupported-selector(width: 213px)"); -+ mHelper.loadUrl(ELEMENT_HIDING_EMULATION_TESTPAGES_URL); -+ TestVerificationUtils.verifyHiddenCount( -+ mHelper, 1, "div[id='basic-abp-properties-usage-fail-1']"); -+ } -+} -diff --git a/components/adblock/android/javatests/src/org/chromium/components/adblock/TestPagesElemhideTestBase.java b/components/adblock/android/javatests/src/org/chromium/components/adblock/TestPagesElemhideTestBase.java -new file mode 100644 ---- /dev/null -+++ b/components/adblock/android/javatests/src/org/chromium/components/adblock/TestPagesElemhideTestBase.java -@@ -0,0 +1,159 @@ -+/* -+ * This file is part of eyeo Chromium SDK, -+ * Copyright (C) 2006-present eyeo GmbH -+ * -+ * eyeo Chromium SDK is free software: you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 3 as -+ * published by the Free Software Foundation. -+ * -+ * eyeo Chromium SDK is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with eyeo Chromium SDK. If not, see . -+ */ -+ -+package org.chromium.components.adblock; -+ -+import androidx.test.filters.LargeTest; -+ -+import org.junit.Test; -+ -+import org.chromium.base.test.util.Feature; -+ -+public abstract class TestPagesElemhideTestBase { -+ public static final String ELEMENT_HIDING_TESTPAGES_URL = -+ TestPagesHelperBase.FILTER_TESTPAGES_TESTCASES_ROOT + "element-hiding"; -+ public static final String ELEMENT_HIDING_EXCEPTIONS_TESTPAGES_URL = -+ TestPagesHelperBase.EXCEPTION_TESTPAGES_TESTCASES_ROOT + "elemhide"; -+ private TestPagesHelperBase mHelper; -+ -+ protected void setUp(TestPagesHelperBase helper) { -+ mHelper = helper; -+ mHelper.addFilterList(TestPagesHelperBase.TESTPAGES_SUBSCRIPTION); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testElemHideFiltersIdSelector() throws Exception { -+ mHelper.loadUrl(ELEMENT_HIDING_TESTPAGES_URL); -+ TestVerificationUtils.verifyHiddenCount(mHelper, 1, "div[id='eh-id']"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testElemHideFiltersIdSelectorDoubleCurlyBraces() throws Exception { -+ mHelper.loadUrl(ELEMENT_HIDING_TESTPAGES_URL); -+ TestVerificationUtils.verifyHiddenCount(mHelper, 1, "div[id='{{eh-id}}']"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testElemHideFiltersClassSelector() throws Exception { -+ mHelper.loadUrl(ELEMENT_HIDING_TESTPAGES_URL); -+ TestVerificationUtils.verifyHiddenCount(mHelper, 1, "div[class='eh-class']"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testElemHideFiltersDescendantSelector() throws Exception { -+ mHelper.loadUrl(ELEMENT_HIDING_TESTPAGES_URL); -+ TestVerificationUtils.verifyHiddenCount(mHelper, 1, "div[class='eh-descendant']"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testElemHideFiltersSiblingSelector() throws Exception { -+ mHelper.loadUrl(ELEMENT_HIDING_TESTPAGES_URL); -+ TestVerificationUtils.verifyHiddenCount(mHelper, 1, "div[class='eh-sibling']"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testElemHideFiltersAttributeSelector1() throws Exception { -+ mHelper.loadUrl(ELEMENT_HIDING_TESTPAGES_URL); -+ TestVerificationUtils.verifyHiddenCount( -+ mHelper, 1, "div[id='attribute-selector-1-fail-1']"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testElemHideFiltersAttributeSelector2() throws Exception { -+ mHelper.loadUrl(ELEMENT_HIDING_TESTPAGES_URL); -+ TestVerificationUtils.verifyHiddenCount( -+ mHelper, 1, "div[id='attribute-selector-2-fail-1']"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testElemHideFiltersAttributeSelector3() throws Exception { -+ mHelper.loadUrl(ELEMENT_HIDING_TESTPAGES_URL); -+ TestVerificationUtils.verifyHiddenCount( -+ mHelper, 1, "div[id='attribute-selector-3-fail-1']"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testElemHideFiltersStartsWithSelector1() throws Exception { -+ mHelper.loadUrl(ELEMENT_HIDING_TESTPAGES_URL); -+ TestVerificationUtils.verifyHiddenCount( -+ mHelper, 1, "div[id='starts-with-selector-1-fail-1']"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testElemHideFiltersStartsWithSelector2() throws Exception { -+ mHelper.loadUrl(ELEMENT_HIDING_TESTPAGES_URL); -+ TestVerificationUtils.verifyHiddenCount( -+ mHelper, 1, "div[id='starts-with-selector-2-fail-1']"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testElemHideFiltersEndsWithSelector1() throws Exception { -+ mHelper.loadUrl(ELEMENT_HIDING_TESTPAGES_URL); -+ TestVerificationUtils.verifyHiddenCount( -+ mHelper, 1, "div[id='ends-with-selector-1-fail-1']"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testElemHideFiltersContains() throws Exception { -+ mHelper.loadUrl(ELEMENT_HIDING_TESTPAGES_URL); -+ TestVerificationUtils.verifyHiddenCount(mHelper, 1, "div[id='contains-fail-1']"); -+ } -+ -+ // Exceptions: -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testElemHideFiltersBasicException() throws Exception { -+ mHelper.loadUrl(ELEMENT_HIDING_EXCEPTIONS_TESTPAGES_URL); -+ TestVerificationUtils.verifyHiddenCount(mHelper, 1, "img[id='basic-usage-fail-1']"); -+ TestVerificationUtils.verifyDisplayedCount( -+ mHelper, 1, "div[id='basic-usage-area'] > div[id='basic-usage-pass-1']"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testElemHideFiltersIframeException() throws Exception { -+ mHelper.loadUrl(ELEMENT_HIDING_EXCEPTIONS_TESTPAGES_URL); -+ TestVerificationUtils.verifyHiddenCount(mHelper, 1, "img[id='iframe-fail-1']"); -+ TestVerificationUtils.verifyDisplayedCount(mHelper, 1, "div[id='iframe-pass-1']"); -+ } -+} -diff --git a/components/adblock/android/javatests/src/org/chromium/components/adblock/TestPagesExceptionTestBase.java b/components/adblock/android/javatests/src/org/chromium/components/adblock/TestPagesExceptionTestBase.java -new file mode 100644 ---- /dev/null -+++ b/components/adblock/android/javatests/src/org/chromium/components/adblock/TestPagesExceptionTestBase.java -@@ -0,0 +1,190 @@ -+/* -+ * This file is part of eyeo Chromium SDK, -+ * Copyright (C) 2006-present eyeo GmbH -+ * -+ * eyeo Chromium SDK is free software: you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 3 as -+ * published by the Free Software Foundation. -+ * -+ * eyeo Chromium SDK is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with eyeo Chromium SDK. If not, see . -+ */ -+ -+package org.chromium.components.adblock; -+ -+import androidx.test.filters.LargeTest; -+ -+import org.junit.Assert; -+import org.junit.Test; -+ -+import org.chromium.base.test.util.Feature; -+import org.chromium.content_public.browser.test.util.JavaScriptUtils; -+ -+import java.util.HashSet; -+import java.util.List; -+import java.util.concurrent.CountDownLatch; -+import java.util.concurrent.TimeUnit; -+ -+public abstract class TestPagesExceptionTestBase { -+ private TestPagesHelperBase mHelper; -+ -+ protected void setUp(TestPagesHelperBase helper) { -+ mHelper = helper; -+ mHelper.addFilterList(TestPagesHelperBase.TESTPAGES_SUBSCRIPTION); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testVerifyImageExceptions() throws Exception { -+ final String subdomainImage = -+ String.format( -+ "https://allowed.subdomain.%s/testfiles/image_exception/subdomain.png", -+ TestPagesHelperBase.TESTPAGES_DOMAIN); -+ mHelper.loadUrl(TestPagesHelperBase.EXCEPTION_TESTPAGES_TESTCASES_ROOT + "image"); -+ Assert.assertEquals(2, mHelper.numAllowed()); -+ Assert.assertEquals(2, mHelper.numAllowedByType(ContentType.CONTENT_TYPE_IMAGE)); -+ Assert.assertTrue(mHelper.isAllowed(subdomainImage)); -+ Assert.assertTrue( -+ mHelper.isAllowed( -+ TestPagesHelperBase.TESTPAGES_RESOURCES_ROOT -+ + "image_exception/image.png")); -+ TestVerificationUtils.verifyDisplayedCount(mHelper, 2, "img"); -+ String numImages = -+ JavaScriptUtils.executeJavaScriptAndWaitForResult( -+ mHelper.getWebContents(), "document.getElementsByTagName(\"img\").length;"); -+ Assert.assertEquals("2", numImages); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testVerifySubdocumentException() throws Exception { -+ mHelper.loadUrl(TestPagesHelperBase.EXCEPTION_TESTPAGES_TESTCASES_ROOT + "subdocument"); -+ Assert.assertEquals(1, mHelper.numAllowed()); -+ Assert.assertTrue( -+ mHelper.isAllowed( -+ TestPagesHelperBase.TESTPAGES_RESOURCES_ROOT -+ + "subdocument_exception/subdocument.html")); -+ TestVerificationUtils.verifyGreenBackground(mHelper, "exception-target"); -+ String numFrames = -+ JavaScriptUtils.executeJavaScriptAndWaitForResult( -+ mHelper.getWebContents(), "window.frames.length;"); -+ Assert.assertEquals("1", numFrames); -+ TestVerificationUtils.verifyDisplayedCount(mHelper, 1, "iframe"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testVerifyScriptException() throws Exception { -+ mHelper.loadUrl(TestPagesHelperBase.EXCEPTION_TESTPAGES_TESTCASES_ROOT + "script"); -+ Assert.assertEquals(1, mHelper.numAllowed()); -+ Assert.assertTrue( -+ mHelper.isAllowed( -+ TestPagesHelperBase.TESTPAGES_RESOURCES_ROOT -+ + "script_exception/script.js")); -+ TestVerificationUtils.verifyGreenBackground(mHelper, "script-target"); -+ Assert.assertEquals(1, mHelper.numBlocked()); -+ Assert.assertTrue( -+ mHelper.isBlocked( -+ TestPagesHelperBase.TESTPAGES_RESOURCES_ROOT -+ + "script_exception/image.png")); -+ TestVerificationUtils.verifyHiddenCount(mHelper, 1, "img[data-expectedresult='fail']"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testVerifyStylesheetException() throws Exception { -+ final String allowedUrl = -+ TestPagesHelperBase.TESTPAGES_RESOURCES_ROOT + "stylesheet_exception/stylesheet.cs"; -+ final CountDownLatch countDownLatch = -+ mHelper.setOnAdMatchedExpectations(null, new HashSet<>(List.of(allowedUrl))); -+ mHelper.loadUrl(TestPagesHelperBase.EXCEPTION_TESTPAGES_TESTCASES_ROOT + "stylesheet"); -+ // Wait with 10 seconds max timeout -+ countDownLatch.await(10, TimeUnit.SECONDS); -+ Assert.assertEquals(1, mHelper.numAllowed()); -+ Assert.assertTrue(mHelper.isAllowed(allowedUrl)); -+ Assert.assertEquals(1, mHelper.numBlocked()); -+ Assert.assertTrue( -+ mHelper.isBlocked( -+ TestPagesHelperBase.TESTPAGES_RESOURCES_ROOT -+ + "stylesheet_exception/image.png")); -+ TestVerificationUtils.verifyHiddenCount(mHelper, 1, "img"); -+ TestVerificationUtils.verifyGreenBackground(mHelper, "exception-target"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testVerifyXHRException() throws Exception { -+ final String allowedUrl = -+ TestPagesHelperBase.TESTPAGES_RESOURCES_ROOT + "xmlhttprequest_exception/text.txt"; -+ final CountDownLatch countDownLatch = -+ mHelper.setOnAdMatchedExpectations(null, new HashSet<>(List.of(allowedUrl))); -+ mHelper.loadUrl(TestPagesHelperBase.EXCEPTION_TESTPAGES_TESTCASES_ROOT + "xmlhttprequest"); -+ // Wait with 10 seconds max timeout -+ countDownLatch.await(10, TimeUnit.SECONDS); -+ Assert.assertEquals(1, mHelper.numAllowed()); -+ Assert.assertTrue(mHelper.isAllowed(allowedUrl)); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testVerifyGenericBlockException() throws Exception { -+ mHelper.loadUrl(TestPagesHelperBase.EXCEPTION_TESTPAGES_TESTCASES_ROOT + "genericblock"); -+ Assert.assertEquals(1, mHelper.numBlocked()); -+ Assert.assertTrue( -+ mHelper.isBlocked( -+ TestPagesHelperBase.TESTPAGES_RESOURCES_ROOT -+ + "genericblock/specific.png")); -+ Assert.assertEquals(1, mHelper.numBlockedByType(ContentType.CONTENT_TYPE_IMAGE)); -+ TestVerificationUtils.verifyDisplayedCount(mHelper, 1, "img[data-expectedresult='pass']"); -+ TestVerificationUtils.verifyHiddenCount(mHelper, 1, "img[data-expectedresult='fail']"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testVerifyGenericHideException() throws Exception { -+ mHelper.loadUrl(TestPagesHelperBase.EXCEPTION_TESTPAGES_TESTCASES_ROOT + "generichide"); -+ TestVerificationUtils.verifyDisplayedCount(mHelper, 1, "div[data-expectedresult='pass']"); -+ TestVerificationUtils.verifyHiddenCount(mHelper, 1, "div[data-expectedresult='fail']"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testVerifyDocumentException() throws Exception { -+ mHelper.loadUrl(TestPagesHelperBase.EXCEPTION_TESTPAGES_TESTCASES_ROOT + "document"); -+ Assert.assertTrue( -+ mHelper.isAllowed( -+ TestPagesHelperBase.TESTPAGES_RESOURCES_ROOT + "document/image.png")); -+ Assert.assertTrue( -+ mHelper.isPageAllowed( -+ TestPagesHelperBase.EXCEPTION_TESTPAGES_TESTCASES_ROOT + "document")); -+ TestVerificationUtils.verifyDisplayedCount(mHelper, 1, "div[data-expectedresult='pass']"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testVerifyWebSocketException() throws Exception { -+ final String wssUrl = -+ String.format("wss://%s/exception_websocket", TestPagesHelperBase.TESTPAGES_DOMAIN); -+ final CountDownLatch countDownLatch = -+ mHelper.setOnAdMatchedExpectations(null, new HashSet<>(List.of(wssUrl))); -+ mHelper.loadUrl(TestPagesHelperBase.EXCEPTION_TESTPAGES_TESTCASES_ROOT + "websocket"); -+ // Wait with 10 seconds max timeout -+ countDownLatch.await(10, TimeUnit.SECONDS); -+ Assert.assertEquals(1, mHelper.numAllowedByType(ContentType.CONTENT_TYPE_WEBSOCKET)); -+ Assert.assertTrue(mHelper.isAllowed(wssUrl)); -+ } -+} -diff --git a/components/adblock/android/javatests/src/org/chromium/components/adblock/TestPagesFilterTestBase.java b/components/adblock/android/javatests/src/org/chromium/components/adblock/TestPagesFilterTestBase.java -new file mode 100644 ---- /dev/null -+++ b/components/adblock/android/javatests/src/org/chromium/components/adblock/TestPagesFilterTestBase.java -@@ -0,0 +1,277 @@ -+/* -+ * This file is part of eyeo Chromium SDK, -+ * Copyright (C) 2006-present eyeo GmbH -+ * -+ * eyeo Chromium SDK is free software: you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 3 as -+ * published by the Free Software Foundation. -+ * -+ * eyeo Chromium SDK is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with eyeo Chromium SDK. If not, see . -+ */ -+ -+package org.chromium.components.adblock; -+ -+import androidx.test.filters.LargeTest; -+ -+import org.junit.Assert; -+import org.junit.Test; -+ -+import org.chromium.base.test.util.DisabledTest; -+import org.chromium.base.test.util.Feature; -+import org.chromium.content_public.browser.test.util.DOMUtils; -+import org.chromium.content_public.browser.test.util.JavaScriptUtils; -+ -+import java.util.Arrays; -+import java.util.HashSet; -+import java.util.List; -+import java.util.concurrent.CountDownLatch; -+import java.util.concurrent.TimeUnit; -+ -+public abstract class TestPagesFilterTestBase { -+ private TestPagesHelperBase mHelper; -+ -+ protected void setUp(TestPagesHelperBase helper) { -+ mHelper = helper; -+ mHelper.addFilterList(TestPagesHelperBase.TESTPAGES_SUBSCRIPTION); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testBlockingFilters() throws Exception { -+ final CountDownLatch countDownLatch = -+ mHelper.setOnAdMatchedExpectations( -+ new HashSet<>( -+ Arrays.asList( -+ TestPagesHelperBase.TESTPAGES_RESOURCES_ROOT -+ + "blocking/full-path.png", -+ TestPagesHelperBase.TESTPAGES_RESOURCES_ROOT -+ + "blocking/partial-path/partial-path.png", -+ TestPagesHelperBase.TESTPAGES_RESOURCES_ROOT -+ + "blocking/wildcard/1/wildcard.png", -+ TestPagesHelperBase.TESTPAGES_RESOURCES_ROOT -+ + "blocking/wildcard/2/wildcard.png", -+ TestPagesHelperBase.TESTPAGES_RESOURCES_ROOT -+ + "blocking/dynamic.png", -+ TestPagesHelperBase.TESTPAGES_RESOURCES_ROOT -+ + "blocking/subdomain.png")), -+ null); -+ mHelper.loadUrl(TestPagesHelperBase.FILTER_TESTPAGES_TESTCASES_ROOT + "blocking"); -+ // Wait with 10 seconds max timeout -+ countDownLatch.await(10, TimeUnit.SECONDS); -+ Assert.assertEquals(6, mHelper.numBlocked()); -+ Assert.assertEquals(6, mHelper.numBlockedByType(ContentType.CONTENT_TYPE_IMAGE)); -+ TestVerificationUtils.verifyHiddenCount(mHelper, 6, "img[data-expectedresult='fail']"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testVerifyScriptFilters() throws Exception { -+ mHelper.loadUrl(TestPagesHelperBase.FILTER_TESTPAGES_TESTCASES_ROOT + "script"); -+ Assert.assertEquals(1, mHelper.numBlocked()); -+ Assert.assertEquals(1, mHelper.numBlockedByType(ContentType.CONTENT_TYPE_SCRIPT)); -+ Assert.assertTrue( -+ mHelper.isBlocked( -+ TestPagesHelperBase.TESTPAGES_RESOURCES_ROOT + "script/script.js")); -+ -+ String childCount = -+ JavaScriptUtils.executeJavaScriptAndWaitForResult( -+ mHelper.getWebContents(), -+ "document.getElementById(\"script-target\").childElementCount"); -+ Assert.assertEquals("1", childCount); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testVerifyImageFilters() throws Exception { -+ final CountDownLatch countDownLatch = -+ mHelper.setOnAdMatchedExpectations( -+ new HashSet<>( -+ Arrays.asList( -+ TestPagesHelperBase.TESTPAGES_RESOURCES_ROOT -+ + "image/static/static.png", -+ TestPagesHelperBase.TESTPAGES_RESOURCES_ROOT -+ + "image/dynamic/dynamic.png")), -+ null); -+ mHelper.loadUrl(TestPagesHelperBase.FILTER_TESTPAGES_TESTCASES_ROOT + "image"); -+ countDownLatch.await(10, TimeUnit.SECONDS); -+ Assert.assertEquals(2, mHelper.numBlocked()); -+ Assert.assertEquals(2, mHelper.numBlockedByType(ContentType.CONTENT_TYPE_IMAGE)); -+ Assert.assertTrue( -+ mHelper.isBlocked( -+ TestPagesHelperBase.TESTPAGES_RESOURCES_ROOT + "image/static/static.png")); -+ Assert.assertTrue( -+ mHelper.isBlocked( -+ TestPagesHelperBase.TESTPAGES_RESOURCES_ROOT -+ + "image/dynamic/dynamic.png")); -+ TestVerificationUtils.verifyHiddenCount(mHelper, 2, "img[data-expectedresult='fail']"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testVerifyStylesheetFilters() throws Exception { -+ final String blockedUrl = -+ TestPagesHelperBase.TESTPAGES_RESOURCES_ROOT + "stylesheet/stylesheet.cs"; -+ final CountDownLatch countDownLatch = -+ mHelper.setOnAdMatchedExpectations(new HashSet<>(List.of(blockedUrl)), null); -+ mHelper.loadUrl(TestPagesHelperBase.FILTER_TESTPAGES_TESTCASES_ROOT + "stylesheet"); -+ // Wait with 10 seconds max timeout -+ countDownLatch.await(10, TimeUnit.SECONDS); -+ Assert.assertEquals(1, mHelper.numBlocked()); -+ Assert.assertEquals(1, mHelper.numBlockedByType(ContentType.CONTENT_TYPE_STYLESHEET)); -+ Assert.assertTrue(mHelper.isBlocked(blockedUrl)); -+ String value = DOMUtils.getNodeContents(mHelper.getWebContents(), "stylesheet-target"); -+ Assert.assertEquals("Passed. Stylesheet was blocked.", value); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testVerifyXHRFilters() throws Exception { -+ final String blockedUrl = -+ TestPagesHelperBase.TESTPAGES_RESOURCES_ROOT + "xmlhttprequest/text.txt"; -+ final CountDownLatch countDownLatch = -+ mHelper.setOnAdMatchedExpectations(new HashSet<>(List.of(blockedUrl)), null); -+ mHelper.loadUrl(TestPagesHelperBase.FILTER_TESTPAGES_TESTCASES_ROOT + "xmlhttprequest"); -+ // Wait with 10 seconds max timeout -+ countDownLatch.await(10, TimeUnit.SECONDS); -+ Assert.assertEquals(1, mHelper.numBlocked()); -+ Assert.assertEquals(1, mHelper.numBlockedByType(ContentType.CONTENT_TYPE_XMLHTTPREQUEST)); -+ Assert.assertTrue(mHelper.isBlocked(blockedUrl)); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testVerifySubdocumentFilters() throws Exception { -+ mHelper.loadUrl(TestPagesHelperBase.FILTER_TESTPAGES_TESTCASES_ROOT + "subdocument"); -+ Assert.assertEquals(1, mHelper.numBlocked()); -+ Assert.assertEquals(1, mHelper.numBlockedByType(ContentType.CONTENT_TYPE_SUBDOCUMENT)); -+ Assert.assertTrue( -+ mHelper.isBlocked( -+ TestPagesHelperBase.TESTPAGES_RESOURCES_ROOT -+ + "subdocument/subdocument.html")); -+ // Do not search for iframe within the site's iframes. -+ TestVerificationUtils.verifyHiddenCount( -+ mHelper, -+ 1, -+ "iframe[data-expectedresult='fail']", -+ TestVerificationUtils.IncludeSubframes.NO); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ @DisabledTest(message = "Please enable again when rewrite filters will be supported") -+ public void testVerifyRewrite() throws Exception { -+ mHelper.loadUrl(TestPagesHelperBase.FILTER_TESTPAGES_TESTCASES_ROOT + "rewrite"); -+ Assert.assertEquals(3, mHelper.numBlocked()); -+ Assert.assertEquals(1, mHelper.numBlockedByType(ContentType.CONTENT_TYPE_SCRIPT)); -+ Assert.assertEquals(2, mHelper.numBlockedByType(ContentType.CONTENT_TYPE_MEDIA)); -+ Assert.assertTrue( -+ mHelper.isBlocked( -+ TestPagesHelperBase.TESTPAGES_RESOURCES_ROOT + "rewrite/audio.mp3")); -+ Assert.assertTrue( -+ mHelper.isBlocked( -+ TestPagesHelperBase.TESTPAGES_RESOURCES_ROOT + "rewrite/video.mp4")); -+ Assert.assertTrue( -+ mHelper.isBlocked( -+ TestPagesHelperBase.TESTPAGES_RESOURCES_ROOT + "rewrite/script.js")); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testVerifyMatchCaseFilter() throws Exception { -+ mHelper.loadUrl(TestPagesHelperBase.FILTER_TESTPAGES_TESTCASES_ROOT + "match-case"); -+ Assert.assertEquals(2, mHelper.numBlocked()); -+ Assert.assertEquals(2, mHelper.numBlockedByType(ContentType.CONTENT_TYPE_IMAGE)); -+ TestVerificationUtils.verifyHiddenCount(mHelper, 2, "img[data-expectedresult='fail']"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testVerifyThirdPartyFilter() throws Exception { -+ mHelper.loadUrl(TestPagesHelperBase.FILTER_TESTPAGES_TESTCASES_ROOT + "third-party"); -+ Assert.assertEquals(2, mHelper.numBlocked()); -+ Assert.assertEquals(2, mHelper.numBlockedByType(ContentType.CONTENT_TYPE_IMAGE)); -+ TestVerificationUtils.verifyHiddenCount(mHelper, 2, "img[data-expectedresult='fail']"); -+ TestVerificationUtils.verifyDisplayedCount(mHelper, 2, "img[data-expectedresult='pass']"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testVerifyOtherFilter() throws Exception { -+ mHelper.loadUrl(TestPagesHelperBase.FILTER_TESTPAGES_TESTCASES_ROOT + "other"); -+ Assert.assertEquals(1, mHelper.numBlocked()); -+ Assert.assertEquals(1, mHelper.numBlockedByType(ContentType.CONTENT_TYPE_OTHER)); -+ Assert.assertTrue( -+ mHelper.isBlocked( -+ TestPagesHelperBase.TESTPAGES_RESOURCES_ROOT + "other/image.png")); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testVerifyDomainFilter() throws Exception { -+ mHelper.loadUrl(TestPagesHelperBase.FILTER_TESTPAGES_TESTCASES_ROOT + "domain"); -+ Assert.assertEquals(2, mHelper.numBlocked()); -+ Assert.assertEquals(2, mHelper.numBlockedByType(ContentType.CONTENT_TYPE_IMAGE)); -+ Assert.assertTrue( -+ mHelper.isBlocked( -+ TestPagesHelperBase.TESTPAGES_RESOURCES_ROOT -+ + "domain/static/target/image.png")); -+ Assert.assertTrue( -+ mHelper.isBlocked( -+ TestPagesHelperBase.TESTPAGES_RESOURCES_ROOT + "domain/dynamic/image.png")); -+ TestVerificationUtils.verifyHiddenCount(mHelper, 2, "img[data-expectedresult='fail']"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testVerifyPingFilter() throws Exception { -+ mHelper.loadUrl(TestPagesHelperBase.FILTER_TESTPAGES_TESTCASES_ROOT + "ping"); -+ // Ping action not yet triggered -+ Assert.assertEquals(0, mHelper.numBlocked()); -+ final CountDownLatch countDownLatch = new CountDownLatch(1); -+ mHelper.setOnAdMatchedLatch(countDownLatch); -+ // Trigger ping action -+ JavaScriptUtils.executeJavaScriptAndWaitForResult( -+ mHelper.getWebContents(), -+ "document.getElementById(\"script-ping-trigger\").click()"); -+ // Wait with 10 seconds max timeout -+ countDownLatch.await(10, TimeUnit.SECONDS); -+ Assert.assertEquals(1, mHelper.numBlocked()); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testVerifyPingFilterException() throws Exception { -+ mHelper.loadUrl(TestPagesHelperBase.EXCEPTION_TESTPAGES_TESTCASES_ROOT + "ping"); -+ // Ping action not yet triggered -+ Assert.assertEquals(0, mHelper.numAllowed()); -+ final CountDownLatch countDownLatch = new CountDownLatch(1); -+ mHelper.setOnAdMatchedLatch(countDownLatch); -+ // Trigger ping action -+ JavaScriptUtils.executeJavaScriptAndWaitForResult( -+ mHelper.getWebContents(), -+ "document.getElementsByClassName(\"testcase-trigger\")[0].click()"); -+ // Wait with 10 seconds max timeout -+ countDownLatch.await(10, TimeUnit.SECONDS); -+ Assert.assertEquals(1, mHelper.numAllowed()); -+ Assert.assertEquals(0, mHelper.numBlocked()); -+ } -+} -diff --git a/components/adblock/android/javatests/src/org/chromium/components/adblock/TestPagesHeaderFilterTestBase.java b/components/adblock/android/javatests/src/org/chromium/components/adblock/TestPagesHeaderFilterTestBase.java -new file mode 100644 ---- /dev/null -+++ b/components/adblock/android/javatests/src/org/chromium/components/adblock/TestPagesHeaderFilterTestBase.java -@@ -0,0 +1,102 @@ -+/* -+ * This file is part of eyeo Chromium SDK, -+ * Copyright (C) 2006-present eyeo GmbH -+ * -+ * eyeo Chromium SDK is free software: you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 3 as -+ * published by the Free Software Foundation. -+ * -+ * eyeo Chromium SDK is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with eyeo Chromium SDK. If not, see . -+ */ -+ -+package org.chromium.components.adblock; -+ -+import androidx.test.filters.LargeTest; -+ -+import org.junit.Assert; -+import org.junit.Test; -+ -+import org.chromium.base.test.util.Feature; -+ -+public abstract class TestPagesHeaderFilterTestBase { -+ public static final String HEADER_TESTPAGES_URL = -+ TestPagesHelperBase.FILTER_TESTPAGES_TESTCASES_ROOT + "header"; -+ public static final String HEADER_EXCEPTIONS_TESTPAGES_URL = -+ TestPagesHelperBase.EXCEPTION_TESTPAGES_TESTCASES_ROOT + "header"; -+ private TestPagesHelperBase mHelper; -+ -+ protected void setUp(TestPagesHelperBase helper) { -+ mHelper = helper; -+ mHelper.addFilterList(TestPagesHelperBase.TESTPAGES_SUBSCRIPTION); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testHeaderFilterScript() throws Exception { -+ mHelper.loadUrl(HEADER_TESTPAGES_URL); -+ Assert.assertEquals(1, mHelper.numBlockedByType(ContentType.CONTENT_TYPE_SCRIPT)); -+ Assert.assertTrue( -+ mHelper.isBlocked( -+ String.format( -+ "https://%s/testfiles/header/script.js", -+ TestPagesHelperBase.TESTPAGES_DOMAIN))); -+ TestVerificationUtils.verifyDisplayedCount( -+ mHelper, 0, "div#functionproperty-target > div[data-expectedresult='fail']"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testHeaderFilterImagePlusImageAndComma() throws Exception { -+ mHelper.loadUrl(HEADER_TESTPAGES_URL); -+ Assert.assertEquals(2, mHelper.numBlockedByType(ContentType.CONTENT_TYPE_IMAGE)); -+ Assert.assertTrue( -+ mHelper.isBlocked( -+ String.format( -+ "https://%s/testfiles/header/image.png", -+ TestPagesHelperBase.TESTPAGES_DOMAIN))); -+ TestVerificationUtils.verifyDisplayedCount(mHelper, 0, "img[id='image-fail-1']"); -+ Assert.assertTrue( -+ mHelper.isBlocked( -+ String.format( -+ "https://%s/testfiles/header/image2.png", -+ TestPagesHelperBase.TESTPAGES_DOMAIN))); -+ TestVerificationUtils.verifyDisplayedCount(mHelper, 0, "img[id='comma-fail-1']"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testHeaderFilterStylesheet() throws Exception { -+ mHelper.loadUrl(HEADER_TESTPAGES_URL); -+ Assert.assertEquals(1, mHelper.numBlockedByType(ContentType.CONTENT_TYPE_STYLESHEET)); -+ Assert.assertTrue( -+ mHelper.isBlocked( -+ String.format( -+ "https://%s/testfiles/header/stylesheet.css", -+ TestPagesHelperBase.TESTPAGES_DOMAIN))); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testHeaderFilterException() throws Exception { -+ mHelper.loadUrl(HEADER_EXCEPTIONS_TESTPAGES_URL); -+ Assert.assertEquals(1, mHelper.numAllowed()); -+ Assert.assertEquals(1, mHelper.numAllowedByType(ContentType.CONTENT_TYPE_IMAGE)); -+ Assert.assertTrue( -+ mHelper.isAllowed( -+ String.format( -+ "https://%s/testfiles/header_exception/image.png", -+ TestPagesHelperBase.TESTPAGES_DOMAIN))); -+ TestVerificationUtils.verifyDisplayedCount( -+ mHelper, 1, "img[id='image-header-exception-pass-1']"); -+ } -+} -diff --git a/components/adblock/android/javatests/src/org/chromium/components/adblock/TestPagesHelperBase.java b/components/adblock/android/javatests/src/org/chromium/components/adblock/TestPagesHelperBase.java -new file mode 100644 ---- /dev/null -+++ b/components/adblock/android/javatests/src/org/chromium/components/adblock/TestPagesHelperBase.java -@@ -0,0 +1,230 @@ -+/* -+ * This file is part of eyeo Chromium SDK, -+ * Copyright (C) 2006-present eyeo GmbH -+ * -+ * eyeo Chromium SDK is free software: you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 3 as -+ * published by the Free Software Foundation. -+ * -+ * eyeo Chromium SDK is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with eyeo Chromium SDK. If not, see . -+ */ -+ -+package org.chromium.components.adblock; -+ -+import org.junit.Assert; -+ -+import org.chromium.base.Log; -+import org.chromium.base.ThreadUtils; -+import org.chromium.base.test.util.CallbackHelper; -+import org.chromium.content_public.browser.BrowserContextHandle; -+import org.chromium.content_public.browser.WebContents; -+ -+import java.net.MalformedURLException; -+import java.net.URL; -+import java.util.Set; -+import java.util.concurrent.CountDownLatch; -+import java.util.concurrent.TimeUnit; -+import java.util.concurrent.TimeoutException; -+ -+public abstract class TestPagesHelperBase -+ implements FilteringConfiguration.ConfigurationChangeObserver { -+ public static final String TESTPAGES_DOMAIN = "abptestpages.org"; -+ public static final String TESTPAGES_BASE_URL = "https://" + TESTPAGES_DOMAIN; -+ public static final String TESTPAGES_TESTCASES_ROOT = TESTPAGES_BASE_URL + "/en/"; -+ public static final String FILTER_TESTPAGES_TESTCASES_ROOT = -+ TESTPAGES_TESTCASES_ROOT + "filters/"; -+ public static final String EXCEPTION_TESTPAGES_TESTCASES_ROOT = -+ TESTPAGES_TESTCASES_ROOT + "exceptions/"; -+ public static final String CIRCUMVENTION_TESTPAGES_TESTCASES_ROOT = -+ TESTPAGES_TESTCASES_ROOT + "circumvention/"; -+ public static final String SITEKEY_TESTPAGES_TESTCASES_ROOT = -+ EXCEPTION_TESTPAGES_TESTCASES_ROOT + "sitekey_mv2"; -+ public static final String SNIPPETS_TESTPAGES_TESTCASES_ROOT = -+ TESTPAGES_TESTCASES_ROOT + "snippets/"; -+ public static final String TESTPAGES_RESOURCES_ROOT = TESTPAGES_BASE_URL + "/testfiles/"; -+ public static final String TESTPAGES_SUBSCRIPTION = -+ TESTPAGES_TESTCASES_ROOT + "abp-testcase-subscription.txt"; -+ public static final int TEST_TIMEOUT_SEC = 30; -+ -+ private FilteringConfiguration mAdblockFilteringConfiguration; -+ private ResourceClassificationNotifier mResourceClassificationNotifier; -+ -+ private URL mTestSubscriptionUrl; -+ private final CallbackHelper mHelper = new CallbackHelper(); -+ private final TestResourceFilteringObserver mObserver = new TestResourceFilteringObserver(); -+ private final TestSubscriptionUpdatedObserver mSubscriptionUpdateObserver = -+ new TestSubscriptionUpdatedObserver(); -+ -+ private class TestSubscriptionUpdatedObserver -+ implements FilteringConfiguration.SubscriptionUpdateObserver { -+ @Override -+ public void onSubscriptionDownloaded(final URL url) { -+ if (mTestSubscriptionUrl == null) return; -+ if (url.toString().contains(mTestSubscriptionUrl.toString())) { -+ Log.d( -+ "TestSubscriptionUpdatedObserver", -+ "Notify subscription updated: " + url.toString()); -+ mHelper.notifyCalled(); -+ } -+ } -+ } -+ -+ public void setUp() { -+ ThreadUtils.runOnUiThreadBlocking( -+ () -> { -+ mResourceClassificationNotifier = -+ ResourceClassificationNotifier.getInstance(getBrowserContext()); -+ mResourceClassificationNotifier.addResourceFilteringObserver(mObserver); -+ // Remove "adblock" configuration to simply drop all default filter lists -+ FilteringConfiguration.removeConfiguration("adblock", getBrowserContext()); -+ mAdblockFilteringConfiguration = -+ FilteringConfiguration.createConfiguration( -+ "adblock", getBrowserContext()); -+ Assert.assertEquals(0, mAdblockFilteringConfiguration.getFilterLists().size()); -+ mAdblockFilteringConfiguration.addObserver(this); -+ mAdblockFilteringConfiguration.addSubscriptionUpdateObserver( -+ mSubscriptionUpdateObserver); -+ }); -+ } -+ -+ @Override -+ public void onEnabledStateChanged() {} -+ -+ @Override -+ public void onFilterListsChanged() {} -+ -+ @Override -+ public void onAllowedDomainsChanged() {} -+ -+ @Override -+ public void onCustomFiltersChanged() { -+ mHelper.notifyCalled(); -+ } -+ -+ public void addFilterList(final String filterListUrl) { -+ mTestSubscriptionUrl = null; -+ try { -+ mTestSubscriptionUrl = new URL(filterListUrl); -+ mObserver.setExpectedSubscriptionUrl(mTestSubscriptionUrl); -+ } catch (MalformedURLException ignored) { -+ } -+ Assert.assertNotNull("Test subscription url", mTestSubscriptionUrl); -+ ThreadUtils.runOnUiThreadBlocking( -+ () -> { -+ mAdblockFilteringConfiguration.addFilterList(mTestSubscriptionUrl); -+ }); -+ try { -+ mHelper.waitForCallback(0, 1, TEST_TIMEOUT_SEC, TimeUnit.SECONDS); -+ } catch (TimeoutException e) { -+ Assert.assertEquals( -+ "Test subscription was properly added", "Failed to add test subscription"); -+ } -+ } -+ -+ public void addCustomFilter(final String filter) { -+ ThreadUtils.runOnUiThreadBlocking( -+ () -> { -+ mAdblockFilteringConfiguration.addCustomFilter(filter); -+ }); -+ try { -+ mHelper.waitForCallback(0, 1, TEST_TIMEOUT_SEC, TimeUnit.SECONDS); -+ } catch (TimeoutException e) { -+ Assert.assertEquals( -+ "Test custom filter was properly added", "Failed to add test custom filter"); -+ } -+ } -+ -+ public void tearDown() { -+ ThreadUtils.runOnUiThreadBlocking( -+ () -> { -+ if (mAdblockFilteringConfiguration != null) { -+ mAdblockFilteringConfiguration.removeSubscriptionUpdateObserver( -+ mSubscriptionUpdateObserver); -+ mAdblockFilteringConfiguration.removeObserver(this); -+ } -+ if (mResourceClassificationNotifier != null) { -+ mResourceClassificationNotifier.removeResourceFilteringObserver(mObserver); -+ } -+ }); -+ } -+ -+ // Note: Use either setOnAdMatchedLatch XOR setOnAdMatchedExpectations -+ public void setOnAdMatchedLatch(final CountDownLatch countDownLatch) { -+ Assert.assertTrue( -+ mObserver.countDownLatch == null || mObserver.countDownLatch.getCount() == 0); -+ mObserver.countDownLatch = countDownLatch; -+ } -+ -+ // Note: Use either setOnAdMatchedLatch XOR setOnAdMatchedExpectations -+ public CountDownLatch setOnAdMatchedExpectations( -+ final Set onBlocked, final Set onAllowed) { -+ Assert.assertTrue( -+ mObserver.countDownLatch == null || mObserver.countDownLatch.getCount() == 0); -+ mObserver.countDownLatch = new CountDownLatch(1); -+ mObserver.expectedBlocked = onBlocked; -+ mObserver.expectedAllowed = onAllowed; -+ return mObserver.countDownLatch; -+ } -+ -+ public boolean isBlocked(final String url) { -+ return mObserver.isBlocked(url); -+ } -+ -+ public boolean isPopupBlocked(final String url) { -+ return mObserver.isPopupBlocked(url); -+ } -+ -+ public int numBlockedByType(final ContentType type) { -+ return mObserver.numBlockedByType(type); -+ } -+ -+ public int numBlockedPopups() { -+ return mObserver.numBlockedPopups(); -+ } -+ -+ public int numAllowedByType(final ContentType type) { -+ return mObserver.numAllowedByType(type); -+ } -+ -+ public int numAllowedPopups() { -+ return mObserver.numAllowedPopups(); -+ } -+ -+ public boolean isAllowed(final String url) { -+ return mObserver.isAllowed(url); -+ } -+ -+ public boolean isPageAllowed(final String url) { -+ return mObserver.isPageAllowed(url); -+ } -+ -+ public boolean isPopupAllowed(final String url) { -+ return mObserver.isPopupAllowed(url); -+ } -+ -+ public void loadUrlWaitForContent(final String url) throws Exception { -+ loadUrl(url); -+ TestVerificationUtils.verifyCondition( -+ this, "document.getElementsByClassName('testcase-waiting-content').length == 0"); -+ } -+ -+ public abstract void loadUrl(final String url) throws Exception; -+ -+ public abstract BrowserContextHandle getBrowserContext(); -+ -+ public abstract WebContents getWebContents(); -+ -+ public int numBlocked() { -+ return mObserver.blockedInfos.size(); -+ } -+ -+ public int numAllowed() { -+ return mObserver.allowedInfos.size(); -+ } -+} -diff --git a/components/adblock/android/javatests/src/org/chromium/components/adblock/TestPagesInlineCssTestBase.java b/components/adblock/android/javatests/src/org/chromium/components/adblock/TestPagesInlineCssTestBase.java -new file mode 100644 ---- /dev/null -+++ b/components/adblock/android/javatests/src/org/chromium/components/adblock/TestPagesInlineCssTestBase.java -@@ -0,0 +1,94 @@ -+/* -+ * This file is part of eyeo Chromium SDK, -+ * Copyright (C) 2006-present eyeo GmbH -+ * -+ * eyeo Chromium SDK is free software: you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 3 as -+ * published by the Free Software Foundation. -+ * -+ * eyeo Chromium SDK is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with eyeo Chromium SDK. If not, see . -+ */ -+ -+package org.chromium.components.adblock; -+ -+import androidx.test.filters.LargeTest; -+ -+import org.junit.Test; -+ -+import org.chromium.base.test.util.Feature; -+ -+import java.util.concurrent.TimeoutException; -+ -+public abstract class TestPagesInlineCssTestBase { -+ public static final String INLINE_CSS_TESTPAGES_URL = -+ TestPagesHelperBase.FILTER_TESTPAGES_TESTCASES_ROOT + "inline-css"; -+ private TestPagesHelperBase mHelper; -+ -+ protected void setUp(TestPagesHelperBase helper) { -+ mHelper = helper; -+ } -+ -+ private void verifyIsRed(final String elemId) throws TimeoutException { -+ TestVerificationUtils.expectResourceStyleProperty( -+ mHelper, elemId, "backgroundColor", "rgb(199, 13, 44)"); -+ } -+ -+ private void verifyIsGreen(final String elemId) throws TimeoutException { -+ TestVerificationUtils.expectResourceStyleProperty( -+ mHelper, elemId, "backgroundColor", "rgb(13, 199, 75)"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testInlineCssWithEhSelector() throws Exception { -+ final String elemId = "inline-css-id"; -+ mHelper.loadUrl(INLINE_CSS_TESTPAGES_URL); -+ verifyIsRed(elemId); -+ mHelper.addFilterList(TestPagesHelperBase.TESTPAGES_SUBSCRIPTION); -+ mHelper.loadUrl(INLINE_CSS_TESTPAGES_URL); -+ verifyIsGreen(elemId); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testInlineCssWithEheSelector() throws Exception { -+ final String elemId = "basic-abp-properties-usage-with-inline-css-fail-1"; -+ mHelper.loadUrl(INLINE_CSS_TESTPAGES_URL + "-extended"); -+ verifyIsRed(elemId); -+ mHelper.addFilterList(TestPagesHelperBase.TESTPAGES_SUBSCRIPTION); -+ mHelper.loadUrl(INLINE_CSS_TESTPAGES_URL + "-extended"); -+ verifyIsGreen(elemId); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testInlineCssWithEheSelectorInversion() throws Exception { -+ final String elemId = "basic-not-abp-properties-usage-with-inline-css-fail"; -+ mHelper.loadUrl(INLINE_CSS_TESTPAGES_URL + "-extended-inversion"); -+ verifyIsRed(elemId); -+ mHelper.addFilterList(TestPagesHelperBase.TESTPAGES_SUBSCRIPTION); -+ mHelper.loadUrl(INLINE_CSS_TESTPAGES_URL + "-extended-inversion"); -+ verifyIsGreen(elemId); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testInlineCssOnDOMMutation() throws Exception { -+ final String elemId = "span-inline-css"; -+ mHelper.loadUrlWaitForContent(INLINE_CSS_TESTPAGES_URL + "-on-DOM-mutation"); -+ verifyIsRed(elemId); -+ mHelper.addFilterList(TestPagesHelperBase.TESTPAGES_SUBSCRIPTION); -+ mHelper.loadUrlWaitForContent(INLINE_CSS_TESTPAGES_URL + "-on-DOM-mutation"); -+ verifyIsGreen(elemId); -+ } -+} -diff --git a/components/adblock/android/javatests/src/org/chromium/components/adblock/TestPagesRemoveTestBase.java b/components/adblock/android/javatests/src/org/chromium/components/adblock/TestPagesRemoveTestBase.java -new file mode 100644 ---- /dev/null -+++ b/components/adblock/android/javatests/src/org/chromium/components/adblock/TestPagesRemoveTestBase.java -@@ -0,0 +1,94 @@ -+/* -+ * This file is part of eyeo Chromium SDK, -+ * Copyright (C) 2006-present eyeo GmbH -+ * -+ * eyeo Chromium SDK is free software: you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 3 as -+ * published by the Free Software Foundation. -+ * -+ * eyeo Chromium SDK is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with eyeo Chromium SDK. If not, see . -+ */ -+ -+package org.chromium.components.adblock; -+ -+import androidx.test.filters.LargeTest; -+ -+import org.junit.Test; -+ -+import org.chromium.base.test.util.Feature; -+ -+import java.util.concurrent.TimeoutException; -+ -+public abstract class TestPagesRemoveTestBase { -+ public static final String REMOVE_TESTPAGES_URL = -+ TestPagesHelperBase.FILTER_TESTPAGES_TESTCASES_ROOT + "remove"; -+ private TestPagesHelperBase mHelper; -+ -+ protected void setUp(TestPagesHelperBase helper) { -+ mHelper = helper; -+ } -+ -+ private void verifyResourcePresent(final String elemId) throws TimeoutException { -+ TestVerificationUtils.verifyCondition( -+ mHelper, "document.getElementById('" + elemId + "') != null"); -+ } -+ -+ private void verifyResourceRemoved(final String elemId) throws TimeoutException { -+ TestVerificationUtils.verifyCondition( -+ mHelper, "document.getElementById('" + elemId + "') == null"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testRemoveWithEhSelector() throws Exception { -+ final String elemId = "remove-id"; -+ mHelper.loadUrl(REMOVE_TESTPAGES_URL); -+ verifyResourcePresent(elemId); -+ mHelper.addFilterList(TestPagesHelperBase.TESTPAGES_SUBSCRIPTION); -+ mHelper.loadUrl(REMOVE_TESTPAGES_URL); -+ verifyResourceRemoved(elemId); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testRemoveWithEheSelector() throws Exception { -+ final String elemId = "basic-abp-properties-usage-with-remove-fail-1"; -+ mHelper.loadUrl(REMOVE_TESTPAGES_URL + "-extended"); -+ verifyResourcePresent(elemId); -+ mHelper.addFilterList(TestPagesHelperBase.TESTPAGES_SUBSCRIPTION); -+ mHelper.loadUrl(REMOVE_TESTPAGES_URL + "-extended"); -+ verifyResourceRemoved(elemId); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testRemoveWithEheSelectorInversion() throws Exception { -+ final String elemId = "basic-not-abp-properties-usage-with-remove-fail"; -+ mHelper.loadUrl(REMOVE_TESTPAGES_URL + "-extended-inversion"); -+ verifyResourcePresent(elemId); -+ mHelper.addFilterList(TestPagesHelperBase.TESTPAGES_SUBSCRIPTION); -+ mHelper.loadUrl(REMOVE_TESTPAGES_URL + "-extended-inversion"); -+ verifyResourceRemoved(elemId); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testRemoveOnDOMMutation() throws Exception { -+ final String elemId = "input-remove"; -+ mHelper.loadUrlWaitForContent(REMOVE_TESTPAGES_URL + "-on-DOM-mutation"); -+ verifyResourcePresent(elemId); -+ mHelper.addFilterList(TestPagesHelperBase.TESTPAGES_SUBSCRIPTION); -+ mHelper.loadUrlWaitForContent(REMOVE_TESTPAGES_URL + "-on-DOM-mutation"); -+ verifyResourceRemoved(elemId); -+ } -+} -diff --git a/components/adblock/android/javatests/src/org/chromium/components/adblock/TestPagesRewriteTestBase.java b/components/adblock/android/javatests/src/org/chromium/components/adblock/TestPagesRewriteTestBase.java -new file mode 100644 ---- /dev/null -+++ b/components/adblock/android/javatests/src/org/chromium/components/adblock/TestPagesRewriteTestBase.java -@@ -0,0 +1,175 @@ -+/* -+ * This file is part of eyeo Chromium SDK, -+ * Copyright (C) 2006-present eyeo GmbH -+ * -+ * eyeo Chromium SDK is free software: you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 3 as -+ * published by the Free Software Foundation. -+ * -+ * eyeo Chromium SDK is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with eyeo Chromium SDK. If not, see . -+ */ -+ -+package org.chromium.components.adblock; -+ -+import androidx.test.filters.LargeTest; -+ -+import org.junit.Test; -+ -+import org.chromium.base.test.util.Feature; -+ -+public abstract class TestPagesRewriteTestBase { -+ public static final String REWRITE_TEST_URL = -+ TestPagesHelperBase.FILTER_TESTPAGES_TESTCASES_ROOT + "rewrite"; -+ private TestPagesHelperBase mHelper; -+ -+ protected void setUp(TestPagesHelperBase helper) { -+ mHelper = helper; -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testRewriteScript() throws Exception { -+ mHelper.addCustomFilter( -+ String.format( -+ "||%s/testfiles/rewrite/*.js$rewrite=abp-resource:blank-js,domain=%s", -+ TestPagesHelperBase.TESTPAGES_DOMAIN, -+ TestPagesHelperBase.TESTPAGES_DOMAIN)); -+ mHelper.loadUrl(REWRITE_TEST_URL); -+ TestVerificationUtils.verifyDisplayedCount(mHelper, 0, "div[id='script-fail-1']"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testRewriteStylesheet() throws Exception { -+ mHelper.addCustomFilter( -+ String.format( -+ "||%s/testfiles/rewrite/*.css$rewrite=abp-resource:blank-css,domain=%s", -+ TestPagesHelperBase.TESTPAGES_DOMAIN, -+ TestPagesHelperBase.TESTPAGES_DOMAIN)); -+ mHelper.loadUrl(REWRITE_TEST_URL); -+ TestVerificationUtils.verifyGreenBackground(mHelper, "stylesheet-target"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testRewriteSubdocument() throws Exception { -+ mHelper.addCustomFilter( -+ String.format( -+ "||%s/testfiles/rewrite/*.html$rewrite=abp-resource:blank-html,domain=%s", -+ TestPagesHelperBase.TESTPAGES_DOMAIN, -+ TestPagesHelperBase.TESTPAGES_DOMAIN)); -+ mHelper.loadUrl(REWRITE_TEST_URL); -+ TestVerificationUtils.verifySelfTestPass(mHelper, "subdocument-target"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testRewriteText() throws Exception { -+ mHelper.addCustomFilter( -+ String.format( -+ "||%s/testfiles/rewrite/*.txt$rewrite=abp-resource:blank-text,domain=%s", -+ TestPagesHelperBase.TESTPAGES_DOMAIN, -+ TestPagesHelperBase.TESTPAGES_DOMAIN)); -+ mHelper.loadUrl(REWRITE_TEST_URL); -+ TestVerificationUtils.verifySelfTestPass(mHelper, "text-status"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testRewriteGif() throws Exception { -+ mHelper.addCustomFilter( -+ String.format( -+ "||%s/testfiles/rewrite/1x1.gif$rewrite=abp-resource:1x1-transparent-gif,domain=%s", -+ TestPagesHelperBase.TESTPAGES_DOMAIN, -+ TestPagesHelperBase.TESTPAGES_DOMAIN)); -+ mHelper.loadUrl(REWRITE_TEST_URL); -+ TestVerificationUtils.verifySelfTestPass(mHelper, "1x1-target"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testRewrite2x2Png() throws Exception { -+ mHelper.addCustomFilter( -+ String.format( -+ "||%s/testfiles/rewrite/2x2.png$rewrite=abp-resource:2x2-transparent-png,domain=%s", -+ TestPagesHelperBase.TESTPAGES_DOMAIN, -+ TestPagesHelperBase.TESTPAGES_DOMAIN)); -+ mHelper.loadUrl(REWRITE_TEST_URL); -+ TestVerificationUtils.verifySelfTestPass(mHelper, "2x2-target"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testRewrite3x2Png() throws Exception { -+ mHelper.addCustomFilter( -+ String.format( -+ "||%s/testfiles/rewrite/3x2.png$rewrite=abp-resource:3x2-transparent-png,domain=%s", -+ TestPagesHelperBase.TESTPAGES_DOMAIN, -+ TestPagesHelperBase.TESTPAGES_DOMAIN)); -+ mHelper.loadUrl(REWRITE_TEST_URL); -+ TestVerificationUtils.verifySelfTestPass(mHelper, "3x2-target"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testRewrite32x32Png() throws Exception { -+ mHelper.addCustomFilter( -+ String.format( -+ "||%s/testfiles/rewrite/32x32.png$rewrite=abp-resource:32x32-transparent-png," -+ + "domain=%s", -+ TestPagesHelperBase.TESTPAGES_DOMAIN, -+ TestPagesHelperBase.TESTPAGES_DOMAIN)); -+ mHelper.loadUrl(REWRITE_TEST_URL); -+ TestVerificationUtils.verifySelfTestPass(mHelper, "32x32-target"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testRewriteAudio() throws Exception { -+ mHelper.addCustomFilter( -+ String.format( -+ "||%s/testfiles/rewrite/*.mp3$rewrite=abp-resource:blank-mp3,domain=%s", -+ TestPagesHelperBase.TESTPAGES_DOMAIN, -+ TestPagesHelperBase.TESTPAGES_DOMAIN)); -+ mHelper.loadUrl(REWRITE_TEST_URL); -+ final String js_verification_code = -+ "document.getElementById('audio-area') && " -+ + "document.getElementById('audio-area').lastChild && " -+ + "document.getElementById('audio-area').lastChild.getAttribute" -+ + "('data-expectedresult') == \"pass\""; -+ TestVerificationUtils.verifyCondition(mHelper, js_verification_code); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testRewriteVideo() throws Exception { -+ mHelper.addCustomFilter( -+ String.format( -+ "||%s/testfiles/rewrite/*.mp4$rewrite=abp-resource:blank-mp4,domain=%s", -+ TestPagesHelperBase.TESTPAGES_DOMAIN, -+ TestPagesHelperBase.TESTPAGES_DOMAIN)); -+ mHelper.loadUrl(REWRITE_TEST_URL); -+ final String js_verification_code = -+ "document.getElementById('video-area') && " -+ + "document.getElementById('video-area').lastChild && " -+ + "document.getElementById('video-area').lastChild.getAttribute" -+ + "('data-expectedresult') == \"pass\""; -+ TestVerificationUtils.verifyCondition(mHelper, js_verification_code); -+ } -+} -diff --git a/components/adblock/android/javatests/src/org/chromium/components/adblock/TestPagesServiceWorkersTestBase.java b/components/adblock/android/javatests/src/org/chromium/components/adblock/TestPagesServiceWorkersTestBase.java -new file mode 100644 ---- /dev/null -+++ b/components/adblock/android/javatests/src/org/chromium/components/adblock/TestPagesServiceWorkersTestBase.java -@@ -0,0 +1,71 @@ -+/* -+ * This file is part of eyeo Chromium SDK, -+ * Copyright (C) 2006-present eyeo GmbH -+ * -+ * eyeo Chromium SDK is free software: you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 3 as -+ * published by the Free Software Foundation. -+ * -+ * eyeo Chromium SDK is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with eyeo Chromium SDK. If not, see . -+ */ -+ -+package org.chromium.components.adblock; -+ -+import androidx.test.filters.LargeTest; -+ -+import org.junit.Test; -+ -+import org.chromium.base.test.util.Feature; -+ -+public abstract class TestPagesServiceWorkersTestBase { -+ public static final String SERVICE_WORKERS_TEST_URL = -+ TestPagesHelperBase.TESTPAGES_TESTCASES_ROOT + "service-worker/"; -+ private TestPagesHelperBase mHelper; -+ -+ protected void setUp(TestPagesHelperBase helper) { -+ mHelper = helper; -+ mHelper.addFilterList(TestPagesHelperBase.TESTPAGES_SUBSCRIPTION); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testBlockingWorker() throws Exception { -+ mHelper.loadUrlWaitForContent(SERVICE_WORKERS_TEST_URL + "worker-itself"); -+ TestVerificationUtils.verifyDisplayedCount( -+ mHelper, 1, "div#blocked-target > div[data-expectedresult='pass']"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testAllowingWorker() throws Exception { -+ mHelper.loadUrlWaitForContent(SERVICE_WORKERS_TEST_URL + "worker-itself"); -+ TestVerificationUtils.verifyDisplayedCount( -+ mHelper, 1, "div#allowed-target > div[data-expectedresult='pass']"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testBlockingFromWorker() throws Exception { -+ mHelper.loadUrlWaitForContent(SERVICE_WORKERS_TEST_URL + "worker-subresource"); -+ TestVerificationUtils.verifyDisplayedCount( -+ mHelper, 1, "div#blocked-target > div[data-expectedresult='pass']"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testAllowingFromWorker() throws Exception { -+ mHelper.loadUrlWaitForContent(SERVICE_WORKERS_TEST_URL + "worker-subresource"); -+ TestVerificationUtils.verifyDisplayedCount( -+ mHelper, 1, "div#allowed-target > div[data-expectedresult='pass']"); -+ } -+} -diff --git a/components/adblock/android/javatests/src/org/chromium/components/adblock/TestPagesSiteKeyTestBase.java b/components/adblock/android/javatests/src/org/chromium/components/adblock/TestPagesSiteKeyTestBase.java -new file mode 100644 ---- /dev/null -+++ b/components/adblock/android/javatests/src/org/chromium/components/adblock/TestPagesSiteKeyTestBase.java -@@ -0,0 +1,51 @@ -+/* -+ * This file is part of eyeo Chromium SDK, -+ * Copyright (C) 2006-present eyeo GmbH -+ * -+ * eyeo Chromium SDK is free software: you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 3 as -+ * published by the Free Software Foundation. -+ * -+ * eyeo Chromium SDK is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with eyeo Chromium SDK. If not, see . -+ */ -+ -+package org.chromium.components.adblock; -+ -+import androidx.test.filters.LargeTest; -+ -+import org.junit.Assert; -+import org.junit.Test; -+ -+import org.chromium.base.test.util.Feature; -+ -+public abstract class TestPagesSiteKeyTestBase { -+ private TestPagesHelperBase mHelper; -+ -+ protected void setUp(TestPagesHelperBase helper) { -+ mHelper = helper; -+ mHelper.addFilterList(TestPagesHelperBase.TESTPAGES_SUBSCRIPTION); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testVerifySitekeyException() throws Exception { -+ mHelper.loadUrl(TestPagesHelperBase.SITEKEY_TESTPAGES_TESTCASES_ROOT); -+ Assert.assertEquals(1, mHelper.numBlocked()); -+ Assert.assertTrue( -+ mHelper.isBlocked( -+ TestPagesHelperBase.TESTPAGES_RESOURCES_ROOT + "sitekey/outofframe.png")); -+ Assert.assertEquals(1, mHelper.numAllowed()); -+ Assert.assertTrue( -+ mHelper.isAllowed( -+ TestPagesHelperBase.TESTPAGES_RESOURCES_ROOT + "sitekey/inframe.png")); -+ TestVerificationUtils.verifyHiddenCount(mHelper, 1, "img"); -+ TestVerificationUtils.verifyHiddenCount(mHelper, 1, "div"); -+ } -+} -diff --git a/components/adblock/android/javatests/src/org/chromium/components/adblock/TestPagesSnippetsTestBase.java b/components/adblock/android/javatests/src/org/chromium/components/adblock/TestPagesSnippetsTestBase.java -new file mode 100644 ---- /dev/null -+++ b/components/adblock/android/javatests/src/org/chromium/components/adblock/TestPagesSnippetsTestBase.java -@@ -0,0 +1,560 @@ -+/* -+ * This file is part of eyeo Chromium SDK, -+ * Copyright (C) 2006-present eyeo GmbH -+ * -+ * eyeo Chromium SDK is free software: you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 3 as -+ * published by the Free Software Foundation. -+ * -+ * eyeo Chromium SDK is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with eyeo Chromium SDK. If not, see . -+ */ -+ -+package org.chromium.components.adblock; -+ -+import androidx.test.filters.LargeTest; -+ -+import org.junit.Test; -+ -+import org.chromium.base.test.util.DisabledTest; -+import org.chromium.base.test.util.Feature; -+ -+public abstract class TestPagesSnippetsTestBase { -+ private TestPagesHelperBase mHelper; -+ -+ protected void setUp(TestPagesHelperBase helper) { -+ mHelper = helper; -+ mHelper.addFilterList(TestPagesHelperBase.TESTPAGES_SUBSCRIPTION); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testAbortCurrentInlineScriptBasic() throws Exception { -+ mHelper.loadUrlWaitForContent( -+ TestPagesHelperBase.SNIPPETS_TESTPAGES_TESTCASES_ROOT -+ + "abort-current-inline-script"); -+ // All "Abort" snippets cancel creation of the target div, so it won't be hidden - it will -+ // not exist in DOM. Therefore we verify it's not displayed instead of verifying it's -+ // hidden. -+ TestVerificationUtils.verifyDisplayedCount( -+ mHelper, 0, "div#basic-target > div[data-expectedresult='fail']"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testAbortCurrentInlineScriptSearch() throws Exception { -+ mHelper.loadUrlWaitForContent( -+ TestPagesHelperBase.SNIPPETS_TESTPAGES_TESTCASES_ROOT -+ + "abort-current-inline-script"); -+ TestVerificationUtils.verifyDisplayedCount( -+ mHelper, 0, "div#search-target > div[data-expectedresult='fail']"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testAbortCurrentInlineScriptRegex() throws Exception { -+ mHelper.loadUrlWaitForContent( -+ TestPagesHelperBase.SNIPPETS_TESTPAGES_TESTCASES_ROOT -+ + "abort-current-inline-script"); -+ TestVerificationUtils.verifyDisplayedCount( -+ mHelper, 0, "div#regex-target > div[data-expectedresult='fail']"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testAbortOnPropertyReadBasic() throws Exception { -+ mHelper.loadUrlWaitForContent( -+ TestPagesHelperBase.SNIPPETS_TESTPAGES_TESTCASES_ROOT + "abort-on-property-read"); -+ TestVerificationUtils.verifyDisplayedCount( -+ mHelper, 0, "div#basic-target > div[data-expectedresult='fail']"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testAbortOnPropertyReadSubProperty() throws Exception { -+ mHelper.loadUrlWaitForContent( -+ TestPagesHelperBase.SNIPPETS_TESTPAGES_TESTCASES_ROOT + "abort-on-property-read"); -+ TestVerificationUtils.verifyDisplayedCount( -+ mHelper, 0, "div#subproperty-target > div[data-expectedresult='fail']"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testAbortOnPropertyReadFunctionProperty() throws Exception { -+ mHelper.loadUrlWaitForContent( -+ TestPagesHelperBase.SNIPPETS_TESTPAGES_TESTCASES_ROOT + "abort-on-property-read"); -+ TestVerificationUtils.verifyDisplayedCount( -+ mHelper, 0, "div#functionproperty-target > div[data-expectedresult='fail']"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testAbortOnPropertyWriteBasic() throws Exception { -+ mHelper.loadUrlWaitForContent( -+ TestPagesHelperBase.SNIPPETS_TESTPAGES_TESTCASES_ROOT + "abort-on-property-write"); -+ TestVerificationUtils.verifyDisplayedCount( -+ mHelper, 0, "div#basic-target > div[data-expectedresult='fail']"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testAbortOnPropertyWriteSubProperty() throws Exception { -+ mHelper.loadUrlWaitForContent( -+ TestPagesHelperBase.SNIPPETS_TESTPAGES_TESTCASES_ROOT + "abort-on-property-write"); -+ TestVerificationUtils.verifyDisplayedCount( -+ mHelper, 0, "div#subproperty-target > div[data-expectedresult='fail']"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testAbortOnPropertyWriteFunctionProperty() throws Exception { -+ mHelper.loadUrlWaitForContent( -+ TestPagesHelperBase.SNIPPETS_TESTPAGES_TESTCASES_ROOT + "abort-on-property-write"); -+ TestVerificationUtils.verifyDisplayedCount( -+ mHelper, 0, "div#functionproperty-target > div[data-expectedresult='fail']"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testAbortOnIframePropertyReadBasic() throws Exception { -+ mHelper.loadUrlWaitForContent( -+ TestPagesHelperBase.SNIPPETS_TESTPAGES_TESTCASES_ROOT -+ + "abort-on-iframe-property-read"); -+ TestVerificationUtils.verifyDisplayedCount( -+ mHelper, 0, "div#basic-target > div[data-expectedresult='fail']"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testAbortOnIframePropertyReadSubProperty() throws Exception { -+ mHelper.loadUrlWaitForContent( -+ TestPagesHelperBase.SNIPPETS_TESTPAGES_TESTCASES_ROOT -+ + "abort-on-iframe-property-read"); -+ TestVerificationUtils.verifyDisplayedCount( -+ mHelper, 0, "div#subproperty-target > div[data-expectedresult='fail']"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testAbortOnIframePropertyReadMultipleProperties() throws Exception { -+ mHelper.loadUrlWaitForContent( -+ TestPagesHelperBase.SNIPPETS_TESTPAGES_TESTCASES_ROOT -+ + "abort-on-iframe-property-read"); -+ TestVerificationUtils.verifyDisplayedCount( -+ mHelper, 0, "div#multipleproperties-target > div[data-expectedresult='fail']"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testAbortOnIframePropertyWriteBasic() throws Exception { -+ mHelper.loadUrlWaitForContent( -+ TestPagesHelperBase.SNIPPETS_TESTPAGES_TESTCASES_ROOT -+ + "abort-on-iframe-property-write"); -+ TestVerificationUtils.verifyDisplayedCount( -+ mHelper, 0, "div#basic-target > div[data-expectedresult='fail']"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testAbortOnIframePropertyWriteSubProperty() throws Exception { -+ mHelper.loadUrlWaitForContent( -+ TestPagesHelperBase.SNIPPETS_TESTPAGES_TESTCASES_ROOT -+ + "abort-on-iframe-property-write"); -+ TestVerificationUtils.verifyDisplayedCount( -+ mHelper, 0, "div#subproperty-target > div[data-expectedresult='fail']"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testAbortOnIframePropertyWriteMultipleProperties() throws Exception { -+ mHelper.loadUrlWaitForContent( -+ TestPagesHelperBase.SNIPPETS_TESTPAGES_TESTCASES_ROOT -+ + "abort-on-iframe-property-write"); -+ TestVerificationUtils.verifyDisplayedCount( -+ mHelper, 0, "div#multipleproperties-target > div[data-expectedresult='fail']"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testHideIfContainsStatic() throws Exception { -+ mHelper.loadUrlWaitForContent( -+ TestPagesHelperBase.SNIPPETS_TESTPAGES_TESTCASES_ROOT + "hide-if-contains"); -+ TestVerificationUtils.verifyHiddenCount(mHelper, 1, "p#hic-static-id"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testHideIfContainsDynamic() throws Exception { -+ mHelper.loadUrlWaitForContent( -+ TestPagesHelperBase.SNIPPETS_TESTPAGES_TESTCASES_ROOT + "hide-if-contains"); -+ TestVerificationUtils.verifyHiddenCount(mHelper, 1, "p#hic-dynamic-id"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testHideIfContainsSearch() throws Exception { -+ mHelper.loadUrlWaitForContent( -+ TestPagesHelperBase.SNIPPETS_TESTPAGES_TESTCASES_ROOT + "hide-if-contains"); -+ TestVerificationUtils.verifyHiddenCount(mHelper, 1, "div#search2-target > p.target"); -+ TestVerificationUtils.verifyDisplayedCount( -+ mHelper, 1, "div#search1-target > p[data-expectedresult='pass']"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testHideIfContainsRegex() throws Exception { -+ mHelper.loadUrlWaitForContent( -+ TestPagesHelperBase.SNIPPETS_TESTPAGES_TESTCASES_ROOT + "hide-if-contains"); -+ // "hic-regex-1" does not match regex, should remain displayed. -+ TestVerificationUtils.verifyDisplayedCount(mHelper, 1, "p#hic-regex-1"); -+ -+ // "hic-regex-2" and "hic-regex-2" do match regex, should be hidden. -+ TestVerificationUtils.verifyHiddenCount(mHelper, 1, "p#hic-regex-2"); -+ TestVerificationUtils.verifyHiddenCount(mHelper, 1, "p#hic-regex-3"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testHideIfContainsFrame() throws Exception { -+ mHelper.loadUrlWaitForContent( -+ TestPagesHelperBase.SNIPPETS_TESTPAGES_TESTCASES_ROOT + "hide-if-contains"); -+ TestVerificationUtils.verifyHiddenCount(mHelper, 1, "span#frame-target"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testHideIfContainsAndMatchesStyleStatic() throws Exception { -+ mHelper.loadUrlWaitForContent( -+ TestPagesHelperBase.SNIPPETS_TESTPAGES_TESTCASES_ROOT -+ + "hide-if-contains-and-matches-style"); -+ TestVerificationUtils.verifyHiddenCount( -+ mHelper, 1, "div#static-usage-area > div[data-expectedresult='fail']"); -+ TestVerificationUtils.verifyDisplayedCount( -+ mHelper, 1, "div#static-usage-area > div[data-expectedresult='pass']"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testHideIfContainsAndMatchesStyleDynamic() throws Exception { -+ mHelper.loadUrlWaitForContent( -+ TestPagesHelperBase.SNIPPETS_TESTPAGES_TESTCASES_ROOT -+ + "hide-if-contains-and-matches-style"); -+ TestVerificationUtils.verifyHiddenCount( -+ mHelper, 1, "div#dynamic-target > div[data-expectedresult='fail']"); -+ TestVerificationUtils.verifyDisplayedCount( -+ mHelper, 1, "div#dynamic-target > div[data-expectedresult='pass']"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testHideIfContainsImage() throws Exception { -+ mHelper.loadUrlWaitForContent( -+ TestPagesHelperBase.SNIPPETS_TESTPAGES_TESTCASES_ROOT + "hide-if-contains-image"); -+ TestVerificationUtils.verifyHiddenCount(mHelper, 2, "div[data-expectedresult='fail']"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testHideIfContainsVisibleTextBasicUsage() throws Exception { -+ mHelper.loadUrlWaitForContent( -+ TestPagesHelperBase.SNIPPETS_TESTPAGES_TESTCASES_ROOT -+ + "hide-if-contains-visible-text"); -+ TestVerificationUtils.verifyHiddenCount( -+ mHelper, 1, "div#parent-basic > div[data-expectedresult='fail']"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testHideIfContainsVisibleTextContentUsage() throws Exception { -+ mHelper.loadUrlWaitForContent( -+ TestPagesHelperBase.SNIPPETS_TESTPAGES_TESTCASES_ROOT -+ + "hide-if-contains-visible-text"); -+ TestVerificationUtils.verifyHiddenCount( -+ mHelper, 1, "div#parent-content > div[data-expectedresult='fail']"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testHideIfHasAndMatchesStyleBasicUsage() throws Exception { -+ mHelper.loadUrlWaitForContent( -+ TestPagesHelperBase.SNIPPETS_TESTPAGES_TESTCASES_ROOT -+ + "hide-if-has-and-matches-style"); -+ TestVerificationUtils.verifyHiddenCount( -+ mHelper, 1, "div#basic-target > div[data-expectedresult='fail']"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testHideIfHasAndMatchesStyleLegitElements() throws Exception { -+ mHelper.loadUrlWaitForContent( -+ TestPagesHelperBase.SNIPPETS_TESTPAGES_TESTCASES_ROOT -+ + "hide-if-has-and-matches-style"); -+ TestVerificationUtils.verifyDisplayedCount( -+ mHelper, 1, "div#comments-target > div[data-expectedresult='pass']"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testHideIfLabeledBy() throws Exception { -+ mHelper.loadUrlWaitForContent( -+ TestPagesHelperBase.SNIPPETS_TESTPAGES_TESTCASES_ROOT + "hide-if-labelled-by"); -+ TestVerificationUtils.verifyHiddenCount(mHelper, 1, "div[data-expectedresult='fail']"); -+ TestVerificationUtils.verifyDisplayedCount(mHelper, 1, "div[data-expectedresult='pass']"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testHideIfMatchesXPathBasicStaticUsage() throws Exception { -+ mHelper.loadUrlWaitForContent( -+ TestPagesHelperBase.SNIPPETS_TESTPAGES_TESTCASES_ROOT + "hide-if-matches-xpath"); -+ TestVerificationUtils.verifyHiddenCount( -+ mHelper, 1, "div#basic-static-usage-area > div[data-expectedresult='fail']"); -+ TestVerificationUtils.verifyDisplayedCount( -+ mHelper, 1, "div#basic-static-usage-area > div[data-expectedresult='pass']"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testHideIfMatchesXPath3BasicStaticUsage() throws Exception { -+ mHelper.loadUrlWaitForContent( -+ TestPagesHelperBase.SNIPPETS_TESTPAGES_TESTCASES_ROOT + "hide-if-matches-xpath"); -+ TestVerificationUtils.verifyHiddenCount( -+ mHelper, 1, "div#basic-static-usage-area > div[data-expectedresult='fail']"); -+ TestVerificationUtils.verifyDisplayedCount( -+ mHelper, 1, "div#basic-static-usage-area > div[data-expectedresult='pass']"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testHideIfMatchesXPathClassUsage() throws Exception { -+ mHelper.loadUrlWaitForContent( -+ TestPagesHelperBase.SNIPPETS_TESTPAGES_TESTCASES_ROOT + "hide-if-matches-xpath"); -+ TestVerificationUtils.verifyHiddenCount( -+ mHelper, 1, "div#class-usage-area > div[data-expectedresult='fail']"); -+ TestVerificationUtils.verifyDisplayedCount( -+ mHelper, 1, "div#class-usage-area > div[data-expectedresult='pass']"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testHideIfMatchesXPath3ClassUsage() throws Exception { -+ mHelper.loadUrlWaitForContent( -+ TestPagesHelperBase.SNIPPETS_TESTPAGES_TESTCASES_ROOT + "hide-if-matches-xpath"); -+ TestVerificationUtils.verifyHiddenCount( -+ mHelper, 1, "div#class-usage-area > div[data-expectedresult='fail']"); -+ TestVerificationUtils.verifyDisplayedCount( -+ mHelper, 1, "div#class-usage-area > div[data-expectedresult='pass']"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testHideIfMatchesXPathIdStartsWith() throws Exception { -+ mHelper.loadUrlWaitForContent( -+ TestPagesHelperBase.SNIPPETS_TESTPAGES_TESTCASES_ROOT + "hide-if-matches-xpath"); -+ TestVerificationUtils.verifyHiddenCount( -+ mHelper, 1, "div#hide-if-id-starts-with-area > div[data-expectedresult='fail']"); -+ TestVerificationUtils.verifyDisplayedCount( -+ mHelper, 1, "div#hide-if-id-starts-with-area > div[data-expectedresult='pass']"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testHideIfMatchesXPath3IdStartsWith() throws Exception { -+ mHelper.loadUrlWaitForContent( -+ TestPagesHelperBase.SNIPPETS_TESTPAGES_TESTCASES_ROOT + "hide-if-matches-xpath"); -+ TestVerificationUtils.verifyHiddenCount( -+ mHelper, 1, "div#hide-if-id-starts-with-area > div[data-expectedresult='fail']"); -+ TestVerificationUtils.verifyDisplayedCount( -+ mHelper, 1, "div#hide-if-id-starts-with-area > div[data-expectedresult='pass']"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testHideIfMatchesXPath3Regex() throws Exception { -+ mHelper.loadUrlWaitForContent( -+ TestPagesHelperBase.SNIPPETS_TESTPAGES_TESTCASES_ROOT + "hide-if-matches-xpath3"); -+ TestVerificationUtils.verifyHiddenCount( -+ mHelper, -+ 1, -+ "div#hide-if-class-matches-regex-area > div[data-expectedresult='fail']"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testHideIfMatchesXPath3NormalizeAndJoinStrings() throws Exception { -+ mHelper.loadUrlWaitForContent( -+ TestPagesHelperBase.SNIPPETS_TESTPAGES_TESTCASES_ROOT + "hide-if-matches-xpath3"); -+ TestVerificationUtils.verifyHiddenCount( -+ mHelper, -+ 1, -+ "div#normalize-and-join-strings-area > div[data-expectedresult='fail']"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testHideIfMatchesXPath3CastToNumber() throws Exception { -+ mHelper.loadUrlWaitForContent( -+ TestPagesHelperBase.SNIPPETS_TESTPAGES_TESTCASES_ROOT + "hide-if-matches-xpath3"); -+ TestVerificationUtils.verifyHiddenCount( -+ mHelper, 1, "div#cast-to-number-area > div[data-expectedresult='fail']"); -+ TestVerificationUtils.verifyDisplayedCount( -+ mHelper, 1, "div#cast-to-number-area > div[data-expectedresult='pass']"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testHideIfMatchesComputedXPathClassChangesDynamically() throws Exception { -+ mHelper.loadUrlWaitForContent( -+ TestPagesHelperBase.SNIPPETS_TESTPAGES_TESTCASES_ROOT -+ + "hide-if-matches-computed-xpath"); -+ TestVerificationUtils.verifyHiddenCount( -+ mHelper, -+ 1, -+ "div#hide-when-class-changes-dynamically-based-on-a-string-found-in-another-element-area" -+ + " > div[data-expectedresult='fail']"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testHideIfMatchesComputedXPathClassMatchesRegex() throws Exception { -+ mHelper.loadUrlWaitForContent( -+ TestPagesHelperBase.SNIPPETS_TESTPAGES_TESTCASES_ROOT -+ + "hide-if-matches-computed-xpath"); -+ TestVerificationUtils.verifyHiddenCount( -+ mHelper, -+ 1, -+ "div#hide-when-class-matches-regex-group-area > div[data-expectedresult='fail']"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testHideIfShadowContainsBasicUsage() throws Exception { -+ mHelper.loadUrlWaitForContent( -+ TestPagesHelperBase.SNIPPETS_TESTPAGES_TESTCASES_ROOT + "hide-if-shadow-contains"); -+ TestVerificationUtils.verifyHiddenCount( -+ mHelper, 1, "div#basic-target > p[data-expectedresult='fail']"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testHideIfShadowContainsRegexUsage() throws Exception { -+ mHelper.loadUrlWaitForContent( -+ TestPagesHelperBase.SNIPPETS_TESTPAGES_TESTCASES_ROOT + "hide-if-shadow-contains"); -+ TestVerificationUtils.verifyHiddenCount( -+ mHelper, 2, "div#regex-target > div[data-expectedresult='fail']"); -+ TestVerificationUtils.verifyDisplayedCount( -+ mHelper, 1, "div#regex-target > div[data-expectedresult='pass']"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testJsonPrune() throws Exception { -+ mHelper.loadUrlWaitForContent( -+ TestPagesHelperBase.SNIPPETS_TESTPAGES_TESTCASES_ROOT + "json-prune?delay=100"); -+ // The object does not get hidden, it no longer exists in the DOM. -+ TestVerificationUtils.verifyDisplayedCount( -+ mHelper, 0, "div#testcase-area > div[data-expectedresult='fail']"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testOverridePropertyRead() throws Exception { -+ mHelper.loadUrlWaitForContent( -+ TestPagesHelperBase.SNIPPETS_TESTPAGES_TESTCASES_ROOT + "override-property-read"); -+ TestVerificationUtils.verifyHiddenCount( -+ mHelper, 1, "div#basic-target > div[data-expectedresult='fail']"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testStripFetchQueryParameterBasicUsage() throws Exception { -+ mHelper.loadUrlWaitForContent( -+ TestPagesHelperBase.SNIPPETS_TESTPAGES_TESTCASES_ROOT -+ + "strip-fetch-query-parameter"); -+ TestVerificationUtils.verifyDisplayedCount( -+ mHelper, 0, "div#basic-target > div[data-expectedresult='fail']"); -+ TestVerificationUtils.verifyDisplayedCount( -+ mHelper, 1, "div#basic-target > div[data-expectedresult='pass']"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testStripFetchQueryParameterOtherUsage() throws Exception { -+ mHelper.loadUrlWaitForContent( -+ TestPagesHelperBase.SNIPPETS_TESTPAGES_TESTCASES_ROOT -+ + "strip-fetch-query-parameter"); -+ TestVerificationUtils.verifyDisplayedCount( -+ mHelper, 2, "div#other-target > div[data-expectedresult='pass']"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testSimulateMouseEvent() throws Exception { -+ mHelper.loadUrlWaitForContent( -+ TestPagesHelperBase.SNIPPETS_TESTPAGES_TESTCASES_ROOT + "simulate-mouse-event"); -+ TestVerificationUtils.verifyDisplayedCount( -+ mHelper, 0, "div#simulate-mouse-event-area > div[data-expectedresult='fail']"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ @DisabledTest(message = "DPD-2832") -+ public void testSkipVideo() throws Exception { -+ mHelper.loadUrlWaitForContent( -+ TestPagesHelperBase.SNIPPETS_TESTPAGES_TESTCASES_ROOT + "skip-video"); -+ TestVerificationUtils.verifyDisplayedCount( -+ mHelper, 0, "div#skip-video-area > div[data-expectedresult='fail']"); -+ } -+} -diff --git a/components/adblock/android/javatests/src/org/chromium/components/adblock/TestPagesWebsocketTestBase.java b/components/adblock/android/javatests/src/org/chromium/components/adblock/TestPagesWebsocketTestBase.java -new file mode 100644 ---- /dev/null -+++ b/components/adblock/android/javatests/src/org/chromium/components/adblock/TestPagesWebsocketTestBase.java -@@ -0,0 +1,54 @@ -+/* -+ * This file is part of eyeo Chromium SDK, -+ * Copyright (C) 2006-present eyeo GmbH -+ * -+ * eyeo Chromium SDK is free software: you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 3 as -+ * published by the Free Software Foundation. -+ * -+ * eyeo Chromium SDK is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with eyeo Chromium SDK. If not, see . -+ */ -+ -+package org.chromium.components.adblock; -+ -+import androidx.test.filters.LargeTest; -+ -+import org.junit.Assert; -+import org.junit.Test; -+ -+import org.chromium.base.test.util.Feature; -+ -+import java.util.HashSet; -+import java.util.List; -+import java.util.concurrent.CountDownLatch; -+import java.util.concurrent.TimeUnit; -+ -+public abstract class TestPagesWebsocketTestBase { -+ private TestPagesHelperBase mHelper; -+ -+ protected void setUp(TestPagesHelperBase helper) { -+ mHelper = helper; -+ mHelper.addFilterList(TestPagesHelperBase.TESTPAGES_SUBSCRIPTION); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testVerifyWebsocketFilter() throws Exception { -+ final String wssUrl = -+ String.format("wss://%s/websocket", TestPagesHelperBase.TESTPAGES_DOMAIN); -+ final CountDownLatch countDownLatch = -+ mHelper.setOnAdMatchedExpectations(new HashSet<>(List.of(wssUrl)), null); -+ mHelper.loadUrl(TestPagesHelperBase.FILTER_TESTPAGES_TESTCASES_ROOT + "websocket"); -+ // Wait with 10 seconds max timeout -+ countDownLatch.await(10, TimeUnit.SECONDS); -+ Assert.assertEquals(1, mHelper.numBlockedByType(ContentType.CONTENT_TYPE_WEBSOCKET)); -+ Assert.assertTrue(mHelper.isBlocked(wssUrl)); -+ } -+} -diff --git a/components/adblock/android/javatests/src/org/chromium/components/adblock/TestPagesWildcardDomainTestBase.java b/components/adblock/android/javatests/src/org/chromium/components/adblock/TestPagesWildcardDomainTestBase.java -new file mode 100644 ---- /dev/null -+++ b/components/adblock/android/javatests/src/org/chromium/components/adblock/TestPagesWildcardDomainTestBase.java -@@ -0,0 +1,116 @@ -+/* -+ * This file is part of eyeo Chromium SDK, -+ * Copyright (C) 2006-present eyeo GmbH -+ * -+ * eyeo Chromium SDK is free software: you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 3 as -+ * published by the Free Software Foundation. -+ * -+ * eyeo Chromium SDK is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with eyeo Chromium SDK. If not, see . -+ */ -+ -+package org.chromium.components.adblock; -+ -+import androidx.test.filters.LargeTest; -+ -+import org.junit.Test; -+ -+import org.chromium.base.test.util.Feature; -+ -+public abstract class TestPagesWildcardDomainTestBase { -+ -+ public static final String WILDCARD_DOMAIN_TESTPAGES_URL = -+ "https://subdomain.abptestpages.org/en/filters/wildcard-domain"; -+ -+ private TestPagesHelperBase mHelper; -+ -+ protected void setUp(TestPagesHelperBase helper) { -+ mHelper = helper; -+ mHelper.addFilterList(TestPagesHelperBase.TESTPAGES_SUBSCRIPTION); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testWildcardDomainContainsWithWildcards() throws Exception { -+ mHelper.loadUrl(WILDCARD_DOMAIN_TESTPAGES_URL); -+ TestVerificationUtils.verifyHiddenCount( -+ mHelper, 1, "div[id='element-hiding-contains-with-wildcards-fail-1']"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testWildcardDomainId() throws Exception { -+ mHelper.loadUrl(WILDCARD_DOMAIN_TESTPAGES_URL); -+ TestVerificationUtils.verifyHiddenCount(mHelper, 1, "div[id='eh-id']"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testWildcardDomainAttributeSelector() throws Exception { -+ mHelper.loadUrl(WILDCARD_DOMAIN_TESTPAGES_URL); -+ TestVerificationUtils.verifyHiddenCount( -+ mHelper, 1, "div[id='element-hiding-attribute-selector-fail-1']"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testWildcardDomainAbpProperties() throws Exception { -+ mHelper.loadUrl(WILDCARD_DOMAIN_TESTPAGES_URL); -+ TestVerificationUtils.verifyHiddenCount( -+ mHelper, 1, "div[id='element-hiding-emulation-basic-abp-properties-usage-fail-1']"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testWildcardDomainAbpHas() throws Exception { -+ mHelper.loadUrl(WILDCARD_DOMAIN_TESTPAGES_URL); -+ TestVerificationUtils.verifyHiddenCount( -+ mHelper, 1, "div[id='element-hiding-emulation-basic-abp-has-usage-fail-1']"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testWildcardDomainChainedExtendedSelectors() throws Exception { -+ mHelper.loadUrl(WILDCARD_DOMAIN_TESTPAGES_URL); -+ TestVerificationUtils.verifyHiddenCount( -+ mHelper, 1, "div[id='element-hiding-emulation-chained-extended-selectors-fail-1']"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testWildcardDomainExtendedSelectorAndDomain() throws Exception { -+ mHelper.loadUrl(WILDCARD_DOMAIN_TESTPAGES_URL); -+ TestVerificationUtils.verifyHiddenCount( -+ mHelper, -+ 1, -+ "div[id='element-hide-emulation-wildcard-in-extended-selector-and-wildcard-in-domain-fail-1']"); -+ } -+ -+ @Test -+ @LargeTest -+ @Feature({"adblock"}) -+ public void testWildcardDomainRegularExpression() throws Exception { -+ mHelper.loadUrl(WILDCARD_DOMAIN_TESTPAGES_URL); -+ TestVerificationUtils.verifyHiddenCount( -+ mHelper, -+ 1, -+ "div[id='element-hiding-emulation-regular-expression-in-abp-contains-fail-1']"); -+ TestVerificationUtils.verifyHiddenCount( -+ mHelper, -+ 1, -+ "div[id='element-hiding-emulation-regular-expression-in-abp-contains-fail-2']"); -+ } -+} -diff --git a/components/adblock/android/javatests/src/org/chromium/components/adblock/TestResourceFilteringObserver.java b/components/adblock/android/javatests/src/org/chromium/components/adblock/TestResourceFilteringObserver.java -new file mode 100644 ---- /dev/null -+++ b/components/adblock/android/javatests/src/org/chromium/components/adblock/TestResourceFilteringObserver.java -@@ -0,0 +1,180 @@ -+/* -+ * This file is part of eyeo Chromium SDK, -+ * Copyright (C) 2006-present eyeo GmbH -+ * -+ * eyeo Chromium SDK is free software: you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 3 as -+ * published by the Free Software Foundation. -+ * -+ * eyeo Chromium SDK is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with eyeo Chromium SDK. If not, see . -+ */ -+ -+package org.chromium.components.adblock; -+ -+import org.junit.Assert; -+ -+import java.net.URL; -+import java.util.List; -+import java.util.Set; -+import java.util.concurrent.CopyOnWriteArrayList; -+import java.util.concurrent.CountDownLatch; -+ -+public class TestResourceFilteringObserver -+ implements ResourceClassificationNotifier.ResourceFilteringObserver { -+ @Override -+ public void onRequestAllowed(ResourceFilteringCounters.ResourceInfo info) { -+ allowedInfos.add(info); -+ Assert.assertEquals(info.getSubscription(), getExpectedSubscriptionUrl()); -+ CheckAndCountDownLatch(Decision.ALLOWED, info.getRequestUrl().split("\\?")[0]); -+ } -+ -+ @Override -+ public void onRequestBlocked(ResourceFilteringCounters.ResourceInfo info) { -+ blockedInfos.add(info); -+ Assert.assertEquals(info.getSubscription(), getExpectedSubscriptionUrl()); -+ CheckAndCountDownLatch(Decision.BLOCKED, info.getRequestUrl().split("\\?")[0]); -+ } -+ -+ @Override -+ public void onPageAllowed(ResourceFilteringCounters.ResourceInfo info) { -+ allowedPageInfos.add(info); -+ Assert.assertEquals(info.getSubscription(), getExpectedSubscriptionUrl()); -+ } -+ -+ @Override -+ public void onPopupAllowed(ResourceFilteringCounters.ResourceInfo info) { -+ allowedPopupsInfos.add(info); -+ Assert.assertEquals(info.getSubscription(), getExpectedSubscriptionUrl()); -+ } -+ -+ @Override -+ public void onPopupBlocked(ResourceFilteringCounters.ResourceInfo info) { -+ blockedPopupsInfos.add(info); -+ Assert.assertEquals(info.getSubscription(), getExpectedSubscriptionUrl()); -+ } -+ -+ public boolean isBlocked(String url) { -+ for (ResourceFilteringCounters.ResourceInfo info : blockedInfos) { -+ if (info.getRequestUrl().contains(url)) return true; -+ } -+ -+ return false; -+ } -+ -+ public boolean isPopupBlocked(String url) { -+ for (ResourceFilteringCounters.ResourceInfo info : blockedPopupsInfos) { -+ if (info.getRequestUrl().contains(url)) return true; -+ } -+ -+ return false; -+ } -+ -+ public int numBlockedByType(ContentType type) { -+ int result = 0; -+ for (ResourceFilteringCounters.ResourceInfo info : blockedInfos) { -+ if (info.getContentType() == type) ++result; -+ } -+ return result; -+ } -+ -+ public int numBlockedPopups() { -+ return blockedPopupsInfos.size(); -+ } -+ -+ public boolean isAllowed(String url) { -+ for (ResourceFilteringCounters.ResourceInfo info : allowedInfos) { -+ if (info.getRequestUrl().contains(url)) return true; -+ } -+ -+ return false; -+ } -+ -+ public boolean isPageAllowed(String url) { -+ for (ResourceFilteringCounters.ResourceInfo info : allowedPageInfos) { -+ if (info.getRequestUrl().contains(url)) return true; -+ } -+ -+ return false; -+ } -+ -+ public boolean isPopupAllowed(String url) { -+ for (ResourceFilteringCounters.ResourceInfo info : allowedPopupsInfos) { -+ if (info.getRequestUrl().contains(url)) return true; -+ } -+ -+ return false; -+ } -+ -+ public int numAllowedByType(ContentType type) { -+ int result = 0; -+ for (ResourceFilteringCounters.ResourceInfo info : allowedInfos) { -+ if (info.getContentType() == type) ++result; -+ } -+ return result; -+ } -+ -+ public int numAllowedPopups() { -+ return allowedPopupsInfos.size(); -+ } -+ -+ public void setExpectedSubscriptionUrl(URL url) { -+ mTestSubscriptionUrl = url; -+ } -+ -+ private String getExpectedSubscriptionUrl() { -+ if (mTestSubscriptionUrl != null) return mTestSubscriptionUrl.toString(); -+ return "adblock:custom"; -+ } -+ -+ private enum Decision { -+ ALLOWED, -+ BLOCKED -+ } -+ -+ // We either countDown() our latch for every filtered resource if there are no -+ // specific expectations set (expectedAllowed == null && expectedBlocked == null), -+ // or we countDown() only when all expectations have been met so when: -+ // (expectedAllowed.isNullOrEmpty() && expectedBlocked.isNullOrEmpty()). -+ private void CheckAndCountDownLatch(final Decision decision, final String url) { -+ if (countDownLatch != null) { -+ if (expectedBlocked == null && expectedAllowed == null) { -+ countDownLatch.countDown(); -+ } else { -+ if (decision == Decision.BLOCKED) { -+ if (expectedBlocked != null) { -+ expectedBlocked.remove(url); -+ } -+ } else { -+ if (expectedAllowed != null) { -+ expectedAllowed.remove(url); -+ } -+ } -+ boolean expectationsMet = -+ (expectedAllowed == null || expectedAllowed.isEmpty()) -+ && (expectedBlocked == null || expectedBlocked.isEmpty()); -+ if (expectationsMet) { -+ countDownLatch.countDown(); -+ } -+ } -+ } -+ } -+ -+ private URL mTestSubscriptionUrl; -+ public List blockedInfos = new CopyOnWriteArrayList<>(); -+ public List allowedInfos = new CopyOnWriteArrayList<>(); -+ public List allowedPageInfos = -+ new CopyOnWriteArrayList<>(); -+ public List blockedPopupsInfos = -+ new CopyOnWriteArrayList<>(); -+ public List allowedPopupsInfos = -+ new CopyOnWriteArrayList<>(); -+ CountDownLatch countDownLatch; -+ Set expectedAllowed; -+ Set expectedBlocked; -+} -diff --git a/components/adblock/android/javatests/src/org/chromium/components/adblock/TestVerificationUtils.java b/components/adblock/android/javatests/src/org/chromium/components/adblock/TestVerificationUtils.java -new file mode 100644 ---- /dev/null -+++ b/components/adblock/android/javatests/src/org/chromium/components/adblock/TestVerificationUtils.java -@@ -0,0 +1,220 @@ -+/* -+ * This file is part of eyeo Chromium SDK, -+ * Copyright (C) 2006-present eyeo GmbH -+ * -+ * eyeo Chromium SDK is free software: you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 3 as -+ * published by the Free Software Foundation. -+ * -+ * eyeo Chromium SDK is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with eyeo Chromium SDK. If not, see . -+ */ -+ -+package org.chromium.components.adblock; -+ -+import org.junit.Assert; -+ -+import org.chromium.content_public.browser.test.util.JavaScriptUtils; -+ -+import java.util.Locale; -+import java.util.concurrent.TimeoutException; -+ -+public class TestVerificationUtils { -+ public enum IncludeSubframes { -+ YES, -+ NO, -+ } -+ -+ private static final String STATUS_OK = "\"OK\""; -+ -+ private static final String MATCHES_HIDDEN_FUNCTION = -+ "let matches = function(element) {" -+ + " return window.getComputedStyle(element).display == \"none\";" -+ + "}"; -+ -+ private static final String MATCHES_DISPLAYED_FUNCTION = -+ "let matches = function(element) {" -+ + " return window.getComputedStyle(element).display != \"none\";" -+ + "}"; -+ -+ private static final String COUNT_ELEMENT_FUNCTION = -+ "let countElements = function(selector, includeSubframes) {" -+ + " let count = 0;" -+ + " for (let element of document.querySelectorAll(selector)) {" -+ + " if (matches(element))" -+ + " ++count;" -+ + " }" -+ + " if (includeSubframes) {" -+ + " for (let frame of document.querySelectorAll(\"iframe\")) {" -+ + " for (let element of frame.contentWindow.document.body" -+ + ".querySelectorAll(selector)) {" -+ + " if (matches(element))" -+ + " ++count;" -+ + " }" -+ + " }" -+ + " }" -+ + " return count;" -+ + "}"; -+ -+ // Poll every 100 ms until condition is met or 3 seconds timeout occurs -+ // Internal timeout of JavaScriptUtils.runJavascriptWithAsyncResult() is 5 seconds -+ // so our wait timeout needs to be shorter. -+ private static final String WAIT_FUNCTION = -+ "function waitWithTimeout() {" -+ + " return new Promise(resolve => {" -+ + " let repeat = 30;" -+ + " const id = setInterval(() => {" -+ + " --repeat;" -+ + " if (%s) {" // predicate placeholder -+ + " clearInterval(id);" -+ + " resolve('OK');" -+ + " } else if (repeat == 0) {" -+ + " clearInterval(id);" -+ + " resolve('Timeout');" -+ + " }" -+ + " }, 100);" -+ + " });" -+ + "};" -+ + "waitWithTimeout().then((r) => { domAutomationController.send(r);});"; -+ -+ private static void verifyMatchesCount( -+ final TestPagesHelperBase helper, -+ final int num, -+ final String matchesFunction, -+ final String selector, -+ IncludeSubframes includeSubframes) -+ throws TimeoutException { -+ final String boolIncludeSubframes = -+ includeSubframes == IncludeSubframes.YES ? "true" : "false"; -+ final String predicate = -+ String.format( -+ Locale.getDefault(), -+ "countElements(\"%s\", %s) == %d", -+ selector, -+ boolIncludeSubframes, -+ num); -+ final String waitFunction = String.format(WAIT_FUNCTION, predicate); -+ final String js = -+ String.format( -+ "(function () {%s\n%s\n%s\n}());", -+ matchesFunction, COUNT_ELEMENT_FUNCTION, waitFunction); -+ final String result = -+ JavaScriptUtils.runJavascriptWithAsyncResult(helper.getWebContents(), js); -+ Assert.assertEquals(STATUS_OK, result); -+ } -+ -+ public static void verifyHiddenCount( -+ final TestPagesHelperBase helper, final int num, final String selector) -+ throws TimeoutException { -+ verifyHiddenCount(helper, num, selector, IncludeSubframes.YES); -+ } -+ -+ public static void verifyHiddenCount( -+ final TestPagesHelperBase helper, -+ final int num, -+ final String selector, -+ final IncludeSubframes includeSubframes) -+ throws TimeoutException { -+ verifyMatchesCount(helper, num, MATCHES_HIDDEN_FUNCTION, selector, includeSubframes); -+ } -+ -+ public static void verifyDisplayedCount( -+ final TestPagesHelperBase helper, final int num, final String selector) -+ throws TimeoutException { -+ verifyDisplayedCount(helper, num, selector, IncludeSubframes.YES); -+ } -+ -+ public static void verifyDisplayedCount( -+ final TestPagesHelperBase helper, -+ final int num, -+ final String selector, -+ final IncludeSubframes includeSubframes) -+ throws TimeoutException { -+ verifyMatchesCount(helper, num, MATCHES_DISPLAYED_FUNCTION, selector, includeSubframes); -+ } -+ -+ public static void verifyCondition(final TestPagesHelperBase helper, final String predicate) -+ throws TimeoutException { -+ final String waitFunction = String.format(WAIT_FUNCTION, predicate); -+ Assert.assertEquals( -+ STATUS_OK, -+ JavaScriptUtils.runJavascriptWithAsyncResult( -+ helper.getWebContents(), waitFunction)); -+ } -+ -+ public static void verifyGreenBackground(final TestPagesHelperBase helper, final String elemId) -+ throws TimeoutException { -+ verifyCondition( -+ helper, -+ "document.getElementById('" -+ + elemId -+ + "') && " -+ + "window.getComputedStyle(document.getElementById('" -+ + elemId -+ + "')).backgroundColor == 'rgb(13, 199, 75)'"); -+ } -+ -+ // For some cases it is better to rely on page script testing element -+ // rather than invent a specific script to check condition. For example -+ // checks for rewrite filters replaces content proper way. -+ public static void verifySelfTestPass(final TestPagesHelperBase helper, final String elemId) -+ throws TimeoutException { -+ verifyCondition( -+ helper, -+ "document.getElementById('" -+ + elemId -+ + "') && " -+ + "document.getElementById('" -+ + elemId -+ + "').getAttribute('data-expectedresult') == 'pass'"); -+ } -+ -+ public static void expectResourceBlocked(final TestPagesHelperBase helper, final String elemId) -+ throws TimeoutException { -+ verifyCondition( -+ helper, -+ "document.getElementById('" -+ + elemId -+ + "') && " -+ + "window.getComputedStyle(document.getElementById('" -+ + elemId -+ + "')).display == 'none'"); -+ } -+ -+ public static void expectResourceShown(final TestPagesHelperBase helper, final String elemId) -+ throws TimeoutException { -+ verifyCondition( -+ helper, -+ "document.getElementById('" -+ + elemId -+ + "') && " -+ + "window.getComputedStyle(document.getElementById('" -+ + elemId -+ + "')).display == 'inline'"); -+ } -+ -+ public static void expectResourceStyleProperty( -+ final TestPagesHelperBase helper, -+ final String elemId, -+ final String property, -+ final String value) -+ throws TimeoutException { -+ verifyCondition( -+ helper, -+ "document.getElementById('" -+ + elemId -+ + "') && " -+ + "window.getComputedStyle(document.getElementById('" -+ + elemId -+ + "'))['" -+ + property -+ + "'] == '" -+ + value -+ + "'"); -+ } -+} diff --git a/components/adblock/android/resource_classification_notifier_android.cc b/components/adblock/android/resource_classification_notifier_android.cc new file mode 100644 --- /dev/null