diff --git a/DEPS b/DEPS index 3e162f37..b1fca74 100644 --- a/DEPS +++ b/DEPS
@@ -295,15 +295,15 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling Skia # and whatever else without interference from each other. - 'skia_revision': '768ace3fd14422db1cb326e1abc69f51efe2d74a', + 'skia_revision': 'c15b236c12edeb2ad43d650d6e0df5a4fec068ab', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling V8 # and whatever else without interference from each other. - 'v8_revision': '6f17f338ff1df4623bfdca257fe911442c35f60f', + 'v8_revision': '5d83ccf80ddd9959325fde53ce0b9869e76505b8', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling ANGLE # and whatever else without interference from each other. - 'angle_revision': 'e4007fff3335258e97e5e8b9569d8d698df820c9', + 'angle_revision': 'c8209fec9a5f8d4eef073fb21a8db0c7d51c531d', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling SwiftShader # and whatever else without interference from each other. @@ -359,7 +359,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling catapult # and whatever else without interference from each other. - 'catapult_revision': '5b2aa8309e962decb237aefa7e3c39df5f38dfcf', + 'catapult_revision': '1addc95539476f179b854ae82c1ae6aa7bdffcbc', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling CrossBench # and whatever else without interference from each other. @@ -403,7 +403,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. - 'dawn_revision': 'fb4d36177feeea4831be2d0ba5d845149ac4f105', + 'dawn_revision': '564c7c94378c0ef081277fe57ca14a2d9dc35476', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. @@ -507,7 +507,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling llvm-libc # and whatever else without interference from each other. - 'llvm_libc_revision': '73cbf2b1662754e29ac2698830b7952c80f22b62', + 'llvm_libc_revision': 'ebfb379c5464568cd3961cdf60e55dee9f512098', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling llvm-libc # and whatever else without interference from each other. @@ -515,7 +515,7 @@ # If you change this, also update the libc++ revision in # //buildtools/deps_revisions.gni. - 'libcxx_revision': 'ed0f32ee7a8d9481bfd26cfa6f5940b9f296f371', + 'libcxx_revision': 'be9dd89ffbfdf2b6cf6b9c5ec076d6adbc5d25a6', # GN CIPD package version. 'gn_version': 'git_revision:4cfb717bbd5ecfcf63af3cb4487da5ea4777ef67', @@ -1178,7 +1178,7 @@ 'packages': [ { 'package': 'chromium/chrome/android/orderfiles/arm', - 'version': 'EFizASCPlMxxxhGvPKjNC1G8Msaeeg-DXCe40KTY04MC', + 'version': '8TrZckM-d0znyn0yuKDz95mtv2k95nCIxNTDUpXoUZ4C', }, ], 'condition': 'checkout_android', @@ -1189,7 +1189,7 @@ 'packages': [ { 'package': 'chromium/chrome/android/orderfiles/arm64', - 'version': 'Dx9VhIMwnCX73bAra_KPdZVE6Gd6-m062Max3kwfRQsC', + 'version': 'Q0o8xJ0FZgassGCKpJVAvW_gvHPG5QLi3_ZX38kZGt0C', }, ], 'condition': 'checkout_android', @@ -1592,12 +1592,12 @@ 'src/clank': { 'url': Var('chrome_git') + '/clank/internal/apps.git' + '@' + - 'e1012395eec3db1f82de8817f9f439253fe87155', + 'dccbc9a6d7146b71f54ed6f3bc739c3c3a5098b5', 'condition': 'checkout_android and checkout_src_internal', }, 'src/docs/website': { - 'url': Var('chromium_git') + '/website.git' + '@' + 'a96616b68569bc8dc258cb570fd1b2f9122ce85e', + 'url': Var('chromium_git') + '/website.git' + '@' + '1906b0bbaa142dc87acd171137d5a234aeba74c8', }, 'src/ios/third_party/earl_grey2/src': { @@ -1742,7 +1742,7 @@ 'packages': [ { 'package': 'chromium/third_party/androidx', - 'version': 'gemT-xzcoRzj_jJb3kOedn9ppuIIqXw8nDxbFMlLfrIC', + 'version': 'KfW884hqD9iK8mAo1aUw4nHlSXkFtVZCTBlo8NsUq38C', }, ], 'condition': 'checkout_android and non_git_source', @@ -2612,7 +2612,7 @@ Var('pdfium_git') + '/pdfium.git' + '@' + Var('pdfium_revision'), 'src/third_party/perfetto': - Var('chromium_git') + '/external/github.com/google/perfetto.git' + '@' + '9231d0a42f8fc75aa3ba973269f3ee9a0c195b95', + Var('chromium_git') + '/external/github.com/google/perfetto.git' + '@' + '83bcbbbf67ed17934ddd3b667ed19c120c9ed504', 'src/base/tracing/test/data': { 'bucket': 'perfetto', @@ -3680,7 +3680,7 @@ 'src/components/optimization_guide/internal': { 'url': Var('chrome_git') + '/chrome/components/optimization_guide.git' + '@' + - '0a8ac7a60d6948d9a88faf17024a73657cb8a8b0', + 'c66de765dcd2a1b6a180828665edf21f1403a832', 'condition': 'checkout_src_internal', },
diff --git a/PRESUBMIT.py b/PRESUBMIT.py index b8a59b2..a8fdd96 100644 --- a/PRESUBMIT.py +++ b/PRESUBMIT.py
@@ -4894,7 +4894,8 @@ else: # Report non cr Log function calls in changed lines for line_num, line in f.ChangedContents(): - if log_call_pattern.search(line): + if (log_call_pattern.search(line) + or has_some_log_import_pattern.search(line)): util_log_errors.append("%s:%d" % (f.LocalPath(), line_num)) # Per file checks
diff --git a/PRESUBMIT_test.py b/PRESUBMIT_test.py index 72bee12..d193f208 100755 --- a/PRESUBMIT_test.py +++ b/PRESUBMIT_test.py
@@ -1777,9 +1777,11 @@ # Util Log usage nb = len(msgs[3].items) self.assertEqual( - 3, nb, 'Expected %d items, found %d: %s' % (3, nb, msgs[3].items)) + 5, nb, 'Expected %d items, found %d: %s' % (3, nb, msgs[3].items)) + self.assertTrue('HasAndroidLog.java:1' in msgs[3].items) self.assertTrue('HasAndroidLog.java:3' in msgs[3].items) self.assertTrue('HasExplicitUtilLog.java:2' in msgs[3].items) + self.assertTrue('IsInBasePackageButImportsLog.java:2' in msgs[3].items) self.assertTrue('IsInBasePackageButImportsLog.java:4' in msgs[3].items) # Tag must not contain
diff --git a/android_webview/browser/aw_settings.cc b/android_webview/browser/aw_settings.cc index a2e9bdf..c2dbe2b 100644 --- a/android_webview/browser/aw_settings.cc +++ b/android_webview/browser/aw_settings.cc
@@ -615,7 +615,8 @@ PopulateFixedWebPreferences(web_prefs); web_prefs->text_autosizing_enabled = - Java_AwSettings_getTextAutosizingEnabledLocked(env, obj); + Java_AwSettings_getTextAutosizingEnabledLocked(env, obj) && + !base::FeatureList::IsEnabled(blink::features::kForceOffTextAutosizing); int text_size_percent = Java_AwSettings_getTextSizePercentLocked(env, obj); if (web_prefs->text_autosizing_enabled) {
diff --git a/android_webview/common/DEPS b/android_webview/common/DEPS index fbc7acc..87c0747 100644 --- a/android_webview/common/DEPS +++ b/android_webview/common/DEPS
@@ -15,5 +15,6 @@ "+components/safe_browsing/core/common/features.h", "+components/sensitive_content/features.h", "+components/viz/common/features.h", + "+third_party/blink/public/common/features.h", ] }
diff --git a/android_webview/common/aw_feature_map.cc b/android_webview/common/aw_feature_map.cc index 0cfaf75..750fc7f 100644 --- a/android_webview/common/aw_feature_map.cc +++ b/android_webview/common/aw_feature_map.cc
@@ -13,6 +13,7 @@ #include "components/sensitive_content/features.h" #include "components/viz/common/features.h" #include "content/public/common/content_features.h" +#include "third_party/blink/public/common/features.h" // Must come after all headers that specialize FromJniType() / ToJniType(). #include "android_webview/common_jni/AwFeatureMap_jni.h" @@ -29,6 +30,7 @@ // keep-sorted start allow_yaml_lists=yes by_regex=['\w+,'] &features::kAndroidMetricsAsyncMetricLogging, &base::features::kCollectAndroidFrameTimelineMetrics, + &blink::features::kForceOffTextAutosizing, &safe_browsing::kHashPrefixRealTimeLookups, &base::features::kPostGetMyMemoryStateToBackground, &::features::kPrefetchBrowserInitiatedTriggers,
diff --git a/android_webview/common/crash_reporter/crash_keys.cc b/android_webview/common/crash_reporter/crash_keys.cc index ab3f481f..c639a44f 100644 --- a/android_webview/common/crash_reporter/crash_keys.cc +++ b/android_webview/common/crash_reporter/crash_keys.cc
@@ -170,6 +170,7 @@ // sandbox/linux "seccomp-sigsys", + "seccomp-sigsys-ioctl", kWeblayerWebViewCompatMode,
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/AwSettingsTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/AwSettingsTest.java index 72cde92..2084704 100644 --- a/android_webview/javatests/src/org/chromium/android_webview/test/AwSettingsTest.java +++ b/android_webview/javatests/src/org/chromium/android_webview/test/AwSettingsTest.java
@@ -48,8 +48,11 @@ import org.chromium.base.test.util.CommandLineFlags; import org.chromium.base.test.util.DisabledTest; import org.chromium.base.test.util.Feature; +import org.chromium.base.test.util.Features.DisableFeatures; +import org.chromium.base.test.util.Features.EnableFeatures; import org.chromium.base.test.util.TestFileUtil; import org.chromium.base.test.util.UrlUtils; +import org.chromium.blink_public.common.BlinkFeatures; import org.chromium.components.embedder_support.util.WebResourceResponseInfo; import org.chromium.content_public.browser.ContentFeatureList; import org.chromium.content_public.browser.ContentFeatureMap; @@ -917,10 +920,13 @@ protected static final float PARAGRAPH_FONT_SIZE = 14.0f; AwSettingsTextAutosizingTestHelper( - AwTestContainerView containerView, TestAwContentsClient contentViewClient) + AwTestContainerView containerView, + TestAwContentsClient contentViewClient, + boolean isAutosizingEnabled) throws Throwable { super(containerView, contentViewClient, true); mNeedToWaitForFontSizeChange = false; + mAutosizingEnabled = isAutosizingEnabled; loadDataSync(getData()); } @@ -982,15 +988,18 @@ return sb.toString(); } - private boolean mNeedToWaitForFontSizeChange; + protected boolean mNeedToWaitForFontSizeChange; + protected boolean mAutosizingEnabled; private float mOldFontSize; } class AwSettingsLayoutAlgorithmTestHelper extends AwSettingsTextAutosizingTestHelper<Integer> { AwSettingsLayoutAlgorithmTestHelper( - AwTestContainerView containerView, TestAwContentsClient contentViewClient) + AwTestContainerView containerView, + TestAwContentsClient contentViewClient, + boolean isAutosizingEnabled) throws Throwable { - super(containerView, contentViewClient); + super(containerView, contentViewClient, isAutosizingEnabled); // Font autosizing doesn't step in for narrow layout widths. mAwSettings.setUseWideViewPort(true); } @@ -1017,19 +1026,26 @@ protected void setCurrentValue(@LayoutAlgorithm Integer value) throws Throwable { super.setCurrentValue(value); mAwSettings.setLayoutAlgorithm(value); + if (!mAutosizingEnabled) { + mNeedToWaitForFontSizeChange = false; + } } @Override protected void doEnsureSettingHasValue(@LayoutAlgorithm Integer value) throws Throwable { final float actualFontSize = getActualFontSize(); - if (value == AwSettings.LAYOUT_ALGORITHM_TEXT_AUTOSIZING) { - Assert.assertFalse( + if (value == AwSettings.LAYOUT_ALGORITHM_TEXT_AUTOSIZING && mAutosizingEnabled) { + Assert.assertNotEquals( "Actual font size: " + actualFontSize, - actualFontSize == PARAGRAPH_FONT_SIZE); + actualFontSize, + PARAGRAPH_FONT_SIZE, + 0.1); } else { - Assert.assertTrue( + Assert.assertEquals( "Actual font size: " + actualFontSize, - actualFontSize == PARAGRAPH_FONT_SIZE); + actualFontSize, + PARAGRAPH_FONT_SIZE, + 0.1); } } } @@ -1039,9 +1055,11 @@ private final float mInitialActualFontSize; AwSettingsTextZoomTestHelper( - AwTestContainerView containerView, TestAwContentsClient contentViewClient) + AwTestContainerView containerView, + TestAwContentsClient contentViewClient, + boolean isAutosizingEnabled) throws Throwable { - super(containerView, contentViewClient); + super(containerView, contentViewClient, isAutosizingEnabled); mInitialActualFontSize = getActualFontSize(); } @@ -1096,9 +1114,11 @@ private final float mInitialActualFontSize; AwSettingsTextZoomAutosizingTestHelper( - AwTestContainerView containerView, TestAwContentsClient contentViewClient) + AwTestContainerView containerView, + TestAwContentsClient contentViewClient, + boolean isAutosizingEnabled) throws Throwable { - super(containerView, contentViewClient); + super(containerView, contentViewClient, isAutosizingEnabled); mAwSettings.setLayoutAlgorithm(AwSettings.LAYOUT_ALGORITHM_TEXT_AUTOSIZING); // The initial font size can be adjusted by font autosizer depending on the page's // viewport width. @@ -2896,34 +2916,76 @@ @Test @SmallTest + @EnableFeatures(BlinkFeatures.FORCE_OFF_TEXT_AUTOSIZING) @Feature({"AndroidWebView", "Preferences"}) - public void testLayoutAlgorithmWithTwoViews() throws Throwable { + public void testLayoutAlgorithmWithTwoViewsWithTextAutosizingDisabled() throws Throwable { ViewPair views = createViews(); runPerViewSettingsTest( - new AwSettingsLayoutAlgorithmTestHelper(views.getContainer0(), views.getClient0()), - new AwSettingsLayoutAlgorithmTestHelper(views.getContainer1(), views.getClient1())); + new AwSettingsLayoutAlgorithmTestHelper( + views.getContainer0(), views.getClient0(), false), + new AwSettingsLayoutAlgorithmTestHelper( + views.getContainer1(), views.getClient1(), false)); } @Test @SmallTest + @DisableFeatures(BlinkFeatures.FORCE_OFF_TEXT_AUTOSIZING) @Feature({"AndroidWebView", "Preferences"}) - public void testTextZoomWithTwoViews() throws Throwable { + public void testLayoutAlgorithmWithTwoViewsWithTextAutosizingEnabled() throws Throwable { ViewPair views = createViews(); runPerViewSettingsTest( - new AwSettingsTextZoomTestHelper(views.getContainer0(), views.getClient0()), - new AwSettingsTextZoomTestHelper(views.getContainer1(), views.getClient1())); + new AwSettingsLayoutAlgorithmTestHelper( + views.getContainer0(), views.getClient0(), true), + new AwSettingsLayoutAlgorithmTestHelper( + views.getContainer1(), views.getClient1(), true)); } @Test @SmallTest + @EnableFeatures(BlinkFeatures.FORCE_OFF_TEXT_AUTOSIZING) @Feature({"AndroidWebView", "Preferences"}) - public void testTextZoomAutosizingWithTwoViews() throws Throwable { + public void testTextZoomWithTwoViewsWithTextAutosizingDisabled() throws Throwable { + ViewPair views = createViews(); + runPerViewSettingsTest( + new AwSettingsTextZoomTestHelper(views.getContainer0(), views.getClient0(), false), + new AwSettingsTextZoomTestHelper(views.getContainer1(), views.getClient1(), false)); + } + + @Test + @SmallTest + @DisableFeatures(BlinkFeatures.FORCE_OFF_TEXT_AUTOSIZING) + @Feature({"AndroidWebView", "Preferences"}) + public void testTextZoomWithTwoViewsWithTextAutosizingEnabled() throws Throwable { + ViewPair views = createViews(); + runPerViewSettingsTest( + new AwSettingsTextZoomTestHelper(views.getContainer0(), views.getClient0(), true), + new AwSettingsTextZoomTestHelper(views.getContainer1(), views.getClient1(), true)); + } + + @Test + @SmallTest + @EnableFeatures(BlinkFeatures.FORCE_OFF_TEXT_AUTOSIZING) + @Feature({"AndroidWebView", "Preferences"}) + public void testTextZoomAutosizingWithTwoViewsWithTextAutosizingDisabled() throws Throwable { ViewPair views = createViews(); runPerViewSettingsTest( new AwSettingsTextZoomAutosizingTestHelper( - views.getContainer0(), views.getClient0()), + views.getContainer0(), views.getClient0(), false), new AwSettingsTextZoomAutosizingTestHelper( - views.getContainer1(), views.getClient1())); + views.getContainer1(), views.getClient1(), false)); + } + + @Test + @SmallTest + @DisableFeatures(BlinkFeatures.FORCE_OFF_TEXT_AUTOSIZING) + @Feature({"AndroidWebView", "Preferences"}) + public void testTextZoomAutosizingWithTwoViewsWithTextAutosizingEnabled() throws Throwable { + ViewPair views = createViews(); + runPerViewSettingsTest( + new AwSettingsTextZoomAutosizingTestHelper( + views.getContainer0(), views.getClient0(), true), + new AwSettingsTextZoomAutosizingTestHelper( + views.getContainer1(), views.getClient1(), true)); } @Test @@ -3948,17 +4010,18 @@ /** * Verifies the following statements about a setting: - * + * * <pre> * - initially, the setting has a default value; * - the setting can be switched to an alternate value and back; * - switching a setting in the first WebView doesn't affect the setting * state in the second WebView and vice versa. * </pre> + * * @param helper0 Test helper for the first ContentView * @param helper1 Test helper for the second ContentView */ - private void runPerViewSettingsTest( + private void runPerViewSettingsTest( AwSettingsTestHelper<?> helper0, AwSettingsTestHelper<?> helper1) throws Throwable { helper0.ensureSettingHasInitialValue(); helper1.ensureSettingHasInitialValue();
diff --git a/buildtools/deps_revisions.gni b/buildtools/deps_revisions.gni index c691869..2be6871 100644 --- a/buildtools/deps_revisions.gni +++ b/buildtools/deps_revisions.gni
@@ -5,5 +5,5 @@ declare_args() { # Used to cause full rebuilds on libc++ rolls. This should be kept in sync # with the libcxx_revision var in //DEPS. - libcxx_revision = "ed0f32ee7a8d9481bfd26cfa6f5940b9f296f371" + libcxx_revision = "be9dd89ffbfdf2b6cf6b9c5ec076d6adbc5d25a6" }
diff --git a/chrome/BUILD.gn b/chrome/BUILD.gn index cfdf421..84fea80c 100644 --- a/chrome/BUILD.gn +++ b/chrome/BUILD.gn
@@ -1422,7 +1422,7 @@ "//components/memory_system", "//components/startup_metric_utils", "//components/sync", - "//components/upload_list:upload_list", + "//components/upload_list", "//components/webui/about", "//content/public/child", "//pdf", @@ -1505,7 +1505,7 @@ group("extra_resources") { # Deps should be same as those in chrome_extra_paks() within chrome_paks.gni. public_deps = [ - "//chrome/browser/resources:resources", + "//chrome/browser/resources", "//components/autofill/core/browser:autofill_address_rewriter_resources", ] }
diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn index d2da90f..d12956f 100644 --- a/chrome/android/BUILD.gn +++ b/chrome/android/BUILD.gn
@@ -518,6 +518,8 @@ "//chrome/browser/ui/android/edge_to_edge:java", "//chrome/browser/ui/android/ephemeraltab:java", "//chrome/browser/ui/android/extensions:java", + "//chrome/browser/ui/android/extensions/windowing:factory_java", + "//chrome/browser/ui/android/extensions/windowing:java", "//chrome/browser/ui/android/fast_checkout:java", "//chrome/browser/ui/android/favicon:java", "//chrome/browser/ui/android/google_bottom_bar:java", @@ -545,6 +547,8 @@ "//chrome/browser/ui/android/toolbar:java", "//chrome/browser/ui/android/web_app_header:java", "//chrome/browser/ui/android/whats_new:java", + "//chrome/browser/ui/browser_window:factory_java", + "//chrome/browser/ui/browser_window:java", "//chrome/browser/ui/messages/android:java", "//chrome/browser/ui/plus_addresses/android:java", "//chrome/browser/uid/android:java", @@ -943,6 +947,12 @@ "//chrome/browser/ui/android/extensions/windowing/internal:java", "//chrome/browser/ui/browser_window/internal:java", ] + } else { + # TODO(crbug.com/434123514): see if we can remove these stub targets. + deps += [ + "//chrome/browser/ui/android/extensions/windowing/stub:java", + "//chrome/browser/ui/browser_window/stub:java", + ] } } @@ -2405,6 +2415,13 @@ "//components/ip_protection/android/android_auth_client_lib/javatests:ip_protection_auth_javatests", ] + if (is_desktop_android) { + deps += [ + "//chrome/browser/ui/android/extensions/windowing/internal:javatests", + "//chrome/browser/ui/browser_window/internal:javatests", + ] + } + data_deps = [ "//testing/buildbot/filters:chrome_public_test_apk_filters" ] if (enable_chrome_android_internal) {
diff --git a/chrome/android/features/tab_ui/BUILD.gn b/chrome/android/features/tab_ui/BUILD.gn index eaf4c9b..3c65c16 100644 --- a/chrome/android/features/tab_ui/BUILD.gn +++ b/chrome/android/features/tab_ui/BUILD.gn
@@ -189,7 +189,7 @@ "//third_party/hamcrest:hamcrest_core_java", "//third_party/hamcrest:hamcrest_library_java", "//third_party/jni_zero:jni_zero_java", - "//third_party/junit:junit", + "//third_party/junit", "//third_party/mockito:mockito_java", "//ui/accessibility:ax_base_java", "//ui/android:ui_java_test_support", @@ -234,7 +234,7 @@ "//third_party/androidx:androidx_test_monitor_java", "//third_party/hamcrest:hamcrest_java", "//third_party/hamcrest:hamcrest_library_java", - "//third_party/junit:junit", + "//third_party/junit", "//ui/android:ui_no_recycler_view_java", ] }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java index 8b4fe0b..de61fdd8 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
@@ -273,8 +273,10 @@ import org.chromium.chrome.browser.ui.IncognitoRestoreAppLaunchDrawBlockerFactory; import org.chromium.chrome.browser.ui.RootUiCoordinator; import org.chromium.chrome.browser.ui.appmenu.AppMenuPropertiesDelegate; +import org.chromium.chrome.browser.ui.browser_window.ChromeAndroidTaskTrackerFactory; 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.extensions.windowing.ExtensionWindowControllerBridgeFactory; 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; @@ -1232,6 +1234,30 @@ } } + private void initializeExtensionWindowControllerBridge() { + try (TraceEvent e = + TraceEvent.scoped( + "ChromeTabbedActivity.initializeExtensionWindowControllerBridge")) { + var chromeAndroidTaskTracker = ChromeAndroidTaskTrackerFactory.getInstance(); + if (chromeAndroidTaskTracker == null) { + return; + } + + var activityWindowAndroid = getWindowAndroid(); + assert activityWindowAndroid != null; + + var chromeAndroidTask = chromeAndroidTaskTracker.obtainTask(activityWindowAndroid); + + var extensionWindowControllerBridge = + ExtensionWindowControllerBridgeFactory.create(chromeAndroidTask); + if (extensionWindowControllerBridge == null) { + return; + } + + chromeAndroidTask.addFeature(extensionWindowControllerBridge); + } + } + private void maybeCreateIncognitoTabSnapshotController() { try (TraceEvent e = TraceEvent.scoped( @@ -1352,6 +1378,10 @@ PostTask.postTask( TaskTraits.UI_DEFAULT, mCallbackController.makeCancelable( + this::initializeExtensionWindowControllerBridge)); + PostTask.postTask( + TaskTraits.UI_DEFAULT, + mCallbackController.makeCancelable( this::maybeCreateIncognitoTabSnapshotController)); // Always call into this function, even if BackPressManager is disabled to initialize // back press managers which reduce code duplication in this class.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeWindow.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeWindow.java index 189bfbb..279a87cb 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeWindow.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeWindow.java
@@ -13,6 +13,8 @@ import org.chromium.base.supplier.Supplier; import org.chromium.chrome.browser.compositor.CompositorViewHolder; import org.chromium.chrome.browser.keyboard_accessory.ManualFillingComponent; +import org.chromium.chrome.browser.ui.browser_window.ChromeAndroidTask; +import org.chromium.chrome.browser.ui.browser_window.ChromeAndroidTaskTrackerFactory; import org.chromium.ui.base.ActivityKeyboardVisibilityDelegate; import org.chromium.ui.base.ActivityWindowAndroid; import org.chromium.ui.base.IntentRequestTracker; @@ -98,6 +100,24 @@ } @Override + public void destroy() { + clearActivityWindowAndroidFromChromeAndroidTask(); + + // It's not 100% correct to destroy the ChromeAndroidTask here as a ChromeAndroidTask + // is meant to track an Android Task, but a ChromeWindow is associated with a + // ChromeActivity. + // + // However, as of July 22, 2025, Android framework doesn't provide an API that listens for + // Task removal, so we need to destroy the ChromeAndroidTask here as a workaround. + // + // In the future, we can register a Task listener when a ChromeAndroidTask is created, then + // destroy it when notified of the Task removal. + destroyChromeAndroidTask(); + + super.destroy(); + } + + @Override public View getReadbackView() { return mCompositorViewHolderSupplier.get() == null ? null @@ -120,4 +140,31 @@ public static void resetKeyboardVisibilityDelegateFactory() { setKeyboardVisibilityDelegateFactory(ChromeKeyboardVisibilityDelegate::new); } + + /** See {@link ChromeAndroidTask#clearActivityWindowAndroid()}. */ + private void clearActivityWindowAndroidFromChromeAndroidTask() { + var chromeAndroidTaskTracker = ChromeAndroidTaskTrackerFactory.getInstance(); + if (chromeAndroidTaskTracker == null) { + return; + } + + var chromeAndroidTask = chromeAndroidTaskTracker.get(getTaskId()); + if (chromeAndroidTask != null) { + chromeAndroidTask.clearActivityWindowAndroid(); + } + } + + private void destroyChromeAndroidTask() { + var chromeAndroidTaskTracker = ChromeAndroidTaskTrackerFactory.getInstance(); + if (chromeAndroidTaskTracker != null) { + chromeAndroidTaskTracker.remove(getTaskId()); + } + } + + private int getTaskId() { + Activity activity = getActivity().get(); + assert activity != null; + + return activity.getTaskId(); + } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuCoordinator.java index b513dc56..cdaa64d 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuCoordinator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuCoordinator.java
@@ -6,7 +6,6 @@ import static org.chromium.build.NullUtil.assertNonNull; import static org.chromium.build.NullUtil.assumeNonNull; -import static org.chromium.ui.listmenu.ListItemType.MENU_ITEM; import static org.chromium.ui.listmenu.ListMenuItemProperties.CLICK_LISTENER; import static org.chromium.ui.listmenu.ListMenuItemProperties.MENU_ITEM_ID; @@ -62,8 +61,6 @@ @NullMarked public class ContextMenuCoordinator implements ContextMenuUi { - private static final int INVALID_ITEM_ID = -1; - @Retention(RetentionPolicy.SOURCE) @IntDef({ContextMenuItemType.HEADER, ContextMenuItemType.CONTEXT_MENU_ITEM_WITH_ICON_BUTTON}) public @interface ContextMenuItemType { @@ -362,17 +359,6 @@ mListView = menu.findViewById(R.id.context_menu_list_view); mListView.setAdapter(adapter); - // TODO(crbug.com/427797271): Clean up click handling and remove this. - mListView.setOnItemClickListener( - (p, v, pos, id) -> { - if (id == INVALID_ITEM_ID) return; - @Nullable ListItem item = findItem((int) id); - if (item == null) return; - if (item.model.containsKey(CLICK_LISTENER) && item.type == MENU_ITEM) { - item.model.get(CLICK_LISTENER).onClick(v); - } - }); - mListView.setItemsCanFocus(true); // Set the fading edge for context menu. This is guarded by drag and drop feature flag, but // ideally this could be enabled for all forms of context menu. @@ -555,7 +541,8 @@ @VisibleForTesting /* package */ static ModelListAdapter createAdapter(ModelList listItems) { ModelListAdapter adapter = - ListMenuUtils.createAdapter(listItems, Set.of(ContextMenuItemType.HEADER)); + ListMenuUtils.createAdapter( + listItems, Set.of(ContextMenuItemType.HEADER), /* delegate= */ null); // Register types / view binders not covered by the default adapter adapter.registerType( ContextMenuItemType.HEADER,
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/ViewTransitionPixelTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/ViewTransitionPixelTest.java index 2e4431a..9ab894f 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/ViewTransitionPixelTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/ViewTransitionPixelTest.java
@@ -148,7 +148,7 @@ assertWaitForKeyboardStatus(true); - double keyboardHeight = getKeyboardHeightDp(); + int keyboardHeight = getKeyboardHeightPx(); if (mVirtualKeyboardMode == VirtualKeyboardMode.RESIZES_VISUAL) { mViewportTestUtils.waitForExpectedVisualViewportHeight( @@ -178,17 +178,11 @@ } } - private double getKeyboardHeightDp() { - double keyboardHeightPx = - mActivityTestRule - .getKeyboardDelegate() - .calculateTotalKeyboardHeight( - mActivityTestRule - .getActivity() - .getWindow() - .getDecorView() - .getRootView()); - return keyboardHeightPx / mViewportTestUtils.getDeviceScaleFactor(); + private int getKeyboardHeightPx() { + return mActivityTestRule + .getKeyboardDelegate() + .calculateTotalKeyboardHeight( + mActivityTestRule.getActivity().getWindow().getDecorView().getRootView()); } private void setLocationAndWaitForLoad(String url) {
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/ViewportTestUtils.java b/chrome/android/javatests/src/org/chromium/chrome/browser/ViewportTestUtils.java index 0842cd1..a1b2b15 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/ViewportTestUtils.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/ViewportTestUtils.java
@@ -4,6 +4,8 @@ package org.chromium.chrome.browser; +import androidx.annotation.Px; + import org.hamcrest.Matchers; import org.junit.Assert; @@ -15,7 +17,6 @@ import org.chromium.chrome.browser.browser_controls.BrowserControlsStateProvider; import org.chromium.chrome.browser.fullscreen.FullscreenManagerTestUtils; import org.chromium.chrome.browser.tab.TabStateBrowserControlsVisibilityDelegate; -import org.chromium.chrome.browser.ui.edge_to_edge.EdgeToEdgeController; import org.chromium.chrome.test.transit.BaseCtaTransitTestRule; import org.chromium.content_public.browser.WebContents; import org.chromium.content_public.browser.test.util.Coordinates; @@ -71,12 +72,12 @@ mActivityTestRule.getActivity().getActivityTab()); waitForFramePresented(); int initialPageHeight = getPageInnerHeightPx(); - int initialBottomInset = getBottomInsetHeightDp(); + int initialBottomMargin = getBottomMargins(); FullscreenManagerTestUtils.waitForBrowserControlsToBeMoveable( mActivityTestRule.getActivity(), /* showControls= */ false); // Also wait for the browser controls to resize Blink before returning. - int finalHeight = initialPageHeight + getTopControlsHeightDp() + initialBottomInset; + int finalHeight = initialPageHeight + getTopControlsHeightPx() + initialBottomMargin; waitForExpectedPageHeight(finalHeight); } @@ -155,23 +156,29 @@ return (int) Math.floor(getTopControlsHeightPx() / getDeviceScaleFactor()); } - public int getBottomInsetHeightDp() { - EdgeToEdgeController e2eController = - mActivityTestRule.getActivity().getEdgeToEdgeControllerSupplierForTesting().get(); - // Returns zero if the inset is not scrollable. - return e2eController != null ? e2eController.getBottomInset() : 0; + public @Px int getBottomMargins() { + BrowserControlsStateProvider browserControlsStateProvider = + mActivityTestRule.getActivity().getBrowserControlsManager(); + return browserControlsStateProvider.getBottomControlsHeight() + - browserControlsStateProvider.getBottomControlOffset(); } public int getPageInnerHeightPx() throws Throwable { - return Integer.parseInt( - JavaScriptUtils.executeJavaScriptAndWaitForResult( - getWebContents(), "window.innerHeight")); + return (int) + Math.round( + getDeviceScaleFactor() + * Integer.parseInt( + JavaScriptUtils.executeJavaScriptAndWaitForResult( + getWebContents(), "window.innerHeight"))); } - public double getVisualViewportHeightPx() throws Throwable { - return Float.parseFloat( - JavaScriptUtils.executeJavaScriptAndWaitForResult( - getWebContents(), "window.visualViewport.height")); + public int getVisualViewportHeightPx() throws Throwable { + return (int) + Math.round( + getDeviceScaleFactor() + * Float.parseFloat( + JavaScriptUtils.executeJavaScriptAndWaitForResult( + getWebContents(), "window.visualViewport.height"))); } private WebContents getWebContents() {
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/gesturenav/NavigationTransitionsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/gesturenav/NavigationTransitionsTest.java index db805b9..d78f0ec 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/gesturenav/NavigationTransitionsTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/gesturenav/NavigationTransitionsTest.java
@@ -687,7 +687,6 @@ */ @Test @MediumTest - @DisabledTest(message = "https://crbug.com/431044324") public void startBackNavWithTopControlHidden() throws Throwable { if (mTestNavigationMode == NAVIGATION_MODE_GESTURAL && VERSION.SDK_INT < VERSION_CODES.UPSIDE_DOWN_CAKE) return;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/input/SelectPopupOtherContentViewTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/input/SelectPopupOtherContentViewTest.java index a4fe46c..6f58f19 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/input/SelectPopupOtherContentViewTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/input/SelectPopupOtherContentViewTest.java
@@ -15,7 +15,6 @@ import org.chromium.base.ThreadUtils; import org.chromium.base.test.util.CommandLineFlags; import org.chromium.base.test.util.CriteriaHelper; -import org.chromium.base.test.util.DisabledTest; import org.chromium.base.test.util.Feature; import org.chromium.base.test.util.UrlUtils; import org.chromium.chrome.browser.app.ChromeActivity; @@ -69,7 +68,6 @@ @Test @LargeTest @Feature({"Browser"}) - @DisabledTest(message = "Flaky, crbug.com/407059641") public void testPopupNotClosedByOtherContentView() throws Exception, Throwable { // Load the test page. WebPageStation page = mActivityTestRule.startOnUrl(SELECT_URL);
diff --git a/chrome/android/modules/readaloud/public/BUILD.gn b/chrome/android/modules/readaloud/public/BUILD.gn index 29d2601..4bb43f6 100644 --- a/chrome/android/modules/readaloud/public/BUILD.gn +++ b/chrome/android/modules/readaloud/public/BUILD.gn
@@ -29,8 +29,8 @@ "//components/browser_ui/styles/android:java", "//components/prefs/android:java", "//content/public/android:content_java", - "//third_party/androidx:androidx_annotation_annotation_java", "//third_party/android_deps:guava_android_java", + "//third_party/androidx:androidx_annotation_annotation_java", "//ui/android:ui_no_recycler_view_java", ] }
diff --git a/chrome/app/BUILD.gn b/chrome/app/BUILD.gn index 2f7ac35f..f64530c 100644 --- a/chrome/app/BUILD.gn +++ b/chrome/app/BUILD.gn
@@ -60,7 +60,7 @@ "exit_code_watcher_win.cc", "exit_code_watcher_win.h", ] - public_deps = [ "//base:base" ] + public_deps = [ "//base" ] } source_set("win_unit_tests") { @@ -71,10 +71,10 @@ ] deps = [ ":exit_code_watcher", - "//base:base", + "//base", "//base/test:test_support", "//chrome/chrome_elf:crash", - "//testing/gtest:gtest", + "//testing/gtest", ] } }
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd index 7c72081..5803510 100644 --- a/chrome/app/generated_resources.grd +++ b/chrome/app/generated_resources.grd
@@ -8506,7 +8506,7 @@ Dismiss </message> <message name="IDS_NTP_COMPOSE_CANCEL_BUTTON_A11Y_LABEL_INPUT" desc="The accessibility label for the cancel button on the compose box when there is input." translateable="false"> - Dismiss entry + Clear </message> <message name="IDS_NTP_COMPOSE_IMAGE_UPLOAD_BUTTON_A11Y_LABEL" desc="The accessibility label for the image upload button on the compose box."> Upload an image
diff --git a/chrome/app/generated_resources_grd/IDS_NTP_COMPOSE_CANCEL_BUTTON_A11Y_LABEL_INPUT.png.sha1 b/chrome/app/generated_resources_grd/IDS_NTP_COMPOSE_CANCEL_BUTTON_A11Y_LABEL_INPUT.png.sha1 index d9ea28b2..8d24424 100644 --- a/chrome/app/generated_resources_grd/IDS_NTP_COMPOSE_CANCEL_BUTTON_A11Y_LABEL_INPUT.png.sha1 +++ b/chrome/app/generated_resources_grd/IDS_NTP_COMPOSE_CANCEL_BUTTON_A11Y_LABEL_INPUT.png.sha1
@@ -1 +1 @@ -6042018b0a8cd8b03e6ca5d67bd4bec463aa70ac \ No newline at end of file +cd9e862e12165dbbf9afa65a2c0e072552795dc0 \ No newline at end of file
diff --git a/chrome/app/glic_strings.grdp b/chrome/app/glic_strings.grdp index e729a28..511fae3 100644 --- a/chrome/app/glic_strings.grdp +++ b/chrome/app/glic_strings.grdp
@@ -30,16 +30,6 @@ Customize Keyboard Shortcut... </message> </if> - <if expr="is_macosx"> - <message name="IDS_GLIC_STATUS_ICON_MENU_REMOVE_ICON" translateable="false" desc="This is the menu item for removing the Gemini status icon from the menu bar."> - Don't show Gemini in menu bar - </message> - </if> - <if expr="is_win or is_linux"> - <message name="IDS_GLIC_STATUS_ICON_MENU_REMOVE_ICON" translateable="false" desc="This is the menu item for removing the Gemini status icon from the notifications area."> - Don't show Gemini in notifications area - </message> - </if> <if expr="is_win or is_linux"> <message name="IDS_GLIC_STATUS_ICON_MENU_EXIT" translateable="false" desc="This is the menu item for exiting Chrome."> Exit @@ -199,6 +189,12 @@ <message name="IDS_SETTINGS_GLIC_PERMISSIONS_ACTIVITY_BUTTON_URL" translateable="false" desc="URL to navigate when clicking the 'manage your activity' button."> https://myactivity.google.com/product/gemini?utm_source=gemini </message> + <message name="IDS_SETTINGS_GLIC_EXTENSIONS_BUTTON" translateable="false" desc="Name of the Gemini Extensions link out."> + Manage connected apps + </message> + <message name="IDS_SETTINGS_GLIC_EXTENSIONS_BUTTON_SUBLABEL" translateable="false" desc="Sublabel describing that this link allows the user to manage Gemini connected apps."> + Manage which apps Gemini connects to + </message> <message name="IDS_SETTINGS_GLIC_PERMISSIONS_TAB_ACCESS_WHEN_ON_1" translateable="false" desc="First point in the 'when on' column of the 'tab access' expando"> You’ll get more relevant answers related to the page content you’re sharing </message>
diff --git a/chrome/app/glic_strings_grdp/IDS_SETTINGS_GLIC_EXTENSIONS_BUTTON.png.sha1 b/chrome/app/glic_strings_grdp/IDS_SETTINGS_GLIC_EXTENSIONS_BUTTON.png.sha1 new file mode 100644 index 0000000..5bee7a64 --- /dev/null +++ b/chrome/app/glic_strings_grdp/IDS_SETTINGS_GLIC_EXTENSIONS_BUTTON.png.sha1
@@ -0,0 +1 @@ +710affa08e389c3cf70ae58540faa997ab34b371 \ No newline at end of file
diff --git a/chrome/app/glic_strings_grdp/IDS_SETTINGS_GLIC_EXTENSIONS_BUTTON_SUBLABEL.png.sha1 b/chrome/app/glic_strings_grdp/IDS_SETTINGS_GLIC_EXTENSIONS_BUTTON_SUBLABEL.png.sha1 new file mode 100644 index 0000000..1b97197 --- /dev/null +++ b/chrome/app/glic_strings_grdp/IDS_SETTINGS_GLIC_EXTENSIONS_BUTTON_SUBLABEL.png.sha1
@@ -0,0 +1 @@ +38e3c95ab29a0811b441346ed784494b21254dd9 \ No newline at end of file
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc index 7ca4b26..aa76b0c6 100644 --- a/chrome/browser/about_flags.cc +++ b/chrome/browser/about_flags.cc
@@ -6887,10 +6887,6 @@ flag_descriptions::kOmniboxShowPopupOnMouseReleasedDescription, kOsDesktop, FEATURE_VALUE_TYPE(omnibox::kShowPopupOnMouseReleased)}, - {"omnibox-site-search", flag_descriptions::kOmniboxSiteSearchName, - flag_descriptions::kOmniboxSiteSearchDescription, kOsAndroid, - FEATURE_VALUE_TYPE(omnibox::kOmniboxSiteSearch)}, - {"omnibox-hide-suggestion-group-headers", flag_descriptions::kOmniboxHideSuggestionGroupHeadersName, flag_descriptions::kOmniboxHideSuggestionGroupHeadersDescription, @@ -6954,6 +6950,10 @@ flag_descriptions::kOmniboxMultilineEditFieldDescription, kOsAndroid, FEATURE_VALUE_TYPE(omnibox::kMultilineEditField)}, + {"omnibox-site-search", flag_descriptions::kOmniboxSiteSearchName, + flag_descriptions::kOmniboxSiteSearchDescription, kOsAndroid, + FEATURE_VALUE_TYPE(omnibox::kOmniboxSiteSearch)}, + {"omnibox-diagnostics", flag_descriptions::kOmniboxDiagnosticsName, flag_descriptions::kOmniboxDiagnosticsDescription, kOsAndroid, FEATURE_WITH_PARAMS_VALUE_TYPE(omnibox::kDiagnostics,
diff --git a/chrome/browser/android/historical_tab_saver.cc b/chrome/browser/android/historical_tab_saver.cc index b57a924..c2922958 100644 --- a/chrome/browser/android/historical_tab_saver.cc +++ b/chrome/browser/android/historical_tab_saver.cc
@@ -72,13 +72,10 @@ JNIEnv* env, const JavaParamRef<jobjectArray>& jtab_group_ids) { std::vector<std::optional<tab_groups::TabGroupId>> tab_group_ids; - size_t array_length = env->GetArrayLength(jtab_group_ids.obj()); - tab_group_ids.reserve(array_length); - for (size_t i = 0; i < array_length; ++i) { - auto jtab_group_id = env->GetObjectArrayElement(jtab_group_ids.obj(), i); - std::optional<tab_groups::TabGroupId> tab_group_id = JavaTokenToTabGroupId( - env, ScopedJavaLocalRef<jobject>::Adopt(env, jtab_group_id)); - tab_group_ids.push_back(std::move(tab_group_id)); + auto array_reader = jtab_group_ids.ReadElements(); + tab_group_ids.reserve(array_reader.size()); + for (auto element : array_reader) { + tab_group_ids.push_back(JavaTokenToTabGroupId(env, element)); } return tab_group_ids; } @@ -325,10 +322,9 @@ AllTabsWebContentsStateByteBuffer(env, jbyte_buffers, std::move(saved_state_versions)); CreateHistoricalGroup( - TabModelList::FindNativeTabModelForJavaObject( - ScopedJavaLocalRef<jobject>::Adopt(env, jtab_model.obj())), - tab_group_id, saved_tab_group_id, title, (int)jcolor, - std::move(tabs_android), std::move(web_contents_states)); + TabModelList::FindNativeTabModelForJavaObject(jtab_model), tab_group_id, + saved_tab_group_id, title, (int)jcolor, std::move(tabs_android), + std::move(web_contents_states)); } static void JNI_HistoricalTabSaverImpl_CreateHistoricalBulkClosure( @@ -357,8 +353,7 @@ AllTabsWebContentsStateByteBuffer(env, jbyte_buffers, std::move(saved_state_versions)); CreateHistoricalBulkClosure( - TabModelList::FindNativeTabModelForJavaObject( - ScopedJavaLocalRef<jobject>::Adopt(env, jtab_model.obj())), + TabModelList::FindNativeTabModelForJavaObject(jtab_model), std::move(tab_group_ids), std::move(saved_tab_group_ids), std::move(group_titles), std::move(group_colors), std::move(per_tab_optional_tab_group_ids),
diff --git a/chrome/browser/android/recently_closed_tabs_bridge.cc b/chrome/browser/android/recently_closed_tabs_bridge.cc index 705bb255..d4db0bb 100644 --- a/chrome/browser/android/recently_closed_tabs_bridge.cc +++ b/chrome/browser/android/recently_closed_tabs_bridge.cc
@@ -304,8 +304,7 @@ return false; } - auto* model = TabModelList::FindNativeTabModelForJavaObject( - ScopedJavaLocalRef<jobject>::Adopt(env, jtab_model.obj())); + auto* model = TabModelList::FindNativeTabModelForJavaObject(jtab_model); if (model == nullptr) { return false; } @@ -328,8 +327,7 @@ return false; } - auto* model = TabModelList::FindNativeTabModelForJavaObject( - ScopedJavaLocalRef<jobject>::Adopt(env, jtab_model.obj())); + auto* model = TabModelList::FindNativeTabModelForJavaObject(jtab_model); if (model == nullptr) { return false; } @@ -351,8 +349,7 @@ return false; } - auto* model = TabModelList::FindNativeTabModelForJavaObject( - ScopedJavaLocalRef<jobject>::Adopt(env, jtab_model.obj())); + auto* model = TabModelList::FindNativeTabModelForJavaObject(jtab_model); if (model == nullptr) { return false; }
diff --git a/chrome/browser/ash/accessibility/BUILD.gn b/chrome/browser/ash/accessibility/BUILD.gn index be000bf..0c15767 100644 --- a/chrome/browser/ash/accessibility/BUILD.gn +++ b/chrome/browser/ash/accessibility/BUILD.gn
@@ -215,8 +215,8 @@ "//chrome/browser/ui/aura/accessibility", "//chrome/test:test_support", "//chromeos/ash/components/browser_context_helper", + "//components/live_caption", "//components/live_caption:constants", - "//components/live_caption:live_caption", "//ui/base/mojom:ui_base_types", "//ui/events:test_support",
diff --git a/chrome/browser/ash/app_list/search/BUILD.gn b/chrome/browser/ash/app_list/search/BUILD.gn index a2d2950d..723577c 100644 --- a/chrome/browser/ash/app_list/search/BUILD.gn +++ b/chrome/browser/ash/app_list/search/BUILD.gn
@@ -126,7 +126,7 @@ ] if (is_chrome_branded) { - deps += [ "//chromeos/ash/resources/internal/strings:strings" ] + deps += [ "//chromeos/ash/resources/internal/strings" ] } allow_circular_includes_from = [
diff --git a/chrome/browser/ash/app_mode/BUILD.gn b/chrome/browser/ash/app_mode/BUILD.gn index e11a590..94f22d50 100644 --- a/chrome/browser/ash/app_mode/BUILD.gn +++ b/chrome/browser/ash/app_mode/BUILD.gn
@@ -239,7 +239,7 @@ "//content/test:test_support", "//extensions:test_support", "//extensions/browser/updater", - "//extensions/common:common", + "//extensions/common", "//google_apis", "//services/data_decoder/public/cpp:test_support", "//testing/gmock", @@ -285,7 +285,7 @@ "//chrome/browser/ash/system_web_apps/test_support", "//chrome/browser/chromeos/app_mode", "//chrome/browser/devtools:test_support", - "//chrome/browser/extensions:extensions", + "//chrome/browser/extensions", "//chrome/browser/lifetime:termination_notification", "//chrome/browser/ui", "//chrome/browser/ui/ash/system_web_apps", @@ -295,7 +295,7 @@ "//chromeos/ash/components/cryptohome", "//chromeos/ash/components/dbus/session_manager", "//chromeos/ash/components/dbus/shill", - "//chromeos/ash/components/dbus/update_engine:update_engine", + "//chromeos/ash/components/dbus/update_engine", "//chromeos/ash/components/policy/device_local_account", "//chromeos/ash/components/policy/device_policy:test_support", "//components/crx_file",
diff --git a/chrome/browser/ash/app_mode/isolated_web_app/BUILD.gn b/chrome/browser/ash/app_mode/isolated_web_app/BUILD.gn index cad19c1..2dc62080 100644 --- a/chrome/browser/ash/app_mode/isolated_web_app/BUILD.gn +++ b/chrome/browser/ash/app_mode/isolated_web_app/BUILD.gn
@@ -25,7 +25,7 @@ "//chromeos/ash/components/settings", "//components/prefs", "//components/web_package", - "//components/webapps/isolated_web_apps:isolated_web_apps", + "//components/webapps/isolated_web_apps", "//url", ] } @@ -47,7 +47,7 @@ "//components/prefs", "//components/user_manager", "//components/web_package", - "//components/webapps/isolated_web_apps:isolated_web_apps", + "//components/webapps/isolated_web_apps", ] } @@ -66,7 +66,7 @@ "//chromeos/ash/components/policy/device_local_account", "//chromeos/ash/components/settings", "//components/policy/core/common", - "//components/webapps/isolated_web_apps:isolated_web_apps", + "//components/webapps/isolated_web_apps", "//testing/gtest", "//url", ]
diff --git a/chrome/browser/ash/app_mode/test/BUILD.gn b/chrome/browser/ash/app_mode/test/BUILD.gn index 38653cb..71cdcbda 100644 --- a/chrome/browser/ash/app_mode/test/BUILD.gn +++ b/chrome/browser/ash/app_mode/test/BUILD.gn
@@ -42,7 +42,7 @@ ":test_support", "//ash/constants", "//chrome/browser", - "//chrome/browser/apps/app_service:app_service", + "//chrome/browser/apps/app_service", "//chrome/browser/ash/app_mode/arcvm_app", "//chrome/browser/ash/app_mode/isolated_web_app", "//chrome/browser/ash/app_mode/web_app", @@ -62,7 +62,7 @@ "//components/services/app_service/public/cpp:app_types", "//components/web_package", "//components/web_package/test_support", - "//components/webapps/isolated_web_apps:isolated_web_apps", + "//components/webapps/isolated_web_apps", "//content/test:test_support", "//extensions/components/native_app_window", "//testing/gtest",
diff --git a/chrome/browser/ash/app_restore/BUILD.gn b/chrome/browser/ash/app_restore/BUILD.gn index 92df21f..3ac2159 100644 --- a/chrome/browser/ash/app_restore/BUILD.gn +++ b/chrome/browser/ash/app_restore/BUILD.gn
@@ -207,7 +207,7 @@ "//chrome/browser/ui/ash/desks", "//chrome/browser/ui/ash/device_scheduled_reboot", "//chrome/browser/ui/ash/system_web_apps", - "//chrome/browser/ui/webui/ash/settings:settings", + "//chrome/browser/ui/webui/ash/settings", "//chrome/browser/web_applications", "//chrome/browser/web_applications:web_applications_test_support", "//chrome/common",
diff --git a/chrome/browser/ash/arc/fileapi/BUILD.gn b/chrome/browser/ash/arc/fileapi/BUILD.gn index 9447e3f..38aecc9 100644 --- a/chrome/browser/ash/arc/fileapi/BUILD.gn +++ b/chrome/browser/ash/arc/fileapi/BUILD.gn
@@ -83,7 +83,7 @@ "//mojo/public/cpp/bindings", "//net", "//third_party/re2", - "//ui/shell_dialogs:shell_dialogs", + "//ui/shell_dialogs", "//url", # TODO(crbug.com/353449539): Use //chrome/browser/ui instead after cyclic dependency from
diff --git a/chrome/browser/ash/arc/session/BUILD.gn b/chrome/browser/ash/arc/session/BUILD.gn index c3c6410..947c1f4a 100644 --- a/chrome/browser/ash/arc/session/BUILD.gn +++ b/chrome/browser/ash/arc/session/BUILD.gn
@@ -188,7 +188,7 @@ "//chrome/browser/ui/ash/login:test_support", "//chrome/browser/ui/ash/multi_user", "//chrome/test:test_support", - "//chromeos/ash/components/browser_context_helper:browser_context_helper", + "//chromeos/ash/components/browser_context_helper", "//chromeos/ash/components/dbus/arc", "//chromeos/ash/components/dbus/concierge", "//chromeos/ash/components/dbus/resourced", @@ -230,7 +230,7 @@ "//components/account_id", "//components/policy/core/common", "//components/policy/core/common:test_support", - "//components/policy/test_support:test_support", + "//components/policy/test_support", "//components/prefs", "//components/signin/public/base", "//components/user_manager",
diff --git a/chrome/browser/ash/boca/BUILD.gn b/chrome/browser/ash/boca/BUILD.gn index c988e51..80eef2a 100644 --- a/chrome/browser/ash/boca/BUILD.gn +++ b/chrome/browser/ash/boca/BUILD.gn
@@ -46,7 +46,7 @@ "//components/soda:constants", "//components/user_manager", "//extensions/browser", - "//google_apis:google_apis", + "//google_apis", "//services/network/public/cpp", ] }
diff --git a/chrome/browser/ash/cert_provisioning/BUILD.gn b/chrome/browser/ash/cert_provisioning/BUILD.gn index 9d3cbef22..f484879 100644 --- a/chrome/browser/ash/cert_provisioning/BUILD.gn +++ b/chrome/browser/ash/cert_provisioning/BUILD.gn
@@ -57,12 +57,12 @@ "//chromeos/dbus/common", "//chromeos/dbus/tpm_manager", "//chromeos/dbus/tpm_manager:tpm_manager_proto", - "//components/invalidation:invalidation", + "//components/invalidation", "//components/policy/core/common", "//components/policy/core/common:common_constants", "//components/policy/proto", "//components/prefs", - "//components/user_manager:user_manager", + "//components/user_manager", "//content/public/browser", ]
diff --git a/chrome/browser/ash/child_accounts/BUILD.gn b/chrome/browser/ash/child_accounts/BUILD.gn index 52266348..6855e88 100644 --- a/chrome/browser/ash/child_accounts/BUILD.gn +++ b/chrome/browser/ash/child_accounts/BUILD.gn
@@ -81,8 +81,8 @@ "//chrome/browser/ash/policy/uploading", "//chrome/browser/ash/profiles", "//chrome/browser/ash/settings", + "//chrome/browser/profiles", "//chrome/browser/profiles:profile", - "//chrome/browser/profiles:profiles", "//chrome/common:constants", # included for chrome/common/pref_names.h "//chromeos/ash/components/dbus", "//chromeos/ash/components/dbus/session_manager",
diff --git a/chrome/browser/ash/chromebox_for_meetings/artemis/BUILD.gn b/chrome/browser/ash/chromebox_for_meetings/artemis/BUILD.gn index ecba9f7..f99ecc7 100644 --- a/chrome/browser/ash/chromebox_for_meetings/artemis/BUILD.gn +++ b/chrome/browser/ash/chromebox_for_meetings/artemis/BUILD.gn
@@ -36,7 +36,7 @@ "//chromeos/services/chromebox_for_meetings/public/proto", "//components/feedback/redaction_tool", "//mojo/public/cpp/bindings", - "//net:net", + "//net", "//third_party/re2", ]
diff --git a/chrome/browser/ash/crosapi/BUILD.gn b/chrome/browser/ash/crosapi/BUILD.gn index d74f8d33..47b0087 100644 --- a/chrome/browser/ash/crosapi/BUILD.gn +++ b/chrome/browser/ash/crosapi/BUILD.gn
@@ -195,14 +195,14 @@ "//components/language/core/browser", "//components/live_caption:utils", "//components/metrics", - "//components/metrics_services_manager:metrics_services_manager", + "//components/metrics_services_manager", "//components/payments/core:error_strings", "//components/policy/core/common:common_constants", "//components/prefs", "//components/printing/browser", "//components/services/app_service/public/cpp:instance_update", "//components/session_manager/core", - "//components/ukm:ukm", + "//components/ukm", "//components/update_client", "//components/user_prefs", "//components/variations", @@ -373,7 +373,7 @@ "//components/session_manager/core", "//printing/backend", "//printing/backend:test_support", - "//testing/gtest:gtest", + "//testing/gtest", "//ui/display:test_support", ]
diff --git a/chrome/browser/ash/crostini/BUILD.gn b/chrome/browser/ash/crostini/BUILD.gn index 91d3092e..242f375f 100644 --- a/chrome/browser/ash/crostini/BUILD.gn +++ b/chrome/browser/ash/crostini/BUILD.gn
@@ -343,7 +343,7 @@ ":browser_test_support", ":crostini", ":test_support", - "//base:base", + "//base", "//base/test:test_support", "//chrome/browser", "//chrome/browser:browser_process",
diff --git a/chrome/browser/ash/display/BUILD.gn b/chrome/browser/ash/display/BUILD.gn index 8b30c47..108da24 100644 --- a/chrome/browser/ash/display/BUILD.gn +++ b/chrome/browser/ash/display/BUILD.gn
@@ -23,8 +23,8 @@ "//base", "//base/test:test_support", "//chrome/browser:browser_process", + "//chrome/browser/ui", "//chrome/browser/ui:browser_navigator_params_headers", - "//chrome/browser/ui:ui", "//chrome/test:test_support_ui", "//components/prefs", "//components/quirks",
diff --git a/chrome/browser/ash/file_manager/BUILD.gn b/chrome/browser/ash/file_manager/BUILD.gn index de48161..475a30c1 100644 --- a/chrome/browser/ash/file_manager/BUILD.gn +++ b/chrome/browser/ash/file_manager/BUILD.gn
@@ -470,7 +470,7 @@ "//chrome/browser/policy:test_support", "//chrome/browser/profiles:profile", "//chrome/browser/signin", - "//chrome/browser/sync:sync", + "//chrome/browser/sync", "//chrome/browser/ui", "//chrome/browser/ui/ash/cast_config", "//chrome/browser/ui/ash/sharesheet",
diff --git a/chrome/browser/ash/fileapi/BUILD.gn b/chrome/browser/ash/fileapi/BUILD.gn index 37db6f36..5a3673b 100644 --- a/chrome/browser/ash/fileapi/BUILD.gn +++ b/chrome/browser/ash/fileapi/BUILD.gn
@@ -96,7 +96,7 @@ "//chrome/browser/ash/profiles", "//chrome/browser/extensions", "//chrome/browser/file_system_access", - "//chrome/common:common", + "//chrome/common", "//chrome/common/extensions/api", "//chromeos/ash/components/dbus/cros_disks", "//chromeos/ash/components/drivefs",
diff --git a/chrome/browser/ash/floating_sso/BUILD.gn b/chrome/browser/ash/floating_sso/BUILD.gn index 2bfe57d..789bfbd 100644 --- a/chrome/browser/ash/floating_sso/BUILD.gn +++ b/chrome/browser/ash/floating_sso/BUILD.gn
@@ -21,20 +21,20 @@ ] deps = [ - "//ash/constants:constants", + "//ash/constants", "//base", "//chrome/browser/ash/floating_workspace:utils", "//chrome/browser/profiles:profile", "//chrome/browser/sync:factories", "//chrome/common", "//chrome/common:channel_info", - "//chromeos/ash/components/browser_context_helper:browser_context_helper", + "//chromeos/ash/components/browser_context_helper", "//components/google/core/common", "//components/keyed_service/core", "//components/prefs", "//components/sync/service", "//components/url_matcher", - "//components/user_manager:user_manager", + "//components/user_manager", "//content/public/browser", "//net", ] @@ -54,7 +54,7 @@ deps = [ ":floating_sso", "//base", - "//components/sync/protocol:protocol", + "//components/sync/protocol", "//components/sync/protocol:util", ] @@ -97,7 +97,7 @@ "//chrome/browser/ash/floating_workspace:utils", "//chrome/browser/policy:test_support", "//chrome/browser/profiles:profile", - "//chrome/browser/sync:sync", + "//chrome/browser/sync", "//chrome/browser/ui", "//chrome/test:test_support", "//chromeos/constants",
diff --git a/chrome/browser/ash/floating_workspace/BUILD.gn b/chrome/browser/ash/floating_workspace/BUILD.gn index 87d9c990..fe081ddf 100644 --- a/chrome/browser/ash/floating_workspace/BUILD.gn +++ b/chrome/browser/ash/floating_workspace/BUILD.gn
@@ -35,7 +35,7 @@ "//chrome/browser/sync", "//chrome/browser/ui/ash/desks", "//chrome/browser/ui/ash/multi_user", - "//chromeos/ash/components/browser_context_helper:browser_context_helper", + "//chromeos/ash/components/browser_context_helper", "//chromeos/ash/components/network", "//chromeos/ash/services/device_sync/public/cpp/", "//chromeos/dbus/power", @@ -94,7 +94,7 @@ "//chrome/browser/ui/ash/multi_user", "//chrome/browser/ui/ash/session", "//chrome/browser/ui/ash/session:test_support", - "//chrome/browser/ui/webui/ash/floating_workspace:floating_workspace", + "//chrome/browser/ui/webui/ash/floating_workspace", "//chrome/test:test_support", "//chromeos/ash/components/login/session", "//chromeos/ash/components/network",
diff --git a/chrome/browser/ash/lobster/BUILD.gn b/chrome/browser/ash/lobster/BUILD.gn index db11f49..7b69ed1 100644 --- a/chrome/browser/ash/lobster/BUILD.gn +++ b/chrome/browser/ash/lobster/BUILD.gn
@@ -53,20 +53,20 @@ "//chrome/browser/profiles:profile", "//chrome/browser/resources/chromeos/mako:resources", "//chrome/browser/signin", - "//chrome/browser/ui/webui/ash/lobster:lobster", + "//chrome/browser/ui/webui/ash/lobster", "//chromeos/ash/components/browser_context_helper", - "//chromeos/ash/components/demo_mode:demo_mode", + "//chromeos/ash/components/demo_mode", "//chromeos/ash/components/editor_menu/public/cpp", - "//chromeos/ash/components/specialized_features:specialized_features", - "//chromeos/components/magic_boost/public/cpp:cpp", + "//chromeos/ash/components/specialized_features", + "//chromeos/components/magic_boost/public/cpp", "//components/keyed_service/core", "//components/manta", "//components/signin/public/identity_manager", "//components/variations/service", "//content/public/browser", "//net", - "//net/traffic_annotation:traffic_annotation", - "//services/data_decoder/public/cpp:cpp", + "//net/traffic_annotation", + "//services/data_decoder/public/cpp", "//ui/base/ime/ash", "//ui/chromeos/strings:strings_grit", "//ui/display", @@ -85,12 +85,12 @@ deps = [ ":lobster", - "//ash/public/cpp:cpp", + "//ash/public/cpp", "//base", "//base/test:test_support", "//components/manta", "//components/manta/proto", - "//net/traffic_annotation:traffic_annotation", + "//net/traffic_annotation", "//services/data_decoder/public/cpp:test_support", "//testing/gmock", "//testing/gtest", @@ -121,8 +121,8 @@ "//chrome/browser/signin", "//chrome/test:test_support", "//chrome/test:test_support_unit", - "//chromeos/ash/components/browser_context_helper:browser_context_helper", - "//chromeos/ash/components/editor_menu/public/cpp:cpp", + "//chromeos/ash/components/browser_context_helper", + "//chromeos/ash/components/editor_menu/public/cpp", "//chromeos/ash/components/specialized_features", "//components/feedback/proto", "//components/signin/public/identity_manager",
diff --git a/chrome/browser/ash/lobster/mock/BUILD.gn b/chrome/browser/ash/lobster/mock/BUILD.gn index 135c534..816f8cf 100644 --- a/chrome/browser/ash/lobster/mock/BUILD.gn +++ b/chrome/browser/ash/lobster/mock/BUILD.gn
@@ -18,7 +18,7 @@ "//base", "//base/test:test_support", "//components/manta", - "//net/traffic_annotation:traffic_annotation", + "//net/traffic_annotation", "//services/data_decoder/public/cpp:test_support", "//testing/gmock", "//ui/gfx:test_support",
diff --git a/chrome/browser/ash/login/BUILD.gn b/chrome/browser/ash/login/BUILD.gn index 99cf086..7fb35c76 100644 --- a/chrome/browser/ash/login/BUILD.gn +++ b/chrome/browser/ash/login/BUILD.gn
@@ -494,7 +494,7 @@ "//components/language/core/browser", "//components/metrics/structured:structured_events", "//components/metrics/structured:test_support", - "//components/metrics_services_manager:metrics_services_manager", + "//components/metrics_services_manager", "//components/onc", "//components/policy:chrome_settings_proto_generated_compile", "//components/policy/core/browser",
diff --git a/chrome/browser/ash/login/app_mode/test/BUILD.gn b/chrome/browser/ash/login/app_mode/test/BUILD.gn index 3d85668..e29dca5 100644 --- a/chrome/browser/ash/login/app_mode/test/BUILD.gn +++ b/chrome/browser/ash/login/app_mode/test/BUILD.gn
@@ -124,7 +124,7 @@ "//chrome/browser/ui", "//chrome/browser/ui:browser_navigator_params_headers", "//chrome/browser/ui/ash/login", - "//chrome/browser/ui/global_media_controls:global_media_controls", + "//chrome/browser/ui/global_media_controls", "//chrome/browser/ui/webui/ash/login", "//chrome/browser/web_applications", "//chrome/common:chrome_features",
diff --git a/chrome/browser/ash/login/oobe_apps_service/BUILD.gn b/chrome/browser/ash/login/oobe_apps_service/BUILD.gn index f3f8713..ddfc8e7 100644 --- a/chrome/browser/ash/login/oobe_apps_service/BUILD.gn +++ b/chrome/browser/ash/login/oobe_apps_service/BUILD.gn
@@ -19,7 +19,7 @@ deps = [ "//base", "//chrome/browser/apps/almanac_api_client", - "//chrome/browser/apps/app_service:app_service", + "//chrome/browser/apps/app_service", "//chrome/browser/apps/app_service/app_install", "//chrome/browser/ash/login/oobe_apps_service/proto", "//chrome/browser/profiles:profile",
diff --git a/chrome/browser/ash/login/oobe_quick_start/BUILD.gn b/chrome/browser/ash/login/oobe_quick_start/BUILD.gn index 0fd1b481..30cfc69 100644 --- a/chrome/browser/ash/login/oobe_quick_start/BUILD.gn +++ b/chrome/browser/ash/login/oobe_quick_start/BUILD.gn
@@ -75,6 +75,6 @@ "//services/network/public/cpp", "//testing/gmock", "//testing/gtest", - "//ui/chromeos:chromeos", + "//ui/chromeos", ] }
diff --git a/chrome/browser/ash/login/oobe_quick_start/connectivity/BUILD.gn b/chrome/browser/ash/login/oobe_quick_start/connectivity/BUILD.gn index 8e2375a..00f0573a 100644 --- a/chrome/browser/ash/login/oobe_quick_start/connectivity/BUILD.gn +++ b/chrome/browser/ash/login/oobe_quick_start/connectivity/BUILD.gn
@@ -11,14 +11,14 @@ "//chrome/browser:browser_process", "//chrome/browser/ash/login/oobe_quick_start:oobe_quick_start_pref_names", "//chrome/browser/ash/nearby:quick_start_connectivity_service", - "//chromeos/ash/components/nearby/common/connections_manager:connections_manager", + "//chromeos/ash/components/nearby/common/connections_manager", "//chromeos/ash/components/quick_start", "//chromeos/ash/services/nearby/public/cpp", "//chromeos/ash/services/nearby/public/mojom", - "//chromeos/constants:constants", + "//chromeos/constants", "//components/cbor", "//components/prefs", - "//components/qr_code_generator:qr_code_generator", + "//components/qr_code_generator", "//crypto", "//device/bluetooth", "//ui/chromeos",
diff --git a/chrome/browser/ash/login/screens/BUILD.gn b/chrome/browser/ash/login/screens/BUILD.gn index 476b68c..d483ed6 100644 --- a/chrome/browser/ash/login/screens/BUILD.gn +++ b/chrome/browser/ash/login/screens/BUILD.gn
@@ -283,7 +283,7 @@ "//chromeos/ash/components/dbus/debug_daemon", "//chromeos/ash/components/dbus/spaced", "//chromeos/ash/components/demo_mode", - "//chromeos/ash/components/growth:growth", + "//chromeos/ash/components/growth", "//chromeos/ash/components/install_attributes", "//chromeos/ash/components/network/portal_detector", "//chromeos/ash/components/osauth/public",
diff --git a/chrome/browser/ash/mahi/BUILD.gn b/chrome/browser/ash/mahi/BUILD.gn index 51102e9..5755eae 100644 --- a/chrome/browser/ash/mahi/BUILD.gn +++ b/chrome/browser/ash/mahi/BUILD.gn
@@ -22,7 +22,7 @@ "//chromeos/constants", "//components/manta", "//components/user_manager", - "//components/variations/service:service", + "//components/variations/service", ] } @@ -44,11 +44,11 @@ "//base", "//chrome/browser/ash/magic_boost", "//chrome/browser/feedback", - "//chromeos/components/magic_boost/public/cpp:cpp", + "//chromeos/components/magic_boost/public/cpp", "//chromeos/components/mahi/public/cpp", "//chromeos/strings:strings_grit", "//components/feedback", - "//components/history/core/browser:browser", + "//components/history/core/browser", "//components/manta", "//ui/aura", "//ui/base", @@ -74,11 +74,11 @@ "//ash/constants", "//base", "//base/test:test_support", - "//chrome/browser/ash/magic_boost:magic_boost", + "//chrome/browser/ash/magic_boost", "//chrome/browser/ash/mahi/media_app:unit_tests", "//chrome/browser/ash/mahi/web_contents/test_support", "//chrome/browser/profiles:profile", - "//chromeos/components/magic_boost/public/cpp:cpp", + "//chromeos/components/magic_boost/public/cpp", "//chromeos/components/mahi/public/cpp", "//chromeos/constants", "//chromeos/crosapi/mojom", @@ -144,7 +144,7 @@ "//chrome/test:test_support_ui", "//chromeos/components/magic_boost/public/cpp", "//chromeos/crosapi/mojom", - "//components/manta:manta", + "//components/manta", "//testing/gtest", "//ui/events:test_support", ]
diff --git a/chrome/browser/ash/net/rollback_network_config/BUILD.gn b/chrome/browser/ash/net/rollback_network_config/BUILD.gn index 5db3e1d6..63f89adf 100644 --- a/chrome/browser/ash/net/rollback_network_config/BUILD.gn +++ b/chrome/browser/ash/net/rollback_network_config/BUILD.gn
@@ -67,7 +67,7 @@ "//components/onc", "//components/ownership", "//components/prefs:test_support", - "//components/proxy_config:proxy_config", + "//components/proxy_config", "//components/sync_preferences:test_support", "//content/test:test_support", "//testing/gtest",
diff --git a/chrome/browser/ash/performance/BUILD.gn b/chrome/browser/ash/performance/BUILD.gn index b681006..09124da5 100644 --- a/chrome/browser/ash/performance/BUILD.gn +++ b/chrome/browser/ash/performance/BUILD.gn
@@ -22,7 +22,7 @@ "//base", "//chrome/browser/ash/arc/session", "//chrome/browser/ash/profiles", - "//chromeos/ash/components/dbus/concierge:concierge", + "//chromeos/ash/components/dbus/concierge", "//chromeos/ash/experiences/arc", "//chromeos/dbus/power", "//chromeos/dbus/power:power_manager_proto",
diff --git a/chrome/browser/ash/platform_keys/BUILD.gn b/chrome/browser/ash/platform_keys/BUILD.gn index 2e3c30b..835c33ab 100644 --- a/chrome/browser/ash/platform_keys/BUILD.gn +++ b/chrome/browser/ash/platform_keys/BUILD.gn
@@ -18,7 +18,7 @@ public_deps = [ "//chrome/browser:browser_public_dependencies" ] deps = [ - "//ash/constants:constants", + "//ash/constants", "//base", "//chrome/browser/ash/kcer", "//chrome/browser/ash/profiles",
diff --git a/chrome/browser/ash/policy/core/BUILD.gn b/chrome/browser/ash/policy/core/BUILD.gn index 4f6b2c3..6a98496 100644 --- a/chrome/browser/ash/policy/core/BUILD.gn +++ b/chrome/browser/ash/policy/core/BUILD.gn
@@ -134,7 +134,7 @@ "//google_apis", "//net", "//services/network/public/cpp", - "//third_party/re2:re2", + "//third_party/re2", "//ui/base", "//url",
diff --git a/chrome/browser/ash/policy/dlp/BUILD.gn b/chrome/browser/ash/policy/dlp/BUILD.gn index a378d7bf..7ac07bf 100644 --- a/chrome/browser/ash/policy/dlp/BUILD.gn +++ b/chrome/browser/ash/policy/dlp/BUILD.gn
@@ -80,10 +80,10 @@ # TODO(b/354095042): Use targets having headers directly included from # chrome/browser/ash/policy/dlp/files_policy_notification_manager.cc # instead after fixing cyclic dependency. - "//chrome/app/vector_icons:vector_icons", + "//chrome/app/vector_icons", "//chromeos/ash/components/dbus:vm_applications_apps_proto", "//chromeos/ash/components/drivefs", - "//chromeos/ash/experiences/arc/mojom:mojom", + "//chromeos/ash/experiences/arc/mojom", "//components/paint_preview/buildflags", # TODO(b/354095042): Use targets having headers directly included from
diff --git a/chrome/browser/ash/policy/remote_commands/crd/BUILD.gn b/chrome/browser/ash/policy/remote_commands/crd/BUILD.gn index ea43de66..7c75229 100644 --- a/chrome/browser/ash/policy/remote_commands/crd/BUILD.gn +++ b/chrome/browser/ash/policy/remote_commands/crd/BUILD.gn
@@ -42,7 +42,7 @@ "//chrome/browser/ash/policy/core", "//chrome/browser/ash/policy/remote_commands/crd/public:interface", "//chrome/common:constants", - "//chromeos/ash/components/dbus/userdataauth:userdataauth", + "//chromeos/ash/components/dbus/userdataauth", "//chromeos/ash/services/network_config:in_process_instance", "//components/policy/core/common", "//components/policy/proto:",
diff --git a/chrome/browser/ash/policy/reporting/event_based_logs/BUILD.gn b/chrome/browser/ash/policy/reporting/event_based_logs/BUILD.gn index 84b11806..b145d7a 100644 --- a/chrome/browser/ash/policy/reporting/event_based_logs/BUILD.gn +++ b/chrome/browser/ash/policy/reporting/event_based_logs/BUILD.gn
@@ -28,7 +28,7 @@ "//chrome/browser/policy/messaging_layer/proto:log_upload_event_proto", "//chrome/browser/profiles:profile", "//chrome/browser/support_tool:support_tool_proto", - "//chromeos/ash/components/browser_context_helper:browser_context_helper", + "//chromeos/ash/components/browser_context_helper", "//chromeos/ash/components/settings", "//components/prefs", "//components/reporting/client:report_queue", @@ -87,18 +87,18 @@ deps = [ ":event_based_logs", - "//chrome/browser:browser", + "//chrome/browser", "//chrome/browser/ash/login/test:test_support", "//chrome/browser/ash/policy/core:test_support", "//chrome/browser/ash/policy/remote_commands:test_support", - "//chrome/browser/ash/policy/test_support:test_support", + "//chrome/browser/ash/policy/test_support", "//chrome/browser/ash/settings", "//chrome/browser/ash/settings:test_support", "//chrome/browser/policy/messaging_layer/proto:log_upload_event_proto", "//chrome/browser/support_tool:support_tool_proto", "//chrome/test:test_support", "//chromeos/ash/components/settings", - "//chromeos/ash/components/system:system", + "//chromeos/ash/components/system", "//components/reporting/storage:test_support", "//content/test:test_support", "//testing/gmock",
diff --git a/chrome/browser/ash/policy/reporting/user_session_activity/BUILD.gn b/chrome/browser/ash/policy/reporting/user_session_activity/BUILD.gn index 7b89e251..4c9d335e 100644 --- a/chrome/browser/ash/policy/reporting/user_session_activity/BUILD.gn +++ b/chrome/browser/ash/policy/reporting/user_session_activity/BUILD.gn
@@ -43,7 +43,7 @@ ":user_session_activity", "//base/test:test_support", "//chrome/browser/ash/login/users:test_support", - "//chrome/browser/ash/policy/core:core", + "//chrome/browser/ash/policy/core", "//chrome/browser/ash/policy/reporting", "//chrome/browser/ash/policy/reporting:test_support", "//chrome/browser/ash/power/ml", @@ -57,7 +57,7 @@ "//components/reporting/proto:record_constants", "//components/user_manager", "//content/test:test_support", - "//testing/gmock:gmock", + "//testing/gmock", ] # TODO(crbug.com/40031409): Fix code that adds exit-time destructors and @@ -74,34 +74,34 @@ deps = [ ":user_session_activity", - "//ash:ash", - "//ash/public/cpp:cpp", - "//base:base", + "//ash", + "//ash/public/cpp", + "//base", "//base/test:test_support", - "//chrome/browser/ash/login:login", + "//chrome/browser/ash/login", "//chrome/browser/ash/login:test_support", "//chrome/browser/ash/login/lock:test_support", "//chrome/browser/ash/login/session:test_support", "//chrome/browser/ash/login/test:test_support", - "//chrome/browser/ash/policy/core:core", + "//chrome/browser/ash/policy/core", "//chrome/browser/ash/policy/core:test_support", "//chrome/browser/ash/policy/reporting:test_support", - "//chrome/browser/ash/profiles:profiles", - "//chrome/browser/ash/settings:settings", + "//chrome/browser/ash/profiles", + "//chrome/browser/ash/settings", "//chrome/browser/ash/settings:test_support", "//chrome/browser/policy/messaging_layer/proto:user_session_activity_proto", - "//chrome/browser/ui:ui", + "//chrome/browser/ui", "//chrome/test:test_support", "//chrome/test:test_support_ui", - "//chromeos/ash/components/dbus/session_manager:session_manager", - "//chromeos/ash/components/login/auth:auth", + "//chromeos/ash/components/dbus/session_manager", + "//chromeos/ash/components/login/auth", "//chromeos/ash/components/login/auth/public:authpublic", "//chromeos/dbus/missive:test_support", "//components/reporting/proto:record_constants", "//components/reporting/proto:record_proto", - "//components/user_manager:user_manager", + "//components/user_manager", "//content/test:test_support", - "//testing/gtest:gtest", - "//ui/base:base", + "//testing/gtest", + "//ui/base", ] }
diff --git a/chrome/browser/ash/printing/history/BUILD.gn b/chrome/browser/ash/printing/history/BUILD.gn index 73203f6..4b54cd02 100644 --- a/chrome/browser/ash/printing/history/BUILD.gn +++ b/chrome/browser/ash/printing/history/BUILD.gn
@@ -44,7 +44,7 @@ "//components/reporting/util:status", "//components/user_manager", "//content/public/browser", - "//printing/mojom:mojom", + "//printing/mojom", ] if (use_cups) {
diff --git a/chrome/browser/ash/sanitize/BUILD.gn b/chrome/browser/ash/sanitize/BUILD.gn index d959d80..565a4ab 100644 --- a/chrome/browser/ash/sanitize/BUILD.gn +++ b/chrome/browser/ash/sanitize/BUILD.gn
@@ -19,7 +19,7 @@ "//ash/webui/sanitize_ui/mojom", "//base", "//chrome/browser/profiles:profile", - "//chrome/browser/ui/webui/ash/settings:settings", + "//chrome/browser/ui/webui/ash/settings", ] } @@ -31,7 +31,7 @@ "//chrome/browser/ash/sanitize", "//chrome/browser/profile_resetter:fake_profile_resetter", "//chrome/browser/profiles:profile", - "//chrome/browser/ui/webui/ash/settings:settings", + "//chrome/browser/ui/webui/ash/settings", "//chrome/test:test_support", "//content/public/browser", "//testing/gtest",
diff --git a/chrome/browser/ash/settings/BUILD.gn b/chrome/browser/ash/settings/BUILD.gn index 1170a1d..0300538d 100644 --- a/chrome/browser/ash/settings/BUILD.gn +++ b/chrome/browser/ash/settings/BUILD.gn
@@ -61,7 +61,7 @@ "//content/public/browser", "//crypto", "//net", - "//third_party/re2:re2", + "//third_party/re2", # Work around of stub_cros_settings_provider injection. # TODO(hidehiko): Move the test support code to test_support target.
diff --git a/chrome/browser/ash/system_logs/BUILD.gn b/chrome/browser/ash/system_logs/BUILD.gn index 7e8a1f9c0..1937fe1 100644 --- a/chrome/browser/ash/system_logs/BUILD.gn +++ b/chrome/browser/ash/system_logs/BUILD.gn
@@ -64,7 +64,7 @@ "//chrome/browser/feedback", "//chrome/browser/profiles:profile", "//chrome/common", - "//chromeos/ash/components/browser_context_helper:browser_context_helper", + "//chromeos/ash/components/browser_context_helper", "//chromeos/ash/components/cryptohome", "//chromeos/ash/components/dbus/debug_daemon", "//chromeos/ash/components/dbus/shill", @@ -72,9 +72,9 @@ "//chromeos/ash/components/network", "//chromeos/ash/services/cros_healthd/public/cpp", "//chromeos/components/onc", - "//components/user_manager:user_manager", - "//content/public/browser:browser", - "//device/bluetooth:bluetooth", + "//components/user_manager", + "//content/public/browser", + "//device/bluetooth", "//ui/display/manager", "//ui/events/ash", "//ui/ozone",
diff --git a/chrome/browser/ash/system_web_apps/apps/BUILD.gn b/chrome/browser/ash/system_web_apps/apps/BUILD.gn index faa4f7b..40c711cb 100644 --- a/chrome/browser/ash/system_web_apps/apps/BUILD.gn +++ b/chrome/browser/ash/system_web_apps/apps/BUILD.gn
@@ -101,7 +101,7 @@ "//ash/webui/boca_ui:constants", "//ash/webui/boca_ui/resources", "//ash/webui/connectivity_diagnostics/resources", - "//ash/webui/demo_mode_app_ui/resources:resources", + "//ash/webui/demo_mode_app_ui/resources", "//ash/webui/diagnostics_ui:url_constants", "//ash/webui/diagnostics_ui/resources", "//ash/webui/eche_app_ui",
diff --git a/chrome/browser/ash/system_web_apps/apps/vc_background_ui/BUILD.gn b/chrome/browser/ash/system_web_apps/apps/vc_background_ui/BUILD.gn index 58315cc..47b0318 100644 --- a/chrome/browser/ash/system_web_apps/apps/vc_background_ui/BUILD.gn +++ b/chrome/browser/ash/system_web_apps/apps/vc_background_ui/BUILD.gn
@@ -66,7 +66,7 @@ "//ash/webui/common/mojom:sea_pen", "//base", "//base/test:test_support", - "//chrome/browser:browser", + "//chrome/browser", "//chrome/browser/ash/system_web_apps/apps/personalization_app:test_support", "//chrome/browser/ash/wallpaper_handlers:test_support", "//chrome/browser/profiles:profile",
diff --git a/chrome/browser/ash/tpm/BUILD.gn b/chrome/browser/ash/tpm/BUILD.gn index 96c2650..914bc12 100644 --- a/chrome/browser/ash/tpm/BUILD.gn +++ b/chrome/browser/ash/tpm/BUILD.gn
@@ -41,7 +41,7 @@ ":tpm", "//base", "//base/test:test_support", - "//chrome/browser/ash/policy/enrollment:enrollment", + "//chrome/browser/ash/policy/enrollment", "//chrome/browser/ash/settings:test_support", "//chrome/common", "//chromeos/ash/components/install_attributes:test_support",
diff --git a/chrome/browser/autocomplete/search_provider_unittest.cc b/chrome/browser/autocomplete/search_provider_unittest.cc index 834fa79..4013819 100644 --- a/chrome/browser/autocomplete/search_provider_unittest.cc +++ b/chrome/browser/autocomplete/search_provider_unittest.cc
@@ -1103,6 +1103,9 @@ // Verifies AutocompleteControllers return results (including keyword // results) in the right order and set descriptions for them correctly. TEST_F(SearchProviderTest, KeywordOrderingAndDescriptions) { + base::test::ScopedFeatureList feature_list; + feature_list.InitAndEnableFeature(omnibox::kOmniboxSiteSearch); + // Add an entry that corresponds to a keyword search with 'term2'. AddSearchToHistory(keyword_t_url_, u"term2", 1); profile_->BlockUntilHistoryProcessesPendingRequests(); @@ -1130,15 +1133,7 @@ EXPECT_EQ(u"k", result.match_at(0).keyword); EXPECT_EQ(u"k", result.match_at(1).keyword); -#if !BUILDFLAG(IS_ANDROID) - // On non-android, the top result will always have a description. Whether the - // second result has one doesn't matter much. (If it was missing, people - // would infer that it's the same search provider as the one above it.) EXPECT_FALSE(result.match_at(0).description.empty()); -#else - // On Android, the top result should not have a description. - EXPECT_TRUE(result.match_at(0).description.empty()); -#endif } TEST_F(SearchProviderTest, KeywordVerbatim) {
diff --git a/chrome/browser/banners/app_banner_manager_desktop_browsertest.cc b/chrome/browser/banners/app_banner_manager_desktop_browsertest.cc index 3a03b68..7b710a4b 100644 --- a/chrome/browser/banners/app_banner_manager_desktop_browsertest.cc +++ b/chrome/browser/banners/app_banner_manager_desktop_browsertest.cc
@@ -21,6 +21,7 @@ #include "chrome/browser/banners/app_banner_manager_browsertest_base.h" #include "chrome/browser/banners/test_app_banner_manager_desktop.h" #include "chrome/browser/profiles/profile.h" +#include "chrome/browser/ui/actions/chrome_action_id.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser_command_controller.h" #include "chrome/browser/ui/browser_window.h" @@ -258,8 +259,13 @@ } // Install the app via the menu instead of the banner. - browser()->window()->ExecutePageActionIconForTesting( - PageActionIconType::kPwaInstall); + if (IsPageActionMigrated(PageActionIconType::kPwaInstall)) { + actions::ActionManager::Get().FindAction(kActionInstallPwa)->InvokeAction(); + } else { + browser()->window()->ExecutePageActionIconForTesting( + PageActionIconType::kPwaInstall); + } + manager->AwaitAppInstall(); EXPECT_FALSE(manager->IsPromptAvailableForTesting());
diff --git a/chrome/browser/bookmarks/android/junit/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerMediatorTest.java b/chrome/browser/bookmarks/android/junit/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerMediatorTest.java index 8e16468d..0a59c83 100644 --- a/chrome/browser/bookmarks/android/junit/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerMediatorTest.java +++ b/chrome/browser/bookmarks/android/junit/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerMediatorTest.java
@@ -1288,19 +1288,19 @@ assertNotNull(menu); // Select. - menu.onItemClick(null, null, 0, 0); + clickChildAt(menu, 0); verify(mSelectionDelegate).toggleSelectionForItem(mBookmarkId21); // Edit. // TODO(crbug.com/40267749): This doesn't actually open the activity yet. - menu.onItemClick(null, null, 1, 0); + clickChildAt(menu, 1); // Move. // TODO(crbug.com/40267749): This doesn't actually open the activity yet. - menu.onItemClick(null, null, 2, 0); + clickChildAt(menu, 2); // Delete. - menu.onItemClick(null, null, 3, 0); + clickChildAt(menu, 3); verify(mBookmarkModel).deleteBookmarks(mBookmarkId21); } @@ -1343,7 +1343,7 @@ assertNotNull(menu); // Delete. - menu.onItemClick(null, null, 4, 0); + clickChildAt(menu, 4); verify(mPriceTrackingUtilsJniMock) .setPriceTrackingStateForBookmark( any(), anyLong(), anyBoolean(), any(), anyBoolean()); @@ -1903,7 +1903,7 @@ assertFalse(mModelList.get(1).model.get(BookmarkManagerProperties.IS_HIGHLIGHTED)); // Show in folder. - menu.onItemClick(null, null, 4, 0); + clickChildAt(menu, 4); assertTrue(mModelList.get(1).model.get(BookmarkManagerProperties.IS_HIGHLIGHTED)); } @@ -2461,4 +2461,8 @@ assertEquals(ViewType.SEARCH_BOX, mModelList.get(0).type); assertEquals(ViewType.EMPTY_STATE, mModelList.get(1).type); } + + private void clickChildAt(BasicListMenu menu, int i) { + menu.clickItemForTesting(i); + } }
diff --git a/chrome/browser/chromeos/cros_apps/BUILD.gn b/chrome/browser/chromeos/cros_apps/BUILD.gn index 00bb102..1074020d 100644 --- a/chrome/browser/chromeos/cros_apps/BUILD.gn +++ b/chrome/browser/chromeos/cros_apps/BUILD.gn
@@ -13,7 +13,7 @@ deps = [ "//chrome/browser/chromeos/cros_apps/api", "//chrome/browser/profiles:profile", - "//chromeos/constants:constants", + "//chromeos/constants", "//content/public/browser", "//content/public/common", ]
diff --git a/chrome/browser/chromeos/cros_apps/api/BUILD.gn b/chrome/browser/chromeos/cros_apps/api/BUILD.gn index b186e22..1e92f77 100644 --- a/chrome/browser/chromeos/cros_apps/api/BUILD.gn +++ b/chrome/browser/chromeos/cros_apps/api/BUILD.gn
@@ -15,7 +15,7 @@ defines = [ "HAS_OUT_OF_PROC_TEST_RUNNER" ] deps = [ - "//chrome/browser:browser", + "//chrome/browser", "//chrome/browser/chromeos/cros_apps:test_support", "//chrome/browser/chromeos/cros_apps/api/test:apitest_support", "//chrome/browser/profiles:profile", @@ -47,7 +47,7 @@ deps = [ "//chrome/browser/profiles:profile", "//chrome/common", - "//chromeos/constants:constants", + "//chromeos/constants", "//content/public/browser", "//content/public/common", "//services/network/public/cpp",
diff --git a/chrome/browser/chromeos/drivefs/BUILD.gn b/chrome/browser/chromeos/drivefs/BUILD.gn index 81ae7b9..b828052b 100644 --- a/chrome/browser/chromeos/drivefs/BUILD.gn +++ b/chrome/browser/chromeos/drivefs/BUILD.gn
@@ -15,7 +15,7 @@ "//chrome/browser/profiles:profile", "//chromeos/components/drivefs/mojom", "//components/drive", - "//components/keep_alive_registry:keep_alive_registry", + "//components/keep_alive_registry", "//extensions/browser/api/messaging", "//extensions/browser/api/messaging:native_messaging", "//extensions/common",
diff --git a/chrome/browser/chromeos/extensions/component_extension_content_settings/BUILD.gn b/chrome/browser/chromeos/extensions/component_extension_content_settings/BUILD.gn index ad4abf108..83ca332 100644 --- a/chrome/browser/chromeos/extensions/component_extension_content_settings/BUILD.gn +++ b/chrome/browser/chromeos/extensions/component_extension_content_settings/BUILD.gn
@@ -23,7 +23,7 @@ "//components/keyed_service/content", "//components/keyed_service/core", "//extensions/common", - "//url:url", + "//url", ] # TODO(crbug.com/40031409): Fix code that adds exit-time destructors and
diff --git a/chrome/browser/chromeos/extensions/echo_private/BUILD.gn b/chrome/browser/chromeos/extensions/echo_private/BUILD.gn index a506ab9b7..6191b98 100644 --- a/chrome/browser/chromeos/extensions/echo_private/BUILD.gn +++ b/chrome/browser/chromeos/extensions/echo_private/BUILD.gn
@@ -23,7 +23,7 @@ "//chrome/browser/ui:browser_navigator_params_headers", "//chrome/common", "//chrome/common:constants", - "//chrome/common/extensions/api:api", + "//chrome/common/extensions/api", "//chromeos/ash/components/report:utils", "//chromeos/ash/components/settings", "//chromeos/ash/components/system",
diff --git a/chrome/browser/chromeos/extensions/odfs_config_private/BUILD.gn b/chrome/browser/chromeos/extensions/odfs_config_private/BUILD.gn index b8d2fefa..6c984e63 100644 --- a/chrome/browser/chromeos/extensions/odfs_config_private/BUILD.gn +++ b/chrome/browser/chromeos/extensions/odfs_config_private/BUILD.gn
@@ -18,7 +18,7 @@ deps = [ "//chrome/browser/extensions", "//chrome/browser/profiles:profile", - "//chrome/browser/ui:ui", + "//chrome/browser/ui", "//chrome/browser/ui/webui/ash/cloud_upload", "//chrome/common/extensions/api", "//chromeos/constants",
diff --git a/chrome/browser/chromeos/extensions/telemetry/api/common/BUILD.gn b/chrome/browser/chromeos/extensions/telemetry/api/common/BUILD.gn index 09f74d345..0fc5f80 100644 --- a/chrome/browser/chromeos/extensions/telemetry/api/common/BUILD.gn +++ b/chrome/browser/chromeos/extensions/telemetry/api/common/BUILD.gn
@@ -62,7 +62,7 @@ ] deps = [ - "//chrome/browser/ash/crosapi:crosapi", + "//chrome/browser/ash/crosapi", "//chromeos/ash/components/telemetry_extension/telemetry", "//chromeos/crosapi/mojom", "//mojo/public/cpp/bindings",
diff --git a/chrome/browser/chromeos/extensions/telemetry/api/events/BUILD.gn b/chrome/browser/chromeos/extensions/telemetry/api/events/BUILD.gn index 53bc8e3..173e491d 100644 --- a/chrome/browser/chromeos/extensions/telemetry/api/events/BUILD.gn +++ b/chrome/browser/chromeos/extensions/telemetry/api/events/BUILD.gn
@@ -144,7 +144,7 @@ ":event_manager", ":event_router", ":test_support", - "//chrome/browser/chromeos/extensions/telemetry/api/common:common", + "//chrome/browser/chromeos/extensions/telemetry/api/common", "//chrome/browser/ui", "//chrome/browser/web_applications:web_applications_test_support", "//chrome/common",
diff --git a/chrome/browser/chromeos/office_web_app/BUILD.gn b/chrome/browser/chromeos/office_web_app/BUILD.gn index 011d2da..58b5bf67 100644 --- a/chrome/browser/chromeos/office_web_app/BUILD.gn +++ b/chrome/browser/chromeos/office_web_app/BUILD.gn
@@ -17,7 +17,7 @@ "//chrome/browser/ui/webui/ash/cloud_upload", "//chrome/browser/web_applications", "//components/webapps/browser", - "//ui/base:base", + "//ui/base", "//url", ]
diff --git a/chrome/browser/commerce/shopping_service_factory.cc b/chrome/browser/commerce/shopping_service_factory.cc index 9f09d5f8..e8ccddaa 100644 --- a/chrome/browser/commerce/shopping_service_factory.cc +++ b/chrome/browser/commerce/shopping_service_factory.cc
@@ -21,6 +21,7 @@ #include "components/commerce/core/commerce_feature_list.h" #include "components/commerce/core/product_specifications/product_specifications_service.h" #include "components/commerce/core/proto/commerce_subscription_db_content.pb.h" +#include "components/commerce/core/proto/discount_infos_db_content.pb.h" // nogncheck #include "components/commerce/core/proto/parcel_tracking_db_content.pb.h" #include "components/commerce/core/shopping_service.h" #include "components/prefs/pref_service.h" @@ -31,7 +32,6 @@ #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser_finder.h" #include "components/commerce/core/proto/cart_db_content.pb.h" // nogncheck -#include "components/commerce/core/proto/discount_infos_db_content.pb.h" // nogncheck #include "components/commerce/core/proto/discounts_db_content.pb.h" // nogncheck #endif @@ -82,9 +82,9 @@ #if !BUILDFLAG(IS_ANDROID) DependsOn(SessionProtoDBFactory< discounts_db::DiscountsContentProto>::GetInstance()); +#endif DependsOn(SessionProtoDBFactory< discount_infos_db::DiscountInfosContentProto>::GetInstance()); -#endif DependsOn(SyncServiceFactory::GetInstance()); DependsOn(commerce::ProductSpecificationsServiceFactory::GetInstance()); DependsOn(TabRestoreServiceFactory::GetInstance()); @@ -113,12 +113,12 @@ ->GetForProfile(context), SessionProtoDBFactory<cart_db::ChromeCartContentProto>::GetInstance() ->GetForProfile(context), +#else + nullptr, nullptr, +#endif SessionProtoDBFactory< discount_infos_db::DiscountInfosContentProto>::GetInstance() ->GetForProfile(context), -#else - nullptr, nullptr, nullptr, -#endif SessionProtoDBFactory< parcel_tracking_db::ParcelTrackingContent>::GetInstance() ->GetForProfile(context),
diff --git a/chrome/browser/component_updater/pki_metadata_component_installer_browsertest.cc b/chrome/browser/component_updater/pki_metadata_component_installer_browsertest.cc index 4808e59..11c29c0 100644 --- a/chrome/browser/component_updater/pki_metadata_component_installer_browsertest.cc +++ b/chrome/browser/component_updater/pki_metadata_component_installer_browsertest.cc
@@ -19,6 +19,7 @@ #include "base/memory/raw_ptr.h" #include "base/memory/scoped_refptr.h" #include "base/run_loop.h" +#include "base/strings/string_util.h" #include "base/strings/string_view_util.h" #include "base/test/scoped_feature_list.h" #include "base/threading/thread_restrictions.h" @@ -1449,6 +1450,12 @@ CTEnforcement::kDisabledByProto, CTEnforcement::kDisabledByFeature)); +std::string X509CertificateToString(scoped_refptr<net::X509Certificate> cert) { + std::vector<std::string> pem_encoded_chain; + EXPECT_TRUE(cert->GetPEMEncodedChain(&pem_encoded_chain)); + return base::JoinString(pem_encoded_chain, "\n"); +} + // Checks that navigation responses were served over a connection where the // server provided the given `expected_server_certificate_chain`. Note that this // checks the certificate chain that the server served, not the chain that the @@ -1482,7 +1489,12 @@ EXPECT_TRUE(navigation_handle() ->GetSSLInfo() ->unverified_cert->EqualsIncludingChain( - expected_server_certificate_chain_.get())); + expected_server_certificate_chain_.get())) + << "\n\nExpected server chain: " + << X509CertificateToString(expected_server_certificate_chain_) + << "\n\nObserved unverified server chain: " + << X509CertificateToString( + navigation_handle()->GetSSLInfo()->unverified_cert); ++num_responses_; return content::NavigationThrottle::PROCEED; } @@ -1720,18 +1732,6 @@ SystemNetworkContextManager::GetInstance() ->FlushSSLConfigManagerForTesting(); - // TODO(https://crbug.com/431064813): this is a speculative attempt to fix a - // test flake. It isn't clear why this should be needed because updating the - // SSLConfig should close idle sockets and prevent socket reuse. If this - // fixes the flake, we should investigate further why this is needed. - base::RunLoop close_all_connections_loop; - chrome_test_utils::GetActiveWebContents(this) - ->GetBrowserContext() - ->GetDefaultStoragePartition() - ->GetNetworkContext() - ->CloseAllConnections(close_all_connections_loop.QuitClosure()); - close_all_connections_loop.Run(); - // The server should now serve a single leaf, without any intermediates, // because the client should signal that it trusts the intermediate as a // trust anchor.
diff --git a/chrome/browser/controlled_frame/controlled_frame_wpt_browsertest.cc b/chrome/browser/controlled_frame/controlled_frame_wpt_browsertest.cc index cda8bc8..8b0d3651 100644 --- a/chrome/browser/controlled_frame/controlled_frame_wpt_browsertest.cc +++ b/chrome/browser/controlled_frame/controlled_frame_wpt_browsertest.cc
@@ -25,14 +25,16 @@ namespace controlled_frame { +#define IS_LINUX_OR_CROS BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX) + namespace { // TODO(crbug.com/423697478): frame_event_handlers_part_1 and webrequest_auth -// times out on win-asan bots +// times out on win-asan bots and linux / chromeos bots. const auto kTestFiles = testing::Values("add_content_scripts.window.js", "camera.window.js", "client_hints_user_agent.window.js", -#if !(BUILDFLAG(IS_WIN) && defined(ADDRESS_SANITIZER)) +#if !(BUILDFLAG(IS_WIN) && defined(ADDRESS_SANITIZER)) || IS_LINUX_OR_CROS "frame_event_handlers_part_1.window.js", #endif "frame_event_handlers_part_2.window.js", @@ -42,7 +44,7 @@ "no_callback.window.js", "scheme.window.js", "user_agent_override.window.js", -#if !(BUILDFLAG(IS_WIN) && defined(ADDRESS_SANITIZER)) +#if !(BUILDFLAG(IS_WIN) && defined(ADDRESS_SANITIZER)) || IS_LINUX_OR_CROS "webrequest_auth.window.js", #endif "webrequest_core.window.js",
diff --git a/chrome/browser/extensions/api/developer_private/developer_private_api.cc b/chrome/browser/extensions/api/developer_private/developer_private_api.cc index 832dc0a..aaebeed2 100644 --- a/chrome/browser/extensions/api/developer_private/developer_private_api.cc +++ b/chrome/browser/extensions/api/developer_private/developer_private_api.cc
@@ -4,6 +4,7 @@ #include "chrome/browser/extensions/api/developer_private/developer_private_api.h" +#include "base/lazy_instance.h" #include "chrome/browser/extensions/api/developer_private/extension_info_generator.h" #include "chrome/browser/extensions/commands/command_service.h" #include "chrome/browser/extensions/error_console/error_console_factory.h"
diff --git a/chrome/browser/extensions/chrome_extension_registrar_delegate.cc b/chrome/browser/extensions/chrome_extension_registrar_delegate.cc index 402b57c..1b2c154 100644 --- a/chrome/browser/extensions/chrome_extension_registrar_delegate.cc +++ b/chrome/browser/extensions/chrome_extension_registrar_delegate.cc
@@ -616,28 +616,19 @@ extensions::profile_util::ProfileCanUseNonComponentExtensions(profile_); if (!registry_->GetInstalledExtension(extension->id())) { - UMA_HISTOGRAM_ENUMERATION("Extensions.InstallType", extension->GetType(), - 100); if (is_user_profile) { UMA_HISTOGRAM_ENUMERATION("Extensions.InstallType.User", extension->GetType(), 100); + UMA_HISTOGRAM_ENUMERATION("Extensions.InstallSource.User2", + extension->location(), 100); + InstalledLoader::RecordPermissionMessagesHistogram(extension, "Install", + profile_); } else { UMA_HISTOGRAM_ENUMERATION("Extensions.InstallType.NonUser", extension->GetType(), 100); - } - UMA_HISTOGRAM_ENUMERATION("Extensions.InstallSource", - extension->location()); - if (is_user_profile) { - UMA_HISTOGRAM_ENUMERATION("Extensions.InstallSource.User2", - extension->location(), 100); - } else { UMA_HISTOGRAM_ENUMERATION("Extensions.InstallSource.NonUser2", extension->location(), 100); } - // TODO(crbug.com/40878021): Address Install metrics below in a follow-up - // CL. - InstalledLoader::RecordPermissionMessagesHistogram(extension, "Install", - is_user_profile); } }
diff --git a/chrome/browser/extensions/extension_service_unittest.cc b/chrome/browser/extensions/extension_service_unittest.cc index d2103ab..6c8e88c1 100644 --- a/chrome/browser/extensions/extension_service_unittest.cc +++ b/chrome/browser/extensions/extension_service_unittest.cc
@@ -780,8 +780,6 @@ loader.set_pack_extension(false); loader.LoadExtension(good_extension_dir.UnpackedPath()); - histograms.ExpectTotalCount("Extensions.InstallType", 1); - histograms.ExpectTotalCount("Extensions.InstallSource", 1); histograms.ExpectTotalCount("Extensions.InstallType.NonUser", nonuser_expected_total_count); histograms.ExpectTotalCount("Extensions.InstallType.User",
diff --git a/chrome/browser/extensions/installed_loader.cc b/chrome/browser/extensions/installed_loader.cc index 0300e927..899ac3c 100644 --- a/chrome/browser/extensions/installed_loader.cc +++ b/chrome/browser/extensions/installed_loader.cc
@@ -233,50 +233,37 @@ return HostPermissionsAccess::kOnClick; } -void LogHostPermissionsAccess(const Extension& extension, - bool should_record_incremented_metrics) { +// Emits metrics for the host permissions access that an extension has. Meant to +// be called only for profiles where users can install extensions, specifically +// profiles that can have non-component extensions installed. +void LogHostPermissionsAccess(const Extension& extension) { HostPermissionsAccess access_level = GetHostPermissionAccessLevelForExtension(extension); - // Extensions.HostPermissions.GrantedAccess is emitted for every - // extension. - base::UmaHistogramEnumeration("Extensions.HostPermissions.GrantedAccess", + // Extensions.HostPermissions.GrantedAccess is emitted for every extension. + base::UmaHistogramEnumeration("Extensions.HostPermissions.GrantedAccess2", access_level); - if (should_record_incremented_metrics) { - base::UmaHistogramEnumeration("Extensions.HostPermissions.GrantedAccess2", - access_level); - } const PermissionSet& active_permissions = extension.permissions_data()->active_permissions(); const PermissionSet& withheld_permissions = extension.permissions_data()->withheld_permissions(); - // Since we only care about host permissions here, we don't want to - // look at API permissions that might cause Chrome to warn about all hosts - // (like debugger or devtools). + // Since we only care about host permissions here, we don't want to look at + // API permissions that might cause Chrome to warn about all hosts (like + // debugger or devtools). static constexpr bool kIncludeApiPermissions = false; if (active_permissions.ShouldWarnAllHosts(kIncludeApiPermissions) || withheld_permissions.ShouldWarnAllHosts(kIncludeApiPermissions)) { // Extension requests access to at least one eTLD. base::UmaHistogramEnumeration( - "Extensions.HostPermissions.GrantedAccessForBroadRequests", + "Extensions.HostPermissions.GrantedAccessForBroadRequests2", access_level); - if (should_record_incremented_metrics) { - base::UmaHistogramEnumeration( - "Extensions.HostPermissions.GrantedAccessForBroadRequests2", - access_level); - } } else if (!active_permissions.effective_hosts().is_empty() || !withheld_permissions.effective_hosts().is_empty()) { // Extension requests access to hosts, but not eTLD. base::UmaHistogramEnumeration( - "Extensions.HostPermissions.GrantedAccessForTargetedRequests", + "Extensions.HostPermissions.GrantedAccessForTargetedRequests2", access_level); - if (should_record_incremented_metrics) { - base::UmaHistogramEnumeration( - "Extensions.HostPermissions.GrantedAccessForTargetedRequests2", - access_level); - } } } @@ -418,24 +405,15 @@ } } - UMA_HISTOGRAM_COUNTS_100("Extensions.LoadAll", - extension_registry_->enabled_extensions().size()); - UMA_HISTOGRAM_COUNTS_100("Extensions.Disabled", - extension_registry_->disabled_extensions().size()); + const base::TimeDelta load_all_time = + base::TimeTicks::Now() - load_start_time; if (is_user_profile) { UMA_HISTOGRAM_COUNTS_100("Extensions.LoadAll2", extension_registry_->enabled_extensions().size()); UMA_HISTOGRAM_COUNTS_100("Extensions.Disabled2", extension_registry_->disabled_extensions().size()); - } - - RecordExtensionsMetrics(profile, is_user_profile); - - const base::TimeDelta load_all_time = - base::TimeTicks::Now() - load_start_time; - UMA_HISTOGRAM_TIMES("Extensions.LoadAllTime2", load_all_time); - if (is_user_profile) { UMA_HISTOGRAM_TIMES("Extensions.LoadAllTime2.User", load_all_time); + RecordExtensionsMetrics(profile); } else { UMA_HISTOGRAM_TIMES("Extensions.LoadAllTime2.NonUser", load_all_time); } @@ -445,38 +423,28 @@ void InstalledLoader::RecordPermissionMessagesHistogram( const Extension* extension, const char* histogram_basename, - bool log_user_profile_histograms) { + Profile* profile) { + DCHECK(profile_util::ProfileCanUseNonComponentExtensions(profile)); + PermissionIDSet permissions = PermissionMessageProvider::Get()->GetAllPermissionIDs( extension->permissions_data()->active_permissions(), extension->GetType()); + base::UmaHistogramBoolean( - base::StringPrintf("Extensions.HasPermissions_%s3", histogram_basename), + base::StringPrintf("Extensions.HasPermissions_%s4", histogram_basename), !permissions.empty()); - std::string permissions_histogram_name = - base::StringPrintf("Extensions.Permissions_%s3", histogram_basename); + std::string permissions_histogram_name_incremented = + base::StringPrintf("Extensions.Permissions_%s4", histogram_basename); for (const PermissionID& id : permissions) { - base::UmaHistogramEnumeration(permissions_histogram_name, id.id()); - } - - if (log_user_profile_histograms) { - base::UmaHistogramBoolean( - base::StringPrintf("Extensions.HasPermissions_%s4", histogram_basename), - !permissions.empty()); - - std::string permissions_histogram_name_incremented = - base::StringPrintf("Extensions.Permissions_%s4", histogram_basename); - for (const PermissionID& id : permissions) { - base::UmaHistogramEnumeration(permissions_histogram_name_incremented, - id.id()); - } + base::UmaHistogramEnumeration(permissions_histogram_name_incremented, + id.id()); } } void InstalledLoader::RecordExtensionsMetricsForTesting() { - RecordExtensionsMetrics(profile_, - /*is_user_profile=*/false); + RecordExtensionsMetrics(profile_); } void InstalledLoader::RecordExtensionsIncrementedMetricsForTesting( @@ -485,8 +453,9 @@ } // TODO(crbug.com/40739895): Separate out Webstore/Offstore metrics. -void InstalledLoader::RecordExtensionsMetrics(Profile* profile, - bool is_user_profile) { +void InstalledLoader::RecordExtensionsMetrics(Profile* profile) { + DCHECK(profile_util::ProfileCanUseNonComponentExtensions(profile)); + int app_user_count = 0; int app_external_count = 0; int hosted_app_count = 0; @@ -525,7 +494,6 @@ ManifestVersion2And3Counts component_manifest_version_counts; ManifestVersion2And3Counts unpacked_manifest_version_counts; - bool should_record_incremented_metrics = is_user_profile; bool dev_mode_enabled = GetCurrentDeveloperMode(util::GetBrowserContextId(profile)); @@ -542,19 +510,14 @@ // muck up any of the stats. Later, though, we want to omit component and // unpacked, as they are less interesting. - if (extension->is_app() && should_record_incremented_metrics) { + if (extension->is_app()) { UMA_HISTOGRAM_ENUMERATION("Extensions.AppLocation2", location); } else if (extension->is_extension()) { - UMA_HISTOGRAM_ENUMERATION("Extensions.ExtensionLocation", location); - if (should_record_incremented_metrics) { - UMA_HISTOGRAM_ENUMERATION("Extensions.ExtensionLocation2", location); - } + UMA_HISTOGRAM_ENUMERATION("Extensions.ExtensionLocation2", location); } + if (!UpdatesFromWebstore(*extension)) { - UMA_HISTOGRAM_ENUMERATION("Extensions.NonWebstoreLocation", location); - if (should_record_incremented_metrics) { - UMA_HISTOGRAM_ENUMERATION("Extensions.NonWebstoreLocation2", location); - } + UMA_HISTOGRAM_ENUMERATION("Extensions.NonWebstoreLocation2", location); // Check for inconsistencies if the extension was supposedly installed // from the webstore. @@ -565,13 +528,9 @@ kDeprecatedIsExternal = 1, }; if (extension->from_webstore()) { - UMA_HISTOGRAM_ENUMERATION("Extensions.FromWebstoreInconsistency", + UMA_HISTOGRAM_ENUMERATION("Extensions.FromWebstoreInconsistency2", kBadUpdateUrl, 2); - if (should_record_incremented_metrics) { - UMA_HISTOGRAM_ENUMERATION("Extensions.FromWebstoreInconsistency2", - kBadUpdateUrl, 2); - } - } else if (is_user_profile) { + } else { // Record enabled non-webstore extensions based on developer mode // status. if (dev_mode_enabled) { @@ -586,27 +545,17 @@ } } - if (is_user_profile) { - base::UmaHistogramBoolean("Extensions.DeveloperModeEnabled", - dev_mode_enabled); - } + base::UmaHistogramBoolean("Extensions.DeveloperModeEnabled", + dev_mode_enabled); if (Manifest::IsExternalLocation(location)) { // See loop below for DISABLED. if (UpdatesFromWebstore(*extension)) { - base::UmaHistogramEnumeration("Extensions.ExternalItemState", + base::UmaHistogramEnumeration("Extensions.ExternalItemState2", ExternalItemState::kWebstoreEnabled); - if (should_record_incremented_metrics) { - base::UmaHistogramEnumeration("Extensions.ExternalItemState2", - ExternalItemState::kWebstoreEnabled); - } } else { - base::UmaHistogramEnumeration("Extensions.ExternalItemState", + base::UmaHistogramEnumeration("Extensions.ExternalItemState2", ExternalItemState::kNonwebstoreEnabled); - if (should_record_incremented_metrics) { - base::UmaHistogramEnumeration("Extensions.ExternalItemState2", - ExternalItemState::kNonwebstoreEnabled); - } } } @@ -626,7 +575,7 @@ // Manifest::TYPE_EXTENSION. An ungrouped histogram is below, includes all // extension-y types (such as platform apps and hosted apps), and doesn't // include unpacked or component locations. - if (extension->is_extension() && is_user_profile) { + if (extension->is_extension()) { const char* location_histogram_name = nullptr; ManifestVersion2And3Counts* manifest_version_counts = nullptr; switch (extension->location()) { @@ -726,22 +675,16 @@ continue; } - if (should_record_incremented_metrics) { - UMA_HISTOGRAM_ENUMERATION("Extensions.ManifestVersion2", - extension->manifest_version(), - kMaxManifestVersion); - } + UMA_HISTOGRAM_ENUMERATION("Extensions.ManifestVersion2", + extension->manifest_version(), + kMaxManifestVersion); // We might have wanted to count legacy packaged apps here, too, since they // are effectively extensions. Unfortunately, it's too late, as we don't // want to mess up the existing stats. if (type == Manifest::TYPE_EXTENSION) { - base::UmaHistogramEnumeration("Extensions.BackgroundPageType", + base::UmaHistogramEnumeration("Extensions.BackgroundPageType2", GetBackgroundPageType(extension)); - if (should_record_incremented_metrics) { - base::UmaHistogramEnumeration("Extensions.BackgroundPageType2", - GetBackgroundPageType(extension)); - } if (GetBackgroundPageType(extension) == BackgroundPageType::kEventPage) { // Count extension event pages with no registered events. Either the @@ -758,12 +701,8 @@ // Using an enumeration shows us the total installed ratio across all users. // Using the totals per user at each startup tells us the distribution of // usage for each user (e.g. 40% of users have at least one app installed). - UMA_HISTOGRAM_ENUMERATION( - "Extensions.LoadType", type, Manifest::NUM_LOAD_TYPES); - if (should_record_incremented_metrics) { - UMA_HISTOGRAM_ENUMERATION("Extensions.LoadType2", type, - Manifest::NUM_LOAD_TYPES); - } + UMA_HISTOGRAM_ENUMERATION("Extensions.LoadType2", type, + Manifest::NUM_LOAD_TYPES); switch (type) { case Manifest::TYPE_THEME: ++theme_count; @@ -819,8 +758,7 @@ ++no_action_count; } - RecordPermissionMessagesHistogram(extension, "Load", - should_record_incremented_metrics); + RecordPermissionMessagesHistogram(extension, "Load", profile); // For incognito and file access, skip anything that doesn't appear in // settings. Also, policy-installed (and unpacked of course, checked above) @@ -854,13 +792,8 @@ bool extension_has_withheld_hosts = permissions_manager->HasWithheldHostPermissions(*extension); UMA_HISTOGRAM_BOOLEAN( - "Extensions.RuntimeHostPermissions.ExtensionHasWithheldHosts", + "Extensions.RuntimeHostPermissions.ExtensionHasWithheldHosts2", extension_has_withheld_hosts); - if (should_record_incremented_metrics) { - UMA_HISTOGRAM_BOOLEAN( - "Extensions.RuntimeHostPermissions.ExtensionHasWithheldHosts2", - extension_has_withheld_hosts); - } if (extension_has_withheld_hosts) { // Record the number of granted hosts if and only if the extension // has withheld host permissions. This lets us equate "0" granted @@ -880,18 +813,12 @@ // permissions). We could potentially also record the granted hosts that // were explicitly not requested. UMA_HISTOGRAM_COUNTS_100( - "Extensions.RuntimeHostPermissions.GrantedHostCount", + "Extensions.RuntimeHostPermissions.GrantedHostCount2", num_granted_hosts); - if (should_record_incremented_metrics) { - UMA_HISTOGRAM_COUNTS_100( - "Extensions.RuntimeHostPermissions.GrantedHostCount2", - num_granted_hosts); - } } } - LogHostPermissionsAccess(*extension, should_record_incremented_metrics); - + LogHostPermissionsAccess(*extension); if (ExtensionAllowlist::Get(profile)->GetExtensionAllowlistState( extension->id()) == ALLOWLIST_NOT_ALLOWLISTED) { // Record the number of not allowlisted enabled extensions. @@ -901,49 +828,34 @@ const ExtensionSet& disabled_extensions = extension_registry_->disabled_extensions(); - for (const scoped_refptr<const Extension>& disabled_extension : disabled_extensions) { - mojom::ManifestLocation location = disabled_extension->location(); + mojom::ManifestLocation disabled_location = disabled_extension->location(); if (extension_prefs_->DidExtensionEscalatePermissions( disabled_extension->id())) { ++disabled_for_permissions_count; } - if (should_record_incremented_metrics) { - RecordDisableReasons( - extension_prefs_->GetDisableReasons(disabled_extension->id())); - } - if (Manifest::IsExternalLocation(location)) { + RecordDisableReasons( + extension_prefs_->GetDisableReasons(disabled_extension->id())); + if (Manifest::IsExternalLocation(disabled_location)) { // See loop above for ENABLED. - if (UpdatesFromWebstore(*disabled_extension)) { - base::UmaHistogramEnumeration("Extensions.ExternalItemState", - ExternalItemState::kWebstoreDisabled); - if (should_record_incremented_metrics) { - base::UmaHistogramEnumeration("Extensions.ExternalItemState2", - ExternalItemState::kWebstoreDisabled); - } - } else { - base::UmaHistogramEnumeration("Extensions.ExternalItemState", - ExternalItemState::kNonwebstoreDisabled); - if (should_record_incremented_metrics) { - base::UmaHistogramEnumeration( - "Extensions.ExternalItemState2", - ExternalItemState::kNonwebstoreDisabled); - } - } + ExternalItemState state = UpdatesFromWebstore(*disabled_extension) + ? ExternalItemState::kWebstoreDisabled + : ExternalItemState::kNonwebstoreDisabled; + base::UmaHistogramEnumeration("Extensions.ExternalItemState2", state); } // Record disabled non-webstore extensions based on developer mode status. - if (is_user_profile && !UpdatesFromWebstore(*disabled_extension) && + if (!UpdatesFromWebstore(*disabled_extension) && !disabled_extension->from_webstore()) { if (dev_mode_enabled) { base::UmaHistogramEnumeration( "Extensions.NonWebstoreLocationWithDeveloperModeOn.Disabled3", - location); + disabled_location); } else { base::UmaHistogramEnumeration( "Extensions.NonWebstoreLocationWithDeveloperModeOff.Disabled3", - location); + disabled_location); } } @@ -954,203 +866,131 @@ } } - if (is_user_profile) { - base::UmaHistogramCounts100( - "Extensions.ManifestVersion2Count.Internal", - internal_manifest_version_counts.version_2_count); - base::UmaHistogramCounts100( - "Extensions.ManifestVersion3Count.Internal", - internal_manifest_version_counts.version_3_count); - base::UmaHistogramCounts100( - "Extensions.ManifestVersion2Count.External", - external_manifest_version_counts.version_2_count); - base::UmaHistogramCounts100( - "Extensions.ManifestVersion3Count.External", - external_manifest_version_counts.version_3_count); - base::UmaHistogramCounts100( - "Extensions.ManifestVersion2Count.Component", - component_manifest_version_counts.version_2_count); - base::UmaHistogramCounts100( - "Extensions.ManifestVersion3Count.Component", - component_manifest_version_counts.version_3_count); - base::UmaHistogramCounts100("Extensions.ManifestVersion2Count.Policy", - policy_manifest_version_counts.version_2_count); - base::UmaHistogramCounts100("Extensions.ManifestVersion3Count.Policy", - policy_manifest_version_counts.version_3_count); - base::UmaHistogramCounts100( - "Extensions.ManifestVersion2Count.Unpacked", - unpacked_manifest_version_counts.version_2_count); - base::UmaHistogramCounts100( - "Extensions.ManifestVersion3Count.Unpacked", - unpacked_manifest_version_counts.version_3_count); + base::UmaHistogramCounts100("Extensions.ManifestVersion2Count.Internal", + internal_manifest_version_counts.version_2_count); + base::UmaHistogramCounts100("Extensions.ManifestVersion3Count.Internal", + internal_manifest_version_counts.version_3_count); + base::UmaHistogramCounts100("Extensions.ManifestVersion2Count.External", + external_manifest_version_counts.version_2_count); + base::UmaHistogramCounts100("Extensions.ManifestVersion3Count.External", + external_manifest_version_counts.version_3_count); + base::UmaHistogramCounts100( + "Extensions.ManifestVersion2Count.Component", + component_manifest_version_counts.version_2_count); + base::UmaHistogramCounts100( + "Extensions.ManifestVersion3Count.Component", + component_manifest_version_counts.version_3_count); + base::UmaHistogramCounts100("Extensions.ManifestVersion2Count.Policy", + policy_manifest_version_counts.version_2_count); + base::UmaHistogramCounts100("Extensions.ManifestVersion3Count.Policy", + policy_manifest_version_counts.version_3_count); + base::UmaHistogramCounts100("Extensions.ManifestVersion2Count.Unpacked", + unpacked_manifest_version_counts.version_2_count); + base::UmaHistogramCounts100("Extensions.ManifestVersion3Count.Unpacked", + unpacked_manifest_version_counts.version_3_count); - auto get_manifest_version_population_split = - [](const ManifestVersion2And3Counts& counts) { - if (counts.version_2_count == 0 && counts.version_3_count == 0) { - return ManifestVersionPopulationSplit::kNoExtensions; - } - if (counts.version_2_count > 0 && counts.version_3_count == 0) { - return ManifestVersionPopulationSplit::kMv2ExtensionsOnly; - } - if (counts.version_3_count > 0 && counts.version_2_count == 0) { - return ManifestVersionPopulationSplit::kMv3ExtensionsOnly; - } - return ManifestVersionPopulationSplit::kMv2AndMv3Extensions; - }; - base::UmaHistogramEnumeration( - "Extensions.ManifestVersionPopulationSplit.Internal", - get_manifest_version_population_split( - internal_manifest_version_counts)); - base::UmaHistogramEnumeration( - "Extensions.ManifestVersionPopulationSplit.External", - get_manifest_version_population_split( - external_manifest_version_counts)); - base::UmaHistogramEnumeration( - "Extensions.ManifestVersionPopulationSplit.Component", - get_manifest_version_population_split( - component_manifest_version_counts)); - base::UmaHistogramEnumeration( - "Extensions.ManifestVersionPopulationSplit.Unpacked", - get_manifest_version_population_split( - unpacked_manifest_version_counts)); - ManifestVersion2And3Counts internal_and_external_counts; - internal_and_external_counts.version_2_count = - internal_manifest_version_counts.version_2_count + - external_manifest_version_counts.version_2_count; - internal_and_external_counts.version_3_count = - internal_manifest_version_counts.version_3_count + - external_manifest_version_counts.version_3_count; - // We log an additional one for the combination of internal and external - // since these are both "user controlled" and not unpacked. - base::UmaHistogramEnumeration( - "Extensions.ManifestVersionPopulationSplit.InternalAndExternal", - get_manifest_version_population_split( - internal_manifest_version_counts)); - } + auto get_manifest_version_population_split = + [](const ManifestVersion2And3Counts& counts) { + if (counts.version_2_count == 0 && counts.version_3_count == 0) { + return ManifestVersionPopulationSplit::kNoExtensions; + } + if (counts.version_2_count > 0 && counts.version_3_count == 0) { + return ManifestVersionPopulationSplit::kMv2ExtensionsOnly; + } + if (counts.version_3_count > 0 && counts.version_2_count == 0) { + return ManifestVersionPopulationSplit::kMv3ExtensionsOnly; + } + return ManifestVersionPopulationSplit::kMv2AndMv3Extensions; + }; + base::UmaHistogramEnumeration( + "Extensions.ManifestVersionPopulationSplit.Internal", + get_manifest_version_population_split(internal_manifest_version_counts)); + base::UmaHistogramEnumeration( + "Extensions.ManifestVersionPopulationSplit.External", + get_manifest_version_population_split(external_manifest_version_counts)); + base::UmaHistogramEnumeration( + "Extensions.ManifestVersionPopulationSplit.Component", + get_manifest_version_population_split(component_manifest_version_counts)); + base::UmaHistogramEnumeration( + "Extensions.ManifestVersionPopulationSplit.Unpacked", + get_manifest_version_population_split(unpacked_manifest_version_counts)); + ManifestVersion2And3Counts internal_and_external_counts; + internal_and_external_counts.version_2_count = + internal_manifest_version_counts.version_2_count + + external_manifest_version_counts.version_2_count; + internal_and_external_counts.version_3_count = + internal_manifest_version_counts.version_3_count + + external_manifest_version_counts.version_3_count; + // We log an additional one for the combination of internal and external + // since these are both "user controlled" and not unpacked. + base::UmaHistogramEnumeration( + "Extensions.ManifestVersionPopulationSplit.InternalAndExternal", + get_manifest_version_population_split(internal_manifest_version_counts)); - base::UmaHistogramCounts100("Extensions.LoadApp", + base::UmaHistogramCounts100("Extensions.LoadApp2", app_user_count + app_external_count); - base::UmaHistogramCounts100("Extensions.LoadAppUser", app_user_count); - base::UmaHistogramCounts100("Extensions.LoadAppExternal", app_external_count); - base::UmaHistogramCounts100("Extensions.LoadHostedApp", hosted_app_count); - base::UmaHistogramCounts100("Extensions.LoadPackagedApp", + base::UmaHistogramCounts100("Extensions.LoadAppUser2", app_user_count); + base::UmaHistogramCounts100("Extensions.LoadAppExternal2", + app_external_count); + base::UmaHistogramCounts100("Extensions.LoadHostedApp2", hosted_app_count); + base::UmaHistogramCounts100("Extensions.LoadPackagedApp2", legacy_packaged_app_count); - base::UmaHistogramCounts100("Extensions.LoadPlatformApp", platform_app_count); - base::UmaHistogramCounts100("Extensions.LoadExtension", + base::UmaHistogramCounts100("Extensions.LoadPlatformApp2", + platform_app_count); + base::UmaHistogramCounts100("Extensions.LoadExtension2", extension_user_count + extension_external_count); - base::UmaHistogramCounts100("Extensions.LoadExtensionExternal", + base::UmaHistogramCounts100("Extensions.LoadExtensionUser2", + extension_user_count); + base::UmaHistogramCounts100("Extensions.LoadExtensionExternal2", extension_external_count); - base::UmaHistogramCounts100("Extensions.LoadTheme", theme_count); - base::UmaHistogramCounts100("Extensions.LoadBrowserAction", + base::UmaHistogramCounts100("Extensions.LoadTheme2", theme_count); + base::UmaHistogramCounts100("Extensions.LoadBrowserAction2", browser_action_count); - base::UmaHistogramCounts100("Extensions.LoadNoExtensionAction", + base::UmaHistogramCounts100("Extensions.LoadNoExtensionAction2", no_action_count); - base::UmaHistogramCounts100("Extensions.DisabledForPermissions", + base::UmaHistogramCounts100("Extensions.DisabledForPermissions2", disabled_for_permissions_count); - base::UmaHistogramCounts100("Extensions.NonWebStoreNewTabPageOverrides", + base::UmaHistogramCounts100("Extensions.NonWebStoreNewTabPageOverrides2", non_webstore_ntp_override_count); - base::UmaHistogramCounts100("Extensions.NewTabPageOverrides", + base::UmaHistogramCounts100("Extensions.NewTabPageOverrides2", ntp_override_count); - base::UmaHistogramCounts100("Extensions.SearchEngineOverrides", + base::UmaHistogramCounts100("Extensions.SearchEngineOverrides2", search_engine_override_count); - base::UmaHistogramCounts100("Extensions.StartupPagesOverrides", + base::UmaHistogramCounts100("Extensions.StartupPagesOverrides2", startup_pages_override_count); - base::UmaHistogramCounts100("Extensions.HomepageOverrides", + base::UmaHistogramCounts100("Extensions.HomepageOverrides2", homepage_override_count); - if (should_record_incremented_metrics) { - base::UmaHistogramCounts100("Extensions.LoadApp2", - app_user_count + app_external_count); - base::UmaHistogramCounts100("Extensions.LoadAppUser2", app_user_count); - base::UmaHistogramCounts100("Extensions.LoadAppExternal2", - app_external_count); - base::UmaHistogramCounts100("Extensions.LoadHostedApp2", hosted_app_count); - base::UmaHistogramCounts100("Extensions.LoadPackagedApp2", - legacy_packaged_app_count); - base::UmaHistogramCounts100("Extensions.LoadPlatformApp2", - platform_app_count); - base::UmaHistogramCounts100( - "Extensions.LoadExtension2", - extension_user_count + extension_external_count); - base::UmaHistogramCounts100("Extensions.LoadExtensionUser2", - extension_user_count); - base::UmaHistogramCounts100("Extensions.LoadExtensionExternal2", - extension_external_count); - base::UmaHistogramCounts100("Extensions.LoadTheme2", theme_count); - base::UmaHistogramCounts100("Extensions.LoadBrowserAction2", - browser_action_count); - base::UmaHistogramCounts100("Extensions.LoadNoExtensionAction2", - no_action_count); - base::UmaHistogramCounts100("Extensions.DisabledForPermissions2", - disabled_for_permissions_count); - base::UmaHistogramCounts100("Extensions.NonWebStoreNewTabPageOverrides2", - non_webstore_ntp_override_count); - base::UmaHistogramCounts100("Extensions.NewTabPageOverrides2", - ntp_override_count); - base::UmaHistogramCounts100("Extensions.SearchEngineOverrides2", - search_engine_override_count); - base::UmaHistogramCounts100("Extensions.StartupPagesOverrides2", - startup_pages_override_count); - base::UmaHistogramCounts100("Extensions.HomepageOverrides2", - homepage_override_count); - } if (incognito_allowed_count + incognito_not_allowed_count > 0) { - base::UmaHistogramCounts100("Extensions.IncognitoAllowed", + base::UmaHistogramCounts100("Extensions.IncognitoAllowed2", incognito_allowed_count); - if (should_record_incremented_metrics) { - base::UmaHistogramCounts100("Extensions.IncognitoAllowed2", - incognito_allowed_count); - } } - if (file_access_allowed_count + file_access_not_allowed_count > 0 && - should_record_incremented_metrics) { + if (file_access_allowed_count + file_access_not_allowed_count > 0) { base::UmaHistogramCounts100("Extensions.FileAccessAllowed2", file_access_allowed_count); base::UmaHistogramCounts100("Extensions.FileAccessNotAllowed2", file_access_not_allowed_count); } - base::UmaHistogramCounts100( - "Extensions.CorruptExtensionTotalDisables", - extension_prefs_->GetPrefAsInteger(kCorruptedDisableCount)); - base::UmaHistogramCounts100("Extensions.LoadOffStoreItems", - off_store_item_count); - base::UmaHistogramCounts100("Extensions.WebRequestBlockingCount", - web_request_blocking_count); - base::UmaHistogramCounts100("Extensions.WebRequestCount", web_request_count); - base::UmaHistogramCounts100("Extensions.NotAllowlistedEnabled", - enabled_not_allowlisted_count); - base::UmaHistogramCounts100("Extensions.NotAllowlistedDisabled", - disabled_not_allowlisted_count); - if (should_record_incremented_metrics) { - base::UmaHistogramCounts100( - "Extensions.CorruptExtensionTotalDisables2", - extension_prefs_->GetPrefAsInteger(kCorruptedDisableCount)); - base::UmaHistogramCounts100("Extensions.EventlessEventPages2", - eventless_event_pages_count); - base::UmaHistogramCounts100("Extensions.LoadOffStoreItems2", - off_store_item_count); - base::UmaHistogramCounts100("Extensions.WebRequestBlockingCount2", - web_request_blocking_count); - base::UmaHistogramCounts100("Extensions.WebRequestCount2", - web_request_count); - base::UmaHistogramCounts100("Extensions.NotAllowlistedEnabled2", - enabled_not_allowlisted_count); - base::UmaHistogramCounts100("Extensions.NotAllowlistedDisabled2", - disabled_not_allowlisted_count); - } + base::UmaHistogramCounts100( + "Extensions.CorruptExtensionTotalDisables2", + extension_prefs_->GetPrefAsInteger(kCorruptedDisableCount)); + base::UmaHistogramCounts100("Extensions.EventlessEventPages2", + eventless_event_pages_count); + base::UmaHistogramCounts100("Extensions.LoadOffStoreItems2", + off_store_item_count); + base::UmaHistogramCounts100("Extensions.WebRequestBlockingCount2", + web_request_blocking_count); + base::UmaHistogramCounts100("Extensions.WebRequestCount2", web_request_count); + base::UmaHistogramCounts100("Extensions.NotAllowlistedEnabled2", + enabled_not_allowlisted_count); + base::UmaHistogramCounts100("Extensions.NotAllowlistedDisabled2", + disabled_not_allowlisted_count); if (safe_browsing::IsEnhancedProtectionEnabled(*profile->GetPrefs())) { - base::UmaHistogramCounts100("Extensions.NotAllowlistedEnabledAndEsbUser", + base::UmaHistogramCounts100("Extensions.NotAllowlistedEnabledAndEsbUser2", enabled_not_allowlisted_count); - base::UmaHistogramCounts100("Extensions.NotAllowlistedDisabledAndEsbUser", + base::UmaHistogramCounts100("Extensions.NotAllowlistedDisabledAndEsbUser2", disabled_not_allowlisted_count); - if (should_record_incremented_metrics) { - base::UmaHistogramCounts100("Extensions.NotAllowlistedEnabledAndEsbUser2", - enabled_not_allowlisted_count); - base::UmaHistogramCounts100( - "Extensions.NotAllowlistedDisabledAndEsbUser2", - disabled_not_allowlisted_count); - } } }
diff --git a/chrome/browser/extensions/installed_loader.h b/chrome/browser/extensions/installed_loader.h index 0cbdb28..deb9aac 100644 --- a/chrome/browser/extensions/installed_loader.h +++ b/chrome/browser/extensions/installed_loader.h
@@ -56,13 +56,14 @@ void LoadAllExtensions(Profile* profile); // Record a histogram using the PermissionMessage enum values for each - // permission in `extension`. + // permission in `extension`. Meant to be called only for profiles where users + // can install extensions, specifically profiles that can have non-component + // extensions installed. // NOTE: If this is ever called with high frequency, the implementation may // need to be made more efficient. - static void RecordPermissionMessagesHistogram( - const Extension* extension, - const char* histogram, - bool log_user_profile_histograms); + static void RecordPermissionMessagesHistogram(const Extension* extension, + const char* histogram, + Profile* profile); // Allows tests to verify metrics without needing to go through // LoadAllExtensions(). @@ -76,11 +77,10 @@ // extension that is already installed. int GetCreationFlags(const ExtensionInfo* info); - // Records metrics related to the loaded extensions. - // `is_user_profile` indicates that this is a profile where users can install - // extensions, specifically profiles that can have non-component extensions - // installed. This causes incremented histograms to emit. - void RecordExtensionsMetrics(Profile* profile, bool is_user_profile); + // Records metrics related to the loaded extensions. Meant to be called only + // for profiles where users can install extensions, specifically profiles that + // can have non-component extensions installed. + void RecordExtensionsMetrics(Profile* profile); // Handles a load request for a corrupted extension. void HandleCorruptExtension(const Extension& extension,
diff --git a/chrome/browser/extensions/installed_loader_unittest.cc b/chrome/browser/extensions/installed_loader_unittest.cc index f568219..2fc092d 100644 --- a/chrome/browser/extensions/installed_loader_unittest.cc +++ b/chrome/browser/extensions/installed_loader_unittest.cc
@@ -29,15 +29,15 @@ namespace { constexpr const char kHasWithheldHostsHistogram[] = - "Extensions.RuntimeHostPermissions.ExtensionHasWithheldHosts"; + "Extensions.RuntimeHostPermissions.ExtensionHasWithheldHosts2"; constexpr const char kGrantedHostCountHistogram[] = - "Extensions.RuntimeHostPermissions.GrantedHostCount"; + "Extensions.RuntimeHostPermissions.GrantedHostCount2"; constexpr const char kGrantedAccessHistogram[] = - "Extensions.HostPermissions.GrantedAccess"; + "Extensions.HostPermissions.GrantedAccess2"; constexpr const char kGrantedAccessForBroadRequestsHistogram[] = - "Extensions.HostPermissions.GrantedAccessForBroadRequests"; + "Extensions.HostPermissions.GrantedAccessForBroadRequests2"; constexpr const char kGrantedAccessForTargetedRequestsHistogram[] = - "Extensions.HostPermissions.GrantedAccessForTargetedRequests"; + "Extensions.HostPermissions.GrantedAccessForTargetedRequests2"; // Use an internal location for extensions since metrics aren't recorded for // unpacked extensions. constexpr mojom::ManifestLocation kManifestInternal = @@ -171,9 +171,6 @@ InstalledLoader loader(profile()); loader.RecordExtensionsIncrementedMetricsForTesting(profile()); - histograms.ExpectTotalCount("Extensions.LoadAllTime2", 1); - histograms.ExpectTotalCount("Extensions.LoadAll", 1); - histograms.ExpectTotalCount("Extensions.Disabled", 1); histograms.ExpectTotalCount("Extensions.LoadAllTime2.NonUser", nonuser_expected_total_count); histograms.ExpectTotalCount("Extensions.LoadAllTime2.User", @@ -185,7 +182,48 @@ user_expected_total_count); } -TEST_F(InstalledLoaderUnitTest, +// Tests that some histograms that only emit for profiles that can use +// non-component extensions do not emit as expected. +TEST_F(InstalledLoaderUnitTest, UserMetrics_UserMetricsDoNotEmitForGuestUser) { + ASSERT_TRUE(AddExtension({"<all_urls>"}, kManifestInternal)); + ASSERT_NO_FATAL_FAILURE(MaybeSetUpTestUser(/*is_guest=*/true)); + + RunEmitUserHistogramsTest( + /*nonuser_expected_total_count=*/1, + /*user_expected_total_count=*/0); +} + +// This only differs from the parent class in that it explicitly logs-in a +// "regular" user profile so the metrics record as expected. +class InstalledLoaderUnitTestWithRegularUser : public InstalledLoaderUnitTest { + public: + InstalledLoaderUnitTestWithRegularUser() = default; + + InstalledLoaderUnitTestWithRegularUser( + const InstalledLoaderUnitTestWithRegularUser&) = delete; + InstalledLoaderUnitTestWithRegularUser& operator=( + const InstalledLoaderUnitTestWithRegularUser&) = delete; + + ~InstalledLoaderUnitTestWithRegularUser() override = default; + + void SetUp() override { + InstalledLoaderUnitTest::SetUp(); + ASSERT_NO_FATAL_FAILURE(MaybeSetUpTestUser(/*is_guest=*/false)); + } +}; + +// Tests that some histograms that only emit for profiles that can use +// non-component extensions emit as expected. +TEST_F(InstalledLoaderUnitTestWithRegularUser, + UserMetrics_UserMetricsEmitForRegularUser) { + ASSERT_TRUE(AddExtension({"<all_urls>"}, kManifestInternal)); + + RunEmitUserHistogramsTest( + /*nonuser_expected_total_count=*/0, + /*user_expected_total_count=*/1); +} + +TEST_F(InstalledLoaderUnitTestWithRegularUser, RuntimeHostPermissions_Metrics_HasWithheldHosts_False) { AddExtension({"<all_urls>"}, kManifestInternal); @@ -201,7 +239,7 @@ histograms.ExpectTotalCount(kGrantedHostCountHistogram, 0); } -TEST_F(InstalledLoaderUnitTest, +TEST_F(InstalledLoaderUnitTestWithRegularUser, RuntimeHostPermissions_Metrics_HasWithheldHosts_True) { const Extension* extension = AddExtension({"<all_urls>"}, kManifestInternal); ScriptingPermissionsModifier(profile(), extension) @@ -221,7 +259,7 @@ kEmitCount); } -TEST_F(InstalledLoaderUnitTest, +TEST_F(InstalledLoaderUnitTestWithRegularUser, RuntimeHostPermissions_Metrics_GrantedHostCount) { const Extension* extension = AddExtension({"<all_urls>"}, kManifestInternal); ScriptingPermissionsModifier modifier(profile(), extension); @@ -241,7 +279,7 @@ kEmitCount); } -TEST_F(InstalledLoaderUnitTest, +TEST_F(InstalledLoaderUnitTestWithRegularUser, HostPermissions_Metrics_GrantedAccess_CannotAffect) { HostPermissionsMetricsTestParams params; // The extension is loaded from an external policy, so the user cannot @@ -255,7 +293,7 @@ RunHostPermissionsMetricsTest(params); } -TEST_F(InstalledLoaderUnitTest, +TEST_F(InstalledLoaderUnitTestWithRegularUser, HostPermissions_Metrics_GrantedAccess_CannotAffect_Broad_AllUrls) { HostPermissionsMetricsTestParams params; // The extension with host permissions is loaded from an external policy, so @@ -268,7 +306,7 @@ RunHostPermissionsMetricsTest(params); } -TEST_F(InstalledLoaderUnitTest, +TEST_F(InstalledLoaderUnitTestWithRegularUser, HostPermissions_Metrics_GrantedAccess_CannotAffect_Broad_Patterns) { HostPermissionsMetricsTestParams params; // The extension with host permissions is loaded from an external policy, so @@ -281,7 +319,7 @@ RunHostPermissionsMetricsTest(params); } -TEST_F(InstalledLoaderUnitTest, +TEST_F(InstalledLoaderUnitTestWithRegularUser, HostPermissions_Metrics_GrantedAccess_CannotAffect_Targeted) { HostPermissionsMetricsTestParams params; // The extension with host permissions is loaded from an external policy, so @@ -295,7 +333,7 @@ RunHostPermissionsMetricsTest(params); } -TEST_F(InstalledLoaderUnitTest, +TEST_F(InstalledLoaderUnitTestWithRegularUser, HostPermissions_Metrics_GrantedAccess_NotRequested) { HostPermissionsMetricsTestParams params; params.manifest_location = kManifestInternal; @@ -307,7 +345,7 @@ RunHostPermissionsMetricsTest(params); } -TEST_F(InstalledLoaderUnitTest, +TEST_F(InstalledLoaderUnitTestWithRegularUser, HostPermissions_Metrics_GrantedAccess_OnClick_Broad_AllUrls) { HostPermissionsMetricsTestParams params; params.manifest_location = kManifestInternal; @@ -319,7 +357,7 @@ RunHostPermissionsMetricsTest(params); } -TEST_F(InstalledLoaderUnitTest, +TEST_F(InstalledLoaderUnitTestWithRegularUser, HostPermissions_Metrics_GrantedAccess_OnClick_Broad_Pattern) { HostPermissionsMetricsTestParams params; params.manifest_location = kManifestInternal; @@ -331,7 +369,7 @@ RunHostPermissionsMetricsTest(params); } -TEST_F(InstalledLoaderUnitTest, +TEST_F(InstalledLoaderUnitTestWithRegularUser, HostPermissions_Metrics_GrantedAccess_OnClick_Targeted) { HostPermissionsMetricsTestParams params; params.manifest_location = kManifestInternal; @@ -344,7 +382,7 @@ RunHostPermissionsMetricsTest(params); } -TEST_F(InstalledLoaderUnitTest, +TEST_F(InstalledLoaderUnitTestWithRegularUser, HostPermissions_Metrics_GrantedAccess_OnSpecificSites_Broad_AllUrls) { HostPermissionsMetricsTestParams params; params.manifest_location = kManifestInternal; @@ -357,7 +395,7 @@ RunHostPermissionsMetricsTest(params); } -TEST_F(InstalledLoaderUnitTest, +TEST_F(InstalledLoaderUnitTestWithRegularUser, HostPermissions_Metrics_GrantedAccess_OnSpecificSites_Broad_Pattern) { HostPermissionsMetricsTestParams params; params.manifest_location = kManifestInternal; @@ -370,7 +408,7 @@ RunHostPermissionsMetricsTest(params); } -TEST_F(InstalledLoaderUnitTest, +TEST_F(InstalledLoaderUnitTestWithRegularUser, HostPermissions_Metrics_GrantedAccess_OnSpecificSites_Targeted) { HostPermissionsMetricsTestParams params; params.manifest_location = kManifestInternal; @@ -386,7 +424,7 @@ } TEST_F( - InstalledLoaderUnitTest, + InstalledLoaderUnitTestWithRegularUser, HostPermissions_Metrics_GrantedAccess_OnAllRequestedSites_Broad_AllUrls) { HostPermissionsMetricsTestParams params; params.manifest_location = kManifestInternal; @@ -398,7 +436,7 @@ } TEST_F( - InstalledLoaderUnitTest, + InstalledLoaderUnitTestWithRegularUser, HostPermissions_Metrics_GrantedAccess_OnAllRequestedSites_Broad_Pattern) { HostPermissionsMetricsTestParams params; params.manifest_location = kManifestInternal; @@ -409,7 +447,7 @@ RunHostPermissionsMetricsTest(params); } -TEST_F(InstalledLoaderUnitTest, +TEST_F(InstalledLoaderUnitTestWithRegularUser, HostPermissions_Metrics_GrantedAccess_OnAllRequestedSites_Targeted) { HostPermissionsMetricsTestParams params; params.manifest_location = kManifestInternal; @@ -423,7 +461,7 @@ RunHostPermissionsMetricsTest(params); } -TEST_F(InstalledLoaderUnitTest, +TEST_F(InstalledLoaderUnitTestWithRegularUser, HostPermissions_Metrics_GrantedAccess_OnActiveTabOnly) { HostPermissionsMetricsTestParams params; params.manifest_location = kManifestInternal; @@ -436,29 +474,4 @@ RunHostPermissionsMetricsTest(params); } -// TODO(crbug.com/40878021): After deleting the deprecated unincremented -// histograms, consider modifying these to becomes less of change detectors in -// metrics being modified. -// Tests that some histograms that only emit for profiles that can use -// non-component extensions emit as expected. -TEST_F(InstalledLoaderUnitTest, UserMetrics_UserMetricsEmitForRegularUser) { - ASSERT_TRUE(AddExtension({"<all_urls>"}, kManifestInternal)); - ASSERT_NO_FATAL_FAILURE(MaybeSetUpTestUser(/*is_guest=*/false)); - - RunEmitUserHistogramsTest( - /*nonuser_expected_total_count=*/0, - /*user_expected_total_count=*/1); -} - -// Tests that some histograms that only emit for profiles that can use -// non-component extensions do not emit as expected. -TEST_F(InstalledLoaderUnitTest, UserMetrics_UserMetricsDoNotEmitForGuestUser) { - ASSERT_TRUE(AddExtension({"<all_urls>"}, kManifestInternal)); - ASSERT_NO_FATAL_FAILURE(MaybeSetUpTestUser(/*is_guest=*/true)); - - RunEmitUserHistogramsTest( - /*nonuser_expected_total_count=*/1, - /*user_expected_total_count=*/0); -} - } // namespace extensions
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json index 5a1e204..a077b54 100644 --- a/chrome/browser/flag-metadata.json +++ b/chrome/browser/flag-metadata.json
@@ -2087,6 +2087,11 @@ "expiry_milestone": 120 }, { + "name": "default-browser-off-cycle-promo", + "owners": [ "gujen@google.com", "bling-mony-pod@google.com", "bling-flags@google.com" ], + "expiry_milestone": 143 + }, + { "name": "default-browser-promo-trigger-criteria-experiment", "owners": [ "gayane@google.com", "bling-flags@google.com" ], "expiry_milestone": 140
diff --git a/chrome/browser/gesturenav/android/BUILD.gn b/chrome/browser/gesturenav/android/BUILD.gn index df2ba55..fdb6334 100644 --- a/chrome/browser/gesturenav/android/BUILD.gn +++ b/chrome/browser/gesturenav/android/BUILD.gn
@@ -44,7 +44,7 @@ "//components/embedder_support/android:util_java", "//content/public/test/android:content_java_test_support", "//third_party/androidx:androidx_test_runner_java", - "//third_party/junit:junit", + "//third_party/junit", ] }
diff --git a/chrome/browser/glic/BUILD.gn b/chrome/browser/glic/BUILD.gn index 2f90d5d2..0e4f966 100644 --- a/chrome/browser/glic/BUILD.gn +++ b/chrome/browser/glic/BUILD.gn
@@ -66,18 +66,18 @@ "//chrome/browser/permissions/system", "//chrome/browser/profiles:profile", "//chrome/browser/ui:browser_list", - "//chrome/browser/ui/browser_window:browser_window", + "//chrome/browser/ui/browser_window", "//chrome/browser/ui/tabs:tab_strip_model_observer", "//components/content_extraction/content/browser", "//components/favicon/core", - "//components/metrics:metrics", + "//components/metrics", "//components/optimization_guide/content/browser", "//components/prefs", "//components/signin/public/identity_manager", "//components/variations", "//content/public/browser", - "//google_apis/common:common", - "//ui/views:views", + "//google_apis/common", + "//ui/views", "//ui/views/controls/webview", "//ui/webui", ] @@ -164,7 +164,7 @@ "//chrome/browser/actor/ui", "//chrome/browser/background/glic", "//chrome/browser/contextual_cueing", - "//chrome/browser/feedback:feedback", + "//chrome/browser/feedback", "//chrome/browser/glic/browser_ui", "//chrome/browser/glic/fre", "//chrome/browser/glic/media", @@ -177,30 +177,30 @@ "//chrome/browser/resources/glic:resources", "//chrome/browser/resources/glic/fre:resources", "//chrome/browser/signin", - "//chrome/browser/themes:themes", + "//chrome/browser/themes", "//chrome/browser/ui:browser_element_identifiers", "//chrome/browser/ui:browser_list", "//chrome/browser/ui:browser_navigator_params_headers", "//chrome/browser/ui:browser_tab_strip", "//chrome/browser/ui:ui_features", - "//chrome/browser/ui/browser_window:browser_window", + "//chrome/browser/ui/browser_window", "//chrome/browser/ui/profiles", "//chrome/browser/ui/tabs:tab_strip", "//chrome/browser/ui/user_education", "//chrome/browser/ui/views", "//chrome/common", - "//components/favicon/content:content", + "//components/favicon/content", "//components/feature_engagement/public:feature_constants", - "//components/feedback/content:content", + "//components/feedback/content", "//components/guest_view/browser", "//components/language/core/common", "//components/metrics", - "//components/metrics_services_manager:metrics_services_manager", + "//components/metrics_services_manager", "//components/pref_registry", "//components/prefs", "//components/sessions", "//components/variations/service", - "//extensions/browser:browser", + "//extensions/browser", "//third_party/metrics_proto", "//ui/webui", "//url", @@ -240,9 +240,7 @@ "//url/mojom:url_mojom_origin", ] - overridden_deps = [ - "//third_party/blink/public/mojom:mojom_platform", - ] + overridden_deps = [ "//third_party/blink/public/mojom:mojom_platform" ] component_deps = [ "//content/public/common" ] } @@ -264,20 +262,20 @@ ":impl", "//base/test:test_support", "//chrome/browser:global_features", - "//chrome/browser/background:background", + "//chrome/browser/background", "//chrome/browser/background/glic", "//chrome/browser/glic/browser_ui:unit_tests", "//chrome/browser/glic/fre:unit_tests", "//chrome/browser/glic/media:unit_tests", "//chrome/browser/glic/test_support", - "//chrome/browser/prefs:prefs", - "//chrome/browser/status_icons:status_icons", + "//chrome/browser/prefs", + "//chrome/browser/status_icons", "//chrome/browser/ui", "//chrome/browser/ui:ui_features", "//chrome/common:chrome_features", "//chrome/test:test_support", + "//components/live_caption", "//components/live_caption:constants", - "//components/live_caption:live_caption", "//testing/gmock", "//testing/gtest", ] @@ -311,12 +309,12 @@ "//chrome/browser/actor/ui:test_support", "//chrome/browser/background/glic", "//chrome/browser/contextual_cueing:test_support", - "//chrome/browser/extensions:extensions", + "//chrome/browser/extensions", "//chrome/browser/glic/fre:browser_tests", "//chrome/browser/glic/test_support", "//chrome/browser/permissions:test_support", "//chrome/browser/policy:test_support", - "//chrome/browser/prefs:prefs", + "//chrome/browser/prefs", "//chrome/browser/ui", "//chrome/browser/ui:ui_features", "//chrome/browser/ui/profiles", @@ -359,7 +357,7 @@ ":impl", "//chrome/browser", "//chrome/browser:global_features", - "//chrome/browser/actor:actor", + "//chrome/browser/actor", "//chrome/browser/actor:test_support", "//chrome/browser/background/glic", "//chrome/browser/contextual_cueing",
diff --git a/chrome/browser/glic/browser_ui/BUILD.gn b/chrome/browser/glic/browser_ui/BUILD.gn index 78e43ae0..48c0e5b4 100644 --- a/chrome/browser/glic/browser_ui/BUILD.gn +++ b/chrome/browser/glic/browser_ui/BUILD.gn
@@ -19,10 +19,10 @@ "theme_util.h", ] deps = [ - "//chrome/browser/themes:themes", + "//chrome/browser/themes", "//chrome/browser/ui/tabs:tab_strip", - "//chrome/browser/ui/user_education:user_education", - "//components/feature_engagement/public:public", + "//chrome/browser/ui/user_education", + "//components/feature_engagement/public", ] public_deps = [ "//chrome/browser/glic" ] } @@ -33,7 +33,7 @@ deps = [ ":browser_ui", "//base/test:test_support", - "//chrome/browser:browser", + "//chrome/browser", "//chrome/browser:global_features", "//chrome/browser/glic", "//chrome/browser/glic/test_support", @@ -74,7 +74,7 @@ "//testing/gtest", "//ui/base:ozone_buildflags", "//ui/base:test_support", - "//ui/compositor:compositor", + "//ui/compositor", "//ui/gfx", "//ui/gfx:gfx_switches", "//ui/views",
diff --git a/chrome/browser/glic/e2e_test/BUILD.gn b/chrome/browser/glic/e2e_test/BUILD.gn index 2935b4bd..198bfa6b 100644 --- a/chrome/browser/glic/e2e_test/BUILD.gn +++ b/chrome/browser/glic/e2e_test/BUILD.gn
@@ -80,7 +80,7 @@ # TODO(crbug.com/399665693): Remove unneeded deps after refactoring. # Required for translate_bubble_test_utils_views.cc - "//chrome/browser/ui/browser_window:browser_window", + "//chrome/browser/ui/browser_window", "//chrome/browser/ui/translate:test_support", "//chrome/test:chrome_test_launcher", "//chrome/test:test_support",
diff --git a/chrome/browser/glic/fre/BUILD.gn b/chrome/browser/glic/fre/BUILD.gn index ea00fb0..bae20d1 100644 --- a/chrome/browser/glic/fre/BUILD.gn +++ b/chrome/browser/glic/fre/BUILD.gn
@@ -54,7 +54,7 @@ "//chrome/test:test_support", "//components/signin/public/identity_manager:test_support", "//content/test:test_support", - "//testing/gtest:gtest", + "//testing/gtest", ] } @@ -67,12 +67,12 @@ "//base/test:test_support", "//chrome/browser", "//chrome/browser/glic", - "//chrome/browser/glic/test_support:test_support", - "//chrome/browser/ui:ui", + "//chrome/browser/glic/test_support", + "//chrome/browser/ui", "//chrome/test:test_support", "//chrome/test:test_support_ui", "//content/test:test_support", - "//testing/gtest:gtest", + "//testing/gtest", ] } @@ -84,7 +84,7 @@ ":fre", "//chrome/browser", "//chrome/browser/glic", - "//chrome/browser/glic/test_support:test_support", + "//chrome/browser/glic/test_support", "//chrome/browser/ui:browser_element_identifiers", "//chrome/test:test_support_ui", "//content/test:test_support",
diff --git a/chrome/browser/glic/host/context/glic_sharing_manager_impl.cc b/chrome/browser/glic/host/context/glic_sharing_manager_impl.cc index 710367d..cde4e48b 100644 --- a/chrome/browser/glic/host/context/glic_sharing_manager_impl.cc +++ b/chrome/browser/glic/host/context/glic_sharing_manager_impl.cc
@@ -112,26 +112,30 @@ auto* tab = tab_handle.Get(); if (!tab) { std::move(callback).Run( - mojom::GetContextResult::NewErrorReason(std::string("tab not found"))); + mojom::GetContextResult::NewErrorReason("tab not found")); return; } const bool is_pinned = pinned_tab_manager_.IsTabPinned(tab_handle); - if ((!profile_->GetPrefs()->GetBoolean(prefs::kGlicTabContextEnabled) || - !window_controller_->IsShowing()) && !is_pinned) { - std::move(callback).Run(mojom::GetContextResult::NewErrorReason( - std::string("permission denied"))); - return; + if (!is_pinned) { + if (!window_controller_->IsShowing()) { + std::move(callback).Run(mojom::GetContextResult::NewErrorReason( + "permission denied: window not showing")); + return; + } + if (!profile_->GetPrefs()->GetBoolean(prefs::kGlicTabContextEnabled)) { + std::move(callback).Run(mojom::GetContextResult::NewErrorReason( + "permission denied: context permission not enabled")); + return; + } } - - const bool is_focused = focused_tab_manager_.IsTabFocused(tab_handle); const bool is_shared = is_focused || is_pinned; if (!is_shared || !IsValidCandidateForSharing(tab->GetContents())) { - std::move(callback).Run(mojom::GetContextResult::NewErrorReason( - std::string("permission denied"))); + std::move(callback).Run( + mojom::GetContextResult::NewErrorReason("permission denied")); return; } if (is_focused) {
diff --git a/chrome/browser/glic/host/glic_api_browsertest.cc b/chrome/browser/glic/host/glic_api_browsertest.cc index 9bc2f643..717e8fe9 100644 --- a/chrome/browser/glic/host/glic_api_browsertest.cc +++ b/chrome/browser/glic/host/glic_api_browsertest.cc
@@ -189,6 +189,7 @@ {features::kGlicScrollTo, {}}, {features::kGlicClosedCaptioning, {}}, {features::kGlicApiActivationGating, {}}, + {mojom::features::kGlicMultiTab, {}}, {features::kGlicUserStatusCheck, {{features::kGlicUserStatusRefreshApi.name, "true"}, {features::kGlicUserStatusThrottleInterval.name, "2s"}}}, @@ -1521,6 +1522,49 @@ GlicRequestEvent::kRequestReceivedWhileHidden, 1); } +IN_PROC_BROWSER_TEST_F(GlicApiTestWithOneTab, testPinTabs) { + ExecuteJsTest(); +} + +// TODO(b/431837630): Make this work on mac. +#if BUILDFLAG(IS_MAC) +#define MAYBE_testFetchInactiveTabScreenshot \ + DISABLED_testFetchInactiveTabScreenshot +#else +#define MAYBE_testFetchInactiveTabScreenshot testFetchInactiveTabScreenshot +#endif +IN_PROC_BROWSER_TEST_F(GlicApiTestWithOneTab, + MAYBE_testFetchInactiveTabScreenshot) { + RunTestSequence(AddInstrumentedTab(kSecondTab, page_url())); + + ExecuteJsTest(); + + browser()->tab_strip_model()->SelectPreviousTab(); + + ContinueJsTest(); +} + +// TODO(b/431837630): Make this work on mac. +#if BUILDFLAG(IS_MAC) +#define MAYBE_testFetchInactiveTabScreenshotWhileMinimized \ + DISABLED_testFetchInactiveTabScreenshotWhileMinimized +#else +#define MAYBE_testFetchInactiveTabScreenshotWhileMinimized \ + testFetchInactiveTabScreenshotWhileMinimized +#endif +IN_PROC_BROWSER_TEST_F(GlicApiTestWithOneTab, + MAYBE_testFetchInactiveTabScreenshotWhileMinimized) { + RunTestSequence(AddInstrumentedTab(kSecondTab, page_url())); + bool can_fetch_screenshot = BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC); + + ExecuteJsTest({.params = base::Value(can_fetch_screenshot)}); + + browser()->tab_strip_model()->SelectPreviousTab(); + browser()->window()->Minimize(); + + ContinueJsTest(); +} + class GlicApiTestUserStatusCheckTest : public GlicApiTestWithOneTab { protected: void SetUpOnMainThread() override {
diff --git a/chrome/browser/glic/host/glic_permission_enforcement_interactive_uitest.cc b/chrome/browser/glic/host/glic_permission_enforcement_interactive_uitest.cc index 5d9d8c9..8163710f 100644 --- a/chrome/browser/glic/host/glic_permission_enforcement_interactive_uitest.cc +++ b/chrome/browser/glic/host/glic_permission_enforcement_interactive_uitest.cc
@@ -92,7 +92,7 @@ test::kGlicContentsElementId, "() => document.querySelector('#getPageContextStatus').innerText", "Error getting page context: Error: tabContext failed: permission " - "denied")); + "denied: context permission not enabled")); } IN_PROC_BROWSER_TEST_F(GlicPermissionEnforcementUiTest,
diff --git a/chrome/browser/glic/media/BUILD.gn b/chrome/browser/glic/media/BUILD.gn index 351592c19..b340c164 100644 --- a/chrome/browser/glic/media/BUILD.gn +++ b/chrome/browser/glic/media/BUILD.gn
@@ -19,16 +19,16 @@ ] deps = [ "//base", - "//chrome/browser/glic:glic", - "//chrome/browser/media/webrtc:webrtc", + "//chrome/browser/glic", + "//chrome/browser/media/webrtc", "//chrome/browser/profiles:profile", "//components/live_caption:utils", "//content/public/browser", ] public_deps = [ "//chrome/browser:browser_public_dependencies", + "//components/live_caption", "//components/live_caption:constants", - "//components/live_caption:live_caption", ] } @@ -44,9 +44,9 @@ ":media", "//base/test:test_support", "//chrome/browser/glic/test_support", - "//chrome/browser/prefs:prefs", + "//chrome/browser/prefs", "//chrome/test:test_support", - "//components/optimization_guide/content/browser:browser", + "//components/optimization_guide/content/browser", "//testing/gmock", "//testing/gtest", ]
diff --git a/chrome/browser/google/BUILD.gn b/chrome/browser/google/BUILD.gn index 8e7a23d..fb4fc8c 100644 --- a/chrome/browser/google/BUILD.gn +++ b/chrome/browser/google/BUILD.gn
@@ -17,7 +17,7 @@ deps = [ "//base", "//chrome/common:constants", - "//components/prefs:prefs", + "//components/prefs", "//content/public/browser", ] @@ -32,7 +32,7 @@ deps += [ "//chrome/browser:browser_process", "//chrome/browser/ash/policy/core", - "//chromeos/ash/components/system:system", + "//chromeos/ash/components/system", "//components/policy/core/common:common_constants", ] } @@ -96,7 +96,7 @@ "//chrome/common:constants", "//chrome/installer/util:with_no_strings", "//content/test:test_support", - "//testing/gtest:gtest", + "//testing/gtest", ] if (is_chromeos) {
diff --git a/chrome/browser/hub/BUILD.gn b/chrome/browser/hub/BUILD.gn index 0cfae06a..e4f5f1a4 100644 --- a/chrome/browser/hub/BUILD.gn +++ b/chrome/browser/hub/BUILD.gn
@@ -146,7 +146,7 @@ "//third_party/androidx:androidx_test_runner_java", "//third_party/hamcrest:hamcrest_core_java", "//third_party/hamcrest:hamcrest_library_java", - "//third_party/junit:junit", + "//third_party/junit", "//third_party/mockito:mockito_java", "//ui/android:ui_java_test_support", "//ui/android:ui_no_recycler_view_java",
diff --git a/chrome/browser/hub/internal/BUILD.gn b/chrome/browser/hub/internal/BUILD.gn index 556dcb1..6357075 100644 --- a/chrome/browser/hub/internal/BUILD.gn +++ b/chrome/browser/hub/internal/BUILD.gn
@@ -156,7 +156,7 @@ "//third_party/androidx:androidx_annotation_annotation_java", "//third_party/androidx:androidx_test_runner_java", "//third_party/hamcrest:hamcrest_java", - "//third_party/junit:junit", + "//third_party/junit", "//third_party/mockito:mockito_java", "//ui/android:ui_full_java", "//ui/android:ui_java_test_support",
diff --git a/chrome/browser/image_editor/BUILD.gn b/chrome/browser/image_editor/BUILD.gn index 0ca8249..eb9ecb29c 100644 --- a/chrome/browser/image_editor/BUILD.gn +++ b/chrome/browser/image_editor/BUILD.gn
@@ -24,7 +24,7 @@ deps = [ "//base", - "//components/lens:lens", + "//components/lens", "//content/public/browser", "//ui/base/cursor", "//ui/snapshot",
diff --git a/chrome/browser/incognito/BUILD.gn b/chrome/browser/incognito/BUILD.gn index 3585bd8..27da8cf1 100644 --- a/chrome/browser/incognito/BUILD.gn +++ b/chrome/browser/incognito/BUILD.gn
@@ -128,7 +128,7 @@ "//third_party/androidx:androidx_test_monitor_java", "//third_party/androidx:androidx_test_runner_java", "//third_party/hamcrest:hamcrest_core_java", - "//third_party/junit:junit", + "//third_party/junit", "//third_party/mockito:mockito_java", "//ui/android:ui_java_test_support", "//ui/android:ui_no_recycler_view_java", @@ -174,7 +174,7 @@ "//third_party/androidx:androidx_activity_activity_java", "//third_party/androidx:androidx_test_runner_java", "//third_party/jni_zero:jni_zero_java", - "//third_party/junit:junit", + "//third_party/junit", "//third_party/mockito:mockito_java", "//ui/android:ui_java_test_support", "//ui/android:ui_no_recycler_view_java",
diff --git a/chrome/browser/ip_protection/BUILD.gn b/chrome/browser/ip_protection/BUILD.gn index d8a1062..2534f10 100644 --- a/chrome/browser/ip_protection/BUILD.gn +++ b/chrome/browser/ip_protection/BUILD.gn
@@ -36,20 +36,20 @@ "//components/ip_protection/common:ip_protection_telemetry", "//components/ip_protection/common:ip_protection_telemetry_uma", "//components/ip_protection/common:ip_protection_token_direct_fetcher", - "//components/prefs:prefs", + "//components/prefs", "//components/privacy_sandbox:features", "//components/privacy_sandbox:tracking_protection_prefs", "//components/privacy_sandbox:tracking_protection_settings", - "//components/signin/public/identity_manager:identity_manager", - "//components/variations/service:service", + "//components/signin/public/identity_manager", + "//components/variations/service", "//content/public/browser", - "//google_apis:google_apis", + "//google_apis", "//google_apis/common:request_util", - "//mojo/public/cpp/bindings:bindings", - "//net:net", + "//mojo/public/cpp/bindings", + "//net", "//net/third_party/quiche:blind_sign_auth", - "//services/network/public/cpp:cpp", - "//services/network/public/mojom:mojom", + "//services/network/public/cpp", + "//services/network/public/mojom", "//services/network/public/mojom:url_loader_base", "//third_party/anonymous_tokens:anonymous_tokens_cc_proto", ] @@ -75,14 +75,14 @@ "//components/privacy_sandbox:features", "//components/privacy_sandbox:privacy_sandbox_prefs", "//components/privacy_sandbox:tracking_protection_settings", - "//components/signin/public/identity_manager:identity_manager", + "//components/signin/public/identity_manager", "//components/signin/public/identity_manager:test_support", - "//components/variations/service:service", + "//components/variations/service", "//content/test:test_support", "//net/third_party/quiche:blind_sign_auth", "//net/traffic_annotation:test_support", "//services/network:test_support", - "//testing/gtest:gtest", + "//testing/gtest", "//third_party/anonymous_tokens:anonymous_tokens_cc_proto", ] } @@ -103,9 +103,9 @@ "//chrome/test:test_support", "//components/ip_protection/common:ip_protection_data_types", "//components/privacy_sandbox:features", - "//components/signin/public/identity_manager:identity_manager", + "//components/signin/public/identity_manager", "//components/signin/public/identity_manager:test_support", - "//components/variations/service:service", + "//components/variations/service", "//third_party/anonymous_tokens:anonymous_tokens_cc_proto", ]
diff --git a/chrome/browser/lens/region_search/BUILD.gn b/chrome/browser/lens/region_search/BUILD.gn index 2b66ac27..639d2c7 100644 --- a/chrome/browser/lens/region_search/BUILD.gn +++ b/chrome/browser/lens/region_search/BUILD.gn
@@ -25,7 +25,7 @@ "//components/lens:buildflags", "//components/lens:lens_mojo", "//components/prefs", - "//components/search_engines:search_engines", + "//components/search_engines", "//content/public/browser", "//ui/views",
diff --git a/chrome/browser/loading_modal/android/BUILD.gn b/chrome/browser/loading_modal/android/BUILD.gn index ec4639c..4662c5fa 100644 --- a/chrome/browser/loading_modal/android/BUILD.gn +++ b/chrome/browser/loading_modal/android/BUILD.gn
@@ -62,7 +62,7 @@ "//third_party/androidx:androidx_test_runner_java", "//third_party/hamcrest:hamcrest_java", "//third_party/hamcrest:hamcrest_library_java", - "//third_party/junit:junit", + "//third_party/junit", "//third_party/mockito:mockito_java", "//ui/android:ui_java_test_support", "//ui/android:ui_no_recycler_view_java",
diff --git a/chrome/browser/long_screenshots/BUILD.gn b/chrome/browser/long_screenshots/BUILD.gn index dc877100..0ac0f1d739 100644 --- a/chrome/browser/long_screenshots/BUILD.gn +++ b/chrome/browser/long_screenshots/BUILD.gn
@@ -13,7 +13,7 @@ deps = [ "//chrome/android:chrome_jni_headers", - "//components/google/core/common:common", + "//components/google/core/common", "//components/keyed_service/core", "//components/paint_preview/browser", "//components/paint_preview/common",
diff --git a/chrome/browser/magic_stack/android/BUILD.gn b/chrome/browser/magic_stack/android/BUILD.gn index f5bd8f9f..241684c1 100644 --- a/chrome/browser/magic_stack/android/BUILD.gn +++ b/chrome/browser/magic_stack/android/BUILD.gn
@@ -122,7 +122,7 @@ "//third_party/androidx:androidx_test_runner_java", "//third_party/jni_zero:jni_zero_java", "//third_party/junit", - "//third_party/junit:junit", + "//third_party/junit", "//third_party/mockito:mockito_java", "//ui/android:ui_java_test_support", "//ui/android:ui_no_recycler_view_java",
diff --git a/chrome/browser/magic_stack/android/junit/src/org/chromium/chrome/browser/magic_stack/HomeModulesContextMenuManagerUnitTest.java b/chrome/browser/magic_stack/android/junit/src/org/chromium/chrome/browser/magic_stack/HomeModulesContextMenuManagerUnitTest.java index b330345..d51d5c8 100644 --- a/chrome/browser/magic_stack/android/junit/src/org/chromium/chrome/browser/magic_stack/HomeModulesContextMenuManagerUnitTest.java +++ b/chrome/browser/magic_stack/android/junit/src/org/chromium/chrome/browser/magic_stack/HomeModulesContextMenuManagerUnitTest.java
@@ -130,7 +130,7 @@ MODULE_TYPE) .build(); - mMenu.onItemClick(null, null, 0, 0); + mMenu.clickItemForTesting(0); histogramWatcher.assertExpected(); verify(mModuleDelegate).removeModuleAndDisable(eq(MODULE_TYPE)); @@ -146,7 +146,7 @@ MODULE_TYPE) .build(); - mMenu.onItemClick(null, null, 1, 0); + mMenu.clickItemForTesting(1); histogramWatcher.assertExpected(); verify(mModuleDelegate).customizeSettings();
diff --git a/chrome/browser/media/router/BUILD.gn b/chrome/browser/media/router/BUILD.gn index a1801a6..2cda09a 100644 --- a/chrome/browser/media/router/BUILD.gn +++ b/chrome/browser/media/router/BUILD.gn
@@ -53,7 +53,7 @@ "//chrome/browser/profiles", "//chrome/browser/profiles:profile", "//chrome/common:constants", - "//components/media_router/common:common", + "//components/media_router/common", "//components/prefs", "//components/user_prefs", "//content/public/browser", @@ -174,8 +174,8 @@ "//components/access_code_cast/common:metrics", "//components/embedder_support:user_agent", "//components/mirroring/mojom:service", - "//components/ukm/content:content", - "//components/version_info:version_info", + "//components/ukm/content", + "//components/version_info", "//media/cast:common", "//media/remoting:remoting_device_capability", "//mojo/public/cpp/bindings", @@ -229,7 +229,7 @@ ":media_router_feature", ":router", "//chrome/browser:browser_process", - "//chrome/browser/media/router/discovery:discovery", + "//chrome/browser/media/router/discovery", "//chrome/browser/media/router/discovery/access_code:access_code_cast_feature", "//chrome/browser/media/webrtc", "//components/media_router/common/providers/cast/channel",
diff --git a/chrome/browser/media/router/discovery/access_code/BUILD.gn b/chrome/browser/media/router/discovery/access_code/BUILD.gn index b0ede0e..843126f 100644 --- a/chrome/browser/media/router/discovery/access_code/BUILD.gn +++ b/chrome/browser/media/router/discovery/access_code/BUILD.gn
@@ -22,7 +22,7 @@ "//chrome/browser/media/router:media_router_feature", "//chrome/browser/profiles:profile", "//chrome/common:channel_info", - "//components/pref_registry:pref_registry", + "//components/pref_registry", "//components/prefs", "//components/user_prefs", "//components/version_info:channel", @@ -59,7 +59,7 @@ deps = [ ":access_code_cast_feature", ":discovery_resources_proto", - "//chrome/browser/media/router:router", + "//chrome/browser/media/router", "//chrome/browser/media/router/discovery", "//chrome/browser/profiles:profile", "//chrome/browser/signin", @@ -67,8 +67,8 @@ "//chrome/browser/ui/webui/access_code_cast:mojo_bindings", "//components/access_code_cast/common:metrics", "//components/endpoint_fetcher", - "//components/keyed_service/content:content", - "//components/leveldb_proto:leveldb_proto", + "//components/keyed_service/content", + "//components/leveldb_proto", "//components/media_router/common/providers/cast/channel", "//components/pref_registry", "//components/prefs",
diff --git a/chrome/browser/metrics/tab_stats/tab_stats_tracker.cc b/chrome/browser/metrics/tab_stats/tab_stats_tracker.cc index d2f7e95..078d546 100644 --- a/chrome/browser/metrics/tab_stats/tab_stats_tracker.cc +++ b/chrome/browser/metrics/tab_stats/tab_stats_tracker.cc
@@ -44,6 +44,8 @@ #include "ui/gfx/geometry/rect.h" #include "ui/gfx/geometry/size.h" +// We add nognchecks on some includes so that Android bots do not fail +// dependency checks. #if BUILDFLAG(IS_ANDROID) #include "chrome/browser/android/tab_android.h" #include "chrome/browser/ui/android/tab_model/tab_model.h" @@ -59,7 +61,7 @@ #include "chrome/browser/ui/browser_list.h" #include "chrome/browser/ui/browser_list_observer.h" #include "chrome/browser/ui/browser_window.h" -#include "chrome/browser/ui/browser_window/public/browser_window_interface.h" +#include "chrome/browser/ui/browser_window/public/browser_window_interface.h" // nogncheck #include "chrome/browser/ui/tabs/tab_enums.h" #include "chrome/browser/ui/tabs/tab_strip_model.h" #include "chrome/browser/ui/tabs/tab_strip_model_observer.h"
diff --git a/chrome/browser/metrics/variations/BUILD.gn b/chrome/browser/metrics/variations/BUILD.gn index b65df37..7396fe8d 100644 --- a/chrome/browser/metrics/variations/BUILD.gn +++ b/chrome/browser/metrics/variations/BUILD.gn
@@ -16,7 +16,7 @@ "//chrome/app:generated_resources", "//components/strings:components_branded_strings", "//components/strings:components_strings", - "//components/variations:variations", + "//components/variations", ] namespace = "chrome_variations" header_filename = "ui_string_overrider_factory.h"
diff --git a/chrome/browser/navigation_predictor/BUILD.gn b/chrome/browser/navigation_predictor/BUILD.gn index 1ae414e..79600d2 100644 --- a/chrome/browser/navigation_predictor/BUILD.gn +++ b/chrome/browser/navigation_predictor/BUILD.gn
@@ -12,7 +12,7 @@ public_deps = [ "//base", "//chrome/browser:browser_public_dependencies", - "//components/keyed_service/core:core", + "//components/keyed_service/core", "//url", ] }
diff --git a/chrome/browser/nearby_sharing/certificates/BUILD.gn b/chrome/browser/nearby_sharing/certificates/BUILD.gn index be0b85b..bfa0269 100644 --- a/chrome/browser/nearby_sharing/certificates/BUILD.gn +++ b/chrome/browser/nearby_sharing/certificates/BUILD.gn
@@ -40,7 +40,7 @@ "//chromeos/ash/components/nearby/common/proto", "//chromeos/ash/components/nearby/common/scheduling", "//chromeos/ash/services/nearby/public/mojom", - "//components/cross_device/logging:logging", + "//components/cross_device/logging", "//components/leveldb_proto", "//components/prefs", "//crypto",
diff --git a/chrome/browser/nearby_sharing/client/BUILD.gn b/chrome/browser/nearby_sharing/client/BUILD.gn index dc4f6e1..340fd061 100644 --- a/chrome/browser/nearby_sharing/client/BUILD.gn +++ b/chrome/browser/nearby_sharing/client/BUILD.gn
@@ -17,7 +17,7 @@ "//base", "//chrome/browser/nearby_sharing/common", "//chromeos/ash/components/nearby/common/client", - "//components/cross_device/logging:logging", + "//components/cross_device/logging", "//components/signin/public/identity_manager", "//net", "//net/traffic_annotation",
diff --git a/chrome/browser/nearby_sharing/contacts/BUILD.gn b/chrome/browser/nearby_sharing/contacts/BUILD.gn index df3493bf..c3a59331 100644 --- a/chrome/browser/nearby_sharing/contacts/BUILD.gn +++ b/chrome/browser/nearby_sharing/contacts/BUILD.gn
@@ -31,7 +31,7 @@ "//chromeos/ash/components/nearby/common/client", "//chromeos/ash/components/nearby/common/scheduling", "//chromeos/ash/services/nearby/public/mojom", - "//components/cross_device/logging:logging", + "//components/cross_device/logging", "//components/prefs", "//crypto", "//third_party/nearby:device_rpc_proto",
diff --git a/chrome/browser/nearby_sharing/local_device_data/BUILD.gn b/chrome/browser/nearby_sharing/local_device_data/BUILD.gn index ac0edd4a..8f3e82d 100644 --- a/chrome/browser/nearby_sharing/local_device_data/BUILD.gn +++ b/chrome/browser/nearby_sharing/local_device_data/BUILD.gn
@@ -26,7 +26,7 @@ "//chrome/browser/nearby_sharing/common", "//chromeos/ash/components/nearby/common/client", "//chromeos/ash/components/nearby/common/scheduling", - "//components/cross_device/logging:logging", + "//components/cross_device/logging", "//components/prefs", "//components/user_manager", "//third_party/nearby:device_rpc_proto",
diff --git a/chrome/browser/ntp_customization/BUILD.gn b/chrome/browser/ntp_customization/BUILD.gn index 5c804cb..8a95d59a 100644 --- a/chrome/browser/ntp_customization/BUILD.gn +++ b/chrome/browser/ntp_customization/BUILD.gn
@@ -172,7 +172,7 @@ "//third_party/androidx:androidx_recyclerview_recyclerview_java", "//third_party/androidx:androidx_test_core_java", "//third_party/androidx:androidx_test_runner_java", - "//third_party/junit:junit", + "//third_party/junit", "//third_party/mockito:mockito_java", "//ui/android:ui_no_recycler_view_java", ]
diff --git a/chrome/browser/on_device_translation/BUILD.gn b/chrome/browser/on_device_translation/BUILD.gn index 815704d..541df757a 100644 --- a/chrome/browser/on_device_translation/BUILD.gn +++ b/chrome/browser/on_device_translation/BUILD.gn
@@ -43,14 +43,14 @@ "//chrome/browser/content_settings", "//chrome/browser/content_settings:content_settings_factory", "//chrome/browser/profiles:profile", - "//components/component_updater:component_updater", + "//components/component_updater", "//components/content_settings/core/browser", - "//components/crx_file:crx_file", + "//components/crx_file", "//components/keyed_service/content", "//components/language/core/browser", "//components/prefs", "//components/services/on_device_translation:on_device_translation_service", - "//components/update_client:update_client", + "//components/update_client", "//content/public/browser", ] configs += [ "//build/config/compiler:wexit_time_destructors" ]
diff --git a/chrome/browser/optimization_guide/BUILD.gn b/chrome/browser/optimization_guide/BUILD.gn index 95bb820b..91b8b8d 100644 --- a/chrome/browser/optimization_guide/BUILD.gn +++ b/chrome/browser/optimization_guide/BUILD.gn
@@ -28,11 +28,11 @@ "//chrome/browser/navigation_predictor", "//chrome/browser/profiles:profile", "//components/keyed_service/core", - "//components/optimization_guide/core:core", + "//components/optimization_guide/core", "//components/optimization_guide/core:prediction", "//components/optimization_guide/optimization_guide_internals/webui", "//components/optimization_guide/public/mojom", - "//components/services/unzip/content:content", + "//components/services/unzip/content", "//components/signin/public/identity_manager", "//content/public/browser", "//mojo/public/cpp/bindings", @@ -66,13 +66,13 @@ "//chrome/browser:browser_process", "//chrome/browser/profiles", "//chrome/browser/signin", - "//chrome/browser/sync:sync", - "//chrome/browser/ui:ui", - "//components/metrics_services_manager:metrics_services_manager", - "//components/no_state_prefetch/browser:browser", - "//components/user_prefs:user_prefs", - "//components/variations/service:service", - "//components/version_info:version_info", + "//chrome/browser/sync", + "//chrome/browser/ui", + "//components/metrics_services_manager", + "//components/no_state_prefetch/browser", + "//components/user_prefs", + "//components/variations/service", + "//components/version_info", "//ui/webui", ] if (is_android) { @@ -96,7 +96,7 @@ deps = [ ":optimization_guide", "//base", - "//chrome/browser/prefs:prefs", + "//chrome/browser/prefs", "//chrome/browser/signin", "//chrome/common", "//chrome/test:test_support", @@ -162,7 +162,7 @@ "//chrome/test:test_support", "//components/optimization_guide/core:test_support", "//components/prefs:test_support", - "//components/unified_consent:unified_consent", + "//components/unified_consent", "//components/variations:test_support", ] if (!is_android) {
diff --git a/chrome/browser/optimization_guide/android/BUILD.gn b/chrome/browser/optimization_guide/android/BUILD.gn index 3bec401..cb19ad5 100644 --- a/chrome/browser/optimization_guide/android/BUILD.gn +++ b/chrome/browser/optimization_guide/android/BUILD.gn
@@ -91,7 +91,7 @@ "//third_party/androidx:androidx_test_rules_java", "//third_party/androidx:androidx_test_runner_java", "//third_party/jni_zero:jni_zero_java", - "//third_party/junit:junit", + "//third_party/junit", "//third_party/mockito:mockito_java", "//url:gurl_java", ]
diff --git a/chrome/browser/os_crypt/BUILD.gn b/chrome/browser/os_crypt/BUILD.gn index e4879e7d..844870ed 100644 --- a/chrome/browser/os_crypt/BUILD.gn +++ b/chrome/browser/os_crypt/BUILD.gn
@@ -15,7 +15,7 @@ "//chrome/common:channel_info", "//chrome/install_static:install_static_util", "//components/os_crypt/async/browser:key_provider_interface", - "//components/prefs:prefs", + "//components/prefs", "//content/public/browser", ] @@ -36,7 +36,7 @@ "//chrome/common:constants", "//chrome/elevation_service:public_headers", "//chrome/install_static:install_static_util", - "//components/prefs:prefs", + "//components/prefs", "//components/sync/base", ] }
diff --git a/chrome/browser/page_content_annotations/multi_source_page_context_fetcher.cc b/chrome/browser/page_content_annotations/multi_source_page_context_fetcher.cc index fc7c6b0f..6406360 100644 --- a/chrome/browser/page_content_annotations/multi_source_page_context_fetcher.cc +++ b/chrome/browser/page_content_annotations/multi_source_page_context_fetcher.cc
@@ -15,10 +15,12 @@ #include "base/strings/utf_string_conversions.h" #include "base/task/thread_pool.h" #include "base/time/time.h" +#include "chrome/browser/ui/browser_window/public/browser_window_interface.h" #include "components/content_extraction/content/browser/inner_text.h" #include "components/optimization_guide/content/browser/page_content_proto_provider.h" #include "components/pdf/browser/pdf_document_helper.h" #include "components/pdf/common/constants.h" +#include "components/tabs/public/tab_interface.h" #include "content/public/browser/render_widget_host_view.h" #include "content/public/browser/web_contents.h" #include "content/public/browser/web_contents_observer.h" @@ -26,6 +28,7 @@ #include "pdf/mojom/pdf.mojom.h" #include "third_party/blink/public/mojom/content_extraction/ai_page_content.mojom.h" #include "third_party/skia/include/core/SkBitmap.h" +#include "ui/base/base_window.h" #include "ui/gfx/codec/jpeg_codec.h" #include "ui/gfx/geometry/skia_conversions.h" #include "url/origin.h" @@ -48,6 +51,9 @@ const base::FeatureParam<int> kScreenshotJpegQuality{ &kGlicTabScreenshotExperiment, "screenshot_jpeg_quality", 40}; +const base::FeatureParam<base::TimeDelta> kScreenshotTimeout{ + &kGlicTabScreenshotExperiment, "screenshot_timeout_ms", base::Seconds(1)}; + gfx::Size GetScreenshotSize(content::RenderWidgetHostView* view) { // By default, no scaling. if (!base::FeatureList::IsEnabled(kGlicTabScreenshotExperiment)) { @@ -215,17 +221,26 @@ } void GetTabScreenshot(content::WebContents& web_contents) { - // TODO(crbug.com/378937313): Finish this provisional implementation. auto* view = web_contents.GetRenderWidgetHostView(); - auto callback = base::BindOnce(&PageContextFetcher::RecievedJpegScreenshot, - GetWeakPtr()); + auto finish_error_callback = + base::BindOnce(&PageContextFetcher::RecievedJpegScreenshot, + GetWeakPtr(), std::nullopt); if (!view || !view->IsSurfaceAvailableForCopy()) { - std::move(callback).Run({}); DLOG(WARNING) << "Could not retrieve RenderWidgetHostView."; + std::move(finish_error_callback).Run(); return; } + capture_count_lock_ = web_contents.IncrementCapturerCount( + gfx::Size(), /*stay_hidden=*/false, /*stay_awake=*/false, + /*is_activity=*/false); + + // Fetching the screenshot sometimes hangs. Quit early if it's taking too + // long. b/431837630. + base::SingleThreadTaskRunner::GetCurrentDefault()->PostDelayedTask( + FROM_HERE, std::move(finish_error_callback), kScreenshotTimeout.Get()); + view->CopyFromSurface( gfx::Rect(), // Copy entire surface area. GetScreenshotSize(view), @@ -234,6 +249,10 @@ } void ReceivedViewportBitmap(const SkBitmap& bitmap) { + // Early exit if the timeout has fired. + if (screenshot_done_) { + return; + } pending_result_->screenshot_result.emplace( gfx::SkISizeToSize(bitmap.dimensions())); base::UmaHistogramTimes("Glic.PageContextFetcher.GetScreenshot", @@ -244,7 +263,7 @@ [](const SkBitmap& bitmap) { return gfx::JPEGCodec::Encode(bitmap, GetScreenshotJpegQuality()); }, - std::move(bitmap)), + bitmap), base::BindOnce(&PageContextFetcher::RecievedJpegScreenshot, GetWeakPtr())); } @@ -257,13 +276,23 @@ void RecievedJpegScreenshot( std::optional<std::vector<uint8_t>> screenshot_jpeg_data) { + // This function can be called multiple times, for timeout behavior. Early + // exit if it's already been called. + if (screenshot_done_) { + return; + } + auto elapsed = base::TimeTicks::Now() - start_time_; + screenshot_done_ = true; + capture_count_lock_ = {}; if (screenshot_jpeg_data) { pending_result_->screenshot_result.value().jpeg_data = std::move(*screenshot_jpeg_data); + base::UmaHistogramTimes("Glic.PageContextFetcher.GetEncodedScreenshot", + elapsed); + } else { + base::UmaHistogramTimes( + "Glic.PageContextFetcher.GetEncodedScreenshot.Failure", elapsed); } - screenshot_done_ = true; - base::UmaHistogramTimes("Glic.PageContextFetcher.GetEncodedScreenshot", - base::TimeTicks::Now() - start_time_); RunCallbackIfComplete(); } @@ -343,6 +372,7 @@ bool primary_page_changed_ = false; std::unique_ptr<FetchPageContextResult> pending_result_; base::TimeTicks start_time_; + base::ScopedClosureRunner capture_count_lock_; base::WeakPtrFactory<PageContextFetcher> weak_ptr_factory_{this}; };
diff --git a/chrome/browser/persisted_state_db/BUILD.gn b/chrome/browser/persisted_state_db/BUILD.gn index be91991d..4728c476 100644 --- a/chrome/browser/persisted_state_db/BUILD.gn +++ b/chrome/browser/persisted_state_db/BUILD.gn
@@ -19,16 +19,17 @@ } deps = [ - "//base:base", + "//base", "//chrome/browser/profiles:profile", "//components/commerce/core:cart_db_content_proto", "//components/commerce/core:commerce_subscription_db_content_proto", + "//components/commerce/core:discount_infos_db_content_proto", "//components/commerce/core:parcel_tracking_db_content_proto", "//components/commerce/core:persisted_state_db_content_proto", "//components/keyed_service/content", "//components/leveldb_proto", - "//components/session_proto_db:session_proto_db", - "//content/public/browser:browser", + "//components/session_proto_db", + "//content/public/browser", "//third_party/leveldatabase", ] if (is_android) { @@ -39,7 +40,6 @@ } else { deps += [ "//components/commerce/core:coupon_db_content_proto", - "//components/commerce/core:discount_infos_db_content_proto", "//components/commerce/core:discounts_db_content_proto", ] }
diff --git a/chrome/browser/persisted_state_db/session_proto_db_factory.cc b/chrome/browser/persisted_state_db/session_proto_db_factory.cc index 704fbc0..71c1429 100644 --- a/chrome/browser/persisted_state_db/session_proto_db_factory.cc +++ b/chrome/browser/persisted_state_db/session_proto_db_factory.cc
@@ -55,6 +55,21 @@ return GetParcelTrackingSessionProtoDBFactory(); } +SessionProtoDBFactory<discount_infos_db::DiscountInfosContentProto>* +GetDiscountInfosSessionProtoDBFactory() { + static base::NoDestructor< + SessionProtoDBFactory<discount_infos_db::DiscountInfosContentProto>> + instance; + return instance.get(); +} + +template <> +SessionProtoDBFactory<discount_infos_db::DiscountInfosContentProto>* +SessionProtoDBFactory< + discount_infos_db::DiscountInfosContentProto>::GetInstance() { + return GetDiscountInfosSessionProtoDBFactory(); +} + #if !BUILDFLAG(IS_ANDROID) SessionProtoDBFactory<cart_db::ChromeCartContentProto>* GetChromeCartSessionProtoDBFactory() { @@ -98,21 +113,6 @@ return GetDiscountsSessionProtoDBFactory(); } -SessionProtoDBFactory<discount_infos_db::DiscountInfosContentProto>* -GetDiscountInfosSessionProtoDBFactory() { - static base::NoDestructor< - SessionProtoDBFactory<discount_infos_db::DiscountInfosContentProto>> - instance; - return instance.get(); -} - -template <> -SessionProtoDBFactory<discount_infos_db::DiscountInfosContentProto>* -SessionProtoDBFactory< - discount_infos_db::DiscountInfosContentProto>::GetInstance() { - return GetDiscountInfosSessionProtoDBFactory(); -} - #else SessionProtoDBFactory<merchant_signal_db::MerchantSignalContentProto>* GetMerchantSignalSessionProtoDBFactory() {
diff --git a/chrome/browser/persisted_state_db/session_proto_db_factory.h b/chrome/browser/persisted_state_db/session_proto_db_factory.h index 899a1927..936d7573 100644 --- a/chrome/browser/persisted_state_db/session_proto_db_factory.h +++ b/chrome/browser/persisted_state_db/session_proto_db_factory.h
@@ -9,6 +9,7 @@ #include "build/build_config.h" #include "chrome/browser/profiles/profile_keyed_service_factory.h" #include "components/commerce/core/proto/commerce_subscription_db_content.pb.h" +#include "components/commerce/core/proto/discount_infos_db_content.pb.h" // nogncheck #include "components/commerce/core/proto/parcel_tracking_db_content.pb.h" #include "components/session_proto_db/session_proto_db.h" #include "content/public/browser/browser_context.h" @@ -19,7 +20,6 @@ #if !BUILDFLAG(IS_ANDROID) #include "components/commerce/core/proto/cart_db_content.pb.h" #include "components/commerce/core/proto/coupon_db_content.pb.h" -#include "components/commerce/core/proto/discount_infos_db_content.pb.h" // nogncheck #include "components/commerce/core/proto/discounts_db_content.pb.h" // nogncheck #else #include "components/commerce/core/proto/merchant_signal_db_content.pb.h" @@ -39,6 +39,9 @@ SessionProtoDBFactory<persisted_state_db::PersistedStateContentProto>* GetPersistedStateSessionProtoDBFactory(); +SessionProtoDBFactory<discount_infos_db::DiscountInfosContentProto>* +GetDiscountInfosSessionProtoDBFactory(); + #if !BUILDFLAG(IS_ANDROID) SessionProtoDBFactory<cart_db::ChromeCartContentProto>* GetChromeCartSessionProtoDBFactory(); @@ -46,8 +49,6 @@ GetCouponSessionProtoDBFactory(); SessionProtoDBFactory<discounts_db::DiscountsContentProto>* GetDiscountsSessionProtoDBFactory(); -SessionProtoDBFactory<discount_infos_db::DiscountInfosContentProto>* -GetDiscountInfosSessionProtoDBFactory(); #else SessionProtoDBFactory<merchant_signal_db::MerchantSignalContentProto>* GetMerchantSignalSessionProtoDBFactory(); @@ -150,6 +151,13 @@ context->GetPath().AppendASCII(kParcelTrackingDBFolder), leveldb_proto::ProtoDbType::COMMERCE_PARCEL_TRACKING_DATABASE, content::GetUIThreadTaskRunner({})); + } else if (std::is_base_of<discount_infos_db::DiscountInfosContentProto, + T>::value) { + return std::make_unique<SessionProtoDB<T>>( + proto_database_provider, + context->GetPath().AppendASCII(kDiscountInfosDBFolder), + leveldb_proto::ProtoDbType::DISCOUNT_INFOS_DATABASE, + content::GetUIThreadTaskRunner({})); #if !BUILDFLAG(IS_ANDROID) } else if (std::is_base_of<cart_db::ChromeCartContentProto, T>::value) { return std::make_unique<SessionProtoDB<T>>( @@ -169,13 +177,6 @@ context->GetPath().AppendASCII(kDiscountsDBFolder), leveldb_proto::ProtoDbType::DISCOUNTS_DATABASE, content::GetUIThreadTaskRunner({})); - } else if (std::is_base_of<discount_infos_db::DiscountInfosContentProto, - T>::value) { - return std::make_unique<SessionProtoDB<T>>( - proto_database_provider, - context->GetPath().AppendASCII(kDiscountInfosDBFolder), - leveldb_proto::ProtoDbType::DISCOUNT_INFOS_DATABASE, - content::GetUIThreadTaskRunner({})); #else } else if (std::is_base_of<merchant_signal_db::MerchantSignalContentProto, T>::value) {
diff --git a/chrome/browser/picture_in_picture/auto_picture_in_picture_tab_helper_browsertest.cc b/chrome/browser/picture_in_picture/auto_picture_in_picture_tab_helper_browsertest.cc index b9b6a45a..b65429e 100644 --- a/chrome/browser/picture_in_picture/auto_picture_in_picture_tab_helper_browsertest.cc +++ b/chrome/browser/picture_in_picture/auto_picture_in_picture_tab_helper_browsertest.cc
@@ -514,7 +514,7 @@ WasRecentlyAudibleWaiter audible_waiter; base::CallbackListSubscription subscription = - audible_helper->RegisterCallbackForTesting( + audible_helper->RegisterRecentlyAudibleChangedCallback( audible_waiter.GetRecentlyAudibleCallback()); audible_waiter.WaitUntilDone(); DCHECK_EQ(expected_recently_audible, audible_waiter.WasRecentlyAudible());
diff --git a/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc b/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc index d392e91..85509d8 100644 --- a/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc +++ b/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc
@@ -303,6 +303,7 @@ #include "chrome/browser/signin/signin_manager_android_factory.h" #include "chrome/browser/tab/tab_state_storage_service_factory.h" #include "components/commerce/core/commerce_feature_list.h" +#include "components/commerce/core/proto/discount_infos_db_content.pb.h" // nogncheck #include "components/commerce/core/proto/merchant_signal_db_content.pb.h" #if BUILDFLAG(ENABLE_OFFLINE_PAGES) @@ -358,7 +359,6 @@ #include "chrome/browser/web_applications/isolated_web_apps/window_management/isolated_web_apps_opened_tabs_counter_service_factory.h" #include "components/commerce/core/proto/cart_db_content.pb.h" #include "components/commerce/core/proto/coupon_db_content.pb.h" -#include "components/commerce/core/proto/discount_infos_db_content.pb.h" // nogncheck #include "components/commerce/core/proto/discounts_db_content.pb.h" // nogncheck #include "components/optimization_guide/core/model_execution/model_execution_features.h" #include "ui/accessibility/accessibility_features.h" @@ -1316,9 +1316,9 @@ #if !BUILDFLAG(IS_ANDROID) SessionProtoDBFactory<coupon_db::CouponContentProto>::GetInstance(); SessionProtoDBFactory<discounts_db::DiscountsContentProto>::GetInstance(); +#endif SessionProtoDBFactory< discount_infos_db::DiscountInfosContentProto>::GetInstance(); -#endif #if BUILDFLAG(IS_ANDROID) SessionProtoDBFactory< merchant_signal_db::MerchantSignalContentProto>::GetInstance();
diff --git a/chrome/browser/renderer_context_menu/spelling_menu_observer_browsertest.cc b/chrome/browser/renderer_context_menu/spelling_menu_observer_browsertest.cc index 60eabd22..d0ed451 100644 --- a/chrome/browser/renderer_context_menu/spelling_menu_observer_browsertest.cc +++ b/chrome/browser/renderer_context_menu/spelling_menu_observer_browsertest.cc
@@ -447,8 +447,15 @@ // Test that we don't show "No more suggestions from Google" if the spelling // service is enabled and that there is only one suggestion. +// TODO(crbug.com/434222699): Fix flakiness and re-enable on Windows. +#if BUILDFLAG(IS_WIN) +#define MAYBE_NoMoreSuggestionsNotDisplayed \ + DISABLED_NoMoreSuggestionsNotDisplayed +#else +#define MAYBE_NoMoreSuggestionsNotDisplayed NoMoreSuggestionsNotDisplayed +#endif IN_PROC_BROWSER_TEST_F(SpellingMenuObserverTest, - NoMoreSuggestionsNotDisplayed) { + MAYBE_NoMoreSuggestionsNotDisplayed) { menu()->GetPrefs()->SetBoolean( spellcheck::prefs::kSpellCheckUseSpellingService, true);
diff --git a/chrome/browser/resources/glic/glic_api/glic_api.ts b/chrome/browser/resources/glic/glic_api/glic_api.ts index b0e7a32..bfd18ff8 100644 --- a/chrome/browser/resources/glic/glic_api/glic_api.ts +++ b/chrome/browser/resources/glic/glic_api/glic_api.ts
@@ -94,15 +94,6 @@ notifyPanelWasClosed?(): Promise<void>; /** - * Called when the browser wants the web client to change its view to match - * a requested change (e.g., because the user clicked a UI element to toggle - * to a different view). - * - * The web client should update its view to match the requested change. - */ - requestViewChange?(viewChangeRequest: ViewChangeRequest): void; - - /** * The web client should resolve the promise after verifying the app is * responsive. * @@ -638,6 +629,15 @@ getHostCapabilities?(): Set<HostCapability>; /** + * Emits when the browser wants the web client to change its view to match + * a requested change (e.g., because the user clicked a UI element to toggle + * to a different view). + * + * The web client should update its view to match the requested change. + */ + getViewChangeRequests?(): Observable<ViewChangeRequest>; + + /** * Notifies the browser that the web client has changed the view shown to the * user. This is used to trigger updates to browser UI which shows the current * state of the web client, such as toggle controls.
diff --git a/chrome/browser/resources/glic/glic_api_impl/glic_api_client.ts b/chrome/browser/resources/glic/glic_api_impl/glic_api_client.ts index 6ffd18d..45aa749 100644 --- a/chrome/browser/resources/glic/glic_api_impl/glic_api_client.ts +++ b/chrome/browser/resources/glic/glic_api_impl/glic_api_client.ts
@@ -2,9 +2,9 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import type {ActInFocusedTabParams, ActInFocusedTabResult, AnnotatedPageData, ChromeVersion, CreateTabOptions, DraggableArea, FocusedTabData, GetPinCandidatesOptions, GlicBrowserHost, GlicBrowserHostJournal, GlicBrowserHostMetrics, GlicHostRegistry, GlicWebClient, HostCapability, Journal, ObservableValue, OpenPanelInfo, OpenSettingsOptions, PanelOpeningData, PanelState, PdfDocumentData, PinCandidate, ResizeWindowOptions, Screenshot, ScrollToParams, TabContextOptions, TabContextResult, TabData, UserProfileInfo, ViewChangedNotification, ViewChangeRequest, ZeroStateSuggestions, ZeroStateSuggestionsOptions, ZeroStateSuggestionsV2} from '../glic_api/glic_api.js'; +import type {ActInFocusedTabParams, ActInFocusedTabResult, AnnotatedPageData, ChromeVersion, CreateTabOptions, DraggableArea, FocusedTabData, GetPinCandidatesOptions, GlicBrowserHost, GlicBrowserHostJournal, GlicBrowserHostMetrics, GlicHostRegistry, GlicWebClient, HostCapability, Journal, Observable, ObservableValue, OpenPanelInfo, OpenSettingsOptions, PanelOpeningData, PanelState, PdfDocumentData, PinCandidate, ResizeWindowOptions, Screenshot, ScrollToParams, TabContextOptions, TabContextResult, TabData, UserProfileInfo, ViewChangedNotification, ViewChangeRequest, ZeroStateSuggestions, ZeroStateSuggestionsOptions, ZeroStateSuggestionsV2} from '../glic_api/glic_api.js'; import {ActorTaskState} from '../glic_api/glic_api.js'; -import {ObservableValue as ObservableValueImpl} from '../observable.js'; +import {ObservableValue as ObservableValueImpl, Subject} from '../observable.js'; import {replaceProperties} from './conversions.js'; import {newSenderId, PostMessageRequestReceiver, PostMessageRequestSender} from './post_message_transport.js'; @@ -88,7 +88,7 @@ } glicWebClientRequestViewChange(payload: {request: ViewChangeRequest}): void { - this.webClient.requestViewChange?.(payload.request); + this.host.viewChangeRequestsSubject.next(payload.request); } glicWebClientZeroStateSuggestionsChanged(payload: { @@ -234,6 +234,7 @@ private hostCapabilities: Set<HostCapability> = new Set(); private actorTaskState = new Map<number, ObservableValueImpl<ActorTaskState>>(); + readonly viewChangeRequestsSubject = new Subject<ViewChangeRequest>(); constructor(public webClient: GlicWebClient, windowProxy: WindowProxy) { // TODO(harringtond): Ideally, we could ensure we only process requests from @@ -747,6 +748,10 @@ return this.hostCapabilities; } + getViewChangeRequests(): Observable<ViewChangeRequest> { + return this.viewChangeRequestsSubject; + } + onViewChanged(notification: ViewChangedNotification) { this.sender.requestNoResponse('glicBrowserOnViewChanged', {notification}); }
diff --git a/chrome/browser/resources/glic/observable.ts b/chrome/browser/resources/glic/observable.ts index 16cb739..14c88a9f 100644 --- a/chrome/browser/resources/glic/observable.ts +++ b/chrome/browser/resources/glic/observable.ts
@@ -132,3 +132,34 @@ return resultValue; } } + +/** + * A simple observable with no memory of previous values. + */ +export class Subject<T> { + private subscribers: Set<ObservableSubscription<T>> = new Set(); + + subscribe(change: (newValue: T) => void): Subscriber { + const newSub = + new ObservableSubscription(change, this.onUnsubscribe.bind(this)); + this.subscribers.add(newSub); + return newSub; + } + + next(v: T) { + this.subscribers.forEach((sub) => { + // Ignore if removed since forEach was called. + if (this.subscribers.has(sub)) { + try { + sub.onChange(v); + } catch (e) { + console.warn(e); + } + } + }); + } + + private onUnsubscribe(sub: ObservableSubscription<T>) { + this.subscribers.delete(sub); + } +}
diff --git a/chrome/browser/resources/new_tab_page/composebox/composebox.ts b/chrome/browser/resources/new_tab_page/composebox/composebox.ts index 0b6b8e5..e97351cc 100644 --- a/chrome/browser/resources/new_tab_page/composebox/composebox.ts +++ b/chrome/browser/resources/new_tab_page/composebox/composebox.ts
@@ -51,6 +51,17 @@ ], ]); +// These values are persisted to logs. Entries should not be renumbered and +// numeric values should never be reused. +const enum ComposeboxFileValidationError { + NONE = 0, + TOO_MANY_FILES = 1, + FILE_EMPTY = 2, + FILE_SIZE_TOO_LARGE = 3, + MAX_VALUE = FILE_SIZE_TOO_LARGE, +} + + export class ComposeboxElement extends I18nMixinLit (CrLitElement) { static get is() { @@ -206,6 +217,8 @@ if ((changedProperties as Map<PropertyKey, unknown>) .has('showErrorScrim_') && this.showErrorScrim_) { + const announcer = getAnnouncerInstance(); + announcer.announce(this.errorMessage_); const dismissErrorButton = this.shadowRoot.querySelector<HTMLElement>('#dismissErrorButton'); if (dismissErrorButton) { @@ -249,16 +262,23 @@ const files = input.files; if (!files || files.length === 0 || this.files_.size >= this.maxFileCount_) { + this.recordFileValidationMetric_( + ComposeboxFileValidationError.TOO_MANY_FILES); return; } for (const file of files) { if (file.size === 0 || file.size > this.maxFileSize_) { this.showErrorScrim_ = true; - this.errorMessage_ = file.size === 0 ? + const fileIsEmpty = file.size === 0; + this.errorMessage_ = fileIsEmpty ? this.i18n('composeboxFileUploadInvalidEmptySize') : this.i18n('composeboxFileUploadInvalidTooLarge'); input.value = ''; + fileIsEmpty ? this.recordFileValidationMetric_( + ComposeboxFileValidationError.FILE_EMPTY) : + this.recordFileValidationMetric_( + ComposeboxFileValidationError.FILE_SIZE_TOO_LARGE); return; } else { const fileBuffer = await file.arrayBuffer(); @@ -288,6 +308,7 @@ const announcer = getAnnouncerInstance(); announcer.announce(this.i18n('composeboxFileUploadStartedText')); + this.recordFileValidationMetric_(ComposeboxFileValidationError.NONE); } } // Clear the file input. @@ -306,6 +327,7 @@ protected onCancelClick_() { if (this.$.input.value.trim().length > 0 || this.files_.size > 0) { this.$.input.value = ''; + this.input_ = ''; this.files_ = new Map(); this.submitEnabled_ = false; this.pageHandler_.clearFiles(); @@ -345,6 +367,13 @@ e.ctrlKey, e.metaKey, e.shiftKey); this.submitting_ = true; } + + private recordFileValidationMetric_( + enumValue: ComposeboxFileValidationError) { + chrome.metricsPrivate.recordEnumerationValue( + 'NewTabPage.Composebox.File.WebUI.UploadAttemptFailure', enumValue, + ComposeboxFileValidationError.MAX_VALUE + 1); + } } declare global {
diff --git a/chrome/browser/resources/settings/glic_page/glic_subpage.html b/chrome/browser/resources/settings/glic_page/glic_subpage.html index ffd1672..76ca1aa 100644 --- a/chrome/browser/resources/settings/glic_page/glic_subpage.html +++ b/chrome/browser/resources/settings/glic_page/glic_subpage.html
@@ -244,6 +244,12 @@ label="$i18n{glicActivityButton}" sub-label="$i18n{glicActivityButtonSublabel}" external> </cr-link-row> + <cr-link-row id="extensionsButton" + hidden="[[!glicExtensionsFeatureEnabled_]]" + on-click="onExtensionsRowClick_" + label="$i18n{glicExtensionsButton}" + sub-label="$i18n{glicExtensionsButtonSublabel}" external> + </cr-link-row> </template> </div> </settings-subpage>
diff --git a/chrome/browser/resources/settings/glic_page/glic_subpage.ts b/chrome/browser/resources/settings/glic_page/glic_subpage.ts index 7c718b78..bf63bbaf 100644 --- a/chrome/browser/resources/settings/glic_page/glic_subpage.ts +++ b/chrome/browser/resources/settings/glic_page/glic_subpage.ts
@@ -110,6 +110,13 @@ }, }, + glicExtensionsFeatureEnabled_: { + type: Boolean, + value: () => { + return loadTimeData.getBoolean('glicExtensionsFeatureEnabled'); + }, + }, + glicUserStatusCheckFeatureEnabled_: { type: Boolean, value: () => @@ -172,6 +179,7 @@ MetricsBrowserProxyImpl.getInstance(); declare private tabAccessToggleExpanded_: boolean; declare private closedCaptionsFeatureEnabled_: boolean; + declare private glicExtensionsFeatureEnabled_: boolean; declare private glicUserStatusCheckFeatureEnabled_: boolean; declare private locationSubLabel_: string; declare private locationLearnMoreUrl_: string; @@ -305,6 +313,12 @@ this.i18n('glicActivityButtonUrl')); } + private onExtensionsRowClick_() { + // TODO(crbug.com/434213151): Append url param when ready. + const url = new URL(this.i18n('glicExtensionsManagementUrl')); + OpenWindowProxyImpl.getInstance().openUrl(url.toString()); + } + private onShortcutsLearnMoreClick_() { this.metricsBrowserProxy_.recordAction( AiPageActions.GLIC_SHORTCUTS_LEARN_MORE_CLICKED);
diff --git a/chrome/browser/resources/settings/people_page/people_page.html b/chrome/browser/resources/settings/people_page/people_page.html index 6ce7391..649c15f 100644 --- a/chrome/browser/resources/settings/people_page/people_page.html +++ b/chrome/browser/resources/settings/people_page/people_page.html
@@ -69,7 +69,7 @@ <div> <if expr="not is_chromeos"> <template is="dom-if" if="[[shouldShowSyncAccountControl_( - syncStatus.syncSystemEnabled, syncStatus.signedInStatus)]]" restamp> + syncStatus.syncSystemEnabled)]]"> <settings-sync-account-control sync-status="[[syncStatus]]" prefs="{{prefs}}" @@ -81,72 +81,45 @@ "$i18n{peopleSignInPromptSecondaryWithNoAccount}"> </settings-sync-account-control> </template> +</if> <template is="dom-if" if="[[!shouldShowSyncAccountControl_( syncStatus.syncSystemEnabled, signinAllowed_)]]" restamp> - <template is="dom-if" if="[[!shouldLinkToAccountSettingsPage_( - syncStatus.signedInState)]]" restamp> - <div id="profile-row" class="cr-row first two-line" - actionable$="[[isProfileActionable_]]" - on-click="onProfileClick_"> - <template is="dom-if" if="[[syncStatus]]"> - <div id="profile-icon" - style="background-image: [[getIconImageSet_( - profileIconUrl_)]]"> - </div> - <div class="flex cr-row-gap cr-padded-text text-elide"> - <span id="profile-name">[[profileName_]]</span> - </div> - <cr-icon-button class="subpage-arrow" - aria-label="$i18n{editPerson}" - aria-describedby="profile-name" - aria-roledescription="$i18n{subpageArrowRoleDescription}"> - </cr-icon-button> - </template> - </div> - </template> - <template is="dom-if" if="[[shouldLinkToAccountSettingsPage_( - syncStatus.signedInState)]]" restamp> - <cr-link-row id="account-subpage-row" on-click="onAccountClick_"> + <div id="profile-row" class="cr-row first two-line" + actionable$="[[isProfileActionable_]]" + on-click="onProfileClick_"> + <template is="dom-if" if="[[syncStatus]]"> <div id="profile-icon" style="background-image: [[getIconImageSet_( - primaryAccountIconUrl_)]]"> + profileIconUrl_)]]"> </div> - <div class="cr-row-gap cr-padded-text flex no-min-width"> - <div id="account-name" class="text-elide"> - [[primaryAccountName_]] - </div> - <div id="account-email" class="secondary text-elide"> - [[primaryAccountEmail_]] - </div> - </div> - </cr-link-row> - </template> - </template> <!-- if="[[!shouldShowSyncAccountControl_()]]" --> -</if> - + <div class="flex cr-row-gap cr-padded-text text-elide"> + <span id="profile-name">[[profileName_]]</span> +<!-- When the user is signed-in, the settings-sync-account-control is always +shown on non-ChromeOS platforms --> <if expr="is_chromeos"> - <div id="profile-row" class="cr-row first two-line" - actionable$="[[isProfileActionable_]]" on-click="onProfileClick_"> - <template is="dom-if" if="[[syncStatus]]"> - <div id="profile-icon" - style="background-image: [[getIconImageSet_( - profileIconUrl_)]]"> - </div> - <div class="flex cr-row-gap cr-padded-text text-elide"> - <span id="profile-name">[[profileName_]]</span> - <div class="secondary" hidden="[[!isSyncing_( - syncStatus.signedInState)]]"> - [[syncStatus.signedInUsername]] - </div> - </div> - <cr-icon-button class="icon-external" - id="profile-subpage-arrow" - hidden="[[!isProfileActionable_]]" - aria-label="$i18n{accountManagerSubMenuLabel}" - aria-describedby="profile-name"></cr-icon-button> - </template> - </div> + <div class="secondary" hidden="[[!isSyncing_( + syncStatus.signedInState)]]"> + [[syncStatus.signedInUsername]] + </div> </if> + </div> +<if expr="not is_chromeos"> + <cr-icon-button class="subpage-arrow" + aria-label="$i18n{editPerson}" + aria-describedby="profile-name" + aria-roledescription="$i18n{subpageArrowRoleDescription}"> + </cr-icon-button> +</if> +<if expr="is_chromeos"> + <cr-icon-button class="icon-external" + id="profile-subpage-arrow" + hidden="[[!isProfileActionable_]]" + aria-label="$i18n{accountManagerSubMenuLabel}" + aria-describedby="profile-name"></cr-icon-button> +</if> + </template> + </div> + </template> <!-- if="[[!shouldShowSyncAccountControl_()]]" --> <cr-link-row id="sync-setup" label="$i18n{syncAndNonPersonalizedServices}" @@ -165,11 +138,15 @@ label="$i18n{profileNameAndPicture}" on-click="onProfileClick_" ></cr-link-row> </template> +</if> +<if expr="not is_chromeos"> <cr-link-row id="importDataDialogTrigger" label="$i18n{importTitle}" on-click="onImportDataClick_"></cr-link-row> +</if> +<if expr="not is_chromeos"> <template is="dom-if" if="[[isDasherlessProfile_]]"> <div id="sync-not-allowed" class="cr-row continuation"> <cr-icon id="info-icon" icon="cr:info-outline"></cr-icon>
diff --git a/chrome/browser/resources/settings/people_page/people_page.ts b/chrome/browser/resources/settings/people_page/people_page.ts index 487d59c2..1297174 100644 --- a/chrome/browser/resources/settings/people_page/people_page.ts +++ b/chrome/browser/resources/settings/people_page/people_page.ts
@@ -185,9 +185,6 @@ }, showSignoutDialog_: Boolean, - primaryAccountName_: String, - primaryAccountEmail_: String, - primaryAccountIconUrl_: String, // </if> }; } @@ -207,9 +204,6 @@ declare private shouldShowAccountSettingsPage_: boolean; declare private showImportDataDialog_: boolean; declare private showSignoutDialog_: boolean; - declare private primaryAccountName_: string; - declare private primaryAccountEmail_: string; - declare private primaryAccountIconUrl_: string; // </if> private syncBrowserProxy_: SyncBrowserProxy = @@ -242,10 +236,11 @@ 'sync-status-changed', this.handleSyncStatus_.bind(this)); // <if expr="not is_chromeos"> - this.syncBrowserProxy_.getStoredAccounts().then( - this.handleStoredAccounts_.bind(this)); - this.addWebUiListener( - 'stored-accounts-updated', this.handleStoredAccounts_.bind(this)); + const handleStoredAccounts = (accounts: StoredAccount[]) => { + this.storedAccounts = accounts; + }; + this.syncBrowserProxy_.getStoredAccounts().then(handleStoredAccounts); + this.addWebUiListener('stored-accounts-updated', handleStoredAccounts); this.addWebUiListener('sync-settings-saved', () => { this.$.toast.show(); @@ -311,10 +306,6 @@ * Handler for when the sync state is pushed from the browser. */ private handleSyncStatus_(syncStatus: SyncStatus) { - // <if expr="is_chromeos"> - this.syncStatus = syncStatus; - // </if> - // <if expr="not is_chromeos"> // Sign-in impressions should be recorded only if the sign-in promo is // shown. They should be recorder only once, the first time // |this.syncStatus| is set. @@ -327,7 +318,6 @@ // SyncAccountControl records the impressions user actions. chrome.metricsPrivate.recordUserAction('Signin_Impression_FromSettings'); } - // </if> } // <if expr="not is_chromeos"> @@ -370,10 +360,6 @@ } // <if expr="not is_chromeos"> - private onAccountClick_() { - Router.getInstance().navigateTo(routes.ACCOUNT); - } - private onImportDataClick_() { Router.getInstance().navigateTo(routes.IMPORT_DATA); } @@ -382,33 +368,6 @@ Router.getInstance().navigateToPreviousRoute(); focusWithoutInk(this.$.importDataDialogTrigger); } - - private shouldLinkToAccountSettingsPage_(): boolean { - return this.shouldShowAccountSettingsPage_ && !!this.syncStatus && - this.syncStatus.signedInState === SignedInState.SIGNED_IN; - } - - private shouldShowSyncAccountControl_(): boolean { - if (this.syncStatus === undefined) { - return false; - } - return !!this.syncStatus!.syncSystemEnabled && this.signinAllowed_ && - !this.shouldLinkToAccountSettingsPage_(); - } - - private handleStoredAccounts_(accounts: StoredAccount[]) { - this.storedAccounts = accounts; - - // The user might not have any GAIA accounts (e.g. signed out). In this case - // the link row to the account settings page does not exist, so there's - // nothing to do. - if (accounts.length === 0) { - return; - } - this.primaryAccountName_ = accounts[0].fullName!; - this.primaryAccountEmail_ = accounts[0].email; - this.primaryAccountIconUrl_ = accounts[0].avatarImage!; - } // </if> /** @@ -420,6 +379,18 @@ chrome.metricsPrivate.recordUserAction('ManageGoogleAccount_Clicked'); } + private shouldShowSyncAccountControl_(): boolean { + // <if expr="is_chromeos"> + return false; + // </if> + // <if expr="not is_chromeos"> + if (this.syncStatus === undefined) { + return false; + } + return !!this.syncStatus!.syncSystemEnabled && this.signinAllowed_; + // </if> + } + /** * @return A CSS image-set for multiple scale factors. */ @@ -446,9 +417,6 @@ '#edit-profile' : '#profile-row .subpage-arrow'); } - if (routes.ACCOUNT) { - map.set(routes.ACCOUNT.path, '#account-subpage-row'); - } // </if> return map; } @@ -475,7 +443,9 @@ break; case 'account': assert(loadTimeData.getBoolean('replaceSyncPromosWithSignInPromos')); - triggerId = 'account-subpage-row'; + // TODO(crbug.com/429139804): Replace with actual entry point once + // implemented. + triggerId = 'sync-setup'; break; // </if> }
diff --git a/chrome/browser/smart_card/smart_card_reader_tracker_impl_unittest.cc b/chrome/browser/smart_card/smart_card_reader_tracker_impl_unittest.cc index 797633c..cded7e3 100644 --- a/chrome/browser/smart_card/smart_card_reader_tracker_impl_unittest.cc +++ b/chrome/browser/smart_card/smart_card_reader_tracker_impl_unittest.cc
@@ -4,14 +4,15 @@ #include "chrome/browser/smart_card/smart_card_reader_tracker_impl.h" +#include "base/run_loop.h" #include "base/test/task_environment.h" #include "base/test/test_future.h" +#include "base/time/time_override.h" #include "content/browser/smart_card/mock_smart_card_context_factory.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/blink/public/mojom/smart_card/smart_card.mojom.h" -using base::test::InvokeFuture; using base::test::TestFuture; using content::MockSmartCardContextFactory; using device::mojom::SmartCardContext; @@ -24,12 +25,11 @@ using device::mojom::SmartCardStatusChangeResult; using device::mojom::SmartCardSuccess; +using testing::_; using testing::ElementsAre; using testing::InSequence; using testing::StrictMock; using testing::UnorderedElementsAre; -using testing::WithArg; -using testing::WithArgs; // Used by Google Test to print human-readable error messages involving // ReaderInfo comparisons. @@ -82,9 +82,6 @@ namespace { -using OptionalReaderList = - std::optional<std::vector<SmartCardReaderTracker::ReaderInfo>>; - void ExpectUnaware(const SmartCardReaderStateIn& state_in) { // This is the only field expected to be set/true. EXPECT_TRUE(state_in.current_state->unaware); @@ -140,30 +137,37 @@ EXPECT_FALSE(state_flags.unpowered); } -enum class ReaderState { kEmpty, kInUse, kUnknown }; +enum class StateFlags { + kEmpty, + kNowEmpty, + kInUse, + kNowUnknown, +}; -enum class ReaderInfoState { +enum class ReaderState { kEmpty, kInUse, }; SmartCardReaderStateOutPtr CreateStateOut(std::string name, - ReaderState state, - bool changed = false, + StateFlags state, uint16_t event_count = 0, std::vector<uint8_t> atr = {}) { auto state_flags = SmartCardReaderStateFlags::New(); - state_flags->changed = changed; - switch (state) { - case ReaderState::kEmpty: + case StateFlags::kEmpty: state_flags->empty = true; break; - case ReaderState::kInUse: + case StateFlags::kNowEmpty: + state_flags->changed = true; + state_flags->empty = true; + break; + case StateFlags::kInUse: state_flags->present = true; state_flags->inuse = true; break; - case ReaderState::kUnknown: + case StateFlags::kNowUnknown: + state_flags->changed = true; state_flags->unknown = true; break; } @@ -174,7 +178,7 @@ SmartCardReaderTracker::ReaderInfo CreateReaderInfo( std::string name, - ReaderInfoState state, + ReaderState state, uint16_t event_count = 0, std::vector<uint8_t> atr = {}) { SmartCardReaderTracker::ReaderInfo info; @@ -183,10 +187,10 @@ info.answer_to_reset = std::move(atr); switch (state) { - case ReaderInfoState::kEmpty: + case ReaderState::kEmpty: info.empty = true; break; - case ReaderInfoState::kInUse: + case ReaderState::kInUse: info.present = true; info.inuse = true; break; @@ -195,11 +199,10 @@ return info; } -template <typename... T> void ReportStateOut(SmartCardContext::GetStatusChangeCallback callback, - T... states) { + SmartCardReaderStateOutPtr s) { std::vector<SmartCardReaderStateOutPtr> states_out; - (states_out.push_back(std::move(states)), ...); + states_out.push_back(std::move(s)); auto result = SmartCardStatusChangeResult::NewReaderStates(std::move(states_out)); @@ -207,6 +210,24 @@ std::move(callback).Run(std::move(result)); } +void ReportStateOut(SmartCardContext::GetStatusChangeCallback callback, + SmartCardReaderStateOutPtr s1, + SmartCardReaderStateOutPtr s2) { + std::vector<SmartCardReaderStateOutPtr> states_out; + states_out.push_back(std::move(s1)); + states_out.push_back(std::move(s2)); + + auto result = + SmartCardStatusChangeResult::NewReaderStates(std::move(states_out)); + + std::move(callback).Run(std::move(result)); +} + +class SmartCardReaderTrackerImplTest : public testing::Test { + protected: + base::test::TaskEnvironment task_environment_; +}; + class MockTrackerObserver : public SmartCardReaderTracker::Observer { public: MOCK_METHOD(void, @@ -222,126 +243,82 @@ MOCK_METHOD(void, OnError, (SmartCardError error), (override)); }; -class SmartCardReaderTrackerImplTest : public testing::Test { - protected: - SmartCardReaderTrackerImplTest() - : tracker_(mock_context_factory_.GetRemote()) {} - - base::test::TaskEnvironment task_environment_{ - base::test::TaskEnvironment::TimeSource::MOCK_TIME}; - StrictMock<MockSmartCardContextFactory> mock_context_factory_; - SmartCardReaderTrackerImpl tracker_; - StrictMock<MockTrackerObserver> observer_; - TestFuture<void> context_disconnected_; -}; - -TEST_F(SmartCardReaderTrackerImplTest, CreateContextError) { - { - InSequence s; - - mock_context_factory_.ExpectCreateContextError(SmartCardError::kNoService); - - EXPECT_CALL(observer_, OnError(SmartCardError::kNoService)); - } - - TestFuture<OptionalReaderList> start_future; - tracker_.Start(&observer_, start_future.GetCallback()); - - OptionalReaderList readers = start_future.Take(); - // This is treated as an error, no value should appear. - ASSERT_FALSE(readers.has_value()); -} - TEST_F(SmartCardReaderTrackerImplTest, ListReadersError) { + StrictMock<MockSmartCardContextFactory> mock_context_factory; + SmartCardReaderTrackerImpl tracker(mock_context_factory.GetRemote()); + StrictMock<MockTrackerObserver> observer; + TestFuture<void> context_disconnected; + { InSequence s; - EXPECT_CALL(mock_context_factory_, CreateContext); - mock_context_factory_.ExpectListReadersError( - SmartCardError::kInternalError); + mock_context_factory.ExpectListReadersError(SmartCardError::kInternalError); - EXPECT_CALL(observer_, OnError(SmartCardError::kInternalError)); + EXPECT_CALL(observer, OnError(SmartCardError::kInternalError)); - EXPECT_CALL(mock_context_factory_, ContextDisconnected()) - .WillOnce(InvokeFuture(context_disconnected_)); - } - - TestFuture<OptionalReaderList> start_future; - tracker_.Start(&observer_, start_future.GetCallback()); - - OptionalReaderList readers = start_future.Take(); - // This is treated as an error, no value should appear. - ASSERT_FALSE(readers.has_value()); - - ASSERT_TRUE(context_disconnected_.Wait()); -} - -TEST_F(SmartCardReaderTrackerImplTest, - GetStatusChangeErrorInWaitInitialReaderStatus) { - { - InSequence s; - - EXPECT_CALL(mock_context_factory_, CreateContext); - mock_context_factory_.ExpectListReaders({"Reader A"}); - - EXPECT_CALL(mock_context_factory_, GetStatusChange) + EXPECT_CALL(mock_context_factory, ContextDisconnected()) .WillOnce( - WithArg<2>([](SmartCardContext::GetStatusChangeCallback callback) { - std::move(callback).Run(SmartCardStatusChangeResult::NewError( - SmartCardError::kNoService)); - })); - - EXPECT_CALL(observer_, OnError(SmartCardError::kNoService)); - - EXPECT_CALL(mock_context_factory_, ContextDisconnected) - .WillOnce(InvokeFuture(context_disconnected_)); + [&context_disconnected]() { context_disconnected.SetValue(); }); } - TestFuture<OptionalReaderList> start_future; - tracker_.Start(&observer_, start_future.GetCallback()); + TestFuture<std::optional<std::vector<SmartCardReaderTracker::ReaderInfo>>> + start_future; + tracker.Start(&observer, start_future.GetCallback()); - OptionalReaderList readers = start_future.Take(); + std::optional<std::vector<SmartCardReaderTracker::ReaderInfo>> readers = + start_future.Take(); // This is treated as an error, no value should appear. ASSERT_FALSE(readers.has_value()); - ASSERT_TRUE(context_disconnected_.Wait()); + ASSERT_TRUE(context_disconnected.Wait()); } TEST_F(SmartCardReaderTrackerImplTest, NoReaders) { + StrictMock<MockSmartCardContextFactory> mock_context_factory; + SmartCardReaderTrackerImpl tracker(mock_context_factory.GetRemote()); + StrictMock<MockTrackerObserver> observer; + TestFuture<void> context_disconnected; + { InSequence s; - EXPECT_CALL(mock_context_factory_, CreateContext); - mock_context_factory_.ExpectListReadersError( + mock_context_factory.ExpectListReadersError( SmartCardError::kNoReadersAvailable); - EXPECT_CALL(mock_context_factory_, ContextDisconnected()) - .WillOnce(InvokeFuture(context_disconnected_)); + EXPECT_CALL(mock_context_factory, ContextDisconnected()) + .WillOnce( + [&context_disconnected]() { context_disconnected.SetValue(); }); } - TestFuture<OptionalReaderList> start_future; - tracker_.Start(&observer_, start_future.GetCallback()); + TestFuture<std::optional<std::vector<SmartCardReaderTracker::ReaderInfo>>> + start_future; + tracker.Start(&observer, start_future.GetCallback()); - OptionalReaderList readers = start_future.Take(); + std::optional<std::vector<SmartCardReaderTracker::ReaderInfo>> readers = + start_future.Take(); // This is not treated as an error, should yield empty list. ASSERT_TRUE(readers.has_value()); EXPECT_TRUE(readers->empty()); - ASSERT_TRUE(context_disconnected_.Wait()); + ASSERT_TRUE(context_disconnected.Wait()); } TEST_F(SmartCardReaderTrackerImplTest, ReaderChanged) { + MockSmartCardContextFactory mock_context_factory; + SmartCardReaderTrackerImpl tracker(mock_context_factory.GetRemote()); + StrictMock<MockTrackerObserver> observer; + { InSequence s; - EXPECT_CALL(mock_context_factory_, CreateContext); // Request what readers are currently available. - mock_context_factory_.ExpectListReaders({"Reader A", "Reader B"}); + mock_context_factory.ExpectListReaders({"Reader A", "Reader B"}); // Request the state of each of those readers. - EXPECT_CALL(mock_context_factory_, GetStatusChange) - .WillOnce(WithArgs<1, 2>( - [](std::vector<device::mojom::SmartCardReaderStateInPtr> states_in, + EXPECT_CALL(mock_context_factory, GetStatusChange(_, _, _)) + .WillOnce( + [](base::TimeDelta timeout, + std::vector<device::mojom::SmartCardReaderStateInPtr> states_in, SmartCardContext::GetStatusChangeCallback callback) { ASSERT_EQ(states_in.size(), 2U); @@ -353,19 +330,19 @@ ReportStateOut( std::move(callback), - CreateStateOut("Reader A", ReaderState::kEmpty), - CreateStateOut("Reader B", ReaderState::kInUse, - /*changed=*/false, + CreateStateOut("Reader A", StateFlags::kEmpty), + CreateStateOut("Reader B", StateFlags::kInUse, /*event_count=*/1, std::vector<uint8_t>({1u, 2u, 3u, 4u}))); - })); + }); // Request to be notified of state changes on those readers. // SmartCardContext reports that "Reader B" has changed (card was removed, // thus it's now empty). - EXPECT_CALL(mock_context_factory_, GetStatusChange) - .WillOnce(WithArgs<1, 2>( - [](std::vector<device::mojom::SmartCardReaderStateInPtr> states_in, + EXPECT_CALL(mock_context_factory, GetStatusChange(_, _, _)) + .WillOnce( + [](base::TimeDelta timeout, + std::vector<device::mojom::SmartCardReaderStateInPtr> states_in, SmartCardContext::GetStatusChangeCallback callback) { ASSERT_EQ(states_in.size(), 2U); @@ -378,29 +355,29 @@ EXPECT_EQ(states_in[1]->current_count, 1); ReportStateOut(std::move(callback), - CreateStateOut("Reader A", ReaderState::kEmpty), + CreateStateOut("Reader A", StateFlags::kEmpty), // Reader B has changed. It's now empty as well. - CreateStateOut("Reader B", ReaderState::kEmpty, - /*changed=*/true, + CreateStateOut("Reader B", StateFlags::kNowEmpty, /*event_count=*/2)); - })); + }); - EXPECT_CALL(observer_, OnReaderChanged(CreateReaderInfo( - "Reader B", ReaderInfoState::kEmpty, - /*event_count=*/2, {}))); + EXPECT_CALL(observer, OnReaderChanged( + CreateReaderInfo("Reader B", ReaderState::kEmpty, + /*event_count=*/2, {}))); //// // Now rinse and repeat // Request what readers are currently available. // Still the same readers. - mock_context_factory_.ExpectListReaders({"Reader A", "Reader B"}); + mock_context_factory.ExpectListReaders({"Reader A", "Reader B"}); // Since ListReaders did not return any reader unknown to the tracker, // it will now skip to waiting to be notified on any changes. - EXPECT_CALL(mock_context_factory_, GetStatusChange) - .WillOnce(WithArgs<1, 2>( - [](std::vector<device::mojom::SmartCardReaderStateInPtr> states_in, + EXPECT_CALL(mock_context_factory, GetStatusChange(_, _, _)) + .WillOnce( + [](base::TimeDelta timeout, + std::vector<device::mojom::SmartCardReaderStateInPtr> states_in, SmartCardContext::GetStatusChangeCallback callback) { ASSERT_EQ(states_in.size(), 2U); @@ -421,155 +398,55 @@ // this test. std::move(callback).Run(SmartCardStatusChangeResult::NewError( SmartCardError::kNoService)); - })); + }); - EXPECT_CALL(observer_, OnError(SmartCardError::kNoService)); + EXPECT_CALL(observer, OnError(SmartCardError::kNoService)); // This unrecoverable failure should cause the tracker to drop its smart // card context and stop tracking. - EXPECT_CALL(mock_context_factory_, ContextDisconnected()) - .WillOnce(InvokeFuture(context_disconnected_)); + EXPECT_CALL(mock_context_factory, ContextDisconnected()); } - TestFuture<OptionalReaderList> start_future; - tracker_.Start(&observer_, start_future.GetCallback()); + TestFuture<std::optional<std::vector<SmartCardReaderTracker::ReaderInfo>>> + start_future; + tracker.Start(&observer, start_future.GetCallback()); - OptionalReaderList readers = start_future.Take(); + std::optional<std::vector<SmartCardReaderTracker::ReaderInfo>> readers = + start_future.Take(); ASSERT_TRUE(readers.has_value()); EXPECT_THAT(*readers, UnorderedElementsAre( - CreateReaderInfo("Reader A", ReaderInfoState::kEmpty), - CreateReaderInfo("Reader B", ReaderInfoState::kInUse, + CreateReaderInfo("Reader A", ReaderState::kEmpty), + CreateReaderInfo("Reader B", ReaderState::kInUse, /*event_count=*/1, std::vector<uint8_t>({1u, 2u, 3u, 4u})))); - ASSERT_TRUE(context_disconnected_.Wait()); -} - -// Test that if Start() is called while tracking is already taking place, -// and kMinRefreshInterval has NOT elapsed since tracking has started, -// the tracker just fulfills the request from the cache without -// restarting the tracking. -TEST_F(SmartCardReaderTrackerImplTest, DontRestart) { - TestFuture<SmartCardContext::GetStatusChangeCallback> - tracking_get_status_callback; - - { - InSequence s; - - EXPECT_CALL(mock_context_factory_, CreateContext); - // Request what readers are currently available. - mock_context_factory_.ExpectListReaders({"Reader A", "Reader B"}); - - // Request the state of each of those readers. - EXPECT_CALL(mock_context_factory_, GetStatusChange) - .WillOnce(WithArgs<1, 2>( - [](std::vector<device::mojom::SmartCardReaderStateInPtr> states_in, - SmartCardContext::GetStatusChangeCallback callback) { - ASSERT_EQ(states_in.size(), 2U); - ASSERT_EQ(states_in[0]->reader, "Reader A"); - ExpectUnaware(*states_in[0]); - - ASSERT_EQ(states_in[1]->reader, "Reader B"); - ExpectUnaware(*states_in[1]); - - ReportStateOut( - std::move(callback), - CreateStateOut("Reader A", ReaderState::kEmpty), - CreateStateOut("Reader B", ReaderState::kInUse, - /*changed=*/false, - /*event_count=*/1, - std::vector<uint8_t>({1u, 2u, 3u, 4u}))); - })); - - // Request to be notified of state changes on those readers. - EXPECT_CALL(mock_context_factory_, GetStatusChange) - .WillOnce(WithArgs<1, 2>( - [&tracking_get_status_callback]( - std::vector<device::mojom::SmartCardReaderStateInPtr> states_in, - SmartCardContext::GetStatusChangeCallback callback) { - ASSERT_EQ(states_in.size(), 2U); - - EXPECT_EQ(states_in[0]->reader, "Reader A"); - ExpectEmpty(*states_in[0]->current_state); - EXPECT_EQ(states_in[0]->current_count, 0); - - EXPECT_EQ(states_in[1]->reader, "Reader B"); - ExpectInUse(*states_in[1]->current_state); - EXPECT_EQ(states_in[1]->current_count, 1); - - tracking_get_status_callback.SetValue(std::move(callback)); - })); - - // The error given to the GetStatusChange() call at the end of the test to - // finish it. - EXPECT_CALL(observer_, OnError(SmartCardError::kNoService)); - - // This unrecoverable failure should cause the tracker to drop its smart - // card context and stop tracking. - EXPECT_CALL(mock_context_factory_, ContextDisconnected()) - .WillOnce(InvokeFuture(context_disconnected_)); - } - - TestFuture<OptionalReaderList> start_future; - // The first start() call, at t0. - tracker_.Start(&observer_, start_future.GetCallback()); - - OptionalReaderList readers = start_future.Take(); - ASSERT_TRUE(readers.has_value()); - EXPECT_THAT(*readers, - UnorderedElementsAre( - CreateReaderInfo("Reader A", ReaderInfoState::kEmpty), - CreateReaderInfo("Reader B", ReaderInfoState::kInUse, - /*event_count=*/1, - std::vector<uint8_t>({1u, 2u, 3u, 4u})))); - - // Wait until SmartCardReaderTracerImpl is in the Tracking state, waiting - // for the GetStatusChange() call result. - ASSERT_TRUE(tracking_get_status_callback.Wait()); - - start_future.Clear(); - readers.reset(); - - // The second start() call seemingly without progress in time. - // Will just fulfill the request from the cache without restarting tracking. - tracker_.Start(&observer_, start_future.GetCallback()); - - readers = start_future.Take(); - ASSERT_TRUE(readers.has_value()); - EXPECT_THAT(*readers, - UnorderedElementsAre( - CreateReaderInfo("Reader A", ReaderInfoState::kEmpty), - CreateReaderInfo("Reader B", ReaderInfoState::kInUse, - /*event_count=*/1, - std::vector<uint8_t>({1u, 2u, 3u, 4u})))); - - // End the test by simulating an error on the outstanding GetStatusChange. - tracking_get_status_callback.Take().Run( - SmartCardStatusChangeResult::NewError(SmartCardError::kNoService)); - - ASSERT_TRUE(context_disconnected_.Wait()); + base::RunLoop run_loop; + run_loop.RunUntilIdle(); } // If Start() is called while tracking is already taking place and // kMinRefreshInterval has elapsed since tracking has started, it should cause // tracking to be restarted. ie, a new list of readers being fetched, etc. TEST_F(SmartCardReaderTrackerImplTest, Restart) { + MockSmartCardContextFactory mock_context_factory; + SmartCardReaderTrackerImpl tracker(mock_context_factory.GetRemote()); TestFuture<SmartCardContext::GetStatusChangeCallback> tracking_get_status_callback; + StrictMock<MockTrackerObserver> observer; { InSequence s; - EXPECT_CALL(mock_context_factory_, CreateContext); // Request what readers are currently available. - mock_context_factory_.ExpectListReaders({"Reader A", "Reader B"}); + mock_context_factory.ExpectListReaders({"Reader A", "Reader B"}); // Request the state of each of those readers. - EXPECT_CALL(mock_context_factory_, GetStatusChange) - .WillOnce(WithArgs<1, 2>( - [](std::vector<device::mojom::SmartCardReaderStateInPtr> states_in, + EXPECT_CALL(mock_context_factory, GetStatusChange(_, _, _)) + .WillOnce( + [](base::TimeDelta timeout, + std::vector<device::mojom::SmartCardReaderStateInPtr> states_in, SmartCardContext::GetStatusChangeCallback callback) { ASSERT_EQ(states_in.size(), 2U); ASSERT_EQ(states_in[0]->reader, "Reader A"); @@ -580,17 +457,17 @@ ReportStateOut( std::move(callback), - CreateStateOut("Reader A", ReaderState::kEmpty), - CreateStateOut("Reader B", ReaderState::kInUse, - /*changed=*/false, + CreateStateOut("Reader A", StateFlags::kEmpty), + CreateStateOut("Reader B", StateFlags::kInUse, /*event_count=*/1, std::vector<uint8_t>({1u, 2u, 3u, 4u}))); - })); + }); // Request to be notified of state changes on those readers. - EXPECT_CALL(mock_context_factory_, GetStatusChange) - .WillOnce(WithArgs<1, 2>( + EXPECT_CALL(mock_context_factory, GetStatusChange(_, _, _)) + .WillOnce( [&tracking_get_status_callback]( + base::TimeDelta timeout, std::vector<device::mojom::SmartCardReaderStateInPtr> states_in, SmartCardContext::GetStatusChangeCallback callback) { ASSERT_EQ(states_in.size(), 2U); @@ -605,9 +482,9 @@ // Handle that in the upcoming Cancel() call. tracking_get_status_callback.SetValue(std::move(callback)); - })); + }); - EXPECT_CALL(mock_context_factory_, Cancel) + EXPECT_CALL(mock_context_factory, Cancel(_)) .WillOnce([&tracking_get_status_callback]( SmartCardContext::CancelCallback callback) { // The cancel call succeeded. @@ -626,13 +503,14 @@ // Request what readers are currently available. // Still the same readers. - mock_context_factory_.ExpectListReaders({"Reader A", "Reader B"}); + mock_context_factory.ExpectListReaders({"Reader A", "Reader B"}); // Since ListReaders did not return any reader unknown to the tracker, // it will now skip to waiting to be notified on any changes. - EXPECT_CALL(mock_context_factory_, GetStatusChange) - .WillOnce(WithArgs<1, 2>( - [](std::vector<device::mojom::SmartCardReaderStateInPtr> states_in, + EXPECT_CALL(mock_context_factory, GetStatusChange(_, _, _)) + .WillOnce( + [](base::TimeDelta timeout, + std::vector<device::mojom::SmartCardReaderStateInPtr> states_in, SmartCardContext::GetStatusChangeCallback callback) { ASSERT_EQ(states_in.size(), 2U); @@ -652,85 +530,105 @@ std::move(callback).Run( device::mojom::SmartCardStatusChangeResult::NewError( SmartCardError::kNoService)); - })); + }); // The error given by the last GetStatusChange() call. - EXPECT_CALL(observer_, OnError(SmartCardError::kNoService)); + EXPECT_CALL(observer, OnError(SmartCardError::kNoService)); // This unrecoverable failure should cause the tracker to drop its smart // card context and stop tracking. - EXPECT_CALL(mock_context_factory_, ContextDisconnected()) - .WillOnce(InvokeFuture(context_disconnected_)); + EXPECT_CALL(mock_context_factory, ContextDisconnected()); } - TestFuture<OptionalReaderList> start_future; - // The first start() call, at t0. - tracker_.Start(&observer_, start_future.GetCallback()); + { + base::subtle::ScopedTimeClockOverrides time_override( + []() { return base::Time::FromSecondsSinceUnixEpoch(0); }, nullptr, + nullptr); - OptionalReaderList readers = start_future.Take(); - ASSERT_TRUE(readers.has_value()); - EXPECT_THAT(*readers, - UnorderedElementsAre( - CreateReaderInfo("Reader A", ReaderInfoState::kEmpty), - CreateReaderInfo("Reader B", ReaderInfoState::kInUse, - /*event_count=*/1, - std::vector<uint8_t>({1u, 2u, 3u, 4u})))); + TestFuture<std::optional<std::vector<SmartCardReaderTracker::ReaderInfo>>> + start_future; + // The first start() call, at t0. + tracker.Start(&observer, start_future.GetCallback()); + + std::optional<std::vector<SmartCardReaderTracker::ReaderInfo>> readers = + start_future.Take(); + ASSERT_TRUE(readers.has_value()); + EXPECT_THAT(*readers, + UnorderedElementsAre( + CreateReaderInfo("Reader A", ReaderState::kEmpty), + CreateReaderInfo("Reader B", ReaderState::kInUse, + /*event_count=*/1, + std::vector<uint8_t>({1u, 2u, 3u, 4u})))); + } // Wait until SmartCardReaderTracerImpl is in the Tracking state, waiting // for the GetStatusChange() call result. ASSERT_TRUE(tracking_get_status_callback.Wait()); - task_environment_.FastForwardBy( - SmartCardReaderTrackerImpl::kMinRefreshInterval); - start_future.Clear(); - readers.reset(); - // The second start() call at t0 + kMinRefreshInterval. - // Will make the tracker cancel the currently outstanding GetStatusChange() - // request and restart from the ListReaders() call. - tracker_.Start(&observer_, start_future.GetCallback()); + { + base::subtle::ScopedTimeClockOverrides time_override( + []() { + return base::Time::FromSecondsSinceUnixEpoch( + SmartCardReaderTrackerImpl::kMinRefreshInterval.InSecondsF() * 2); + }, + nullptr, nullptr); - readers = start_future.Take(); - ASSERT_TRUE(readers.has_value()); - EXPECT_THAT(*readers, - UnorderedElementsAre( - CreateReaderInfo("Reader A", ReaderInfoState::kEmpty), - CreateReaderInfo("Reader B", ReaderInfoState::kInUse, - /*event_count=*/1, - std::vector<uint8_t>({1u, 2u, 3u, 4u})))); + TestFuture<std::optional<std::vector<SmartCardReaderTracker::ReaderInfo>>> + start_future; + // The second start() call at t0 + (kMinRefreshInterval*2). + // Will make the tracker cancel the currently outstanding GetStatusChange() + // request and restart from the ListReaders() call. + tracker.Start(&observer, start_future.GetCallback()); - ASSERT_TRUE(context_disconnected_.Wait()); + std::optional<std::vector<SmartCardReaderTracker::ReaderInfo>> readers = + start_future.Take(); + ASSERT_TRUE(readers.has_value()); + EXPECT_THAT(*readers, + UnorderedElementsAre( + CreateReaderInfo("Reader A", ReaderState::kEmpty), + CreateReaderInfo("Reader B", ReaderState::kInUse, + /*event_count=*/1, + std::vector<uint8_t>({1u, 2u, 3u, 4u})))); + } + + base::RunLoop run_loop; + run_loop.RunUntilIdle(); } // Test that tracker will cancel its outstanding GetStatusChange() request and // stop tracking when the last observer leaves. TEST_F(SmartCardReaderTrackerImplTest, StopWhenTracking) { + MockSmartCardContextFactory mock_context_factory; + SmartCardReaderTrackerImpl tracker(mock_context_factory.GetRemote()); TestFuture<SmartCardContext::GetStatusChangeCallback> tracking_get_status_callback; + StrictMock<MockTrackerObserver> observer; { InSequence s; - EXPECT_CALL(mock_context_factory_, CreateContext); // Request what readers are currently available. - mock_context_factory_.ExpectListReaders({"Reader A"}); + mock_context_factory.ExpectListReaders({"Reader A"}); // Request the state of each of those readers. - EXPECT_CALL(mock_context_factory_, GetStatusChange) - .WillOnce(WithArgs<1, 2>( - [](std::vector<device::mojom::SmartCardReaderStateInPtr> states_in, + EXPECT_CALL(mock_context_factory, GetStatusChange(_, _, _)) + .WillOnce( + [](base::TimeDelta timeout, + std::vector<device::mojom::SmartCardReaderStateInPtr> states_in, SmartCardContext::GetStatusChangeCallback callback) { ASSERT_EQ(states_in.size(), 1U); ASSERT_EQ(states_in[0]->reader, "Reader A"); ExpectUnaware(*states_in[0]); ReportStateOut(std::move(callback), - CreateStateOut("Reader A", ReaderState::kEmpty)); - })); + CreateStateOut("Reader A", StateFlags::kEmpty)); + }); // Request to be notified of state changes on those readers. - EXPECT_CALL(mock_context_factory_, GetStatusChange) - .WillOnce(WithArgs<1, 2>( + EXPECT_CALL(mock_context_factory, GetStatusChange(_, _, _)) + .WillOnce( [&tracking_get_status_callback]( + base::TimeDelta timeout, std::vector<device::mojom::SmartCardReaderStateInPtr> states_in, SmartCardContext::GetStatusChangeCallback callback) { ASSERT_EQ(states_in.size(), 1U); @@ -741,11 +639,11 @@ // Handle that in the upcoming Cancel() call. tracking_get_status_callback.SetValue(std::move(callback)); - })); + }); // When tracker.Stop() is called, the tracker should cancel the outstanding // GetStatusChange() request. - EXPECT_CALL(mock_context_factory_, Cancel) + EXPECT_CALL(mock_context_factory, Cancel(_)) .WillOnce([&tracking_get_status_callback]( SmartCardContext::CancelCallback callback) { // The cancel call succeeded. @@ -761,14 +659,14 @@ // Tracker should then drop its smart card context as it will no longer // track readers. - EXPECT_CALL(mock_context_factory_, ContextDisconnected()) - .WillOnce(InvokeFuture(context_disconnected_)); + EXPECT_CALL(mock_context_factory, ContextDisconnected()); } // Start() { - TestFuture<OptionalReaderList> start_future; - tracker_.Start(&observer_, start_future.GetCallback()); + TestFuture<std::optional<std::vector<SmartCardReaderTracker::ReaderInfo>>> + start_future; + tracker.Start(&observer, start_future.GetCallback()); ASSERT_TRUE(start_future.Wait()); } @@ -777,36 +675,42 @@ ASSERT_TRUE(tracking_get_status_callback.Wait()); // Then Stop() - tracker_.Stop(&observer_); + tracker.Stop(&observer); - ASSERT_TRUE(context_disconnected_.Wait()); + base::RunLoop run_loop; + run_loop.RunUntilIdle(); } TEST_F(SmartCardReaderTrackerImplTest, ReaderRemoved) { + MockSmartCardContextFactory mock_context_factory; + SmartCardReaderTrackerImpl tracker(mock_context_factory.GetRemote()); + StrictMock<MockTrackerObserver> observer; + { InSequence s; - EXPECT_CALL(mock_context_factory_, CreateContext); // Request what readers are currently available. - mock_context_factory_.ExpectListReaders({"Reader A"}); + mock_context_factory.ExpectListReaders({"Reader A"}); // Request the state of each of those readers. - EXPECT_CALL(mock_context_factory_, GetStatusChange) - .WillOnce(WithArgs<1, 2>( - [](std::vector<device::mojom::SmartCardReaderStateInPtr> states_in, + EXPECT_CALL(mock_context_factory, GetStatusChange(_, _, _)) + .WillOnce( + [](base::TimeDelta timeout, + std::vector<device::mojom::SmartCardReaderStateInPtr> states_in, SmartCardContext::GetStatusChangeCallback callback) { ASSERT_EQ(states_in.size(), 1U); ASSERT_EQ(states_in[0]->reader, "Reader A"); ExpectUnaware(*states_in[0]); ReportStateOut(std::move(callback), - CreateStateOut("Reader A", ReaderState::kEmpty)); - })); + CreateStateOut("Reader A", StateFlags::kEmpty)); + }); // Request to be notified of state changes on those readers. - EXPECT_CALL(mock_context_factory_, GetStatusChange) - .WillOnce(WithArgs<1, 2>( - [](std::vector<device::mojom::SmartCardReaderStateInPtr> states_in, + EXPECT_CALL(mock_context_factory, GetStatusChange(_, _, _)) + .WillOnce( + [](base::TimeDelta timeout, + std::vector<device::mojom::SmartCardReaderStateInPtr> states_in, SmartCardContext::GetStatusChangeCallback callback) { ASSERT_EQ(states_in.size(), 1U); @@ -815,134 +719,29 @@ EXPECT_EQ(states_in[0]->current_count, 0); // Reader A has been removed. It's now unknown. - ReportStateOut(std::move(callback), - CreateStateOut("Reader A", ReaderState::kUnknown, - /*changed=*/true)); - })); + ReportStateOut( + std::move(callback), + CreateStateOut("Reader A", StateFlags::kNowUnknown)); + }); // Tracker will notify observers about this removal. - EXPECT_CALL(observer_, OnReaderRemoved("Reader A")); + EXPECT_CALL(observer, OnReaderRemoved("Reader A")); // As there are no readers left, tracker should stop on its own and drop its // smart card context. - EXPECT_CALL(mock_context_factory_, ContextDisconnected()) - .WillOnce(InvokeFuture(context_disconnected_)); + EXPECT_CALL(mock_context_factory, ContextDisconnected()); } // Start() { - TestFuture<OptionalReaderList> start_future; - tracker_.Start(&observer_, start_future.GetCallback()); + TestFuture<std::optional<std::vector<SmartCardReaderTracker::ReaderInfo>>> + start_future; + tracker.Start(&observer, start_future.GetCallback()); ASSERT_TRUE(start_future.Wait()); } - ASSERT_TRUE(context_disconnected_.Wait()); -} - -TEST_F(SmartCardReaderTrackerImplTest, GetStatusChangeTimeoutInTracking) { - { - InSequence s; - - EXPECT_CALL(mock_context_factory_, CreateContext); - // Initial setup - mock_context_factory_.ExpectListReaders({"Reader A"}); - EXPECT_CALL(mock_context_factory_, GetStatusChange) - .WillOnce( - WithArg<2>([](SmartCardContext::GetStatusChangeCallback callback) { - ReportStateOut(std::move(callback), - CreateStateOut("Reader A", ReaderState::kEmpty)); - })); - - // In Tracking state, GetStatusChange times out. - EXPECT_CALL(mock_context_factory_, GetStatusChange) - .WillOnce( - WithArg<2>([](SmartCardContext::GetStatusChangeCallback callback) { - std::move(callback).Run(SmartCardStatusChangeResult::NewError( - SmartCardError::kTimeout)); - })); - - // After timeout, tracker should try to ListReaders again. - // This time we return an error to end the test. - mock_context_factory_.ExpectListReadersError(SmartCardError::kNoService); - - EXPECT_CALL(observer_, OnError(SmartCardError::kNoService)); - - EXPECT_CALL(mock_context_factory_, ContextDisconnected()) - .WillOnce(InvokeFuture(context_disconnected_)); - } - - TestFuture<OptionalReaderList> start_future; - tracker_.Start(&observer_, start_future.GetCallback()); - - ASSERT_TRUE(start_future.Wait()); - ASSERT_TRUE(context_disconnected_.Wait()); -} - -TEST_F(SmartCardReaderTrackerImplTest, CancelFailedInTracking) { - TestFuture<SmartCardContext::GetStatusChangeCallback> - tracking_get_status_callback; - - { - InSequence s; - - EXPECT_CALL(mock_context_factory_, CreateContext); - // Initial setup - mock_context_factory_.ExpectListReaders({"Reader A"}); - EXPECT_CALL(mock_context_factory_, GetStatusChange) - .WillOnce( - WithArg<2>([](SmartCardContext::GetStatusChangeCallback callback) { - ReportStateOut(std::move(callback), - CreateStateOut("Reader A", ReaderState::kEmpty)); - })); - - // In Tracking state - EXPECT_CALL(mock_context_factory_, GetStatusChange) - .WillOnce( - WithArg<2>([&tracking_get_status_callback]( - SmartCardContext::GetStatusChangeCallback callback) { - tracking_get_status_callback.SetValue(std::move(callback)); - })); - - // Cancel fails - EXPECT_CALL(mock_context_factory_, Cancel) - .WillOnce([](SmartCardContext::CancelCallback callback) { - std::move(callback).Run( - SmartCardResult::NewError(SmartCardError::kInternalError)); - }); - - // GetStatusChange finally returns with an error to end the test. - EXPECT_CALL(observer_, OnError(SmartCardError::kNoService)); - EXPECT_CALL(mock_context_factory_, ContextDisconnected()) - .WillOnce(InvokeFuture(context_disconnected_)); - } - - TestFuture<OptionalReaderList> start_future; - tracker_.Start(&observer_, start_future.GetCallback()); - OptionalReaderList readers = start_future.Take(); - ASSERT_TRUE(readers.has_value()); - EXPECT_THAT(*readers, ElementsAre(CreateReaderInfo("Reader A", - ReaderInfoState::kEmpty))); - - // Tracking state - ASSERT_TRUE(tracking_get_status_callback.Wait()); - task_environment_.FastForwardBy( - SmartCardReaderTrackerImpl::kMinRefreshInterval); - - start_future.Clear(); - readers.reset(); - - tracker_.Start(&observer_, start_future.GetCallback()); - // Should be fulfilled from cache - readers = start_future.Take(); - ASSERT_TRUE(readers.has_value()); - EXPECT_THAT(*readers, ElementsAre(CreateReaderInfo("Reader A", - ReaderInfoState::kEmpty))); - - // End test by forcing error. - tracking_get_status_callback.Take().Run( - SmartCardStatusChangeResult::NewError(SmartCardError::kNoService)); - - ASSERT_TRUE(context_disconnected_.Wait()); + base::RunLoop run_loop; + run_loop.RunUntilIdle(); } } // namespace
diff --git a/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabGroupModelFilterImpl.java b/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabGroupModelFilterImpl.java index fca988e..8097daa 100644 --- a/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabGroupModelFilterImpl.java +++ b/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabGroupModelFilterImpl.java
@@ -1267,6 +1267,18 @@ } @Override + public void willChangePinState(Tab tab) { + assert !(tab.getIsPinned() && isTabInTabGroup(tab)) + : "A pinned tab should not be in a group"; + + // If tab is about to get pinned state and it is in a tab group + if (!tab.getIsPinned() && isTabInTabGroup(tab)) { + mTabUngrouper.ungroupTabs( + Collections.singletonList(tab), /* trailing= */ false, /* allowDialog= */ true); + } + } + + @Override public Set<Token> getAllTabGroupIds() { Set<Token> uniqueTabGroupIds = new ArraySet<>(); TabList tabList = getTabModel();
diff --git a/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabGroupModelFilterImplUnitTest.java b/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabGroupModelFilterImplUnitTest.java index 886a0628..ff55e17 100644 --- a/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabGroupModelFilterImplUnitTest.java +++ b/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabGroupModelFilterImplUnitTest.java
@@ -2695,6 +2695,25 @@ assertFalse(mTabGroupModelFilter.willMergingCreateNewGroup(tabsToMerge)); } + @Test + public void testWillChangePinState_TabWillPin_TabInExistingGroup() { + doReturn(false).when(mTab3).getIsPinned(); + + mTabGroupModelFilter.willChangePinState(mTab3); + + verify(mTabUngrouper) + .ungroupTabs(List.of(mTab3), /* trailing= */ false, /* allowDialog= */ true); + } + + @Test + public void testWillChangePinState_TabWillUnPin_TabNotIngroup_NoOp() { + doReturn(true).when(mTab1).getIsPinned(); + + mTabGroupModelFilter.willChangePinState(mTab1); + + verify(mTabUngrouper, never()).ungroupTabs(any(), anyBoolean(), anyBoolean()); + } + private void verifyGroupCreationDialogShouldShow(VerificationMode mode) { mTabGroupModelFilter.mergeTabsToGroup(mTab1.getId(), mTab4.getId());
diff --git a/chrome/browser/ui/android/autofill/internal/BUILD.gn b/chrome/browser/ui/android/autofill/internal/BUILD.gn index 717b40f..3b1f8ab 100644 --- a/chrome/browser/ui/android/autofill/internal/BUILD.gn +++ b/chrome/browser/ui/android/autofill/internal/BUILD.gn
@@ -48,7 +48,7 @@ generate_jni("jni_headers") { visibility = [ ":*", - "//chrome/browser/ui:ui", + "//chrome/browser/ui", ] sources = [ "java/src/org/chromium/chrome/browser/ui/autofill/AuthenticatorSelectionDialogBridge.java", @@ -85,7 +85,7 @@ "//third_party/androidx:androidx_test_runner_java", "//third_party/google-truth:google_truth_java", "//third_party/jni_zero:jni_zero_java", - "//third_party/junit:junit", + "//third_party/junit", "//third_party/mockito:mockito_java", "//ui/android:ui_full_java", "//ui/android:ui_java_test_support",
diff --git a/chrome/browser/ui/android/desktop_windowing/BUILD.gn b/chrome/browser/ui/android/desktop_windowing/BUILD.gn index ff94227f8..df2e70c 100644 --- a/chrome/browser/ui/android/desktop_windowing/BUILD.gn +++ b/chrome/browser/ui/android/desktop_windowing/BUILD.gn
@@ -42,7 +42,7 @@ "//third_party/androidx:androidx_core_core_java", "//third_party/androidx:androidx_test_core_java", "//third_party/androidx:androidx_test_ext_junit_java", - "//third_party/junit:junit", + "//third_party/junit", "//third_party/mockito:mockito_java", "//ui/android:ui_java", "//ui/android:ui_java_test_support",
diff --git a/chrome/browser/ui/android/device_lock/BUILD.gn b/chrome/browser/ui/android/device_lock/BUILD.gn index cc30232..976f0a4f 100644 --- a/chrome/browser/ui/android/device_lock/BUILD.gn +++ b/chrome/browser/ui/android/device_lock/BUILD.gn
@@ -110,7 +110,7 @@ "//third_party/androidx:androidx_test_ext_junit_java", "//third_party/androidx:androidx_test_monitor_java", "//third_party/androidx:androidx_test_runner_java", - "//third_party/junit:junit", + "//third_party/junit", "//third_party/mockito:mockito_java", "//ui/android:ui_java_test_support", "//ui/android:ui_no_recycler_view_java",
diff --git a/chrome/browser/ui/android/extensions/windowing/internal/BUILD.gn b/chrome/browser/ui/android/extensions/windowing/internal/BUILD.gn index 433510a3..b8374db 100644 --- a/chrome/browser/ui/android/extensions/windowing/internal/BUILD.gn +++ b/chrome/browser/ui/android/extensions/windowing/internal/BUILD.gn
@@ -13,6 +13,7 @@ deps = [ ":jni", "//base", + "//chrome/browser/ui/browser_window", ] } @@ -47,6 +48,24 @@ "//base", "//chrome/browser/ui/android/extensions/windowing/test:native_unit_test_support_java", "//chrome/browser/ui/android/extensions/windowing/test:native_unit_test_support_jni", + "//chrome/browser/ui/browser_window", "//testing/gtest", ] } + +android_library("javatests") { + testonly = true + sources = [ "java/src/org/chromium/chrome/browser/ui/extensions/windowing/ExtensionWindowControllerBridgeIntegrationTest.java" ] + deps = [ + ":java", + "//base:base_java_test_support", + "//chrome/android:chrome_java", + "//chrome/browser/flags:java", + "//chrome/browser/ui/android/extensions/windowing:java", + "//chrome/browser/ui/browser_window:java", + "//chrome/browser/ui/browser_window/internal:java", + "//chrome/test/android:chrome_java_transit", + "//third_party/androidx:androidx_test_runner_java", + "//third_party/junit", + ] +}
diff --git a/chrome/browser/ui/android/extensions/windowing/internal/extension_window_controller_bridge.cc b/chrome/browser/ui/android/extensions/windowing/internal/extension_window_controller_bridge.cc index 798860a..74801e4 100644 --- a/chrome/browser/ui/android/extensions/windowing/internal/extension_window_controller_bridge.cc +++ b/chrome/browser/ui/android/extensions/windowing/internal/extension_window_controller_bridge.cc
@@ -9,6 +9,7 @@ #include "base/android/jni_android.h" #include "base/android/scoped_java_ref.h" #include "chrome/browser/ui/android/extensions/windowing/internal/jni/ExtensionWindowControllerBridgeImpl_jni.h" +#include "chrome/browser/ui/browser_window/public/browser_window_interface.h" namespace { using base::android::AttachCurrentThread; @@ -18,15 +19,21 @@ // Implements Java |ExtensionWindowControllerBridgeImpl.Natives#create| static jlong JNI_ExtensionWindowControllerBridgeImpl_Create( JNIEnv* env, - const JavaParamRef<jobject>& caller) { + const JavaParamRef<jobject>& caller, + jlong native_browser_window_ptr) { + BrowserWindowInterface* browser_window = + reinterpret_cast<BrowserWindowInterface*>(native_browser_window_ptr); + return reinterpret_cast<intptr_t>( - new ExtensionWindowControllerBridge(env, caller)); + new ExtensionWindowControllerBridge(env, caller, browser_window)); } ExtensionWindowControllerBridge::ExtensionWindowControllerBridge( JNIEnv* env, const base::android::JavaParamRef<jobject>& - java_extension_window_controller_bridge) { + java_extension_window_controller_bridge, + BrowserWindowInterface* browser_window) + : browser_window_(browser_window) { java_extension_window_controller_bridge_.Reset( env, java_extension_window_controller_bridge); } @@ -39,3 +46,8 @@ void ExtensionWindowControllerBridge::Destroy(JNIEnv* env) { delete this; } + +BrowserWindowInterface* +ExtensionWindowControllerBridge::GetBrowserWindowForTesting() const { + return browser_window_; +}
diff --git a/chrome/browser/ui/android/extensions/windowing/internal/extension_window_controller_bridge.h b/chrome/browser/ui/android/extensions/windowing/internal/extension_window_controller_bridge.h index 409e211..33fac17 100644 --- a/chrome/browser/ui/android/extensions/windowing/internal/extension_window_controller_bridge.h +++ b/chrome/browser/ui/android/extensions/windowing/internal/extension_window_controller_bridge.h
@@ -9,6 +9,8 @@ #include "base/android/scoped_java_ref.h" +class BrowserWindowInterface; + // Native class for the Java |ExtensionWindowControllerBridge|. // // The primary purpose of this class is to own a cross-platform @@ -18,7 +20,8 @@ public: ExtensionWindowControllerBridge(JNIEnv* env, const base::android::JavaParamRef<jobject>& - java_extension_window_controller_bridge); + java_extension_window_controller_bridge, + BrowserWindowInterface* browser_window); ExtensionWindowControllerBridge(const ExtensionWindowControllerBridge&) = delete; ExtensionWindowControllerBridge& operator=( @@ -28,9 +31,16 @@ // Implements Java |ExtensionWindowControllerBridgeImpl.Natives#destroy|. void Destroy(JNIEnv* env); + // TODO(crbug.com/424856725): replace with a test-only function that returns + // the |extensions::WindowController|. + BrowserWindowInterface* GetBrowserWindowForTesting() const; + private: base::android::ScopedJavaGlobalRef<jobject> java_extension_window_controller_bridge_; + + // TODO(crbug.com/424856725): replace with an |extensions::WindowController|. + BrowserWindowInterface* browser_window_; }; #endif // CHROME_BROWSER_UI_ANDROID_EXTENSIONS_WINDOWING_INTERNAL_EXTENSION_WINDOW_CONTROLLER_BRIDGE_H_
diff --git a/chrome/browser/ui/android/extensions/windowing/internal/extension_window_controller_bridge_unittest.cc b/chrome/browser/ui/android/extensions/windowing/internal/extension_window_controller_bridge_unittest.cc index 0b8d1eb..f9ea2db 100644 --- a/chrome/browser/ui/android/extensions/windowing/internal/extension_window_controller_bridge_unittest.cc +++ b/chrome/browser/ui/android/extensions/windowing/internal/extension_window_controller_bridge_unittest.cc
@@ -8,6 +8,7 @@ #include "base/android/jni_android.h" #include "base/android/scoped_java_ref.h" #include "chrome/browser/ui/android/extensions/windowing/test/native_unit_test_support_jni/ExtensionWindowControllerBridgeNativeUnitTestSupport_jni.h" +#include "chrome/browser/ui/browser_window/public/browser_window_interface.h" #include "testing/gtest/include/gtest/gtest.h" namespace { @@ -26,7 +27,10 @@ AttachCurrentThread())); } - void TearDown() override { InvokeJavaOnTaskRemoved(); } + void TearDown() override { + Java_ExtensionWindowControllerBridgeNativeUnitTestSupport_tearDown( + AttachCurrentThread(), java_test_support_); + } void InvokeJavaOnAddedToTask() const { Java_ExtensionWindowControllerBridgeNativeUnitTestSupport_invokeOnAddedToTask( @@ -49,14 +53,17 @@ }; TEST_F(ExtensionWindowControllerBridgeUnitTest, - JavaOnAddedToTaskCreatesNativeObj) { + JavaOnAddedToTaskCreatesNativeObjects) { // Act. InvokeJavaOnAddedToTask(); // Assert. - ExtensionWindowControllerBridge* native_ptr = + ExtensionWindowControllerBridge* extension_window_controller_bridge = InvokeJavaGetNativePtrForTesting(); - EXPECT_NE(nullptr, native_ptr); + BrowserWindowInterface* browser_window = + extension_window_controller_bridge->GetBrowserWindowForTesting(); + EXPECT_NE(nullptr, extension_window_controller_bridge); + EXPECT_NE(nullptr, browser_window); } TEST_F(ExtensionWindowControllerBridgeUnitTest,
diff --git a/chrome/browser/ui/android/extensions/windowing/internal/java/src/org/chromium/chrome/browser/ui/extensions/windowing/ExtensionWindowControllerBridgeFactory.java b/chrome/browser/ui/android/extensions/windowing/internal/java/src/org/chromium/chrome/browser/ui/extensions/windowing/ExtensionWindowControllerBridgeFactory.java index c04f481..82227280 100644 --- a/chrome/browser/ui/android/extensions/windowing/internal/java/src/org/chromium/chrome/browser/ui/extensions/windowing/ExtensionWindowControllerBridgeFactory.java +++ b/chrome/browser/ui/android/extensions/windowing/internal/java/src/org/chromium/chrome/browser/ui/extensions/windowing/ExtensionWindowControllerBridgeFactory.java
@@ -13,13 +13,8 @@ public final class ExtensionWindowControllerBridgeFactory { private ExtensionWindowControllerBridgeFactory() {} - /** - * Creates an {@link ExtensionWindowControllerBridge} for the given {@link ChromeAndroidTask}. - * - * <p>Note: this class is compiled using the {@code android_library_factory} GN template, so - * this method will return null if {@link ExtensionWindowControllerBridgeImpl} isn't compiled - * into the build. - */ + // Mark as nullable to be consistent with the stub factory in + // //chrome/browser/ui/android/extensions/windowing/stub. @Nullable public static ExtensionWindowControllerBridge create(ChromeAndroidTask chromeAndroidTask) { return new ExtensionWindowControllerBridgeImpl(chromeAndroidTask);
diff --git a/chrome/browser/ui/android/extensions/windowing/internal/java/src/org/chromium/chrome/browser/ui/extensions/windowing/ExtensionWindowControllerBridgeImpl.java b/chrome/browser/ui/android/extensions/windowing/internal/java/src/org/chromium/chrome/browser/ui/extensions/windowing/ExtensionWindowControllerBridgeImpl.java index 82f1fa19..629eddf 100644 --- a/chrome/browser/ui/android/extensions/windowing/internal/java/src/org/chromium/chrome/browser/ui/extensions/windowing/ExtensionWindowControllerBridgeImpl.java +++ b/chrome/browser/ui/android/extensions/windowing/internal/java/src/org/chromium/chrome/browser/ui/extensions/windowing/ExtensionWindowControllerBridgeImpl.java
@@ -14,7 +14,6 @@ @NullMarked final class ExtensionWindowControllerBridgeImpl implements ExtensionWindowControllerBridge { - @SuppressWarnings("UnusedVariable") private final ChromeAndroidTask mChromeAndroidTask; private long mNativeExtensionWindowControllerBridge; @@ -29,7 +28,10 @@ : "ExtensionWindowControllerBridge is already added to a task."; mNativeExtensionWindowControllerBridge = - ExtensionWindowControllerBridgeImplJni.get().create(this); + ExtensionWindowControllerBridgeImplJni.get() + .create( + /* caller= */ this, + mChromeAndroidTask.getOrCreateNativeBrowserWindowPtr()); } @Override @@ -51,7 +53,15 @@ @NativeMethods interface Natives { - long create(ExtensionWindowControllerBridgeImpl caller); + /** + * Creates a native {@code ExtensionWindowControllerBridge}. + * + * @param caller The Java object calling this method. + * @param nativeBrowserWindowPtr The address of a native {@code BrowserWindowInterface}. + * It's the caller's responsibility to ensure the validity of the address. Failure to do + * so will result in undefined behavior on the native side. + */ + long create(ExtensionWindowControllerBridgeImpl caller, long nativeBrowserWindowPtr); void destroy(long nativeExtensionWindowControllerBridge); }
diff --git a/chrome/browser/ui/android/extensions/windowing/internal/java/src/org/chromium/chrome/browser/ui/extensions/windowing/ExtensionWindowControllerBridgeIntegrationTest.java b/chrome/browser/ui/android/extensions/windowing/internal/java/src/org/chromium/chrome/browser/ui/extensions/windowing/ExtensionWindowControllerBridgeIntegrationTest.java new file mode 100644 index 0000000..880471d --- /dev/null +++ b/chrome/browser/ui/android/extensions/windowing/internal/java/src/org/chromium/chrome/browser/ui/extensions/windowing/ExtensionWindowControllerBridgeIntegrationTest.java
@@ -0,0 +1,111 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +package org.chromium.chrome.browser.ui.extensions.windowing; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + +import androidx.test.filters.MediumTest; + +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; + +import org.chromium.base.test.BaseJUnit4ClassRunner; +import org.chromium.base.test.util.Batch; +import org.chromium.base.test.util.CommandLineFlags; +import org.chromium.build.annotations.NullMarked; +import org.chromium.build.annotations.Nullable; +import org.chromium.chrome.browser.flags.ChromeSwitches; +import org.chromium.chrome.browser.ui.browser_window.ChromeAndroidTask; +import org.chromium.chrome.browser.ui.browser_window.ChromeAndroidTaskFeature; +import org.chromium.chrome.browser.ui.browser_window.ChromeAndroidTaskTrackerFactory; +import org.chromium.chrome.test.transit.ChromeTransitTestRules; +import org.chromium.chrome.test.transit.FreshCtaTransitTestRule; + +import java.util.List; + +@RunWith(BaseJUnit4ClassRunner.class) +@CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE}) +@Batch(value = Batch.PER_CLASS) +@NullMarked +public class ExtensionWindowControllerBridgeIntegrationTest { + + @Rule + public FreshCtaTransitTestRule mFreshCtaTransitTestRule = + ChromeTransitTestRules.freshChromeTabbedActivityRule(); + + @Test + @MediumTest + public void startChromeTabbedActivity_addsExtensionWindowControllerBridgeToChromeAndroidTask() { + // Arrange & Act. + mFreshCtaTransitTestRule.startOnBlankPage(); + int taskId = mFreshCtaTransitTestRule.getActivity().getTaskId(); + + // Assert. + var extensionWindowControllerBridge = getExtensionWindowControllerBridge(taskId); + assertNotNull(extensionWindowControllerBridge); + } + + /** + * Verifies that an {@link ExtensionWindowControllerBridge} is destroyed with its {@code + * Activity}. + * + * <p>This is the right behavior when {@link ChromeAndroidTask} tracks an {@code Activity}, + * which is a workaround to track a Task (window). + * + * <p>If {@link ChromeAndroidTask} tracks a Task, {@link ExtensionWindowControllerBridge} should + * continue to exist as long as the Task is alive. + * + * <p>Please see the documentation of {@link ChromeAndroidTask} for details. + */ + @Test + @MediumTest + public void destroyChromeTabbedActivity_destroysExtensionWindowControllerBridge() { + // Arrange. + mFreshCtaTransitTestRule.startOnBlankPage(); + int taskId = mFreshCtaTransitTestRule.getActivity().getTaskId(); + var extensionWindowControllerBridge = getExtensionWindowControllerBridge(taskId); + assertNotNull(extensionWindowControllerBridge); + assertNotEquals(0, extensionWindowControllerBridge.getNativePtrForTesting()); + + // Act. + mFreshCtaTransitTestRule.finishActivity(); + + // Assert. + assertEquals(0, extensionWindowControllerBridge.getNativePtrForTesting()); + } + + private @Nullable ExtensionWindowControllerBridgeImpl getExtensionWindowControllerBridge( + int taskId) { + var chromeAndroidTaskTracker = ChromeAndroidTaskTrackerFactory.getInstance(); + assertNotNull(chromeAndroidTaskTracker); + + var chromeAndroidTask = chromeAndroidTaskTracker.get(taskId); + assertNotNull(chromeAndroidTask); + + List<ChromeAndroidTaskFeature> features = chromeAndroidTask.getAllFeaturesForTesting(); + if (features.isEmpty()) { + return null; + } + + // Note: + // + // As of July 24, 2025, ExtensionWindowControllerBridge is the only + // ChromeAndroidTaskFeature, so if the feature list is not empty, it must contain + // exactly one ExtensionWindowControllerBridge instance. + // + // TODO(crbug.com/434055958): use the new feature lookup API in ChromeAndroidTask to + // retrieve ExtensionWindowControllerBridge. + assertTrue(features.size() == 1); + var chromeAndroidTaskFeature = features.get(0); + if (!(chromeAndroidTaskFeature instanceof ExtensionWindowControllerBridgeImpl)) { + return null; + } + + return (ExtensionWindowControllerBridgeImpl) chromeAndroidTaskFeature; + } +}
diff --git a/chrome/browser/ui/android/extensions/windowing/stub/BUILD.gn b/chrome/browser/ui/android/extensions/windowing/stub/BUILD.gn new file mode 100644 index 0000000..110bfbde --- /dev/null +++ b/chrome/browser/ui/android/extensions/windowing/stub/BUILD.gn
@@ -0,0 +1,20 @@ +# Copyright 2025 The Chromium Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +import("//build/config/android/rules.gni") + +# Stub target to replace +# "//chrome/browser/ui/android/extensions/windowing/internal:java" when the +# "internal" target isn't compiled into the build. +# +# TODO(crbug.com/434123514): see if we can remove this stub target. +android_library("java") { + visibility = [ "//chrome/android:chrome_all_java" ] + sources = [ "java/src/org/chromium/chrome/browser/ui/extensions/windowing/ExtensionWindowControllerBridgeFactory.java" ] + deps = [ + "//build/android:build_java", + "//chrome/browser/ui/android/extensions/windowing:java", + "//chrome/browser/ui/browser_window:java", + ] +}
diff --git a/chrome/browser/ui/android/extensions/windowing/stub/java/src/org/chromium/chrome/browser/ui/extensions/windowing/ExtensionWindowControllerBridgeFactory.java b/chrome/browser/ui/android/extensions/windowing/stub/java/src/org/chromium/chrome/browser/ui/extensions/windowing/ExtensionWindowControllerBridgeFactory.java new file mode 100644 index 0000000..f39940b3 --- /dev/null +++ b/chrome/browser/ui/android/extensions/windowing/stub/java/src/org/chromium/chrome/browser/ui/extensions/windowing/ExtensionWindowControllerBridgeFactory.java
@@ -0,0 +1,24 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.chrome.browser.ui.extensions.windowing; + +import org.chromium.build.annotations.NullMarked; +import org.chromium.build.annotations.Nullable; +import org.chromium.chrome.browser.ui.browser_window.ChromeAndroidTask; + +/** + * Stub factory for when {@link ExtensionWindowControllerBridge} isn't compiled into the build. + * + * <p>TODO(crbug.com/434123514): see if we can remove this stub factory. + */ +@NullMarked +public final class ExtensionWindowControllerBridgeFactory { + private ExtensionWindowControllerBridgeFactory() {} + + @Nullable + public static ExtensionWindowControllerBridge create(ChromeAndroidTask chromeAndroidTask) { + return null; + } +}
diff --git a/chrome/browser/ui/android/extensions/windowing/test/BUILD.gn b/chrome/browser/ui/android/extensions/windowing/test/BUILD.gn index fd60b550..a2275cc6 100644 --- a/chrome/browser/ui/android/extensions/windowing/test/BUILD.gn +++ b/chrome/browser/ui/android/extensions/windowing/test/BUILD.gn
@@ -12,8 +12,8 @@ "//build/android:build_java", "//chrome/browser/ui/android/extensions/windowing/internal:java", "//chrome/browser/ui/browser_window:java", + "//chrome/browser/ui/browser_window/test:junit_test_support", "//third_party/jni_zero:jni_zero_java", - "//third_party/mockito:mockito_java", ] srcjar_deps = [ ":native_unit_test_support_jni" ] }
diff --git a/chrome/browser/ui/android/extensions/windowing/test/java/src/org/chromium/chrome/browser/ui/extensions/windowing/ExtensionWindowControllerBridgeNativeUnitTestSupport.java b/chrome/browser/ui/android/extensions/windowing/test/java/src/org/chromium/chrome/browser/ui/extensions/windowing/ExtensionWindowControllerBridgeNativeUnitTestSupport.java index 2e7e2b3..b866dd3 100644 --- a/chrome/browser/ui/android/extensions/windowing/test/java/src/org/chromium/chrome/browser/ui/extensions/windowing/ExtensionWindowControllerBridgeNativeUnitTestSupport.java +++ b/chrome/browser/ui/android/extensions/windowing/test/java/src/org/chromium/chrome/browser/ui/extensions/windowing/ExtensionWindowControllerBridgeNativeUnitTestSupport.java
@@ -4,12 +4,11 @@ package org.chromium.chrome.browser.ui.extensions.windowing; -import static org.mockito.Mockito.mock; - import org.jni_zero.CalledByNative; import org.chromium.build.annotations.NullMarked; import org.chromium.chrome.browser.ui.browser_window.ChromeAndroidTask; +import org.chromium.chrome.browser.ui.browser_window.ChromeAndroidTaskUnitTestSupport; /** * Supports {@code extension_window_controller_bridge_unittest.cc}. @@ -24,17 +23,31 @@ */ @NullMarked final class ExtensionWindowControllerBridgeNativeUnitTestSupport { + private static final int FAKE_CHROME_ANDROID_TASK_ID = 0; + private final ChromeAndroidTask mChromeAndroidTask; private final ExtensionWindowControllerBridgeImpl mExtensionWindowControllerBridge; @CalledByNative private ExtensionWindowControllerBridgeNativeUnitTestSupport() { - mChromeAndroidTask = mock(ChromeAndroidTask.class); + // Create a real ChromeAndroidTask with mock dependencies so that we can have real + // ChromeAndroidTask internals, such as the native BrowserWindowInterface pointer that + // ExtensionWindowControllerBridge depends on. + mChromeAndroidTask = + ChromeAndroidTaskUnitTestSupport.createChromeAndroidTaskWithMockDeps( + FAKE_CHROME_ANDROID_TASK_ID); + mExtensionWindowControllerBridge = new ExtensionWindowControllerBridgeImpl(mChromeAndroidTask); } @CalledByNative + private void tearDown() { + mExtensionWindowControllerBridge.onTaskRemoved(); + mChromeAndroidTask.destroy(); + } + + @CalledByNative private void invokeOnAddedToTask() { mExtensionWindowControllerBridge.onAddedToTask(); }
diff --git a/chrome/browser/ui/android/fast_checkout/internal/BUILD.gn b/chrome/browser/ui/android/fast_checkout/internal/BUILD.gn index 53f0378a..2e05a6a 100644 --- a/chrome/browser/ui/android/fast_checkout/internal/BUILD.gn +++ b/chrome/browser/ui/android/fast_checkout/internal/BUILD.gn
@@ -142,7 +142,7 @@ "//third_party/androidx:androidx_test_runner_java", "//third_party/hamcrest:hamcrest_java", "//third_party/hamcrest:hamcrest_library_java", - "//third_party/junit:junit", + "//third_party/junit", "//third_party/mockito:mockito_java", "//ui/android:ui_java_test_support", "//ui/android:ui_no_recycler_view_java", @@ -178,7 +178,7 @@ "//third_party/android_deps:espresso_java", "//third_party/androidx:androidx_test_runner_java", "//third_party/hamcrest:hamcrest_java", - "//third_party/junit:junit", + "//third_party/junit", "//third_party/mockito:mockito_java", "//ui/android:ui_full_java", "//ui/android:ui_java_test_support",
diff --git a/chrome/browser/ui/android/hats/test/BUILD.gn b/chrome/browser/ui/android/hats/test/BUILD.gn index efc5720b..fa5b165 100644 --- a/chrome/browser/ui/android/hats/test/BUILD.gn +++ b/chrome/browser/ui/android/hats/test/BUILD.gn
@@ -26,7 +26,7 @@ "//content/public/test/android:content_java_test_support", "//third_party/androidx:androidx_annotation_annotation_java", "//third_party/jni_zero:jni_zero_java", - "//third_party/junit:junit", + "//third_party/junit", ] } @@ -38,7 +38,7 @@ ] deps = [ ":jni_headers", - "//base:base", + "//base", ] }
diff --git a/chrome/browser/ui/android/layouts/test/BUILD.gn b/chrome/browser/ui/android/layouts/test/BUILD.gn index e66d757..eea347c 100644 --- a/chrome/browser/ui/android/layouts/test/BUILD.gn +++ b/chrome/browser/ui/android/layouts/test/BUILD.gn
@@ -15,6 +15,6 @@ "//base:base_java", "//base:base_java_test_support", "//content/public/test/android:content_java_test_support", - "//third_party/junit:junit", + "//third_party/junit", ] }
diff --git a/chrome/browser/ui/android/logo/BUILD.gn b/chrome/browser/ui/android/logo/BUILD.gn index c3e5df8..feb52ed 100644 --- a/chrome/browser/ui/android/logo/BUILD.gn +++ b/chrome/browser/ui/android/logo/BUILD.gn
@@ -95,7 +95,7 @@ "//third_party/androidx:androidx_test_runner_java", "//third_party/gif_player:gif_player_java", "//third_party/jni_zero:jni_zero_java", - "//third_party/junit:junit", + "//third_party/junit", "//third_party/mockito:mockito_java", "//ui/android:ui_java_test_support", "//ui/android:ui_no_recycler_view_java",
diff --git a/chrome/browser/ui/android/multiwindow/java/res/layout/instance_switcher_item_v2.xml b/chrome/browser/ui/android/multiwindow/java/res/layout/instance_switcher_item_v2.xml index ae9bbd9..5b1e7d2 100644 --- a/chrome/browser/ui/android/multiwindow/java/res/layout/instance_switcher_item_v2.xml +++ b/chrome/browser/ui/android/multiwindow/java/res/layout/instance_switcher_item_v2.xml
@@ -30,7 +30,7 @@ android:orientation="horizontal" android:weightSum="8" android:layout_toEndOf="@id/favicon" - android:layout_toStartOf="@id/close_button" + android:layout_toStartOf="@id/more" android:layout_centerVertical="true"> <androidx.constraintlayout.widget.ConstraintLayout @@ -76,15 +76,15 @@ app:leading="@dimen/text_size_medium_leading" /> </LinearLayout> - <ImageView - android:id="@+id/close_button" - android:src="@drawable/material_ic_close_24dp" - android:contentDescription="@string/close" - android:layout_width="24dp" - android:layout_height="24dp" - android:layout_alignParentEnd="true" + <org.chromium.ui.listmenu.ListMenuButton + android:id="@+id/more" + android:src="@drawable/ic_more_vert_24dp" + android:layout_width="@dimen/min_touch_target_size" + android:layout_height="@dimen/min_touch_target_size" android:layout_centerVertical="true" - android:layout_marginEnd="16dp" - android:scaleType="fitCenter" - app:tint="@color/instance_switcher_item_foreground_color_list"/> + android:layout_marginEnd="12dp" + android:layout_alignParentEnd="true" + android:background="?attr/selectableItemBackgroundBorderless" + android:visibility="visible" + app:tint="@color/instance_switcher_item_foreground_color_list" /> </RelativeLayout>
diff --git a/chrome/browser/ui/android/multiwindow/java/src/org/chromium/chrome/browser/multiwindow/InstanceSwitcherCoordinator.java b/chrome/browser/ui/android/multiwindow/java/src/org/chromium/chrome/browser/multiwindow/InstanceSwitcherCoordinator.java index d823835..f92659f 100644 --- a/chrome/browser/ui/android/multiwindow/java/src/org/chromium/chrome/browser/multiwindow/InstanceSwitcherCoordinator.java +++ b/chrome/browser/ui/android/multiwindow/java/src/org/chromium/chrome/browser/multiwindow/InstanceSwitcherCoordinator.java
@@ -413,15 +413,13 @@ buildMoreMenu(builder, item); } } else { + buildMoreMenu(builder, item); String lastAccessedString = isCurrentWindow ? mContext.getString(R.string.instance_last_accessed_current) : TimeTextResolver.resolveTimeAgoText( mContext.getResources(), item.lastAccessedTime); - builder.with(InstanceSwitcherItemProperties.LAST_ACCESSED, lastAccessedString) - .with( - InstanceSwitcherItemProperties.CLOSE_BUTTON_CLICK_LISTENER, - v -> closeWindow(item)); + builder.with(InstanceSwitcherItemProperties.LAST_ACCESSED, lastAccessedString); builder.with(InstanceSwitcherItemProperties.IS_SELECTED, false); } PropertyModel model = builder.build();
diff --git a/chrome/browser/ui/android/multiwindow/java/src/org/chromium/chrome/browser/multiwindow/InstanceSwitcherCoordinatorTest.java b/chrome/browser/ui/android/multiwindow/java/src/org/chromium/chrome/browser/multiwindow/InstanceSwitcherCoordinatorTest.java index 09c48a3..8bb7b6c 100644 --- a/chrome/browser/ui/android/multiwindow/java/src/org/chromium/chrome/browser/multiwindow/InstanceSwitcherCoordinatorTest.java +++ b/chrome/browser/ui/android/multiwindow/java/src/org/chromium/chrome/browser/multiwindow/InstanceSwitcherCoordinatorTest.java
@@ -971,14 +971,16 @@ @Override public void perform(UiController uiController, View view) { - View v = view.findViewById(R.id.close_button); + View v = view.findViewById(R.id.more); v.performClick(); } })); - onView(withText(R.string.close)) - .inRoot(isDialog()) - .check(matches(isDisplayed())) + onView(withText(R.string.instance_switcher_close_window)) + .inRoot(withDecorView(withClassName(containsString("Popup")))) .perform(click()); + onView(withText(R.string.instance_switcher_close_confirm_header)) + .check(matches(isDisplayed())); + onView(withText(R.string.close)).perform(click()); closeCallbackHelper.waitForCallback(closeCallbackCount); }
diff --git a/chrome/browser/ui/android/multiwindow/java/src/org/chromium/chrome/browser/multiwindow/InstanceSwitcherItemProperties.java b/chrome/browser/ui/android/multiwindow/java/src/org/chromium/chrome/browser/multiwindow/InstanceSwitcherItemProperties.java index 58d4727f..7406c097 100644 --- a/chrome/browser/ui/android/multiwindow/java/src/org/chromium/chrome/browser/multiwindow/InstanceSwitcherItemProperties.java +++ b/chrome/browser/ui/android/multiwindow/java/src/org/chromium/chrome/browser/multiwindow/InstanceSwitcherItemProperties.java
@@ -45,9 +45,6 @@ public static final PropertyModel.WritableObjectPropertyKey<String> LAST_ACCESSED = new PropertyModel.WritableObjectPropertyKey<>(); - public static final PropertyModel.WritableObjectPropertyKey<View.OnClickListener> - CLOSE_BUTTON_CLICK_LISTENER = new PropertyModel.WritableObjectPropertyKey<>(); - public static final PropertyModel.WritableBooleanPropertyKey IS_SELECTED = new PropertyModel.WritableBooleanPropertyKey(); @@ -63,7 +60,6 @@ CLICK_LISTENER, MORE_MENU, LAST_ACCESSED, - CLOSE_BUTTON_CLICK_LISTENER, IS_SELECTED }; }
diff --git a/chrome/browser/ui/android/multiwindow/java/src/org/chromium/chrome/browser/multiwindow/InstanceSwitcherItemViewBinder.java b/chrome/browser/ui/android/multiwindow/java/src/org/chromium/chrome/browser/multiwindow/InstanceSwitcherItemViewBinder.java index 70f8111..d856c09a 100644 --- a/chrome/browser/ui/android/multiwindow/java/src/org/chromium/chrome/browser/multiwindow/InstanceSwitcherItemViewBinder.java +++ b/chrome/browser/ui/android/multiwindow/java/src/org/chromium/chrome/browser/multiwindow/InstanceSwitcherItemViewBinder.java
@@ -33,7 +33,7 @@ view.findViewById(R.id.title).setSelected(isSelected); view.findViewById(R.id.desc).setSelected(isSelected); view.findViewById(R.id.last_accessed).setSelected(isSelected); - view.findViewById(R.id.close_button).setSelected(isSelected); + view.findViewById(R.id.more).setSelected(isSelected); // Show check mark if selected, otherwise fallback to favicon. faviconView.setImageDrawable( @@ -90,10 +90,6 @@ TextView lastAccessedView = view.findViewById(R.id.last_accessed); String text = model.get(InstanceSwitcherItemProperties.LAST_ACCESSED); lastAccessedView.setText(text); - } else if (InstanceSwitcherItemProperties.CLOSE_BUTTON_CLICK_LISTENER == propertyKey) { - ImageView closeButton = view.findViewById(R.id.close_button); - closeButton.setOnClickListener( - model.get(InstanceSwitcherItemProperties.CLOSE_BUTTON_CLICK_LISTENER)); } } }
diff --git a/chrome/browser/ui/android/multiwindow/java/src/org/chromium/chrome/browser/multiwindow/TargetSelectorItemViewBinder.java b/chrome/browser/ui/android/multiwindow/java/src/org/chromium/chrome/browser/multiwindow/TargetSelectorItemViewBinder.java index 6fa5b95c..305f797 100644 --- a/chrome/browser/ui/android/multiwindow/java/src/org/chromium/chrome/browser/multiwindow/TargetSelectorItemViewBinder.java +++ b/chrome/browser/ui/android/multiwindow/java/src/org/chromium/chrome/browser/multiwindow/TargetSelectorItemViewBinder.java
@@ -11,6 +11,7 @@ import androidx.core.content.ContextCompat; import org.chromium.build.annotations.NullMarked; +import org.chromium.ui.listmenu.ListMenuButton; import org.chromium.ui.modelutil.PropertyKey; import org.chromium.ui.modelutil.PropertyModel; @@ -28,7 +29,7 @@ view.findViewById(R.id.title).setSelected(isSelected); view.findViewById(R.id.desc).setSelected(isSelected); view.findViewById(R.id.last_accessed).setSelected(isSelected); - view.findViewById(R.id.close_button).setSelected(isSelected); + view.findViewById(R.id.more).setSelected(isSelected); // Show check mark if selected, otherwise fallback to favicon. faviconView.setImageDrawable( @@ -57,8 +58,8 @@ TextView lastAccessedView = view.findViewById(R.id.last_accessed); String text = model.get(TargetSelectorItemProperties.LAST_ACCESSED); lastAccessedView.setText(text); - ImageView closeButton = view.findViewById(R.id.close_button); - closeButton.setVisibility(View.GONE); + ListMenuButton moreButton = view.findViewById(R.id.more); + moreButton.setVisibility(View.GONE); } } }
diff --git a/chrome/browser/ui/android/omnibox/BUILD.gn b/chrome/browser/ui/android/omnibox/BUILD.gn index c2936cc..323c969 100644 --- a/chrome/browser/ui/android/omnibox/BUILD.gn +++ b/chrome/browser/ui/android/omnibox/BUILD.gn
@@ -389,7 +389,7 @@ "//third_party/hamcrest:hamcrest_java", "//third_party/hamcrest:hamcrest_library_java", "//third_party/jni_zero:jni_zero_java", - "//third_party/junit:junit", + "//third_party/junit", "//third_party/mockito:mockito_java", "//ui/android:ui_java_test_support", "//ui/android:ui_no_recycler_view_java",
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/UrlBar.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/UrlBar.java index bce0bcbf..b5e7e7aa 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/UrlBar.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/UrlBar.java
@@ -1267,6 +1267,14 @@ @VisibleForTesting void enforceMaxTextHeight() { if (mUseSmallTextHeight) return; + // Our viewHeight calculation may not be correct if layout is requested, e.g. if our padding + // and height change simultaneously. The padding change will be reflected immediately, but + // the height change requires a layout cycle to be reflected. + if (isLayoutRequested()) { + post(mEnforceMaxTextHeight); + return; + } + int viewHeight = getHeight() - getPaddingTop() - getPaddingBottom(); // Don't touch the text size if the view has not measured and shown yet, or if it's a // subject to custom layout constraints (e.g. CCT) that might result with font size being
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/UrlBarUnitTest.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/UrlBarUnitTest.java index 59e312a..7222a3e 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/UrlBarUnitTest.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/UrlBarUnitTest.java
@@ -987,6 +987,17 @@ } @Test + public void layout_adjustFontSizeLayoutRequested() { + mUrlBar.setLayoutParams(new LayoutParams(123, 123)); + mUrlBar.layout(0, 0, 123, 123); + verify(mUrlBar).post(mUrlBar.mEnforceMaxTextHeight); + + mUrlBar.forceLayout(); + mUrlBar.enforceMaxTextHeight(); + verify(mUrlBar, times(2)).post(mUrlBar.mEnforceMaxTextHeight); + } + + @Test public void layout_fixedFontSizeWithWrappingHeight() { mUrlBar.setLayoutParams(new LayoutParams(123, LayoutParams.WRAP_CONTENT)); mUrlBar.layout(0, 0, 123, 123);
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteController.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteController.java index 696dc0d..82802ad 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteController.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteController.java
@@ -21,6 +21,7 @@ import org.chromium.components.omnibox.AutocompleteMatch; import org.chromium.components.omnibox.AutocompleteResult; import org.chromium.components.omnibox.AutocompleteResult.VerificationPoint; +import org.chromium.components.omnibox.OmniboxFeatures; import org.chromium.content_public.browser.NavigationHandle; import org.chromium.content_public.browser.WebContents; import org.chromium.url.GURL; @@ -120,8 +121,8 @@ url.getSpec(), pageClassification, preventInlineAutocomplete, - false, - false, + OmniboxFeatures.sOmniboxSiteSearch.isEnabled(), + OmniboxFeatures.sOmniboxSiteSearch.isEnabled(), true); }
diff --git a/chrome/browser/ui/android/quickactionsearchwidget/BUILD.gn b/chrome/browser/ui/android/quickactionsearchwidget/BUILD.gn index a956bbc..33f9b759 100644 --- a/chrome/browser/ui/android/quickactionsearchwidget/BUILD.gn +++ b/chrome/browser/ui/android/quickactionsearchwidget/BUILD.gn
@@ -48,7 +48,7 @@ "//third_party/androidx:androidx_test_monitor_java", "//third_party/androidx:androidx_test_runner_java", "//third_party/hamcrest:hamcrest_java", - "//third_party/junit:junit", + "//third_party/junit", "//third_party/mockito:mockito_java", "//url:gurl_java", ]
diff --git a/chrome/browser/ui/android/tab_model/tab_model_list.cc b/chrome/browser/ui/android/tab_model/tab_model_list.cc index 5d75db9..a87470b3 100644 --- a/chrome/browser/ui/android/tab_model/tab_model_list.cc +++ b/chrome/browser/ui/android/tab_model/tab_model_list.cc
@@ -117,7 +117,7 @@ } TabModel* TabModelList::FindNativeTabModelForJavaObject( - const base::android::ScopedJavaLocalRef<jobject>& jtab_model) { + const base::android::JavaRef<jobject>& jtab_model) { JNIEnv* env = base::android::AttachCurrentThread(); for (TabModel* model : models()) { if (env->IsSameObject(jtab_model.obj(), model->GetJavaObject().obj())) {
diff --git a/chrome/browser/ui/android/tab_model/tab_model_list.h b/chrome/browser/ui/android/tab_model/tab_model_list.h index 4f266b9..8485b29 100644 --- a/chrome/browser/ui/android/tab_model/tab_model_list.h +++ b/chrome/browser/ui/android/tab_model/tab_model_list.h
@@ -51,7 +51,7 @@ static TabModel* GetTabModelForTabAndroid(TabAndroid* tab_android); static TabModel* FindTabModelWithId(SessionID desired_id); static TabModel* FindNativeTabModelForJavaObject( - const base::android::ScopedJavaLocalRef<jobject>& jtab_model); + const base::android::JavaRef<jobject>& jtab_model); static bool IsOffTheRecordSessionActive(); static const TabModelVector& models();
diff --git a/chrome/browser/ui/android/toolbar/BUILD.gn b/chrome/browser/ui/android/toolbar/BUILD.gn index 2d7241e..fd471fa 100644 --- a/chrome/browser/ui/android/toolbar/BUILD.gn +++ b/chrome/browser/ui/android/toolbar/BUILD.gn
@@ -155,7 +155,7 @@ "//chrome/browser/fullscreen/android:java", "//chrome/browser/hub:java", "//chrome/browser/incognito:java", - "//chrome/browser/keyboard_accessory/android/java:java", + "//chrome/browser/keyboard_accessory/android/java", "//chrome/browser/language/android:java", "//chrome/browser/ntp_customization:java", "//chrome/browser/paint_preview/android:java",
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/MiniOriginBarController.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/MiniOriginBarController.java index d3df331..567e5bd 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/MiniOriginBarController.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/MiniOriginBarController.java
@@ -410,13 +410,17 @@ return switch (miniOriginEvent) { case MiniOriginEvent.ACCESSORY_SHEET_APPEARED -> MiniOriginState .SHOWING_WITH_ACCESSORY_SHEET; - case MiniOriginEvent.CONTROLS_POSITION_BECAME_TOP, - MiniOriginEvent.FORM_FIELD_LOST_FOCUS -> MiniOriginState.NOT_READY; + case MiniOriginEvent.FORM_FIELD_LOST_FOCUS -> isKeyboardShowing() + ? MiniOriginState.SHOWING + : MiniOriginState.NOT_READY; + case MiniOriginEvent.CONTROLS_POSITION_BECAME_TOP -> MiniOriginState.NOT_READY; case MiniOriginEvent.KEYBOARD_ANIMATION_PREPARED -> MiniOriginState.ANIMATING; case MiniOriginEvent.KEYBOARD_DISAPPEARED -> // Skip our animation if we get a keyboard disappearance event before the // animation prepare signal. - MiniOriginState.READY; + mIsFormFieldFocusedSupplier.getAsBoolean() + ? MiniOriginState.READY + : MiniOriginState.NOT_READY; default -> MiniOriginState.SHOWING; }; } @@ -523,13 +527,20 @@ return; } + mAnimationInProgress = true; mMaxKeyboardHeight = bounds.getUpperBound().bottom; + // In some cases, e.g. a floating keyboard, we get a notification of an inset animation + // even though IME inset bottom will start and end at 0. There is a not a clean way to + // handle this, so we just bail out of the animation early. + if (mMaxKeyboardHeight == 0) { + onEnd(animation); + return; + } // Prevent clipping so that the mini origin bar can draw in bounds allocated for the // keyboard; we will prevent overlap by syncing our translation to its movement in // onProgress. ViewUtils.setAncestorsShouldClipChildren(mContainerView, false, View.NO_ID); ViewUtils.setAncestorsShouldClipToPadding(mContainerView, false, View.NO_ID); - mAnimationInProgress = true; mFinalKeyboardHeight = mKeyboardVisibilityDelegate.isKeyboardShowing(mContext, mContainerView) ? bounds.getUpperBound().bottom
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/MiniOriginBarControllerTest.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/MiniOriginBarControllerTest.java index c7b5ff12..451ceb7 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/MiniOriginBarControllerTest.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/MiniOriginBarControllerTest.java
@@ -180,6 +180,10 @@ mIsFormFieldFocused.onNodeAttributeUpdated(false, false); Assert.assertEquals( + MiniOriginState.SHOWING, mMiniOriginBarController.getCurrentStateForTesting()); + + mKeyboardVisibilityDelegate.setVisibilityForTests(false); + Assert.assertEquals( MiniOriginState.NOT_READY, mMiniOriginBarController.getCurrentStateForTesting()); } @@ -456,6 +460,23 @@ } @Test + public void testAnimateWithKeyboard_animationWithZeroMaxHeight() { + doReturn(ControlsPosition.BOTTOM).when(mBrowserControlsSizer).getControlsPosition(); + mMiniOriginBarController.onControlsPositionChanged(ControlsPosition.BOTTOM); + final MiniOriginWindowInsetsAnimationListener animationListener = + mMiniOriginBarController.getAnimationListenerForTesting(); + + final BoundsCompat bounds = new BoundsCompat(Insets.NONE, Insets.of(0, 0, 0, 0)); + + mIsFormFieldFocused.onNodeAttributeUpdated(true, false); + + animationListener.onPrepare(mImeAnimation); + animationListener.onStart(mImeAnimation, bounds); + Assert.assertEquals( + MiniOriginState.READY, mMiniOriginBarController.getCurrentStateForTesting()); + } + + @Test public void testAnimateWithKeyboard_animationFinishesInStartingState() { // Predictive back gestures can cause an IME hide animation to run but finish with the IME // still showing if the gesture is cancelled.
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/adaptive/AdaptiveButtonActionMenuCoordinator.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/adaptive/AdaptiveButtonActionMenuCoordinator.java index e83a507..eac0506 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/adaptive/AdaptiveButtonActionMenuCoordinator.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/adaptive/AdaptiveButtonActionMenuCoordinator.java
@@ -142,4 +142,8 @@ public View getContentViewForTesting() { return assumeNonNull(mListMenu).getContentView(); } + + public @Nullable BasicListMenu getListMenuForTesting() { + return mListMenu; + } }
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/adaptive/AdaptiveButtonActionMenuCoordinatorTest.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/adaptive/AdaptiveButtonActionMenuCoordinatorTest.java index f784cc2..a47809f 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/adaptive/AdaptiveButtonActionMenuCoordinatorTest.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/adaptive/AdaptiveButtonActionMenuCoordinatorTest.java
@@ -10,8 +10,6 @@ import static org.mockito.Mockito.verify; import android.view.View; -import android.view.ViewGroup; -import android.widget.ListView; import androidx.test.core.app.ApplicationProvider; import androidx.test.filters.SmallTest; @@ -68,9 +66,7 @@ listener.onLongClick(menuView); - ViewGroup menuContent = (ViewGroup) coordinator.getContentViewForTesting(); - ListView menuListView = menuContent.findViewById(R.id.app_menu_list); - menuListView.performItemClick(null, 0, menuListView.getAdapter().getItemId(0)); + coordinator.getListMenuForTesting().clickItemForTesting(0); verify(menuView).showMenu(); verify(mCallback).onResult(R.id.customize_adaptive_button_menu_id);
diff --git a/chrome/browser/ui/android/web_app_header/BUILD.gn b/chrome/browser/ui/android/web_app_header/BUILD.gn index 900775ab..59394333 100644 --- a/chrome/browser/ui/android/web_app_header/BUILD.gn +++ b/chrome/browser/ui/android/web_app_header/BUILD.gn
@@ -81,7 +81,7 @@ "//third_party/androidx:androidx_test_core_java", "//third_party/androidx:androidx_test_ext_junit_java", "//third_party/blink/public/mojom:mojom_platform_java", - "//third_party/junit:junit", + "//third_party/junit", "//third_party/mockito:mockito_java", "//ui/android:ui_java_test_support", "//ui/android:ui_no_recycler_view_java",
diff --git a/chrome/browser/ui/android/whats_new/BUILD.gn b/chrome/browser/ui/android/whats_new/BUILD.gn index c286d54..7d91e92 100644 --- a/chrome/browser/ui/android/whats_new/BUILD.gn +++ b/chrome/browser/ui/android/whats_new/BUILD.gn
@@ -85,7 +85,7 @@ "//third_party/androidx:androidx_test_core_java", "//third_party/androidx:androidx_test_ext_junit_java", "//third_party/androidx:androidx_test_runner_java", - "//third_party/junit:junit", + "//third_party/junit", "//third_party/mockito:mockito_java", "//ui/android:ui_java", "//ui/android:ui_java_test_support",
diff --git a/chrome/browser/ui/ash/app_list/BUILD.gn b/chrome/browser/ui/ash/app_list/BUILD.gn index 547a41e..07e4722 100644 --- a/chrome/browser/ui/ash/app_list/BUILD.gn +++ b/chrome/browser/ui/ash/app_list/BUILD.gn
@@ -27,7 +27,7 @@ "//ash/webui/os_feedback_ui:url_constants", "//ash/webui/shortcut_customization_ui:url_constants", "//base", - "//chrome/browser/apps/app_service:app_service", + "//chrome/browser/apps/app_service", "//chrome/browser/ash/app_list/search", "//chrome/browser/ash/app_list/search/test:browser_test_support", "//chrome/browser/ash/app_list/search/test:test_support",
diff --git a/chrome/browser/ui/ash/editor_menu/BUILD.gn b/chrome/browser/ui/ash/editor_menu/BUILD.gn index 8fbe661..9735599 100644 --- a/chrome/browser/ui/ash/editor_menu/BUILD.gn +++ b/chrome/browser/ui/ash/editor_menu/BUILD.gn
@@ -57,16 +57,16 @@ "//chrome/browser/ui/ash/read_write_cards", "//chromeos/ash/components/editor_menu/public/cpp", "//chromeos/components/magic_boost/public/cpp", - "//chromeos/constants:constants", + "//chromeos/constants", "//chromeos/crosapi/mojom", - "//content/public/browser:browser", + "//content/public/browser", "//ui/gfx", "//ui/views", ] if (is_chrome_branded) { deps += [ - "//chromeos/ash/resources/internal/strings:strings", + "//chromeos/ash/resources/internal/strings", "//chromeos/ash/resources/internal/strings:strings_grit", ] } @@ -94,7 +94,7 @@ "//base", "//build:branding_buildflags", "//chromeos/ash/components/editor_menu/public/cpp", - "//chromeos/constants:constants", + "//chromeos/constants", "//chromeos/strings:strings_grit", "//chromeos/ui/vector_icons", "//components/application_locale_storage", @@ -108,7 +108,7 @@ if (is_chrome_branded) { deps += [ - "//chromeos/ash/resources/internal/strings:strings", + "//chromeos/ash/resources/internal/strings", "//chromeos/ash/resources/internal/strings:strings_grit", ] }
diff --git a/chrome/browser/ui/ash/graduation/BUILD.gn b/chrome/browser/ui/ash/graduation/BUILD.gn index f017f29f..42ee1bd 100644 --- a/chrome/browser/ui/ash/graduation/BUILD.gn +++ b/chrome/browser/ui/ash/graduation/BUILD.gn
@@ -15,7 +15,7 @@ deps = [ "//ash", "//ash/constants", - "//ash/public/cpp:cpp", + "//ash/public/cpp", "//ash/webui/system_apps/public:system_web_app_type", "//base", "//chrome/browser/ash/browser_delegate",
diff --git a/chrome/browser/ui/ash/holding_space/BUILD.gn b/chrome/browser/ui/ash/holding_space/BUILD.gn index 4aecffa6..9835bf52 100644 --- a/chrome/browser/ui/ash/holding_space/BUILD.gn +++ b/chrome/browser/ui/ash/holding_space/BUILD.gn
@@ -151,7 +151,7 @@ "//chrome/test:test_support_ui", "//chrome/test/base/ash/util:test_support", "//chromeos/ash/components/browser_context_helper", - "//chromeos/dbus/power:power", + "//chromeos/dbus/power", "//content/test:test_support", "//ui/aura", "//ui/base",
diff --git a/chrome/browser/ui/ash/magic_boost/BUILD.gn b/chrome/browser/ui/ash/magic_boost/BUILD.gn index 39424dd1..eb0f1db9 100644 --- a/chrome/browser/ui/ash/magic_boost/BUILD.gn +++ b/chrome/browser/ui/ash/magic_boost/BUILD.gn
@@ -23,7 +23,7 @@ "//chrome/browser/resources:component_extension_resources", "//chrome/browser/ui/ash/editor_menu:utils", "//chrome/browser/ui/ash/read_write_cards", - "//chromeos/components/magic_boost/public/cpp:cpp", + "//chromeos/components/magic_boost/public/cpp", "//chromeos/components/mahi/public/cpp", "//chromeos/crosapi/mojom", "//chromeos/strings:strings_grit",
diff --git a/chrome/browser/ui/ash/main_extra_parts/BUILD.gn b/chrome/browser/ui/ash/main_extra_parts/BUILD.gn index 8b9c75d1..9cab9c2 100644 --- a/chrome/browser/ui/ash/main_extra_parts/BUILD.gn +++ b/chrome/browser/ui/ash/main_extra_parts/BUILD.gn
@@ -29,7 +29,7 @@ "//chrome/browser:browser_public_dependencies", "//chrome/browser:global_features", "//chrome/browser/ash/app_list", - "//chrome/browser/ash/app_restore:app_restore", + "//chrome/browser/ash/app_restore", "//chrome/browser/ash/boca", "//chrome/browser/ash/geolocation", "//chrome/browser/ash/growth", @@ -73,13 +73,13 @@ "//chrome/browser/ui/ash/shell_delegate", "//chrome/browser/ui/ash/shell_init", "//chrome/browser/ui/ash/system", - "//chrome/browser/ui/ash/system_web_apps:system_web_apps", + "//chrome/browser/ui/ash/system_web_apps", "//chrome/browser/ui/ash/wallpaper", "//chrome/browser/ui/ash/web_view", "//chrome/browser/ui/ash/wm", "//chrome/browser/ui/chromeos/screen_orientation", "//chrome/browser/ui/views/select_file_dialog_extension", - "//chrome/browser/ui/webui/ash/settings:settings", + "//chrome/browser/ui/webui/ash/settings", "//chromeos/ash/components/boca", "//chromeos/ash/components/browser_context_helper", "//chromeos/ash/components/dbus",
diff --git a/chrome/browser/ui/ash/network/BUILD.gn b/chrome/browser/ui/ash/network/BUILD.gn index f136459..ab1e653 100644 --- a/chrome/browser/ui/ash/network/BUILD.gn +++ b/chrome/browser/ui/ash/network/BUILD.gn
@@ -39,7 +39,7 @@ "//chrome/browser/ui:browser_navigator_params_headers", "//chrome/browser/ui/ash/system", "//chrome/browser/ui/webui/ash/cellular_setup", - "//chrome/browser/ui/webui/ash/floating_workspace:floating_workspace", + "//chrome/browser/ui/webui/ash/floating_workspace", "//chrome/common", "//chromeos/ash/components/carrier_lock", "//chromeos/ash/components/dbus/hermes", @@ -54,7 +54,7 @@ "//components/account_id", "//components/captive_portal/core", "//components/policy/core/common", - "//components/proxy_config:proxy_config", + "//components/proxy_config", "//components/session_manager/core", "//components/strings:components_strings_grit", "//extensions/browser", @@ -90,7 +90,7 @@ "//chrome/browser/ash/login/users:test_support", "//chrome/browser/ash/profiles", "//chrome/browser/prefs", - "//chrome/browser/ui/webui/ash/floating_workspace:floating_workspace", + "//chrome/browser/ui/webui/ash/floating_workspace", "//chrome/test:test_support", "//chromeos/ash/components/carrier_lock", "//chromeos/ash/components/dbus/hermes",
diff --git a/chrome/browser/ui/ash/quick_answers/BUILD.gn b/chrome/browser/ui/ash/quick_answers/BUILD.gn index 760f367..1439ad71 100644 --- a/chrome/browser/ui/ash/quick_answers/BUILD.gn +++ b/chrome/browser/ui/ash/quick_answers/BUILD.gn
@@ -40,7 +40,7 @@ deps = [ "//ash", - "//chrome/browser/ash/magic_boost:magic_boost", + "//chrome/browser/ash/magic_boost", "//chrome/browser/profiles:profile", "//chrome/browser/ui/ash/editor_menu:utils", "//chrome/browser/ui/ash/quick_answers/ui:loading_view", @@ -56,7 +56,7 @@ "//chromeos/components/quick_answers/public/cpp", "//chromeos/components/quick_answers/public/cpp:constants", "//chromeos/components/quick_answers/public/cpp:prefs", - "//chromeos/constants:constants", + "//chromeos/constants", "//chromeos/strings:strings_grit", "//chromeos/ui/vector_icons", "//components/account_id",
diff --git a/chrome/browser/ui/ash/quick_insert/BUILD.gn b/chrome/browser/ui/ash/quick_insert/BUILD.gn index e86e89b5..a68a010b 100644 --- a/chrome/browser/ui/ash/quick_insert/BUILD.gn +++ b/chrome/browser/ui/ash/quick_insert/BUILD.gn
@@ -34,7 +34,7 @@ "//chrome/browser/ash/input_method", "//chrome/browser/ash/lobster", "//chrome/browser/ash/login/session", - "//chrome/browser/favicon:favicon", + "//chrome/browser/favicon", "//chrome/browser/profiles:profile", "//chrome/browser/ui/ash/thumbnail_loader", "//chrome/common", @@ -42,7 +42,7 @@ "//chromeos/ash/components/drivefs/mojom", "//chromeos/ash/components/editor_menu/public/cpp", "//chromeos/constants", - "//components/favicon/core:core", + "//components/favicon/core", "//components/optimization_guide/core", "//components/user_manager", "//content/public/browser",
diff --git a/chrome/browser/ui/ash/read_write_cards/BUILD.gn b/chrome/browser/ui/ash/read_write_cards/BUILD.gn index 8137a0f..d991379f 100644 --- a/chrome/browser/ui/ash/read_write_cards/BUILD.gn +++ b/chrome/browser/ui/ash/read_write_cards/BUILD.gn
@@ -38,12 +38,12 @@ "//chrome/browser/ui/ash/magic_boost", "//chrome/browser/ui/ash/quick_answers", "//chrome/browser/ui/views/mahi", - "//chromeos/ash/components/editor_menu/public/cpp:cpp", - "//chromeos/components/magic_boost/public/cpp:cpp", + "//chromeos/ash/components/editor_menu/public/cpp", + "//chromeos/components/magic_boost/public/cpp", "//chromeos/components/quick_answers", - "//chromeos/components/quick_answers/public/cpp:cpp", + "//chromeos/components/quick_answers/public/cpp", "//chromeos/components/quick_answers/public/cpp:prefs", - "//chromeos/constants:constants", + "//chromeos/constants", "//chromeos/crosapi/mojom", "//content/public/browser", ] @@ -74,7 +74,7 @@ "//chrome/common:non_code_constants", "//chrome/test:test_support", "//chrome/test:test_support_unit", - "//chromeos/ash/components/editor_menu/public/cpp:cpp", + "//chromeos/ash/components/editor_menu/public/cpp", "//chromeos/ash/components/login/login_state", "//chromeos/components/magic_boost/public/cpp", "//chromeos/components/quick_answers/public/cpp",
diff --git a/chrome/browser/ui/ash/web_view/BUILD.gn b/chrome/browser/ui/ash/web_view/BUILD.gn index aa564405..46ba6d2 100644 --- a/chrome/browser/ui/ash/web_view/BUILD.gn +++ b/chrome/browser/ui/ash/web_view/BUILD.gn
@@ -19,7 +19,7 @@ "//base", "//chrome/browser/media/webrtc", "//chrome/browser/profiles:profile", - "//chrome/browser/ui/ash/new_window:new_window", + "//chrome/browser/ui/ash/new_window", "//content/public/browser", "//ui/aura", "//ui/base",
diff --git a/chrome/browser/ui/autofill/BUILD.gn b/chrome/browser/ui/autofill/BUILD.gn index 82d5a75..e4bbfdc 100644 --- a/chrome/browser/ui/autofill/BUILD.gn +++ b/chrome/browser/ui/autofill/BUILD.gn
@@ -36,7 +36,7 @@ "//chrome/browser/profiles:profile", "//chrome/browser/ui/autofill/payments", "//chrome/browser/ui/page_action:icon_type", - "//components/application_locale_storage:application_locale_storage", + "//components/application_locale_storage", "//components/autofill/content/browser", "//components/autofill/core/browser", "//components/autofill/core/common", @@ -201,7 +201,7 @@ "//chrome/browser/promos:utils", "//chrome/browser/ui/browser_window", "//chrome/browser/ui/promos:utils", - "//chrome/browser/ui/toasts:toasts", + "//chrome/browser/ui/toasts", "//chrome/browser/ui/toasts/api:toasts", "//chrome/browser/ui/user_education", "//chrome/browser/ui/webauthn", @@ -360,7 +360,7 @@ "//chrome/browser/sync:factories", "//chrome/browser/ui", "//chrome/browser/ui:ui_features", - "//chrome/browser/ui/browser_window:browser_window", + "//chrome/browser/ui/browser_window", "//chrome/browser/ui/user_education", "//chrome/common:constants", "//chrome/test:test_support",
diff --git a/chrome/browser/ui/autofill/payments/BUILD.gn b/chrome/browser/ui/autofill/payments/BUILD.gn index d6e8e13..0fbdf1d 100644 --- a/chrome/browser/ui/autofill/payments/BUILD.gn +++ b/chrome/browser/ui/autofill/payments/BUILD.gn
@@ -145,7 +145,7 @@ "//chrome/browser/ui/browser_window", "//chrome/browser/ui/promos:utils", "//chrome/browser/ui/tabs:tab_strip", - "//chrome/browser/ui/views/page_action:page_action", + "//chrome/browser/ui/views/page_action", "//chrome/common", "//components/autofill/core/common:credit_card_number_validation", "//components/commerce/core:feature_list",
diff --git a/chrome/browser/ui/blocked_content/BUILD.gn b/chrome/browser/ui/blocked_content/BUILD.gn index b26ca014..527752a 100644 --- a/chrome/browser/ui/blocked_content/BUILD.gn +++ b/chrome/browser/ui/blocked_content/BUILD.gn
@@ -88,7 +88,7 @@ ":blocked_content", "//chrome/browser/content_settings:content_settings_factory", "//chrome/test:test_support", - "//components/back_forward_cache:back_forward_cache", + "//components/back_forward_cache", "//components/content_settings/browser", ] if (use_ozone) { @@ -105,13 +105,13 @@ deps = [ ":blocked_content", "//chrome/browser/content_settings:content_settings_factory", - "//chrome/browser/search_engines:search_engines", + "//chrome/browser/search_engines", "//chrome/browser/web_applications:web_applications_test_support", "//chrome/test:test_support", - "//components/back_forward_cache:back_forward_cache", + "//components/back_forward_cache", "//components/content_settings/browser", - "//components/embedder_support:embedder_support", - "//components/javascript_dialogs:javascript_dialogs", + "//components/embedder_support", + "//components/javascript_dialogs", ] } }
diff --git a/chrome/browser/ui/bookmarks/BUILD.gn b/chrome/browser/ui/bookmarks/BUILD.gn index bc5b52d..f2d6be38 100644 --- a/chrome/browser/ui/bookmarks/BUILD.gn +++ b/chrome/browser/ui/bookmarks/BUILD.gn
@@ -68,7 +68,7 @@ "//chrome/browser/search", "//chrome/browser/ui:browser_navigator_params_headers", "//chrome/browser/ui:ui_features", - "//chrome/browser/ui/browser_window:browser_window", + "//chrome/browser/ui/browser_window", "//chrome/browser/ui/tabs:tab_group", "//chrome/browser/ui/tabs:tab_strip", "//components/bookmarks/common", @@ -102,7 +102,7 @@ "//chrome/browser/profiles:profile", "//chrome/browser/ui", "//chrome/browser/ui:browser_list", - "//chrome/browser/ui/browser_window:browser_window", + "//chrome/browser/ui/browser_window", "//chrome/browser/ui/tabs:tab_strip", "//chrome/common", "//chrome/test:test_support_ui", @@ -141,7 +141,7 @@ "//chrome/browser", "//chrome/browser/profiles:profile", "//chrome/browser/ui:ui_features", - "//chrome/browser/ui/browser_window:browser_window", + "//chrome/browser/ui/browser_window", "//chrome/common", "//chrome/test:test_support", "//components/bookmarks/browser",
diff --git a/chrome/browser/ui/browser_element_identifiers.cc b/chrome/browser/ui/browser_element_identifiers.cc index 99e54d3b..2b89aff1 100644 --- a/chrome/browser/ui/browser_element_identifiers.cc +++ b/chrome/browser/ui/browser_element_identifiers.cc
@@ -89,6 +89,7 @@ DEFINE_ELEMENT_IDENTIFIER_VALUE(kSavedTabGroupButtonElementId); DEFINE_ELEMENT_IDENTIFIER_VALUE(kSavedTabGroupOverflowButtonElementId); DEFINE_ELEMENT_IDENTIFIER_VALUE(kSavedTabGroupOverflowMenuId); +DEFINE_ELEMENT_IDENTIFIER_VALUE(kSharedTabGroupCommentsActionElementId); DEFINE_ELEMENT_IDENTIFIER_VALUE(kSharedTabGroupFeedbackElementId); DEFINE_ELEMENT_IDENTIFIER_VALUE(kCollaborationMessagingPageActionIconElementId); DEFINE_ELEMENT_IDENTIFIER_VALUE(kSearchEngineChoiceDialogId);
diff --git a/chrome/browser/ui/browser_element_identifiers.h b/chrome/browser/ui/browser_element_identifiers.h index 6efcf117..2883393 100644 --- a/chrome/browser/ui/browser_element_identifiers.h +++ b/chrome/browser/ui/browser_element_identifiers.h
@@ -99,6 +99,7 @@ DECLARE_ELEMENT_IDENTIFIER_VALUE(kSavedTabGroupButtonElementId); DECLARE_ELEMENT_IDENTIFIER_VALUE(kSavedTabGroupOverflowButtonElementId); DECLARE_ELEMENT_IDENTIFIER_VALUE(kSavedTabGroupOverflowMenuId); +DECLARE_ELEMENT_IDENTIFIER_VALUE(kSharedTabGroupCommentsActionElementId); DECLARE_ELEMENT_IDENTIFIER_VALUE(kSharedTabGroupFeedbackElementId); DECLARE_ELEMENT_IDENTIFIER_VALUE( kCollaborationMessagingPageActionIconElementId);
diff --git a/chrome/browser/ui/browser_window/BUILD.gn b/chrome/browser/ui/browser_window/BUILD.gn index c387a95..8623781 100644 --- a/chrome/browser/ui/browser_window/BUILD.gn +++ b/chrome/browser/ui/browser_window/BUILD.gn
@@ -4,7 +4,7 @@ import("//chrome/common/features.gni") -assert(is_win || is_mac || is_linux || is_chromeos || is_desktop_android) +assert(is_win || is_mac || is_linux || is_chromeos || is_android) # This is the public interface for a browser window. Most features in # //chrome/browser depend on this interface, and thus to prevent circular
diff --git a/chrome/browser/ui/browser_window/internal/BUILD.gn b/chrome/browser/ui/browser_window/internal/BUILD.gn index d763b69..91f20458 100644 --- a/chrome/browser/ui/browser_window/internal/BUILD.gn +++ b/chrome/browser/ui/browser_window/internal/BUILD.gn
@@ -33,14 +33,14 @@ deps += [ "//chrome/browser/actor/ui", "//chrome/browser/extensions", - "//chrome/browser/lens/region_search:region_search", + "//chrome/browser/lens/region_search", "//chrome/browser/media/router:media_router_feature", "//chrome/browser/ui:ui_features", - "//chrome/browser/ui/bookmarks:bookmarks", + "//chrome/browser/ui/bookmarks", "//chrome/browser/ui/commerce", "//chrome/browser/ui/exclusive_access", "//chrome/browser/ui/extensions", - "//chrome/browser/ui/find_bar:find_bar", + "//chrome/browser/ui/find_bar", "//chrome/browser/ui/lens", "//chrome/browser/ui/performance_controls", "//chrome/browser/ui/signin", @@ -55,9 +55,9 @@ "//chrome/browser/ui/views/toolbar", "//chrome/browser/ui/web_applications", "//components/breadcrumbs/core:status", - "//components/collaboration/public:public", + "//components/collaboration/public", "//components/commerce/core:feature_list", - "//components/data_sharing/public:public", + "//components/data_sharing/public", "//components/lens:features", "//components/profile_metrics", "//components/saved_tab_groups/public", @@ -116,6 +116,7 @@ visibility = [ ":*", "//chrome/android:chrome_all_java", + "//chrome/browser/ui/android/extensions/windowing/internal:javatests", "//chrome/browser/ui/browser_window/test:junit_test_support", "//chrome/browser/ui/browser_window/test:native_unit_test_support_java", ] @@ -160,4 +161,19 @@ "//ui/android:ui_no_recycler_view_java", ] } + + android_library("javatests") { + testonly = true + sources = [ "android/java/src/org/chromium/chrome/browser/ui/browser_window/ChromeAndroidTaskIntegrationTest.java" ] + deps = [ + ":java", + "//base:base_java_test_support", + "//chrome/android:chrome_java", + "//chrome/browser/flags:java", + "//chrome/browser/ui/browser_window:java", + "//chrome/test/android:chrome_java_transit", + "//third_party/androidx:androidx_test_runner_java", + "//third_party/junit", + ] + } }
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 index fc99976..612c260 100644 --- 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
@@ -107,6 +107,12 @@ } @Override + public long getOrCreateNativeBrowserWindowPtr() { + assertAlive(); + return mAndroidBrowserWindow.getOrCreateNativePtr(); + } + + @Override public void destroy() { // Immediately change the state to "DESTROYING" to block access to public methods that // should only be called when the state is "ALIVE". @@ -144,12 +150,8 @@ return getActivityWindowAndroidInternal(/* assertAlive= */ false); } - AndroidBrowserWindow getAndroidBrowserWindowForTesting() { - return mAndroidBrowserWindow; - } - - /** Returns all {@link ChromeAndroidTaskFeature}s for testing. */ - List<ChromeAndroidTaskFeature> getAllFeaturesForTesting() { + @Override + public List<ChromeAndroidTaskFeature> getAllFeaturesForTesting() { synchronized (mFeaturesLock) { return mFeatures; }
diff --git a/chrome/browser/ui/browser_window/internal/android/java/src/org/chromium/chrome/browser/ui/browser_window/ChromeAndroidTaskImplUnitTest.java b/chrome/browser/ui/browser_window/internal/android/java/src/org/chromium/chrome/browser/ui/browser_window/ChromeAndroidTaskImplUnitTest.java index cdca4f1..91d8913e 100644 --- a/chrome/browser/ui/browser_window/internal/android/java/src/org/chromium/chrome/browser/ui/browser_window/ChromeAndroidTaskImplUnitTest.java +++ b/chrome/browser/ui/browser_window/internal/android/java/src/org/chromium/chrome/browser/ui/browser_window/ChromeAndroidTaskImplUnitTest.java
@@ -190,6 +190,29 @@ } @Test + public void getOrCreateNativeBrowserWindowPtr_returnsPtrValue() { + // Arrange. + var chromeAndroidTask = createChromeAndroidTask(); + + // Act. + long nativeBrowserWindowPtr = chromeAndroidTask.getOrCreateNativeBrowserWindowPtr(); + + // Assert. + assertEquals(FAKE_NATIVE_ANDROID_BROWSER_WINDOW_PTR, nativeBrowserWindowPtr); + } + + @Test + public void getOrCreateNativeBrowserWindowPtr_calledAfterTaskDestroyed_throwsException() { + // Arrange. + var chromeAndroidTask = createChromeAndroidTask(); + chromeAndroidTask.destroy(); + + // Act & Assert. + assertThrows( + AssertionError.class, () -> chromeAndroidTask.getOrCreateNativeBrowserWindowPtr()); + } + + @Test public void destroy_clearsActivityWindowAndroid() { // Arrange. var chromeAndroidTask = createChromeAndroidTask(); @@ -223,9 +246,7 @@ public void destroy_destroysAndroidBrowserWindow() { // Arrange: create a ChromeAndroidTask and a fake native AndroidBrowserWindow pointer value. var chromeAndroidTask = createChromeAndroidTask(); - long nativeAndroidBrowserWindowPtr = - chromeAndroidTask.getAndroidBrowserWindowForTesting().getOrCreateNativePtr(); - assertEquals(FAKE_NATIVE_ANDROID_BROWSER_WINDOW_PTR, nativeAndroidBrowserWindowPtr); + long nativeAndroidBrowserWindowPtr = chromeAndroidTask.getOrCreateNativeBrowserWindowPtr(); // Act. chromeAndroidTask.destroy();
diff --git a/chrome/browser/ui/browser_window/internal/android/java/src/org/chromium/chrome/browser/ui/browser_window/ChromeAndroidTaskIntegrationTest.java b/chrome/browser/ui/browser_window/internal/android/java/src/org/chromium/chrome/browser/ui/browser_window/ChromeAndroidTaskIntegrationTest.java new file mode 100644 index 0000000..fc0cb35 --- /dev/null +++ b/chrome/browser/ui/browser_window/internal/android/java/src/org/chromium/chrome/browser/ui/browser_window/ChromeAndroidTaskIntegrationTest.java
@@ -0,0 +1,79 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.chrome.browser.ui.browser_window; + +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; + +import androidx.test.filters.MediumTest; + +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; + +import org.chromium.base.test.BaseJUnit4ClassRunner; +import org.chromium.base.test.util.Batch; +import org.chromium.base.test.util.CommandLineFlags; +import org.chromium.build.annotations.NullMarked; +import org.chromium.build.annotations.Nullable; +import org.chromium.chrome.browser.flags.ChromeSwitches; +import org.chromium.chrome.test.transit.ChromeTransitTestRules; +import org.chromium.chrome.test.transit.FreshCtaTransitTestRule; + +@RunWith(BaseJUnit4ClassRunner.class) +@CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE}) +@Batch(value = Batch.PER_CLASS) +@NullMarked +public class ChromeAndroidTaskIntegrationTest { + + @Rule + public FreshCtaTransitTestRule mFreshCtaTransitTestRule = + ChromeTransitTestRules.freshChromeTabbedActivityRule(); + + @Test + @MediumTest + public void startChromeTabbedActivity_createsChromeAndroidTask() { + // Arrange & Act. + mFreshCtaTransitTestRule.startOnBlankPage(); + int taskId = mFreshCtaTransitTestRule.getActivity().getTaskId(); + + // Assert. + var chromeAndroidTask = getChromeAndroidTask(taskId); + assertNotNull(chromeAndroidTask); + } + + /** + * Verifies that a {@link ChromeAndroidTask} is destroyed with its {@code Activity}. + * + * <p>This is the right behavior when {@link ChromeAndroidTask} tracks an {@code Activity}, + * which is a workaround to track a Task (window). + * + * <p>If {@link ChromeAndroidTask} tracks a Task, it should continue to exist as long as the + * Task is alive. + * + * <p>Please see the documentation of {@link ChromeAndroidTask} for details. + */ + @Test + @MediumTest + public void destroyChromeTabbedActivity_destroysChromeAndroidTask() { + // Arrange. + mFreshCtaTransitTestRule.startOnBlankPage(); + int taskId = mFreshCtaTransitTestRule.getActivity().getTaskId(); + + // Act. + mFreshCtaTransitTestRule.finishActivity(); + + // Assert. + var chromeAndroidTask = getChromeAndroidTask(taskId); + assertNull(chromeAndroidTask); + } + + private @Nullable ChromeAndroidTask getChromeAndroidTask(int taskId) { + var chromeAndroidTaskTracker = ChromeAndroidTaskTrackerFactory.getInstance(); + assertNotNull(chromeAndroidTaskTracker); + + return chromeAndroidTaskTracker.get(taskId); + } +}
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 index bda23f04..f79567a8 100644 --- 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
@@ -16,9 +16,8 @@ /** * Obtains the singleton instance of {@link ChromeAndroidTaskTracker}. * - * <p>Note: this class is compiled using the {@code android_library_factory} GN template, so - * this method will return null if {@link ChromeAndroidTaskTrackerImpl} isn't compiled into the - * build. + * <p>We mark the return value as nullable to be consistent with the stub factory in + * //chrome/browser/ui/browser_window/stub. */ @Nullable public static ChromeAndroidTaskTracker getInstance() {
diff --git a/chrome/browser/ui/browser_window/internal/browser_window_features.cc b/chrome/browser/ui/browser_window/internal/browser_window_features.cc index d15896d..d69bb9d 100644 --- a/chrome/browser/ui/browser_window/internal/browser_window_features.cc +++ b/chrome/browser/ui/browser_window/internal/browser_window_features.cc
@@ -461,7 +461,7 @@ if (CommentsSidePanelCoordinator::IsSupported()) { comments_side_panel_coordinator_ = - std::make_unique<CommentsSidePanelCoordinator>(); + std::make_unique<CommentsSidePanelCoordinator>(browser_view); } side_panel_coordinator_->Init(browser_view->browser());
diff --git a/chrome/browser/ui/browser_window/public/android/java/src/org/chromium/chrome/browser/ui/browser_window/ChromeAndroidTask.java b/chrome/browser/ui/browser_window/public/android/java/src/org/chromium/chrome/browser/ui/browser_window/ChromeAndroidTask.java index ac0ab30..d17f9bc 100644 --- a/chrome/browser/ui/browser_window/public/android/java/src/org/chromium/chrome/browser/ui/browser_window/ChromeAndroidTask.java +++ b/chrome/browser/ui/browser_window/public/android/java/src/org/chromium/chrome/browser/ui/browser_window/ChromeAndroidTask.java
@@ -8,6 +8,8 @@ import org.chromium.build.annotations.Nullable; import org.chromium.ui.base.ActivityWindowAndroid; +import java.util.List; + /** * Represents an Android window containing Chrome. * @@ -88,6 +90,14 @@ void addFeature(ChromeAndroidTaskFeature feature); /** + * Returns the address of the native {@code BrowserWindowInterface}. + * + * <p>If the native object hasn't been created, this method will create it before returning its + * address. + */ + long getOrCreateNativeBrowserWindowPtr(); + + /** * Destroys all objects owned by this {@link ChromeAndroidTask}, including all {@link * ChromeAndroidTaskFeature}s. * @@ -97,4 +107,7 @@ /** Returns whether this {@link ChromeAndroidTask} has been destroyed. */ boolean isDestroyed(); + + /** Returns all {@link ChromeAndroidTaskFeature}s for testing. */ + List<ChromeAndroidTaskFeature> getAllFeaturesForTesting(); }
diff --git a/chrome/browser/ui/browser_window/stub/BUILD.gn b/chrome/browser/ui/browser_window/stub/BUILD.gn new file mode 100644 index 0000000..d5ceb2b --- /dev/null +++ b/chrome/browser/ui/browser_window/stub/BUILD.gn
@@ -0,0 +1,21 @@ +# Copyright 2025 The Chromium Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +if (is_android) { + import("//build/config/android/rules.gni") + + # Stub target to replace + # "//chrome/browser/ui/browser_window/internal:java" when the + # "internal" target isn't compiled into the build. + # + # TODO(crbug.com/434123514): see if we can remove this stub target. + android_library("java") { + visibility = [ "//chrome/android:chrome_all_java" ] + sources = [ "android/java/src/org/chromium/chrome/browser/ui/browser_window/ChromeAndroidTaskTrackerFactory.java" ] + deps = [ + "//build/android:build_java", + "//chrome/browser/ui/browser_window:java", + ] + } +}
diff --git a/chrome/browser/ui/browser_window/stub/android/java/src/org/chromium/chrome/browser/ui/browser_window/ChromeAndroidTaskTrackerFactory.java b/chrome/browser/ui/browser_window/stub/android/java/src/org/chromium/chrome/browser/ui/browser_window/ChromeAndroidTaskTrackerFactory.java new file mode 100644 index 0000000..11e7d5b --- /dev/null +++ b/chrome/browser/ui/browser_window/stub/android/java/src/org/chromium/chrome/browser/ui/browser_window/ChromeAndroidTaskTrackerFactory.java
@@ -0,0 +1,24 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.chrome.browser.ui.browser_window; + +import org.chromium.build.annotations.NullMarked; +import org.chromium.build.annotations.Nullable; + +/** + * Stub factory for when {@link ChromeAndroidTaskTracker} isn't compiled into the build. + * + * <p>TODO(crbug.com/434123514): see if we can remove this stub factory. + */ +@NullMarked +public final class ChromeAndroidTaskTrackerFactory { + + private ChromeAndroidTaskTrackerFactory() {} + + @Nullable + public static ChromeAndroidTaskTracker getInstance() { + return null; + } +}
diff --git a/chrome/browser/ui/browser_window/test/BUILD.gn b/chrome/browser/ui/browser_window/test/BUILD.gn index 7b9bcf1..f60893ee 100644 --- a/chrome/browser/ui/browser_window/test/BUILD.gn +++ b/chrome/browser/ui/browser_window/test/BUILD.gn
@@ -15,6 +15,7 @@ sources = [ "android/java/src/org/chromium/chrome/browser/ui/browser_window/ChromeAndroidTaskUnitTestSupport.java" ] deps = [ "//build/android:build_java", + "//chrome/browser/ui/browser_window:java", "//chrome/browser/ui/browser_window/internal:java", "//third_party/mockito:mockito_java", "//ui/android:ui_no_recycler_view_java",
diff --git a/chrome/browser/ui/browser_window/test/android/java/src/org/chromium/chrome/browser/ui/browser_window/ChromeAndroidTaskUnitTestSupport.java b/chrome/browser/ui/browser_window/test/android/java/src/org/chromium/chrome/browser/ui/browser_window/ChromeAndroidTaskUnitTestSupport.java index 0005a05a..7758e699 100644 --- a/chrome/browser/ui/browser_window/test/android/java/src/org/chromium/chrome/browser/ui/browser_window/ChromeAndroidTaskUnitTestSupport.java +++ b/chrome/browser/ui/browser_window/test/android/java/src/org/chromium/chrome/browser/ui/browser_window/ChromeAndroidTaskUnitTestSupport.java
@@ -15,16 +15,23 @@ import java.lang.ref.WeakReference; -/** - * Supports Robolectric tests relevant to {@link ChromeAndroidTask}. - * - * <p>This class is package-private as it hasn't been needed outside this package. - */ +/** Supports Robolectric and native unit tests relevant to {@link ChromeAndroidTask}. */ @NullMarked -final class ChromeAndroidTaskUnitTestSupport { +public final class ChromeAndroidTaskUnitTestSupport { private ChromeAndroidTaskUnitTestSupport() {} /** + * Creates a real {@link ChromeAndroidTask} with mock dependencies. + * + * @param taskId ID for {@link ChromeAndroidTask#getId()}. + * @return A new instance of {@link ChromeAndroidTask}. + */ + public static ChromeAndroidTask createChromeAndroidTaskWithMockDeps(int taskId) { + var mockActivityWindowAndroid = createMockActivityWindowAndroid(taskId); + return new ChromeAndroidTaskImpl(mockActivityWindowAndroid); + } + + /** * Creates a mock {@link ActivityWindowAndroid}, which has a mock {@link Activity} with the * given {@code taskId}. */
diff --git a/chrome/browser/ui/color/BUILD.gn b/chrome/browser/ui/color/BUILD.gn index 67cea1a..fffee1c 100644 --- a/chrome/browser/ui/color/BUILD.gn +++ b/chrome/browser/ui/color/BUILD.gn
@@ -54,10 +54,10 @@ "//chrome/browser/ui:ui_features", "//chrome/common/themes:autogenerated_theme_util", "//components/compose:buildflags", - "//components/omnibox/common:common", - "//components/search:search", + "//components/omnibox/common", + "//components/search", "//ui/base:buildflags", - "//ui/color:color", + "//ui/color", "//ui/color:mixers", ]
diff --git a/chrome/browser/ui/commerce/BUILD.gn b/chrome/browser/ui/commerce/BUILD.gn index 517d9b0..ddfd3b4 100644 --- a/chrome/browser/ui/commerce/BUILD.gn +++ b/chrome/browser/ui/commerce/BUILD.gn
@@ -112,7 +112,7 @@ deps = [ ":commerce", "//base/test:test_support", - "//chrome/browser/ui/toasts:toasts", + "//chrome/browser/ui/toasts", "//chrome/test:test_support", "//components/commerce/core:account_checker_test_support", "//components/commerce/core:feature_list", @@ -134,8 +134,8 @@ ] deps = [ ":commerce", - "//chrome/browser/ui/browser_window:browser_window", - "//chrome/browser/ui/toasts:toasts", + "//chrome/browser/ui/browser_window", + "//chrome/browser/ui/toasts", "//chrome/test:test_support", "//components/commerce/core:account_checker_test_support", "//components/commerce/core:shopping_service_test_support",
diff --git a/chrome/browser/ui/content_settings/BUILD.gn b/chrome/browser/ui/content_settings/BUILD.gn index 07a9e24d..6e19835 100644 --- a/chrome/browser/ui/content_settings/BUILD.gn +++ b/chrome/browser/ui/content_settings/BUILD.gn
@@ -9,7 +9,7 @@ deps = [] public_deps = [ "//base", - "//chrome/app/vector_icons:vector_icons", + "//chrome/app/vector_icons", "//chrome/browser/ui/blocked_content", "//components/content_settings/browser", "//components/content_settings/core/common", @@ -60,7 +60,7 @@ "//chrome/common:non_code_constants", "//components/content_settings/core/browser", "//components/content_settings/core/browser:cookie_settings", - "//components/infobars/content:content", + "//components/infobars/content", "//components/no_state_prefetch/browser", "//components/subresource_filter/content/browser", "//components/subresource_filter/core/browser", @@ -91,7 +91,7 @@ "//chrome/browser/ui/browser_window", "//chrome/test:test_support", "//components/content_settings/core/test:test_support", - "//components/subresource_filter/core/browser:browser", + "//components/subresource_filter/core/browser", ] } @@ -137,7 +137,7 @@ "//chrome/browser/web_applications:web_applications_test_support", "//chrome/test:test_support", "//components/custom_handlers:test_support", - "//components/infobars/content:content", + "//components/infobars/content", "//components/no_state_prefetch/browser", "//services/data_decoder/public/cpp:test_support", ]
diff --git a/chrome/browser/ui/exclusive_access/BUILD.gn b/chrome/browser/ui/exclusive_access/BUILD.gn index 4d2197b8..2bb9d2de 100644 --- a/chrome/browser/ui/exclusive_access/BUILD.gn +++ b/chrome/browser/ui/exclusive_access/BUILD.gn
@@ -47,7 +47,7 @@ "//chrome/browser/ui:ui_features", "//chrome/common:constants", "//components/content_settings/core/browser", - "//components/fullscreen_control:fullscreen_control", + "//components/fullscreen_control", "//components/history/core/browser", "//components/input", "//components/permissions:permissions_common", @@ -102,7 +102,7 @@ ] deps = [ ":test_support", - "//components/fullscreen_control:fullscreen_control", + "//components/fullscreen_control", ] }
diff --git a/chrome/browser/ui/find_bar/BUILD.gn b/chrome/browser/ui/find_bar/BUILD.gn index 8884e2a..5a59664 100644 --- a/chrome/browser/ui/find_bar/BUILD.gn +++ b/chrome/browser/ui/find_bar/BUILD.gn
@@ -75,7 +75,7 @@ deps = [ ":find_bar", ":test_support", - "//chrome/browser/ui/browser_window:browser_window", + "//chrome/browser/ui/browser_window", "//chrome/test:test_support", ] @@ -95,7 +95,7 @@ deps = [ ":find_bar", - "//chrome/browser/ui/browser_window:browser_window", + "//chrome/browser/ui/browser_window", "//chrome/test:test_support", ]
diff --git a/chrome/browser/ui/hats/BUILD.gn b/chrome/browser/ui/hats/BUILD.gn index 9525276..1548b58 100644 --- a/chrome/browser/ui/hats/BUILD.gn +++ b/chrome/browser/ui/hats/BUILD.gn
@@ -104,7 +104,7 @@ "//chrome/browser/ui", ] if (is_android) { - deps += [ "//chrome/browser/ui/android/hats:hats" ] + deps += [ "//chrome/browser/ui/android/hats" ] } public_deps = [ "//chrome/browser:browser_public_dependencies" ] }
diff --git a/chrome/browser/ui/javascript_dialogs/BUILD.gn b/chrome/browser/ui/javascript_dialogs/BUILD.gn index b7f4409..11021f3 100644 --- a/chrome/browser/ui/javascript_dialogs/BUILD.gn +++ b/chrome/browser/ui/javascript_dialogs/BUILD.gn
@@ -20,7 +20,7 @@ sources += [ "javascript_tab_modal_dialog_manager_delegate_desktop.h" ] public_deps += [ "//chrome/browser/ui:browser_list", - "//chrome/browser/ui/browser_window:browser_window", + "//chrome/browser/ui/browser_window", "//chrome/browser/ui/tabs:tab_strip_model_observer", "//chrome/browser/ui/tabs:tabs_public", ]
diff --git a/chrome/browser/ui/lens/BUILD.gn b/chrome/browser/ui/lens/BUILD.gn index 9b7c4952..e14e19c1 100644 --- a/chrome/browser/ui/lens/BUILD.gn +++ b/chrome/browser/ui/lens/BUILD.gn
@@ -154,7 +154,7 @@ "//components/lens:enterprise_policy", "//components/lens:features", "//components/lens/proto/server:proto", - "//components/metrics_services_manager:metrics_services_manager", + "//components/metrics_services_manager", "//components/optimization_guide/content/browser", "//components/optimization_guide/content/browser:page_context_eligibility", "//components/prefs", @@ -167,7 +167,7 @@ "//components/variations", "//components/variations:variations_mojom", "//components/version_info:channel", - "//components/web_modal:web_modal", + "//components/web_modal", "//components/zoom", "//google_apis", "//google_apis/common", @@ -322,7 +322,7 @@ "//testing/gtest", ] if (enable_pdf) { - deps += [ "//components/pdf/browser:browser" ] + deps += [ "//components/pdf/browser" ] } }
diff --git a/chrome/browser/ui/login/BUILD.gn b/chrome/browser/ui/login/BUILD.gn index d780610..4fc6960a 100644 --- a/chrome/browser/ui/login/BUILD.gn +++ b/chrome/browser/ui/login/BUILD.gn
@@ -64,7 +64,7 @@ "//base/test:test_support", "//chrome/browser:browser_process", "//chrome/browser/profiles:profile", - "//chrome/browser/ui/browser_window:browser_window", + "//chrome/browser/ui/browser_window", "//chrome/browser/ui/tabs:tab_enums", "//chrome/browser/ui/tabs:tab_strip", "//chrome/common:chrome_features",
diff --git a/chrome/browser/ui/omnibox/BUILD.gn b/chrome/browser/ui/omnibox/BUILD.gn index 4a73fd59..36399290 100644 --- a/chrome/browser/ui/omnibox/BUILD.gn +++ b/chrome/browser/ui/omnibox/BUILD.gn
@@ -51,7 +51,7 @@ "//build:branding_buildflags", "//chrome/app/vector_icons", "//chrome/browser:shell_integration", - "//chrome/browser/feedback:feedback", + "//chrome/browser/feedback", "//chrome/browser/feedback:feedback_enum", "//chrome/common", "//chrome/common:chrome_features", @@ -89,8 +89,8 @@ "//chrome/browser/ui:browser_list", "//chrome/browser/ui/bookmarks", "//chrome/browser/ui/extensions/", - "//chrome/browser/ui/hats:hats", - "//chrome/browser/ui/lens:lens", + "//chrome/browser/ui/hats", + "//chrome/browser/ui/lens", "//chrome/common", "//components/bookmarks/browser", "//components/favicon/content", @@ -221,7 +221,7 @@ deps += [ ":omnibox", "//chrome/browser/ui:browser_navigator_params_headers", - "//chrome/browser/ui/browser_window:browser_window", + "//chrome/browser/ui/browser_window", ] } }
diff --git a/chrome/browser/ui/page_info/BUILD.gn b/chrome/browser/ui/page_info/BUILD.gn index 261c5b0..386faa8a 100644 --- a/chrome/browser/ui/page_info/BUILD.gn +++ b/chrome/browser/ui/page_info/BUILD.gn
@@ -56,15 +56,13 @@ deps += [ "//chrome/browser/extensions", "//chrome/browser/hid", - "//chrome/browser/smart_card:smart_card", + "//chrome/browser/smart_card", "//chrome/browser/ui/tabs:tab_strip", "//chrome/browser/ui/web_applications", "//chrome/browser/web_applications", ] if (is_chromeos) { - deps += [ - "//chrome/browser/ui/webui/ash/settings/app_management:app_management", - ] + deps += [ "//chrome/browser/ui/webui/ash/settings/app_management" ] } } deps += [
diff --git a/chrome/browser/ui/plus_addresses/BUILD.gn b/chrome/browser/ui/plus_addresses/BUILD.gn index d8e3281..d07cc63 100644 --- a/chrome/browser/ui/plus_addresses/BUILD.gn +++ b/chrome/browser/ui/plus_addresses/BUILD.gn
@@ -46,7 +46,7 @@ "android/plus_address_creation_view_android.h", ] public_deps += [ - "//base:base", + "//base", "//components/autofill/core/browser", "//components/autofill/core/common", "//components/plus_addresses:hats_utils", @@ -158,7 +158,7 @@ "//components/plus_addresses:features", "//components/plus_addresses:prefs", "//components/plus_addresses:test_support", - "//components/plus_addresses/metrics:metrics", + "//components/plus_addresses/metrics", "//components/plus_addresses/settings:test_support", "//components/sync_preferences:test_support", "//content/test:test_support", @@ -206,9 +206,9 @@ "//chrome/browser/profiles:profile", "//chrome/test:test_support", "//chrome/test:test_support_ui_android", + "//components/plus_addresses", "//components/plus_addresses:features", "//components/plus_addresses:plus_address_java_enums", - "//components/plus_addresses:plus_addresses", "//components/plus_addresses:test_support", "//content/test:test_support", "//testing/gtest",
diff --git a/chrome/browser/ui/plus_addresses/android/BUILD.gn b/chrome/browser/ui/plus_addresses/android/BUILD.gn index 0fb4d77..cfeb2dce 100644 --- a/chrome/browser/ui/plus_addresses/android/BUILD.gn +++ b/chrome/browser/ui/plus_addresses/android/BUILD.gn
@@ -164,7 +164,7 @@ "//third_party/androidx:androidx_test_runner_java", "//third_party/hamcrest:hamcrest_java", "//third_party/hamcrest:hamcrest_library_java", - "//third_party/junit:junit", + "//third_party/junit", "//third_party/mockito:mockito_java", "//ui/accessibility:ax_base_java", "//ui/android:ui_java_test_support",
diff --git a/chrome/browser/ui/privacy_sandbox/BUILD.gn b/chrome/browser/ui/privacy_sandbox/BUILD.gn index 603beca5..78b2730 100644 --- a/chrome/browser/ui/privacy_sandbox/BUILD.gn +++ b/chrome/browser/ui/privacy_sandbox/BUILD.gn
@@ -91,7 +91,7 @@ if (is_chromeos) { deps += [ "//ash/webui/help_app_ui", - "//chromeos/ash/components/browser_context_helper:browser_context_helper", + "//chromeos/ash/components/browser_context_helper", ] } }
diff --git a/chrome/browser/ui/recently_audible_helper.cc b/chrome/browser/ui/recently_audible_helper.cc index 6eceb94e..2beadda3 100644 --- a/chrome/browser/ui/recently_audible_helper.cc +++ b/chrome/browser/ui/recently_audible_helper.cc
@@ -42,7 +42,8 @@ } base::CallbackListSubscription -RecentlyAudibleHelper::RegisterCallbackForTesting(const Callback& callback) { +RecentlyAudibleHelper::RegisterRecentlyAudibleChangedCallback( + const Callback& callback) { return callback_list_.Add(callback); }
diff --git a/chrome/browser/ui/recently_audible_helper.h b/chrome/browser/ui/recently_audible_helper.h index 33ba09d..4816e1d 100644 --- a/chrome/browser/ui/recently_audible_helper.h +++ b/chrome/browser/ui/recently_audible_helper.h
@@ -50,7 +50,7 @@ // Registers the provided repeating callback for notifications. Destroying // the returned subscription will unregister the callback. This is safe to do // while in the context of the callback itself. - base::CallbackListSubscription RegisterCallbackForTesting( + base::CallbackListSubscription RegisterRecentlyAudibleChangedCallback( const Callback& callback); // Allows replacing the tick clock that is used by this class. Setting it back
diff --git a/chrome/browser/ui/recently_audible_helper_unittest.cc b/chrome/browser/ui/recently_audible_helper_unittest.cc index 9cb7aca7..5b9eb62 100644 --- a/chrome/browser/ui/recently_audible_helper_unittest.cc +++ b/chrome/browser/ui/recently_audible_helper_unittest.cc
@@ -40,9 +40,10 @@ RecentlyAudibleHelper::CreateForWebContents(contents_); helper_ = RecentlyAudibleHelper::FromWebContents(contents_); helper_->SetTickClockForTesting(task_runner_->GetMockTickClock()); - subscription_ = helper_->RegisterCallbackForTesting(base::BindRepeating( - &RecentlyAudibleHelperTest::OnRecentlyAudibleCallback, - base::Unretained(this))); + subscription_ = + helper_->RegisterRecentlyAudibleChangedCallback(base::BindRepeating( + &RecentlyAudibleHelperTest::OnRecentlyAudibleCallback, + base::Unretained(this))); } void TearDown() override {
diff --git a/chrome/browser/ui/safety_hub/BUILD.gn b/chrome/browser/ui/safety_hub/BUILD.gn index 62a6ca72..154fa6b 100644 --- a/chrome/browser/ui/safety_hub/BUILD.gn +++ b/chrome/browser/ui/safety_hub/BUILD.gn
@@ -204,7 +204,7 @@ "//base", "//base/test:test_support", "//chrome/browser/content_settings:content_settings_factory", - "//chrome/browser/permissions:permissions", + "//chrome/browser/permissions", "//chrome/browser/profiles:profile", "//chrome/browser/safe_browsing:test_support", "//chrome/browser/ui",
diff --git a/chrome/browser/ui/signin/BUILD.gn b/chrome/browser/ui/signin/BUILD.gn index 9f69d20..fc5df75f5 100644 --- a/chrome/browser/ui/signin/BUILD.gn +++ b/chrome/browser/ui/signin/BUILD.gn
@@ -208,7 +208,7 @@ "signin_view_controller_browsertest.cc", ] deps += [ - "//chrome/browser/ui/webui/signin/signout_confirmation:signout_confirmation", + "//chrome/browser/ui/webui/signin/signout_confirmation", "//chrome/test:sync_integration_test_support", "//chrome/test:test_support", "//components/sync:test_support",
diff --git a/chrome/browser/ui/sync/BUILD.gn b/chrome/browser/ui/sync/BUILD.gn index ac1acf6b..1b73a57 100644 --- a/chrome/browser/ui/sync/BUILD.gn +++ b/chrome/browser/ui/sync/BUILD.gn
@@ -112,7 +112,7 @@ "//chrome/browser/extensions:test_support", "//chrome/browser/prefs", "//components/bookmarks/test", - "//components/pref_registry:pref_registry", + "//components/pref_registry", "//components/prefs:test_support", "//components/sync_preferences:test_support", ]
diff --git a/chrome/browser/ui/tabs/BUILD.gn b/chrome/browser/ui/tabs/BUILD.gn index 027e9f92..3e2243c 100644 --- a/chrome/browser/ui/tabs/BUILD.gn +++ b/chrome/browser/ui/tabs/BUILD.gn
@@ -19,7 +19,7 @@ public_deps = [ "//base", "//chrome/common:buildflags", - "//components/tab_groups:tab_groups", + "//components/tab_groups", "//components/tabs:public", ] deps = [ @@ -45,7 +45,7 @@ ] deps = [ - "//components/tab_groups:tab_groups", + "//components/tab_groups", "//components/tabs:public", "//url", ] @@ -158,7 +158,7 @@ "//chrome/browser/ui:browser_element_identifiers", "//chrome/browser/ui:browser_navigator_params_headers", "//chrome/browser/ui:ui_features", - "//chrome/browser/ui/browser_window:browser_window", + "//chrome/browser/ui/browser_window", "//chrome/browser/ui/color:color_headers", "//chrome/browser/ui/tabs:tab_strip", @@ -188,7 +188,7 @@ ":tabs_public", "//base", "//components/back_forward_cache", - "//components/commerce/core/product_specifications:product_specifications", + "//components/commerce/core/product_specifications", "//components/constrained_window", "//components/favicon/core", "//components/sessions", @@ -231,7 +231,7 @@ "//chrome/browser/ui/browser_window", "//chrome/browser/ui/commerce", "//chrome/browser/ui/toasts", - "//components/commerce/core/product_specifications:product_specifications", + "//components/commerce/core/product_specifications", "//components/tab_groups", ] @@ -290,8 +290,8 @@ "//chrome/browser/ui:browser_list", "//chrome/browser/ui:browser_tab_strip", "//chrome/browser/ui:ui_features", - "//chrome/browser/ui/browser_window:browser_window", - "//chrome/browser/ui/commerce:commerce", + "//chrome/browser/ui/browser_window", + "//chrome/browser/ui/commerce", "//chrome/browser/ui/send_tab_to_self", "//chrome/browser/ui/thumbnails", "//chrome/browser/ui/user_education", @@ -350,10 +350,10 @@ "//chrome/browser/profiles:profile", "//chrome/browser/ui:browser_list", "//chrome/browser/ui/color:color_headers", - "//chrome/browser/ui/omnibox:omnibox", + "//chrome/browser/ui/omnibox", "//chrome/browser/ui/startup:startup_tab", - "//chrome/browser/ui/views/permissions/chip:chip", - "//components/collaboration/public:public", + "//chrome/browser/ui/views/permissions/chip", + "//components/collaboration/public", "//components/keyed_service/core", "//components/tabs:public", "//content/public/browser", @@ -363,7 +363,7 @@ "//ui/gfx", "//ui/gfx:color_utils", "//ui/gfx/geometry", - "//ui/menus:menus", + "//ui/menus", "//url", ] @@ -405,11 +405,11 @@ ":tabs", "//chrome/app:command_ids", "//chrome/app/vector_icons", - "//chrome/browser/actor:actor", - "//chrome/browser/actor/ui:ui", + "//chrome/browser/actor", + "//chrome/browser/actor/ui", "//chrome/browser/commerce", "//chrome/browser/content_settings:content_settings_factory", - "//chrome/browser/contextual_cueing:contextual_cueing", + "//chrome/browser/contextual_cueing", "//chrome/browser/favicon", "//chrome/browser/fingerprinting_protection", "//chrome/browser/image_fetcher", @@ -421,11 +421,11 @@ "//chrome/browser/signin", "//chrome/browser/sync", "//chrome/browser/sync:factories", - "//chrome/browser/task_manager:task_manager", + "//chrome/browser/task_manager", "//chrome/browser/themes", "//chrome/browser/ui:browser_list", "//chrome/browser/ui:ui_features", - "//chrome/browser/ui/browser_window:browser_window", + "//chrome/browser/ui/browser_window", "//chrome/browser/ui/commerce", "//chrome/browser/ui/lens", "//chrome/browser/ui/performance_controls", @@ -437,7 +437,7 @@ "//chrome/browser/ui/views/page_action", "//chrome/browser/ui/views/page_info", "//chrome/browser/ui/views/side_panel", - "//chrome/browser/ui/views/toolbar:toolbar", + "//chrome/browser/ui/views/toolbar", "//chrome/browser/ui/webui:webui_util", "//chrome/browser/vr", "//chrome/browser/web_applications", @@ -530,9 +530,9 @@ ":tab_strip", ":tabs_public", "//base", - "//chrome/browser/extensions:extensions", + "//chrome/browser/extensions", "//chrome/browser/profiles:profile", - "//chrome/browser/ui/tab_contents:tab_contents", + "//chrome/browser/ui/tab_contents", "//content/public/browser", "//content/test:test_support", "//services/metrics/public/cpp:metrics_cpp", @@ -579,7 +579,7 @@ "//chrome/browser/ui:browser_list", "//chrome/browser/ui:browser_navigator_params_headers", "//chrome/browser/ui:ui_features", - "//chrome/browser/ui/browser_window:browser_window", + "//chrome/browser/ui/browser_window", "//chrome/browser/web_applications", "//chrome/browser/web_applications:prevent_close_test_support", "//chrome/browser/web_applications:web_applications_test_support", @@ -675,7 +675,7 @@ "//chrome/app:command_ids", "//chrome/app:generated_resources", "//chrome/browser", - "//chrome/browser/commerce:commerce", + "//chrome/browser/commerce", "//chrome/browser/content_settings:content_settings_factory", "//chrome/browser/extensions", "//chrome/browser/optimization_guide",
diff --git a/chrome/browser/ui/tabs/alert/BUILD.gn b/chrome/browser/ui/tabs/alert/BUILD.gn index 7386ef1..4a9ef0d3 100644 --- a/chrome/browser/ui/tabs/alert/BUILD.gn +++ b/chrome/browser/ui/tabs/alert/BUILD.gn
@@ -18,11 +18,11 @@ public_deps = [ "//base", - "//chrome/browser/vr:vr", + "//chrome/browser/vr", "//content/public/browser", ] - deps = [ "//chrome/browser/media/webrtc:webrtc" ] + deps = [ "//chrome/browser/media/webrtc" ] } source_set("impl") { @@ -34,14 +34,14 @@ deps = [ ":tab_alert", ":tab_alert_enum", - "//chrome/app/vector_icons:vector_icons", - "//chrome/browser/media/webrtc:webrtc", + "//chrome/app/vector_icons", + "//chrome/browser/media/webrtc", "//chrome/common:chrome_features", - "//components/vector_icons:vector_icons", + "//components/vector_icons", ] if (enable_glic) { - deps += [ "//chrome/browser/glic:glic" ] + deps += [ "//chrome/browser/glic" ] } }
diff --git a/chrome/browser/ui/tabs/alert/tab_alert_controller.cc b/chrome/browser/ui/tabs/alert/tab_alert_controller.cc index d46618bf..707ab72 100644 --- a/chrome/browser/ui/tabs/alert/tab_alert_controller.cc +++ b/chrome/browser/ui/tabs/alert/tab_alert_controller.cc
@@ -14,6 +14,7 @@ #include "base/containers/to_vector.h" #include "base/functional/bind.h" #include "chrome/browser/media/webrtc/media_capture_devices_dispatcher.h" +#include "chrome/browser/ui/recently_audible_helper.h" #include "chrome/browser/ui/tabs/alert/tab_alert.h" #include "chrome/browser/vr/vr_tab_helper.h" #include "content/public/browser/web_contents.h" @@ -76,6 +77,11 @@ .get()); vr_tab_helper_observation_.Observe( vr::VrTabHelper::FromWebContents(web_contents())); + recently_audible_subscription_ = + RecentlyAudibleHelper::FromWebContents(tab.GetContents()) + ->RegisterRecentlyAudibleChangedCallback(base::BindRepeating( + &TabAlertController::OnRecentlyAudibleStateChanged, + base::Unretained(this))); #if BUILDFLAG(ENABLE_GLIC) if (glic_keyed_service) { @@ -130,6 +136,11 @@ vr_tab_helper_observation_.Reset(); vr_tab_helper_observation_.Observe( vr::VrTabHelper::FromWebContents(new_contents)); + recently_audible_subscription_ = + RecentlyAudibleHelper::FromWebContents(new_contents) + ->RegisterRecentlyAudibleChangedCallback(base::BindRepeating( + &TabAlertController::OnRecentlyAudibleStateChanged, + base::Unretained(this))); } void TabAlertController::OnCapabilityTypesChanged( @@ -167,10 +178,6 @@ UpdateAlertState(TabAlert::AUDIO_MUTING, muted); } -void TabAlertController::OnAudioStateChanged(bool audible) { - UpdateAlertState(TabAlert::AUDIO_PLAYING, audible); -} - void TabAlertController::OnIsCapturingVideoChanged( content::WebContents* contents, bool is_capturing_video) { @@ -242,6 +249,10 @@ } #endif // BUILDFLAG(ENABLE_GLIC) +void TabAlertController::OnRecentlyAudibleStateChanged(bool was_audible) { + UpdateAlertState(TabAlert::AUDIO_PLAYING, was_audible); +} + void TabAlertController::UpdateAlertState(TabAlert alert, bool is_active) { std::optional<TabAlert> previous_alert = GetAlertToShow(); if (is_active) {
diff --git a/chrome/browser/ui/tabs/alert/tab_alert_controller.h b/chrome/browser/ui/tabs/alert/tab_alert_controller.h index 5dc54e6..bbc50980 100644 --- a/chrome/browser/ui/tabs/alert/tab_alert_controller.h +++ b/chrome/browser/ui/tabs/alert/tab_alert_controller.h
@@ -74,7 +74,6 @@ bool used) override; void MediaPictureInPictureChanged(bool is_picture_in_picture) override; void DidUpdateAudioMutingState(bool muted) override; - void OnAudioStateChanged(bool audible) override; // MediaStreamCaptureIndicator::Observer: void OnIsCapturingVideoChanged(content::WebContents* contents, @@ -100,6 +99,8 @@ bool is_sharing); #endif // BUILDFLAG(ENABLE_GLIC) + void OnRecentlyAudibleStateChanged(bool was_audible); + // Adds `alert` to the set of already active alerts for this tab if it isn't // currently active. Otherwise, removes `alert` from the set and is considered // inactive. @@ -125,6 +126,7 @@ vr_tab_helper_observation_{this}; // Subscriptions to be notified when an alert status has changed. + base::CallbackListSubscription recently_audible_subscription_; std::vector<base::CallbackListSubscription> callback_subscriptions_; }; } // namespace tabs
diff --git a/chrome/browser/ui/tabs/alert/tab_alert_controller_unittest.cc b/chrome/browser/ui/tabs/alert/tab_alert_controller_unittest.cc index 4a61ad1e..b6f3377 100644 --- a/chrome/browser/ui/tabs/alert/tab_alert_controller_unittest.cc +++ b/chrome/browser/ui/tabs/alert/tab_alert_controller_unittest.cc
@@ -9,6 +9,8 @@ #include "base/functional/bind.h" #include "base/test/scoped_feature_list.h" +#include "base/test/task_environment.h" +#include "base/time/time.h" #include "chrome/browser/global_features.h" #include "chrome/browser/ui/browser_window/test/mock_browser_window_interface.h" #include "chrome/browser/ui/tabs/alert/tab_alert.h" @@ -140,6 +142,15 @@ TabInterface* tab_interface() { return tab_model_.get(); } + void SimulateAudioState(bool is_playing_audio) { + content::WebContentsTester::For(tab_model_->GetContents()) + ->SetIsCurrentlyAudible(is_playing_audio); + } + + content::BrowserTaskEnvironment* task_environment() { + return &task_environment_; + } + #if BUILDFLAG(ENABLE_GLIC) TestGlicKeyedService* test_glic_keyed_service() { return test_glic_keyed_service_.get(); @@ -148,7 +159,8 @@ private: base::test::ScopedFeatureList scoped_feature_list_; - content::BrowserTaskEnvironment task_environment_; + content::BrowserTaskEnvironment task_environment_{ + base::test::TaskEnvironment::TimeSource::MOCK_TIME}; content::RenderViewHostTestEnabler test_enabler_; std::unique_ptr<TestingProfileManager> testing_profile_manager_; raw_ptr<Profile> profile_ = nullptr; @@ -178,7 +190,7 @@ EXPECT_CALL(*mock_subscriber, OnPrioritizedAlertStateChanged( std::make_optional(TabAlert::AUDIO_PLAYING))); - tab_alert_controller()->OnAudioStateChanged(true); + SimulateAudioState(true); ::testing::Mock::VerifyAndClearExpectations(mock_subscriber.get()); // Simulate a higher priority alert being activated. @@ -193,7 +205,8 @@ EXPECT_CALL(*mock_subscriber, OnPrioritizedAlertStateChanged(std::optional<TabAlert>())) .Times(0); - tab_alert_controller()->OnAudioStateChanged(false); + SimulateAudioState(false); + task_environment()->FastForwardBy(base::Seconds(2)); ::testing::Mock::VerifyAndClearExpectations(mock_subscriber.get()); // Remove the last active tab alert. @@ -204,7 +217,7 @@ } TEST_F(TabAlertControllerTest, GetAllAlert) { - tab_alert_controller()->OnAudioStateChanged(true); + SimulateAudioState(true); tab_alert_controller()->OnCapabilityTypesChanged( content::WebContentsCapabilityType::kBluetoothConnected, true); tab_alert_controller()->MediaPictureInPictureChanged(true); @@ -226,7 +239,7 @@ } TEST_F(TabAlertControllerTest, AlertIsActive) { - tab_alert_controller()->OnAudioStateChanged(true); + SimulateAudioState(true); tab_alert_controller()->OnCapabilityTypesChanged( content::WebContentsCapabilityType::kBluetoothConnected, true); tab_alert_controller()->MediaPictureInPictureChanged(true); @@ -254,6 +267,26 @@ EXPECT_FALSE(tab_alert_controller()->GetAlertToShow().has_value()); } +TEST_F(TabAlertControllerTest, AudioStateUpdatesAlertController) { + EXPECT_FALSE(tab_alert_controller()->GetAlertToShow().has_value()); + SimulateAudioState(true); + EXPECT_TRUE(tab_alert_controller()->GetAlertToShow().has_value()); + EXPECT_EQ(tab_alert_controller()->GetAlertToShow().value(), + TabAlert::AUDIO_PLAYING); + + // The audio playing alert should still be active even though the audio has + // stopped to prevent the audio state from toggling too frequently on pause. + SimulateAudioState(false); + EXPECT_TRUE(tab_alert_controller()->GetAlertToShow().has_value()); + EXPECT_EQ(tab_alert_controller()->GetAlertToShow().value(), + TabAlert::AUDIO_PLAYING); + + // The tab alert should go away after 2 seconds of consistently not playing + // audio. + task_environment()->FastForwardBy(base::Seconds(2)); + EXPECT_FALSE(tab_alert_controller()->GetAlertToShow().has_value()); +} + #if BUILDFLAG(ENABLE_GLIC) TEST_F(TabAlertControllerTest, GlicSharingUpdatesAlertController) { EXPECT_FALSE(tab_alert_controller()->GetAlertToShow().has_value());
diff --git a/chrome/browser/ui/tabs/tab_strip_api/BUILD.gn b/chrome/browser/ui/tabs/tab_strip_api/BUILD.gn index 5458a02..281ed8a 100644 --- a/chrome/browser/ui/tabs/tab_strip_api/BUILD.gn +++ b/chrome/browser/ui/tabs/tab_strip_api/BUILD.gn
@@ -56,7 +56,7 @@ "//chrome/browser/ui/tabs/tab_strip_api/types/tab_group_visual_data_traits.cc", ] traits_public_deps = [ - "types:types", + "types", "//base", "//chrome/browser/ui/tabs", ] @@ -89,7 +89,7 @@ "//chrome/browser/ui/tabs:tab_strip_model_observer", ] - deps = [ "//chrome/browser/ui/tabs/tab_strip_api/events:events" ] + deps = [ "//chrome/browser/ui/tabs/tab_strip_api/events" ] } source_set("impl") { @@ -106,9 +106,9 @@ "adapters:impl", "converters", "events", - "types:types", + "types", "//chrome/browser/ui", - "//chrome/browser/ui/browser_window:browser_window", + "//chrome/browser/ui/browser_window", "//chrome/browser/ui/tabs:tab_strip", ] } @@ -126,7 +126,7 @@ "testing", "types:unit_tests", "//base/test:test_support", - "//chrome/browser/ui/browser_window:browser_window", + "//chrome/browser/ui/browser_window", "//chrome/browser/ui/tabs:tab_strip", "//chrome/browser/ui/tabs:test_support", "//chrome/test:test_support", @@ -148,7 +148,7 @@ "//base", "//base/test:test_support", "//chrome/browser/ui:ui_features", - "//chrome/browser/ui/browser_window:browser_window", + "//chrome/browser/ui/browser_window", "//chrome/browser/ui/tabs:tab_strip", "//chrome/test:test_support", "//content/test:test_support",
diff --git a/chrome/browser/ui/tabs/tab_strip_api/adapters/BUILD.gn b/chrome/browser/ui/tabs/tab_strip_api/adapters/BUILD.gn index 90c0b02..7cd0bf2 100644 --- a/chrome/browser/ui/tabs/tab_strip_api/adapters/BUILD.gn +++ b/chrome/browser/ui/tabs/tab_strip_api/adapters/BUILD.gn
@@ -29,7 +29,7 @@ ":adapters", "tree_builder", "//chrome/browser/ui", - "//chrome/browser/ui/browser_window:browser_window", + "//chrome/browser/ui/browser_window", "//chrome/browser/ui/tabs:tab_strip", "//chrome/browser/ui/tabs:tab_strip_model_observer", "//content/public/browser",
diff --git a/chrome/browser/ui/tabs/tab_strip_api/adapters/tree_builder/BUILD.gn b/chrome/browser/ui/tabs/tab_strip_api/adapters/tree_builder/BUILD.gn index 7c045e6..96fc368c 100644 --- a/chrome/browser/ui/tabs/tab_strip_api/adapters/tree_builder/BUILD.gn +++ b/chrome/browser/ui/tabs/tab_strip_api/adapters/tree_builder/BUILD.gn
@@ -16,8 +16,8 @@ deps = [ "//chrome/browser/ui/tabs:tab_strip", "//chrome/browser/ui/tabs/tab_strip_api:mojom", - "//chrome/browser/ui/tabs/tab_strip_api/converters:converters", - "//chrome/browser/ui/tabs/tab_strip_api/types:types", + "//chrome/browser/ui/tabs/tab_strip_api/converters", + "//chrome/browser/ui/tabs/tab_strip_api/types", ] } @@ -31,7 +31,7 @@ "//base", "//base/test:test_support", "//chrome/browser/ui:ui_features", - "//chrome/browser/ui/browser_window:browser_window", + "//chrome/browser/ui/browser_window", "//chrome/browser/ui/tabs:tab_strip", "//chrome/test:test_support", "//content/test:test_support",
diff --git a/chrome/browser/ui/tabs/tab_strip_api/converters/BUILD.gn b/chrome/browser/ui/tabs/tab_strip_api/converters/BUILD.gn index e3ad014..2804cf0809 100644 --- a/chrome/browser/ui/tabs/tab_strip_api/converters/BUILD.gn +++ b/chrome/browser/ui/tabs/tab_strip_api/converters/BUILD.gn
@@ -11,7 +11,7 @@ deps = [ "//chrome/browser/ui/tabs:tab_strip", "//chrome/browser/ui/tabs/tab_strip_api:mojom", - "//chrome/browser/ui/tabs/tab_strip_api/types:types", + "//chrome/browser/ui/tabs/tab_strip_api/types", ] } @@ -24,7 +24,7 @@ ":converters", "//chrome/browser/ui/tabs:tab_strip", "//chrome/browser/ui/tabs/tab_strip_api:mojom", - "//chrome/browser/ui/tabs/tab_strip_api/types:types", + "//chrome/browser/ui/tabs/tab_strip_api/types", "//testing/gtest", ] }
diff --git a/chrome/browser/ui/tabs/tab_strip_api/events/BUILD.gn b/chrome/browser/ui/tabs/tab_strip_api/events/BUILD.gn index adb3743..15b8fc5e 100644 --- a/chrome/browser/ui/tabs/tab_strip_api/events/BUILD.gn +++ b/chrome/browser/ui/tabs/tab_strip_api/events/BUILD.gn
@@ -15,9 +15,9 @@ "//chrome/browser/ui/tabs:tab_strip", "//chrome/browser/ui/tabs:tab_strip_model_observer", "//chrome/browser/ui/tabs/tab_strip_api:mojom", - "//chrome/browser/ui/tabs/tab_strip_api/adapters:adapters", - "//chrome/browser/ui/tabs/tab_strip_api/converters:converters", - "//chrome/browser/ui/tabs/tab_strip_api/types:types", + "//chrome/browser/ui/tabs/tab_strip_api/adapters", + "//chrome/browser/ui/tabs/tab_strip_api/converters", + "//chrome/browser/ui/tabs/tab_strip_api/types", ] }
diff --git a/chrome/browser/ui/thumbnails/BUILD.gn b/chrome/browser/ui/thumbnails/BUILD.gn index 511095a3..81fe3c22 100644 --- a/chrome/browser/ui/thumbnails/BUILD.gn +++ b/chrome/browser/ui/thumbnails/BUILD.gn
@@ -57,8 +57,8 @@ ":thumbnails", "//base", "//base/test:test_support", - "//chrome/browser:browser", - "//chrome/browser/extensions:extensions", + "//chrome/browser", + "//chrome/browser/extensions", "//chrome/test:test_support", "//content/test:test_support", "//skia",
diff --git a/chrome/browser/ui/toasts/BUILD.gn b/chrome/browser/ui/toasts/BUILD.gn index f10d2c1..697be81 100644 --- a/chrome/browser/ui/toasts/BUILD.gn +++ b/chrome/browser/ui/toasts/BUILD.gn
@@ -17,15 +17,15 @@ ] public_deps = [ "//base", - "//chrome/browser/ui/browser_window:browser_window", - "//chrome/browser/ui/commerce:commerce", + "//chrome/browser/ui/browser_window", + "//chrome/browser/ui/commerce", "//chrome/browser/ui/exclusive_access", - "//chrome/browser/ui/omnibox:omnibox", + "//chrome/browser/ui/omnibox", "//chrome/browser/ui/tabs:tab_strip_model_observer", "//chrome/browser/ui/toasts/api:toasts", "//components/commerce/core:feature_list", "//components/omnibox/browser:vector_icons", - "//components/omnibox/common:common", + "//components/omnibox/common", "//content/public/browser", "//ui/base", "//ui/views", @@ -56,7 +56,7 @@ "//components/plus_addresses/resources/strings", "//components/safe_browsing/core/common:features", "//components/safe_browsing/core/common:safe_browsing_prefs", - "//components/vector_icons:vector_icons", + "//components/vector_icons", "//ui/base/metadata", "//ui/compositor", "//ui/menus", @@ -77,8 +77,8 @@ "//chrome/app:command_ids", "//chrome/browser", "//chrome/browser:browser_process", + "//chrome/browser/ui", "//chrome/browser/ui:browser_element_identifiers", - "//chrome/browser/ui:ui", "//chrome/test:test_support", "//components/plus_addresses:features", "//components/safe_browsing/core/common:features", @@ -86,7 +86,7 @@ "//content/public/browser", "//content/test:test_support", "//testing/gtest", - "//ui/base:base", + "//ui/base", "//ui/base:test_support", "//ui/gfx", "//ui/strings:ui_strings_grit", @@ -112,7 +112,7 @@ "//base/test:test_support", "//chrome/browser", "//chrome/browser:browser_process", - "//chrome/browser/ui:ui", + "//chrome/browser/ui", "//chrome/test:test_support", "//components/data_sharing/public:features", "//components/plus_addresses:features", @@ -121,7 +121,7 @@ "//content/public/browser", "//content/test:test_support", "//testing/gtest", - "//ui/base:base", + "//ui/base", "//ui/gfx", "//ui/strings:ui_strings_grit", "//ui/views",
diff --git a/chrome/browser/ui/toasts/api/BUILD.gn b/chrome/browser/ui/toasts/api/BUILD.gn index 6db318a..994f322d 100644 --- a/chrome/browser/ui/toasts/api/BUILD.gn +++ b/chrome/browser/ui/toasts/api/BUILD.gn
@@ -18,7 +18,7 @@ "//ui/base", "//ui/menus", ] - deps = [ "//components/vector_icons:vector_icons" ] + deps = [ "//components/vector_icons" ] } source_set("unit_tests") {
diff --git a/chrome/browser/ui/toolbar/cast/BUILD.gn b/chrome/browser/ui/toolbar/cast/BUILD.gn index 69d47a7..1a16ef28 100644 --- a/chrome/browser/ui/toolbar/cast/BUILD.gn +++ b/chrome/browser/ui/toolbar/cast/BUILD.gn
@@ -36,7 +36,7 @@ "//chrome/browser/profiles:profile", "//chrome/browser/ui:ui_features", "//chrome/browser/ui/actions:actions_headers", - "//chrome/browser/ui/browser_window:browser_window", + "//chrome/browser/ui/browser_window", "//chrome/browser/ui/views/toolbar", "//chrome/common", "//chrome/common:constants",
diff --git a/chrome/browser/ui/toolbar/pinned_toolbar/BUILD.gn b/chrome/browser/ui/toolbar/pinned_toolbar/BUILD.gn index eb03753..8ef5dfa 100644 --- a/chrome/browser/ui/toolbar/pinned_toolbar/BUILD.gn +++ b/chrome/browser/ui/toolbar/pinned_toolbar/BUILD.gn
@@ -44,7 +44,7 @@ "//chrome/browser/ui/actions:actions_headers", "//chrome/browser/ui/browser_window", "//chrome/browser/ui/toolbar", - "//chrome/browser/ui/views/page_action:page_action", + "//chrome/browser/ui/views/page_action", "//chrome/browser/ui/views/toolbar", ] public_deps = [ "//chrome/browser:browser_public_dependencies" ]
diff --git a/chrome/browser/ui/views/BUILD.gn b/chrome/browser/ui/views/BUILD.gn index 665ed59..3e6878e0 100644 --- a/chrome/browser/ui/views/BUILD.gn +++ b/chrome/browser/ui/views/BUILD.gn
@@ -68,8 +68,8 @@ "//chrome/browser/ui/global_media_controls", "//chrome/browser/ui/views/toolbar", "//chrome/test:test_support_ui", - "//components/global_media_controls:global_media_controls", - "//components/media_message_center:media_message_center", + "//components/global_media_controls", + "//components/media_message_center", "//components/media_router/browser:test_support", "//testing/gtest", "//ui/base:test_support",
diff --git a/chrome/browser/ui/views/autofill/payments/save_and_fill_dialog.cc b/chrome/browser/ui/views/autofill/payments/save_and_fill_dialog.cc index ca1c24d..bb30c2d7 100644 --- a/chrome/browser/ui/views/autofill/payments/save_and_fill_dialog.cc +++ b/chrome/browser/ui/views/autofill/payments/save_and_fill_dialog.cc
@@ -20,8 +20,10 @@ namespace autofill { SaveAndFillDialog::SaveAndFillDialog( - base::WeakPtr<SaveAndFillDialogController> controller) - : controller_(controller) { + base::WeakPtr<SaveAndFillDialogController> controller, + base::RepeatingCallback<void(const GURL&)> on_legal_message_link_clicked) + : controller_(controller), + on_legal_message_link_clicked_(on_legal_message_link_clicked) { // Set the ownership of the delegate, not the View. The View is owned by the // Widget as a child view. // TODO(crbug.com/338254375): Remove the following line once this is the @@ -196,6 +198,10 @@ /*error_message=*/controller_->GetInvalidNameOnCardErrorMessage()); name_on_card_data_.GetInputTextField().SetController(this); AddChildView(std::move(name_on_card_data_.container)); + + if (controller_->IsUploadSaveAndFill()) { + AddChildView(CreateLegalMessageView()); + } } payments::PaymentsAutofillClient::UserProvidedCardSaveAndFillDetails @@ -236,4 +242,17 @@ } } +std::unique_ptr<views::View> SaveAndFillDialog::CreateLegalMessageView() { + const LegalMessageLines& message_lines = controller_->GetLegalMessageLines(); + + if (message_lines.empty()) { + return nullptr; + } + + // TODO(crbug.com/378164165): Add account info to the server dialog. + return autofill::CreateLegalMessageView( + message_lines, std::u16string(), ui::ImageModel(), + base::BindRepeating(on_legal_message_link_clicked_)); +} + } // namespace autofill
diff --git a/chrome/browser/ui/views/autofill/payments/save_and_fill_dialog.h b/chrome/browser/ui/views/autofill/payments/save_and_fill_dialog.h index 415341f..dfe69ec 100644 --- a/chrome/browser/ui/views/autofill/payments/save_and_fill_dialog.h +++ b/chrome/browser/ui/views/autofill/payments/save_and_fill_dialog.h
@@ -23,7 +23,8 @@ public views::FocusChangeListener { public: explicit SaveAndFillDialog( - base::WeakPtr<SaveAndFillDialogController> controller); + base::WeakPtr<SaveAndFillDialogController> controller, + base::RepeatingCallback<void(const GURL&)> on_legal_message_link_clicked); SaveAndFillDialog(const SaveAndFillDialog&) = delete; SaveAndFillDialog& operator=(const SaveAndFillDialog&) = delete; ~SaveAndFillDialog() override; @@ -50,8 +51,11 @@ GetUserProvidedDataFromInput() const; // Callback that is triggered when the dialog is accepted or canceled. void OnDialogClosed(views::Widget::ClosedReason reason); + // Create a view with a legal message. + std::unique_ptr<views::View> CreateLegalMessageView(); base::WeakPtr<SaveAndFillDialogController> controller_; + base::RepeatingCallback<void(const GURL&)> on_legal_message_link_clicked_; // The focus manager associated with this view. The focus manager is expected // to outlive this view.
diff --git a/chrome/browser/ui/views/autofill/payments/save_and_fill_view_desktop.cc b/chrome/browser/ui/views/autofill/payments/save_and_fill_view_desktop.cc index 147d6f74..8a0c264 100644 --- a/chrome/browser/ui/views/autofill/payments/save_and_fill_view_desktop.cc +++ b/chrome/browser/ui/views/autofill/payments/save_and_fill_view_desktop.cc
@@ -25,8 +25,12 @@ SaveAndFillViewDesktop::SaveAndFillViewDesktop( base::WeakPtr<SaveAndFillDialogController> controller, - content::WebContents* web_contents) { - auto dialog_view = std::make_unique<SaveAndFillDialog>(controller); + content::WebContents* web_contents) + : web_contents_(web_contents) { + auto dialog_view = std::make_unique<SaveAndFillDialog>( + controller, + base::BindRepeating(&SaveAndFillViewDesktop::OnLegalMessageLinkClicked, + weak_ptr_factory_.GetWeakPtr())); TabInterface* tab_interface = TabInterface::GetFromContents(web_contents); CHECK(tab_interface); dialog_widget_ = tab_interface->GetTabFeatures() @@ -38,4 +42,12 @@ SaveAndFillViewDesktop::~SaveAndFillViewDesktop() = default; +void SaveAndFillViewDesktop::OnLegalMessageLinkClicked(const GURL& url) { + web_contents_->OpenURL( + content::OpenURLParams( + url, content::Referrer(), WindowOpenDisposition::NEW_FOREGROUND_TAB, + ui::PAGE_TRANSITION_LINK, /*is_renderer_initiated=*/false), + /*navigation_handle_callback=*/{}); +} + } // namespace autofill
diff --git a/chrome/browser/ui/views/autofill/payments/save_and_fill_view_desktop.h b/chrome/browser/ui/views/autofill/payments/save_and_fill_view_desktop.h index 97b5edb..5531ee41 100644 --- a/chrome/browser/ui/views/autofill/payments/save_and_fill_view_desktop.h +++ b/chrome/browser/ui/views/autofill/payments/save_and_fill_view_desktop.h
@@ -5,6 +5,7 @@ #ifndef CHROME_BROWSER_UI_VIEWS_AUTOFILL_PAYMENTS_SAVE_AND_FILL_VIEW_DESKTOP_H_ #define CHROME_BROWSER_UI_VIEWS_AUTOFILL_PAYMENTS_SAVE_AND_FILL_VIEW_DESKTOP_H_ +#include "base/memory/raw_ptr.h" #include "components/autofill/core/browser/ui/payments/save_and_fill_dialog_view.h" #include "ui/views/widget/widget.h" @@ -28,7 +29,12 @@ ~SaveAndFillViewDesktop() override; private: + void OnLegalMessageLinkClicked(const GURL& url); + + raw_ptr<content::WebContents> web_contents_; std::unique_ptr<views::Widget> dialog_widget_; + + base::WeakPtrFactory<SaveAndFillViewDesktop> weak_ptr_factory_{this}; }; } // namespace autofill
diff --git a/chrome/browser/ui/views/bubble/BUILD.gn b/chrome/browser/ui/views/bubble/BUILD.gn index 944cb77..4e06f4f 100644 --- a/chrome/browser/ui/views/bubble/BUILD.gn +++ b/chrome/browser/ui/views/bubble/BUILD.gn
@@ -18,7 +18,7 @@ "//base", "//chrome/browser:browser_public_dependencies", "//chrome/browser/ui:ui_features", - "//chrome/browser/ui/browser_window:browser_window", + "//chrome/browser/ui/browser_window", "//chrome/browser/ui/webui:webui_util", "//content/public/browser", "//skia",
diff --git a/chrome/browser/ui/views/download/BUILD.gn b/chrome/browser/ui/views/download/BUILD.gn index 7c644a6..fb3ed1f 100644 --- a/chrome/browser/ui/views/download/BUILD.gn +++ b/chrome/browser/ui/views/download/BUILD.gn
@@ -25,10 +25,10 @@ ] deps = [ "//chrome/browser/profiles:profile", + "//chrome/browser/safe_browsing", "//chrome/browser/safe_browsing:advanced_protection", - "//chrome/browser/safe_browsing:safe_browsing", - "//chrome/browser/ui/hats:hats", - "//components/constrained_window:constrained_window", + "//chrome/browser/ui/hats", + "//components/constrained_window", "//components/safe_browsing/core/common:features", "//components/safe_browsing/core/common:safe_browsing_prefs", "//ui/strings:ui_strings_grit", @@ -69,21 +69,21 @@ "//chrome/browser:primitives", "//chrome/browser/profiles:profile", "//chrome/browser/profiles:profile_util", + "//chrome/browser/safe_browsing", "//chrome/browser/safe_browsing:advanced_protection", - "//chrome/browser/safe_browsing:safe_browsing", "//chrome/browser/themes", "//chrome/browser/ui:browser_element_identifiers", "//chrome/browser/ui:browser_list", "//chrome/browser/ui:ui_features", "//chrome/browser/ui/actions:actions_headers", - "//chrome/browser/ui/browser_window:browser_window", + "//chrome/browser/ui/browser_window", "//chrome/browser/ui/color:color_headers", "//chrome/browser/ui/download", - "//chrome/browser/ui/hats:hats", + "//chrome/browser/ui/hats", "//chrome/browser/ui/tabs:tab_strip", "//chrome/browser/ui/views/frame:immersive_mode_controller", "//components/autofill/content/browser", - "//components/constrained_window:constrained_window", + "//components/constrained_window", "//components/feature_engagement/public:feature_constants", "//components/safe_browsing/core/common:features", "//components/safe_browsing/core/common:safe_browsing_policy_handler",
diff --git a/chrome/browser/ui/views/mahi/BUILD.gn b/chrome/browser/ui/views/mahi/BUILD.gn index 7102371f..63182a7 100644 --- a/chrome/browser/ui/views/mahi/BUILD.gn +++ b/chrome/browser/ui/views/mahi/BUILD.gn
@@ -26,7 +26,7 @@ "//chromeos/components/magic_boost/public/cpp", "//chromeos/components/magic_boost/public/cpp/views", "//chromeos/components/mahi/public/cpp", - "//chromeos/constants:constants", + "//chromeos/constants", "//chromeos/strings:strings_grit", "//chromeos/ui/vector_icons", "//components/application_locale_storage",
diff --git a/chrome/browser/ui/views/new_tab_footer/BUILD.gn b/chrome/browser/ui/views/new_tab_footer/BUILD.gn index f33e021c..dd89f404 100644 --- a/chrome/browser/ui/views/new_tab_footer/BUILD.gn +++ b/chrome/browser/ui/views/new_tab_footer/BUILD.gn
@@ -13,7 +13,7 @@ "footer_web_view.h", ] deps = [ - "//base:base", + "//base", "//chrome/browser/profiles:profile", "//chrome/browser/resources/new_tab_footer:resources_grit", "//chrome/browser/ui:ui_features",
diff --git a/chrome/browser/ui/views/page_action/BUILD.gn b/chrome/browser/ui/views/page_action/BUILD.gn index 680a95a..2f1faf3 100644 --- a/chrome/browser/ui/views/page_action/BUILD.gn +++ b/chrome/browser/ui/views/page_action/BUILD.gn
@@ -81,7 +81,7 @@ ":page_action", "//chrome/test:test_support", "//components/tabs:test_support", - "//testing/gmock:gmock", + "//testing/gmock", "//ui/actions:actions_headers", ] }
diff --git a/chrome/browser/ui/views/page_action/page_action_properties_provider.cc b/chrome/browser/ui/views/page_action/page_action_properties_provider.cc index 3d0a1d0..0b016b0 100644 --- a/chrome/browser/ui/views/page_action/page_action_properties_provider.cc +++ b/chrome/browser/ui/views/page_action/page_action_properties_provider.cc
@@ -71,6 +71,7 @@ { .histogram_name = "PwaInstall", .type = PageActionIconType::kPwaInstall, + .element_identifier = kInstallPwaElementId, }, }, {
diff --git a/chrome/browser/ui/views/page_info/BUILD.gn b/chrome/browser/ui/views/page_info/BUILD.gn index 62c0f98d..7ee2e41 100644 --- a/chrome/browser/ui/views/page_info/BUILD.gn +++ b/chrome/browser/ui/views/page_info/BUILD.gn
@@ -10,7 +10,7 @@ ] public_deps = [ - "//base:base", + "//base", "//chrome/browser/ui/page_info", "//components/content_settings/core/common", "//components/page_info/core", @@ -30,7 +30,7 @@ deps = [ ":page_info", - "//base:base", + "//base", "//chrome/browser:browser_public_dependencies", "//chrome/browser:primitives", "//chrome/browser/page_info",
diff --git a/chrome/browser/ui/views/performance_controls/memory_saver_interactive_ui_test.cc b/chrome/browser/ui/views/performance_controls/memory_saver_interactive_ui_test.cc index 7a32d57..68c384d 100644 --- a/chrome/browser/ui/views/performance_controls/memory_saver_interactive_ui_test.cc +++ b/chrome/browser/ui/views/performance_controls/memory_saver_interactive_ui_test.cc
@@ -183,7 +183,7 @@ base::CallbackListSubscription subscription = RecentlyAudibleHelper::FromWebContents( browser()->tab_strip_model()->GetWebContentsAt(0)) - ->RegisterCallbackForTesting( + ->RegisterRecentlyAudibleChangedCallback( base::BindRepeating(&MemorySaverDiscardPolicyInteractiveTest:: OnRecentlyAudibleCallback, base::Unretained(this), kFirstTabContents));
diff --git a/chrome/browser/ui/views/permissions/chip/BUILD.gn b/chrome/browser/ui/views/permissions/chip/BUILD.gn index 57d3d936..096fefb 100644 --- a/chrome/browser/ui/views/permissions/chip/BUILD.gn +++ b/chrome/browser/ui/views/permissions/chip/BUILD.gn
@@ -10,10 +10,10 @@ ] public_deps = [ - "//base:base", - "//chrome/browser/ui/content_settings:content_settings", - "//chrome/browser/ui/views/permissions:permissions", - "//components/permissions:permissions", + "//base", + "//chrome/browser/ui/content_settings", + "//chrome/browser/ui/views/permissions", + "//components/permissions", "//ui/gfx", "//ui/views", ] @@ -28,8 +28,8 @@ deps = [ ":chip", "//chrome/browser:browser_public_dependencies", - "//chrome/browser/themes:themes", - "//chrome/browser/ui/page_info:page_info", + "//chrome/browser/themes", + "//chrome/browser/ui/page_info", "//chrome/browser/ui/views/page_info", ] }
diff --git a/chrome/browser/ui/views/side_panel/BUILD.gn b/chrome/browser/ui/views/side_panel/BUILD.gn index f423e44..d3d2c74 100644 --- a/chrome/browser/ui/views/side_panel/BUILD.gn +++ b/chrome/browser/ui/views/side_panel/BUILD.gn
@@ -103,7 +103,7 @@ "//chrome/browser/ui/customize_chrome", "//chrome/browser/ui/tabs:tab_model", "//chrome/browser/ui/toolbar/pinned_toolbar", - "//chrome/browser/ui/webui/new_tab_footer:new_tab_footer", + "//chrome/browser/ui/webui/new_tab_footer", "//chrome/browser/ui/webui/side_panel/customize_chrome", "//chrome/common", "//chrome/common/read_anything:mojo_bindings", @@ -140,7 +140,7 @@ "//chrome/browser/resources:component_extension_resources", "//chrome/browser/resources:component_extension_resources_grit", "//chrome/browser/search", - "//chrome/browser/search/background:background", + "//chrome/browser/search/background", "//chrome/browser/search_engines", "//chrome/browser/themes", "//chrome/browser/ui:browser_element_identifiers",
diff --git a/chrome/browser/ui/views/side_panel/comments/comments_side_panel_coordinator.cc b/chrome/browser/ui/views/side_panel/comments/comments_side_panel_coordinator.cc index 1363441..40107b5 100644 --- a/chrome/browser/ui/views/side_panel/comments/comments_side_panel_coordinator.cc +++ b/chrome/browser/ui/views/side_panel/comments/comments_side_panel_coordinator.cc
@@ -5,15 +5,25 @@ #include "chrome/browser/ui/views/side_panel/comments/comments_side_panel_coordinator.h" #include "base/functional/callback.h" +#include "chrome/browser/ui/browser_element_identifiers.h" +#include "chrome/browser/ui/browser_window/public/browser_window_features.h" #include "chrome/browser/ui/browser_window/public/browser_window_interface.h" +#include "chrome/browser/ui/tabs/saved_tab_groups/saved_tab_group_utils.h" +#include "chrome/browser/ui/tabs/tab_strip_model_observer.h" +#include "chrome/browser/ui/views/frame/browser_view.h" #include "chrome/browser/ui/views/side_panel/side_panel_coordinator.h" #include "chrome/browser/ui/views/side_panel/side_panel_entry.h" #include "chrome/browser/ui/views/side_panel/side_panel_registry.h" #include "chrome/browser/ui/views/side_panel/side_panel_web_ui_view.h" +#include "chrome/browser/ui/views/toolbar/pinned_toolbar_actions_container.h" +#include "chrome/browser/ui/views/toolbar/toolbar_view.h" #include "chrome/browser/ui/webui/side_panel/comments/comments_side_panel_ui.h" #include "chrome/common/webui_url_constants.h" #include "components/collaboration/public/features.h" +#include "components/saved_tab_groups/public/saved_tab_group.h" +#include "components/saved_tab_groups/public/tab_group_sync_service.h" #include "components/strings/grit/components_strings.h" +#include "components/tab_groups/tab_group_id.h" #include "ui/base/metadata/metadata_impl_macros.h" using SidePanelWebUIViewT_CommentsSidePanelUI = @@ -22,6 +32,108 @@ SidePanelWebUIViewT) END_METADATA +CommentsSidePanelCoordinator::CommentsSidePanelCoordinator( + BrowserView* browser_view) + : browser_view_(browser_view), + tab_group_sync_service_( + tab_groups::SavedTabGroupUtils::GetServiceForProfile( + browser_view->browser()->profile())) { + browser_view->browser()->GetTabStripModel()->AddObserver(this); +} + +CommentsSidePanelCoordinator::~CommentsSidePanelCoordinator() = default; + +void CommentsSidePanelCoordinator::OnTabStripModelChanged( + TabStripModel* tab_strip_model, + const TabStripModelChange& change, + const TabStripSelectionChange& selection) { + // TODO(crbug.com/433773768): This should also handle when the current tab + // group becomes shared or when the active tab is added to a shared group. + if (selection.active_tab_changed()) { + const bool should_show_comments_action = + ShouldShowCommentsAction(selection); + UpdateCommentsActionVisibility(should_show_comments_action); + UpdateCommentsSidePanelVisibility(should_show_comments_action); + } +} + +bool CommentsSidePanelCoordinator::ShouldShowCommentsAction( + const TabStripSelectionChange& selection) { + if (!selection.new_tab) { + return false; + } + + std::optional<tab_groups::TabGroupId> group = selection.new_tab->GetGroup(); + if (!group.has_value()) { + return false; + } + + std::optional<tab_groups::SavedTabGroup> saved_group = + tab_group_sync_service_->GetGroup(group.value()); + + // If the group is shared, we should show the comments action. + return saved_group.has_value() && saved_group->is_shared_tab_group(); +} + +void CommentsSidePanelCoordinator::UpdateCommentsActionVisibility( + bool should_show_comments_action) { + PinnedToolbarActionsContainer* container = + browser_view_->toolbar()->pinned_toolbar_actions_container(); + if (!container) { + return; + } + + if (should_show_comments_action == + container->IsActionPoppedOut(kActionSidePanelShowComments)) { + // Do nothing if the action is already in the correct state. + return; + } + + container->ShowActionEphemerallyInToolbar(kActionSidePanelShowComments, + should_show_comments_action); + + if (should_show_comments_action) { + PinnedActionToolbarButton* button = + container->GetButtonFor(kActionSidePanelShowComments); + CHECK(button); + + button->SetProperty(views::kElementIdentifierKey, + kSharedTabGroupCommentsActionElementId); + } +} + +void CommentsSidePanelCoordinator::UpdateCommentsSidePanelVisibility( + bool should_show_comments_action) { + SidePanelCoordinator* side_panel_coordinator = + browser_view_->browser()->GetFeatures().side_panel_coordinator(); + + // TODO(crbug.com/430352059): This should also handle when a different side + // panel is open. + const bool side_panel_showing = + side_panel_coordinator->IsSidePanelEntryShowing( + SidePanelEntry::Key(SidePanelEntry::Id::kComments)); + + if (should_show_comments_action == side_panel_showing) { + // Do nothing if the side panel is in the correct state. + return; + } + + if (side_panel_showing) { + // Close the side panel, setting the flag to recall the state when the + // comments action is shown again. + side_panel_coordinator->Close(); + side_panel_should_be_resumed_ = true; + return; + } + + if (side_panel_should_be_resumed_) { + // Resume the side panel if it was closed due to changing the active tab. + side_panel_coordinator->Show( + SidePanelEntry::Key(SidePanelEntry::Id::kComments)); + side_panel_should_be_resumed_ = false; + } +} + // static bool CommentsSidePanelCoordinator::IsSupported() { return base::FeatureList::IsEnabled(
diff --git a/chrome/browser/ui/views/side_panel/comments/comments_side_panel_coordinator.h b/chrome/browser/ui/views/side_panel/comments/comments_side_panel_coordinator.h index 5aae991..0ec8e1f 100644 --- a/chrome/browser/ui/views/side_panel/comments/comments_side_panel_coordinator.h +++ b/chrome/browser/ui/views/side_panel/comments/comments_side_panel_coordinator.h
@@ -8,20 +8,38 @@ #include <memory> #include "base/memory/raw_ptr.h" +#include "chrome/browser/ui/tabs/tab_strip_model_observer.h" +class BrowserView; class SidePanelEntryScope; class SidePanelRegistry; +class TabStripModel; +class TabStripModelChange; +struct TabStripSelectionChange; + +namespace tab_groups { +class TabGroupSyncService; +} // namespace tab_groups + namespace views { class View; } // CommentsSidePanelCoordinator handles the creation and registration of // the comments SidePanelEntry. -class CommentsSidePanelCoordinator { +class CommentsSidePanelCoordinator : public TabStripModelObserver { public: - CommentsSidePanelCoordinator() = default; - ~CommentsSidePanelCoordinator() = default; + // TODO(crbug.com/434203413): Remove dependency on BrowserView by implementing + // a PinnedToolbarActionsController. + explicit CommentsSidePanelCoordinator(BrowserView* browser_view); + ~CommentsSidePanelCoordinator() override; + + // TabStripModelObserver + void OnTabStripModelChanged( + TabStripModel* tab_strip_model, + const TabStripModelChange& change, + const TabStripSelectionChange& selection) override; // Returns whether CommentsSidePanelCoordinator is supported. // If this returns false, it should not be registered with the side @@ -36,6 +54,25 @@ // comments side panel entry. std::unique_ptr<views::View> CreateCommentsWebView( SidePanelEntryScope& scope); + + // Determine if the comments action should be shown in the toolbar for the + // active tab. + bool ShouldShowCommentsAction(const TabStripSelectionChange& selection); + + // Updates the visibility of the comments action in the toolbar. + void UpdateCommentsActionVisibility(bool should_show_comments_action); + + // If the comments side panel is open, temporarily closes it and sets the + // side_panel_should_be_resumed_ flag. + void UpdateCommentsSidePanelVisibility(bool should_show_comments_action); + + // Whether the comments side panel was temporarily closed by changing the + // active tab. When the comments action is shown again, this will be used to + // restore the side panel. + bool side_panel_should_be_resumed_ = false; + + raw_ptr<BrowserView> browser_view_; + raw_ptr<tab_groups::TabGroupSyncService> tab_group_sync_service_; }; #endif // CHROME_BROWSER_UI_VIEWS_SIDE_PANEL_COMMENTS_COMMENTS_SIDE_PANEL_COORDINATOR_H_
diff --git a/chrome/browser/ui/views/side_panel/comments/comments_side_panel_coordinator_interactive_uitest.cc b/chrome/browser/ui/views/side_panel/comments/comments_side_panel_coordinator_interactive_uitest.cc new file mode 100644 index 0000000..ec13dfcd --- /dev/null +++ b/chrome/browser/ui/views/side_panel/comments/comments_side_panel_coordinator_interactive_uitest.cc
@@ -0,0 +1,198 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/data_sharing/data_sharing_service_factory.h" +#include "chrome/browser/signin/identity_manager_factory.h" +#include "chrome/browser/tab_group_sync/tab_group_sync_service_factory.h" +#include "chrome/browser/ui/browser.h" +#include "chrome/browser/ui/browser_element_identifiers.h" +#include "chrome/browser/ui/browser_window/public/browser_window_features.h" +#include "chrome/browser/ui/tabs/public/tab_features.h" +#include "chrome/browser/ui/tabs/tab_group_model.h" +#include "chrome/browser/ui/tabs/tab_strip_model.h" +#include "chrome/browser/ui/views/side_panel/comments/comments_side_panel_coordinator.h" +#include "chrome/browser/ui/views/side_panel/side_panel_coordinator.h" +#include "chrome/browser/ui/views/side_panel/side_panel_registry.h" +#include "chrome/browser/ui/views/tabs/tab_strip.h" +#include "chrome/browser/ui/views/test/tab_strip_interactive_test_mixin.h" +#include "chrome/test/interaction/interactive_browser_test.h" +#include "chrome/test/user_education/interactive_feature_promo_test.h" +#include "components/collaboration/public/features.h" +#include "components/data_sharing/public/data_sharing_service.h" +#include "components/data_sharing/public/features.h" +#include "components/data_sharing/public/group_data.h" +#include "components/feature_engagement/public/feature_constants.h" +#include "components/saved_tab_groups/public/features.h" +#include "components/saved_tab_groups/public/tab_group_sync_service.h" +#include "components/signin/public/base/consent_level.h" +#include "components/signin/public/identity_manager/identity_manager.h" +#include "components/signin/public/identity_manager/identity_test_utils.h" +#include "components/tab_groups/tab_group_id.h" +#include "components/tabs/public/tab_group.h" +#include "components/tabs/public/tab_interface.h" +#include "components/user_education/views/help_bubble_view.h" +#include "content/public/test/browser_test.h" +#include "google_apis/gaia/core_account_id.h" +#include "google_apis/gaia/gaia_id.h" +#include "testing/gmock/include/gmock/gmock.h" + +class CommentsSidePanelCoordinatorInteractiveUiTest + : public TabStripInteractiveTestMixin<InteractiveBrowserTest> { + public: + void SetUp() override { + scoped_feature_list_.InitWithFeatures( + { + data_sharing::features::kDataSharingFeature, + collaboration::features::kCollaborationComments, + }, + {}); + InteractiveBrowserTest::SetUp(); + } + + tab_groups::TabGroupId CreateNewTabGroup() { + EXPECT_TRUE( + AddTabAtIndex(0, GURL(url::kAboutBlankURL), ui::PAGE_TRANSITION_TYPED)); + return browser()->tab_strip_model()->AddToNewGroup({0}); + } + + void ShareTabGroup(tab_groups::TabGroupId group_id, + syncer::CollaborationId collaboration_id, + data_sharing::MemberRole member_role, + bool should_sign_in) { + tab_groups::TabGroupSyncService* service = + tab_groups::TabGroupSyncServiceFactory::GetForProfile( + browser()->profile()); + service->MakeTabGroupSharedForTesting(group_id, collaboration_id); + + // Additional Properties. + const std::string display_name = "Display Name"; + const std::string email = "test@mail.com"; + const GURL avatar_url = GURL("chrome://newtab"); + const std::string given_name = "Given Name"; + const std::string access_token = "fake_access_token"; + const GaiaId gaia_id("fake_gaia_id"); + + GaiaId gaia_id_to_use = gaia_id; + if (should_sign_in) { + // Simulate a signed in primary account. + signin::IdentityManager* identity_manager = + IdentityManagerFactory::GetForProfile(browser()->profile()); + signin::MakePrimaryAccountAvailable(identity_manager, email, + signin::ConsentLevel::kSignin); + signin::MakePrimaryAccountAvailable(identity_manager, email, + signin::ConsentLevel::kSync); + CoreAccountInfo account_info = identity_manager->GetPrimaryAccountInfo( + signin::ConsentLevel::kSignin); + + gaia_id_to_use = account_info.gaia; + } + + data_sharing::GroupMember group_member = + data_sharing::GroupMember(gaia_id_to_use, display_name, email, + member_role, avatar_url, given_name); + data_sharing::GroupData group_data = + data_sharing::GroupData(data_sharing::GroupId(collaboration_id.value()), + display_name, {group_member}, {}, access_token); + + data_sharing_service()->AddGroupDataForTesting(std::move(group_data)); + } + + data_sharing::DataSharingService* data_sharing_service() { + data_sharing::DataSharingService* data_sharing_service = + data_sharing::DataSharingServiceFactory::GetForProfile( + browser()->profile()); + return data_sharing_service; + } + + CommentsSidePanelCoordinator* side_panel_coordinator() { + return browser()->GetFeatures().comments_side_panel_coordinator(); + } + + private: + base::test::ScopedFeatureList scoped_feature_list_; +}; + +IN_PROC_BROWSER_TEST_F(CommentsSidePanelCoordinatorInteractiveUiTest, + EntryIsRegistered) { + // The comments entry should be registered in the window registry. + EXPECT_EQ( + browser() + ->GetFeatures() + .side_panel_coordinator() + ->GetWindowRegistry() + ->GetEntryForKey(SidePanelEntry::Key(SidePanelEntry::Id::kComments)) + ->key() + .id(), + SidePanelEntry::Id::kComments); +} + +// Verify the comments action is only shown when the active tab is shared. +IN_PROC_BROWSER_TEST_F(CommentsSidePanelCoordinatorInteractiveUiTest, + CommentActionIsVisible) { + CreateNewTabGroup(); + tab_groups::TabGroupId group_id = CreateNewTabGroup(); + ShareTabGroup(group_id, syncer::CollaborationId("fake_collaboration_id"), + data_sharing::MemberRole::kOwner, /*should_sign_in=*/false); + + const int shared_tab_index = 0; + const int non_shared_tab_index = 1; + const int ungrouped_tab_index = 2; + + browser()->tab_strip_model()->ActivateTabAt(ungrouped_tab_index); + + RunTestSequence( + // Verify the comments action is visible when the active tab is shared. + HoverTabAt(shared_tab_index), ClickMouse(), FinishTabstripAnimations(), + WaitForShow(kSharedTabGroupCommentsActionElementId), + + // Activate non-shared tab. + HoverTabAt(non_shared_tab_index), ClickMouse(), + FinishTabstripAnimations(), + WaitForHide(kSharedTabGroupCommentsActionElementId), + + // Activate ungrouped tab. + HoverTabAt(ungrouped_tab_index), ClickMouse(), FinishTabstripAnimations(), + WaitForHide(kSharedTabGroupCommentsActionElementId), + + // Verify the comments action is visible when the tab is shared. + HoverTabAt(shared_tab_index), ClickMouse(), FinishTabstripAnimations(), + WaitForShow(kSharedTabGroupCommentsActionElementId)); +} + +// Verify the comments side panel will resume visilibity when switching to a +// non-shared tab and back. +IN_PROC_BROWSER_TEST_F(CommentsSidePanelCoordinatorInteractiveUiTest, + CommentSidePanelIsVisible) { + CreateNewTabGroup(); + tab_groups::TabGroupId group_id = CreateNewTabGroup(); + ShareTabGroup(group_id, syncer::CollaborationId("fake_collaboration_id"), + data_sharing::MemberRole::kOwner, /*should_sign_in=*/false); + + const int shared_tab_index = 0; + const int non_shared_tab_index = 1; + const int ungrouped_tab_index = 2; + + browser()->tab_strip_model()->ActivateTabAt(ungrouped_tab_index); + + RunTestSequence( + // Verify the comments side panel can be opened when the active tab is + // shared. + HoverTabAt(shared_tab_index), ClickMouse(), FinishTabstripAnimations(), + WaitForShow(kSharedTabGroupCommentsActionElementId), + PressButton(kSharedTabGroupCommentsActionElementId), + WaitForShow(kSidePanelElementId), + + // Activate non-shared tab. + HoverTabAt(non_shared_tab_index), ClickMouse(), + FinishTabstripAnimations(), WaitForHide(kSidePanelElementId), + + // Activate ungrouped tab. + HoverTabAt(ungrouped_tab_index), ClickMouse(), FinishTabstripAnimations(), + WaitForHide(kSidePanelElementId), + + // Verify the comments side panel is resumed without clicking the comments + // action. + HoverTabAt(shared_tab_index), ClickMouse(), FinishTabstripAnimations(), + WaitForShow(kSidePanelElementId)); +}
diff --git a/chrome/browser/ui/views/toolbar/BUILD.gn b/chrome/browser/ui/views/toolbar/BUILD.gn index a15176a..a6ea453 100644 --- a/chrome/browser/ui/views/toolbar/BUILD.gn +++ b/chrome/browser/ui/views/toolbar/BUILD.gn
@@ -134,7 +134,7 @@ "//chrome/browser/ui/tabs:tab_strip", "//chrome/browser/ui/tabs:tab_strip_model_observer", "//chrome/browser/ui/views/download", - "//chrome/browser/ui/views/page_action:page_action", + "//chrome/browser/ui/views/page_action", "//chrome/browser/ui/views/side_panel:side_panel_enums", "//chrome/browser/ui/web_applications", "//chrome/browser/upgrade_detector",
diff --git a/chrome/browser/ui/views/toolbar/app_menu.cc b/chrome/browser/ui/views/toolbar/app_menu.cc index 3ea0c344..33c8669 100644 --- a/chrome/browser/ui/views/toolbar/app_menu.cc +++ b/chrome/browser/ui/views/toolbar/app_menu.cc
@@ -440,6 +440,13 @@ item->AddChildView(std::move(profile_chip)); item->AddChildView(std::move(profile_chip_edge_spacing_view)); item->SetHighlightWhenSelectedWithChildViews(true); + // MenuItemView only delegates accessible names when its title is empty with a + // single container view. The Profile MenuItemView has a title and multiple + // views. As a result, the accessible name must be manually computed to + // account for the profile chip. + item->GetViewAccessibility().SetName( + views::MenuItemView::GetAccessibleNameForMenuItem( + item->title(), GetSigninStatusChipString(profile), false)); } // AppMenuView is a view that can contain label buttons.
diff --git a/chrome/browser/ui/views/user_education/feature_promo_dialog_interactive_uitest.cc b/chrome/browser/ui/views/user_education/feature_promo_dialog_interactive_uitest.cc index 1007756..3e620cac 100644 --- a/chrome/browser/ui/views/user_education/feature_promo_dialog_interactive_uitest.cc +++ b/chrome/browser/ui/views/user_education/feature_promo_dialog_interactive_uitest.cc
@@ -17,6 +17,7 @@ #include "chrome/browser/apps/app_service/app_registry_cache_waiter.h" #include "chrome/browser/banners/test_app_banner_manager_desktop.h" #include "chrome/browser/profiles/profile.h" +#include "chrome/browser/ui/actions/chrome_action_id.h" #include "chrome/browser/ui/test/test_browser_dialog.h" #include "chrome/browser/ui/ui_features.h" #include "chrome/browser/ui/views/bookmarks/bookmark_bar_view.h" @@ -202,10 +203,8 @@ webapps::TestAppBannerManagerDesktop::FromWebContents(web_contents); app_banner_manager->WaitForInstallableCheck(); EXPECT_TRUE(BrowserView::GetBrowserViewForBrowser(browser()) - ->toolbar() - ->location_bar() - ->page_action_icon_controller() - ->GetIconView(PageActionIconType::kPwaInstall) + ->toolbar_button_provider() + ->GetPageActionView(kActionInstallPwa) ->GetVisible()); browser()->window()->Activate(); ui_test_utils::BrowserActivationWaiter(browser()).WaitForActivation();
diff --git a/chrome/browser/ui/views/web_apps/BUILD.gn b/chrome/browser/ui/views/web_apps/BUILD.gn index 5f90092..0ff6346 100644 --- a/chrome/browser/ui/views/web_apps/BUILD.gn +++ b/chrome/browser/ui/views/web_apps/BUILD.gn
@@ -13,9 +13,9 @@ ] deps = [ "//base", - "//chrome/browser/picture_in_picture:picture_in_picture", + "//chrome/browser/picture_in_picture", "//chrome/browser/picture_in_picture:test_support_ui", - "//chrome/browser/shortcuts:shortcuts", + "//chrome/browser/shortcuts", "//chrome/browser/ui", "//chrome/browser/ui:test_support", "//chrome/browser/web_applications:web_applications_test_support",
diff --git a/chrome/browser/ui/views/web_apps/web_app_integration_test_driver.cc b/chrome/browser/ui/views/web_apps/web_app_integration_test_driver.cc index 9d0e451..d3cc4f80 100644 --- a/chrome/browser/ui/views/web_apps/web_app_integration_test_driver.cc +++ b/chrome/browser/ui/views/web_apps/web_app_integration_test_driver.cc
@@ -57,12 +57,14 @@ #include "chrome/browser/shell_integration.h" #include "chrome/browser/ui/actions/chrome_action_id.h" #include "chrome/browser/ui/browser.h" +#include "chrome/browser/ui/browser_actions.h" #include "chrome/browser/ui/browser_commands.h" #include "chrome/browser/ui/browser_finder.h" #include "chrome/browser/ui/browser_list.h" #include "chrome/browser/ui/browser_window/public/browser_window_features.h" #include "chrome/browser/ui/exclusive_access/exclusive_access_manager.h" #include "chrome/browser/ui/intent_picker_tab_helper.h" +#include "chrome/browser/ui/page_action/page_action_icon_type.h" #include "chrome/browser/ui/startup/startup_browser_creator.h" #include "chrome/browser/ui/startup/web_app_startup_utils.h" #include "chrome/browser/ui/ui_features.h" @@ -1356,7 +1358,15 @@ ASSERT_TRUE(pwa_install_view()->GetVisible()); WebAppTestInstallWithOsHooksObserver install_observer(profile()); install_observer.BeginListening(); - pwa_install_view()->ExecuteForTesting(); + if (IsPageActionMigrated(PageActionIconType::kPwaInstall)) { + actions::ActionManager::Get() + .FindAction(kActionInstallPwa, + browser()->GetActions()->root_action_item()) + ->InvokeAction(); + } else { + browser()->window()->ExecutePageActionIconForTesting( + PageActionIconType::kPwaInstall); + } WaitForAndAcceptInstallDialogForSite(InstallableSiteToSite(site)); @@ -4713,11 +4723,11 @@ return profiles; } -PageActionIconView* WebAppIntegrationTestDriver::pwa_install_view() { - PageActionIconView* pwa_install_view = +IconLabelBubbleView* WebAppIntegrationTestDriver::pwa_install_view() { + IconLabelBubbleView* pwa_install_view = BrowserView::GetBrowserViewForBrowser(browser()) ->toolbar_button_provider() - ->GetPageActionIconView(PageActionIconType::kPwaInstall); + ->GetPageActionView(kActionInstallPwa); CHECK(pwa_install_view); return pwa_install_view; }
diff --git a/chrome/browser/ui/views/web_apps/web_app_integration_test_driver.h b/chrome/browser/ui/views/web_apps/web_app_integration_test_driver.h index 7a72c97..338268f 100644 --- a/chrome/browser/ui/views/web_apps/web_app_integration_test_driver.h +++ b/chrome/browser/ui/views/web_apps/web_app_integration_test_driver.h
@@ -40,7 +40,7 @@ #endif class Browser; -class PageActionIconView; +class IconLabelBubbleView; namespace base { class CommandLine; @@ -501,7 +501,7 @@ Browser* app_browser() { return app_browser_; } WebAppProvider* provider() { return WebAppProvider::GetForTest(profile()); } - PageActionIconView* pwa_install_view(); + IconLabelBubbleView* pwa_install_view(); views::Button* intent_chip_view(); const net::EmbeddedTestServer& GetTestServerForSiteMode(Site site_mode) const;
diff --git a/chrome/browser/ui/views/zoom/BUILD.gn b/chrome/browser/ui/views/zoom/BUILD.gn index cafdf1d..b7b4e11 100644 --- a/chrome/browser/ui/views/zoom/BUILD.gn +++ b/chrome/browser/ui/views/zoom/BUILD.gn
@@ -30,7 +30,7 @@ sources = [ "zoom_view_interactive_ui_tests.cc" ] deps = [ - "//chrome/browser/ui:ui", + "//chrome/browser/ui", "//chrome/browser/ui:ui_features", "//chrome/browser/ui/views/page_action", "//chrome/browser/ui/views/toolbar",
diff --git a/chrome/browser/ui/web_applications/BUILD.gn b/chrome/browser/ui/web_applications/BUILD.gn index 7280e50..61100aa8 100644 --- a/chrome/browser/ui/web_applications/BUILD.gn +++ b/chrome/browser/ui/web_applications/BUILD.gn
@@ -145,8 +145,8 @@ "//chrome/browser/ui/ash/system_web_apps", "//chromeos/ash/components/browser_context_helper", "//chromeos/constants", - "//components/session_manager/core:core", - "//components/user_manager:user_manager", + "//components/session_manager/core", + "//components/user_manager", ] } }
diff --git a/chrome/browser/ui/web_applications/pwa_install_page_action_browsertest.cc b/chrome/browser/ui/web_applications/pwa_install_page_action_browsertest.cc index c0f1ca2..2e307a4f 100644 --- a/chrome/browser/ui/web_applications/pwa_install_page_action_browsertest.cc +++ b/chrome/browser/ui/web_applications/pwa_install_page_action_browsertest.cc
@@ -188,6 +188,10 @@ enabled_features.push_back( {features::kPageActionsMigration, {{features::kPageActionsMigrationPwaInstall.name, "true"}}}); + } else { + enabled_features.push_back( + {features::kPageActionsMigration, + {{features::kPageActionsMigrationPwaInstall.name, "false"}}}); } features_.InitAndEnableFeaturesWithParameters(enabled_features, {});
diff --git a/chrome/browser/ui/webid/identity_dialog_controller.cc b/chrome/browser/ui/webid/identity_dialog_controller.cc index c3e78a95..3747cd4 100644 --- a/chrome/browser/ui/webid/identity_dialog_controller.cc +++ b/chrome/browser/ui/webid/identity_dialog_controller.cc
@@ -22,7 +22,7 @@ // We add nognchecks on these includes so that Android bots do not fail // dependency checks. #if !BUILDFLAG(IS_ANDROID) -#include "chrome/browser/ui/browser_window/public/browser_window_interface.h" +#include "chrome/browser/ui/browser_window/public/browser_window_interface.h" // nogncheck #include "chrome/browser/ui/views/webid/fedcm_account_selection_view_desktop.h" // nogncheck #include "components/tabs/public/tab_interface.h" // nogncheck #endif
diff --git a/chrome/browser/ui/webui/BUILD.gn b/chrome/browser/ui/webui/BUILD.gn index 468dbf1..070079e1 100644 --- a/chrome/browser/ui/webui/BUILD.gn +++ b/chrome/browser/ui/webui/BUILD.gn
@@ -37,7 +37,7 @@ deps = [ ":webui", - "//chrome/browser/optimization_guide:optimization_guide", + "//chrome/browser/optimization_guide", "//chrome/browser/ui", "//chrome/browser/ui/webui/about", "//chrome/browser/ui/webui/accessibility", @@ -47,7 +47,7 @@ "//components/lens:buildflags", "//components/security_interstitials/content:security_interstitial_page", "//content/public/browser", - "//extensions/buildflags:buildflags", + "//extensions/buildflags", "//printing/buildflags", "//skia", "//third_party/abseil-cpp:absl", @@ -106,7 +106,7 @@ } if (enable_dice_support) { - deps += [ "//chrome/browser/ui/webui/signin/signout_confirmation:signout_confirmation" ] + deps += [ "//chrome/browser/ui/webui/signin/signout_confirmation" ] } if (enable_glic) { @@ -151,7 +151,7 @@ ] deps = [ - "//chrome/browser/ui/browser_window:browser_window", + "//chrome/browser/ui/browser_window", "//chrome/browser/ui/tabs:tabs_public", ] }
diff --git a/chrome/browser/ui/webui/ash/borealis_motd/BUILD.gn b/chrome/browser/ui/webui/ash/borealis_motd/BUILD.gn index 765049f..050e115 100644 --- a/chrome/browser/ui/webui/ash/borealis_motd/BUILD.gn +++ b/chrome/browser/ui/webui/ash/borealis_motd/BUILD.gn
@@ -15,8 +15,8 @@ "//chrome/common", "//content/public/browser", "//content/public/common", - "//ui/web_dialogs:web_dialogs", - "//ui/webui:webui", + "//ui/web_dialogs", + "//ui/webui", ] deps = [ "//chrome/browser/resources/chromeos/borealis_motd:resources" ]
diff --git a/chrome/browser/ui/webui/ash/config/BUILD.gn b/chrome/browser/ui/webui/ash/config/BUILD.gn index 2f70474..2c553c4 100644 --- a/chrome/browser/ui/webui/ash/config/BUILD.gn +++ b/chrome/browser/ui/webui/ash/config/BUILD.gn
@@ -61,7 +61,7 @@ "//chrome/browser/ash/system_web_apps/apps/vc_background_ui", "//chrome/browser/ui", "//chrome/browser/ui/ash/holding_space", - "//chrome/browser/ui/views/borealis:borealis", + "//chrome/browser/ui/views/borealis", "//chrome/browser/ui/webui/about", "//chrome/browser/ui/webui/ash/account_manager", "//chrome/browser/ui/webui/ash/add_supervision",
diff --git a/chrome/browser/ui/webui/ash/floating_workspace/BUILD.gn b/chrome/browser/ui/webui/ash/floating_workspace/BUILD.gn index a7c987e..dd187a9 100644 --- a/chrome/browser/ui/webui/ash/floating_workspace/BUILD.gn +++ b/chrome/browser/ui/webui/ash/floating_workspace/BUILD.gn
@@ -28,12 +28,12 @@ "//ash/public/cpp", "//ash/webui/common:trusted_types_util", "//chrome/app:generated_resources", - "//chrome/browser/ash/floating_workspace:floating_workspace", + "//chrome/browser/ash/floating_workspace", "//chrome/browser/resources/chromeos/floating_workspace:resources", - "//chrome/browser/ui/ash/login:login", - "//chrome/browser/ui/webui/ash/internet:internet", - "//chrome/browser/ui/webui/ash/login:login", - "//chromeos/ash/components/browser_context_helper:browser_context_helper", + "//chrome/browser/ui/ash/login", + "//chrome/browser/ui/webui/ash/internet", + "//chrome/browser/ui/webui/ash/login", + "//chromeos/ash/components/browser_context_helper", "//content/public/browser", "//ui/aura", "//ui/base:types",
diff --git a/chrome/browser/ui/webui/ash/lobster/BUILD.gn b/chrome/browser/ui/webui/ash/lobster/BUILD.gn index d793e5e3..5ff85a84 100644 --- a/chrome/browser/ui/webui/ash/lobster/BUILD.gn +++ b/chrome/browser/ui/webui/ash/lobster/BUILD.gn
@@ -17,7 +17,7 @@ public_deps = [ "//base", "//chrome/browser:browser_public_dependencies", - "//chrome/browser/ui/views/bubble:bubble", + "//chrome/browser/ui/views/bubble", "//chrome/browser/ui/webui/ash/mako:mako_bubble", "//chrome/browser/ui/webui/top_chrome", ] @@ -36,7 +36,7 @@ deps = [ ":lobster", - "//ash/public/cpp:cpp", + "//ash/public/cpp", "//base", "//base/test:test_support", "//chrome/test:test_support", @@ -73,7 +73,7 @@ ] traits_headers = [ "lobster_mojom_traits.h" ] - traits_public_deps = [ "//ash/public/cpp:cpp" ] + traits_public_deps = [ "//ash/public/cpp" ] }, ] }
diff --git a/chrome/browser/ui/webui/ash/mako/BUILD.gn b/chrome/browser/ui/webui/ash/mako/BUILD.gn index eec12fb..2feb27d 100644 --- a/chrome/browser/ui/webui/ash/mako/BUILD.gn +++ b/chrome/browser/ui/webui/ash/mako/BUILD.gn
@@ -71,7 +71,7 @@ "//chrome/browser/ash/lobster", "//chrome/browser/profiles:profile", "//chrome/browser/resources/chromeos/mako:resources", - "//chrome/browser/ui/webui/ash/lobster:lobster", + "//chrome/browser/ui/webui/ash/lobster", "//chrome/common:mojo_bindings", "//chromeos/ash/services/orca/public/mojom", "//chromeos/constants",
diff --git a/chrome/browser/ui/webui/ash/settings/BUILD.gn b/chrome/browser/ui/webui/ash/settings/BUILD.gn index b6aa35c6..4e2ec89 100644 --- a/chrome/browser/ui/webui/ash/settings/BUILD.gn +++ b/chrome/browser/ui/webui/ash/settings/BUILD.gn
@@ -74,7 +74,7 @@ "//chrome/browser/resources/ash/settings:resources", "//chrome/browser/resources/settings_shared:resources", "//chrome/browser/ui/ash/wallpaper", - "//chrome/browser/ui/webui/app_management:app_management", + "//chrome/browser/ui/webui/app_management", "//chrome/browser/ui/webui/ash/settings/pages/apps", "//chrome/browser/ui/webui/ash/settings/pages/date_time", "//chrome/browser/ui/webui/ash/settings/pages/device",
diff --git a/chrome/browser/ui/webui/ash/settings/pages/device/display_settings/BUILD.gn b/chrome/browser/ui/webui/ash/settings/pages/device/display_settings/BUILD.gn index 0af724da..0f7c5b4a 100644 --- a/chrome/browser/ui/webui/ash/settings/pages/device/display_settings/BUILD.gn +++ b/chrome/browser/ui/webui/ash/settings/pages/device/display_settings/BUILD.gn
@@ -14,7 +14,7 @@ webui_module_path = "/" public_deps = [ - "//ash/public/mojom:mojom", + "//ash/public/mojom", "//mojo/public/mojom/base", ] }
diff --git a/chrome/browser/ui/webui/ash/settings/pages/main/BUILD.gn b/chrome/browser/ui/webui/ash/settings/pages/main/BUILD.gn index 8fe57ada..a529762 100644 --- a/chrome/browser/ui/webui/ash/settings/pages/main/BUILD.gn +++ b/chrome/browser/ui/webui/ash/settings/pages/main/BUILD.gn
@@ -38,7 +38,7 @@ "//chrome/browser/ui/webui/ash/settings/services/hats", "//chrome/common", "//chrome/common:chrome_features", - "//chromeos/ash/components/browser_context_helper:browser_context_helper", + "//chromeos/ash/components/browser_context_helper", "//components/strings:components_strings", "//components/user_manager", "//content/public/browser",
diff --git a/chrome/browser/ui/webui/ash/settings/pages/people/BUILD.gn b/chrome/browser/ui/webui/ash/settings/pages/people/BUILD.gn index e7a3308..7f7f726 100644 --- a/chrome/browser/ui/webui/ash/settings/pages/people/BUILD.gn +++ b/chrome/browser/ui/webui/ash/settings/pages/people/BUILD.gn
@@ -65,7 +65,7 @@ "//chrome/browser/ui/webui/signin/ash", "//chrome/common", "//chromeos/ash/components/account_manager", - "//chromeos/ash/components/browser_context_helper:browser_context_helper", + "//chromeos/ash/components/browser_context_helper", "//chromeos/ash/components/dbus/userdataauth", "//chromeos/ash/components/osauth/public", "//chromeos/ash/experiences/arc:arc_app_constants",
diff --git a/chrome/browser/ui/webui/ash/settings/pages/personalization/BUILD.gn b/chrome/browser/ui/webui/ash/settings/pages/personalization/BUILD.gn index 445db564..810b49e 100644 --- a/chrome/browser/ui/webui/ash/settings/pages/personalization/BUILD.gn +++ b/chrome/browser/ui/webui/ash/settings/pages/personalization/BUILD.gn
@@ -27,7 +27,7 @@ "//chrome/browser/ui/ash/system_web_apps", "//chrome/browser/ui/webui/ash/settings/pages/multitasking", "//chrome/browser/ui/webui/ash/settings/search", - "//chromeos/ash/components/browser_context_helper:browser_context_helper", + "//chromeos/ash/components/browser_context_helper", "//content/public/browser", ] } @@ -47,7 +47,7 @@ "//chrome/browser/ui/webui/ash/settings/search", "//chrome/common", "//chrome/test:test_support", - "//chromeos/ash/components/browser_context_helper:browser_context_helper", + "//chromeos/ash/components/browser_context_helper", "//components/prefs:test_support", "//components/user_manager:test_support", "//content/test:test_support",
diff --git a/chrome/browser/ui/webui/ash/settings/pages/privacy/BUILD.gn b/chrome/browser/ui/webui/ash/settings/pages/privacy/BUILD.gn index 1c9da6a..f2836621 100644 --- a/chrome/browser/ui/webui/ash/settings/pages/privacy/BUILD.gn +++ b/chrome/browser/ui/webui/ash/settings/pages/privacy/BUILD.gn
@@ -57,7 +57,7 @@ "//chrome/browser/web_applications", "//chrome/common", "//chrome/common:chrome_features", - "//chromeos/ash/components/browser_context_helper:browser_context_helper", + "//chromeos/ash/components/browser_context_helper", "//chromeos/ash/components/dbus/pciguard", "//chromeos/ash/components/dbus/userdataauth", "//chromeos/ash/components/install_attributes",
diff --git a/chrome/browser/ui/webui/ash/settings/pages/reset/BUILD.gn b/chrome/browser/ui/webui/ash/settings/pages/reset/BUILD.gn index 3f07f18e..4f67db3c 100644 --- a/chrome/browser/ui/webui/ash/settings/pages/reset/BUILD.gn +++ b/chrome/browser/ui/webui/ash/settings/pages/reset/BUILD.gn
@@ -21,7 +21,7 @@ "//chrome/browser:browser_public_dependencies", "//chrome/browser/profiles:profile", "//chrome/browser/ui/webui/ash/settings/search", - "//chromeos/ash/components/browser_context_helper:browser_context_helper", + "//chromeos/ash/components/browser_context_helper", "//components/user_manager", "//content/public/browser", "//ui/base",
diff --git a/chrome/browser/ui/webui/ash/settings/pages/search/BUILD.gn b/chrome/browser/ui/webui/ash/settings/pages/search/BUILD.gn index db64fb6d..9334063 100644 --- a/chrome/browser/ui/webui/ash/settings/pages/search/BUILD.gn +++ b/chrome/browser/ui/webui/ash/settings/pages/search/BUILD.gn
@@ -82,7 +82,7 @@ "//chrome/common:non_code_constants", "//chrome/test:test_support", "//chrome/test:test_support_unit", - "//chromeos/ash/components/browser_context_helper:browser_context_helper", + "//chromeos/ash/components/browser_context_helper", "//chromeos/components/magic_boost/test:fake_magic_boost_state", "//chromeos/components/quick_answers:test_support", "//components/user_manager",
diff --git a/chrome/browser/ui/webui/ash/settings/test_support/BUILD.gn b/chrome/browser/ui/webui/ash/settings/test_support/BUILD.gn index dc4c1365..f204325 100644 --- a/chrome/browser/ui/webui/ash/settings/test_support/BUILD.gn +++ b/chrome/browser/ui/webui/ash/settings/test_support/BUILD.gn
@@ -42,7 +42,7 @@ "//ash/public/cpp", "//base/test:test_support", "//chrome/app:generated_resources", - "//chrome/browser/ui/webui/ash/settings:settings", + "//chrome/browser/ui/webui/ash/settings", "//chrome/browser/ui/webui/ash/settings/constants", "//chromeos/ash/components/osauth/impl", "//content/public/browser",
diff --git a/chrome/browser/ui/webui/bluetooth_internals/BUILD.gn b/chrome/browser/ui/webui/bluetooth_internals/BUILD.gn index 23972c3..30fc5ce 100644 --- a/chrome/browser/ui/webui/bluetooth_internals/BUILD.gn +++ b/chrome/browser/ui/webui/bluetooth_internals/BUILD.gn
@@ -40,8 +40,8 @@ if (is_android) { deps += [ - "//components/permissions:permissions", - "//ui/android:android", + "//components/permissions", + "//ui/android", ] } }
diff --git a/chrome/browser/ui/webui/commerce/BUILD.gn b/chrome/browser/ui/webui/commerce/BUILD.gn index 76c7c78..aa7cf7c 100644 --- a/chrome/browser/ui/webui/commerce/BUILD.gn +++ b/chrome/browser/ui/webui/commerce/BUILD.gn
@@ -17,13 +17,13 @@ ] public_deps = [ "//chrome/browser/ui/webui/top_chrome", - "//components/bookmarks/browser:browser", + "//components/bookmarks/browser", "//components/commerce/core:commerce_constants", "//components/commerce/core:shopping_service", "//components/commerce/core/mojom:mojo_bindings", - "//components/commerce/core/subscriptions:subscriptions", + "//components/commerce/core/subscriptions", "//components/commerce/core/webui", - "//components/feature_engagement/public:public", + "//components/feature_engagement/public", "//components/page_image_service/mojom:mojo_bindings", "//ui/views", "//ui/web_dialogs",
diff --git a/chrome/browser/ui/webui/cr_components/theme_color_picker/BUILD.gn b/chrome/browser/ui/webui/cr_components/theme_color_picker/BUILD.gn index 41b781d..53ebe2f 100644 --- a/chrome/browser/ui/webui/cr_components/theme_color_picker/BUILD.gn +++ b/chrome/browser/ui/webui/cr_components/theme_color_picker/BUILD.gn
@@ -11,6 +11,6 @@ "//chrome/browser/new_tab_page/chrome_colors:generate_chrome_colors_info", "//chrome/browser/new_tab_page/chrome_colors:generate_colors_info", "//ui/base/mojom", - "//ui/color:color", + "//ui/color", ] }
diff --git a/chrome/browser/ui/webui/data_sharing/BUILD.gn b/chrome/browser/ui/webui/data_sharing/BUILD.gn index c6fe583..ea8c4eb 100644 --- a/chrome/browser/ui/webui/data_sharing/BUILD.gn +++ b/chrome/browser/ui/webui/data_sharing/BUILD.gn
@@ -8,7 +8,7 @@ sources = [ "data_sharing.mojom" ] public_deps = [ "//components/data_sharing/public/protocol:mojo_bindings", - "//mojo/public/mojom/base:base", + "//mojo/public/mojom/base", ] webui_module_path = "/" }
diff --git a/chrome/browser/ui/webui/new_tab_footer/BUILD.gn b/chrome/browser/ui/webui/new_tab_footer/BUILD.gn index 3ee94cd..650e287a 100644 --- a/chrome/browser/ui/webui/new_tab_footer/BUILD.gn +++ b/chrome/browser/ui/webui/new_tab_footer/BUILD.gn
@@ -20,8 +20,8 @@ "//chrome/browser/ui/webui/top_chrome", "//components/policy/core/browser", "//components/prefs", - "//extensions/browser:browser", - "//ui/menus:menus", + "//extensions/browser", + "//ui/menus", "//ui/webui", ] } @@ -43,11 +43,11 @@ "//chrome/browser/resources/new_tab_shared:resources_grit", "//chrome/browser/search", "//chrome/browser/ui/browser_window", - "//chrome/browser/ui/views/side_panel:side_panel", + "//chrome/browser/ui/views/side_panel", "//chrome/browser/ui/webui:webui_util", - "//chrome/browser/ui/webui/customize_buttons:customize_buttons", + "//chrome/browser/ui/webui/customize_buttons", "//chrome/common", - "//components/search:search", + "//components/search", "//content/public/browser", "//ui/base", ]
diff --git a/chrome/browser/ui/webui/new_tab_page/composebox/composebox_handler.cc b/chrome/browser/ui/webui/new_tab_page/composebox/composebox_handler.cc index 9b33adb..05684bf 100644 --- a/chrome/browser/ui/webui/new_tab_page/composebox/composebox_handler.cc +++ b/chrome/browser/ui/webui/new_tab_page/composebox/composebox_handler.cc
@@ -53,6 +53,8 @@ OpenUrl(query_controller_->CreateAimUrl(query_text, query_start_time), disposition); metrics_recorder_->NotifySessionStateChanged( SessionState::kNavigationOccurred); + metrics_recorder_->RecordQueryMetrics( + query_text.size(), query_controller_->num_files_in_request()); } void ComposeboxHandler::OpenUrl(GURL url, @@ -95,6 +97,8 @@ } std::move(callback).Run(file_info_metadata->file_token_); + metrics_recorder_->RecordFileSizeMetric(file_info_metadata->mime_type_, + file_bytes.size()); query_controller_->StartFileUploadFlow(std::move(file_info_metadata), std::move(file_data), std::move(image_options));
diff --git a/chrome/browser/ui/webui/privacy_sandbox/BUILD.gn b/chrome/browser/ui/webui/privacy_sandbox/BUILD.gn index d844872..7f9d7ce 100644 --- a/chrome/browser/ui/webui/privacy_sandbox/BUILD.gn +++ b/chrome/browser/ui/webui/privacy_sandbox/BUILD.gn
@@ -61,7 +61,7 @@ ":mojo_bindings", ":privacy_sandbox", "//base/test:test_support", - "//chrome/browser/prefs:prefs", + "//chrome/browser/prefs", "//chrome/browser/privacy_sandbox/notice:test_support", "//chrome/test:test_support", "//components/prefs", @@ -85,7 +85,7 @@ deps = [ ":privacy_sandbox", - "//chrome/browser/ui:ui", + "//chrome/browser/ui", "//chrome/browser/ui/tabs:tab_strip", "//chrome/browser/ui/views/privacy_sandbox", "//chrome/test:test_support_ui",
diff --git a/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc b/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc index 7c87f97..6d04ea70 100644 --- a/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc +++ b/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc
@@ -773,6 +773,9 @@ {"glicActivityButton", IDS_SETTINGS_GLIC_PERMISSIONS_ACTIVITY_BUTTON}, {"glicActivityButtonSublabel", IDS_SETTINGS_GLIC_PERMISSIONS_ACTIVITY_BUTTON_SUBLABEL}, + {"glicExtensionsButton", IDS_SETTINGS_GLIC_EXTENSIONS_BUTTON}, + {"glicExtensionsButtonSublabel", + IDS_SETTINGS_GLIC_EXTENSIONS_BUTTON_SUBLABEL}, {"glicActivityButtonUrl", IDS_SETTINGS_GLIC_PERMISSIONS_ACTIVITY_BUTTON_URL}, {"glicTabAccessWhenOn1", @@ -806,10 +809,15 @@ features::kGlicTabAccessToggleLearnMoreURLDataProtected.Get()); html_source->AddString("glicSettingsPageLearnMoreUrl", features::kGlicSettingsPageLearnMoreURL.Get()); + html_source->AddString("glicExtensionsManagementUrl", + features::kGlicExtensionsManagementUrl.Get()); html_source->AddBoolean( "glicClosedCaptionsFeatureEnabled", base::FeatureList::IsEnabled(features::kGlicClosedCaptioning)); html_source->AddBoolean( + "glicExtensionsFeatureEnabled", + base::FeatureList::IsEnabled(features::kGlicExtensions)); + html_source->AddBoolean( "glicUserStatusCheckFeatureEnabled", base::FeatureList::IsEnabled(features::kGlicUserStatusCheck)); html_source->AddBoolean("glicAssetsV2Enabled", base::FeatureList::IsEnabled(
diff --git a/chrome/browser/ui/webui/settings/sync_settings_interactive_uitest.cc b/chrome/browser/ui/webui/settings/sync_settings_interactive_uitest.cc index e1759434..a1cde68 100644 --- a/chrome/browser/ui/webui/settings/sync_settings_interactive_uitest.cc +++ b/chrome/browser/ui/webui/settings/sync_settings_interactive_uitest.cc
@@ -140,18 +140,18 @@ const DeepQuery kTurnHistorySyncOn = {"settings-ui", "settings-main", "settings-people-page-index", - "settings-account-page", + "settings-people-page", "settings-sync-account-control", "cr-button#sync-button"}; const DeepQuery kHistoryOptinAcceptButton = {"history-sync-optin-app", "#acceptButton"}; const DeepQuery kHistoryOptinRejectButton = {"history-sync-optin-app", "#rejectButton"}; - const GURL kAccountSettingsUrl = GURL("chrome://settings/account"); + const GURL kSyncSettingsUrl = GURL("chrome://settings/syncSetup"); RunTestSequence( InstrumentTab(kTabId, 0, browser()), - NavigateWebContents(kTabId, kAccountSettingsUrl), + NavigateWebContents(kTabId, kSyncSettingsUrl), WaitForStateChange(kTabId, PageWithMatchingTitle("Settings")), WaitForStateChange(kTabId, UiElementHasAppeared(kTurnHistorySyncOn)), ClickButton(kTabId, kTurnHistorySyncOn),
diff --git a/chrome/browser/ui/webui/signin/BUILD.gn b/chrome/browser/ui/webui/signin/BUILD.gn index d7c6d1a..0788646 100644 --- a/chrome/browser/ui/webui/signin/BUILD.gn +++ b/chrome/browser/ui/webui/signin/BUILD.gn
@@ -40,7 +40,7 @@ "//base", "//components/signin/public/base", "//components/signin/public/base:signin_buildflags", - "//components/signin/public/identity_manager:identity_manager", + "//components/signin/public/identity_manager", "//url", ] @@ -392,12 +392,12 @@ "//chrome/browser/ui/signin", "//chrome/browser/ui/webui/top_chrome", "//chrome/common", - "//components/policy/core/browser:browser", - "//components/policy/core/common:common", + "//components/policy/core/browser", + "//components/policy/core/common", "//components/prefs", "//components/signin/public/base", "//components/signin/public/identity_manager", - "//components/startup_metric_utils:startup_metric_utils", + "//components/startup_metric_utils", "//components/strings:components_strings", "//components/supervised_user/core/common:features", "//content/public/browser",
diff --git a/chrome/browser/ui/webui/top_chrome/BUILD.gn b/chrome/browser/ui/webui/top_chrome/BUILD.gn index 97901d0..46a408e 100644 --- a/chrome/browser/ui/webui/top_chrome/BUILD.gn +++ b/chrome/browser/ui/webui/top_chrome/BUILD.gn
@@ -61,7 +61,7 @@ "//chrome/browser/ui:ui_features", "//chrome/browser/ui/prefs", "//chrome/common", - "//components/site_engagement/content:content", + "//components/site_engagement/content", "//content/public/browser", "//ui/base", "//ui/webui",
diff --git a/chrome/browser/ui/webui/watermark/BUILD.gn b/chrome/browser/ui/webui/watermark/BUILD.gn index efe987d..d90c323 100644 --- a/chrome/browser/ui/webui/watermark/BUILD.gn +++ b/chrome/browser/ui/webui/watermark/BUILD.gn
@@ -19,6 +19,6 @@ "//chrome/common", "//content/public/browser", "//content/public/common", - "//ui/webui:webui", + "//ui/webui", ] }
diff --git a/chrome/build/android-arm32.pgo.txt b/chrome/build/android-arm32.pgo.txt index de837ce..cd857917 100644 --- a/chrome/build/android-arm32.pgo.txt +++ b/chrome/build/android-arm32.pgo.txt
@@ -1 +1 @@ -chrome-android32-main-1753444792-278e594ceb21901d0083c057278ed3e56f9f629e-b8adc83fcaaadddbd281c738a01518bb24136997.profdata +chrome-android32-main-1753466383-d5c0ecbef1ab5b2b8a1b60a6069af5519ec9fdfd-1016fee0264fb58c317c90fecaf555acf744f14f.profdata
diff --git a/chrome/build/android-arm64.pgo.txt b/chrome/build/android-arm64.pgo.txt index 89b1fd4..dbcb7b8 100644 --- a/chrome/build/android-arm64.pgo.txt +++ b/chrome/build/android-arm64.pgo.txt
@@ -1 +1 @@ -chrome-android64-main-1753462215-1a6c7a95bcc7cf01ed226e5778b66eb9112925c4-4f41019b24842df0a972d7bfbf3e0da447816154.profdata +chrome-android64-main-1753476102-4c56563d1bfeda195f88b02df26aa0c7553cb32d-5766d2805416e3ed65051ff14d279a905ec10f33.profdata
diff --git a/chrome/build/android-desktop-x64.pgo.txt b/chrome/build/android-desktop-x64.pgo.txt index e4f13f578..6668508 100644 --- a/chrome/build/android-desktop-x64.pgo.txt +++ b/chrome/build/android-desktop-x64.pgo.txt
@@ -1 +1 @@ -chrome-android-desktop-x64-main-1753444792-a3e5572a4ae4ee201e7db1156ff85591371449b2-b8adc83fcaaadddbd281c738a01518bb24136997.profdata +chrome-android-desktop-x64-main-1753466383-f6a951e067e4f56fdcc222645072e2d7b82595fd-1016fee0264fb58c317c90fecaf555acf744f14f.profdata
diff --git a/chrome/build/mac-arm.pgo.txt b/chrome/build/mac-arm.pgo.txt index 8d10b90..9c39b44 100644 --- a/chrome/build/mac-arm.pgo.txt +++ b/chrome/build/mac-arm.pgo.txt
@@ -1 +1 @@ -chrome-mac-arm-main-1753459156-0d2939b32e772e5e8db8a79e38c6a14dd184a7de-d679e12bcbda2c603fa9e5dbfbf4c3e645561994.profdata +chrome-mac-arm-main-1753480777-3bf609099bac8b7f79d7f8b0176fca59c3e0151f-0aa81170039c1a7de145865091db290540de488f.profdata
diff --git a/chrome/build/mac.pgo.txt b/chrome/build/mac.pgo.txt index 742f5a5..0d1abb2 100644 --- a/chrome/build/mac.pgo.txt +++ b/chrome/build/mac.pgo.txt
@@ -1 +1 @@ -chrome-mac-main-1753444792-6af79975ee1ef84f827b508d9270596b706dac18-b8adc83fcaaadddbd281c738a01518bb24136997.profdata +chrome-mac-main-1753466383-24fcedf7a9ada49f5b25f16e1198d9877f932138-1016fee0264fb58c317c90fecaf555acf744f14f.profdata
diff --git a/chrome/build/win-arm64.pgo.txt b/chrome/build/win-arm64.pgo.txt index 7547c84d..3cf597fb6 100644 --- a/chrome/build/win-arm64.pgo.txt +++ b/chrome/build/win-arm64.pgo.txt
@@ -1 +1 @@ -chrome-win-arm64-main-1753444792-b2afe06e7c666d00d13f909223b27e0120a1d8bc-b8adc83fcaaadddbd281c738a01518bb24136997.profdata +chrome-win-arm64-main-1753466383-18e721afbdeb79d65cbfe9279b3de61604d33f72-1016fee0264fb58c317c90fecaf555acf744f14f.profdata
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt index f2f24233..68585fdf 100644 --- a/chrome/build/win32.pgo.txt +++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@ -chrome-win32-main-1753444792-79f6b8f6e79badffa6585c8fa048b0f5b7388715-b8adc83fcaaadddbd281c738a01518bb24136997.profdata +chrome-win32-main-1753455521-781fa55618fd89b21ba2997522f6f671122065c1-471970fe60970101bc2cc0b717ced93539e92d13.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt index 9578e2c..8c5cd0db 100644 --- a/chrome/build/win64.pgo.txt +++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@ -chrome-win64-main-1753444792-bf9da62fd564f3015f4daf05cc3bb2efb4c056b7-b8adc83fcaaadddbd281c738a01518bb24136997.profdata +chrome-win64-main-1753455521-078061a290d7a9fabe8ba8e4e08f1e034ebcceaa-471970fe60970101bc2cc0b717ced93539e92d13.profdata
diff --git a/chrome/chrome_elf/BUILD.gn b/chrome/chrome_elf/BUILD.gn index 335a734..21854891 100644 --- a/chrome/chrome_elf/BUILD.gn +++ b/chrome/chrome_elf/BUILD.gn
@@ -166,7 +166,7 @@ deps = [ ":constants", ":nt_registry", - "//base:base", + "//base", "//chrome/install_static:install_static_util", ] }
diff --git a/chrome/common/BUILD.gn b/chrome/common/BUILD.gn index c527797..45f0ff0b 100644 --- a/chrome/common/BUILD.gn +++ b/chrome/common/BUILD.gn
@@ -249,7 +249,7 @@ "//ui/gl", "//ui/message_center/public/cpp", "//ui/native_theme", - "//ui/resources:resources", + "//ui/resources", "//url", ] @@ -263,7 +263,7 @@ "//components/metrics:call_stack_profile_builder", "//components/no_state_prefetch/common", "//components/no_state_prefetch/common:mojo_bindings", - "//components/page_load_metrics/common:common", + "//components/page_load_metrics/common", "//components/pdf/common:constants", "//components/pdf/common:util", ]
diff --git a/chrome/common/chromeos/extensions/BUILD.gn b/chrome/common/chromeos/extensions/BUILD.gn index b60df53..5b37980a 100644 --- a/chrome/common/chromeos/extensions/BUILD.gn +++ b/chrome/common/chromeos/extensions/BUILD.gn
@@ -31,7 +31,7 @@ deps = [ ":resources", - "api:api", + "api", "api:extensions_features", "//base", "//chrome/common:url_constants",
diff --git a/chrome/common/profiler/BUILD.gn b/chrome/common/profiler/BUILD.gn index 77a3260..1fe4897 100644 --- a/chrome/common/profiler/BUILD.gn +++ b/chrome/common/profiler/BUILD.gn
@@ -35,7 +35,7 @@ "//components/metrics:call_stack_profile_builder", "//components/metrics/public/mojom:call_stack_mojo_bindings", "//components/sampling_profiler", - "//components/version_info:version_info", + "//components/version_info", "//content/public/common", "//extensions/buildflags", "//third_party/abseil-cpp:absl", @@ -57,7 +57,7 @@ } if (enable_extensions) { - deps += [ "//extensions/common:common" ] + deps += [ "//extensions/common" ] } friend = [ ":unit_tests" ] @@ -81,7 +81,7 @@ "//components/metrics", "//components/metrics:call_stack_profile_builder", "//components/sampling_profiler", - "//components/version_info:version_info", + "//components/version_info", "//content/public/common", "//extensions/buildflags", ] @@ -91,6 +91,6 @@ } if (enable_extensions) { - deps += [ "//extensions/common:common" ] + deps += [ "//extensions/common" ] } }
diff --git a/chrome/credential_provider/extension/BUILD.gn b/chrome/credential_provider/extension/BUILD.gn index 7846e12b..481012e 100644 --- a/chrome/credential_provider/extension/BUILD.gn +++ b/chrome/credential_provider/extension/BUILD.gn
@@ -38,7 +38,7 @@ ] deps = [ "../gaiacp:util", - "//base:base", + "//base", ] configs += [ "//build/config/win:windowed" ] } @@ -58,8 +58,8 @@ deps = [ ":common", "../gaiacp:util", - "//base:base", - "//net:net", + "//base", + "//net", ] configs += [ "//build/config/win:windowed" ] }
diff --git a/chrome/credential_provider/gaiacp/BUILD.gn b/chrome/credential_provider/gaiacp/BUILD.gn index c4312034..77bac42b 100644 --- a/chrome/credential_provider/gaiacp/BUILD.gn +++ b/chrome/credential_provider/gaiacp/BUILD.gn
@@ -41,7 +41,7 @@ "//components/crash/core/app", "//components/crash/core/common", "//components/version_info", - "//google_apis:google_apis", + "//google_apis", "//url", ] @@ -98,9 +98,9 @@ "//build:branding_buildflags", "//chrome/common:version_header", "//chrome/installer/launcher_support", - "//google_apis:google_apis", + "//google_apis", "//third_party/re2", - "//url:url", + "//url", ] # TODO(crbug.com/40031409): Fix code that adds exit-time destructors and @@ -157,7 +157,7 @@ ":util", "//base", "//build:branding_buildflags", - "//url:url", + "//url", ] } @@ -218,7 +218,7 @@ "//chrome/common:version_header", "//chrome/credential_provider/gaiacp/mojom", "//chrome/installer/launcher_support", - "//components/crash/core/app:app", + "//components/crash/core/app", "//components/crash/core/app:crash_export_thunks", "//components/crash/core/app:run_as_crashpad_handler", "//content/public/browser",
diff --git a/chrome/credential_provider/setup/BUILD.gn b/chrome/credential_provider/setup/BUILD.gn index 54dfc8d..8c32637 100644 --- a/chrome/credential_provider/setup/BUILD.gn +++ b/chrome/credential_provider/setup/BUILD.gn
@@ -86,7 +86,7 @@ "../gaiacp:util", "//build:branding_buildflags", "//chrome/common:version_header", - "//components/crash/core/app:app", + "//components/crash/core/app", "//components/crash/core/app:crash_export_thunks", "//components/crash/core/app:run_as_crashpad_handler", "//components/crash/core/common",
diff --git a/chrome/elevation_service/BUILD.gn b/chrome/elevation_service/BUILD.gn index a0e3912..faef0f8 100644 --- a/chrome/elevation_service/BUILD.gn +++ b/chrome/elevation_service/BUILD.gn
@@ -59,7 +59,7 @@ ] deps = [ - "//base/version_info:version_info", + "//base/version_info", "//chrome/install_static:install_static_util", "//chrome/windows_services/service_program:common", "//components/crx_file",
diff --git a/chrome/enterprise_companion/BUILD.gn b/chrome/enterprise_companion/BUILD.gn index 33c8259..b02bcb0 100644 --- a/chrome/enterprise_companion/BUILD.gn +++ b/chrome/enterprise_companion/BUILD.gn
@@ -214,7 +214,7 @@ "//base", "//base/test:test_support", "//build:branding_buildflags", - "//chrome/enterprise_companion/device_management_storage:device_management_storage", + "//chrome/enterprise_companion/device_management_storage", "//testing/gtest", ] visibility = [ @@ -312,7 +312,7 @@ "//chrome/updater:constants_test", "//chrome/updater:public_sources", "//chrome/updater/protos:omaha_proto", - "//components/named_mojo_ipc_server:named_mojo_ipc_server", + "//components/named_mojo_ipc_server", "//components/policy/core/common", "//components/policy/core/common:common_constants", "//components/policy/core/common:test_support",
diff --git a/chrome/enterprise_companion/installer_win.cc b/chrome/enterprise_companion/installer_win.cc index b964db7..097e2aa 100644 --- a/chrome/enterprise_companion/installer_win.cc +++ b/chrome/enterprise_companion/installer_win.cc
@@ -9,6 +9,7 @@ #include <string> #include "base/base_paths.h" +#include "base/files/file.h" #include "base/files/file_path.h" #include "base/files/file_util.h" #include "base/files/scoped_temp_dir.h" @@ -20,6 +21,8 @@ #include "base/strings/strcat.h" #include "base/strings/strcat_win.h" #include "base/strings/utf_string_conversions.h" +#include "base/threading/platform_thread.h" +#include "base/time/time.h" #include "base/win/registry.h" #include "base/win/windows_types.h" #include "chrome/enterprise_companion/enterprise_companion_branding.h" @@ -30,6 +33,45 @@ namespace enterprise_companion { +namespace { + +#if ENTERPRISE_COMPANION_USE_ICU_DATA_FILE + +// Blocks the calling sequence for up to 10 seconds until a file becomes +// writable. Returns true if the file is eventually writable. This is +// particularly useful for spinning on files which may be be open by other +// processes. +bool WaitForFileWritable(const base::FilePath& path) { + static constexpr base::TimeDelta kMaxWait = base::Seconds(10); + static constexpr base::TimeDelta kLoggingInterval = base::Seconds(2); + base::TimeTicks next_logging_time = base::TimeTicks::Now() + kLoggingInterval; + base::TimeTicks deadline = base::TimeTicks::Now() + kMaxWait; + while (base::TimeTicks::Now() < deadline) { + if ([&path] { + if (!base::PathExists(path)) { + return true; + } + // Consider any failure to open the file to mean that it's in use and + // shouldn't be replaced. + return base::File(path, base::File::FLAG_OPEN | + base::File::FLAG_WRITE | + base::File::FLAG_WIN_SHARE_DELETE) + .IsValid(); + }()) { + return true; + } + if (next_logging_time < base::TimeTicks::Now()) { + VLOG(1) << "Still waiting for " << path << " to become writable."; + next_logging_time += kLoggingInterval; + } + base::PlatformThread::Sleep(base::Milliseconds(100)); + } + return false; +} +#endif // ENTERPRISE_COMPANION_USE_ICU_DATA_FILE + +} // namespace + const wchar_t kAppRegKey[] = L"Software\\" COMPANY_SHORTNAME_STRING "\\Update\\Clients\\" ENTERPRISE_COMPANION_APPID; const wchar_t kRegValuePV[] = L"pv"; @@ -66,10 +108,15 @@ temp_dir.GetPath(), WorkItem::ALWAYS); #if ENTERPRISE_COMPANION_USE_ICU_DATA_FILE if (base::PathExists(source_exe_path.DirName().Append(kIcuDataFileName))) { - install_list->AddCopyTreeWorkItem( - source_exe_path.DirName().Append(kIcuDataFileName), - install_directory->Append(kIcuDataFileName), temp_dir.GetPath(), - WorkItem::ALWAYS); + if (WaitForFileWritable(install_directory->Append(kIcuDataFileName))) { + install_list->AddCopyTreeWorkItem( + source_exe_path.DirName().Append(kIcuDataFileName), + install_directory->Append(kIcuDataFileName), temp_dir.GetPath(), + WorkItem::ALWAYS); + } else { + VLOG(1) << "ICU data file is not writable. It will be omitted from the " + "installation."; + } } #endif install_list->AddCreateRegKeyWorkItem(HKEY_LOCAL_MACHINE, kAppRegKey,
diff --git a/chrome/enterprise_companion/mojom/BUILD.gn b/chrome/enterprise_companion/mojom/BUILD.gn index 1e32540..6b6dd2c 100644 --- a/chrome/enterprise_companion/mojom/BUILD.gn +++ b/chrome/enterprise_companion/mojom/BUILD.gn
@@ -32,7 +32,7 @@ ] visibility = [ - "//chrome/enterprise_companion/mojom:mojom", + "//chrome/enterprise_companion/mojom", "//chrome/updater/mojom:*", ] }
diff --git a/chrome/installer/mac/BUILD.gn b/chrome/installer/mac/BUILD.gn index 1562c287..3136c16a 100644 --- a/chrome/installer/mac/BUILD.gn +++ b/chrome/installer/mac/BUILD.gn
@@ -86,8 +86,8 @@ "//chrome:entitlements", "//chrome/installer/mac/third_party/bsdiff:goobsdiff", "//chrome/installer/mac/third_party/bsdiff:goobspatch", + "//chrome/installer/mac/third_party/xz", "//chrome/installer/mac/third_party/xz:lzma_decompress", - "//chrome/installer/mac/third_party/xz:xz", "//chrome/installer/mac/third_party/xz:xzdec", ]
diff --git a/chrome/installer/setup/BUILD.gn b/chrome/installer/setup/BUILD.gn index 5076e47..7a687dd 100644 --- a/chrome/installer/setup/BUILD.gn +++ b/chrome/installer/setup/BUILD.gn
@@ -38,7 +38,7 @@ "//chrome/install_static:install_static_util", "//chrome/installer/util:with_rc_strings", "//chrome/windows_services/elevated_tracing_service:integration", - "//components/crash/core/app:app", + "//components/crash/core/app", "//components/crash/core/app:crash_export_thunks", "//components/crash/core/app:run_as_crashpad_handler", "//content/public/common:static_switches",
diff --git a/chrome/renderer/BUILD.gn b/chrome/renderer/BUILD.gn index b63333e7..c823717 100644 --- a/chrome/renderer/BUILD.gn +++ b/chrome/renderer/BUILD.gn
@@ -184,7 +184,7 @@ "//components/safe_browsing/content/renderer:throttles", "//components/safe_browsing/core/common", "//components/safe_browsing/core/common:interfaces", - "//components/search:search", + "//components/search", "//components/security_interstitials/content/renderer", "//components/security_interstitials/core:", "//components/security_interstitials/core/common/mojom:", @@ -226,7 +226,7 @@ "//third_party/libwebp", "//third_party/re2", "//third_party/widevine/cdm:buildflags", - "//ui/gfx/geometry:geometry", + "//ui/gfx/geometry", "//ui/surface", "//v8", ] @@ -291,7 +291,7 @@ } if (enable_spellcheck) { - deps += [ "//components/spellcheck/renderer:renderer" ] + deps += [ "//components/spellcheck/renderer" ] } if (enable_printing) { @@ -362,7 +362,7 @@ "//services/screen_ai/buildflags", "//services/screen_ai/public/mojom", "//services/strings", - "//third_party/re2:re2", + "//third_party/re2", ] if (build_with_tflite_lib) {
diff --git a/chrome/services/file_util/BUILD.gn b/chrome/services/file_util/BUILD.gn index 31913a2..ebdacd4c 100644 --- a/chrome/services/file_util/BUILD.gn +++ b/chrome/services/file_util/BUILD.gn
@@ -23,14 +23,14 @@ "//base", "//build:chromeos_buildflags", "//components/safe_browsing:buildflags", - "//extensions/buildflags:buildflags", + "//extensions/buildflags", "//mojo/public/cpp/bindings", "//third_party/zlib", ] public_deps = [ "//chrome/services/file_util/public/mojom", - "//components/safe_browsing/core/common:common", + "//components/safe_browsing/core/common", "//mojo/public/cpp/bindings", "//mojo/public/mojom/base", ] @@ -75,7 +75,7 @@ "single_file_tar_xz_file_extractor.h", ] deps += [ - "//third_party/lzma_sdk:lzma_sdk", + "//third_party/lzma_sdk", "//third_party/lzma_sdk:lzma_sdk_xz", ] } @@ -112,9 +112,9 @@ ":buildflags", "//base", "//build:chromeos_buildflags", - "//chrome/services/file_util/public/mojom:mojom", + "//chrome/services/file_util/public/mojom", "//components/safe_browsing:buildflags", - "//extensions/buildflags:buildflags", + "//extensions/buildflags", "//mojo/public/cpp/bindings", "//testing/gmock", "//third_party/abseil-cpp:absl", @@ -138,7 +138,7 @@ ] if (safe_browsing_mode == 1) { - deps += [ "//chrome/common:common" ] + deps += [ "//chrome/common" ] } if (is_mac) {
diff --git a/chrome/services/sharing/nearby/BUILD.gn b/chrome/services/sharing/nearby/BUILD.gn index 88d88ce..ff37821 100644 --- a/chrome/services/sharing/nearby/BUILD.gn +++ b/chrome/services/sharing/nearby/BUILD.gn
@@ -31,7 +31,7 @@ "//base", "//chrome/services/sharing/public/cpp", "//chromeos/ash/services/nearby/public/mojom", - "//components/cross_device/logging:logging", + "//components/cross_device/logging", "//mojo/public/cpp/bindings", "//third_party/nearby:connections", "//third_party/nearby:connections_credential_proto", @@ -41,9 +41,9 @@ ] deps = [ - "//chromeos/ash/components/nearby/presence/conversions:conversions", + "//chromeos/ash/components/nearby/presence/conversions", "//chromeos/services/network_config/public/mojom", - "//components/cross_device/nearby:nearby", + "//components/cross_device/nearby", ] } @@ -61,7 +61,7 @@ "test_support", "//ash/public/cpp", "//base/test:test_support", - "//chromeos/ash/components/nearby/presence/conversions:conversions", + "//chromeos/ash/components/nearby/presence/conversions", "//chromeos/ash/services/nearby/public/cpp:test_support", "//chromeos/ash/services/network_config/public/cpp:test_support", "//testing/gmock",
diff --git a/chrome/services/sharing/nearby/platform/BUILD.gn b/chrome/services/sharing/nearby/platform/BUILD.gn index bdf9025..badc830 100644 --- a/chrome/services/sharing/nearby/platform/BUILD.gn +++ b/chrome/services/sharing/nearby/platform/BUILD.gn
@@ -96,12 +96,12 @@ "//base", "//chrome/browser/nearby_sharing/common", "//chrome/services/sharing/webrtc", - "//chromeos/ash/components/nearby/presence/conversions:conversions", + "//chromeos/ash/components/nearby/presence/conversions", "//chromeos/ash/services/nearby/public/cpp:tcp_server_socket_port", "//chromeos/ash/services/nearby/public/mojom", "//chromeos/services/network_config/public/mojom", "//components/cross_device/logging", - "//components/cross_device/nearby:nearby", + "//components/cross_device/nearby", "//components/webrtc:thread_wrapper", "//crypto", "//device/bluetooth", @@ -155,19 +155,19 @@ deps = [ ":platform", "//base/test:test_support", - "//chrome/browser/nearby_sharing/common:common", + "//chrome/browser/nearby_sharing/common", "//chrome/services/sharing/nearby/test_support", "//chromeos/ash/components/login/login_state", - "//chromeos/ash/components/nearby/common/connections_manager:connections_manager", + "//chromeos/ash/components/nearby/common/connections_manager", "//chromeos/ash/services/nearby/public/cpp:tcp_server_socket_port", "//chromeos/ash/services/nearby/public/cpp:test_support", "//chromeos/ash/services/nearby/public/mojom", "//chromeos/ash/services/network_config:in_process_instance", "//chromeos/ash/services/network_config/public/cpp:test_support", - "//components/cross_device/nearby:nearby", + "//components/cross_device/nearby", "//components/onc", "//components/prefs:test_support", - "//components/proxy_config:proxy_config", + "//components/proxy_config", "//components/sync_preferences:test_support", "//components/user_manager:test_support", "//device/bluetooth:deprecated_experimental_mojo",
diff --git a/chrome/services/speech/BUILD.gn b/chrome/services/speech/BUILD.gn index 0dde418..97ccdc2 100644 --- a/chrome/services/speech/BUILD.gn +++ b/chrome/services/speech/BUILD.gn
@@ -52,7 +52,7 @@ ] deps += [ "//chromeos/services/machine_learning/public/mojom", - "//components/soda:soda", + "//components/soda", ] } } @@ -83,11 +83,11 @@ ] deps += [ - "//ash/constants:constants", - "//chromeos/services/machine_learning/public/cpp:cpp", + "//ash/constants", + "//chromeos/services/machine_learning/public/cpp", "//chromeos/services/machine_learning/public/cpp:stub", "//chromeos/services/machine_learning/public/mojom", - "//components/soda:soda", + "//components/soda", "//components/soda:test_support", "//content/test:test_support", "//services/audio/public/cpp:test_support",
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn index f1bdf2e..420711d 100644 --- a/chrome/test/BUILD.gn +++ b/chrome/test/BUILD.gn
@@ -11163,6 +11163,7 @@ "../browser/ui/views/permissions/permission_rhs_indicators_interactive_uitest.cc", "../browser/ui/views/privacy_sandbox/privacy_sandbox_dialog_view_interactive_ui_test.cc", "../browser/ui/views/session_crashed_bubble_view_interactive_uitest.cc", + "../browser/ui/views/side_panel/comments/comments_side_panel_coordinator_interactive_uitest.cc", "../browser/ui/views/side_panel/read_anything/read_anything_service_interactive_uitest.cc", "../browser/ui/views/side_panel/read_anything/read_anything_side_panel_controller_interactive_uitest.cc", "../browser/ui/views/web_apps/frame_toolbar/web_app_frame_toolbar_interactive_uitest.cc",
diff --git a/chrome/test/base/ash/interactive/BUILD.gn b/chrome/test/base/ash/interactive/BUILD.gn index fa9416a..15fd9cf 100644 --- a/chrome/test/base/ash/interactive/BUILD.gn +++ b/chrome/test/base/ash/interactive/BUILD.gn
@@ -19,7 +19,7 @@ "//chrome/test/base/ash/interactive/vpn:interactive_ui_tests", "//chrome/test/base/ash/interactive/wifi:interactive_ui_tests", "//content/test:test_support", - "//url:url", + "//url", ] }
diff --git a/chrome/test/base/ash/interactive/bluetooth/BUILD.gn b/chrome/test/base/ash/interactive/bluetooth/BUILD.gn index 0041c5b..f5ab230 100644 --- a/chrome/test/base/ash/interactive/bluetooth/BUILD.gn +++ b/chrome/test/base/ash/interactive/bluetooth/BUILD.gn
@@ -27,7 +27,7 @@ "//chrome/test/base/ash/interactive:test_support", "//chrome/test/base/ash/interactive/settings:test_support", "//chrome/test/base/ash/interactive/webui:test_support", - "//chromeos/ash/services/bluetooth_config:bluetooth_config", + "//chromeos/ash/services/bluetooth_config", "//device/bluetooth", "//ui/base", "//ui/base:test_support",
diff --git a/chrome/test/base/ash/interactive/cellular/BUILD.gn b/chrome/test/base/ash/interactive/cellular/BUILD.gn index bf95dd8..aa19c5e 100644 --- a/chrome/test/base/ash/interactive/cellular/BUILD.gn +++ b/chrome/test/base/ash/interactive/cellular/BUILD.gn
@@ -39,7 +39,7 @@ "//chromeos/strings:strings_grit", "//content/test:test_support", "//dbus", - "//ui/base:base", + "//ui/base", "//ui/base:test_support", "//ui/chromeos/strings:strings_grit", "//ui/message_center",
diff --git a/chrome/test/base/ash/interactive/wifi/BUILD.gn b/chrome/test/base/ash/interactive/wifi/BUILD.gn index ea177aee..ab6a19b 100644 --- a/chrome/test/base/ash/interactive/wifi/BUILD.gn +++ b/chrome/test/base/ash/interactive/wifi/BUILD.gn
@@ -30,7 +30,7 @@ "//chromeos/services/network_config/public/mojom", "//chromeos/strings:strings_grit", "//content/test:test_support", - "//ui/base:base", + "//ui/base", "//ui/base:test_support", "//ui/chromeos/strings:strings_grit", ]
diff --git a/chrome/test/chromedriver/BUILD.gn b/chrome/test/chromedriver/BUILD.gn index 053538a..c1662d38 100644 --- a/chrome/test/chromedriver/BUILD.gn +++ b/chrome/test/chromedriver/BUILD.gn
@@ -73,7 +73,7 @@ } minify_js("minify_bidimapper") { - deps = [ "//third_party/bidimapper:bidimapper" ] + deps = [ "//third_party/bidimapper" ] input_dir = get_label_info("//third_party/bidimapper:bidimapper", "target_gen_dir") in_folder = "$input_dir" @@ -491,7 +491,7 @@ testonly = true deps = [ ":chromedriver_server", - "//chrome:chrome", + "//chrome", ] pydeps_file = "test/run_py_tests.pydeps" @@ -519,7 +519,7 @@ testonly = true deps = [ ":chromedriver_server", - "//chrome:chrome", + "//chrome", ] pydeps_file = "test/run_py_tests.pydeps" @@ -667,7 +667,7 @@ "test/web_view_impl_integrationtest.cc", ] - data_deps = [ "//chrome:chrome" ] + data_deps = [ "//chrome" ] deps = [ ":automation_client_lib",
diff --git a/chrome/test/data/webui/BUILD.gn b/chrome/test/data/webui/BUILD.gn index d1c7b3c..42b7183 100644 --- a/chrome/test/data/webui/BUILD.gn +++ b/chrome/test/data/webui/BUILD.gn
@@ -202,7 +202,7 @@ "//chrome/browser/media/router/discovery/access_code:access_code_cast_feature", "//chrome/browser/optimization_guide", "//chrome/browser/optimization_guide:test_support", - "//chrome/browser/search/background:background", + "//chrome/browser/search/background", "//chrome/browser/ui:ui_features", "//chrome/browser/ui/browser_window", "//chrome/browser/ui/lens", @@ -222,22 +222,22 @@ "//components/history_clusters/core", "//components/history_clusters/history_clusters_internals/webui:constants", "//components/history_embeddings", - "//components/language/core/browser:browser", + "//components/language/core/browser", "//components/lens:enterprise_policy", "//components/lens:features", "//components/optimization_guide/core", "//components/optimization_guide/optimization_guide_internals/webui:url_constants", "//components/password_manager/content/browser", "//components/password_manager/content/common", - "//components/performance_manager:performance_manager", + "//components/performance_manager", "//components/power_bookmarks/core:features", "//components/privacy_sandbox:features", - "//components/privacy_sandbox/privacy_sandbox_attestations:privacy_sandbox_attestations", + "//components/privacy_sandbox/privacy_sandbox_attestations", "//components/privacy_sandbox/privacy_sandbox_attestations:test_support", "//components/safe_browsing/core/common", "//components/search", "//components/site_engagement/content", - "//components/spellcheck/browser:browser", + "//components/spellcheck/browser", "//components/user_education/common", "//net:test_support", ] @@ -246,7 +246,7 @@ if (is_chromeos) { deps += [ "//ash/webui/boca_ui:constants", - "//ash/webui/sanitize_ui:sanitize_ui", + "//ash/webui/sanitize_ui", "//ash/webui/shimless_rma", "//ash/webui/vc_background_ui", "//chrome/browser/ash/crostini:test_support", @@ -257,9 +257,9 @@ "//chrome/browser/nearby_sharing/common", "//chrome/browser/ui/webui/ash/extended_updates", "//chrome/browser/ui/webui/ash/login", - "//chrome/browser/ui/webui/ash/settings:settings", + "//chrome/browser/ui/webui/ash/settings", "//components/manta", - "//components/proxy_config:proxy_config", + "//components/proxy_config", ] } if (enable_compose) {
diff --git a/chrome/test/data/webui/chromeos/ash_common/BUILD.gn b/chrome/test/data/webui/chromeos/ash_common/BUILD.gn index ab3ec86f..a34cc45 100644 --- a/chrome/test/data/webui/chromeos/ash_common/BUILD.gn +++ b/chrome/test/data/webui/chromeos/ash_common/BUILD.gn
@@ -107,7 +107,7 @@ deps = [ "..:chai_assert", "//ash/webui/common/resources:navigation_selector", - "//third_party/polymer/v3_0/components-chromium/iron-collapse:iron-collapse", + "//third_party/polymer/v3_0/components-chromium/iron-collapse", ] externs_list = [ "$externs_path/mocha-2.5.js" ] }
diff --git a/chrome/test/data/webui/glic/api_test.ts b/chrome/test/data/webui/glic/api_test.ts index 82baed3..24d00cb 100644 --- a/chrome/test/data/webui/glic/api_test.ts +++ b/chrome/test/data/webui/glic/api_test.ts
@@ -33,13 +33,17 @@ private writeIndex = 0; private subscriber: Subscriber; + // The last value read from `next()`, or undefined if none was read. + current: T|undefined; + constructor(observable: Observable<T>) { this.subscriber = observable.subscribe(this.change.bind(this)); } - next(): Promise<T> { + async next(): Promise<T> { // Wrapping the returned value with `waitFor` improves failure logs // on timeout. - return waitFor(this.getSignal(this.readIndex++).promise); + this.current = await waitFor(this.getSignal(this.readIndex++).promise); + return this.current; } isEmpty(): boolean { return this.readIndex === this.writeIndex; @@ -50,11 +54,11 @@ waitForValue(targetValue: T) { return this.waitFor(v => v === targetValue); } - async waitFor(condition: (v: T) => boolean) { + async waitFor(condition: (v: T) => boolean): Promise<T> { while (true) { const val = await this.next(); if (condition(val)) { - return; + return val; } console.info(`waitFor saw and ignored ${JSON.stringify(val)}`); } @@ -559,7 +563,9 @@ await this.host.getContextFromFocusedTab?.({}); } catch (e) { assertEquals( - 'tabContext failed: permission denied', (e as Error).message); + 'tabContext failed: permission denied:' + + ' context permission not enabled', + (e as Error).message); } } @@ -747,7 +753,8 @@ assertEquals('', profileInfo.givenName); assertEquals(false, profileInfo.isManaged!); assertTrue((profileInfo.localProfileName?.length ?? 0) > 0); - assertEquals('Your Chromium', profileInfo.localProfileName); + // Can be 'Your Chrome' or 'Your Chromium'. + assertEquals('Your C', profileInfo.localProfileName?.substring(0, 6)); } async testGetUserProfileInfoDoesNotDeferWhenInactive() { @@ -756,7 +763,8 @@ await this.closePanelAndWaitUntilInactive(); const profileInfo: UserProfileInfo = await this.host.getUserProfileInfo(); assertEquals('glic-test@example.com', profileInfo.email); - assertEquals('Your Chromium', profileInfo.localProfileName); + // Can be 'Your Chrome' or 'Your Chromium'. + assertEquals('Your C', profileInfo.localProfileName?.substring(0, 6)); } async testRefreshSignInCookies() { @@ -1024,6 +1032,72 @@ } } + async testPinTabs() { + // Pin the focused tab and verify it's sent. + assertTrue(!!this.host.pinTabs); + assertTrue(!!this.host.getPinnedTabs); + const focus = this.host.getFocusedTabStateV2?.().getCurrentValue(); + const tabId = checkDefined(focus?.hasFocus?.tabData.tabId); + await this.host.pinTabs([tabId]); + const pinnedTabsUpdates = observeSequence(this.host.getPinnedTabs()); + await pinnedTabsUpdates.waitFor( + (tabs) => tabs.length === 1 && tabs[0]?.tabId === tabId); + } + + // Helper for `testFetchInactiveTabScreenshot` and + // `testFetchInactiveTabScreenshotWhileMinimized`. + async fetchInactiveTabScreenshot() { + assertTrue(!!this.host.getFocusedTabStateV2); + assertTrue(!!this.host.getContextFromTab); + assertTrue(!!this.host.pinTabs); + assertTrue(!!this.host.getPinnedTabs); + + // Pin the focused tab. + const focusSequence = observeSequence(this.host.getFocusedTabStateV2()); + let focus = await focusSequence.next(); + const tabId = checkDefined(focus?.hasFocus?.tabData.tabId); + await this.host.pinTabs([tabId]); + + // Select the other tab. + await this.advanceToNextStep(); + focus = await focusSequence.waitFor( + (f) => !!f.hasFocus && f.hasFocus.tabData.tabId !== tabId); + + // Get context and verify we have a screenshot. + const context = await this.host.getContextFromTab(tabId, { + viewportScreenshot: true, + }); + return context; + } + + async testFetchInactiveTabScreenshot() { + const context = await this.fetchInactiveTabScreenshot(); + const screenshot = checkDefined(context.viewportScreenshot); + assertEquals(screenshot.mimeType, 'image/jpeg'); + assertTrue(screenshot.data.byteLength > 0); + assertTrue(screenshot.widthPixels > 0); + assertTrue(screenshot.heightPixels > 0); + } + + async testFetchInactiveTabScreenshotWhileMinimized() { + const shouldGetScreenshot = this.testParams; + // Tests fetching the screenshot of a tab while the browser is minimized. + // Ideally this would work, but it currently times out and provides no + // screenshot on some platforms. + const context = await this.fetchInactiveTabScreenshot(); + + if (shouldGetScreenshot) { + assertTrue(!!context.viewportScreenshot); + } else { + // For platforms where screenshotting fails while minimized, it fails + // randomly, so we don't assert anything here. This test at least confirms + // screenshotting does not hang forever. + // Note: I've tried adding a sleep between minimizing the window and + // capturing the screenshot, but it still succeeds randomly. + } + } + + async testReloadWebUi() {} private async assertCreateTabFails(url: string) { @@ -1492,6 +1566,13 @@ } } +function checkDefined<T>(v: T|undefined): T { + if (v === undefined) { + throw new Error('checkDefined: value is undefined'); + } + return v; +} + function sleep(timeoutMs: number): Promise<void> { return new Promise((resolve) => { window.setTimeout(resolve, timeoutMs);
diff --git a/chrome/test/data/webui/glic/test_client/client.ts b/chrome/test/data/webui/glic/test_client/client.ts index c90160f..fb935ec0 100644 --- a/chrome/test/data/webui/glic/test_client/client.ts +++ b/chrome/test/data/webui/glic/test_client/client.ts
@@ -2,11 +2,10 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import type {FocusedTabData, GlicBrowserHost, GlicWebClient, Observable, OpenPanelInfo, PanelOpeningData, PanelState, ViewChangeRequest, WebClientInitializeError} from '/glic/glic_api/glic_api.js'; +import type {FocusedTabData, GlicBrowserHost, GlicWebClient, Observable, OpenPanelInfo, PanelOpeningData, PanelState, WebClientInitializeError} from '/glic/glic_api/glic_api.js'; import {WebClientInitializeErrorReason, WebClientMode} from '/glic/glic_api/glic_api.js'; import {$} from './page_element_types.js'; -import {requestViewChange} from './sections/view.js'; export function logMessage(message: string) { const d = new Date(); @@ -213,10 +212,6 @@ // Nothing need to be checked on the test client. } - requestViewChange(request: ViewChangeRequest) { - requestViewChange(request); - } - getInitialized(): Promise<void> { return new Promise<void>((resolve) => { if (this.initialized) {
diff --git a/chrome/test/data/webui/glic/test_client/index.html b/chrome/test/data/webui/glic/test_client/index.html index 9c80aa5..f1657326 100644 --- a/chrome/test/data/webui/glic/test_client/index.html +++ b/chrome/test/data/webui/glic/test_client/index.html
@@ -509,6 +509,7 @@ <h1>Multi-Tab</h1> <button id="pinFocusedTab">Share Current</button> <button id="fetchPinned">⬆️ </button> + <label>Fetch Screenshot?<input id="multiTabFetchScreenshot" type="checkbox"/></label> <button id="unpin">❌</button> <p>Shared</p> <ul id="pinnedTabs">
diff --git a/chrome/test/data/webui/glic/test_client/page_element_types.ts b/chrome/test/data/webui/glic/test_client/page_element_types.ts index 550be24a..a86fee3 100644 --- a/chrome/test/data/webui/glic/test_client/page_element_types.ts +++ b/chrome/test/data/webui/glic/test_client/page_element_types.ts
@@ -137,6 +137,7 @@ viewChangedCurrentView: HTMLSelectElement; viewChangedAutomaticallyAccept: HTMLInputElement; mqlsClientIdBtn: HTMLButtonElement; + multiTabFetchScreenshot: HTMLInputElement; } export const $: PageElementTypes = new Proxy({}, {
diff --git a/chrome/test/data/webui/glic/test_client/sections/multi_tab.ts b/chrome/test/data/webui/glic/test_client/sections/multi_tab.ts index 5f7661c..be0d37a 100644 --- a/chrome/test/data/webui/glic/test_client/sections/multi_tab.ts +++ b/chrome/test/data/webui/glic/test_client/sections/multi_tab.ts
@@ -81,8 +81,10 @@ if (!tabState.tabData.isObservable && observableTabOnly) { return update; } + try { - const viewportScreenshot = observableTabOnly; + const viewportScreenshot = + observableTabOnly || $.multiTabFetchScreenshot.checked; const annotatedPageContent = true; const pdfData = true; const pdfSizeLimit = DEFAULT_PDF_SIZE_LIMIT;
diff --git a/chrome/test/data/webui/glic/test_client/sections/view.ts b/chrome/test/data/webui/glic/test_client/sections/view.ts index 06d3e9b..64624527 100644 --- a/chrome/test/data/webui/glic/test_client/sections/view.ts +++ b/chrome/test/data/webui/glic/test_client/sections/view.ts
@@ -8,7 +8,7 @@ import {client, logMessage} from '../client.js'; import {$} from '../page_element_types.js'; -window.addEventListener('load', () => { +window.addEventListener('load', async () => { for (const [key, value] of Object.entries(ClientView)) { const option = document.createElement('option'); option.textContent = `${key}: ${value}`; @@ -25,19 +25,20 @@ client.browser!.onViewChanged!({currentView}); }); - client.getInitialized().then(async () => { - if (!client?.browser?.onViewChanged) { - $.viewChangedBtn.disabled = true; - $.viewChangedAutomaticallyAccept.checked = false; - $.viewChangedAutomaticallyAccept.disabled = true; - } - }); -}); + await client.getInitialized(); -export function requestViewChange(request: ViewChangeRequest) { - logMessage(`requestViewChange(${JSON.stringify(request)})`); - if ($.viewChangedAutomaticallyAccept.checked) { - $.viewChangedCurrentView.value = request.desiredView; - client.browser!.onViewChanged!({currentView: request.desiredView}); + if (!client.browser?.onViewChanged) { + $.viewChangedBtn.disabled = true; + $.viewChangedAutomaticallyAccept.checked = false; + $.viewChangedAutomaticallyAccept.disabled = true; } -} + + client.browser?.getViewChangeRequests?.()?.subscribe( + (request: ViewChangeRequest) => { + logMessage(`requestViewChange(${JSON.stringify(request)})`); + if ($.viewChangedAutomaticallyAccept.checked) { + $.viewChangedCurrentView.value = request.desiredView; + client.browser!.onViewChanged!({currentView: request.desiredView}); + } + }); +});
diff --git a/chrome/test/data/webui/new_tab_page/composebox/composebox_test.ts b/chrome/test/data/webui/new_tab_page/composebox/composebox_test.ts index 1db6026..ae954d6 100644 --- a/chrome/test/data/webui/new_tab_page/composebox/composebox_test.ts +++ b/chrome/test/data/webui/new_tab_page/composebox/composebox_test.ts
@@ -9,6 +9,8 @@ import {$$} from 'chrome://new-tab-page/new_tab_page.js'; import {loadTimeData} from 'chrome://resources/js/load_time_data.js'; import {assertDeepEquals, assertEquals, assertFalse, assertTrue} from 'chrome://webui-test/chai_assert.js'; +import type {MetricsTracker} from 'chrome://webui-test/metrics_test_support.js'; +import {fakeMetricsPrivate} from 'chrome://webui-test/metrics_test_support.js'; import type {TestMock} from 'chrome://webui-test/test_mock.js'; import {eventToPromise, microtasksFinished} from 'chrome://webui-test/test_util.js'; @@ -25,6 +27,7 @@ let composeboxElement: ComposeboxElement; let handler: TestMock<PageHandlerRemote>; let callbackRouterRemote: PageRemote; + let metrics: MetricsTracker; setup(() => { document.body.innerHTML = window.trustedTypes!.emptyHTML; @@ -34,6 +37,7 @@ new ComposeboxProxyImpl(mock, new PageCallbackRouter()))); callbackRouterRemote = ComposeboxProxyImpl.getInstance() .callbackRouter.$.bindNewPipeAndPassRemote(); + metrics = fakeMetricsPrivate(); }); function createComposeboxElement() { @@ -209,6 +213,11 @@ // Cleanup event listener. document.body.removeEventListener( 'cr-a11y-announcer-messages-sent', updateAnnouncementCount); + assertEquals( + 1, + metrics.count( + 'NewTabPage.Composebox.File.WebUI.UploadAttemptFailure', + 0)); }); }); @@ -228,6 +237,10 @@ assertEquals(handler.getCallCount('addFile'), 0); const files = composeboxElement.$.carousel.files; assertEquals(files.length, 0); + assertEquals( + 1, + metrics.count( + 'NewTabPage.Composebox.File.WebUI.UploadAttemptFailure', 2)); }); test('upload large file fails', async () => { @@ -251,6 +264,10 @@ assertEquals(handler.getCallCount('addFile'), 0); const files = composeboxElement.$.carousel.files; assertEquals(files.length, 0); + assertEquals( + 1, + metrics.count( + 'NewTabPage.Composebox.File.WebUI.UploadAttemptFailure', 3)); }); [[
diff --git a/chrome/test/data/webui/settings/people_page_test.ts b/chrome/test/data/webui/settings/people_page_test.ts index 830b19f..64bacb2 100644 --- a/chrome/test/data/webui/settings/people_page_test.ts +++ b/chrome/test/data/webui/settings/people_page_test.ts
@@ -6,38 +6,40 @@ import 'chrome://settings/lazy_load.js'; import {webUIListenerCallback} from 'chrome://resources/js/cr.js'; +// <if expr="not is_chromeos"> +import {listenOnce} from 'chrome://resources/js/util.js'; +// </if> + import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; +// <if expr="not is_chromeos"> +import type {CrCheckboxElement} from 'chrome://settings/lazy_load.js'; +// </if> + import {loadTimeData} from 'chrome://settings/settings.js'; import type {SettingsPeoplePageElement} from 'chrome://settings/settings.js'; import {ProfileInfoBrowserProxyImpl, Router, routes, SignedInState, StatusAction, SyncBrowserProxyImpl} from 'chrome://settings/settings.js'; import {assertEquals, assertFalse, assertTrue} from 'chrome://webui-test/chai_assert.js'; +// <if expr="not is_chromeos"> +import {assertLT} from 'chrome://webui-test/chai_assert.js'; +import {flushTasks} from 'chrome://webui-test/polymer_test_util.js'; +import {waitBeforeNextRender} from 'chrome://webui-test/polymer_test_util.js'; + +// </if> import {simulateSyncStatus} from './sync_test_util.js'; -import {TestProfileInfoBrowserProxy} from './test_profile_info_browser_proxy.js'; -import {TestSyncBrowserProxy} from './test_sync_browser_proxy.js'; - // <if expr="not is_chromeos"> -import {listenOnce} from 'chrome://resources/js/util.js'; -import type {CrCheckboxElement} from 'chrome://settings/lazy_load.js'; -import {assertLT} from 'chrome://webui-test/chai_assert.js'; -import {flushTasks, waitBeforeNextRender} from 'chrome://webui-test/polymer_test_util.js'; -import type {StoredAccount} from 'chrome://settings/settings.js'; -import { isChildVisible } from 'chrome://webui-test/test_util.js'; - import {simulateStoredAccounts} from './sync_test_util.js'; // </if> +import {TestProfileInfoBrowserProxy} from './test_profile_info_browser_proxy.js'; +import {TestSyncBrowserProxy} from './test_sync_browser_proxy.js'; + // clang-format on let peoplePage: SettingsPeoplePageElement; let profileInfoBrowserProxy: TestProfileInfoBrowserProxy; let syncBrowserProxy: TestSyncBrowserProxy; -function reset() { - peoplePage.remove(); - Router.getInstance().navigateTo(routes.BASIC); -} - suite('ProfileInfoTests', function() { suiteSetup(function() { // <if expr="is_chromeos"> @@ -65,7 +67,7 @@ }); teardown(function() { - reset(); + peoplePage.remove(); }); test('GetProfileInfo', function() { @@ -112,7 +114,7 @@ }); teardown(function() { - reset(); + peoplePage.remove(); }); test('ShowCorrectRows', async function() { @@ -136,8 +138,9 @@ suite('SyncStatusTests', function() { setup(function() { - loadTimeData.overrideValues( - {signinAllowed: true, replaceSyncPromosWithSignInPromos: false}); + loadTimeData.overrideValues({ + signinAllowed: true, + }); syncBrowserProxy = new TestSyncBrowserProxy(); SyncBrowserProxyImpl.setInstance(syncBrowserProxy); @@ -150,7 +153,7 @@ }); teardown(function() { - reset(); + peoplePage.remove(); }); test('Toast', function() { @@ -173,31 +176,45 @@ assertFalse(!!peoplePage.shadowRoot!.querySelector('#profile-row')); // The control element should exist when policy allows. - assertTrue(isChildVisible(peoplePage, 'settings-sync-account-control')); + const accountControl = + peoplePage.shadowRoot!.querySelector('settings-sync-account-control')!; + assertTrue(window.getComputedStyle(accountControl)['display'] !== 'none'); // Control element doesn't exist when policy forbids sync. simulateSyncStatus({ syncSystemEnabled: false, statusAction: StatusAction.NO_ACTION, }); - assertFalse(isChildVisible(peoplePage, '#manage-google-account')); + assertEquals('none', window.getComputedStyle(accountControl)['display']); - // Do not show Google Account when sync status could not be retrieved. + const manageGoogleAccount = + peoplePage.shadowRoot!.querySelector('#manage-google-account')!; + + // Do not show Google Account when stored accounts or sync status + // could not be retrieved. + simulateStoredAccounts(undefined); + simulateSyncStatus(undefined); + assertEquals( + 'none', window.getComputedStyle(manageGoogleAccount)['display']); + simulateStoredAccounts([]); simulateSyncStatus(undefined); - assertFalse(isChildVisible(peoplePage, '#manage-google-account')); + assertEquals( + 'none', window.getComputedStyle(manageGoogleAccount)['display']); + + simulateStoredAccounts(undefined); + simulateSyncStatus({ + statusAction: StatusAction.NO_ACTION, + }); + assertEquals( + 'none', window.getComputedStyle(manageGoogleAccount)['display']); simulateStoredAccounts([]); simulateSyncStatus({ statusAction: StatusAction.NO_ACTION, }); - assertFalse(isChildVisible(peoplePage, '#manage-google-account')); - - simulateStoredAccounts([]); - simulateSyncStatus({ - statusAction: StatusAction.NO_ACTION, - }); - assertFalse(isChildVisible(peoplePage, '#manage-google-account')); + assertEquals( + 'none', window.getComputedStyle(manageGoogleAccount)['display']); // A stored account with sync off but no error should result in the // Google Account being shown. @@ -207,7 +224,8 @@ hasError: false, statusAction: StatusAction.NO_ACTION, }); - assertTrue(isChildVisible(peoplePage, '#manage-google-account')); + assertTrue( + window.getComputedStyle(manageGoogleAccount)['display'] !== 'none'); // A stored account with sync off and error should not result in the // Google Account being shown. @@ -217,7 +235,8 @@ hasError: true, statusAction: StatusAction.NO_ACTION, }); - assertFalse(isChildVisible(peoplePage, '#manage-google-account')); + assertEquals( + 'none', window.getComputedStyle(manageGoogleAccount)['display']); // A stored account with sync on but no error should result in the // Google Account being shown. @@ -227,7 +246,8 @@ hasError: false, statusAction: StatusAction.NO_ACTION, }); - assertTrue(isChildVisible(peoplePage, '#manage-google-account')); + assertTrue( + window.getComputedStyle(manageGoogleAccount)['display'] !== 'none'); // A stored account with sync on but with error should not result in // the Google Account being shown. @@ -237,7 +257,8 @@ hasError: true, statusAction: StatusAction.NO_ACTION, }); - assertFalse(isChildVisible(peoplePage, '#manage-google-account')); + assertEquals( + 'none', window.getComputedStyle(manageGoogleAccount)['display']); }); test('SignOutNavigationNormalProfile', async function() { @@ -414,7 +435,7 @@ }); teardown(function() { - reset(); + peoplePage.remove(); }); test('ShowCorrectSyncRow', function() { @@ -433,156 +454,3 @@ assertEquals(Router.getInstance().getCurrentRoute(), routes.SYNC); }); }); - -// <if expr="not is_chromeos"> -suite('PeoplePageAccountSettings', function() { - setup(function() { - loadTimeData.overrideValues( - {signinAllowed: true, replaceSyncPromosWithSignInPromos: true}); - - syncBrowserProxy = new TestSyncBrowserProxy(); - SyncBrowserProxyImpl.setInstance(syncBrowserProxy); - - profileInfoBrowserProxy = new TestProfileInfoBrowserProxy(); - ProfileInfoBrowserProxyImpl.setInstance(profileInfoBrowserProxy); - - document.body.innerHTML = window.trustedTypes!.emptyHTML; - peoplePage = document.createElement('settings-people-page'); - document.body.appendChild(peoplePage); - }); - - teardown(function() { - reset(); - }); - - async function simulateSignedInState( - state: SignedInState, accounts: StoredAccount[]) { - await syncBrowserProxy.whenCalled('getSyncStatus'); - simulateSyncStatus({ - signedInState: state, - syncSystemEnabled: true, - hasError: false, - statusAction: StatusAction.NO_ACTION, - }); - await flush(); - - await syncBrowserProxy.whenCalled('getStoredAccounts'); - simulateStoredAccounts(accounts); - return flush(); - } - - test('ShowCorrectRowsSignedIn', async function() { - await simulateSignedInState( - SignedInState.SIGNED_IN, [{email: 'foo@foo.com'}]); - - // The account card and the profile should not exist. Instead, there is a - // link row which leads to the account settings page. - assertFalse(isChildVisible(peoplePage, 'settings-sync-account-control')); - assertFalse(isChildVisible(peoplePage, '#profile-row')); - assertTrue(isChildVisible(peoplePage, '#account-subpage-row')); - - // The other rows are shown correctly. - assertTrue(isChildVisible(peoplePage, '#sync-setup')); - assertTrue(isChildVisible(peoplePage, '#edit-profile')); - assertTrue(isChildVisible(peoplePage, '#manage-google-account')); - assertTrue(isChildVisible(peoplePage, '#importDataDialogTrigger')); - }); - - test('ShowCorrectRowsSignedOut', async function() { - await simulateSignedInState(SignedInState.SIGNED_OUT, []); - - // The first item should be an account card. - assertTrue(isChildVisible(peoplePage, 'settings-sync-account-control')); - assertFalse(isChildVisible(peoplePage, '#profile-row')); - assertFalse(isChildVisible(peoplePage, '#account-subpage-row')); - - // The other rows are shown correctly. - assertTrue(isChildVisible(peoplePage, '#sync-setup')); - assertTrue(isChildVisible(peoplePage, '#edit-profile')); - assertFalse(isChildVisible(peoplePage, '#manage-google-account')); - assertTrue(isChildVisible(peoplePage, '#importDataDialogTrigger')); - }); - - test('ShowCorrectRowsSyncing', async function() { - await simulateSignedInState( - SignedInState.SYNCING, [{email: 'foo@foo.com'}]); - - // The first item should be an account card. - assertTrue(isChildVisible(peoplePage, 'settings-sync-account-control')); - assertFalse(isChildVisible(peoplePage, '#profile-row')); - assertFalse(isChildVisible(peoplePage, '#account-subpage-row')); - - // The other rows are shown correctly. - assertTrue(isChildVisible(peoplePage, '#sync-setup')); - assertTrue(isChildVisible(peoplePage, '#edit-profile')); - assertTrue(isChildVisible(peoplePage, '#manage-google-account')); - assertTrue(isChildVisible(peoplePage, '#importDataDialogTrigger')); - }); - - test('ShowCorrectRowsSignInPending', async function() { - await simulateSignedInState( - SignedInState.SIGNED_IN_PAUSED, [{email: 'foo@foo.com'}]); - - // The first item should be an account card. - assertTrue(isChildVisible(peoplePage, 'settings-sync-account-control')); - assertFalse(isChildVisible(peoplePage, '#profile-row')); - assertFalse(isChildVisible(peoplePage, '#account-subpage-row')); - - // The other rows are shown correctly. - assertTrue(isChildVisible(peoplePage, '#sync-setup')); - assertTrue(isChildVisible(peoplePage, '#edit-profile')); - assertTrue(isChildVisible(peoplePage, '#manage-google-account')); - assertTrue(isChildVisible(peoplePage, '#importDataDialogTrigger')); - }); - - test('ShowCorrectRowsWebSignedIn', async function() { - await simulateSignedInState( - SignedInState.WEB_ONLY_SIGNED_IN, [{email: 'foo@foo.com'}]); - - // The first item should be an account card. - assertTrue(isChildVisible(peoplePage, 'settings-sync-account-control')); - assertFalse(isChildVisible(peoplePage, '#profile-row')); - assertFalse(isChildVisible(peoplePage, '#account-subpage-row')); - - // The other rows are shown correctly. - assertTrue(isChildVisible(peoplePage, '#sync-setup')); - assertTrue(isChildVisible(peoplePage, '#edit-profile')); - assertTrue(isChildVisible(peoplePage, '#manage-google-account')); - assertTrue(isChildVisible(peoplePage, '#importDataDialogTrigger')); - }); - - test('ClickingAccountLinkRowLeadsToAccountSettings', async function() { - await simulateSignedInState( - SignedInState.SIGNED_IN, [{email: 'foo@foo.com'}]); - - peoplePage.shadowRoot!.querySelector<HTMLElement>( - '#account-subpage-row')!.click(); - assertEquals(routes.ACCOUNT, Router.getInstance().getCurrentRoute()); - }); - - test('AccountLinkRowHasAccountInfo', async function() { - const expectedAccount = { - fullName: 'Test Name', - email: 'test@email.com', - avatarImage: 'data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAA' + - 'AAABAAEAAAICTAEAOw==', - }; - await simulateSignedInState(SignedInState.SIGNED_IN, [expectedAccount]); - - const accountName = - peoplePage.shadowRoot!.querySelector( - '#account-name')!.textContent!.trim(); - const accountEmail = - peoplePage.shadowRoot!.querySelector( - '#account-email')!.textContent!.trim(); - - assertEquals(expectedAccount.fullName, accountName); - assertEquals(expectedAccount.email, accountEmail); - - const bgImage = - peoplePage.shadowRoot!.querySelector<HTMLElement>( - '#profile-icon')!.style.backgroundImage; - assertTrue(bgImage.includes(expectedAccount.avatarImage)); - }); -}); -// </if>
diff --git a/chrome/test/data/webui/settings/settings_main_plugins_test.ts b/chrome/test/data/webui/settings/settings_main_plugins_test.ts index a1afa78e..ec8b0775 100644 --- a/chrome/test/data/webui/settings/settings_main_plugins_test.ts +++ b/chrome/test/data/webui/settings/settings_main_plugins_test.ts
@@ -6,11 +6,10 @@ import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import type {Route, SettingsMainElement, SettingsPrefsElement} from 'chrome://settings/settings.js'; -import {CrSettingsPrefs, loadTimeData, pageVisibility, resetPageVisibilityForTesting, resetRouterForTesting, Router, routes, setSearchManagerForTesting, SignedInState, StatusAction} from 'chrome://settings/settings.js'; +import {CrSettingsPrefs, loadTimeData, pageVisibility, resetPageVisibilityForTesting, resetRouterForTesting, Router, routes, setSearchManagerForTesting} from 'chrome://settings/settings.js'; import {assertEquals, assertFalse, assertTrue} from 'chrome://webui-test/chai_assert.js'; import {flushTasks} from 'chrome://webui-test/polymer_test_util.js'; -import {simulateSyncStatus} from './sync_test_util.js'; import {TestSearchManager} from './test_search_manager.js'; suite('SettingsMain', function() { @@ -40,14 +39,8 @@ isGuest: false, showAiPage: false, showResetProfileBanner: false, - replaceSyncPromosWithSignInPromos: true, }); createSettingsMain(); - simulateSyncStatus({ - signedInState: SignedInState.SIGNED_IN, - statusAction: StatusAction.NO_ACTION, - }); - flush(); }); test('UpdatesActiveViewWhenRouteChanges', async function() {
diff --git a/chrome/test/media_router/access_code_cast/BUILD.gn b/chrome/test/media_router/access_code_cast/BUILD.gn index 4b94afe..6bc5ece 100644 --- a/chrome/test/media_router/access_code_cast/BUILD.gn +++ b/chrome/test/media_router/access_code_cast/BUILD.gn
@@ -20,10 +20,10 @@ deps = [ "//base/test:test_support", - "//chrome/browser:browser", - "//chrome/browser/media/router:router", + "//chrome/browser", + "//chrome/browser/media/router", "//chrome/browser/media/router:test_support", - "//chrome/browser/media/router/discovery:discovery", + "//chrome/browser/media/router/discovery", "//chrome/browser/media/router/discovery/access_code:access_code_cast_feature", "//chrome/browser/media/router/discovery/access_code:access_code_sink_service", "//chrome/browser/profiles:profile", @@ -35,13 +35,13 @@ "//chrome/test:test_support", "//chrome/test:test_support_ui", "//chrome/test/media_router:test_support", - "//components/keyed_service/content:content", - "//components/media_router/browser:browser", + "//components/keyed_service/content", + "//components/media_router/browser", "//components/media_router/browser:test_support", "//components/media_router/common:test_support", - "//components/performance_manager:performance_manager", + "//components/performance_manager", "//components/signin/public/identity_manager:test_support", - "//components/user_manager:user_manager", + "//components/user_manager", "//content/test:test_support", ]
diff --git a/chrome/test/supervised_user/BUILD.gn b/chrome/test/supervised_user/BUILD.gn index a052d0b5..2587a5f 100644 --- a/chrome/test/supervised_user/BUILD.gn +++ b/chrome/test/supervised_user/BUILD.gn
@@ -35,7 +35,7 @@ public_deps = [ "//base", "//net:test_support", - "//services/network/public/cpp:cpp", + "//services/network/public/cpp", ] }
diff --git a/chrome/test/variations/BUILD.gn b/chrome/test/variations/BUILD.gn index 1a207825..866dd22 100644 --- a/chrome/test/variations/BUILD.gn +++ b/chrome/test/variations/BUILD.gn
@@ -18,7 +18,7 @@ data = [ "//chrome/test/variations/test_utils/" ] - data_deps = [ "//third_party/catapult/third_party/gsutil:gsutil" ] + data_deps = [ "//third_party/catapult/third_party/gsutil" ] } python_library("fixtures") { @@ -43,7 +43,7 @@ "//build/android:devil_chromium_py", "//build/android:test_runner_py", "//clank/bin:installer_scripts", - "//third_party/catapult/devil:devil", + "//third_party/catapult/devil", ] } @@ -62,8 +62,8 @@ ] data_deps += [ - "//third_party/catapult/devil:devil", - "//third_party/catapult/telemetry:telemetry", + "//third_party/catapult/devil", + "//third_party/catapult/telemetry", ] }
diff --git a/chrome/updater/BUILD.gn b/chrome/updater/BUILD.gn index fb7ce57..978b733 100644 --- a/chrome/updater/BUILD.gn +++ b/chrome/updater/BUILD.gn
@@ -988,9 +988,9 @@ "app/server/win:updater_idl", "app/server/win:updater_internal_idl", "app/server/win:updater_legacy_idl", - "test/qualification_app:qualification_app", + "test/qualification_app", "win:updater_test", - "win/installer:installer", + "win/installer", "win/installer:installer_test", "win/installer:lib", "win/installer:msi_custom_action",
diff --git a/chrome/utility/BUILD.gn b/chrome/utility/BUILD.gn index 26f8d389..64e43a3 100644 --- a/chrome/utility/BUILD.gn +++ b/chrome/utility/BUILD.gn
@@ -64,7 +64,7 @@ "//printing/buildflags", "//services/data_decoder:lib", "//services/network:network_service", - "//services/passage_embeddings:passage_embeddings", + "//services/passage_embeddings", "//services/passage_embeddings/public/mojom", "//services/screen_ai/buildflags", "//services/service_manager/public/cpp", @@ -193,7 +193,7 @@ "//chromeos/ash/services/boca/babelorca/mojom", "//chromeos/ash/services/ime:lib", "//chromeos/ash/services/ime/public/mojom", - "//chromeos/ash/services/nearby/public/mojom:mojom", + "//chromeos/ash/services/nearby/public/mojom", "//chromeos/ash/services/orca", "//chromeos/ash/services/orca/public/mojom", "//chromeos/ash/services/quick_pair", @@ -202,7 +202,7 @@ "//chromeos/components/mahi/public/mojom", "//chromeos/components/quick_answers/public/cpp", "//chromeos/components/quick_answers/public/mojom", - "//chromeos/constants:constants", + "//chromeos/constants", "//chromeos/services/tts", "//chromeos/services/tts/public/mojom", ]
diff --git a/chromecast/app/BUILD.gn b/chromecast/app/BUILD.gn index 65a3c1d..609b2ca 100644 --- a/chromecast/app/BUILD.gn +++ b/chromecast/app/BUILD.gn
@@ -74,7 +74,7 @@ cast_source_set("crash_uploader") { sources = [ "cast_crash_uploader.h" ] - public_deps = [ "//components/prefs:prefs" ] + public_deps = [ "//components/prefs" ] if (is_android) { sources += [ "android/cast_crash_uploader_android.cc",
diff --git a/chromecast/bindings/BUILD.gn b/chromecast/bindings/BUILD.gn index 7ac6d90..5dfa30a 100644 --- a/chromecast/bindings/BUILD.gn +++ b/chromecast/bindings/BUILD.gn
@@ -85,7 +85,7 @@ "//chromecast/base", "//chromecast/base:chromecast_switches", "//chromecast/bindings:bindings_manager_cast", - "//chromecast/browser:browser", + "//chromecast/browser", "//chromecast/browser:client", "//chromecast/browser:public", "//chromecast/browser:test_support",
diff --git a/chromecast/browser/BUILD.gn b/chromecast/browser/BUILD.gn index 8d300d9c..ae344d46 100644 --- a/chromecast/browser/BUILD.gn +++ b/chromecast/browser/BUILD.gn
@@ -348,7 +348,7 @@ deps += [ "//ui/aura", - "//ui/views:views", + "//ui/views", ] if (!is_fuchsia) { @@ -539,7 +539,7 @@ "//chromecast/base", "//chromecast/base:chromecast_switches", "//chromecast/base/metrics", - "//chromecast/graphics:graphics", + "//chromecast/graphics", "//chromecast/mojo", "//components/keyed_service/content", "//components/prefs", @@ -596,7 +596,7 @@ "//third_party/blink/public/common", "//ui/base", "//ui/base:test_support", - "//ui/events/devices:devices", + "//ui/events/devices", "//ui/gl:test_support", ]
diff --git a/chromecast/common/BUILD.gn b/chromecast/common/BUILD.gn index edbfcc1..24ce364 100644 --- a/chromecast/common/BUILD.gn +++ b/chromecast/common/BUILD.gn
@@ -39,7 +39,7 @@ "//base", "//components/url_matcher", "//services/network/public/cpp:cpp_base", - "//third_party/blink/public/common:common", + "//third_party/blink/public/common", "//third_party/blink/public/common:headers", "//url", ] @@ -111,7 +111,7 @@ "//media:media_buildflags", "//third_party/widevine/cdm:buildflags", "//ui/base", - "//url:url", + "//url", ] if (!is_fuchsia) { @@ -119,7 +119,7 @@ } if (is_android || is_fuchsia) { - deps += [ "//components/cdm/common:common" ] + deps += [ "//components/cdm/common" ] } if (enable_library_cdms) {
diff --git a/chromecast/device/bluetooth/BUILD.gn b/chromecast/device/bluetooth/BUILD.gn index 2348be4..881469a 100644 --- a/chromecast/device/bluetooth/BUILD.gn +++ b/chromecast/device/bluetooth/BUILD.gn
@@ -26,7 +26,7 @@ "//base/test:run_all_unittests", "//base/test:test_support", "//chromecast/device/bluetooth/le:unittests", - "//testing/gmock:gmock", - "//testing/gtest:gtest", + "//testing/gmock", + "//testing/gtest", ] }
diff --git a/chromecast/device/bluetooth/shlib/BUILD.gn b/chromecast/device/bluetooth/shlib/BUILD.gn index 10f0bfd..331759f6 100644 --- a/chromecast/device/bluetooth/shlib/BUILD.gn +++ b/chromecast/device/bluetooth/shlib/BUILD.gn
@@ -24,6 +24,6 @@ ":shlib", "//base", "//chromecast/public", - "//testing/gmock:gmock", + "//testing/gmock", ] }
diff --git a/chromecast/media/audio/BUILD.gn b/chromecast/media/audio/BUILD.gn index 99e9b26..546b79bb 100644 --- a/chromecast/media/audio/BUILD.gn +++ b/chromecast/media/audio/BUILD.gn
@@ -204,7 +204,7 @@ "//chromecast/media/audio/audio_output_service:output_connection", "//chromecast/media/audio/audio_output_service:proto", "//chromecast/media/base:monotonic_clock", - "//content/renderer:renderer", + "//content/renderer", "//media", "//media/mojo/mojom", "//net", @@ -223,7 +223,7 @@ "//base", "//chromecast/base", "//content/public/renderer", - "//content/renderer:renderer", + "//content/renderer", "//media", "//third_party/blink/public:blink", "//third_party/blink/public/common",
diff --git a/chromecast/media/base/BUILD.gn b/chromecast/media/base/BUILD.gn index 58016c96..bf4eaa2 100644 --- a/chromecast/media/base/BUILD.gn +++ b/chromecast/media/base/BUILD.gn
@@ -104,6 +104,6 @@ deps = [ ":buildflags", "//base", - "//chromecast/media/api:api", + "//chromecast/media/api", ] }
diff --git a/chromecast/media/cma/backend/BUILD.gn b/chromecast/media/cma/backend/BUILD.gn index 90ac57ca..fdf84b9 100644 --- a/chromecast/media/cma/backend/BUILD.gn +++ b/chromecast/media/cma/backend/BUILD.gn
@@ -26,7 +26,7 @@ deps = [ "//base", "//chromecast:chromecast_buildflags", - "//chromecast/base/metrics:metrics", + "//chromecast/base/metrics", "//chromecast/media:libcast_media", "//chromecast/media/cma/base", "//chromecast/media/cma/decoder", @@ -108,7 +108,7 @@ deps = [ "//base", "//chromecast/public", - "//chromecast/public/media:media", + "//chromecast/public/media", ] }
diff --git a/chromecast/media/cma/backend/mixer/post_processors/BUILD.gn b/chromecast/media/cma/backend/mixer/post_processors/BUILD.gn index 2095ec9..2964a6c 100644 --- a/chromecast/media/cma/backend/mixer/post_processors/BUILD.gn +++ b/chromecast/media/cma/backend/mixer/post_processors/BUILD.gn
@@ -110,6 +110,6 @@ "//chromecast/media/base", "//chromecast/public", "//chromecast/public/media", - "//testing/gtest:gtest", + "//testing/gtest", ] }
diff --git a/chromecast/media/cma/pipeline/BUILD.gn b/chromecast/media/cma/pipeline/BUILD.gn index 368413e7..9122ec4 100644 --- a/chromecast/media/cma/pipeline/BUILD.gn +++ b/chromecast/media/cma/pipeline/BUILD.gn
@@ -49,7 +49,7 @@ ":cma_pipeline_buildflags", "//base", "//chromecast/base", - "//chromecast/base/metrics:metrics", + "//chromecast/base/metrics", "//chromecast/media/base", "//chromecast/media/cdm", "//chromecast/media/cma/backend",
diff --git a/chromecast/media/common/BUILD.gn b/chromecast/media/common/BUILD.gn index 466ce4d..ee55062 100644 --- a/chromecast/media/common/BUILD.gn +++ b/chromecast/media/common/BUILD.gn
@@ -40,7 +40,7 @@ ":media_resource_tracker", "//base", "//chromecast:chromecast_buildflags", - "//chromecast/base/metrics:metrics", + "//chromecast/base/metrics", "//chromecast/media/common/base", ]
diff --git a/chromecast/media/gpu/BUILD.gn b/chromecast/media/gpu/BUILD.gn index 74916e6..ec5ed3b 100644 --- a/chromecast/media/gpu/BUILD.gn +++ b/chromecast/media/gpu/BUILD.gn
@@ -16,9 +16,9 @@ "//chromecast/mojo", "//components/viz/common", "//media/gpu", - "//media/gpu/ipc/client:client", + "//media/gpu/ipc/client", "//media/gpu/ipc/common", - "//media/mojo/clients:clients", + "//media/mojo/clients", "//media/mojo/mojom", "//ui/gfx/geometry/mojom", ]
diff --git a/chromecast/metrics/BUILD.gn b/chromecast/metrics/BUILD.gn index 856085f..db9dd7a 100644 --- a/chromecast/metrics/BUILD.gn +++ b/chromecast/metrics/BUILD.gn
@@ -23,7 +23,7 @@ "//components/metrics", "//components/metrics:net", "//components/prefs", - "//components/variations:variations", + "//components/variations", "//services/network/public/cpp", ] } @@ -73,7 +73,7 @@ "metrics_util.h", ] - public_deps = [ "//net:net" ] + public_deps = [ "//net" ] deps = [ "//base" ] } @@ -106,7 +106,7 @@ ":cast_event_builder_interface", "//base", "//net", - "//testing/gmock:gmock", + "//testing/gmock", ] } @@ -129,8 +129,8 @@ "//chromecast/base:dummy_cast_sys_info", "//components/metrics", "//services/network/public/cpp", - "//testing/gmock:gmock", - "//testing/gtest:gtest", + "//testing/gmock", + "//testing/gtest", ] }
diff --git a/chromecast/renderer/BUILD.gn b/chromecast/renderer/BUILD.gn index f9f2fa6..0a58fb3d 100644 --- a/chromecast/renderer/BUILD.gn +++ b/chromecast/renderer/BUILD.gn
@@ -74,7 +74,7 @@ "//ipc", "//media/remoting:remoting_renderer", "//net", - "//services/network/public/cpp:cpp", + "//services/network/public/cpp", "//services/service_manager/public/cpp", ]
diff --git a/chromecast/renderer/media/BUILD.gn b/chromecast/renderer/media/BUILD.gn index d2aa73a..0aacc45 100644 --- a/chromecast/renderer/media/BUILD.gn +++ b/chromecast/renderer/media/BUILD.gn
@@ -18,7 +18,7 @@ "//chromecast/common/mojom", "//chromecast/media", "//chromecast/media/cdm", - "//chromecast/public:public", + "//chromecast/public", "//components/cdm/renderer", "//content/public/renderer", "//media",
diff --git a/chromecast/starboard/media/cdm/BUILD.gn b/chromecast/starboard/media/cdm/BUILD.gn index 122460f..782e9ef 100644 --- a/chromecast/starboard/media/cdm/BUILD.gn +++ b/chromecast/starboard/media/cdm/BUILD.gn
@@ -63,6 +63,6 @@ "//media", "//testing/gmock", "//testing/gtest", - "//url:url", + "//url", ] }
diff --git a/chromeos/CHROMEOS_LKGM b/chromeos/CHROMEOS_LKGM index 8a3476e..569377c 100644 --- a/chromeos/CHROMEOS_LKGM +++ b/chromeos/CHROMEOS_LKGM
@@ -1 +1 @@ -16361.0.0-1070508 \ No newline at end of file +16361.0.0-1070514 \ No newline at end of file
diff --git a/chromeos/ash/components/boca/babelorca/DEPS b/chromeos/ash/components/boca/babelorca/DEPS index 1b5d8e9..911a524 100644 --- a/chromeos/ash/components/boca/babelorca/DEPS +++ b/chromeos/ash/components/boca/babelorca/DEPS
@@ -7,6 +7,7 @@ "+components/soda/constants.h", "+content/public/browser/service_process_host.h", "+media/mojo/mojom/speech_recognition.mojom.h", + "+media/mojo/mojom/speech_recognition.mojom-forward.h", "+media/mojo/mojom/speech_recognition_result.h", "+ui/native_theme", "+ui/views",
diff --git a/chromeos/ash/components/boca/babelorca/babel_orca_consumer.cc b/chromeos/ash/components/boca/babelorca/babel_orca_consumer.cc index cb82d16c..515e132 100644 --- a/chromeos/ash/components/boca/babelorca/babel_orca_consumer.cc +++ b/chromeos/ash/components/boca/babelorca/babel_orca_consumer.cc
@@ -36,6 +36,7 @@ #include "components/signin/public/identity_manager/identity_manager.h" #include "content/public/browser/service_process_host.h" #include "google_apis/gaia/gaia_id.h" +#include "media/mojo/mojom/speech_recognition.mojom.h" #include "media/mojo/mojom/speech_recognition_result.h" #include "services/network/public/cpp/shared_url_loader_factory.h" @@ -329,6 +330,13 @@ void BabelOrcaConsumer::OnTranscriptReceived( media::SpeechRecognitionResult transcript, std::string language) { + if (!transcript_lang_.has_value() || transcript_lang_.value() != language) { + transcript_lang_ = language; + caption_controller_->OnLanguageIdentificationEvent( + media::mojom::LanguageIdentificationEvent::New( + /*language=*/language, media::mojom::ConfidenceLevel::kConfident, + media::mojom::AsrSwitchResult::kSwitchSucceeded)); + } if (caption_controller_->IsTranslateAllowedAndEnabled()) { translator_->Translate( transcript,
diff --git a/chromeos/ash/components/boca/babelorca/babel_orca_consumer.h b/chromeos/ash/components/boca/babelorca/babel_orca_consumer.h index 22b8d36e..c68835a 100644 --- a/chromeos/ash/components/boca/babelorca/babel_orca_consumer.h +++ b/chromeos/ash/components/boca/babelorca/babel_orca_consumer.h
@@ -6,6 +6,7 @@ #define CHROMEOS_ASH_COMPONENTS_BOCA_BABELORCA_BABEL_ORCA_CONSUMER_H_ #include <memory> +#include <optional> #include <string> #include "base/functional/callback.h" @@ -136,6 +137,7 @@ bool local_captions_enabled_ = false; bool session_captions_enabled_ = false; bool in_session_ = false; + std::optional<std::string> transcript_lang_; base::WeakPtrFactory<BabelOrcaConsumer> weak_ptr_factory_{this}; };
diff --git a/chromeos/ash/components/boca/babelorca/babel_orca_consumer_unittest.cc b/chromeos/ash/components/boca/babelorca/babel_orca_consumer_unittest.cc index cff3239..fde91f6 100644 --- a/chromeos/ash/components/boca/babelorca/babel_orca_consumer_unittest.cc +++ b/chromeos/ash/components/boca/babelorca/babel_orca_consumer_unittest.cc
@@ -50,7 +50,8 @@ namespace ash::babelorca { namespace { -const std::string kApplicationLocale = "en-US"; +const std::string kEnglishUsLocale = "en-US"; +const std::string kSpanishUsLocale = "es-US"; const GaiaId::Literal kGaiaId("gaia-id"); const std::string kSessionId = "session_id"; const std::string kEmail = "test@school.edu"; @@ -74,11 +75,11 @@ std::make_unique<FakeCaptionControllerDelegate>(); caption_controller_delegate_ = caption_controller_delegate.get(); auto caption_bubble_settings = std::make_unique<CaptionBubbleSettingsImpl>( - &pref_service_, kApplicationLocale, base::DoNothing()); + &pref_service_, kEnglishUsLocale, base::DoNothing()); caption_bubble_settings_ = caption_bubble_settings.get(); auto caption_controller = std::make_unique<CaptionController>( /*caption_bubble_context=*/ - nullptr, &pref_service_, kApplicationLocale, + nullptr, &pref_service_, kEnglishUsLocale, std::move(caption_bubble_settings), std::move(caption_controller_delegate)); caption_controller->SetLiveTranslateEnabled(translate_enabled); @@ -123,7 +124,7 @@ message->current_transcript->is_final = true; message->current_transcript->text_index = 0; message->current_transcript->text = "transcript"; - message->current_transcript->language = "en"; + message->current_transcript->language = kEnglishUsLocale; return message; } @@ -451,5 +452,63 @@ EXPECT_TRUE(caption_bubble_settings_->GetLiveTranslateEnabled()); } +TEST_F(BabelOrcaConsumerTest, OnLanguageIdentificationEvent) { + request_data_provider_ = std::make_unique<FakeTachyonRequestDataProvider>( + kSessionId, "tachyon-token", "group_id", kEmail); + CreateConsumer(); + consumer_->OnSessionStarted(); + consumer_->OnLocalCaptionConfigUpdated(/*local_captions_enabled=*/true); + consumer_->OnSessionCaptionConfigUpdated(/*session_captions_enabled=*/true, + /*translations_enabled=*/false); + + // Join Tachyon group. + url_loader_factory_.AddResponse(JoinGroupUrl(), ""); + identity_test_env_.WaitForAccessTokenRequestIfNecessaryAndRespondWithToken( + "oauth_token", base::Time::Max()); + ASSERT_TRUE(streaming_client_waiter_.Wait()); + + ASSERT_FALSE(on_message_cb_.is_null()); + + // Language identification event will initially be triggered. + mojom::BabelOrcaMessagePtr message_1 = CreateMessage(); + on_message_cb_.Run(std::move(message_1)); + ASSERT_THAT(caption_controller_delegate_->GetLanguageIdentificationEvents(), + testing::SizeIs(1)); + EXPECT_EQ(caption_controller_delegate_->GetLanguageIdentificationEvents() + .at(0) + ->language, + kEnglishUsLocale); + + // Language not changed so no language identification event. + mojom::BabelOrcaMessagePtr message_2 = CreateMessage(); + message_2->order = 2; + on_message_cb_.Run(std::move(message_2)); + EXPECT_THAT(caption_controller_delegate_->GetLanguageIdentificationEvents(), + testing::SizeIs(1)); + + // Language identification event will be triggered when switching language. + mojom::BabelOrcaMessagePtr message_3 = CreateMessage(); + message_3->order = 3; + message_3->current_transcript->language = kSpanishUsLocale; + on_message_cb_.Run(std::move(message_3)); + ASSERT_THAT(caption_controller_delegate_->GetLanguageIdentificationEvents(), + testing::SizeIs(2)); + EXPECT_EQ(caption_controller_delegate_->GetLanguageIdentificationEvents() + .at(1) + ->language, + kSpanishUsLocale); + + mojom::BabelOrcaMessagePtr message_4 = CreateMessage(); + message_4->order = 4; + message_4->current_transcript->language = kEnglishUsLocale; + on_message_cb_.Run(std::move(message_4)); + ASSERT_THAT(caption_controller_delegate_->GetLanguageIdentificationEvents(), + testing::SizeIs(3)); + EXPECT_EQ(caption_controller_delegate_->GetLanguageIdentificationEvents() + .at(2) + ->language, + kEnglishUsLocale); +} + } // namespace } // namespace ash::babelorca
diff --git a/chromeos/ash/components/boca/babelorca/caption_controller_unittest.cc b/chromeos/ash/components/boca/babelorca/caption_controller_unittest.cc index 3dd720e..be880ac 100644 --- a/chromeos/ash/components/boca/babelorca/caption_controller_unittest.cc +++ b/chromeos/ash/components/boca/babelorca/caption_controller_unittest.cc
@@ -20,6 +20,7 @@ #include "components/live_caption/pref_names.h" #include "components/prefs/pref_registry_simple.h" #include "components/prefs/testing_pref_service.h" +#include "media/mojo/mojom/speech_recognition.mojom.h" #include "media/mojo/mojom/speech_recognition_result.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" @@ -45,6 +46,12 @@ EXPECT_THAT(style.text_shadow, testing::HasSubstr(kCaptionsTextShadow)); } +media::mojom::LanguageIdentificationEventPtr GetLanguageIdentificationEvent() { + return media::mojom::LanguageIdentificationEvent::New( + "ar-EG", media::mojom::ConfidenceLevel::kConfident, + media::mojom::AsrSwitchResult::kSwitchSucceeded); +} + TEST(CaptionControllerTest, SetStyleOnStartLiveCaption) { TestingPrefServiceSimple pref_service; RegisterPrefsForTesting(&pref_service); @@ -124,7 +131,8 @@ /*caption_bubble_context=*/nullptr, &pref_service, kApplicationLocale, /*caption_bubble_settings=*/nullptr, std::move(delegate)); - caption_controller.OnLanguageIdentificationEvent(nullptr); + caption_controller.OnLanguageIdentificationEvent( + GetLanguageIdentificationEvent()); EXPECT_EQ(delegate_ptr->GetOnLanguageIdentificationEventCount(), 0u); } @@ -139,7 +147,8 @@ /*caption_bubble_settings=*/nullptr, std::move(delegate)); caption_controller.StartLiveCaption(); - caption_controller.OnLanguageIdentificationEvent(nullptr); + caption_controller.OnLanguageIdentificationEvent( + GetLanguageIdentificationEvent()); EXPECT_EQ(delegate_ptr->GetOnLanguageIdentificationEventCount(), 1u); } @@ -155,7 +164,8 @@ caption_controller.StartLiveCaption(); caption_controller.StopLiveCaption(); - caption_controller.OnLanguageIdentificationEvent(nullptr); + caption_controller.OnLanguageIdentificationEvent( + GetLanguageIdentificationEvent()); EXPECT_EQ(delegate_ptr->GetOnLanguageIdentificationEventCount(), 0u); }
diff --git a/chromeos/ash/components/boca/babelorca/fakes/fake_caption_controller_delegate.cc b/chromeos/ash/components/boca/babelorca/fakes/fake_caption_controller_delegate.cc index 1fee3e01..03276615 100644 --- a/chromeos/ash/components/boca/babelorca/fakes/fake_caption_controller_delegate.cc +++ b/chromeos/ash/components/boca/babelorca/fakes/fake_caption_controller_delegate.cc
@@ -42,8 +42,8 @@ void OnLanguageIdentificationEvent( content::RenderFrameHost*, captions::CaptionBubbleContext*, - const media::mojom::LanguageIdentificationEventPtr&) override { - delegate_->OnLanguageIdentificationEvent(); + const media::mojom::LanguageIdentificationEventPtr& event) override { + delegate_->OnLanguageIdentificationEvent(event); } void UpdateCaptionStyle(std::optional<ui::CaptionStyle> style) override { @@ -101,7 +101,7 @@ } size_t FakeCaptionControllerDelegate::GetOnLanguageIdentificationEventCount() { - return language_identification_event_count_; + return language_identification_events_.size(); } const std::vector<std::optional<ui::CaptionStyle>>& @@ -114,6 +114,11 @@ return transcriptions_; } +const std::vector<media::mojom::LanguageIdentificationEventPtr>& +FakeCaptionControllerDelegate::GetLanguageIdentificationEvents() { + return language_identification_events_; +} + bool FakeCaptionControllerDelegate::AddTranscription( media::SpeechRecognitionResult transcription) { transcriptions_.push_back(std::move(transcription)); @@ -124,8 +129,9 @@ on_transcritption_success_ = success; } -void FakeCaptionControllerDelegate::OnLanguageIdentificationEvent() { - ++language_identification_event_count_; +void FakeCaptionControllerDelegate::OnLanguageIdentificationEvent( + const media::mojom::LanguageIdentificationEventPtr& event) { + language_identification_events_.push_back(event->Clone()); } void FakeCaptionControllerDelegate::AddStyleUpdate(
diff --git a/chromeos/ash/components/boca/babelorca/fakes/fake_caption_controller_delegate.h b/chromeos/ash/components/boca/babelorca/fakes/fake_caption_controller_delegate.h index 183fb92..2abd15e 100644 --- a/chromeos/ash/components/boca/babelorca/fakes/fake_caption_controller_delegate.h +++ b/chromeos/ash/components/boca/babelorca/fakes/fake_caption_controller_delegate.h
@@ -13,6 +13,7 @@ #include "base/memory/raw_ptr.h" #include "chromeos/ash/components/boca/babelorca/caption_controller.h" +#include "media/mojo/mojom/speech_recognition.mojom-forward.h" namespace captions { class CaptionBubbleController; @@ -59,11 +60,15 @@ const std::vector<media::SpeechRecognitionResult>& GetTranscriptions(); + const std::vector<media::mojom::LanguageIdentificationEventPtr>& + GetLanguageIdentificationEvents(); + bool AddTranscription(media::SpeechRecognitionResult transcription); void SetOnTranscriptionSuccess(bool success); - void OnLanguageIdentificationEvent(); + void OnLanguageIdentificationEvent( + const media::mojom::LanguageIdentificationEventPtr& event); void AddStyleUpdate(std::optional<ui::CaptionStyle> style); @@ -75,7 +80,8 @@ bool caption_bubble_alive_ = false; bool on_transcritption_success_ = true; size_t create_bubble_controller_count_ = 0; - size_t language_identification_event_count_ = 0; + std::vector<media::mojom::LanguageIdentificationEventPtr> + language_identification_events_; std::vector<std::optional<ui::CaptionStyle>> caption_style_updates_; std::vector<media::SpeechRecognitionResult> transcriptions_; raw_ptr<ui::NativeThemeObserver> style_observer_;
diff --git a/chromeos/profiles/atom.afdo.newest.txt b/chromeos/profiles/atom.afdo.newest.txt index 0d9f6772..efdaf529 100644 --- a/chromeos/profiles/atom.afdo.newest.txt +++ b/chromeos/profiles/atom.afdo.newest.txt
@@ -1 +1 @@ -chromeos-chrome-amd64-atom-140-7258.43-1753070574-benchmark-140.0.7313.0_pre1490386-r1-redacted.afdo.xz +chromeos-chrome-amd64-atom-140-7258.43-1753070574-benchmark-140.0.7317.0_pre1491800-r1-redacted.afdo.xz
diff --git a/clank b/clank index e101239..dccbc9a 160000 --- a/clank +++ b/clank
@@ -1 +1 @@ -Subproject commit e1012395eec3db1f82de8817f9f439253fe87155 +Subproject commit dccbc9a6d7146b71f54ed6f3bc739c3c3a5098b5
diff --git a/components/autofill/core/browser/ui/payments/save_and_fill_dialog_controller.h b/components/autofill/core/browser/ui/payments/save_and_fill_dialog_controller.h index f513d753..e965b36e 100644 --- a/components/autofill/core/browser/ui/payments/save_and_fill_dialog_controller.h +++ b/components/autofill/core/browser/ui/payments/save_and_fill_dialog_controller.h
@@ -6,6 +6,7 @@ #define COMPONENTS_AUTOFILL_CORE_BROWSER_UI_PAYMENTS_SAVE_AND_FILL_DIALOG_CONTROLLER_H_ #include "base/memory/weak_ptr.h" +#include "components/autofill/core/browser/payments/legal_message_line.h" #include "components/autofill/core/browser/payments/payments_autofill_client.h" namespace autofill { @@ -44,6 +45,9 @@ std::u16string_view expiration_date) const = 0; virtual bool IsValidNameOnCard(std::u16string_view input_text) const = 0; + // Returns empty vector if no legal message should be shown. + virtual const LegalMessageLines& GetLegalMessageLines() const = 0; + // Dismisses the dialog by destroying its view and associated widget. virtual void Dismiss() = 0; // Callbacks for when the user accepts the Save and Fill dialog.
diff --git a/components/autofill/core/browser/ui/payments/save_and_fill_dialog_controller_impl.cc b/components/autofill/core/browser/ui/payments/save_and_fill_dialog_controller_impl.cc index 2aea6f62..1063f25 100644 --- a/components/autofill/core/browser/ui/payments/save_and_fill_dialog_controller_impl.cc +++ b/components/autofill/core/browser/ui/payments/save_and_fill_dialog_controller_impl.cc
@@ -219,6 +219,11 @@ return autofill::IsValidNameOnCard(input_text); } +const LegalMessageLines& SaveAndFillDialogControllerImpl::GetLegalMessageLines() + const { + return legal_message_lines_; +} + void SaveAndFillDialogControllerImpl::Dismiss() { dialog_view_.reset(); }
diff --git a/components/autofill/core/browser/ui/payments/save_and_fill_dialog_controller_impl.h b/components/autofill/core/browser/ui/payments/save_and_fill_dialog_controller_impl.h index f6acadb..b362164 100644 --- a/components/autofill/core/browser/ui/payments/save_and_fill_dialog_controller_impl.h +++ b/components/autofill/core/browser/ui/payments/save_and_fill_dialog_controller_impl.h
@@ -7,6 +7,7 @@ #include "base/functional/callback.h" #include "base/memory/weak_ptr.h" +#include "components/autofill/core/browser/payments/legal_message_line.h" #include "components/autofill/core/browser/payments/payments_autofill_client.h" #include "components/autofill/core/browser/ui/payments/save_and_fill_dialog_controller.h" #include "components/autofill/core/browser/ui/payments/save_and_fill_dialog_view.h" @@ -62,6 +63,8 @@ std::u16string_view expiration_date) const override; bool IsValidNameOnCard(std::u16string_view input_text) const override; + const LegalMessageLines& GetLegalMessageLines() const override; + void Dismiss() override; void OnUserAcceptedDialog( const payments::PaymentsAutofillClient::
diff --git a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/BrowserUiListMenuUtils.java b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/BrowserUiListMenuUtils.java index 93807db..b4ea4f3 100644 --- a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/BrowserUiListMenuUtils.java +++ b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/BrowserUiListMenuUtils.java
@@ -13,6 +13,7 @@ import androidx.annotation.StyleRes; import org.chromium.build.annotations.NullMarked; +import org.chromium.build.annotations.Nullable; import org.chromium.ui.listmenu.BasicListMenu; import org.chromium.ui.listmenu.ListMenu; import org.chromium.ui.modelutil.MVCListAdapter; @@ -38,10 +39,11 @@ * * @param context The Android context. * @param data The data to display in the list. - * @param delegate Delegate to handle item clicks. + * @param delegate The {@link ListMenu.Delegate} used to handle menu clicks. If not provided, + * the item's CLICK_LISTENER or listMenu's onMenuItemSelected method will be used. */ public static BasicListMenu getBasicListMenu( - Context context, MVCListAdapter.ModelList data, ListMenu.Delegate delegate) { + Context context, MVCListAdapter.ModelList data, ListMenu.@Nullable Delegate delegate) { return getBasicListMenu(context, data, delegate, 0); } @@ -50,13 +52,14 @@ * * @param context The Android context. * @param data The data to display in the list. - * @param delegate Delegate to handle item clicks. + * @param delegate The {@link ListMenu.Delegate} used to handle menu clicks. If not provided, + * the item's CLICK_LISTENER or listMenu's onMenuItemSelected method will be used. * @param backgroundTintColor tint for the menu background. */ public static BasicListMenu getBasicListMenu( Context context, MVCListAdapter.ModelList data, - ListMenu.Delegate delegate, + ListMenu.@Nullable Delegate delegate, @ColorRes int backgroundTintColor) { View contentView = LayoutInflater.from(context).inflate(R.layout.app_menu_layout, null); ListView listView = contentView.findViewById(R.id.app_menu_list);
diff --git a/components/embedder_support/user_agent_utils.cc b/components/embedder_support/user_agent_utils.cc index c9338f0..7c95cb0 100644 --- a/components/embedder_support/user_agent_utils.cc +++ b/components/embedder_support/user_agent_utils.cc
@@ -346,6 +346,13 @@ if (ui::GetDeviceFormFactor() == ui::DEVICE_FORM_FACTOR_DESKTOP) { return kUnifiedPlatformLinuxX64; } +#if BUILDFLAG(ENABLE_VR) + // The Android XR device by default also has the unified platform of desktop + // form factor. + if (device::features::IsXrDevice()) { + return kUnifiedPlatformLinuxX64; + } +#endif // BUILDFLAG(ENABLE_VR) return "Linux; Android 10; K"; #elif BUILDFLAG(IS_CHROMEOS) return "X11; CrOS x86_64 14541.0.0"; @@ -606,6 +613,11 @@ if (ui::GetDeviceFormFactor() == ui::DEVICE_FORM_FACTOR_DESKTOP) { return false; } +#if BUILDFLAG(ENABLE_VR) + if (device::features::IsXrDevice()) { + return false; + } +#endif // BUILDFLAG(ENABLE_VR) #endif #if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_IOS) @@ -628,6 +640,11 @@ if (ui::GetDeviceFormFactor() == ui::DEVICE_FORM_FACTOR_DESKTOP) { return std::string(); } +#if BUILDFLAG(ENABLE_VR) + if (device::features::IsXrDevice()) { + return std::string(); + } +#endif // BUILDFLAG(ENABLE_VR) #endif #if BUILDFLAG(IS_WIN) @@ -645,6 +662,11 @@ if (ui::GetDeviceFormFactor() == ui::DEVICE_FORM_FACTOR_DESKTOP) { return "Linux"; } +#if BUILDFLAG(ENABLE_VR) + if (device::features::IsXrDevice()) { + return "Linux"; + } +#endif // BUILDFLAG(ENABLE_VR) #endif #if BUILDFLAG(IS_MAC) @@ -787,9 +809,17 @@ #elif BUILDFLAG(IS_IOS) return "arm"; #elif BUILDFLAG(IS_ANDROID) + // 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. if (ui::GetDeviceFormFactor() == ui::DEVICE_FORM_FACTOR_DESKTOP) { return "x86"; } +#if BUILDFLAG(ENABLE_VR) + if (device::features::IsXrDevice()) { + return "x86"; + } +#endif // BUILDFLAG(ENABLE_VR) return std::string(); #elif BUILDFLAG(IS_POSIX) std::string cpu_info = BuildCpuInfo(); @@ -829,6 +859,11 @@ if (ui::GetDeviceFormFactor() == ui::DEVICE_FORM_FACTOR_DESKTOP) { return "64"; } +#if BUILDFLAG(ENABLE_VR) + if (device::features::IsXrDevice()) { + return "64"; + } +#endif // BUILDFLAG(ENABLE_VR) return std::string(); #elif BUILDFLAG(IS_POSIX) return base::Contains(BuildCpuInfo(), "64") ? "64" : "32";
diff --git a/components/embedder_support/user_agent_utils_unittest.cc b/components/embedder_support/user_agent_utils_unittest.cc index 2b363bb..58c6648 100644 --- a/components/embedder_support/user_agent_utils_unittest.cc +++ b/components/embedder_support/user_agent_utils_unittest.cc
@@ -754,13 +754,26 @@ } #if BUILDFLAG(IS_ANDROID) && BUILDFLAG(ENABLE_VR) -TEST_F(UserAgentUtilsTest, UserAgentMetadataXR) { +TEST_F(UserAgentUtilsTest, UserAgentMetadataForXrDevice) { base::test::ScopedFeatureList scoped_feature_list; scoped_feature_list.InitAndEnableFeature( device::features::kForceIsXrDeviceForTesting); + + // Verify the user-agent. + EXPECT_THAT(GetUserAgent(), testing::HasSubstr("X11; Linux x86_64")); + + // Verify user-agent client-hints auto metadata = GetUserAgentMetadata(); - std::vector<std::string> expected_form_factors = { - (metadata.mobile ? "Mobile" : "Desktop"), "XR"}; + EXPECT_FALSE(metadata.mobile); + EXPECT_EQ(metadata.platform, "Linux"); + EXPECT_FALSE(metadata.brand_version_list.empty()); + EXPECT_EQ(metadata.bitness, "64"); + EXPECT_EQ(metadata.architecture, "x86"); + EXPECT_FALSE(metadata.model.empty()); + EXPECT_TRUE(metadata.platform_version.empty()); + EXPECT_FALSE(metadata.full_version.empty()); + EXPECT_FALSE(metadata.brand_full_version_list.empty()); + std::vector<std::string> expected_form_factors = {"Desktop", "XR"}; EXPECT_EQ(metadata.form_factors, expected_form_factors); } #endif // BUILDFLAG(IS_ANDROID) && BUILDFLAG(ENABLE_VR)
diff --git a/components/feature_engagement/public/feature_constants.cc b/components/feature_engagement/public/feature_constants.cc index 0f04b8d5..a0213a1 100644 --- a/components/feature_engagement/public/feature_constants.cc +++ b/components/feature_engagement/public/feature_constants.cc
@@ -250,7 +250,7 @@ base::FEATURE_DISABLED_BY_DEFAULT); BASE_FEATURE(kIPHTabSearchToolbarButtonFeature, "IPH_TabSearchToolbarButton", - base::FEATURE_DISABLED_BY_DEFAULT); + base::FEATURE_ENABLED_BY_DEFAULT); BASE_FEATURE(kIPHDesktopSnoozeFeature, "IPH_DesktopSnoozeFeature", base::FEATURE_DISABLED_BY_DEFAULT);
diff --git a/components/omnibox/browser/android/java/src/org/chromium/components/omnibox/AutocompleteMatch.java b/components/omnibox/browser/android/java/src/org/chromium/components/omnibox/AutocompleteMatch.java index acd1bbea..9d2efdc3 100644 --- a/components/omnibox/browser/android/java/src/org/chromium/components/omnibox/AutocompleteMatch.java +++ b/components/omnibox/browser/android/java/src/org/chromium/components/omnibox/AutocompleteMatch.java
@@ -22,6 +22,7 @@ import org.chromium.components.omnibox.AnswerTypeProto.AnswerType; import org.chromium.components.omnibox.GroupsProto.GroupId; import org.chromium.components.omnibox.RichAnswerTemplateProto.RichAnswerTemplate; +import org.chromium.components.omnibox.SuggestTemplateInfoProto.SuggestTemplateInfo; import org.chromium.components.omnibox.action.OmniboxAction; import org.chromium.url.GURL; @@ -93,6 +94,7 @@ private final String mInlineAutocompletion; private final String mAdditionalText; private final @Nullable String mTabGroupUuid; + private @Nullable SuggestTemplateInfo mSuggestTemplate; public AutocompleteMatch( int nativeType, @@ -120,7 +122,8 @@ boolean allowedToBeDefaultMatch, String inlineAutocompletion, String additionalText, - @Nullable String tabGroupUuid) { + @Nullable String tabGroupUuid, + byte @Nullable [] serializedSuggestTemplate) { if (subtypes == null) { subtypes = Collections.emptySet(); } @@ -158,6 +161,13 @@ mInlineAutocompletion = inlineAutocompletion; mAdditionalText = additionalText; mTabGroupUuid = tabGroupUuid; + if (serializedSuggestTemplate != null) { + try { + mSuggestTemplate = SuggestTemplateInfo.parseFrom(serializedSuggestTemplate); + } catch (InvalidProtocolBufferException e) { + assert false : "Parsing error for SuggestTemplateInfo"; + } + } } @CalledByNative @@ -190,7 +200,8 @@ boolean allowedToBeDefaultMatch, String inlineAutocompletion, String additionalText, - String localTabGroupId) { + String localTabGroupId, + byte[] serializedSuggestTemplate) { assert contentClassificationOffsets.length == contentClassificationStyles.length; List<MatchClassification> contentClassifications = new ArrayList<>(); for (int i = 0; i < contentClassificationOffsets.length; i++) { @@ -231,7 +242,8 @@ allowedToBeDefaultMatch, inlineAutocompletion, additionalText, - TextUtils.isEmpty(localTabGroupId) ? null : localTabGroupId); + TextUtils.isEmpty(localTabGroupId) ? null : localTabGroupId, + serializedSuggestTemplate); match.updateNativeObjectRef(nativeObject); match.setDescription( description, descriptionClassificationOffsets, descriptionClassificationStyles); @@ -449,6 +461,10 @@ (mAnswerTemplate != null && suggestion.mAnswerTemplate != null) ? mAnswerTemplate.equals(suggestion.mAnswerTemplate) : mAnswerTemplate == null && suggestion.mAnswerTemplate == null; + boolean suggest_template_is_equal = + (mSuggestTemplate != null && suggestion.mSuggestTemplate != null) + ? mSuggestTemplate.equals(suggestion.mSuggestTemplate) + : mSuggestTemplate == null && suggestion.mSuggestTemplate == null; return mType == suggestion.mType && mNativeMatch == suggestion.mNativeMatch && ObjectsCompat.equals(mSubtypes, suggestion.mSubtypes) @@ -465,6 +481,7 @@ && mGroupId == suggestion.mGroupId && mAnswerType == suggestion.mAnswerType && answer_template_is_equal + && suggest_template_is_equal && ObjectsCompat.equals(mTabGroupUuid, suggestion.mTabGroupUuid); } @@ -589,7 +606,8 @@ input.getAllowedToBeDefaultMatch(), input.getInlineAutocompletion(), input.getAdditionalText(), - /* tabGroupUuid= */ null); + /* tabGroupUuid= */ null, + /* serializedSuggestTemplate= */ null); } @Override @@ -613,7 +631,8 @@ "mGroupId=" + mGroupId, "mDisplayTextClassifications=" + mDisplayTextClassifications, "mDescriptionClassifications=" + mDescriptionClassifications, - "mAnswerTemplate=" + mAnswerTemplate); + "mAnswerTemplate=" + mAnswerTemplate, + "mSuggestTemplate=" + mSuggestTemplate); return pieces.toString(); }
diff --git a/components/omnibox/browser/android/java/src/org/chromium/components/omnibox/AutocompleteMatchBuilder.java b/components/omnibox/browser/android/java/src/org/chromium/components/omnibox/AutocompleteMatchBuilder.java index 4aba5295..82f480e4 100644 --- a/components/omnibox/browser/android/java/src/org/chromium/components/omnibox/AutocompleteMatchBuilder.java +++ b/components/omnibox/browser/android/java/src/org/chromium/components/omnibox/AutocompleteMatchBuilder.java
@@ -50,6 +50,7 @@ private String mInlineAutocompletion; private String mAdditionalText; private String mTabGroupUuid; + private byte[] mSerializedSuggestTemplate; /** * Create a suggestion builder for a search suggestion. @@ -101,6 +102,7 @@ mInlineAutocompletion = null; mAdditionalText = null; mTabGroupUuid = null; + mSerializedSuggestTemplate = null; mDisplayTextClassifications.add( new AutocompleteMatch.MatchClassification(0, MatchClassificationStyle.NONE)); @@ -141,7 +143,8 @@ mAllowedToBeDefaultMatch, mInlineAutocompletion, mAdditionalText, - mTabGroupUuid); + mTabGroupUuid, + mSerializedSuggestTemplate); } /** @@ -352,4 +355,13 @@ mTabGroupUuid = tabGroupUuid; return this; } + + /** + * @param serializedSuggestTemplate Serialized SuggestTemplateInfo proto. + * @return Omnibox suggestion builder. + */ + public AutocompleteMatchBuilder setSerializedSuggestTemplate(byte[] serializedSuggestTemplate) { + mSerializedSuggestTemplate = serializedSuggestTemplate; + return this; + } }
diff --git a/components/omnibox/browser/autocomplete_controller.cc b/components/omnibox/browser/autocomplete_controller.cc index c6cd01c..e76603e 100644 --- a/components/omnibox/browser/autocomplete_controller.cc +++ b/components/omnibox/browser/autocomplete_controller.cc
@@ -255,13 +255,11 @@ return result.str(); } -#if !BUILDFLAG(IS_ANDROID) // Returns whether this match is provided by an extension in unscoped mode. bool IsUnscopedExtensionMatch(const AutocompleteMatch& match) { return match.provider && match.provider->type() == AutocompleteProvider::TYPE_UNSCOPED_EXTENSION; } -#endif // !BUILDFLAG(IS_ANDROID) // Returns which rich autocompletion type, if any, had (or would have had for // counterfactual variations) an impact; i.e. whether the top scoring rich @@ -1848,7 +1846,6 @@ AutocompleteResult* result) { // No need to update the description on Android since description for plain // text match is not allowed. -#if !BUILDFLAG(IS_ANDROID) // The Lens searchbox does not require the search engine name description // label since all suggestions will be from a single source. // TODO(crbug.com/338094774): Remove this Lens-specific change and implement a @@ -1857,6 +1854,11 @@ return; } +#if BUILDFLAG(IS_ANDROID) + // Do not include search engine name for the DSE. + auto* default_engine = template_url_service_->GetDefaultSearchProvider(); +#endif + std::u16string last_keyword; bool last_contextual = false; for (auto i(result->begin()); i != result->end(); ++i) { @@ -1864,6 +1866,13 @@ if (i->HasCustomDescription() || IsUnscopedExtensionMatch(*i)) { continue; } + +#if BUILDFLAG(IS_ANDROID) + if (i->keyword == default_engine->keyword()) { + continue; + } +#endif + i->description.clear(); i->description_class.clear(); DCHECK(!i->keyword.empty()); @@ -1899,7 +1908,6 @@ last_keyword.clear(); } } -#endif // !BUILDFLAG(IS_ANDROID) } void AutocompleteController::UpdateSearchboxStats(AutocompleteResult* result) {
diff --git a/components/omnibox/browser/autocomplete_match_android.cc b/components/omnibox/browser/autocomplete_match_android.cc index 54f1da6..d56cd40 100644 --- a/components/omnibox/browser/autocomplete_match_android.cc +++ b/components/omnibox/browser/autocomplete_match_android.cc
@@ -99,8 +99,16 @@ int icon_type = omnibox::SuggestTemplateInfo::IconType:: SuggestTemplateInfo_IconType_ICON_TYPE_UNSPECIFIED; + ScopedJavaLocalRef<jbyteArray> j_suggest_template; + if (suggest_template.has_value()) { icon_type = suggest_template.value().type_icon(); + + std::string str_suggest_template; + if (suggest_template->SerializeToString(&str_suggest_template)) { + j_suggest_template = + base::android::ToJavaByteArray(env, str_suggest_template); + } } java_match_ = std::make_unique<ScopedJavaGlobalRef<jobject>>( @@ -124,7 +132,8 @@ ConvertUTF16ToJavaString(env, inline_autocompletion), ConvertUTF16ToJavaString(env, additional_text), tab_groups::UuidToJavaString( - env, matching_tab_group_uuid.value_or(base::Uuid())))); + env, matching_tab_group_uuid.value_or(base::Uuid())), + j_suggest_template)); return ScopedJavaLocalRef<jobject>(*java_match_); }
diff --git a/components/omnibox/composebox/composebox_metrics_recorder.cc b/components/omnibox/composebox/composebox_metrics_recorder.cc index 18c70b8..b7543fe 100644 --- a/components/omnibox/composebox/composebox_metrics_recorder.cc +++ b/components/omnibox/composebox/composebox_metrics_recorder.cc
@@ -8,8 +8,8 @@ namespace { const char kComposeboxSessionDuration[] = "Composebox.Session.Duration.Total"; -const char kComposeboxSessionCompletionDuration[] = - "Composebox.Session.Duration.Completed"; +const char kComposeboxSessionDurationQuerySubmitted[] = + "Composebox.Session.Duration.QuerySubmitted"; const char kComposeboxSessionAbandonedDuration[] = "Composebox.Session.Duration.Abandoned"; const char kComposeboxQuerySubmissionTime[] = @@ -22,6 +22,11 @@ "Composebox.Session.File.Browser.UploadFailureCount."; const char kComposeboxFileValidationErrorTypes[] = "Composebox.Session.File.Browser.ValidationFailureCount."; +const char kComposeboxQueryTextLength[] = "Composebox.Query.TextLength"; +const char kComposeboxQueryFileCount[] = "Composebox.Query.FileCount"; +const char kComposeboxQueryModality[] = "Composebox.Query.Modality"; +const char kComposeboxQueryCount[] = "Composebox.Session.QueryCount"; +const char kComposeboxFileSizePerType[] = "Composebox.File.Size."; } // namespace SessionMetrics::SessionMetrics() = default; @@ -95,6 +100,31 @@ break; } } +void ComposeboxMetricsRecorder::RecordQueryMetrics(int text_length, + int file_count) { + base::UmaHistogramCounts1M(metric_category_name_ + kComposeboxQueryTextLength, + text_length); + bool has_text = text_length != 0; + bool has_files = file_count != 0; + // Submission requests will always have either 1) both text and files 2) text + // only or 3) files only. + NtpComposeboxMultimodalState multimodal_state = + has_text ? (has_files ? NtpComposeboxMultimodalState::kTextAndFile + : NtpComposeboxMultimodalState::kTextOnly) + : NtpComposeboxMultimodalState::kFileOnly; + base::UmaHistogramEnumeration( + metric_category_name_ + kComposeboxQueryModality, multimodal_state); + base::UmaHistogramCounts100(metric_category_name_ + kComposeboxQueryFileCount, + file_count); +} + +void ComposeboxMetricsRecorder::RecordFileSizeMetric(lens::MimeType mime_type, + uint64_t file_size_bytes) { + base::UmaHistogramCounts10M(metric_category_name_ + + kComposeboxFileSizePerType + + MimeTypeToString(mime_type), + file_size_bytes); +} void ComposeboxMetricsRecorder::NotifySessionStarted() { session_metrics_->session_elapsed_timer = @@ -104,11 +134,19 @@ void ComposeboxMetricsRecorder::NotifyQuerySubmitted() { base::TimeDelta time_to_query_submission = session_metrics_->session_elapsed_timer->Elapsed(); - session_metrics_->time_to_query_submissions.push_back( + base::UmaHistogramMediumTimes( + metric_category_name_ + kComposeboxQuerySubmissionTime, time_to_query_submission); + session_metrics_->num_query_submissions++; } void ComposeboxMetricsRecorder::RecordSessionAbandonedMetrics() { + // In the case that the user has submitted a query in a new tab and abandons + // the composebox session record the session as completed. + if (session_metrics_->num_query_submissions > 0) { + RecordSessionCompletedMetrics(); + return; + } base::TimeDelta session_duration = session_metrics_->session_elapsed_timer->Elapsed(); base::UmaHistogramMediumTimes( @@ -121,16 +159,12 @@ void ComposeboxMetricsRecorder::RecordSessionCompletedMetrics() { base::TimeDelta session_duration = session_metrics_->session_elapsed_timer->Elapsed(); - for (const auto time_to_query_submission : - session_metrics_->time_to_query_submissions) { - base::UmaHistogramMediumTimes( - metric_category_name_ + kComposeboxQuerySubmissionTime, - time_to_query_submission); - base::UmaHistogramMediumTimes( - metric_category_name_ + kComposeboxSessionCompletionDuration, - session_duration); - RecordTotalSessionDuration(session_duration); - } + base::UmaHistogramMediumTimes( + metric_category_name_ + kComposeboxSessionDurationQuerySubmitted, + session_duration); + base::UmaHistogramCounts100(metric_category_name_ + kComposeboxQueryCount, + session_metrics_->num_query_submissions); + RecordTotalSessionDuration(session_duration); FinalizeSessionMetrics(); } @@ -187,11 +221,11 @@ void ComposeboxMetricsRecorder::ResetSessionMetrics() { session_metrics_->session_elapsed_timer.reset(); - session_metrics_->time_to_query_submissions.clear(); session_metrics_->file_upload_attempt_count_per_type.clear(); session_metrics_->file_upload_success_count_per_type.clear(); session_metrics_->file_upload_failure_count_per_type.clear(); session_metrics_->file_validation_failure_count_per_type.clear(); + session_metrics_->num_query_submissions = 0; } std::string ComposeboxMetricsRecorder::FileErrorToString(
diff --git a/components/omnibox/composebox/composebox_metrics_recorder.h b/components/omnibox/composebox/composebox_metrics_recorder.h index d9e1f57b..de69fd9 100644 --- a/components/omnibox/composebox/composebox_metrics_recorder.h +++ b/components/omnibox/composebox/composebox_metrics_recorder.h
@@ -22,6 +22,16 @@ kNavigationOccurred = 4, }; +// These values are persisted to logs. Entries should not be renumbered and +// numeric values should never be reused. +// Describes the query submission details. +enum class NtpComposeboxMultimodalState { + kTextOnly = 0, + kFileOnly = 1, + kTextAndFile = 2, + kMaxValue = kTextAndFile, +}; + using FileUploadStatus = composebox_query::mojom::FileUploadStatus; struct SessionMetrics { @@ -29,11 +39,6 @@ ~SessionMetrics(); // Timer to keep track of the session durations. std::unique_ptr<base::ElapsedTimer> session_elapsed_timer; - // `time_to_query_submissions` will only hold one value, except in the case - // where a user navigates to the AIM page on a new window or tab and the - // composebox remains open. In that edge case the user can continue to submit - // queries, leading to multiple completion sessions recorded. - std::vector<base::TimeDelta> time_to_query_submissions; // Number of file upload attempts per file type. std::map<lens::MimeType, int> file_upload_attempt_count_per_type; // Number of successful file uploads per file type. @@ -43,6 +48,10 @@ // Number of file validation errors per file type. std::map<lens::MimeType, std::map<FileUploadErrorType, int>> file_validation_failure_count_per_type; + // In most cases `num_query_submissions` will equal 1 except in the case + // where a user navigates to the AIM page on a new window or tab and the + // composebox remains open. + int num_query_submissions = 0; }; class ComposeboxMetricsRecorder { @@ -64,6 +73,12 @@ // Maps mime types to its string version for histogram naming. std::string MimeTypeToString(lens::MimeType mime_type); + // Records several metrics about the query, such the number of characters + // found in the query. + void RecordQueryMetrics(int text_length, int file_count); + + void RecordFileSizeMetric(lens::MimeType mime_type, uint64_t file_size_bytes); + private: // Called when the session starts to correctly track session // durations.
diff --git a/components/omnibox/composebox/composebox_metrics_recorder_unittest.cc b/components/omnibox/composebox/composebox_metrics_recorder_unittest.cc index cb69e38..11c4c44 100644 --- a/components/omnibox/composebox/composebox_metrics_recorder_unittest.cc +++ b/components/omnibox/composebox/composebox_metrics_recorder_unittest.cc
@@ -15,8 +15,8 @@ "Test.Composebox.Session.Duration.Total"; const char kComposeboxSessionAbandonedDuration[] = "Test.Composebox.Session.Duration.Abandoned"; -const char kComposeboxSessionDurationCompleted[] = - "Test.Composebox.Session.Duration.Completed"; +const char kComposeboxSessionDurationQuerySubmitted[] = + "Test.Composebox.Session.Duration.QuerySubmitted"; const char kComposeboxQuerySubmissionTime[] = "Test.Composebox.Query.Time.ToSubmission"; const char kComposeboxFileUploadAttemptPdf[] = @@ -36,6 +36,11 @@ "Test.Composebox.Session.File.Browser.UploadFailureCount."; const char kComposeboxFileValidationErrorTypes[] = "Test.Composebox.Session.File.Browser.ValidationFailureCount."; +const char kComposeboxQueryTextLength[] = "Test.Composebox.Query.TextLength"; +const char kComposeboxQueryFileCount[] = "Test.Composebox.Query.FileCount"; +const char kComposeboxQueryModality[] = "Test.Composebox.Query.Modality"; +const char kComposeboxQueryCount[] = "Test.Composebox.Session.QueryCount"; +const char kComposeboxFileSizePdf[] = "Test.Composebox.File.Size.Pdf"; } // namespace class ComposeboxMetricsRecorderTest : public testing::Test { @@ -84,12 +89,13 @@ metrics().NotifySessionStateChanged(SessionState::kNavigationOccurred); DestructMetricsRecorder(); - histogram_tester().ExpectTotalCount(kComposeboxSessionDurationCompleted, 1); + histogram_tester().ExpectTotalCount(kComposeboxSessionDurationQuerySubmitted, + 1); histogram_tester().ExpectTotalCount(kComposeboxSessionDurationTotal, 1); histogram_tester().ExpectTotalCount(kComposeboxQuerySubmissionTime, 1); // Check session duration times. - histogram_tester().ExpectUniqueTimeSample(kComposeboxSessionDurationCompleted, - base::Seconds(10), 1); + histogram_tester().ExpectUniqueTimeSample( + kComposeboxSessionDurationQuerySubmitted, base::Seconds(10), 1); histogram_tester().ExpectUniqueTimeSample(kComposeboxSessionDurationTotal, base::Seconds(10), 1); // Check query submission time. @@ -102,6 +108,7 @@ metrics().NotifySessionStateChanged(SessionState::kSessionStarted); task_environment().FastForwardBy(base::Seconds(30)); metrics().NotifySessionStateChanged(SessionState::kQuerySubmitted); + metrics().RecordQueryMetrics(/*text_length=*/100, /*file_count=*/1); metrics().NotifySessionStateChanged(SessionState::kNavigationOccurred); // Mimic the session remaining open when the AIM page is opened in another @@ -110,20 +117,68 @@ metrics().NotifySessionStateChanged(SessionState::kQuerySubmitted); metrics().NotifySessionStateChanged(SessionState::kNavigationOccurred); - DestructMetricsRecorder(); - histogram_tester().ExpectTotalCount(kComposeboxSessionDurationCompleted, 2); - histogram_tester().ExpectTotalCount(kComposeboxSessionDurationTotal, 2); + metrics().NotifySessionStateChanged(SessionState::kSessionAbandoned); + histogram_tester().ExpectTotalCount(kComposeboxSessionDurationQuerySubmitted, + 1); + histogram_tester().ExpectTotalCount(kComposeboxSessionDurationTotal, 1); histogram_tester().ExpectTotalCount(kComposeboxQuerySubmissionTime, 2); // Check session duration times. - histogram_tester().ExpectUniqueTimeSample(kComposeboxSessionDurationCompleted, - base::Seconds(90), 2); + histogram_tester().ExpectUniqueTimeSample( + kComposeboxSessionDurationQuerySubmitted, base::Seconds(90), 1); histogram_tester().ExpectUniqueTimeSample(kComposeboxSessionDurationTotal, - base::Seconds(90), 2); + base::Seconds(90), 1); // Check query submission times. histogram_tester().ExpectTimeBucketCount(kComposeboxQuerySubmissionTime, base::Seconds(30), 1); histogram_tester().ExpectTimeBucketCount(kComposeboxQuerySubmissionTime, base::Seconds(90), 1); + histogram_tester().ExpectBucketCount(kComposeboxQueryFileCount, 1, 1); + histogram_tester().ExpectBucketCount(kComposeboxQueryCount, 2, 1); +} + +TEST_F(ComposeboxMetricsRecorderTest, TextOnlyQuerySubmissionSession) { + // Setup user flow. + metrics().NotifySessionStateChanged(SessionState::kSessionStarted); + int text_length = 1000; + int file_count = 0; + metrics().RecordQueryMetrics(text_length, file_count); + + histogram_tester().ExpectBucketCount(kComposeboxQueryTextLength, text_length, + 1); + histogram_tester().ExpectBucketCount( + kComposeboxQueryModality, NtpComposeboxMultimodalState::kTextOnly, 1); + histogram_tester().ExpectBucketCount(kComposeboxQueryFileCount, file_count, + 1); +} + +TEST_F(ComposeboxMetricsRecorderTest, FileOnlyQuerySubmissionSession) { + // Setup user flow. + metrics().NotifySessionStateChanged(SessionState::kSessionStarted); + int text_length = 0; + int file_count = 2; + metrics().RecordQueryMetrics(text_length, file_count); + + histogram_tester().ExpectBucketCount(kComposeboxQueryTextLength, text_length, + 1); + histogram_tester().ExpectBucketCount( + kComposeboxQueryModality, NtpComposeboxMultimodalState::kFileOnly, 1); + histogram_tester().ExpectBucketCount(kComposeboxQueryFileCount, file_count, + 1); +} + +TEST_F(ComposeboxMetricsRecorderTest, MultimodalQuerySubmissionSession) { + // Setup user flow. + metrics().NotifySessionStateChanged(SessionState::kSessionStarted); + int text_length = 1000; + int file_count = 1; + metrics().RecordQueryMetrics(text_length, file_count); + + histogram_tester().ExpectBucketCount(kComposeboxQueryTextLength, text_length, + 1); + histogram_tester().ExpectBucketCount( + kComposeboxQueryModality, NtpComposeboxMultimodalState::kTextAndFile, 1); + histogram_tester().ExpectBucketCount(kComposeboxQueryFileCount, file_count, + 1); } TEST_F(ComposeboxMetricsRecorderTest, FileUploadSuccess) { @@ -171,6 +226,8 @@ task_environment().FastForwardBy(base::Seconds(30)); // Simulate file validation error. lens::MimeType file_mime_type = lens::MimeType::kPdf; + uint64_t file_size = 1000000; + metrics().RecordFileSizeMetric(file_mime_type, file_size); FileUploadStatus upload_status = FileUploadStatus::kProcessing; metrics().OnFileUploadStatusChanged(file_mime_type, upload_status, std::nullopt); @@ -189,6 +246,7 @@ histogram_tester().ExpectBucketCount(kComposeboxFileUploadAttemptPdf, 2, 1); histogram_tester().ExpectBucketCount( kComposeboxFileValidationBrowserErrorForPdf, 2, 1); + histogram_tester().ExpectBucketCount(kComposeboxFileSizePdf, file_size, 1); } TEST_F(ComposeboxMetricsRecorderTest, MultiFileUpload) {
diff --git a/components/omnibox/composebox/composebox_query_controller.cc b/components/omnibox/composebox/composebox_query_controller.cc index 92d33a94..200205d 100644 --- a/components/omnibox/composebox/composebox_query_controller.cc +++ b/components/omnibox/composebox/composebox_query_controller.cc
@@ -201,11 +201,15 @@ GURL ComposeboxQueryController::CreateAimUrl(const std::string& query_text, base::Time query_start_time) { + num_files_in_request_ = 0; if (!active_files_.empty() && cluster_info_.has_value()) { // Since multiple file upload isn't supported right now, use the last file // uploaded to determine `vit` param. // TODO(crbug.com/428967670): Support multiple file upload. const std::unique_ptr<FileInfo>& last_file = active_files_.rbegin()->second; + // TODO(crbug.com/428967670): Update `num_files_in_request_` when more than + // 1 file is supported. + num_files_in_request_ = 1; if (IsValidFileUploadStatusForMultimodalRequest( last_file->upload_status_)) { std::unique_ptr<lens::LensOverlayRequestId> request_id = @@ -372,6 +376,7 @@ cluster_info_endpoint_fetcher_.reset(); cluster_info_.reset(); request_id_generator_.ResetRequestId(); + num_files_in_request_ = 0; } void ComposeboxQueryController::ResetRequestClusterInfoState(int session_id) {
diff --git a/components/omnibox/composebox/composebox_query_controller.h b/components/omnibox/composebox/composebox_query_controller.h index 604799d..36e6168 100644 --- a/components/omnibox/composebox/composebox_query_controller.h +++ b/components/omnibox/composebox/composebox_query_controller.h
@@ -209,6 +209,8 @@ // Clear entire file cache. virtual void ClearFiles(); + int num_files_in_request() { return num_files_in_request_; } + protected: // Returns the EndpointFetcher to use with the given params. Protected to // allow overriding in tests to mock server responses. @@ -370,6 +372,9 @@ // expiration. int session_id_ = 0; + // The number of files that are sent in the AIM request. + int num_files_in_request_ = 0; + base::WeakPtrFactory<ComposeboxQueryController> weak_ptr_factory_{this}; };
diff --git a/components/optimization_guide/internal b/components/optimization_guide/internal index 0a8ac7a6..c66de765 160000 --- a/components/optimization_guide/internal +++ b/components/optimization_guide/internal
@@ -1 +1 @@ -Subproject commit 0a8ac7a60d6948d9a88faf17024a73657cb8a8b0 +Subproject commit c66de765dcd2a1b6a180828665edf21f1403a832
diff --git a/components/page_load_metrics/renderer/metrics_render_frame_observer.h b/components/page_load_metrics/renderer/metrics_render_frame_observer.h index d77dcb9..0f969ac 100644 --- a/components/page_load_metrics/renderer/metrics_render_frame_observer.h +++ b/components/page_load_metrics/renderer/metrics_render_frame_observer.h
@@ -26,38 +26,7 @@ class OneShotTimer; } // namespace base -namespace blink { -struct JavaScriptFrameworkDetectionResult; -struct SoftNavigationMetrics; -} // namespace blink - namespace page_load_metrics { - -namespace internal { -const char kPageLoadInternalSoftNavigationFromStartInvalidTiming[] = - "PageLoad.Internal.SoftNavigationFromStartInvalidTiming"; - -// These values are recorded into a UMA histogram as scenarios where the start -// time of soft navigation ends up being 0. These entries -// should not be renumbered and the numeric values should not be reused. These -// entries should be kept in sync with the definition in -// tools/metrics/histograms/enums.xml -// TODO(crbug.com/40074158): Remove the code here and related code once the bug -// is resolved. -enum class SoftNavigationFromStartInvalidTimingReasons { - kSoftNavStartTimeIsZeroAndLtNavStart = 0, - kSoftNavStartTimeIsZeroAndEqNavStart = 1, - kSoftNavStartTimeIsNonZeroAndEqNavStart = 2, - kSoftNavStartTimeIsNonZeroAndLtNavStart = 3, - kMaxValue = kSoftNavStartTimeIsNonZeroAndLtNavStart, -}; - -void RecordUmaForkPageLoadInternalSoftNavigationFromStartInvalidTiming( - base::TimeDelta start_time_relative_to_reference, - double nav_start_to_reference); - -} // namespace internal - class PageTimingMetricsSender; class PageTimingSender;
diff --git a/components/segmentation_platform/embedder/home_modules/tips_manager/BUILD.gn b/components/segmentation_platform/embedder/home_modules/tips_manager/BUILD.gn index 5cae168..b40315a 100644 --- a/components/segmentation_platform/embedder/home_modules/tips_manager/BUILD.gn +++ b/components/segmentation_platform/embedder/home_modules/tips_manager/BUILD.gn
@@ -44,4 +44,8 @@ "//components/sync_preferences:test_support", "//testing/gtest", ] + + # TODO(crbug.com/40031409): Fix code that adds exit-time destructors and + # enable the diagnostic by removing this line. + configs += [ "//build/config/compiler:no_exit_time_destructors" ] }
diff --git a/components/segmentation_platform/internal/BUILD.gn b/components/segmentation_platform/internal/BUILD.gn index 43c3ead3..9f9d053 100644 --- a/components/segmentation_platform/internal/BUILD.gn +++ b/components/segmentation_platform/internal/BUILD.gn
@@ -373,6 +373,10 @@ ":unit_tests_bundle_data", ] } + + # TODO(crbug.com/40031409): Fix code that adds exit-time destructors and + # enable the diagnostic by removing this line. + configs += [ "//build/config/compiler:no_exit_time_destructors" ] } source_set("test_support") {
diff --git a/content/browser/child_process_host_impl.cc b/content/browser/child_process_host_impl.cc index 39de45a..1d2ae87b 100644 --- a/content/browser/child_process_host_impl.cc +++ b/content/browser/child_process_host_impl.cc
@@ -34,7 +34,6 @@ #include "ipc/ipc.mojom.h" #include "ipc/ipc_channel.h" #include "ipc/ipc_channel_mojo.h" -#include "ipc/message_filter.h" #include "services/resource_coordinator/public/mojom/memory_instrumentation/constants.mojom.h" #include "services/service_manager/public/cpp/interface_provider.h"
diff --git a/content/browser/media/media_web_contents_observer_unittest.cc b/content/browser/media/media_web_contents_observer_unittest.cc index cc4718f..a6a8ac2d 100644 --- a/content/browser/media/media_web_contents_observer_unittest.cc +++ b/content/browser/media/media_web_contents_observer_unittest.cc
@@ -4,6 +4,8 @@ #include "content/browser/media/media_web_contents_observer.h" +#include <memory> + #include "content/test/test_render_view_host.h" #include "content/test/test_web_contents.h" #include "media/base/media_content_type.h" @@ -46,74 +48,265 @@ mojo::AssociatedReceiver<media::mojom::MediaPlayer> receiver_{this}; }; -using MediaWebContentsObserverTest = RenderViewHostImplTestHarness; +class MediaWebContentsObserverTest : public RenderViewHostImplTestHarness { + public: + struct PlayerSetup { + std::unique_ptr<TestMediaPlayer> player; + mojo::AssociatedRemote<media::mojom::MediaPlayerObserver> observer; + int32_t player_id; + }; + + protected: + mojo::AssociatedRemote<media::mojom::MediaPlayerHost> SetupPlayerHost() { + mojo::AssociatedRemote<media::mojom::MediaPlayerHost> player_host; + contents()->media_web_contents_observer()->BindMediaPlayerHost( + contents()->GetPrimaryMainFrame()->GetGlobalId(), + player_host.BindNewEndpointAndPassDedicatedReceiver()); + return player_host; + } + + auto CreateAndAddPlayer( + mojo::AssociatedRemote<media::mojom::MediaPlayerHost>& player_host, + int32_t player_id) -> PlayerSetup { + PlayerSetup setup{.player = std::make_unique<TestMediaPlayer>(), + .player_id = player_id}; + player_host->OnMediaPlayerAdded( + setup.player->receiver().BindNewEndpointAndPassRemote(), + setup.observer.BindNewEndpointAndPassReceiver(), player_id); + player_host.FlushForTesting(); + return setup; + } + + void SetMediaMetadata( + mojo::AssociatedRemote<media::mojom::MediaPlayerObserver>& observer, + bool has_audio, + bool has_video) { + observer->OnMediaMetadataChanged(has_audio, has_video, kContentType); + observer.FlushForTesting(); + } + + void PlayMedia( + mojo::AssociatedRemote<media::mojom::MediaPlayerObserver>& observer) { + observer->OnMediaPlaying(); + observer.FlushForTesting(); + } + + void PauseMedia( + mojo::AssociatedRemote<media::mojom::MediaPlayerObserver>& observer, + bool stream_ended = false) { + observer->OnMediaPaused(stream_ended); + observer.FlushForTesting(); + } + + void SetFullscreenStatus( + mojo::AssociatedRemote<media::mojom::MediaPlayerObserver>& observer, + blink::WebFullscreenVideoStatus status) { + observer->OnMediaEffectivelyFullscreenChanged(status); + observer.FlushForTesting(); + } + + MediaPlayerId CreatePlayerId(int32_t player_id) { + return MediaPlayerId(contents()->GetPrimaryMainFrame()->GetGlobalId(), + player_id); + } + + MediaWebContentsObserver& media_web_contents_observer() { + return *contents()->media_web_contents_observer(); + } +}; TEST_F(MediaWebContentsObserverTest, GetCurrentlyPlayingVideoCount) { - MediaWebContentsObserver& media_web_contents_observer = - *contents()->media_web_contents_observer(); + auto player_host = SetupPlayerHost(); + constexpr int32_t kAudioVideoPlayerId = 0; + constexpr int32_t kVideoPlayerId = 1; + auto audio_video_player = + CreateAndAddPlayer(player_host, kAudioVideoPlayerId); + auto video_player = CreateAndAddPlayer(player_host, kVideoPlayerId); - mojo::AssociatedRemote<media::mojom::MediaPlayerHost> player_host; - media_web_contents_observer.BindMediaPlayerHost( - contents()->GetPrimaryMainFrame()->GetGlobalId(), - player_host.BindNewEndpointAndPassDedicatedReceiver()); + EXPECT_EQ(media_web_contents_observer().GetCurrentlyPlayingVideoCount(), 0); - TestMediaPlayer audio_video_player; - mojo::AssociatedRemote<media::mojom::MediaPlayerObserver> - audio_video_player_observer; - player_host->OnMediaPlayerAdded( - audio_video_player.receiver().BindNewEndpointAndPassRemote(), - audio_video_player_observer.BindNewEndpointAndPassReceiver(), - /*player_id=*/0); - - TestMediaPlayer video_player; - mojo::AssociatedRemote<media::mojom::MediaPlayerObserver> - video_player_observer; - player_host->OnMediaPlayerAdded( - video_player.receiver().BindNewEndpointAndPassRemote(), - video_player_observer.BindNewEndpointAndPassReceiver(), - /*player_id=*/1); - - player_host.FlushForTesting(); - - EXPECT_EQ(media_web_contents_observer.GetCurrentlyPlayingVideoCount(), 0); - - audio_video_player_observer->OnMediaMetadataChanged( - /*has_audio=*/true, /*has_video=*/false, kContentType); - audio_video_player_observer.FlushForTesting(); - EXPECT_EQ(media_web_contents_observer.GetCurrentlyPlayingVideoCount(), 0) + SetMediaMetadata(audio_video_player.observer, /*has_audio=*/true, + /*has_video=*/false); + EXPECT_EQ(media_web_contents_observer().GetCurrentlyPlayingVideoCount(), 0) << "Nothing is playing"; - audio_video_player_observer->OnMediaPlaying(); - audio_video_player_observer.FlushForTesting(); - EXPECT_EQ(media_web_contents_observer.GetCurrentlyPlayingVideoCount(), 0) + PlayMedia(audio_video_player.observer); + EXPECT_EQ(media_web_contents_observer().GetCurrentlyPlayingVideoCount(), 0) << "An audio-only player is playing"; - video_player_observer->OnMediaMetadataChanged( - /*has_audio=*/false, /*has_video=*/true, kContentType); - video_player_observer.FlushForTesting(); - EXPECT_EQ(media_web_contents_observer.GetCurrentlyPlayingVideoCount(), 0) + SetMediaMetadata(video_player.observer, /*has_audio=*/false, + /*has_video=*/true); + EXPECT_EQ(media_web_contents_observer().GetCurrentlyPlayingVideoCount(), 0) << "An audio-only player is playing"; - video_player_observer->OnMediaPlaying(); - video_player_observer.FlushForTesting(); - EXPECT_EQ(media_web_contents_observer.GetCurrentlyPlayingVideoCount(), 1); + PlayMedia(video_player.observer); + EXPECT_EQ(media_web_contents_observer().GetCurrentlyPlayingVideoCount(), 1); - audio_video_player_observer->OnMediaMetadataChanged( - /*has_audio=*/true, /*has_video=*/true, kContentType); - audio_video_player_observer.FlushForTesting(); - EXPECT_EQ(media_web_contents_observer.GetCurrentlyPlayingVideoCount(), 2) + SetMediaMetadata(audio_video_player.observer, /*has_audio=*/true, + /*has_video=*/true); + EXPECT_EQ(media_web_contents_observer().GetCurrentlyPlayingVideoCount(), 2) << "A video track was added to an initially audio-only player"; - video_player_observer->OnMediaPaused(/*stream_ended=*/false); - video_player_observer.FlushForTesting(); - EXPECT_EQ(media_web_contents_observer.GetCurrentlyPlayingVideoCount(), 1); + PauseMedia(video_player.observer); + EXPECT_EQ(media_web_contents_observer().GetCurrentlyPlayingVideoCount(), 1); - audio_video_player_observer->OnMediaMetadataChanged( - /*has_audio=*/true, /*has_video=*/false, kContentType); - audio_video_player_observer.FlushForTesting(); - EXPECT_EQ(media_web_contents_observer.GetCurrentlyPlayingVideoCount(), 0) + SetMediaMetadata(audio_video_player.observer, /*has_audio=*/true, + /*has_video=*/false); + EXPECT_EQ(media_web_contents_observer().GetCurrentlyPlayingVideoCount(), 0) << "The video track was removed again"; } +TEST_F(MediaWebContentsObserverTest, + HasActiveEffectivelyFullscreenVideoEarlyReturns) { + // Test early return when no fullscreen player exists. + EXPECT_FALSE( + media_web_contents_observer().HasActiveEffectivelyFullscreenVideo()); + + auto player_host = SetupPlayerHost(); + constexpr int32_t kVideoPlayerId = 0; + auto video_player = CreateAndAddPlayer(player_host, kVideoPlayerId); + + SetFullscreenStatus( + video_player.observer, + blink::WebFullscreenVideoStatus::kFullscreenAndPictureInPictureEnabled); + + // Should return false when player is fullscreen but web contents is not. + EXPECT_FALSE( + media_web_contents_observer().HasActiveEffectivelyFullscreenVideo()); +} + +TEST_F(MediaWebContentsObserverTest, FullscreenVideoPlayerIdAndPipPermission) { + // Initially no fullscreen player. + EXPECT_FALSE(media_web_contents_observer() + .GetFullscreenVideoMediaPlayerId() + .has_value()); + + auto player_host = SetupPlayerHost(); + constexpr int32_t kVideoPlayerId = 42; + auto video_player = CreateAndAddPlayer(player_host, kVideoPlayerId); + + // Enter fullscreen with PiP enabled. + SetFullscreenStatus( + video_player.observer, + blink::WebFullscreenVideoStatus::kFullscreenAndPictureInPictureEnabled); + + EXPECT_TRUE(media_web_contents_observer() + .GetFullscreenVideoMediaPlayerId() + .has_value()); + EXPECT_EQ(media_web_contents_observer() + .GetFullscreenVideoMediaPlayerId() + ->player_id, + kVideoPlayerId); + EXPECT_TRUE(media_web_contents_observer() + .IsPictureInPictureAllowedForFullscreenVideo()); + + // Change to PiP disabled. + SetFullscreenStatus( + video_player.observer, + blink::WebFullscreenVideoStatus::kFullscreenAndPictureInPictureDisabled); + + EXPECT_TRUE(media_web_contents_observer() + .GetFullscreenVideoMediaPlayerId() + .has_value()); + EXPECT_FALSE(media_web_contents_observer() + .IsPictureInPictureAllowedForFullscreenVideo()); + + // Exit fullscreen. + SetFullscreenStatus( + video_player.observer, + blink::WebFullscreenVideoStatus::kNotEffectivelyFullscreen); + + EXPECT_FALSE(media_web_contents_observer() + .GetFullscreenVideoMediaPlayerId() + .has_value()); +} + +TEST_F(MediaWebContentsObserverTest, RequestPersistentVideoStateInvariant) { + // Early return when no fullscreen player exists. + EXPECT_FALSE(media_web_contents_observer() + .GetFullscreenVideoMediaPlayerId() + .has_value()); + media_web_contents_observer().RequestPersistentVideo(true); + EXPECT_FALSE(media_web_contents_observer() + .GetFullscreenVideoMediaPlayerId() + .has_value()); + + auto player_host = SetupPlayerHost(); + constexpr int32_t kVideoPlayerId = 0; + auto video_player = CreateAndAddPlayer(player_host, kVideoPlayerId); + + SetFullscreenStatus( + video_player.observer, + blink::WebFullscreenVideoStatus::kFullscreenAndPictureInPictureEnabled); + + EXPECT_TRUE(media_web_contents_observer() + .GetFullscreenVideoMediaPlayerId() + .has_value()); + EXPECT_EQ(media_web_contents_observer() + .GetFullscreenVideoMediaPlayerId() + ->player_id, + kVideoPlayerId); + + // Send persistent state change. + media_web_contents_observer().RequestPersistentVideo(false); + + EXPECT_TRUE(media_web_contents_observer() + .GetFullscreenVideoMediaPlayerId() + .has_value()); + EXPECT_EQ(media_web_contents_observer() + .GetFullscreenVideoMediaPlayerId() + ->player_id, + kVideoPlayerId); + + SetFullscreenStatus( + video_player.observer, + blink::WebFullscreenVideoStatus::kNotEffectivelyFullscreen); + + EXPECT_FALSE(media_web_contents_observer() + .GetFullscreenVideoMediaPlayerId() + .has_value()); + + // Early return again when no fullscreen player exists. + media_web_contents_observer().RequestPersistentVideo(true); + EXPECT_FALSE(media_web_contents_observer() + .GetFullscreenVideoMediaPlayerId() + .has_value()); +} + +TEST_F(MediaWebContentsObserverTest, PlayerStartStopNotifications) { + auto player_host = SetupPlayerHost(); + constexpr int32_t kTestPlayerId = 123; + auto test_player = CreateAndAddPlayer(player_host, kTestPlayerId); + auto player_id = CreatePlayerId(test_player.player_id); + + // Audio player setup to trigger audio stream monitor registration. + SetMediaMetadata(test_player.observer, /*has_audio=*/true, + /*has_video=*/false); + + PlayMedia(test_player.observer); + + EXPECT_TRUE(media_web_contents_observer().IsPlayerActive(player_id)); + + PauseMedia(test_player.observer); + EXPECT_FALSE(media_web_contents_observer().IsPlayerActive(player_id)); +} + +TEST_F(MediaWebContentsObserverTest, PlayerPausedWithStreamEnded) { + auto player_host = SetupPlayerHost(); + constexpr int32_t kTestPlayerId = 456; + auto test_player = CreateAndAddPlayer(player_host, kTestPlayerId); + auto player_id = CreatePlayerId(test_player.player_id); + + SetMediaMetadata(test_player.observer, /*has_audio=*/true, + /*has_video=*/false); + + PlayMedia(test_player.observer); + EXPECT_TRUE(media_web_contents_observer().IsPlayerActive(player_id)); + + // Test pause with stream ended. + PauseMedia(test_player.observer, /*stream_ended=*/true); + EXPECT_FALSE(media_web_contents_observer().IsPlayerActive(player_id)); +} + } // namespace } // namespace content
diff --git a/content/browser/renderer_host/navigation_request.cc b/content/browser/renderer_host/navigation_request.cc index 178a492..9a1c0a26 100644 --- a/content/browser/renderer_host/navigation_request.cc +++ b/content/browser/renderer_host/navigation_request.cc
@@ -187,6 +187,7 @@ #include "services/network/public/mojom/web_client_hints_types.mojom-shared.h" #include "services/network/public/mojom/web_client_hints_types.mojom.h" #include "services/network/public/mojom/web_sandbox_flags.mojom.h" +#include "storage/browser/blob/blob_url_registry.h" #include "third_party/abseil-cpp/absl/cleanup/cleanup.h" #include "third_party/blink/public/common/blob/blob_utils.h" #include "third_party/blink/public/common/chrome_debug_urls.h"
diff --git a/content/browser/security_exploit_browsertest.cc b/content/browser/security_exploit_browsertest.cc index f02b036..6a2e6a0 100644 --- a/content/browser/security_exploit_browsertest.cc +++ b/content/browser/security_exploit_browsertest.cc
@@ -96,6 +96,7 @@ #include "services/network/public/mojom/url_loader.mojom.h" #include "services/network/test/test_url_loader_client.h" #include "storage/browser/blob/blob_registry_impl.h" +#include "storage/browser/blob/blob_url_registry.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/blink/public/common/blob/blob_utils.h"
diff --git a/content/browser/service_worker/service_worker_internals_ui_browsertest.cc b/content/browser/service_worker/service_worker_internals_ui_browsertest.cc index 0f45713..b8f0116 100644 --- a/content/browser/service_worker/service_worker_internals_ui_browsertest.cc +++ b/content/browser/service_worker/service_worker_internals_ui_browsertest.cc
@@ -548,8 +548,8 @@ TearDownWindow(sw_internal_ui_window); } -// The test is flaky on Mac and Linux. crbug.com/1324856 -#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) +// The test is flaky on Mac, Linux, Android. http://crbug.com/1324856 +#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_ANDROID) #define MAYBE_StopStartSWReflectedOnInternalUI \ DISABLED_StopStartSWReflectedOnInternalUI #else
diff --git a/content/browser/shared_storage/shared_storage_worklet_host.cc b/content/browser/shared_storage/shared_storage_worklet_host.cc index be34127..1000228 100644 --- a/content/browser/shared_storage/shared_storage_worklet_host.cc +++ b/content/browser/shared_storage/shared_storage_worklet_host.cc
@@ -51,6 +51,7 @@ #include "services/network/public/cpp/simple_url_loader.h" #include "services/network/public/mojom/shared_storage.mojom.h" #include "storage/browser/blob/blob_url_loader_factory.h" +#include "storage/browser/blob/blob_url_registry.h" #include "third_party/blink/public/common/features.h" #include "third_party/blink/public/common/mime_util/mime_util.h" #include "third_party/blink/public/common/shared_storage/shared_storage_utils.h"
diff --git a/content/browser/smart_card/mock_smart_card_context_factory.cc b/content/browser/smart_card/mock_smart_card_context_factory.cc index 54ebe12c..4ec3f8e 100644 --- a/content/browser/smart_card/mock_smart_card_context_factory.cc +++ b/content/browser/smart_card/mock_smart_card_context_factory.cc
@@ -17,16 +17,6 @@ context_receivers_.set_disconnect_handler( base::BindRepeating(&MockSmartCardContextFactory::ContextDisconnected, base::Unretained(this))); - - ON_CALL(*this, CreateContext) - .WillByDefault([this](CreateContextCallback callback) { - mojo::PendingRemote<device::mojom::SmartCardContext> context_remote; - context_receivers_.Add(this, - context_remote.InitWithNewPipeAndPassReceiver()); - - std::move(callback).Run(SmartCardCreateContextResult::NewContext( - std::move(context_remote))); - }); } MockSmartCardContextFactory::~MockSmartCardContextFactory() = default; @@ -38,6 +28,15 @@ return pending_remote; } +void MockSmartCardContextFactory::CreateContext( + CreateContextCallback callback) { + mojo::PendingRemote<device::mojom::SmartCardContext> context_remote; + context_receivers_.Add(this, context_remote.InitWithNewPipeAndPassReceiver()); + + std::move(callback).Run( + SmartCardCreateContextResult::NewContext(std::move(context_remote))); +} + void MockSmartCardContextFactory::ExpectConnectFakeReaderSharedT1( mojo::Receiver<device::mojom::SmartCardConnection>& connection_receiver) { EXPECT_CALL(*this, @@ -79,13 +78,6 @@ device::mojom::SmartCardListReadersResult::NewError(error))); } -void MockSmartCardContextFactory::ExpectCreateContextError( - device::mojom::SmartCardError error) { - EXPECT_CALL(*this, CreateContext(_)) - .WillOnce(RunOnceCallback<0>( - device::mojom::SmartCardCreateContextResult::NewError(error))); -} - void MockSmartCardContextFactory::ClearContextReceivers() { context_receivers_.Clear(); }
diff --git a/content/browser/smart_card/mock_smart_card_context_factory.h b/content/browser/smart_card/mock_smart_card_context_factory.h index 06c0ebf..2ec98d5 100644 --- a/content/browser/smart_card/mock_smart_card_context_factory.h +++ b/content/browser/smart_card/mock_smart_card_context_factory.h
@@ -22,7 +22,7 @@ mojo::PendingRemote<device::mojom::SmartCardContextFactory> GetRemote(); // `device::mojom::SmartCardContextFactory` overrides: - MOCK_METHOD(void, CreateContext, (CreateContextCallback), (override)); + void CreateContext(CreateContextCallback) override; // `device::mojom::SmartCardContext` overrides: MOCK_METHOD(void, ListReaders, (ListReadersCallback callback), (override)); @@ -56,8 +56,6 @@ void ExpectListReaders(std::vector<std::string> readers); void ExpectListReadersError(device::mojom::SmartCardError error); - void ExpectCreateContextError(device::mojom::SmartCardError error); - void ClearContextReceivers(); private:
diff --git a/content/browser/storage_access/storage_access_handle.cc b/content/browser/storage_access/storage_access_handle.cc index 149a4a0..c3375f9 100644 --- a/content/browser/storage_access/storage_access_handle.cc +++ b/content/browser/storage_access/storage_access_handle.cc
@@ -16,6 +16,7 @@ #include "content/public/browser/permission_descriptor_util.h" #include "content/public/browser/web_contents.h" #include "content/public/common/content_client.h" +#include "storage/browser/blob/blob_url_registry.h" #include "storage/browser/quota/quota_manager_proxy.h" #include "third_party/blink/public/common/permissions/permission_utils.h"
diff --git a/content/browser/storage_partition_impl.cc b/content/browser/storage_partition_impl.cc index e8e0b0be..d00eb60 100644 --- a/content/browser/storage_partition_impl.cc +++ b/content/browser/storage_partition_impl.cc
@@ -154,6 +154,7 @@ #include "services/network/public/mojom/shared_dictionary_access_observer.mojom.h" #include "services/network/public/mojom/trust_tokens.mojom.h" #include "services/network/public/mojom/url_loader_network_service_observer.mojom.h" +#include "storage/browser/blob/blob_url_registry.h" #include "storage/browser/quota/quota_client_type.h" #include "storage/browser/quota/quota_manager.h" #include "storage/browser/quota/quota_manager_impl.h"
diff --git a/content/browser/storage_partition_impl.h b/content/browser/storage_partition_impl.h index 190a9a22..ef22ea4 100644 --- a/content/browser/storage_partition_impl.h +++ b/content/browser/storage_partition_impl.h
@@ -47,7 +47,6 @@ #include "services/network/public/mojom/device_bound_sessions.mojom.h" #include "services/network/public/mojom/network_context.mojom.h" #include "services/network/public/mojom/network_context_client.mojom.h" -#include "storage/browser/blob/blob_url_registry.h" #include "storage/browser/quota/quota_client_type.h" #include "storage/browser/quota/quota_settings.h" #include "third_party/blink/public/common/storage_key/storage_key.h" @@ -71,6 +70,7 @@ } // namespace network namespace storage { +class BlobUrlRegistry; struct BucketClientInfo; class SharedStorageManager; }
diff --git a/content/browser/web_contents/file_chooser_impl.cc b/content/browser/web_contents/file_chooser_impl.cc index 75db7b5..7104add 100644 --- a/content/browser/web_contents/file_chooser_impl.cc +++ b/content/browser/web_contents/file_chooser_impl.cc
@@ -170,6 +170,12 @@ return; } + // Do not allow open dialogs to have renderer-controlled default_file_name. + // See https://crbug.com/433800617 for context. + if (params->mode != blink::mojom::FileChooserParams::Mode::kSave) { + params->default_file_name = base::FilePath(); + } + // Don't allow page with open FileChooser to enter BackForwardCache to avoid // any unexpected behaviour from BackForwardCache. BackForwardCache::DisableForRenderFrameHost(
diff --git a/content/browser/web_contents/file_chooser_impl_unittest.cc b/content/browser/web_contents/file_chooser_impl_unittest.cc new file mode 100644 index 0000000..c736462 --- /dev/null +++ b/content/browser/web_contents/file_chooser_impl_unittest.cc
@@ -0,0 +1,122 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "content/browser/web_contents/file_chooser_impl.h" + +#include "base/files/file_path.h" +#include "base/run_loop.h" +#include "content/browser/renderer_host/render_frame_host_impl.h" +#include "content/public/browser/web_contents_delegate.h" +#include "content/test/test_web_contents.h" +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" + +using ::testing::_; +using ::testing::Invoke; + +namespace content { + +class MockWebContentsDelegateForFileChooser : public WebContentsDelegate { + public: + // Mock the method to inspect the parameters it receives. + MOCK_METHOD(void, + RunFileChooser, + (RenderFrameHost* render_frame_host, + scoped_refptr<FileSelectListener> listener, + const blink::mojom::FileChooserParams& params), + (override)); +}; + +class FileChooserImplTest : public RenderViewHostTestHarness { + public: + void SetUp() override { + RenderViewHostTestHarness::SetUp(); + mock_web_contents_delegate_ = + std::make_unique<MockWebContentsDelegateForFileChooser>(); + auto test_web_contents = + TestWebContents::Create(browser_context(), nullptr); + test_web_contents->SetDelegate(mock_web_contents_delegate_.get()); + SetContents(std::move(test_web_contents)); + + // Navigate to page, otherwise OpenFileChooser() returns early. + NavigateAndCommit(GURL(url::kAboutBlankURL)); + } + + void TearDown() override { + mock_web_contents_delegate_.reset(); + RenderViewHostTestHarness::TearDown(); + } + + protected: + std::unique_ptr<MockWebContentsDelegateForFileChooser> + mock_web_contents_delegate_; +}; + +TEST_F(FileChooserImplTest, DefaultFileNameClearedWhenModeIsNotSave) { + FileChooserImpl* file_chooser_impl = + FileChooserImpl::CreateForTesting( + static_cast<RenderFrameHostImpl*>(main_rfh())) + .first; + + auto params = blink::mojom::FileChooserParams::New(); + params->mode = blink::mojom::FileChooserParams::Mode::kOpen; + const base::FilePath kInitialFile = + base::FilePath(FILE_PATH_LITERAL("file.txt")); + params->default_file_name = kInitialFile; + + blink::mojom::FileChooserParamsPtr captured_params; + EXPECT_CALL(*mock_web_contents_delegate_, RunFileChooser(_, _, _)) + .WillOnce(Invoke( + [&](RenderFrameHost* rfh, scoped_refptr<FileSelectListener> listener, + const blink::mojom::FileChooserParams& passed_params) { + // Capture the arguments for later inspection. + captured_params = passed_params.Clone(); + + // Avoid logging error on destruction in test. + static_cast<FileChooserImpl::FileSelectListenerImpl*>( + listener.get()) + ->SetListenerFunctionCalledTrueForTesting(); + })); + + file_chooser_impl->OpenFileChooser(std::move(params), base::DoNothing()); + + // Verify the default file name was cleared. + ASSERT_TRUE(captured_params); + EXPECT_EQ(captured_params->default_file_name, base::FilePath()); +} + +TEST_F(FileChooserImplTest, DefaultFileNamePreservedWhenModeIsSave) { + FileChooserImpl* file_chooser_impl = + FileChooserImpl::CreateForTesting( + static_cast<RenderFrameHostImpl*>(main_rfh())) + .first; + + auto params = blink::mojom::FileChooserParams::New(); + params->mode = blink::mojom::FileChooserParams::Mode::kSave; + const base::FilePath kInitialFile = + base::FilePath(FILE_PATH_LITERAL("file.txt")); + params->default_file_name = kInitialFile; + + blink::mojom::FileChooserParamsPtr captured_params; + EXPECT_CALL(*mock_web_contents_delegate_, RunFileChooser(_, _, _)) + .WillOnce(Invoke( + [&](RenderFrameHost* rfh, scoped_refptr<FileSelectListener> listener, + const blink::mojom::FileChooserParams& passed_params) { + // Capture the arguments for later inspection. + captured_params = passed_params.Clone(); + + // Avoid logging error on destruction in test. + static_cast<FileChooserImpl::FileSelectListenerImpl*>( + listener.get()) + ->SetListenerFunctionCalledTrueForTesting(); + })); + + file_chooser_impl->OpenFileChooser(std::move(params), base::DoNothing()); + + // Verify the default file name was preserved. + ASSERT_TRUE(captured_params); + EXPECT_EQ(captured_params->default_file_name, kInitialFile); +} + +} // namespace content
diff --git a/content/public/android/javatests/src/org/chromium/content/browser/accessibility/WebContentsAccessibilityTest.java b/content/public/android/javatests/src/org/chromium/content/browser/accessibility/WebContentsAccessibilityTest.java index 692c4f91..5bab56b 100644 --- a/content/public/android/javatests/src/org/chromium/content/browser/accessibility/WebContentsAccessibilityTest.java +++ b/content/public/android/javatests/src/org/chromium/content/browser/accessibility/WebContentsAccessibilityTest.java
@@ -2936,6 +2936,7 @@ @Test @SmallTest @EnableFeatures(AccessibilityFeatures.ACCESSIBILITY_TEXT_FORMATTING) + @DisabledTest(message = "https://crbug.com/434253831") public void testAccessibilityNodeInfo_textFormatting() throws Throwable { // Build a simple web page with a variety of text formatting options. setupTestFromFile("content/test/data/android/accessibility_text_formatting_examples.html");
diff --git a/content/public/android/javatests/src/org/chromium/content/browser/accessibility/WebContentsAccessibilityTreeTest.java b/content/public/android/javatests/src/org/chromium/content/browser/accessibility/WebContentsAccessibilityTreeTest.java index d870765a..c47fc7a 100644 --- a/content/public/android/javatests/src/org/chromium/content/browser/accessibility/WebContentsAccessibilityTreeTest.java +++ b/content/public/android/javatests/src/org/chromium/content/browser/accessibility/WebContentsAccessibilityTreeTest.java
@@ -1267,6 +1267,7 @@ @Test @SmallTest + @DisabledTest(message = "https://crbug.com/434253831") public void test_fontSize() { performCssTest("font-size.html"); } @@ -2411,6 +2412,7 @@ @Test @SmallTest + @DisabledTest(message = "https://crbug.com/434253831") public void test_scrollableOverflow() { performHtmlTest("scrollable-overflow.html"); }
diff --git a/content/public/test/browser_test_utils.h b/content/public/test/browser_test_utils.h index 87b1b6e..5616f81 100644 --- a/content/public/test/browser_test_utils.h +++ b/content/public/test/browser_test_utils.h
@@ -48,7 +48,6 @@ #include "content/public/common/isolated_world_ids.h" #include "content/public/common/page_type.h" #include "content/public/test/test_utils.h" -#include "ipc/message_filter.h" #include "mojo/public/cpp/bindings/pending_remote.h" #include "mojo/public/cpp/bindings/receiver_set.h" #include "mojo/public/cpp/bindings/self_owned_associated_receiver.h"
diff --git a/content/public/test/mock_render_thread.cc b/content/public/test/mock_render_thread.cc index e6577d6..1268b3e 100644 --- a/content/public/test/mock_render_thread.cc +++ b/content/public/test/mock_render_thread.cc
@@ -18,7 +18,6 @@ #include "content/test/test_render_frame.h" #include "ipc/ipc_message_utils.h" #include "ipc/ipc_sync_message.h" -#include "ipc/message_filter.h" #include "mojo/public/cpp/bindings/pending_remote.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/blink/public/common/dom_storage/session_storage_namespace_id.h"
diff --git a/content/public/test/mock_render_thread.h b/content/public/test/mock_render_thread.h index 469cc7c2..7db7621 100644 --- a/content/public/test/mock_render_thread.h +++ b/content/public/test/mock_render_thread.h
@@ -15,7 +15,6 @@ #include "build/build_config.h" #include "content/public/common/widget_type.h" #include "content/public/renderer/render_thread.h" -#include "ipc/message_filter.h" #include "mojo/public/cpp/bindings/associated_remote.h" #include "mojo/public/cpp/bindings/pending_receiver.h" #include "third_party/blink/public/mojom/browser_interface_broker.mojom.h"
diff --git a/content/renderer/render_frame_impl.h b/content/renderer/render_frame_impl.h index 47da750..5456a50d 100644 --- a/content/renderer/render_frame_impl.h +++ b/content/renderer/render_frame_impl.h
@@ -147,7 +147,6 @@ class WebURL; struct FramePolicy; struct JavaScriptFrameworkDetectionResult; -struct SoftNavigationMetrics; } // namespace blink namespace gfx {
diff --git a/content/shell/browser/shell.cc b/content/shell/browser/shell.cc index 5d06602..6259e4b2 100644 --- a/content/shell/browser/shell.cc +++ b/content/shell/browser/shell.cc
@@ -139,7 +139,8 @@ // main frame being created as a WebContentsObservers. This gives the delegate // a chance to act on the main frame accordingly. if (raw_web_contents->GetPrimaryMainFrame()->IsRenderFrameLive()) - g_platform->MainFrameCreated(shell); + g_platform->MainFrameCreated(shell, + raw_web_contents->GetPrimaryMainFrame()); return shell; } @@ -242,8 +243,9 @@ } void Shell::RenderFrameCreated(RenderFrameHost* frame_host) { - if (frame_host == web_contents_->GetPrimaryMainFrame()) - g_platform->MainFrameCreated(this); + if (frame_host == frame_host->GetOutermostMainFrame()) { + g_platform->MainFrameCreated(this, frame_host); + } } void Shell::LoadURL(const GURL& url) {
diff --git a/content/shell/browser/shell_platform_delegate.h b/content/shell/browser/shell_platform_delegate.h index ef6ec51..e66501c 100644 --- a/content/shell/browser/shell_platform_delegate.h +++ b/content/shell/browser/shell_platform_delegate.h
@@ -86,7 +86,11 @@ // Called when the main frame is created in the renderer process; forwarded // from WebContentsObserver. If navigation creates a new main frame, this may // occur more than once. - virtual void MainFrameCreated(Shell* shell); + // |main_frame| points to the new frame that was created. This is different + // than |shell|'s primary main frame, because |main_frame|'s document hasn't + // committed at this point and hasn't been swapped with the old |shell|'s + // primary main frame. + virtual void MainFrameCreated(Shell* shell, RenderFrameHost* main_frame); // Allows platforms to override the JavascriptDialogManager. By default // returns null, which signals that the Shell should use its own instance.
diff --git a/content/shell/browser/shell_platform_delegate_android.cc b/content/shell/browser/shell_platform_delegate_android.cc index a8d5b86..a62e0fd 100644 --- a/content/shell/browser/shell_platform_delegate_android.cc +++ b/content/shell/browser/shell_platform_delegate_android.cc
@@ -111,7 +111,8 @@ void ShellPlatformDelegate::SetTitle(Shell* shell, const std::u16string& title) {} -void ShellPlatformDelegate::MainFrameCreated(Shell* shell) {} +void ShellPlatformDelegate::MainFrameCreated(Shell* shell, + RenderFrameHost* main_frame) {} bool ShellPlatformDelegate::DestroyShell(Shell* shell) { return false; // Shell destroys itself.
diff --git a/content/shell/browser/shell_platform_delegate_aura.cc b/content/shell/browser/shell_platform_delegate_aura.cc index 1831839..97b3b62 100644 --- a/content/shell/browser/shell_platform_delegate_aura.cc +++ b/content/shell/browser/shell_platform_delegate_aura.cc
@@ -83,7 +83,8 @@ void ShellPlatformDelegate::SetTitle(Shell* shell, const std::u16string& title) {} -void ShellPlatformDelegate::MainFrameCreated(Shell* shell) {} +void ShellPlatformDelegate::MainFrameCreated(Shell* shell, + RenderFrameHost* main_frame) {} bool ShellPlatformDelegate::DestroyShell(Shell* shell) { return false; // Shell destroys itself.
diff --git a/content/shell/browser/shell_platform_delegate_ios.mm b/content/shell/browser/shell_platform_delegate_ios.mm index 8eef2ee..b61368e5 100644 --- a/content/shell/browser/shell_platform_delegate_ios.mm +++ b/content/shell/browser/shell_platform_delegate_ios.mm
@@ -695,7 +695,8 @@ DCHECK(base::Contains(shell_data_map_, shell)); } -void ShellPlatformDelegate::MainFrameCreated(Shell* shell) {} +void ShellPlatformDelegate::MainFrameCreated(Shell* shell, + RenderFrameHost* main_frame) {} bool ShellPlatformDelegate::DestroyShell(Shell* shell) { DCHECK(base::Contains(shell_data_map_, shell));
diff --git a/content/shell/browser/shell_platform_delegate_mac.mm b/content/shell/browser/shell_platform_delegate_mac.mm index fd7e0efb..03957f27 100644 --- a/content/shell/browser/shell_platform_delegate_mac.mm +++ b/content/shell/browser/shell_platform_delegate_mac.mm
@@ -295,7 +295,8 @@ shell_data.delegate.window.title = base::SysUTF16ToNSString(title); } -void ShellPlatformDelegate::MainFrameCreated(Shell* shell) {} +void ShellPlatformDelegate::MainFrameCreated(Shell* shell, + RenderFrameHost* main_frame) {} bool ShellPlatformDelegate::DestroyShell(Shell* shell) { DCHECK(base::Contains(shell_data_map_, shell));
diff --git a/content/shell/browser/shell_platform_delegate_views.cc b/content/shell/browser/shell_platform_delegate_views.cc index 0d89ad3..93710e52ef 100644 --- a/content/shell/browser/shell_platform_delegate_views.cc +++ b/content/shell/browser/shell_platform_delegate_views.cc
@@ -450,7 +450,8 @@ shell_data.window_widget->widget_delegate()->SetTitle(title); } -void ShellPlatformDelegate::MainFrameCreated(Shell* shell) {} +void ShellPlatformDelegate::MainFrameCreated(Shell* shell, + RenderFrameHost* main_frame) {} bool ShellPlatformDelegate::DestroyShell(Shell* shell) { DCHECK(base::Contains(shell_data_map_, shell));
diff --git a/content/test/BUILD.gn b/content/test/BUILD.gn index 4c4b74ad4..1e0218fe 100644 --- a/content/test/BUILD.gn +++ b/content/test/BUILD.gn
@@ -2891,6 +2891,7 @@ "../browser/tracing/tracing_scenario_unittest.cc", "../browser/usb/web_usb_service_impl_unittest.cc", "../browser/web_contents/aura/gesture_nav_simple_unittest.cc", + "../browser/web_contents/file_chooser_impl_unittest.cc", "../browser/web_contents/web_contents_delegate_unittest.cc", "../browser/web_contents/web_contents_impl_unittest.cc", "../browser/web_contents/web_contents_user_data_unittest.cc",
diff --git a/content/web_test/browser/web_test_shell_platform_delegate.h b/content/web_test/browser/web_test_shell_platform_delegate.h index 054df33..dc88732411 100644 --- a/content/web_test/browser/web_test_shell_platform_delegate.h +++ b/content/web_test/browser/web_test_shell_platform_delegate.h
@@ -31,7 +31,7 @@ bool is_enabled) override; void SetAddressBarURL(Shell* shell, const GURL& url) override; void SetTitle(Shell* shell, const std::u16string& title) override; - void MainFrameCreated(Shell* shell) override; + void MainFrameCreated(Shell* shell, RenderFrameHost* main_frame) override; std::unique_ptr<JavaScriptDialogManager> CreateJavaScriptDialogManager( Shell* shell) override; bool HandlePointerLockRequest(Shell* shell,
diff --git a/content/web_test/browser/web_test_shell_platform_delegate_aura.cc b/content/web_test/browser/web_test_shell_platform_delegate_aura.cc index f677b6ea..2250fd2 100644 --- a/content/web_test/browser/web_test_shell_platform_delegate_aura.cc +++ b/content/web_test/browser/web_test_shell_platform_delegate_aura.cc
@@ -57,8 +57,10 @@ ShellPlatformDelegate::SetTitle(shell, title); } -void WebTestShellPlatformDelegate::MainFrameCreated(Shell* shell) { - ShellPlatformDelegate::MainFrameCreated(shell); +void WebTestShellPlatformDelegate::MainFrameCreated( + Shell* shell, + RenderFrameHost* main_frame) { + ShellPlatformDelegate::MainFrameCreated(shell, main_frame); } bool WebTestShellPlatformDelegate::DestroyShell(Shell* shell) {
diff --git a/content/web_test/browser/web_test_shell_platform_delegate_ios.mm b/content/web_test/browser/web_test_shell_platform_delegate_ios.mm index a376c1ff..b04ed9d 100644 --- a/content/web_test/browser/web_test_shell_platform_delegate_ios.mm +++ b/content/web_test/browser/web_test_shell_platform_delegate_ios.mm
@@ -53,8 +53,10 @@ ShellPlatformDelegate::SetTitle(shell, title); } -void WebTestShellPlatformDelegate::MainFrameCreated(Shell* shell) { - ShellPlatformDelegate::MainFrameCreated(shell); +void WebTestShellPlatformDelegate::MainFrameCreated( + Shell* shell, + RenderFrameHost* main_frame) { + ShellPlatformDelegate::MainFrameCreated(shell, main_frame); } bool WebTestShellPlatformDelegate::DestroyShell(Shell* shell) {
diff --git a/content/web_test/browser/web_test_shell_platform_delegate_mac.mm b/content/web_test/browser/web_test_shell_platform_delegate_mac.mm index ca216bb..3498a49 100644 --- a/content/web_test/browser/web_test_shell_platform_delegate_mac.mm +++ b/content/web_test/browser/web_test_shell_platform_delegate_mac.mm
@@ -6,6 +6,8 @@ #import "base/apple/foundation_util.h" #include "base/containers/contains.h" +#include "content/browser/renderer_host/render_frame_host_delegate.h" +#include "content/browser/renderer_host/render_frame_host_impl.h" #include "content/browser/renderer_host/render_widget_host_view_mac.h" #include "content/public/browser/render_frame_host.h" #include "content/public/browser/render_widget_host.h" @@ -97,9 +99,11 @@ } } -void WebTestShellPlatformDelegate::MainFrameCreated(Shell* shell) { +void WebTestShellPlatformDelegate::MainFrameCreated( + Shell* shell, + RenderFrameHost* main_frame) { if (!IsHeadless()) { - ShellPlatformDelegate::MainFrameCreated(shell); + ShellPlatformDelegate::MainFrameCreated(shell, main_frame); return; } @@ -119,8 +123,24 @@ // We use the signal that the `blink::WebView` has been created in the // renderer as a proxy for knowing when the top level RenderWidgetHostView is // created, since they are created at the same time. - DCHECK(shell->web_contents()->GetPrimaryMainFrame()->GetView()); ResizeWebContent(shell, shell_data.initial_size); + + // The above code changes the widget screen rects of the currently navigated + // RenderWidgetHostView, but not the RenderWidgetHostView of the new main + // frame. If there is no render frame swap (i.e. RenderDocument is disabled), + // then this doesn't matter. However, if there is a swap, then the new RWHV + // will also need to have its screen rects updated so they are not left at + // 0x0. Popups are left alone since there are some tests that modify the + // window size mid-navigation, and this code block can race with that and undo + // the resize. + if (!RenderFrameHostImpl::From(main_frame)->delegate()->IsPopup()) { + DCHECK(main_frame->GetView()); + auto* rwhv_mac = + static_cast<RenderWidgetHostViewMac*>(main_frame->GetView()); + if (rwhv_mac) { + rwhv_mac->SetWindowFrameInScreen(gfx::Rect(shell_data.initial_size)); + } + } } bool WebTestShellPlatformDelegate::DestroyShell(Shell* shell) {
diff --git a/content/web_test/browser/web_test_shell_platform_delegate_views.cc b/content/web_test/browser/web_test_shell_platform_delegate_views.cc index 2d18ec09..d799813 100644 --- a/content/web_test/browser/web_test_shell_platform_delegate_views.cc +++ b/content/web_test/browser/web_test_shell_platform_delegate_views.cc
@@ -121,9 +121,11 @@ // Nothing in headless mode. } -void WebTestShellPlatformDelegate::MainFrameCreated(Shell* shell) { +void WebTestShellPlatformDelegate::MainFrameCreated( + Shell* shell, + RenderFrameHost* main_frame) { // No difference in headless mode. - ShellPlatformDelegate::MainFrameCreated(shell); + ShellPlatformDelegate::MainFrameCreated(shell, main_frame); } bool WebTestShellPlatformDelegate::DestroyShell(Shell* shell) {
diff --git a/docs/website b/docs/website index a96616b..1906b0b 160000 --- a/docs/website +++ b/docs/website
@@ -1 +1 @@ -Subproject commit a96616b68569bc8dc258cb570fd1b2f9122ce85e +Subproject commit 1906b0bbaa142dc87acd171137d5a234aeba74c8
diff --git a/extensions/browser/api/web_request/web_request_permissions_unittest.cc b/extensions/browser/api/web_request/web_request_permissions_unittest.cc index d10a669..0579aa7 100644 --- a/extensions/browser/api/web_request/web_request_permissions_unittest.cc +++ b/extensions/browser/api/web_request/web_request_permissions_unittest.cc
@@ -17,6 +17,7 @@ #include "extensions/browser/extension_registry.h" #include "extensions/browser/extensions_test.h" #include "extensions/browser/process_map.h" +#include "extensions/common/constants.h" #include "extensions/common/extension.h" #include "extensions/common/extension_builder.h" #include "extensions/common/permissions/permission_set.h"
diff --git a/extensions/browser/extensions_browser_client.h b/extensions/browser/extensions_browser_client.h index c59f2b9..7b13431 100644 --- a/extensions/browser/extensions_browser_client.h +++ b/extensions/browser/extensions_browser_client.h
@@ -21,7 +21,6 @@ #include "extensions/browser/extension_event_histogram_value.h" #include "extensions/browser/extension_prefs_observer.h" #include "extensions/browser/extensions_browser_api_provider.h" -#include "extensions/browser/script_executor.h" #include "extensions/common/extension_id.h" #include "extensions/common/mojom/view_type.mojom.h" #include "mojo/public/cpp/bindings/pending_receiver.h" @@ -98,6 +97,7 @@ class RuntimeAPIDelegate; class SafeBrowsingDelegate; class ScopedExtensionUpdaterKeepAlive; +class ScriptExecutor; class UserScriptListener; // Interface to allow the extensions module to make browser-process-specific
diff --git a/extensions/renderer/api/automation/automation_internal_custom_bindings.cc b/extensions/renderer/api/automation/automation_internal_custom_bindings.cc index a1360f1..b742da2 100644 --- a/extensions/renderer/api/automation/automation_internal_custom_bindings.cc +++ b/extensions/renderer/api/automation/automation_internal_custom_bindings.cc
@@ -31,7 +31,6 @@ #include "extensions/renderer/native_extension_bindings_system.h" #include "extensions/renderer/object_backed_native_handler.h" #include "extensions/renderer/script_context.h" -#include "ipc/message_filter.h" #include "third_party/blink/public/web/web_local_frame.h" #include "ui/accessibility/ax_event.h" #include "ui/accessibility/ax_event_generator.h"
diff --git a/extensions/renderer/api/messaging/one_time_message_handler.cc b/extensions/renderer/api/messaging/one_time_message_handler.cc index 7990d0a7..9c23cf9 100644 --- a/extensions/renderer/api/messaging/one_time_message_handler.cc +++ b/extensions/renderer/api/messaging/one_time_message_handler.cc
@@ -765,8 +765,9 @@ return; } - debug::ScopedPromiseRejectedResponseCrashKeys(base::FeatureList::IsEnabled( - extensions_features::kRuntimeOnMessagePromiseReturnSupport)); + debug::ScopedPromiseRejectedResponseCrashKeys promise_rejected_crash_keys( + base::FeatureList::IsEnabled( + extensions_features::kRuntimeOnMessagePromiseReturnSupport)); v8::Local<v8::Value> promise_reject_reason; // This is safe to CHECK() because when a promise rejects it always provides a // value. Even if `reject()` (with no argument) is called we see `undefined`
diff --git a/extensions/test/data/api_test/messaging/on_message_promise_reject/background.js b/extensions/test/data/api_test/messaging/on_message_promise_reject/background.js index 0112a0c..60b1299 100644 --- a/extensions/test/data/api_test/messaging/on_message_promise_reject/background.js +++ b/extensions/test/data/api_test/messaging/on_message_promise_reject/background.js
@@ -29,6 +29,10 @@ return new Promise((unusedResolve, reject) => { reject(); }); + case 'return promise reject with undefined': + return new Promise((unusedResolve, reject) => { + reject(undefined); + }); default: chrome.test.fail('Unexpected test message: ' + message); }
diff --git a/extensions/test/data/api_test/messaging/on_message_promise_reject/content_script.js b/extensions/test/data/api_test/messaging/on_message_promise_reject/content_script.js index ecec1602..ee34716 100644 --- a/extensions/test/data/api_test/messaging/on_message_promise_reject/content_script.js +++ b/extensions/test/data/api_test/messaging/on_message_promise_reject/content_script.js
@@ -61,7 +61,7 @@ // Tests if the rejection value is not passed anything, then a generic Error // will be provided to the caller. - async function onMessagePromiseRejectWithNoRejectValuePromise() { + async function onMessagePromiseRejectWithNoRejectValue() { await chrome.test.assertPromiseRejects( chrome.runtime.sendMessage( 'return promise reject with no reject value'), @@ -70,6 +70,14 @@ chrome.test.succeed(); }, + async function onMessagePromiseRejectWithUndefinedValue() { + await chrome.test.assertPromiseRejects( + chrome.runtime.sendMessage('return promise reject with undefined'), + 'Error: A runtime.onMessage listener\'s promise rejected without an ' + + 'Error'); + chrome.test.succeed(); + }, + // TODO(crbug.com/424560420): Also test sender callback behavior for promise // returns. mozilla/webextension-polyfill doesn't support callbacks but // Firefox does so it'd be good to know what our current behavior is for
diff --git a/gpu/BUILD.gn b/gpu/BUILD.gn index a04dc73..ed30455 100644 --- a/gpu/BUILD.gn +++ b/gpu/BUILD.gn
@@ -119,7 +119,7 @@ "//gpu/ipc/client", "//gpu/ipc/common", "//gpu/ipc/service", - "//gpu/skia_bindings:skia_bindings", + "//gpu/skia_bindings", "//media", "//testing/gmock", "//testing/gtest", @@ -156,7 +156,7 @@ deps = [ ":gl_lpm_fuzzer_proto", - "//base:base", + "//base", ] } @@ -195,12 +195,12 @@ "//gpu/command_buffer/client:gles2_implementation", "//gpu/command_buffer/common:gles2_utils", "//gpu/ipc:gl_in_process_context", - "//gpu/ipc/service:service", - "//testing/gtest:gtest", + "//gpu/ipc/service", + "//testing/gtest", "//third_party/libprotobuf-mutator", - "//ui/gfx:gfx", - "//ui/gl:gl", - "//ui/gl/init:init", + "//ui/gfx", + "//ui/gl", + "//ui/gl/init", ] if (use_ozone) { @@ -324,7 +324,7 @@ } if (enable_vulkan) { - deps += [ "//gpu/vulkan/init:init" ] + deps += [ "//gpu/vulkan/init" ] } libs = [] @@ -682,7 +682,7 @@ } if (is_apple) { - deps += [ "//ui/accelerated_widget_mac:accelerated_widget_mac" ] + deps += [ "//ui/accelerated_widget_mac" ] } # TODO(crbug.com/40031409): Fix code that adds exit-time destructors and
diff --git a/gpu/command_buffer/client/BUILD.gn b/gpu/command_buffer/client/BUILD.gn index 22c57a9..796e20d 100644 --- a/gpu/command_buffer/client/BUILD.gn +++ b/gpu/command_buffer/client/BUILD.gn
@@ -207,7 +207,7 @@ "//components/viz/common:shared_image_format", "//gpu/command_buffer/common", "//gpu/command_buffer/common:raster", - "//skia:skia", + "//skia", "//ui/gfx:buffer_types", ] }
diff --git a/gpu/command_buffer/common/BUILD.gn b/gpu/command_buffer/common/BUILD.gn index 9527a8a..b9cd79b 100644 --- a/gpu/command_buffer/common/BUILD.gn +++ b/gpu/command_buffer/common/BUILD.gn
@@ -162,7 +162,7 @@ ":gles2_utils", "//base", "//skia", - "//ui/gl:gl", + "//ui/gl", ] public_deps = [ ":common",
diff --git a/gpu/command_buffer/service/BUILD.gn b/gpu/command_buffer/service/BUILD.gn index 95ed9d4..6cc81843 100644 --- a/gpu/command_buffer/service/BUILD.gn +++ b/gpu/command_buffer/service/BUILD.gn
@@ -78,7 +78,7 @@ public_deps = [ "//base", "//gpu/command_buffer/common", - "//url:url", + "//url", ] deps = [ "//base", @@ -354,6 +354,7 @@ "//gpu:raster_implementation", "//gpu:webgpu_implementation", "//third_party/khronos:khronos_headers", + "//third_party/angle:no_thread_safety_warnings", ] public_deps = [
diff --git a/gpu/ipc/BUILD.gn b/gpu/ipc/BUILD.gn index 65a6bb7a..b84577e 100644 --- a/gpu/ipc/BUILD.gn +++ b/gpu/ipc/BUILD.gn
@@ -35,7 +35,7 @@ "//gpu/ipc/common:surface_handle_type", "//gpu/ipc/host", "//gpu/ipc/service", - "//gpu/skia_bindings:skia_bindings", + "//gpu/skia_bindings", "//ui/gfx", "//ui/gfx/geometry", "//ui/gl",
diff --git a/gpu/ipc/common/BUILD.gn b/gpu/ipc/common/BUILD.gn index 2d679f1..5209c10 100644 --- a/gpu/ipc/common/BUILD.gn +++ b/gpu/ipc/common/BUILD.gn
@@ -125,7 +125,7 @@ ] } if (is_android) { - visibility += [ "//media/gpu:gpu" ] + visibility += [ "//media/gpu" ] } configs += [ @@ -844,7 +844,7 @@ ":memory_stats_sources", ":surface_handle_type", "//gpu/command_buffer/common", - "//mojo/public/cpp/bindings:bindings", + "//mojo/public/cpp/bindings", ] if (enable_vulkan) {
diff --git a/gpu/ipc/service/BUILD.gn b/gpu/ipc/service/BUILD.gn index 71858019..1e35afb 100644 --- a/gpu/ipc/service/BUILD.gn +++ b/gpu/ipc/service/BUILD.gn
@@ -117,8 +117,8 @@ if (is_mac) { sources += [ "image_transport_surface_mac.mm" ] deps += [ - "//ui/display:display", - "//ui/display/types:types", + "//ui/display", + "//ui/display/types", ] lib_dirs = [ "$mac_sdk_path/usr/lib" ] frameworks = [ @@ -177,7 +177,7 @@ sources = [ "gpu_memory_buffer_factory_test_template.h" ] public_deps = [ ":service", - "//testing/gtest:gtest", + "//testing/gtest", ] deps = [ "//base/test:test_support",
diff --git a/gpu/vulkan/BUILD.gn b/gpu/vulkan/BUILD.gn index 0ff2f57..b2a5b94 100644 --- a/gpu/vulkan/BUILD.gn +++ b/gpu/vulkan/BUILD.gn
@@ -76,7 +76,7 @@ ":vulkan_function_pointers", "//base", "//third_party/vulkan_memory_allocator", - "//ui/gfx:gfx", + "//ui/gfx", ] } @@ -255,7 +255,7 @@ deps = [ ":test_support", - "//base:base", + "//base", "//base/test:test_support", "//components/viz/common:vulkan_context_provider", "//gpu/ipc/service",
diff --git a/gpu/vulkan/android/BUILD.gn b/gpu/vulkan/android/BUILD.gn index 1dbb1d0..fb0e160 100644 --- a/gpu/vulkan/android/BUILD.gn +++ b/gpu/vulkan/android/BUILD.gn
@@ -38,7 +38,7 @@ test("vk_tests") { deps = [ ":android", - "//base:base", + "//base", "//base/test:test_support", "//components/viz/common:vulkan_context_provider", "//testing/gtest",
diff --git a/infra/config/generated/builder-owners/chrome-deet-core@google.com.txt b/infra/config/generated/builder-owners/chrome-deet-core@google.com.txt deleted file mode 100644 index 2df91d5..0000000 --- a/infra/config/generated/builder-owners/chrome-deet-core@google.com.txt +++ /dev/null
@@ -1,19 +0,0 @@ -ci/Centipede High End Upload Linux ASan -ci/Centipede High End Upload Linux ASan DCheck -ci/Centipede Upload Linux ASan -ci/Libfuzzer High End Upload Linux ASan -ci/Libfuzzer High End Upload Linux ASan Debug -ci/Libfuzzer Upload Chrome OS ASan -ci/Libfuzzer Upload Linux ASan -ci/Libfuzzer Upload Linux ASan Debug -ci/Libfuzzer Upload Linux MSan -ci/Libfuzzer Upload Linux UBSan -ci/Libfuzzer Upload Linux32 ASan -ci/Libfuzzer Upload Mac ASan -ci/Libfuzzer Upload Windows ASan -ci/Libfuzzer Upload iOS Catalyst Debug -try/chromeos-libfuzzer-asan-rel -try/linux-centipede-high-end-asan-dcheck -try/linux-libfuzzer-high-end-asan-dbg -try/linux-libfuzzer-high-end-asan-rel -try/mac-libfuzzer-asan-rel \ No newline at end of file
diff --git a/infra/config/generated/builder-owners/chrome-fuzzing-core@google.com.txt b/infra/config/generated/builder-owners/chrome-fuzzing-core@google.com.txt index 29fba6a..3c47f7c 100644 --- a/infra/config/generated/builder-owners/chrome-fuzzing-core@google.com.txt +++ b/infra/config/generated/builder-owners/chrome-fuzzing-core@google.com.txt
@@ -1 +1,20 @@ -ci/linux-centipede-fuzz-coverage \ No newline at end of file +ci/Centipede High End Upload Linux ASan +ci/Centipede High End Upload Linux ASan DCheck +ci/Centipede Upload Linux ASan +ci/Libfuzzer High End Upload Linux ASan +ci/Libfuzzer High End Upload Linux ASan Debug +ci/Libfuzzer Upload Chrome OS ASan +ci/Libfuzzer Upload Linux ASan +ci/Libfuzzer Upload Linux ASan Debug +ci/Libfuzzer Upload Linux MSan +ci/Libfuzzer Upload Linux UBSan +ci/Libfuzzer Upload Linux32 ASan +ci/Libfuzzer Upload Mac ASan +ci/Libfuzzer Upload Windows ASan +ci/Libfuzzer Upload iOS Catalyst Debug +ci/linux-centipede-fuzz-coverage +try/chromeos-libfuzzer-asan-rel +try/linux-centipede-high-end-asan-dcheck +try/linux-libfuzzer-high-end-asan-dbg +try/linux-libfuzzer-high-end-asan-rel +try/mac-libfuzzer-asan-rel \ No newline at end of file
diff --git a/infra/config/generated/health-specs/health-specs.json b/infra/config/generated/health-specs/health-specs.json index 66ef2df9..487480d 100644 --- a/infra/config/generated/health-specs/health-specs.json +++ b/infra/config/generated/health-specs/health-specs.json
@@ -664,7 +664,7 @@ ] }, "Centipede High End Upload Linux ASan": { - "contact_team_email": "chrome-deet-core@google.com", + "contact_team_email": "chrome-fuzzing-core@google.com", "problem_specs": [ { "name": "Unhealthy", @@ -685,7 +685,7 @@ ] }, "Centipede High End Upload Linux ASan DCheck": { - "contact_team_email": "chrome-deet-core@google.com", + "contact_team_email": "chrome-fuzzing-core@google.com", "problem_specs": [ { "name": "Unhealthy", @@ -706,7 +706,7 @@ ] }, "Centipede Upload Linux ASan": { - "contact_team_email": "chrome-deet-core@google.com", + "contact_team_email": "chrome-fuzzing-core@google.com", "problem_specs": [ { "name": "Unhealthy", @@ -2622,7 +2622,7 @@ ] }, "Libfuzzer High End Upload Linux ASan": { - "contact_team_email": "chrome-deet-core@google.com", + "contact_team_email": "chrome-fuzzing-core@google.com", "problem_specs": [ { "name": "Unhealthy", @@ -2643,7 +2643,7 @@ ] }, "Libfuzzer High End Upload Linux ASan Debug": { - "contact_team_email": "chrome-deet-core@google.com", + "contact_team_email": "chrome-fuzzing-core@google.com", "problem_specs": [ { "name": "Unhealthy", @@ -2664,7 +2664,7 @@ ] }, "Libfuzzer Upload Chrome OS ASan": { - "contact_team_email": "chrome-deet-core@google.com", + "contact_team_email": "chrome-fuzzing-core@google.com", "problem_specs": [ { "name": "Unhealthy", @@ -2685,7 +2685,7 @@ ] }, "Libfuzzer Upload Linux ASan": { - "contact_team_email": "chrome-deet-core@google.com", + "contact_team_email": "chrome-fuzzing-core@google.com", "problem_specs": [ { "name": "Unhealthy", @@ -2706,7 +2706,7 @@ ] }, "Libfuzzer Upload Linux ASan Debug": { - "contact_team_email": "chrome-deet-core@google.com", + "contact_team_email": "chrome-fuzzing-core@google.com", "problem_specs": [ { "name": "Unhealthy", @@ -2727,7 +2727,7 @@ ] }, "Libfuzzer Upload Linux MSan": { - "contact_team_email": "chrome-deet-core@google.com", + "contact_team_email": "chrome-fuzzing-core@google.com", "problem_specs": [ { "name": "Unhealthy", @@ -2748,7 +2748,7 @@ ] }, "Libfuzzer Upload Linux UBSan": { - "contact_team_email": "chrome-deet-core@google.com", + "contact_team_email": "chrome-fuzzing-core@google.com", "problem_specs": [ { "name": "Unhealthy", @@ -2811,7 +2811,7 @@ ] }, "Libfuzzer Upload Linux32 ASan": { - "contact_team_email": "chrome-deet-core@google.com", + "contact_team_email": "chrome-fuzzing-core@google.com", "problem_specs": [ { "name": "Unhealthy", @@ -2874,7 +2874,7 @@ ] }, "Libfuzzer Upload Mac ASan": { - "contact_team_email": "chrome-deet-core@google.com", + "contact_team_email": "chrome-fuzzing-core@google.com", "problem_specs": [ { "name": "Unhealthy", @@ -2895,7 +2895,7 @@ ] }, "Libfuzzer Upload Windows ASan": { - "contact_team_email": "chrome-deet-core@google.com", + "contact_team_email": "chrome-fuzzing-core@google.com", "problem_specs": [ { "name": "Unhealthy", @@ -2916,7 +2916,7 @@ ] }, "Libfuzzer Upload iOS Catalyst Debug": { - "contact_team_email": "chrome-deet-core@google.com", + "contact_team_email": "chrome-fuzzing-core@google.com", "problem_specs": [ { "name": "Unhealthy",
diff --git a/infra/config/generated/luci/cr-buildbucket.cfg b/infra/config/generated/luci/cr-buildbucket.cfg index 30a33df0..26a0db5 100644 --- a/infra/config/generated/luci/cr-buildbucket.cfg +++ b/infra/config/generated/luci/cr-buildbucket.cfg
@@ -5347,14 +5347,14 @@ use_invocation_timestamp: true } } - description_html: "This builder uploads centipede high end fuzzers.Those fuzzers require more resources to run correctly.<br/>Builder owner: <a href=mailto:chrome-deet-core@google.com>chrome-deet-core@google.com</a>" + description_html: "This builder uploads centipede high end fuzzers.Those fuzzers require more resources to run correctly.<br/>Builder owner: <a href=mailto:chrome-fuzzing-core@google.com>chrome-fuzzing-core@google.com</a>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" dimensions: "free_space:" dimensions: "pool:luci.chromium.try" } - contact_team_email: "chrome-deet-core@google.com" + contact_team_email: "chrome-fuzzing-core@google.com" custom_metric_definitions { name: "/chrome/infra/browser/builds/cached_count" predicates: "has(build.output.properties.is_cached)" @@ -5458,14 +5458,14 @@ use_invocation_timestamp: true } } - description_html: "This builder uploads centipede high end fuzzers in release mode with dcheck_always_on.<br/>This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-centipede-high-end-asan-dcheck\">linux-centipede-high-end-asan-dcheck</a></li></ul><br/>Builder owner: <a href=mailto:chrome-deet-core@google.com>chrome-deet-core@google.com</a>" + description_html: "This builder uploads centipede high end fuzzers in release mode with dcheck_always_on.<br/>This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-centipede-high-end-asan-dcheck\">linux-centipede-high-end-asan-dcheck</a></li></ul><br/>Builder owner: <a href=mailto:chrome-fuzzing-core@google.com>chrome-fuzzing-core@google.com</a>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" dimensions: "free_space:" dimensions: "pool:luci.chromium.try" } - contact_team_email: "chrome-deet-core@google.com" + contact_team_email: "chrome-fuzzing-core@google.com" custom_metric_definitions { name: "/chrome/infra/browser/builds/cached_count" predicates: "has(build.output.properties.is_cached)" @@ -5575,14 +5575,14 @@ use_invocation_timestamp: true } } - description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-centipede-asan-rel\">linux-centipede-asan-rel</a></li></ul><br/>Builder owner: <a href=mailto:chrome-deet-core@google.com>chrome-deet-core@google.com</a>" + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-centipede-asan-rel\">linux-centipede-asan-rel</a></li></ul><br/>Builder owner: <a href=mailto:chrome-fuzzing-core@google.com>chrome-fuzzing-core@google.com</a>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" dimensions: "free_space:" dimensions: "pool:luci.chromium.try" } - contact_team_email: "chrome-deet-core@google.com" + contact_team_email: "chrome-fuzzing-core@google.com" custom_metric_definitions { name: "/chrome/infra/browser/builds/cached_count" predicates: "has(build.output.properties.is_cached)" @@ -16133,14 +16133,14 @@ use_invocation_timestamp: true } } - description_html: "This builder uploads libfuzzer high end fuzzers.Those fuzzers require more resources to run correctly.<br/>This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-libfuzzer-high-end-asan-rel\">linux-libfuzzer-high-end-asan-rel</a></li></ul><br/>Builder owner: <a href=mailto:chrome-deet-core@google.com>chrome-deet-core@google.com</a>" + description_html: "This builder uploads libfuzzer high end fuzzers.Those fuzzers require more resources to run correctly.<br/>This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-libfuzzer-high-end-asan-rel\">linux-libfuzzer-high-end-asan-rel</a></li></ul><br/>Builder owner: <a href=mailto:chrome-fuzzing-core@google.com>chrome-fuzzing-core@google.com</a>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" dimensions: "free_space:" dimensions: "pool:luci.chromium.try" } - contact_team_email: "chrome-deet-core@google.com" + contact_team_email: "chrome-fuzzing-core@google.com" custom_metric_definitions { name: "/chrome/infra/browser/builds/cached_count" predicates: "has(build.output.properties.is_cached)" @@ -16244,14 +16244,14 @@ use_invocation_timestamp: true } } - description_html: "This builder uploads libfuzzer high end fuzzers.Those fuzzers require more resources to run correctly.<br/>This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-libfuzzer-high-end-asan-dbg\">linux-libfuzzer-high-end-asan-dbg</a></li></ul><br/>Builder owner: <a href=mailto:chrome-deet-core@google.com>chrome-deet-core@google.com</a>" + description_html: "This builder uploads libfuzzer high end fuzzers.Those fuzzers require more resources to run correctly.<br/>This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-libfuzzer-high-end-asan-dbg\">linux-libfuzzer-high-end-asan-dbg</a></li></ul><br/>Builder owner: <a href=mailto:chrome-fuzzing-core@google.com>chrome-fuzzing-core@google.com</a>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" dimensions: "free_space:" dimensions: "pool:luci.chromium.try" } - contact_team_email: "chrome-deet-core@google.com" + contact_team_email: "chrome-fuzzing-core@google.com" custom_metric_definitions { name: "/chrome/infra/browser/builds/cached_count" predicates: "has(build.output.properties.is_cached)" @@ -16361,14 +16361,14 @@ use_invocation_timestamp: true } } - description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/chromeos-libfuzzer-asan-rel\">chromeos-libfuzzer-asan-rel</a></li></ul><br/>Builder owner: <a href=mailto:chrome-deet-core@google.com>chrome-deet-core@google.com</a>" + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/chromeos-libfuzzer-asan-rel\">chromeos-libfuzzer-asan-rel</a></li></ul><br/>Builder owner: <a href=mailto:chrome-fuzzing-core@google.com>chrome-fuzzing-core@google.com</a>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" dimensions: "free_space:" dimensions: "pool:luci.chromium.try" } - contact_team_email: "chrome-deet-core@google.com" + contact_team_email: "chrome-fuzzing-core@google.com" custom_metric_definitions { name: "/chrome/infra/browser/builds/cached_count" predicates: "has(build.output.properties.is_cached)" @@ -16478,14 +16478,14 @@ use_invocation_timestamp: true } } - description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-libfuzzer-asan-rel\">linux-libfuzzer-asan-rel</a></li></ul><br/>Builder owner: <a href=mailto:chrome-deet-core@google.com>chrome-deet-core@google.com</a>" + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-libfuzzer-asan-rel\">linux-libfuzzer-asan-rel</a></li></ul><br/>Builder owner: <a href=mailto:chrome-fuzzing-core@google.com>chrome-fuzzing-core@google.com</a>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" dimensions: "free_space:" dimensions: "pool:luci.chromium.try" } - contact_team_email: "chrome-deet-core@google.com" + contact_team_email: "chrome-fuzzing-core@google.com" custom_metric_definitions { name: "/chrome/infra/browser/builds/cached_count" predicates: "has(build.output.properties.is_cached)" @@ -16595,14 +16595,14 @@ use_invocation_timestamp: true } } - description_html: "Builder owner: <a href=mailto:chrome-deet-core@google.com>chrome-deet-core@google.com</a>" + description_html: "Builder owner: <a href=mailto:chrome-fuzzing-core@google.com>chrome-fuzzing-core@google.com</a>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" dimensions: "free_space:" dimensions: "pool:luci.chromium.try" } - contact_team_email: "chrome-deet-core@google.com" + contact_team_email: "chrome-fuzzing-core@google.com" custom_metric_definitions { name: "/chrome/infra/browser/builds/cached_count" predicates: "has(build.output.properties.is_cached)" @@ -16712,14 +16712,14 @@ use_invocation_timestamp: true } } - description_html: "Builder owner: <a href=mailto:chrome-deet-core@google.com>chrome-deet-core@google.com</a>" + description_html: "Builder owner: <a href=mailto:chrome-fuzzing-core@google.com>chrome-fuzzing-core@google.com</a>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" dimensions: "free_space:" dimensions: "pool:luci.chromium.try" } - contact_team_email: "chrome-deet-core@google.com" + contact_team_email: "chrome-fuzzing-core@google.com" custom_metric_definitions { name: "/chrome/infra/browser/builds/cached_count" predicates: "has(build.output.properties.is_cached)" @@ -16827,7 +16827,7 @@ use_invocation_timestamp: true } } - description_html: "Builder owner: <a href=mailto:chrome-deet-core@google.com>chrome-deet-core@google.com</a>" + description_html: "Builder owner: <a href=mailto:chrome-fuzzing-core@google.com>chrome-fuzzing-core@google.com</a>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -16835,7 +16835,7 @@ dimensions: "builderless:1" dimensions: "pool:luci.chromium.try" } - contact_team_email: "chrome-deet-core@google.com" + contact_team_email: "chrome-fuzzing-core@google.com" custom_metric_definitions { name: "/chrome/infra/browser/builds/cached_count" predicates: "has(build.output.properties.is_cached)" @@ -17179,14 +17179,14 @@ use_invocation_timestamp: true } } - description_html: "Builder owner: <a href=mailto:chrome-deet-core@google.com>chrome-deet-core@google.com</a>" + description_html: "Builder owner: <a href=mailto:chrome-fuzzing-core@google.com>chrome-fuzzing-core@google.com</a>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" dimensions: "free_space:" dimensions: "pool:luci.chromium.try" } - contact_team_email: "chrome-deet-core@google.com" + contact_team_email: "chrome-fuzzing-core@google.com" custom_metric_definitions { name: "/chrome/infra/browser/builds/cached_count" predicates: "has(build.output.properties.is_cached)" @@ -17528,7 +17528,7 @@ use_invocation_timestamp: true } } - description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac-libfuzzer-asan-rel\">mac-libfuzzer-asan-rel</a></li></ul><br/>Builder owner: <a href=mailto:chrome-deet-core@google.com>chrome-deet-core@google.com</a>" + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac-libfuzzer-asan-rel\">mac-libfuzzer-asan-rel</a></li></ul><br/>Builder owner: <a href=mailto:chrome-fuzzing-core@google.com>chrome-fuzzing-core@google.com</a>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -17536,7 +17536,7 @@ dimensions: "builderless:1" dimensions: "pool:luci.chromium.try" } - contact_team_email: "chrome-deet-core@google.com" + contact_team_email: "chrome-fuzzing-core@google.com" custom_metric_definitions { name: "/chrome/infra/browser/builds/cached_count" predicates: "has(build.output.properties.is_cached)" @@ -17644,7 +17644,7 @@ use_invocation_timestamp: true } } - description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/win-libfuzzer-asan-rel\">win-libfuzzer-asan-rel</a></li></ul><br/>Builder owner: <a href=mailto:chrome-deet-core@google.com>chrome-deet-core@google.com</a>" + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/win-libfuzzer-asan-rel\">win-libfuzzer-asan-rel</a></li></ul><br/>Builder owner: <a href=mailto:chrome-fuzzing-core@google.com>chrome-fuzzing-core@google.com</a>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -17652,7 +17652,7 @@ dimensions: "builderless:1" dimensions: "pool:luci.chromium.try" } - contact_team_email: "chrome-deet-core@google.com" + contact_team_email: "chrome-fuzzing-core@google.com" custom_metric_definitions { name: "/chrome/infra/browser/builds/cached_count" predicates: "has(build.output.properties.is_cached)" @@ -17763,7 +17763,7 @@ use_invocation_timestamp: true } } - description_html: "Builder owner: <a href=mailto:chrome-deet-core@google.com>chrome-deet-core@google.com</a>" + description_html: "Builder owner: <a href=mailto:chrome-fuzzing-core@google.com>chrome-fuzzing-core@google.com</a>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -17771,7 +17771,7 @@ dimensions: "builderless:1" dimensions: "pool:luci.chromium.try" } - contact_team_email: "chrome-deet-core@google.com" + contact_team_email: "chrome-fuzzing-core@google.com" custom_metric_definitions { name: "/chrome/infra/browser/builds/cached_count" predicates: "has(build.output.properties.is_cached)" @@ -88226,8 +88226,8 @@ use_invocation_timestamp: true } } - description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Libfuzzer Upload Chrome OS ASan\">Libfuzzer Upload Chrome OS ASan</a></li></ul><br/>Builder owner: <a href=mailto:chrome-deet-core@google.com>chrome-deet-core@google.com</a>" - contact_team_email: "chrome-deet-core@google.com" + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Libfuzzer Upload Chrome OS ASan\">Libfuzzer Upload Chrome OS ASan</a></li></ul><br/>Builder owner: <a href=mailto:chrome-fuzzing-core@google.com>chrome-fuzzing-core@google.com</a>" + contact_team_email: "chrome-fuzzing-core@google.com" custom_metric_definitions { name: "/chrome/infra/browser/builds/cached_count" predicates: "has(build.output.properties.is_cached)" @@ -104337,8 +104337,8 @@ use_invocation_timestamp: true } } - description_html: "<br>This builder uploads centipede high end fuzzers in release mode with dcheck_always_on.<br/><br/>This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Centipede High End Upload Linux ASan DCheck\">Centipede High End Upload Linux ASan DCheck</a></li></ul><br/>Builder owner: <a href=mailto:chrome-deet-core@google.com>chrome-deet-core@google.com</a>" - contact_team_email: "chrome-deet-core@google.com" + description_html: "<br>This builder uploads centipede high end fuzzers in release mode with dcheck_always_on.<br/><br/>This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Centipede High End Upload Linux ASan DCheck\">Centipede High End Upload Linux ASan DCheck</a></li></ul><br/>Builder owner: <a href=mailto:chrome-fuzzing-core@google.com>chrome-fuzzing-core@google.com</a>" + contact_team_email: "chrome-fuzzing-core@google.com" custom_metric_definitions { name: "/chrome/infra/browser/builds/cached_count" predicates: "has(build.output.properties.is_cached)" @@ -107687,8 +107687,8 @@ use_invocation_timestamp: true } } - description_html: "<br>This builder uploads libfuzzer high end fuzzers.Those fuzzers require more resources to run correctly.<br/><br/>This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Libfuzzer High End Upload Linux ASan Debug\">Libfuzzer High End Upload Linux ASan Debug</a></li></ul><br/>Builder owner: <a href=mailto:chrome-deet-core@google.com>chrome-deet-core@google.com</a>" - contact_team_email: "chrome-deet-core@google.com" + description_html: "<br>This builder uploads libfuzzer high end fuzzers.Those fuzzers require more resources to run correctly.<br/><br/>This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Libfuzzer High End Upload Linux ASan Debug\">Libfuzzer High End Upload Linux ASan Debug</a></li></ul><br/>Builder owner: <a href=mailto:chrome-fuzzing-core@google.com>chrome-fuzzing-core@google.com</a>" + contact_team_email: "chrome-fuzzing-core@google.com" custom_metric_definitions { name: "/chrome/infra/browser/builds/cached_count" predicates: "has(build.output.properties.is_cached)" @@ -107799,8 +107799,8 @@ use_invocation_timestamp: true } } - description_html: "<br>This builder uploads libfuzzer high end fuzzers.Those fuzzers require more resources to run correctly.<br/><br/>This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Libfuzzer High End Upload Linux ASan\">Libfuzzer High End Upload Linux ASan</a></li></ul><br/>Builder owner: <a href=mailto:chrome-deet-core@google.com>chrome-deet-core@google.com</a>" - contact_team_email: "chrome-deet-core@google.com" + description_html: "<br>This builder uploads libfuzzer high end fuzzers.Those fuzzers require more resources to run correctly.<br/><br/>This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Libfuzzer High End Upload Linux ASan\">Libfuzzer High End Upload Linux ASan</a></li></ul><br/>Builder owner: <a href=mailto:chrome-fuzzing-core@google.com>chrome-fuzzing-core@google.com</a>" + contact_team_email: "chrome-fuzzing-core@google.com" custom_metric_definitions { name: "/chrome/infra/browser/builds/cached_count" predicates: "has(build.output.properties.is_cached)" @@ -115382,8 +115382,8 @@ use_invocation_timestamp: true } } - description_html: "Trybot of <a href=\"https://ci.chromium.org/p/chromium/builders/ci/Libfuzzer Upload Mac ASan\">Libfuzzer Upload Mac ASan</a>.<br/>This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Libfuzzer Upload Mac ASan\">Libfuzzer Upload Mac ASan</a></li></ul><br/>Builder owner: <a href=mailto:chrome-deet-core@google.com>chrome-deet-core@google.com</a>" - contact_team_email: "chrome-deet-core@google.com" + description_html: "Trybot of <a href=\"https://ci.chromium.org/p/chromium/builders/ci/Libfuzzer Upload Mac ASan\">Libfuzzer Upload Mac ASan</a>.<br/>This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Libfuzzer Upload Mac ASan\">Libfuzzer Upload Mac ASan</a></li></ul><br/>Builder owner: <a href=mailto:chrome-fuzzing-core@google.com>chrome-fuzzing-core@google.com</a>" + contact_team_email: "chrome-fuzzing-core@google.com" custom_metric_definitions { name: "/chrome/infra/browser/builds/cached_count" predicates: "has(build.output.properties.is_cached)"
diff --git a/infra/config/generated/luci/luci-milo.cfg b/infra/config/generated/luci/luci-milo.cfg index 75f5f35b..57d16462 100644 --- a/infra/config/generated/luci/luci-milo.cfg +++ b/infra/config/generated/luci/luci-milo.cfg
@@ -6579,67 +6579,67 @@ } builders { name: "buildbucket/luci.chromium.ci/Libfuzzer Upload Linux32 V8-ARM ASan" - category: "chromium.fuzz|libfuzz" + category: "chromium.fuzz|libfuzzer" short_name: "arm" } builders { name: "buildbucket/luci.chromium.ci/Libfuzzer Upload Linux32 V8-ARM ASan Debug" - category: "chromium.fuzz|libfuzz" + category: "chromium.fuzz|libfuzzer" short_name: "arm-dbg" } builders { name: "buildbucket/luci.chromium.ci/Libfuzzer Upload Linux V8-ARM64 ASan" - category: "chromium.fuzz|libfuzz" + category: "chromium.fuzz|libfuzzer" short_name: "arm64" } builders { name: "buildbucket/luci.chromium.ci/Libfuzzer Upload Linux V8-ARM64 ASan Debug" - category: "chromium.fuzz|libfuzz" + category: "chromium.fuzz|libfuzzer" short_name: "arm64-dbg" } builders { name: "buildbucket/luci.chromium.ci/Libfuzzer Upload Chrome OS ASan" - category: "chromium.fuzz|libfuzz" + category: "chromium.fuzz|libfuzzer" short_name: "chromeos-asan" } builders { name: "buildbucket/luci.chromium.ci/Libfuzzer Upload iOS Catalyst Debug" - category: "chromium.fuzz|libfuzz" + category: "chromium.fuzz|libfuzzer" short_name: "ios" } builders { name: "buildbucket/luci.chromium.ci/Libfuzzer Upload Linux ASan" - category: "chromium.fuzz|libfuzz" + category: "chromium.fuzz|libfuzzer" short_name: "linux" } builders { name: "buildbucket/luci.chromium.ci/Libfuzzer Upload Linux ASan Debug" - category: "chromium.fuzz|libfuzz" + category: "chromium.fuzz|libfuzzer" short_name: "linux-dbg" } builders { name: "buildbucket/luci.chromium.ci/Libfuzzer Upload Linux MSan" - category: "chromium.fuzz|libfuzz" + category: "chromium.fuzz|libfuzzer" short_name: "linux-msan" } builders { name: "buildbucket/luci.chromium.ci/Libfuzzer Upload Linux UBSan" - category: "chromium.fuzz|libfuzz" + category: "chromium.fuzz|libfuzzer" short_name: "linux-ubsan" } builders { name: "buildbucket/luci.chromium.ci/Libfuzzer Upload Linux32 ASan" - category: "chromium.fuzz|libfuzz" + category: "chromium.fuzz|libfuzzer" short_name: "linux32" } builders { name: "buildbucket/luci.chromium.ci/Libfuzzer Upload Mac ASan" - category: "chromium.fuzz|libfuzz" + category: "chromium.fuzz|libfuzzer" short_name: "mac-asan" } builders { name: "buildbucket/luci.chromium.ci/Libfuzzer Upload Windows ASan" - category: "chromium.fuzz|libfuzz" + category: "chromium.fuzz|libfuzzer" short_name: "win-asan" } builders { @@ -14877,81 +14877,81 @@ short_name: "med" } builders { - name: "buildbucket/luci.chromium.ci/Libfuzzer Upload Chrome OS ASan" - category: "libfuzz" - short_name: "chromeos-asan" - } - builders { - name: "buildbucket/luci.chromium.ci/Libfuzzer Upload Linux32 ASan" - category: "libfuzz" - short_name: "linux32" - } - builders { name: "buildbucket/luci.chromium.ci/Libfuzzer Upload Linux ASan" - category: "libfuzz" + category: "libfuzzer" short_name: "linux" } builders { name: "buildbucket/luci.chromium.ci/Libfuzzer Upload Linux ASan Debug" - category: "libfuzz" + category: "libfuzzer" short_name: "linux-dbg" } builders { - name: "buildbucket/luci.chromium.ci/Libfuzzer Upload Linux MSan" - category: "libfuzz" - short_name: "linux-msan" - } - builders { - name: "buildbucket/luci.chromium.ci/Libfuzzer Upload Linux UBSan" - category: "libfuzz" - short_name: "linux-ubsan" - } - builders { - name: "buildbucket/luci.chromium.ci/Libfuzzer Upload Mac ASan" - category: "libfuzz" - short_name: "mac-asan" - } - builders { - name: "buildbucket/luci.chromium.ci/Libfuzzer Upload Windows ASan" - category: "libfuzz" - short_name: "win-asan" - } - builders { - name: "buildbucket/luci.chromium.ci/Libfuzzer Upload Linux32 V8-ARM ASan" - category: "libfuzz" - short_name: "arm" - } - builders { - name: "buildbucket/luci.chromium.ci/Libfuzzer Upload Linux32 V8-ARM ASan Debug" - category: "libfuzz" - short_name: "arm-dbg" - } - builders { - name: "buildbucket/luci.chromium.ci/Libfuzzer Upload Linux V8-ARM64 ASan" - category: "libfuzz" - short_name: "arm64" - } - builders { - name: "buildbucket/luci.chromium.ci/Libfuzzer Upload Linux V8-ARM64 ASan Debug" - category: "libfuzz" - short_name: "arm64-dbg" - } - builders { - name: "buildbucket/luci.chromium.ci/Libfuzzer Upload iOS Catalyst Debug" - category: "libfuzz" - short_name: "ios" - } - builders { name: "buildbucket/luci.chromium.ci/Libfuzzer High End Upload Linux ASan Debug" - category: "libfuzz" + category: "libfuzzer" short_name: "linux high dbg" } builders { name: "buildbucket/luci.chromium.ci/Libfuzzer High End Upload Linux ASan" - category: "libfuzz" + category: "libfuzzer" short_name: "linux high end" } builders { + name: "buildbucket/luci.chromium.ci/Libfuzzer Upload Linux32 ASan" + category: "libfuzzer" + short_name: "linux32" + } + builders { + name: "buildbucket/luci.chromium.ci/Libfuzzer Upload Linux MSan" + category: "libfuzzer" + short_name: "linux-msan" + } + builders { + name: "buildbucket/luci.chromium.ci/Libfuzzer Upload Linux UBSan" + category: "libfuzzer" + short_name: "linux-ubsan" + } + builders { + name: "buildbucket/luci.chromium.ci/Libfuzzer Upload Chrome OS ASan" + category: "libfuzzer" + short_name: "chromeos-asan" + } + builders { + name: "buildbucket/luci.chromium.ci/Libfuzzer Upload Mac ASan" + category: "libfuzzer" + short_name: "mac-asan" + } + builders { + name: "buildbucket/luci.chromium.ci/Libfuzzer Upload Windows ASan" + category: "libfuzzer" + short_name: "win-asan" + } + builders { + name: "buildbucket/luci.chromium.ci/Libfuzzer Upload Linux32 V8-ARM ASan" + category: "libfuzzer" + short_name: "arm" + } + builders { + name: "buildbucket/luci.chromium.ci/Libfuzzer Upload Linux32 V8-ARM ASan Debug" + category: "libfuzzer" + short_name: "arm-dbg" + } + builders { + name: "buildbucket/luci.chromium.ci/Libfuzzer Upload Linux V8-ARM64 ASan" + category: "libfuzzer" + short_name: "arm64" + } + builders { + name: "buildbucket/luci.chromium.ci/Libfuzzer Upload Linux V8-ARM64 ASan Debug" + category: "libfuzzer" + short_name: "arm64-dbg" + } + builders { + name: "buildbucket/luci.chromium.ci/Libfuzzer Upload iOS Catalyst Debug" + category: "libfuzzer" + short_name: "ios" + } + builders { name: "buildbucket/luci.chromium.ci/MSAN Release (chained origins)" category: "linux msan" short_name: "org"
diff --git a/infra/config/subprojects/chromium/ci/chromium.fuzz.star b/infra/config/subprojects/chromium/ci/chromium.fuzz.star index b4a0c86..1b1ed24 100644 --- a/infra/config/subprojects/chromium/ci/chromium.fuzz.star +++ b/infra/config/subprojects/chromium/ci/chromium.fuzz.star
@@ -37,6 +37,26 @@ siso_remote_jobs = siso.remote_jobs.DEFAULT, ) +_DEFAULT_CONSOLE_ORDERING = consoles.ordering(short_names = ["dbg", "rel"]) + +_LIBFUZZER_CONSOLE_ORDERING = consoles.ordering(short_names = [ + "linux", + "linux-dbg", + "linux high dbg", + "linux high end", + "linux32", + "linux-msan", + "linux-ubsan", + "chromeos-asan", + "mac-asan", + "win-asan", + "arm", + "arm-dbg", + "arm64", + "arm64-dbg", + "ios", +]) + consoles.console_view( name = "chromium.fuzz", branch_selector = [ @@ -50,26 +70,15 @@ "mac asan", "cros asan", "linux asan", - "libfuzz", + "libfuzzer", "linux msan", "linux tsan", ], - "*config*": consoles.ordering(short_names = ["dbg", "rel"]), - "win asan": "*config*", - "mac asan": "*config*", - "linux asan": "*config*", - "linux asan|x64 v8-ARM": "*config*", - "libfuzz": consoles.ordering(short_names = [ - "chromeos-asan", - "linux32", - "linux32-dbg", - "linux", - "linux-dbg", - "linux-msan", - "linux-ubsan", - "mac-asan", - "win-asan", - ]), + "win asan": _DEFAULT_CONSOLE_ORDERING, + "mac asan": _DEFAULT_CONSOLE_ORDERING, + "linux asan": _DEFAULT_CONSOLE_ORDERING, + "linux asan|x64 v8-ARM": _DEFAULT_CONSOLE_ORDERING, + "libfuzzer": _LIBFUZZER_CONSOLE_ORDERING, }, ) @@ -207,7 +216,7 @@ clusterfuzz_archive_subdir = None, clusterfuzz_ios_targets_only = None, clusterfuzz_v8_targets_only = None, - contact_team_email = "chrome-deet-core@google.com", + contact_team_email = "chrome-fuzzing-core@google.com", **kwargs): gn_configs = [ "libfuzzer", @@ -237,7 +246,7 @@ gn_extra_configs = gn_configs, use_component_build = use_component_build, properties = properties, - console_category = "libfuzz", + console_category = "libfuzzer", contact_team_email = contact_team_email, **kwargs ) @@ -433,7 +442,7 @@ category = "centipede", short_name = "cent", ), - contact_team_email = "chrome-deet-core@google.com", + contact_team_email = "chrome-fuzzing-core@google.com", execution_timeout = 4 * time.hour, properties = { "upload_bucket": "chromium-browser-centipede", @@ -487,7 +496,7 @@ category = "centipede", short_name = "cent high", ), - contact_team_email = "chrome-deet-core@google.com", + contact_team_email = "chrome-fuzzing-core@google.com", properties = { "upload_bucket": "chromium-browser-centipede", "upload_directory": "asan", @@ -537,7 +546,7 @@ category = "centipede", short_name = "cent high dc", ), - contact_team_email = "chrome-deet-core@google.com", + contact_team_email = "chrome-fuzzing-core@google.com", properties = { "upload_bucket": "chromium-browser-centipede", "upload_directory": "asan",
diff --git a/infra/config/subprojects/chromium/try/tryserver.chromium.chromiumos.star b/infra/config/subprojects/chromium/try/tryserver.chromium.chromiumos.star index 83cac76..2a4afdf 100644 --- a/infra/config/subprojects/chromium/try/tryserver.chromium.chromiumos.star +++ b/infra/config/subprojects/chromium/try/tryserver.chromium.chromiumos.star
@@ -254,7 +254,7 @@ "skip_generate_fuzzer_owners", ], ), - contact_team_email = "chrome-deet-core@google.com", + contact_team_email = "chrome-fuzzing-core@google.com", ) try_.builder(
diff --git a/infra/config/subprojects/chromium/try/tryserver.chromium.fuzz.star b/infra/config/subprojects/chromium/try/tryserver.chromium.fuzz.star index 91468d68..f90bfeab 100644 --- a/infra/config/subprojects/chromium/try/tryserver.chromium.fuzz.star +++ b/infra/config/subprojects/chromium/try/tryserver.chromium.fuzz.star
@@ -27,130 +27,118 @@ name = "tryserver.chromium.fuzz", ) -try_.builder( +def _builder(mirror_of = None, **kwargs): + try_.builder( + mirrors = [mirror_of], + gn_args = mirror_of, + **kwargs + ) + +_builder( name = "linux-asan-dbg", - mirrors = ["ci/ASAN Debug"], - gn_args = "ci/ASAN Debug", + mirror_of = "ci/ASAN Debug", ) -try_.builder( +_builder( name = "linux-asan-rel", - mirrors = ["ci/ASAN Release"], - gn_args = "ci/ASAN Release", + mirror_of = "ci/ASAN Release", ) -try_.builder( +_builder( name = "linux-asan-media-rel", - mirrors = ["ci/ASAN Release Media"], - gn_args = "ci/ASAN Release Media", + mirror_of = "ci/ASAN Release Media", ) -try_.builder( +_builder( name = "linux-asan-v8-arm-dbg", - mirrors = ["ci/ASan Debug (32-bit x86 with V8-ARM)"], - gn_args = "ci/ASan Debug (32-bit x86 with V8-ARM)", + mirror_of = "ci/ASan Debug (32-bit x86 with V8-ARM)", ) -try_.builder( +_builder( name = "linux-asan-v8-arm-rel", - mirrors = ["ci/ASan Release (32-bit x86 with V8-ARM)"], - gn_args = "ci/ASan Release (32-bit x86 with V8-ARM)", + mirror_of = "ci/ASan Release (32-bit x86 with V8-ARM)", ) -try_.builder( +_builder( name = "linux-asan-media-v8-arm-rel", - mirrors = ["ci/ASan Release Media (32-bit x86 with V8-ARM)"], - gn_args = "ci/ASan Release Media (32-bit x86 with V8-ARM)", + mirror_of = "ci/ASan Release Media (32-bit x86 with V8-ARM)", ) -try_.builder( +_builder( name = "linux-asan-v8-sandbox-testing", - mirrors = ["ci/ASAN Release V8 Sandbox Testing"], - gn_args = "ci/ASAN Release V8 Sandbox Testing", contact_team_email = "v8-infra@google.com", + mirror_of = "ci/ASAN Release V8 Sandbox Testing", ) -try_.builder( +_builder( name = "linux-chromeos-asan-rel", - mirrors = ["ci/ChromiumOS ASAN Release"], - gn_args = "ci/ChromiumOS ASAN Release", + mirror_of = "ci/ChromiumOS ASAN Release", ) -try_.builder( +_builder( name = "linux-msan-chained-origins-rel", - mirrors = ["ci/MSAN Release (chained origins)"], - gn_args = "ci/MSAN Release (chained origins)", + mirror_of = "ci/MSAN Release (chained origins)", ) -try_.builder( +_builder( name = "linux-msan-no-origins-rel", - mirrors = ["ci/MSAN Release (no origins)"], - gn_args = "ci/MSAN Release (no origins)", + mirror_of = "ci/MSAN Release (no origins)", ) -try_.builder( +_builder( name = "linux-tsan-dbg", - mirrors = ["ci/TSAN Debug"], - gn_args = "ci/TSAN Debug", + mirror_of = "ci/TSAN Debug", ) -try_.builder( +_builder( name = "linux-tsan-rel", - mirrors = ["ci/TSAN Release"], - gn_args = "ci/TSAN Release", + mirror_of = "ci/TSAN Release", ) -try_.builder( +_builder( name = "linux-ubsan-rel", - mirrors = ["ci/UBSan Release"], - gn_args = "ci/UBSan Release", + mirror_of = "ci/UBSan Release", ) -try_.builder( +_builder( name = "linux-ubsan-vptr-rel", - mirrors = ["ci/UBSan vptr Release"], - gn_args = "ci/UBSan vptr Release", + mirror_of = "ci/UBSan vptr Release", ) -try_.builder( +_builder( name = "mac-asan-rel", - mirrors = ["ci/Mac ASAN Release"], - gn_args = "ci/Mac ASAN Release", cores = None, os = os.MAC_DEFAULT, cpu = cpu.ARM64, + mirror_of = "ci/Mac ASAN Release", ) -try_.builder( +_builder( name = "mac-arm64-asan-rel", - mirrors = ["ci/Mac ARM64 ASAN Release"], - gn_args = "ci/Mac ARM64 ASAN Release", cores = None, os = os.MAC_DEFAULT, cpu = cpu.ARM64, contact_team_email = "chrome-sanitizer-builder-owners@google.com", + mirror_of = "ci/Mac ARM64 ASAN Release", ) -try_.builder( +_builder( name = "mac-asan-media-rel", - mirrors = ["ci/Mac ASAN Release Media"], - gn_args = "ci/Mac ASAN Release Media", cores = None, os = os.MAC_DEFAULT, + mirror_of = "ci/Mac ASAN Release Media", ) -try_.builder( +_builder( name = "win-asan-rel", - mirrors = ["ci/Win ASan Release"], - gn_args = "ci/Win ASan Release", os = os.WINDOWS_DEFAULT, + mirror_of = "ci/Win ASan Release", ) -try_.builder( +_builder( name = "win-asan-media-rel", - mirrors = ["ci/Win ASan Release Media"], - gn_args = "ci/Win ASan Release Media", os = os.WINDOWS_DEFAULT, + mirror_of = "ci/Win ASan Release Media", ) try_.builder( @@ -163,7 +151,7 @@ "skip_generate_fuzzer_owners", ], ), - contact_team_email = "chrome-deet-core@google.com", + contact_team_email = "chrome-fuzzing-core@google.com", ) try_.builder( @@ -176,7 +164,7 @@ "skip_generate_fuzzer_owners", ], ), - contact_team_email = "chrome-deet-core@google.com", + contact_team_email = "chrome-fuzzing-core@google.com", ) try_.builder( @@ -189,5 +177,5 @@ "skip_generate_fuzzer_owners", ], ), - contact_team_email = "chrome-deet-core@google.com", + contact_team_email = "chrome-fuzzing-core@google.com", )
diff --git a/infra/config/subprojects/chromium/try/tryserver.chromium.mac.star b/infra/config/subprojects/chromium/try/tryserver.chromium.mac.star index b8cd1eaf..af723a3 100644 --- a/infra/config/subprojects/chromium/try/tryserver.chromium.mac.star +++ b/infra/config/subprojects/chromium/try/tryserver.chromium.mac.star
@@ -215,7 +215,7 @@ "skip_generate_fuzzer_owners", ], ), - contact_team_email = "chrome-deet-core@google.com", + contact_team_email = "chrome-fuzzing-core@google.com", ) try_.builder(
diff --git a/ios/chrome/app/strings/ios_strings.grd b/ios/chrome/app/strings/ios_strings.grd index aa927bf6b..86bcb307 100644 --- a/ios/chrome/app/strings/ios_strings.grd +++ b/ios/chrome/app/strings/ios_strings.grd
@@ -1104,6 +1104,9 @@ <message name="IDS_IOS_BWG_LOCATION_TITLE" desc="The title text of the BWG location settings page."> Precise Location </message> + <message name="IDS_IOS_BWG_PAGE_ACTION_MENU_ENTRY_POINT_ACCESSIBILITY_LABEL" desc="Accessibility label for the page action menu entry point."> + Open on-page AI tools + </message> <message name="IDS_IOS_BWG_PROMO_FIRST_BOX_BODY" desc="First box body text for the Gemini Promo page."> Get relevant answers based on the content of the page you're on </message>
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_BWG_PAGE_ACTION_MENU_ENTRY_POINT_ACCESSIBILITY_LABEL.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_BWG_PAGE_ACTION_MENU_ENTRY_POINT_ACCESSIBILITY_LABEL.png.sha1 new file mode 100644 index 0000000..efd719e7 --- /dev/null +++ b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_BWG_PAGE_ACTION_MENU_ENTRY_POINT_ACCESSIBILITY_LABEL.png.sha1
@@ -0,0 +1 @@ +c2f624a4365ba59591d360896626c223fd3d7e8f \ No newline at end of file
diff --git a/ios/chrome/browser/content_suggestions/ui_bundled/cells/content_suggestions_most_visited_tile_view.mm b/ios/chrome/browser/content_suggestions/ui_bundled/cells/content_suggestions_most_visited_tile_view.mm index 7a7d8682..586a14d 100644 --- a/ios/chrome/browser/content_suggestions/ui_bundled/cells/content_suggestions_most_visited_tile_view.mm +++ b/ios/chrome/browser/content_suggestions/ui_bundled/cells/content_suggestions_most_visited_tile_view.mm
@@ -214,7 +214,7 @@ // set. - (void)applyBackgroundColors { NewTabPageColorPalette* colorPalette = - [self.traitCollection objectForTrait:NewTabPageTrait.class]; + [self.traitCollection objectForNewTabPageTrait]; if (colorPalette) { self.imageContainerView.backgroundColor = colorPalette.tertiaryColor;
diff --git a/ios/chrome/browser/content_suggestions/ui_bundled/cells/content_suggestions_shortcut_tile_view.mm b/ios/chrome/browser/content_suggestions/ui_bundled/cells/content_suggestions_shortcut_tile_view.mm index 48b3499..bf61ec7 100644 --- a/ios/chrome/browser/content_suggestions/ui_bundled/cells/content_suggestions_shortcut_tile_view.mm +++ b/ios/chrome/browser/content_suggestions/ui_bundled/cells/content_suggestions_shortcut_tile_view.mm
@@ -194,7 +194,7 @@ // set. - (void)applyBackgroundColors { NewTabPageColorPalette* colorPalette = - [self.traitCollection objectForTrait:NewTabPageTrait.class]; + [self.traitCollection objectForNewTabPageTrait]; if (colorPalette) { self.imageBackgroundView.tintColor = colorPalette.tertiaryColor;
diff --git a/ios/chrome/browser/content_suggestions/ui_bundled/magic_stack/magic_stack_edit_button_cell.mm b/ios/chrome/browser/content_suggestions/ui_bundled/magic_stack/magic_stack_edit_button_cell.mm index bde319c..994b83d3 100644 --- a/ios/chrome/browser/content_suggestions/ui_bundled/magic_stack/magic_stack_edit_button_cell.mm +++ b/ios/chrome/browser/content_suggestions/ui_bundled/magic_stack/magic_stack_edit_button_cell.mm
@@ -84,7 +84,7 @@ // set. - (void)applyBackgroundColors { NewTabPageColorPalette* colorPalette = - [self.traitCollection objectForTrait:NewTabPageTrait.class]; + [self.traitCollection objectForNewTabPageTrait]; if (colorPalette) { _editButton.tintColor = colorPalette.tintColor;
diff --git a/ios/chrome/browser/content_suggestions/ui_bundled/magic_stack/magic_stack_module_container.mm b/ios/chrome/browser/content_suggestions/ui_bundled/magic_stack/magic_stack_module_container.mm index fa722529..790841d 100644 --- a/ios/chrome/browser/content_suggestions/ui_bundled/magic_stack/magic_stack_module_container.mm +++ b/ios/chrome/browser/content_suggestions/ui_bundled/magic_stack/magic_stack_module_container.mm
@@ -612,7 +612,7 @@ // set. - (void)applyBackgroundColors { NewTabPageColorPalette* colorPalette = - [self.traitCollection objectForTrait:NewTabPageTrait.class]; + [self.traitCollection objectForNewTabPageTrait]; if (colorPalette) { self.backgroundColor = colorPalette.secondaryCellColor;
diff --git a/ios/chrome/browser/flags/about_flags.mm b/ios/chrome/browser/flags/about_flags.mm index 5e09c7e..6a1bee4 100644 --- a/ios/chrome/browser/flags/about_flags.mm +++ b/ios/chrome/browser/flags/about_flags.mm
@@ -1801,6 +1801,10 @@ flag_descriptions::kDefaultBrowserBannerPromoName, flag_descriptions::kDefaultBrowserBannerPromoDescription, flags_ui::kOsIos, FEATURE_VALUE_TYPE(kDefaultBrowserBannerPromo)}, + {"default-browser-off-cycle-promo", + flag_descriptions::kDefaultBrowserOffCyclePromoName, + flag_descriptions::kDefaultBrowserOffCyclePromoDescription, + flags_ui::kOsIos, FEATURE_VALUE_TYPE(kIOSDefaultBrowserOffCyclePromo)}, {"default-browser-promo-trigger-criteria-experiment", flag_descriptions::kDefaultBrowserTriggerCriteriaExperimentName, flag_descriptions::kDefaultBrowserTriggerCriteriaExperimentDescription, @@ -2806,8 +2810,8 @@ flags_ui::kOsIos, FEATURE_VALUE_TYPE(kCredentialProviderSignalAPI)}, {"migrate-account-prefs-on-mobile", flag_descriptions::kMigrateAccountPrefsOnMobileName, - flag_descriptions::kMigrateAccountPrefsOnMobileDescription, flags_ui::kOsIos, - FEATURE_VALUE_TYPE(syncer::kMigrateAccountPrefs)}, + flag_descriptions::kMigrateAccountPrefsOnMobileDescription, + flags_ui::kOsIos, FEATURE_VALUE_TYPE(syncer::kMigrateAccountPrefs)}, }; bool SkipConditionalFeatureEntry(const flags_ui::FeatureEntry& entry) {
diff --git a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc index 7c285dc..053ecfadb 100644 --- a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc +++ b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc
@@ -437,6 +437,11 @@ "When enabled, the default browser banner promo will show when conditions " "are met."; +const char kDefaultBrowserOffCyclePromoName[] = + "Default Browser off-cycle promo"; +const char kDefaultBrowserOffCyclePromoDescription[] = + "When enabled, an off-cycle default browser promo will be shown."; + const char kDefaultBrowserPromoPropensityModelName[] = "Default Browser promo propensity model"; const char kDefaultBrowserPromoPropensityModelDescription[] =
diff --git a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h index e1aea35..aa54e59 100644 --- a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h +++ b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h
@@ -248,6 +248,9 @@ extern const char kDefaultBrowserBannerPromoName[]; extern const char kDefaultBrowserBannerPromoDescription[]; +extern const char kDefaultBrowserOffCyclePromoName[]; +extern const char kDefaultBrowserOffCyclePromoDescription[]; + extern const char kDefaultBrowserPromoPropensityModelName[]; extern const char kDefaultBrowserPromoPropensityModelDescription[];
diff --git a/ios/chrome/browser/intelligence/bwg/ui/bwg_fre_wrapper_view_controller.mm b/ios/chrome/browser/intelligence/bwg/ui/bwg_fre_wrapper_view_controller.mm index 143c7b5..83d3912 100644 --- a/ios/chrome/browser/intelligence/bwg/ui/bwg_fre_wrapper_view_controller.mm +++ b/ios/chrome/browser/intelligence/bwg/ui/bwg_fre_wrapper_view_controller.mm
@@ -304,6 +304,16 @@ kExtraSpacingTitleContent; } +// Updates VoiceOver focus to the consent view after promo transition. +- (void)updateAccessibilityFocus { + if (!_consentViewController) { + return; + } + + UIAccessibilityPostNotification(UIAccessibilityLayoutChangedNotification, + _consentViewController.view); +} + #pragma mark - BWGPromoViewControllerDelegate // Handles the primary action from the promo screen. It transitions the view @@ -319,15 +329,19 @@ CGFloat mainStackViewWidth = _mainStackView.frame.size.width; [UIView animateWithDuration:kAnimationDuration - delay:0.0 - usingSpringWithDamping:kDamping - initialSpringVelocity:0.0 - options:UIViewAnimationOptionCurveEaseInOut - animations:^{ - weakSelf.contentScrollView.contentOffset = - CGPointMake(mainStackViewWidth, 0); - } - completion:nil]; + delay:0.0 + usingSpringWithDamping:kDamping + initialSpringVelocity:0.0 + options:UIViewAnimationOptionCurveEaseInOut + animations:^{ + weakSelf.contentScrollView.contentOffset = + CGPointMake(mainStackViewWidth, 0); + } + completion:^(BOOL finished) { + if (finished && UIAccessibilityIsVoiceOverRunning()) { + [weakSelf updateAccessibilityFocus]; + } + }]; } - (void)promoViewControllerWasDismissed {
diff --git a/ios/chrome/browser/intelligence/page_action_menu/ui/page_action_menu_entrypoint_view.mm b/ios/chrome/browser/intelligence/page_action_menu/ui/page_action_menu_entrypoint_view.mm index 6caf61d..fece704 100644 --- a/ios/chrome/browser/intelligence/page_action_menu/ui/page_action_menu_entrypoint_view.mm +++ b/ios/chrome/browser/intelligence/page_action_menu/ui/page_action_menu_entrypoint_view.mm
@@ -43,8 +43,8 @@ self.pointerStyleProvider = CreateDefaultEffectCirclePointerStyleProvider(); self.tintColor = [UIColor colorNamed:kToolbarButtonColor]; - // TODO(crbug.com/420643840): Add an actual accessibiity label. - self.accessibilityLabel = @"Page action menu"; + self.accessibilityLabel = l10n_util::GetNSString( + IDS_IOS_BWG_PAGE_ACTION_MENU_ENTRY_POINT_ACCESSIBILITY_LABEL); UIImageSymbolConfiguration* symbolConfig = [UIImageSymbolConfiguration configurationWithPointSize:kIconPointSize
diff --git a/ios/chrome/browser/ntp/ui_bundled/BUILD.gn b/ios/chrome/browser/ntp/ui_bundled/BUILD.gn index 7e183ab..7c530e2 100644 --- a/ios/chrome/browser/ntp/ui_bundled/BUILD.gn +++ b/ios/chrome/browser/ntp/ui_bundled/BUILD.gn
@@ -36,6 +36,7 @@ deps = [ "//base", "//components/sync/protocol", + "//ios/chrome/browser/shared/ui/util", "//skia", "//skia:skia_core_public_headers", "//third_party/material_color_utilities", @@ -343,8 +344,10 @@ "new_tab_page_coordinator_unittest.mm", "new_tab_page_header_view_controller_unittest.mm", "new_tab_page_mediator_unittest.mm", + "new_tab_page_trait_unittest.mm", ] deps = [ + ":color", ":component_factory", ":coordinator", ":feature_flags",
diff --git a/ios/chrome/browser/ntp/ui_bundled/new_tab_page_header_view.mm b/ios/chrome/browser/ntp/ui_bundled/new_tab_page_header_view.mm index 5b916bd..8113afa 100644 --- a/ios/chrome/browser/ntp/ui_bundled/new_tab_page_header_view.mm +++ b/ios/chrome/browser/ntp/ui_bundled/new_tab_page_header_view.mm
@@ -949,7 +949,7 @@ // set. - (void)applyBackgroundColors { NewTabPageColorPalette* colorPalette = - [self.traitCollection objectForTrait:NewTabPageTrait.class]; + [self.traitCollection objectForNewTabPageTrait]; if (colorPalette) { [_fakeLocationBar setStartColor:colorPalette.omniboxColor @@ -1164,7 +1164,7 @@ - (void)setFakeboxBackgroundWithProgress:(CGFloat)progress { UIColor* pinnedColor = [UIColor colorNamed:kTextfieldBackgroundColor]; NewTabPageColorPalette* colorPalette = - [self.traitCollection objectForTrait:NewTabPageTrait.class]; + [self.traitCollection objectForNewTabPageTrait]; // Use a quadratic curve interpolation. progress = progress * progress;
diff --git a/ios/chrome/browser/ntp/ui_bundled/new_tab_page_header_view_controller.mm b/ios/chrome/browser/ntp/ui_bundled/new_tab_page_header_view_controller.mm index 8f0adcd..dd48ca42 100644 --- a/ios/chrome/browser/ntp/ui_bundled/new_tab_page_header_view_controller.mm +++ b/ios/chrome/browser/ntp/ui_bundled/new_tab_page_header_view_controller.mm
@@ -649,7 +649,7 @@ } else { NewTabPageColorPalette* colorPalette = IsNTPBackgroundCustomizationEnabled() - ? [self.traitCollection objectForTrait:NewTabPageTrait.class] + ? [self.traitCollection objectForNewTabPageTrait] : nil; button.layer.cornerRadius = 0; [button setImage:nil forState:UIControlStateNormal];
diff --git a/ios/chrome/browser/ntp/ui_bundled/new_tab_page_mediator.mm b/ios/chrome/browser/ntp/ui_bundled/new_tab_page_mediator.mm index aa5b01b..7a872e7 100644 --- a/ios/chrome/browser/ntp/ui_bundled/new_tab_page_mediator.mm +++ b/ios/chrome/browser/ntp/ui_bundled/new_tab_page_mediator.mm
@@ -61,6 +61,7 @@ #import "ios/chrome/browser/shared/model/url/chrome_url_constants.h" #import "ios/chrome/browser/shared/model/utils/first_run_util.h" #import "ios/chrome/browser/shared/public/features/features.h" +#import "ios/chrome/browser/shared/ui/util/custom_ui_trait_accessor.h" #import "ios/chrome/browser/shared/ui/util/uikit_ui_util.h" #import "ios/chrome/browser/signin/model/authentication_service.h" #import "ios/chrome/browser/signin/model/chrome_account_manager_service.h" @@ -398,8 +399,9 @@ skia::UIColorFromSkColor(colorTheme->color()), ProtoEnumToSchemeVariant(colorTheme->browser_color_variant())); - [self.consumer.traitOverrides setObject:colorPalette - forTrait:NewTabPageTrait.class]; + [[[CustomUITraitAccessor alloc] + initWithMutableTraits:self.consumer.traitOverrides] + setObjectForNewTabPageTrait:colorPalette]; [self.consumer setBackgroundImage:nil]; [self.headerConsumer updateLogoColor:colorPalette.tintColor]; return; @@ -407,8 +409,9 @@ // Clears the color palette associated with the New Tab Page trait, // reverting to the default colors defined by the trait. - [self.consumer.traitOverrides setObject:[NewTabPageTrait defaultValue] - forTrait:NewTabPageTrait.class]; + [[[CustomUITraitAccessor alloc] + initWithMutableTraits:self.consumer.traitOverrides] + setObjectForNewTabPageTrait:[NewTabPageTrait defaultValue]]; if (!background) { [self.consumer setBackgroundImage:nil]; [self.headerConsumer updateLogoColor:nil];
diff --git a/ios/chrome/browser/ntp/ui_bundled/new_tab_page_quick_actions_view_controller.mm b/ios/chrome/browser/ntp/ui_bundled/new_tab_page_quick_actions_view_controller.mm index da681c6..e256c8e 100644 --- a/ios/chrome/browser/ntp/ui_bundled/new_tab_page_quick_actions_view_controller.mm +++ b/ios/chrome/browser/ntp/ui_bundled/new_tab_page_quick_actions_view_controller.mm
@@ -168,7 +168,7 @@ - (UIColor*)buttonBackgroundColor { NewTabPageColorPalette* colorPalette = IsNTPBackgroundCustomizationEnabled() - ? [self.traitCollection objectForTrait:NewTabPageTrait.class] + ? [self.traitCollection objectForNewTabPageTrait] : nil; if (GetNTPMIAEntrypointVariation() == @@ -186,7 +186,7 @@ // set. - (void)applyBackgroundColors { NewTabPageColorPalette* colorPalette = - [self.traitCollection objectForTrait:NewTabPageTrait.class]; + [self.traitCollection objectForNewTabPageTrait]; _incognitoButton.backgroundColor = [self buttonBackgroundColor]; _voiceSearchButton.backgroundColor = [self buttonBackgroundColor];
diff --git a/ios/chrome/browser/ntp/ui_bundled/new_tab_page_trait.h b/ios/chrome/browser/ntp/ui_bundled/new_tab_page_trait.h index ca7658d..4024592 100644 --- a/ios/chrome/browser/ntp/ui_bundled/new_tab_page_trait.h +++ b/ios/chrome/browser/ntp/ui_bundled/new_tab_page_trait.h
@@ -7,9 +7,27 @@ #import <UIKit/UITraitCollection.h> +#import "ios/chrome/browser/shared/ui/util/custom_ui_trait_accessor.h" + +@class NewTabPageColorPalette; + // A trait definition for the New Tab Page (NTP). @interface NewTabPageTrait : NSObject <UIObjectTraitDefinition> @end +@interface CustomUITraitAccessor (NewTabPageTrait) + +- (void)setObjectForNewTabPageTrait:(NewTabPageColorPalette*)object; + +- (NewTabPageColorPalette*)objectForNewTabPageTrait; + +@end + +@interface UITraitCollection (NewTabPageTrait) + +- (NewTabPageColorPalette*)objectForNewTabPageTrait; + +@end + #endif // IOS_CHROME_BROWSER_NTP_UI_BUNDLED_NEW_TAB_PAGE_TRAIT_H_
diff --git a/ios/chrome/browser/ntp/ui_bundled/new_tab_page_trait.mm b/ios/chrome/browser/ntp/ui_bundled/new_tab_page_trait.mm index 03b9bce..a7db55a6 100644 --- a/ios/chrome/browser/ntp/ui_bundled/new_tab_page_trait.mm +++ b/ios/chrome/browser/ntp/ui_bundled/new_tab_page_trait.mm
@@ -4,12 +4,37 @@ #import "ios/chrome/browser/ntp/ui_bundled/new_tab_page_trait.h" +#import "base/apple/foundation_util.h" +#import "ios/chrome/browser/ntp/ui_bundled/new_tab_page_color_palette.h" + @implementation NewTabPageTrait #pragma mark - UIObjectTraitDefinition -+ (id<NSObject>)defaultValue { ++ (NewTabPageColorPalette*)defaultValue { return nil; } @end + +@implementation CustomUITraitAccessor (NewTabPageTrait) + +- (void)setObjectForNewTabPageTrait:(NewTabPageColorPalette*)object { + [self.mutableTraits setObject:object forTrait:[NewTabPageTrait class]]; +} + +- (NewTabPageColorPalette*)objectForNewTabPageTrait { + return base::apple::ObjCCastStrict<NewTabPageColorPalette>( + [self.mutableTraits objectForTrait:[NewTabPageTrait class]]); +} + +@end + +@implementation UITraitCollection (NewTabPageTrait) + +- (NewTabPageColorPalette*)objectForNewTabPageTrait { + return base::apple::ObjCCastStrict<NewTabPageColorPalette>( + [self objectForTrait:[NewTabPageTrait class]]); +} + +@end
diff --git a/ios/chrome/browser/ntp/ui_bundled/new_tab_page_trait_unittest.mm b/ios/chrome/browser/ntp/ui_bundled/new_tab_page_trait_unittest.mm new file mode 100644 index 0000000..57e686c --- /dev/null +++ b/ios/chrome/browser/ntp/ui_bundled/new_tab_page_trait_unittest.mm
@@ -0,0 +1,31 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import "ios/chrome/browser/ntp/ui_bundled/new_tab_page_trait.h" + +#import "ios/chrome/browser/ntp/ui_bundled/new_tab_page_color_palette.h" +#import "testing/gtest/include/gtest/gtest.h" +#import "testing/gtest_mac.h" +#import "testing/platform_test.h" + +// Tests for the custom NewTabPageTrait. +class NewTabPageTraitTest : public PlatformTest { + public: + void SetUp() override { viewController_ = [[UIViewController alloc] init]; } + + protected: + UIViewController* viewController_; +}; + +// Tests that setting and retrieving the palette works. +TEST_F(NewTabPageTraitTest, TestSettingNewTabPageTrait) { + NewTabPageColorPalette* palette = [[NewTabPageColorPalette alloc] init]; + + [[[CustomUITraitAccessor alloc] + initWithMutableTraits:viewController_.traitOverrides] + setObjectForNewTabPageTrait:palette]; + + EXPECT_EQ(palette, + [viewController_.traitCollection objectForNewTabPageTrait]); +}
diff --git a/ios/chrome/browser/ntp/ui_bundled/new_tab_page_view_controller.mm b/ios/chrome/browser/ntp/ui_bundled/new_tab_page_view_controller.mm index 0784621..6a19236 100644 --- a/ios/chrome/browser/ntp/ui_bundled/new_tab_page_view_controller.mm +++ b/ios/chrome/browser/ntp/ui_bundled/new_tab_page_view_controller.mm
@@ -1101,7 +1101,7 @@ // set. - (void)applyBackgroundColors { NewTabPageColorPalette* colorPalette = - [self.traitCollection objectForTrait:NewTabPageTrait.class]; + [self.traitCollection objectForNewTabPageTrait]; if (colorPalette) { self.view.backgroundColor = colorPalette.primaryColor;
diff --git a/ios/chrome/browser/shared/public/features/features.h b/ios/chrome/browser/shared/public/features/features.h index ce2b403a..f3b3edc 100644 --- a/ios/chrome/browser/shared/public/features/features.h +++ b/ios/chrome/browser/shared/public/features/features.h
@@ -1068,4 +1068,9 @@ // Whether the diamond prototype is enabled. bool IsDiamondPrototypeEnabled(); +// Feature flag for the Default Browser off-cycle promo. +BASE_DECLARE_FEATURE(kIOSDefaultBrowserOffCyclePromo); + +bool IsDefaultBrowserOffCyclePromoEnabled(); + #endif // IOS_CHROME_BROWSER_SHARED_PUBLIC_FEATURES_FEATURES_H_
diff --git a/ios/chrome/browser/shared/public/features/features.mm b/ios/chrome/browser/shared/public/features/features.mm index 64a6220..220cbff 100644 --- a/ios/chrome/browser/shared/public/features/features.mm +++ b/ios/chrome/browser/shared/public/features/features.mm
@@ -1296,3 +1296,11 @@ } return base::FeatureList::IsEnabled(kDiamondPrototype); } + +BASE_FEATURE(kIOSDefaultBrowserOffCyclePromo, + "IOSDefaultBrowserOffCyclePromo", + base::FEATURE_DISABLED_BY_DEFAULT); + +bool IsDefaultBrowserOffCyclePromoEnabled() { + return base::FeatureList::IsEnabled(kIOSDefaultBrowserOffCyclePromo); +}
diff --git a/ios/chrome/browser/shared/ui/util/BUILD.gn b/ios/chrome/browser/shared/ui/util/BUILD.gn index 6da47b9c..f13dc53 100644 --- a/ios/chrome/browser/shared/ui/util/BUILD.gn +++ b/ios/chrome/browser/shared/ui/util/BUILD.gn
@@ -14,6 +14,8 @@ "animation_util.mm", "attributed_string_util.h", "attributed_string_util.mm", + "custom_ui_trait_accessor.h", + "custom_ui_trait_accessor.mm", "dynamic_type_util.h", "dynamic_type_util.mm", "keyboard_observer_helper.h",
diff --git a/ios/chrome/browser/shared/ui/util/custom_ui_trait_accessor.h b/ios/chrome/browser/shared/ui/util/custom_ui_trait_accessor.h new file mode 100644 index 0000000..bed20535 --- /dev/null +++ b/ios/chrome/browser/shared/ui/util/custom_ui_trait_accessor.h
@@ -0,0 +1,23 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef IOS_CHROME_BROWSER_SHARED_UI_UTIL_CUSTOM_UI_TRAIT_ACCESSOR_H_ +#define IOS_CHROME_BROWSER_SHARED_UI_UTIL_CUSTOM_UI_TRAIT_ACCESSOR_H_ + +#import <UIKit/UIKit.h> + +// Wrapper class to allow extension of the `UIMutableTraits` protocol for type +// safety. +@interface CustomUITraitAccessor : NSObject + +- (instancetype)initWithMutableTraits:(id<UIMutableTraits>)mutableTraits + NS_DESIGNATED_INITIALIZER; +- (instancetype)init NS_UNAVAILABLE; + +// The underlying mutable traits instance, for subclasses to use. +@property(nonatomic, weak, readonly) id<UIMutableTraits> mutableTraits; + +@end + +#endif // IOS_CHROME_BROWSER_SHARED_UI_UTIL_CUSTOM_UI_TRAIT_ACCESSOR_H_
diff --git a/ios/chrome/browser/shared/ui/util/custom_ui_trait_accessor.mm b/ios/chrome/browser/shared/ui/util/custom_ui_trait_accessor.mm new file mode 100644 index 0000000..eedbddc --- /dev/null +++ b/ios/chrome/browser/shared/ui/util/custom_ui_trait_accessor.mm
@@ -0,0 +1,19 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import "ios/chrome/browser/shared/ui/util/custom_ui_trait_accessor.h" + +#import <UIKit/UIKit.h> + +@implementation CustomUITraitAccessor + +- (instancetype)initWithMutableTraits:(id<UIMutableTraits>)mutableTraits { + self = [super init]; + if (self) { + _mutableTraits = mutableTraits; + } + return self; +} + +@end
diff --git a/ipc/BUILD.gn b/ipc/BUILD.gn index 6b566e0..1182e91 100644 --- a/ipc/BUILD.gn +++ b/ipc/BUILD.gn
@@ -53,10 +53,6 @@ "ipc_sender.h", "ipc_sync_channel.cc", "ipc_sync_channel.h", - "message_filter.cc", - "message_filter.h", - "message_filter_router.cc", - "message_filter_router.h", "trace_ipc_message.cc", "trace_ipc_message.h", "urgent_message_observer.h",
diff --git a/ipc/ipc_channel_proxy.cc b/ipc/ipc_channel_proxy.cc index a88a18b..d78a94e 100644 --- a/ipc/ipc_channel_proxy.cc +++ b/ipc/ipc_channel_proxy.cc
@@ -20,8 +20,6 @@ #include "ipc/ipc_channel_factory.h" #include "ipc/ipc_listener.h" #include "ipc/ipc_message_macros.h" -#include "ipc/message_filter.h" -#include "ipc/message_filter_router.h" #include "mojo/public/cpp/bindings/pending_associated_receiver.h" namespace IPC { @@ -36,7 +34,6 @@ listener_(listener), ipc_task_runner_(ipc_task_runner), channel_connected_called_(false), - message_filter_router_(new MessageFilterRouter()), peer_pid_(base::kNullProcessId) { DCHECK(ipc_task_runner_.get()); // The Listener thread where Messages are handled must be a separate thread @@ -76,15 +73,6 @@ } bool ChannelProxy::Context::TryFilters(const Message& message) { - DCHECK(message_filter_router_); - if (message_filter_router_->TryFilters(message)) { - if (message.dispatch_error()) { - GetTaskRunner(message.routing_id()) - ->PostTask(FROM_HERE, base::BindOnce(&Context::OnDispatchBadMessage, - this, message)); - } - return true; - } return false; } @@ -130,12 +118,6 @@ peer_pid_ = peer_pid; } - // Add any pending filters. This avoids a race condition where someone - // creates a ChannelProxy, calls AddFilter, and then right after starts the - // peer process. The IO thread could receive a message before the task to add - // the filter is run on the IO thread. - OnAddFilter(); - // See above comment about using default_listener_task_runner_ here. default_listener_task_runner_->PostTask( FROM_HERE, base::BindOnce(&Context::OnDispatchConnected, this)); @@ -143,9 +125,6 @@ // Called on the IPC::Channel thread void ChannelProxy::Context::OnChannelError() { - for (size_t i = 0; i < filters_.size(); ++i) - filters_[i]->OnChannelError(); - // See above comment about using default_listener_task_runner_ here. default_listener_task_runner_->PostTask( FROM_HERE, base::BindOnce(&Context::OnDispatchError, this)); @@ -172,9 +151,6 @@ OnChannelError(); return; } - - for (size_t i = 0; i < filters_.size(); ++i) - filters_[i]->OnFilterAdded(channel_.get()); } // Called on the IPC::Channel thread @@ -184,22 +160,6 @@ if (!channel_) return; - for (auto& filter : pending_filters_) { - filter->OnChannelClosing(); - filter->OnFilterRemoved(); - } - for (auto& filter : filters_) { - filter->OnChannelClosing(); - filter->OnFilterRemoved(); - } - - // We don't need the filters anymore. - message_filter_router_->Clear(); - filters_.clear(); - // We don't need the lock, because at this point, the listener thread can't - // access it any more. - pending_filters_.clear(); - ClearChannel(); // Balance with the reference taken during startup. This may result in @@ -222,75 +182,6 @@ OnChannelError(); } -// Called on the IPC::Channel thread -void ChannelProxy::Context::OnAddFilter() { - // Our OnChannelConnected method has not yet been called, so we can't be - // sure that channel_ is valid yet. When OnChannelConnected *is* called, - // it invokes OnAddFilter, so any pending filter(s) will be added at that - // time. - // No lock necessary for |peer_pid_| because it is only modified on this - // thread. - if (peer_pid_ == base::kNullProcessId) - return; - - std::vector<scoped_refptr<MessageFilter> > new_filters; - { - base::AutoLock auto_lock(pending_filters_lock_); - new_filters.swap(pending_filters_); - } - - for (size_t i = 0; i < new_filters.size(); ++i) { - filters_.push_back(new_filters[i]); - - message_filter_router_->AddFilter(new_filters[i].get()); - - // The channel has already been created and connected, so we need to - // inform the filters right now. - new_filters[i]->OnFilterAdded(channel_.get()); - new_filters[i]->OnChannelConnected(peer_pid_); - } -} - -// Called on the IPC::Channel thread -void ChannelProxy::Context::OnRemoveFilter(MessageFilter* filter) { - // No lock necessary for |peer_pid_| because it is only modified on this - // thread. - if (peer_pid_ == base::kNullProcessId) { - // The channel is not yet connected, so any filters are still pending. - base::AutoLock auto_lock(pending_filters_lock_); - for (size_t i = 0; i < pending_filters_.size(); ++i) { - if (pending_filters_[i].get() == filter) { - filter->OnFilterRemoved(); - pending_filters_.erase(pending_filters_.begin() + i); - return; - } - } - return; - } - if (!channel_) - return; // The filters have already been deleted. - - message_filter_router_->RemoveFilter(filter); - - for (size_t i = 0; i < filters_.size(); ++i) { - if (filters_[i].get() == filter) { - filter->OnFilterRemoved(); - filters_.erase(filters_.begin() + i); - return; - } - } - - NOTREACHED() << "filter to be removed not found"; -} - -// Called on the listener's thread -void ChannelProxy::Context::AddFilter(MessageFilter* filter) { - base::AutoLock auto_lock(pending_filters_lock_); - pending_filters_.push_back(base::WrapRefCounted(filter)); - ipc_task_runner_->PostTask(FROM_HERE, - base::BindOnce(&Context::OnAddFilter, this)); -} - // Called on the listener's thread void ChannelProxy::Context::OnDispatchMessage(const Message& message) { if (!listener_) @@ -530,20 +421,6 @@ context_->Send(message); } -void ChannelProxy::AddFilter(MessageFilter* filter) { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - - context_->AddFilter(filter); -} - -void ChannelProxy::RemoveFilter(MessageFilter* filter) { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - - context_->ipc_task_runner()->PostTask( - FROM_HERE, base::BindOnce(&Context::OnRemoveFilter, context_, - base::RetainedRef(filter))); -} - void ChannelProxy::AddGenericAssociatedInterfaceForIOThread( const std::string& name, const GenericAssociatedInterfaceFactory& factory) {
diff --git a/ipc/ipc_channel_proxy.h b/ipc/ipc_channel_proxy.h index dc1852d..65c103c 100644 --- a/ipc/ipc_channel_proxy.h +++ b/ipc/ipc_channel_proxy.h
@@ -39,8 +39,6 @@ namespace IPC { class ChannelFactory; -class MessageFilter; -class MessageFilterRouter; class UrgentMessageObserver; //----------------------------------------------------------------------------- @@ -61,13 +59,6 @@ // channel will not get cycles to flush its message queue until the thread, on // which it is running, returns to its message loop.) // -// An IPC::ChannelProxy can have a MessageFilter associated with it, which will -// be notified of incoming messages on the IPC::Channel's thread. This gives -// the consumer of IPC::ChannelProxy the ability to respond to incoming -// messages on this background thread instead of on their own thread, which may -// be bogged down with other processing. The result can be greatly improved -// latency for messages that can be handled on a background thread. -// // The consumer of IPC::ChannelProxy is responsible for allocating the Thread // instance where the IPC::Channel will be created and operated. // @@ -137,29 +128,12 @@ // Close the IPC::Channel. This operation completes asynchronously, once the // background thread processes the command to close the channel. It is ok to // call this method multiple times. Redundant calls are ignored. - // - // WARNING: MessageFilter objects held by the ChannelProxy is also - // released asynchronously, and it may in fact have its final reference - // released on the background thread. The caller should be careful to deal - // with / allow for this possibility. void Close(); // Send a message asynchronously. The message is routed to the background // thread where it is passed to the IPC::Channel's Send method. bool Send(Message* message) override; - // Used to intercept messages as they are received on the background thread. - // - // Ordinarily, messages sent to the ChannelProxy are routed to the matching - // listener on the worker thread. This API allows code to intercept messages - // before they are sent to the worker thread. - // If you call this before the target process is launched, then you're - // guaranteed to not miss any messages. But if you call this anytime after, - // then some messages might be missed since the filter is added internally on - // the IO thread. - void AddFilter(MessageFilter* filter); - void RemoveFilter(MessageFilter* filter); - // Set the `UrgentMessageObserver` for the channel. Must be called on the // proxy thread before initialization. void SetUrgentMessageObserver(UrgentMessageObserver* observer); @@ -314,11 +288,8 @@ // Methods called on the IO thread. void OnSendMessage(std::unique_ptr<Message> message_ptr); - void OnAddFilter(); - void OnRemoveFilter(MessageFilter* filter); // Methods called on the listener thread. - void AddFilter(MessageFilter* filter); void OnDispatchConnected(); void OnDispatchError(); void OnDispatchBadMessage(const Message& message); @@ -346,8 +317,6 @@ scoped_refptr<base::SingleThreadTaskRunner> default_listener_task_runner_; raw_ptr<Listener> listener_; - // List of filters. This is only accessed on the IPC thread. - std::vector<scoped_refptr<MessageFilter> > filters_; scoped_refptr<base::SingleThreadTaskRunner> ipc_task_runner_; // Note, channel_ may be set on the Listener thread or the IPC thread. @@ -361,14 +330,7 @@ // thread-safe send. base::Lock channel_lifetime_lock_; - // Routes a given message to a proper subset of |filters_|, depending - // on which message classes a filter might support. - std::unique_ptr<MessageFilterRouter> message_filter_router_; - - // Holds filters between the AddFilter call on the listerner thread and the - // IPC thread when they're added to filters_. - std::vector<scoped_refptr<MessageFilter> > pending_filters_; - // Lock for pending_filters_. + // Lock for pending_io_thread_interfaces_ (formerly for pending_filters_) base::Lock pending_filters_lock_; // Cached copy of the peer process ID. Set on IPC but read on both IPC and
diff --git a/ipc/ipc_channel_proxy_unittest.cc b/ipc/ipc_channel_proxy_unittest.cc index 6d5b2bfd..08b7172 100644 --- a/ipc/ipc_channel_proxy_unittest.cc +++ b/ipc/ipc_channel_proxy_unittest.cc
@@ -17,7 +17,6 @@ #include "build/build_config.h" #include "ipc/ipc_message.h" #include "ipc/ipc_test_base.h" -#include "ipc/message_filter.h" // Get basic type definitions. #define IPC_MESSAGE_IMPL @@ -129,108 +128,6 @@ raw_ptr<IPC::Channel> channel_ = nullptr; }; -class MessageCountFilter : public IPC::MessageFilter { - public: - enum FilterEvent { - NONE, - FILTER_ADDED, - CHANNEL_CONNECTED, - CHANNEL_ERROR, - CHANNEL_CLOSING, - FILTER_REMOVED - }; - - MessageCountFilter() = default; - MessageCountFilter(uint32_t supported_message_class) - : supported_message_class_(supported_message_class), - is_global_filter_(false) {} - - void OnFilterAdded(IPC::Channel* channel) override { - EXPECT_TRUE(channel); - EXPECT_EQ(NONE, last_filter_event_); - last_filter_event_ = FILTER_ADDED; - } - - void OnChannelConnected(int32_t peer_pid) override { - EXPECT_EQ(FILTER_ADDED, last_filter_event_); - EXPECT_NE(static_cast<int32_t>(base::kNullProcessId), peer_pid); - last_filter_event_ = CHANNEL_CONNECTED; - } - - void OnChannelError() override { - EXPECT_EQ(CHANNEL_CONNECTED, last_filter_event_); - last_filter_event_ = CHANNEL_ERROR; - } - - void OnChannelClosing() override { - // We may or may not have gotten OnChannelError; if not, the last event has - // to be OnChannelConnected. - EXPECT_NE(FILTER_REMOVED, last_filter_event_); - if (last_filter_event_ != CHANNEL_ERROR) - EXPECT_EQ(CHANNEL_CONNECTED, last_filter_event_); - last_filter_event_ = CHANNEL_CLOSING; - } - - void OnFilterRemoved() override { - // A filter may be removed at any time, even before the channel is connected - // (and thus before OnFilterAdded is ever able to dispatch.) The only time - // we won't see OnFilterRemoved is immediately after OnFilterAdded, because - // OnChannelConnected is always the next event to fire after that. - EXPECT_NE(FILTER_ADDED, last_filter_event_); - last_filter_event_ = FILTER_REMOVED; - } - - bool OnMessageReceived(const IPC::Message& message) override { - // We should always get the OnFilterAdded and OnChannelConnected events - // prior to any messages. - EXPECT_EQ(CHANNEL_CONNECTED, last_filter_event_); - - if (!is_global_filter_) { - EXPECT_EQ(supported_message_class_, IPC_MESSAGE_CLASS(message)); - } - ++messages_received_; - - if (!message_filtering_enabled_) - return false; - - bool handled = true; - IPC_BEGIN_MESSAGE_MAP(MessageCountFilter, message) - IPC_MESSAGE_HANDLER(TestMsg_BadMessage, OnBadMessage) - IPC_MESSAGE_UNHANDLED(handled = false) - IPC_END_MESSAGE_MAP() - return handled; - } - - void OnBadMessage(const BadType& bad_type) { - // Should never be called since IPC wouldn't be deserialized correctly. - NOTREACHED(); - } - - bool GetSupportedMessageClasses( - std::vector<uint32_t>* supported_message_classes) const override { - if (is_global_filter_) - return false; - supported_message_classes->push_back(supported_message_class_); - return true; - } - - void set_message_filtering_enabled(bool enabled) { - message_filtering_enabled_ = enabled; - } - - size_t messages_received() const { return messages_received_; } - FilterEvent last_filter_event() const { return last_filter_event_; } - - private: - ~MessageCountFilter() override = default; - - size_t messages_received_ = 0; - uint32_t supported_message_class_ = 0; - bool is_global_filter_ = true; - - FilterEvent last_filter_event_ = NONE; - bool message_filtering_enabled_ = false; -}; class IPCChannelProxyTest : public IPCChannelMojoTestBase { public: @@ -280,108 +177,6 @@ std::unique_ptr<IPC::ChannelProxy> channel_proxy_; }; -TEST_F(IPCChannelProxyTest, MessageClassFilters) { - // Construct a filter per message class. - std::vector<scoped_refptr<MessageCountFilter>> class_filters; - class_filters.push_back( - base::MakeRefCounted<MessageCountFilter>(TestMsgStart)); - class_filters.push_back( - base::MakeRefCounted<MessageCountFilter>(AutomationMsgStart)); - for (size_t i = 0; i < class_filters.size(); ++i) - channel_proxy()->AddFilter(class_filters[i].get()); - - // Send a message for each class; each filter should receive just one message. - sender()->Send(new TestMsg_Bounce); - sender()->Send(new AutomationMsg_Bounce); - - // Send some messages not assigned to a specific or valid message class. - sender()->Send(new WorkerMsg_Bounce); - - // Each filter should have received just the one sent message of the - // corresponding class. - SendQuitMessageAndWaitForIdle(); - for (size_t i = 0; i < class_filters.size(); ++i) - EXPECT_EQ(1U, class_filters[i]->messages_received()); -} - -TEST_F(IPCChannelProxyTest, GlobalAndMessageClassFilters) { - // Add a class and global filter. - scoped_refptr<MessageCountFilter> class_filter( - new MessageCountFilter(TestMsgStart)); - class_filter->set_message_filtering_enabled(false); - channel_proxy()->AddFilter(class_filter.get()); - - scoped_refptr<MessageCountFilter> global_filter(new MessageCountFilter()); - global_filter->set_message_filtering_enabled(false); - channel_proxy()->AddFilter(global_filter.get()); - - // A message of class Test should be seen by both the global filter and - // Test-specific filter. - sender()->Send(new TestMsg_Bounce); - - // A message of a different class should be seen only by the global filter. - sender()->Send(new AutomationMsg_Bounce); - - // Flush all messages. - SendQuitMessageAndWaitForIdle(); - - // The class filter should have received only the class-specific message. - EXPECT_EQ(1U, class_filter->messages_received()); - - // The global filter should have received both messages, as well as the final - // QUIT message. - EXPECT_EQ(3U, global_filter->messages_received()); -} - -TEST_F(IPCChannelProxyTest, FilterRemoval) { - // Add a class and global filter. - scoped_refptr<MessageCountFilter> class_filter( - new MessageCountFilter(TestMsgStart)); - scoped_refptr<MessageCountFilter> global_filter(new MessageCountFilter()); - - // Add and remove both types of filters. - channel_proxy()->AddFilter(class_filter.get()); - channel_proxy()->AddFilter(global_filter.get()); - channel_proxy()->RemoveFilter(global_filter.get()); - channel_proxy()->RemoveFilter(class_filter.get()); - - // Send some messages; they should not be seen by either filter. - sender()->Send(new TestMsg_Bounce); - sender()->Send(new AutomationMsg_Bounce); - - // Ensure that the filters were removed and did not receive any messages. - SendQuitMessageAndWaitForIdle(); - EXPECT_EQ(MessageCountFilter::FILTER_REMOVED, - global_filter->last_filter_event()); - EXPECT_EQ(MessageCountFilter::FILTER_REMOVED, - class_filter->last_filter_event()); - EXPECT_EQ(0U, class_filter->messages_received()); - EXPECT_EQ(0U, global_filter->messages_received()); -} - -TEST_F(IPCChannelProxyTest, BadMessageOnListenerThread) { - scoped_refptr<MessageCountFilter> class_filter( - new MessageCountFilter(TestMsgStart)); - class_filter->set_message_filtering_enabled(false); - channel_proxy()->AddFilter(class_filter.get()); - - sender()->Send(new TestMsg_SendBadMessage()); - - SendQuitMessageAndWaitForIdle(); - EXPECT_TRUE(DidListenerGetBadMessage()); -} - -TEST_F(IPCChannelProxyTest, BadMessageOnIPCThread) { - scoped_refptr<MessageCountFilter> class_filter( - new MessageCountFilter(TestMsgStart)); - class_filter->set_message_filtering_enabled(true); - channel_proxy()->AddFilter(class_filter.get()); - - sender()->Send(new TestMsg_SendBadMessage()); - - SendQuitMessageAndWaitForIdle(); - EXPECT_TRUE(DidListenerGetBadMessage()); -} class IPCChannelBadMessageTest : public IPCChannelMojoTestBase { public:
diff --git a/ipc/ipc_mojo_bootstrap.h b/ipc/ipc_mojo_bootstrap.h index c5d1a33..bd5ccd4 100644 --- a/ipc/ipc_mojo_bootstrap.h +++ b/ipc/ipc_mojo_bootstrap.h
@@ -25,13 +25,8 @@ class UrgentMessageObserver; -// Incoming legacy IPCs have always been dispatched to one of two threads: the -// IO thread (when an installed MessageFilter handles the message), or the -// thread which owns the corresponding ChannelProxy receiving the message. There -// were no other places to route legacy IPC messages, so when a message arrived -// the legacy IPC system would run through its MessageFilters and if the message -// was still unhandled, it would be posted to the ChannelProxy thread for -// further processing. +// Incoming legacy IPCs are now always dispatched to the thread which owns +// the corresponding ChannelProxy receiving the message. // // Mojo on the other hand allows for mutually associated endpoints (that is, // endpoints which locally share the same message pipe) to span any number of
diff --git a/ipc/message_filter.cc b/ipc/message_filter.cc deleted file mode 100644 index 714fd436..0000000 --- a/ipc/message_filter.cc +++ /dev/null
@@ -1,37 +0,0 @@ -// Copyright 2014 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "ipc/message_filter.h" - -#include <stdint.h> - -#include "base/memory/ref_counted.h" -#include "ipc/ipc_channel.h" - -namespace IPC { - -MessageFilter::MessageFilter() = default; - -void MessageFilter::OnFilterAdded(Channel* channel) {} - -void MessageFilter::OnFilterRemoved() {} - -void MessageFilter::OnChannelConnected(int32_t peer_pid) {} - -void MessageFilter::OnChannelError() {} - -void MessageFilter::OnChannelClosing() {} - -bool MessageFilter::OnMessageReceived(const Message& message) { - return false; -} - -bool MessageFilter::GetSupportedMessageClasses( - std::vector<uint32_t>* /*supported_message_classes*/) const { - return false; -} - -MessageFilter::~MessageFilter() = default; - -} // namespace IPC
diff --git a/ipc/message_filter.h b/ipc/message_filter.h deleted file mode 100644 index 55e13105..0000000 --- a/ipc/message_filter.h +++ /dev/null
@@ -1,69 +0,0 @@ -// Copyright 2014 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef IPC_MESSAGE_FILTER_H_ -#define IPC_MESSAGE_FILTER_H_ - -#include <stdint.h> - -#include <vector> - -#include "base/component_export.h" -#include "base/memory/ref_counted.h" -#include "ipc/ipc_channel.h" - -namespace IPC { - -class Message; - -// A class that receives messages on the thread where the IPC channel is -// running. It can choose to prevent the default action for an IPC message. -class COMPONENT_EXPORT(IPC) MessageFilter - : public base::RefCountedThreadSafe<MessageFilter> { - public: - MessageFilter(); - - // Called on the background thread to provide the filter with access to the - // channel. Called when the IPC channel is initialized or when AddFilter - // is called if the channel is already initialized. - virtual void OnFilterAdded(Channel* channel); - - // Called on the background thread when the filter has been removed from - // the ChannelProxy and when the Channel is closing. After a filter is - // removed, it will not be called again. - virtual void OnFilterRemoved(); - - // Called to inform the filter that the IPC channel is connected and we - // have received the internal Hello message from the peer. - virtual void OnChannelConnected(int32_t peer_pid); - - // Called when there is an error on the channel, typically that the channel - // has been closed. - virtual void OnChannelError(); - - // Called to inform the filter that the IPC channel will be destroyed. - // OnFilterRemoved is called immediately after this. - virtual void OnChannelClosing(); - - // Return true to indicate that the message was handled, or false to let - // the message be handled in the default way. - virtual bool OnMessageReceived(const Message& message); - - // Called to query the Message classes supported by the filter. Return - // false to indicate that all message types should reach the filter, or true - // if the resulting contents of |supported_message_classes| may be used to - // selectively offer messages of a particular class to the filter. - virtual bool GetSupportedMessageClasses( - std::vector<uint32_t>* supported_message_classes) const; - - protected: - virtual ~MessageFilter(); - - private: - friend class base::RefCountedThreadSafe<MessageFilter>; -}; - -} // namespace IPC - -#endif // IPC_MESSAGE_FILTER_H_
diff --git a/ipc/message_filter_router.cc b/ipc/message_filter_router.cc deleted file mode 100644 index 1738b1e..0000000 --- a/ipc/message_filter_router.cc +++ /dev/null
@@ -1,90 +0,0 @@ -// Copyright 2014 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - - -#include "ipc/message_filter_router.h" - -#include <stddef.h> -#include <stdint.h> - -#include "ipc/ipc_message_macros.h" -#include "ipc/ipc_message_start.h" -#include "ipc/ipc_message_utils.h" -#include "ipc/message_filter.h" - -namespace IPC { - -namespace { - -bool TryFiltersImpl(MessageFilterRouter::MessageFilters& filters, - const IPC::Message& message) { - for (size_t i = 0; i < filters.size(); ++i) { - if (filters[i]->OnMessageReceived(message)) { - return true; - } - } - return false; -} - -bool RemoveFilterImpl(MessageFilterRouter::MessageFilters& filters, - MessageFilter* filter) { - return std::erase(filters, filter) > 0; -} - -bool ValidMessageClass(int message_class) { - return message_class >= 0 && message_class < LastIPCMsgStart; -} - -} // namespace - -MessageFilterRouter::MessageFilterRouter() = default; -MessageFilterRouter::~MessageFilterRouter() = default; - -void MessageFilterRouter::AddFilter(MessageFilter* filter) { - // Determine if the filter should be applied to all messages, or only - // messages of a certain class. - std::vector<uint32_t> supported_message_classes; - if (filter->GetSupportedMessageClasses(&supported_message_classes)) { - for (size_t i = 0; i < supported_message_classes.size(); ++i) { - const int message_class = supported_message_classes[i]; - DCHECK(ValidMessageClass(message_class)); - // Safely ignore repeated subscriptions to a given message class for the - // current filter being added. - if (!message_class_filters_[message_class].empty() && - message_class_filters_[message_class].back() == filter) { - continue; - } - message_class_filters_[message_class].push_back(filter); - } - } else { - global_filters_.push_back(filter); - } -} - -void MessageFilterRouter::RemoveFilter(MessageFilter* filter) { - if (RemoveFilterImpl(global_filters_, filter)) - return; - - for (size_t i = 0; i < std::size(message_class_filters_); ++i) - RemoveFilterImpl(message_class_filters_[i], filter); -} - -bool MessageFilterRouter::TryFilters(const Message& message) { - if (TryFiltersImpl(global_filters_, message)) - return true; - - const int message_class = IPC_MESSAGE_CLASS(message); - if (!ValidMessageClass(message_class)) - return false; - - return TryFiltersImpl(message_class_filters_[message_class], message); -} - -void MessageFilterRouter::Clear() { - global_filters_.clear(); - for (size_t i = 0; i < std::size(message_class_filters_); ++i) - message_class_filters_[i].clear(); -} - -} // namespace IPC
diff --git a/ipc/message_filter_router.h b/ipc/message_filter_router.h deleted file mode 100644 index 84fd39c..0000000 --- a/ipc/message_filter_router.h +++ /dev/null
@@ -1,45 +0,0 @@ -// Copyright 2014 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef IPC_MESSAGE_FILTER_ROUTER_H_ -#define IPC_MESSAGE_FILTER_ROUTER_H_ - -#include <array> -#include <vector> - -#include "base/memory/raw_ptr.h" -#include "ipc/ipc_message_start.h" - -namespace IPC { - -class Message; -class MessageFilter; - -class MessageFilterRouter { - public: - typedef std::vector<raw_ptr<MessageFilter, VectorExperimental>> - MessageFilters; - - MessageFilterRouter(); - ~MessageFilterRouter(); - - void AddFilter(MessageFilter* filter); - void RemoveFilter(MessageFilter* filter); - bool TryFilters(const Message& message); - void Clear(); - - private: - // List of global and selective filters; a given filter will exist in either - // |message_global_filters_| OR |message_class_filters_|, but not both. - // Note that |message_global_filters_| will be given first offering of any - // given message. It's the filter implementer and installer's - // responsibility to ensure that a filter is either global or selective to - // ensure proper message filtering order. - MessageFilters global_filters_; - std::array<MessageFilters, LastIPCMsgStart> message_class_filters_; -}; - -} // namespace IPC - -#endif // IPC_MESSAGE_FILTER_ROUTER_H_
diff --git a/media/BUILD.gn b/media/BUILD.gn index 05fd55e..13b51f40 100644 --- a/media/BUILD.gn +++ b/media/BUILD.gn
@@ -143,7 +143,7 @@ "//ui/events:events_base", "//ui/gfx", "//ui/gfx/geometry", - "//ui/gl:gl", + "//ui/gl", "//url", ]
diff --git a/media/audio/BUILD.gn b/media/audio/BUILD.gn index e2e8e31..adb7e04 100644 --- a/media/audio/BUILD.gn +++ b/media/audio/BUILD.gn
@@ -145,7 +145,7 @@ "//build:chromecast_buildflags", "//media/base", "//third_party/flac", - "//third_party/opus:opus", + "//third_party/opus", "//url", ] libs = [] @@ -462,7 +462,7 @@ "//media:test_support", "//testing/gmock", "//testing/gtest", - "//third_party/opus:opus", + "//third_party/opus", "//url", ] @@ -479,7 +479,7 @@ "android/audio_device_unittest.cc", ] deps += [ - "//media/gpu:gpu", + "//media/gpu", "//ui/gl", ] } @@ -540,7 +540,7 @@ "win/test_support/wasapi_test_error_code.h", ] - deps += [ "//media/gpu:gpu" ] + deps += [ "//media/gpu" ] } if (is_fuchsia) {
diff --git a/media/base/BUILD.gn b/media/base/BUILD.gn index 6cf9fa7..5ba5a2e2 100644 --- a/media/base/BUILD.gn +++ b/media/base/BUILD.gn
@@ -402,7 +402,7 @@ defines = [] public_deps = [ ":video_facing", - "//gpu/command_buffer/client:client", + "//gpu/command_buffer/client", "//media:media_buildflags", "//media/gpu:buildflags", "//media/mojo:buildflags", @@ -416,17 +416,17 @@ "//gpu/command_buffer/client:interface_base", "//gpu/command_buffer/client:raster_interface", "//gpu/command_buffer/common", - "//gpu/ipc/common:common", + "//gpu/ipc/common", "//media/cdm:clear_key_cdm_common", "//net", "//skia", "//third_party/libyuv", "//third_party/widevine/cdm:headers", - "//ui/display:display", - "//ui/events:events", + "//ui/display", + "//ui/events", "//ui/events:events_base", "//ui/events:keyboard_hook", - "//url:url", + "//url", ] libs = []
diff --git a/media/capture/BUILD.gn b/media/capture/BUILD.gn index 92eeda5..ab0b9d14 100644 --- a/media/capture/BUILD.gn +++ b/media/capture/BUILD.gn
@@ -102,7 +102,7 @@ "//base", "//base:i18n", "//gpu/command_buffer/client", - "//gpu/ipc/common:common", + "//gpu/ipc/common", "//media", "//media/capture:capture_gpu_channel", "//media/capture:capture_switches", @@ -355,7 +355,7 @@ "//components/chromeos_camera/common", "//components/device_event_log", "//gpu/ipc/client", - "//gpu/ipc/common:common", + "//gpu/ipc/common", "//media/capture/video/chromeos/mojom:cros_camera", "//media/capture/video/chromeos/mojom:document_scanner", "//media/capture/video/chromeos/mojom:jpeg_accelerator", @@ -429,7 +429,7 @@ ":capture_lib", "//base/test:test_support", "//gpu/command_buffer/client", - "//gpu/command_buffer/common:common", + "//gpu/command_buffer/common", "//media:test_support", "//media/capture/mojom:image_capture", "//media/capture/mojom:image_capture_types", @@ -502,7 +502,7 @@ "//services/video_effects/buildflags", "//testing/gmock", "//testing/gtest", - "//third_party/libyuv:libyuv", + "//third_party/libyuv", "//ui/gfx:test_support", ]
diff --git a/media/capture/mojom/BUILD.gn b/media/capture/mojom/BUILD.gn index 60e41d0b..4d97fe2 100644 --- a/media/capture/mojom/BUILD.gn +++ b/media/capture/mojom/BUILD.gn
@@ -27,7 +27,7 @@ public_deps = [ ":video_capture_types", "//gpu/ipc/common:interfaces", - "//media//mojo/mojom:mojom", + "//media//mojo/mojom", "//mojo/public/mojom/base", "//services/viz/public/mojom:shared_image_format", "//ui/gfx/geometry/mojom",
diff --git a/media/capture/video/win/BUILD.gn b/media/capture/video/win/BUILD.gn index 4122480..5b513af6 100644 --- a/media/capture/video/win/BUILD.gn +++ b/media/capture/video/win/BUILD.gn
@@ -85,7 +85,7 @@ "//base/test:test_support", "//gpu/command_buffer/client", "//media:test_support", - "//media/capture:capture", + "//media/capture", "//media/capture:test_support", "//media/capture/mojom:image_capture", "//media/capture/mojom:image_capture_types", @@ -93,7 +93,7 @@ "//services/video_capture/public/mojom", "//testing/gmock", "//testing/gtest", - "//third_party/libyuv:libyuv", + "//third_party/libyuv", "//ui/gfx:test_support", ]
diff --git a/media/cast/BUILD.gn b/media/cast/BUILD.gn index 7fa20a0c..06cba8e 100644 --- a/media/cast/BUILD.gn +++ b/media/cast/BUILD.gn
@@ -196,7 +196,7 @@ ":encoding", ":sender", "//base/test:test_support", - "//components/openscreen_platform:openscreen_platform", + "//components/openscreen_platform", "//media", "//media:test_support", "//testing/gmock",
diff --git a/media/cdm/BUILD.gn b/media/cdm/BUILD.gn index 1e23eda6..29d1930 100644 --- a/media/cdm/BUILD.gn +++ b/media/cdm/BUILD.gn
@@ -18,7 +18,7 @@ ] configs += [ "//media:subcomponent_config" ] } else { - visibility = [ "//media/cdm/library_cdm/clear_key_cdm:clear_key_cdm" ] + visibility = [ "//media/cdm/library_cdm/clear_key_cdm" ] } sources = [
diff --git a/media/filters/BUILD.gn b/media/filters/BUILD.gn index a4a1734..c490809 100644 --- a/media/filters/BUILD.gn +++ b/media/filters/BUILD.gn
@@ -94,7 +94,7 @@ "//media/video", "//net", "//third_party/libyuv", - "//ui/gfx/geometry:geometry", + "//ui/gfx/geometry", ] libs = [] @@ -340,7 +340,7 @@ deps = [ "//base/test:test_support", - "//crypto:crypto", + "//crypto", "//media:test_support", "//testing/gmock", "//testing/gtest",
diff --git a/media/formats/BUILD.gn b/media/formats/BUILD.gn index 578baa1..4a9ebec 100644 --- a/media/formats/BUILD.gn +++ b/media/formats/BUILD.gn
@@ -244,7 +244,7 @@ "hls/variant_stream.h", ] deps += [ - "//crypto:crypto", + "//crypto", "//third_party/re2", ] public_deps = [
diff --git a/media/fuchsia/video/BUILD.gn b/media/fuchsia/video/BUILD.gn index caaf4d6..58ace35 100644 --- a/media/fuchsia/video/BUILD.gn +++ b/media/fuchsia/video/BUILD.gn
@@ -41,7 +41,7 @@ "//third_party/fuchsia-sdk/sdk/fidl/fuchsia.mediacodec:fuchsia.mediacodec_hlcpp", "//third_party/fuchsia-sdk/sdk/fidl/fuchsia.sysmem:fuchsia.sysmem_hlcpp", "//third_party/fuchsia-sdk/sdk/pkg/sys_cpp", - "//third_party/libyuv:libyuv", + "//third_party/libyuv", "//ui/ozone", ] }
diff --git a/media/gpu/BUILD.gn b/media/gpu/BUILD.gn index eed8029..67d06ff3 100644 --- a/media/gpu/BUILD.gn +++ b/media/gpu/BUILD.gn
@@ -188,11 +188,11 @@ # TODO(crbug.com/40552063): This can be removed once CdmManager is removed. "//gpu/ipc/common", "//media/mojo:buildflags", - "//services/service_manager/public/cpp:cpp", + "//services/service_manager/public/cpp", "//third_party/libgav1:libgav1_parser", ] if (enable_vulkan) { - deps += [ "//gpu/vulkan:vulkan" ] + deps += [ "//gpu/vulkan" ] } } @@ -306,7 +306,7 @@ ] } deps += [ - "//gpu/ipc/common:common", + "//gpu/ipc/common", "//media/base/win:color_space_util_win", "//third_party/angle:includes", "//third_party/libaom:libaomrc", @@ -604,7 +604,7 @@ "//media:test_support", "//testing/gmock", "//testing/gtest", - "//third_party/libyuv:libyuv", + "//third_party/libyuv", "//ui/gl", "//ui/gl/init", ]
diff --git a/media/gpu/chromeos/BUILD.gn b/media/gpu/chromeos/BUILD.gn index e9723a5..4a6e17c 100644 --- a/media/gpu/chromeos/BUILD.gn +++ b/media/gpu/chromeos/BUILD.gn
@@ -35,7 +35,7 @@ "//media/gpu:buildflags", "//media/gpu:command_buffer_helper", "//media/gpu:common", - "//media/mojo/common:common", + "//media/mojo/common", ] if (use_vaapi) { @@ -104,7 +104,7 @@ ":video_frame_resource", ":video_frame_utils", "//gpu/ipc/service", - "//media/mojo/mojom:mojom", + "//media/mojo/mojom", "//ui/ozone", ] @@ -112,7 +112,7 @@ ":fourcc", "//base", "//build/config/linux/libdrm", - "//gpu/ipc/common:common", + "//gpu/ipc/common", "//media", "//media/gpu:buffer_validation", "//media/gpu:buildflags", @@ -135,7 +135,7 @@ ] deps += [ "//gpu/command_buffer/service:gles2", - "//gpu/vulkan/init:init", + "//gpu/vulkan/init", ] } @@ -196,7 +196,7 @@ "//base", "//build/config/linux/libdrm", "//components/viz/common:shared_image_format", - "//gpu/ipc/common:common", + "//gpu/ipc/common", "//media", "//media/gpu:buffer_validation", "//media/gpu:common", @@ -244,7 +244,7 @@ "//base/test:test_support", "//build/config/linux/libdrm", "//gpu:test_support", - "//gpu/ipc/service:service", + "//gpu/ipc/service", "//media", "//media:test_support", "//media/gpu:buildflags", @@ -317,7 +317,7 @@ "//ui/gl:test_support", ] if (use_vaapi) { - deps += [ "//media/gpu/vaapi:vaapi" ] + deps += [ "//media/gpu/vaapi" ] } if (use_v4l2_codec) { deps += [ "//media/gpu/v4l2" ]
diff --git a/media/gpu/sandbox/BUILD.gn b/media/gpu/sandbox/BUILD.gn index 67b4c62..7987b932 100644 --- a/media/gpu/sandbox/BUILD.gn +++ b/media/gpu/sandbox/BUILD.gn
@@ -17,7 +17,7 @@ deps = [ "//base", "//media/gpu:buildflags", - "//sandbox/policy:policy", + "//sandbox/policy", ] if (use_vaapi) { deps += [ "//media/gpu/vaapi:common" ]
diff --git a/media/gpu/test/BUILD.gn b/media/gpu/test/BUILD.gn index 6ad942f..68bb3a3d 100644 --- a/media/gpu/test/BUILD.gn +++ b/media/gpu/test/BUILD.gn
@@ -129,7 +129,7 @@ "video_frame_helpers.h", ] deps = [ - "//base:base", + "//base", "//base/test:test_config", "//base/test:test_support", "//gpu:test_support", @@ -175,7 +175,7 @@ deps = [ ":helpers", "//media/gpu", - "//ui/gfx/codec:codec", + "//ui/gfx/codec", ] } @@ -216,7 +216,7 @@ "//gpu:test_support", "//media/gpu", "//testing/gmock", - "//testing/gtest:gtest", + "//testing/gtest", ] if (use_vaapi || use_v4l2_codec) { @@ -237,11 +237,11 @@ deps = [ ":helpers", - "//base:base", + "//base", "//base/test:test_support", "//media:test_support", "//media/gpu", - "//mojo/core/embedder:embedder", + "//mojo/core/embedder", ] public_deps = [ @@ -288,7 +288,7 @@ "//gpu:test_support", "//media/gpu", "//testing/gmock", - "//testing/gtest:gtest", + "//testing/gtest", ] }
diff --git a/media/gpu/v4l2/BUILD.gn b/media/gpu/v4l2/BUILD.gn index 86cc9e2..8246d40c 100644 --- a/media/gpu/v4l2/BUILD.gn +++ b/media/gpu/v4l2/BUILD.gn
@@ -223,7 +223,7 @@ "//base/test:test_support", "//build/config/linux/libdrm", "//media:test_support", - "//media/gpu/chromeos:chromeos", + "//media/gpu/chromeos", "//testing/gtest", "//ui/gfx/linux:gbm", ] @@ -241,7 +241,7 @@ "mt21/mt21_util_unittest.cc", ] deps = [ - "//base:base", + "//base", "//base/test:test_support", "//testing/gtest", ] @@ -256,7 +256,7 @@ "mt21/mt21_util.h", ] deps = [ - "//base:base", + "//base", "//base/test:test_support", "//testing/gtest", "//testing/perf",
diff --git a/media/gpu/vaapi/BUILD.gn b/media/gpu/vaapi/BUILD.gn index 13d3797..3cade22 100644 --- a/media/gpu/vaapi/BUILD.gn +++ b/media/gpu/vaapi/BUILD.gn
@@ -176,7 +176,7 @@ ":common", "//base", "//testing/gtest", - "//third_party/libyuv:libyuv", + "//third_party/libyuv", ] if (is_chromeos) { deps += [ "//media/gpu/test:local_gpu_memory_buffer_manager" ] @@ -245,7 +245,7 @@ "//base", "//media/gpu/test:local_gpu_memory_buffer_manager", "//testing/gtest", - "//third_party/libyuv:libyuv", + "//third_party/libyuv", "//ui/gfx:memory_buffer", "//ui/gfx/codec", "//ui/gfx/geometry", @@ -365,7 +365,7 @@ "//media/gpu:common", "//third_party/libgav1:libgav1_parser", "//third_party/libyuv", - "//ui/gfx/codec:codec", + "//ui/gfx/codec", "//ui/gfx/geometry", ] }
diff --git a/media/mojo/clients/BUILD.gn b/media/mojo/clients/BUILD.gn index 26bd2b65..f334bb0 100644 --- a/media/mojo/clients/BUILD.gn +++ b/media/mojo/clients/BUILD.gn
@@ -26,9 +26,9 @@ # TODO(liberato): can we avoid this? "//content/test/*", "//third_party/blink/renderer/modules/mediarecorder", - "//third_party/blink/renderer/modules/peerconnection:peerconnection", + "//third_party/blink/renderer/modules/peerconnection", "//third_party/blink/renderer/modules/webcodecs", - "//third_party/blink/renderer/platform:platform", + "//third_party/blink/renderer/platform", ] sources = [ @@ -83,7 +83,7 @@ "//mojo/public/cpp/bindings", "//mojo/public/cpp/system", "//services/service_manager/public/mojom", - "//services/viz/public/cpp/gpu:gpu", + "//services/viz/public/cpp/gpu", ] deps = [ @@ -94,8 +94,8 @@ if (is_android) { deps += [ - "//gpu/ipc/common:common", - "//ui/gl:gl", + "//gpu/ipc/common", + "//ui/gl", ] } if (is_win) { @@ -176,7 +176,7 @@ deps += [ "//content/public/renderer", - "//content/renderer:renderer", + "//content/renderer", "//media", ] }
diff --git a/media/mojo/mojom/BUILD.gn b/media/mojo/mojom/BUILD.gn index fcedeb1..50e52c0 100644 --- a/media/mojo/mojom/BUILD.gn +++ b/media/mojo/mojom/BUILD.gn
@@ -933,7 +933,7 @@ ":mojom_shared", "//gpu/ipc/common", "//media", - "//media/base/ipc:ipc", + "//media/base/ipc", "//mojo/public/mojom/base", "//ui/gfx/geometry/mojom:mojom_traits", ]
diff --git a/media/muxers/BUILD.gn b/media/muxers/BUILD.gn index 45bf28b..6a2cefb3 100644 --- a/media/muxers/BUILD.gn +++ b/media/muxers/BUILD.gn
@@ -48,7 +48,7 @@ deps = [ "//base", - "//components/version_info:version_info", + "//components/version_info", "//media/base", "//media/formats", "//third_party/libwebm",
diff --git a/media/remoting/BUILD.gn b/media/remoting/BUILD.gn index f49c592..6ad93b52 100644 --- a/media/remoting/BUILD.gn +++ b/media/remoting/BUILD.gn
@@ -68,7 +68,7 @@ ] deps = [ - "//media/mojo/common:common", + "//media/mojo/common", "//media/mojo/mojom:remoting", "//third_party/openscreen/src/cast/streaming:common", ] @@ -123,7 +123,7 @@ deps += [ "//media/test:pipeline_integration_test_base", - "//services/service_manager/public/cpp:cpp", + "//services/service_manager/public/cpp", "//ui/gfx:test_support", "//ui/gfx/geometry", ]
diff --git a/media/video/BUILD.gn b/media/video/BUILD.gn index 611c114..9f24e07 100644 --- a/media/video/BUILD.gn +++ b/media/video/BUILD.gn
@@ -82,7 +82,7 @@ } if (is_apple) { - deps += [ "//media/base/mac:mac" ] + deps += [ "//media/base/mac" ] } } @@ -137,8 +137,8 @@ "//media:test_support", "//testing/gmock", "//testing/gtest", - "//third_party/libvpx:libvpx", - "//third_party/libyuv:libyuv", + "//third_party/libvpx", + "//third_party/libyuv", "//ui/gfx", ] }
diff --git a/mojo/public/cpp/bindings/README.md b/mojo/public/cpp/bindings/README.md index 1f09732..fbddaaa 100644 --- a/mojo/public/cpp/bindings/README.md +++ b/mojo/public/cpp/bindings/README.md
@@ -718,6 +718,70 @@ LOG(INFO) << "Value is " << value->get_string_value(); // DCHECK! ``` +### Result + +Methods may use a special `result<T,E>` type to express that a method may either +return a message of type T on success and a message of type E on failure. This +type maps to `base::expected` in C++. + +For example, consider the following Mojom method: + +```mojom +module foo.mojom; + +struct Success { + int64 elapsed_ms; +}; + +struct Failure { + string reason; +}; + +interface Iface { + DoSomething() => result<Success, Failure>; +}; +``` + +This would generate a C++ interface like so: + +```cpp +namespace foo::mojom { + +class Iface { + virtual ~IFace() {} + + virtual void DoSomething(DoSomethingCallback callback) = 0; +}; + +} // namespace foo::mojom +``` + +`DoSomethingCallback` takes a base::expected as the single parameter. If the +API invocation was successful, the callback can be invoked with `base::ok` +along with the success type. If the API invocation was unsuccessful, the +callback can be invoked with `base::unexpected` along with the error type. +For example: + +```cpp +namespace foo { + +class IfaceImpl : public mojom::Iface { + DoSomething(DoSomethingCallback callback) override { + if (success) { + auto success = mojom::Success::New(); + success->elapsed_ms = 9001; + callback.Run(base::ok(std::move(success))); + } else { + auto failure = mojom::Failure::New(); + failure->reason = "too hard!"; + callback.Run(base::unexpected(std::move(success))); + } + } +}; + +} // namespace foo +``` + ### Features Mojom `feature` generates a `base::Feature` with the given `name` and
diff --git a/pdf/pdfium/pdfium_draw_selection_test_base.cc b/pdf/pdfium/pdfium_draw_selection_test_base.cc index 08d9de58..141aa9a 100644 --- a/pdf/pdfium/pdfium_draw_selection_test_base.cc +++ b/pdf/pdfium/pdfium_draw_selection_test_base.cc
@@ -24,11 +24,10 @@ PDFiumEngine& engine, int page_index, std::string_view expected_png_filename) { - return DrawAndCompareImpl(engine, page_index, - FILE_PATH_LITERAL("text_selection"), - expected_png_filename, - /*use_platform_suffix=*/false, - /*draw_caret=*/false); + DrawAndCompareImpl(engine, page_index, FILE_PATH_LITERAL("text_selection"), + expected_png_filename, + /*use_platform_suffix=*/false, + /*draw_caret=*/false); } void PDFiumDrawSelectionTestBase:: @@ -36,32 +35,30 @@ PDFiumEngine& engine, int page_index, std::string_view expected_png_filename) { - return DrawAndCompareImpl(engine, page_index, - FILE_PATH_LITERAL("text_selection"), - expected_png_filename, - /*use_platform_suffix=*/true, - /*draw_caret=*/false); + DrawAndCompareImpl(engine, page_index, FILE_PATH_LITERAL("text_selection"), + expected_png_filename, + /*use_platform_suffix=*/true, + /*draw_caret=*/false); } void PDFiumDrawSelectionTestBase::DrawHighlightsAndCompare( PDFiumEngine& engine, int page_index, std::string_view expected_png_filename) { - return DrawAndCompareImpl(engine, page_index, - FILE_PATH_LITERAL("text_fragments"), - expected_png_filename, - /*use_platform_suffix=*/false, - /*draw_caret=*/false); + DrawAndCompareImpl(engine, page_index, FILE_PATH_LITERAL("text_fragments"), + expected_png_filename, + /*use_platform_suffix=*/false, + /*draw_caret=*/false); } void PDFiumDrawSelectionTestBase::DrawCaretAndCompareWithPlatformExpectations( PDFiumEngine& engine, int page_index, std::string_view expected_png_filename) { - return DrawAndCompareImpl(engine, page_index, FILE_PATH_LITERAL("caret"), - expected_png_filename, - /*use_platform_suffix=*/true, - /*draw_caret=*/true); + DrawAndCompareImpl(engine, page_index, FILE_PATH_LITERAL("caret"), + expected_png_filename, + /*use_platform_suffix=*/true, + /*draw_caret=*/true); } void PDFiumDrawSelectionTestBase::SetSelection(PDFiumEngine& engine,
diff --git a/remoting/protocol/webrtc_video_encoder_wrapper.cc b/remoting/protocol/webrtc_video_encoder_wrapper.cc index b2086ec..5d14c5a0 100644 --- a/remoting/protocol/webrtc_video_encoder_wrapper.cc +++ b/remoting/protocol/webrtc_video_encoder_wrapper.cc
@@ -8,6 +8,7 @@ #include <algorithm> #include <functional> +#include <memory> #include <string> #include <vector> @@ -20,6 +21,7 @@ #include "base/task/sequenced_task_runner.h" #include "base/task/single_thread_task_runner.h" #include "base/time/time.h" +#include "base/timer/timer.h" #include "build/build_config.h" #include "remoting/base/constants.h" #include "remoting/base/session_options.h" @@ -31,6 +33,7 @@ #include "third_party/webrtc/api/video_codecs/sdp_video_format.h" #include "third_party/webrtc/api/video_codecs/vp9_profile.h" #include "third_party/webrtc/modules/desktop_capture/desktop_frame.h" +#include "third_party/webrtc/modules/desktop_capture/shared_desktop_frame.h" #include "third_party/webrtc/modules/video_coding/include/video_codec_interface.h" #include "third_party/webrtc/modules/video_coding/include/video_error_codes.h" @@ -283,7 +286,8 @@ static_cast<WebrtcVideoFrameAdapter*>(frame.video_frame_buffer().get()); // Store RTP timestamp and FrameStats so they can be added to the - // EncodedImage and EncodedFrame when encoding is complete. + // EncodedImage and EncodedFrame when encoding is complete, and used for + // top-off extrapolation. rtp_timestamp_ = frame.rtp_timestamp(); frame_stats_ = video_frame_adapter->TakeFrameStats(); if (!frame_stats_) { @@ -303,7 +307,13 @@ frame_stats_->encode_started_time = encode_start; - auto desktop_frame = video_frame_adapter->TakeDesktopFrame(); + auto desktop_frame = + webrtc::SharedDesktopFrame::Wrap(video_frame_adapter->TakeDesktopFrame()); + + last_capturer_fed_frame_ = desktop_frame->Share(); + // Clear the updated region since the extrapolated frames are exactly the same + // as the last frame. + last_capturer_fed_frame_->mutable_updated_region()->Clear(); // If any frames were dropped by WebRTC or by this class, the // original DesktopFrame's updated-region should not be used as-is @@ -355,32 +365,7 @@ } latest_frame_encode_start_time_ = encode_start; - WebrtcVideoEncoder::FrameParams frame_params; - - // SetRates() must be called prior to Encode(), with a non-zero bitrate. - DCHECK_NE(0, bitrate_kbps_); - frame_params.bitrate_kbps = bitrate_kbps_; - frame_params.duration = current_frame_interval_; - frame_params.fps = current_frame_interval_.ToHz(); - - frame_params.vpx_min_quantizer = - ShouldDropQualityForLargeFrame(*desktop_frame) ? kMaxQuantizer - : kMinQuantizer; - frame_params.vpx_max_quantizer = kMaxQuantizer; - frame_params.clear_active_map = !top_off_active_; - - frame_params.key_frame = pending_key_frame_request_; - pending_key_frame_request_ = false; - - encode_pending_ = true; - - auto encode_callback = base::BindPostTaskToCurrentDefault(base::BindOnce( - &WebrtcVideoEncoderWrapper::OnFrameEncoded, weak_factory_.GetWeakPtr())); - encode_task_runner_->PostTask( - FROM_HERE, - base::BindOnce(&WebrtcVideoEncoder::Encode, - base::Unretained(encoder_.get()), std::move(desktop_frame), - frame_params, std::move(encode_callback))); + EncodeDesktopFrame(std::move(desktop_frame)); return WEBRTC_VIDEO_CODEC_OK; } @@ -491,7 +476,8 @@ // WebrtcFrameSchedulerConstantRate cannot estimate this delay. Set it to 0 // so the client can still calculate the derived stats. frame_stats_->send_pending_delay = base::TimeDelta(); - frame->stats = std::move(frame_stats_); + frame->stats = + std::make_unique<WebrtcVideoEncoder::FrameStats>(*frame_stats_); frame->rtp_timestamp = rtp_timestamp_; } @@ -509,6 +495,7 @@ if (!frame || !frame->data || !frame->data->size()) { top_off_active_ = false; + UpdateTopOffExtrapolationTimer(); NotifyFrameDropped(); DropPendingFrame(); return; @@ -516,6 +503,7 @@ // Top-off until the best quantizer value is reached. top_off_active_ = (frame->quantizer > kMinQuantizer); + UpdateTopOffExtrapolationTimer(); // If there was a successful capture while the encoder was working then there // will be a frame waiting to be encoded. Send it to the encoder now that its @@ -592,4 +580,87 @@ } } +void WebrtcVideoEncoderWrapper::EncodeDesktopFrame( + std::unique_ptr<webrtc::DesktopFrame> desktop_frame) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + DCHECK(!encode_pending_); + + if (keep_alive_timer_.IsRunning()) { + keep_alive_timer_.Reset(); + } else { + keep_alive_timer_.Start(FROM_HERE, kKeepAliveInterval, this, + &WebrtcVideoEncoderWrapper::ExtrapolateFrame); + } + if (top_off_active_) { + top_off_timer_.Reset(); + } + + WebrtcVideoEncoder::FrameParams frame_params; + + // SetRates() must be called prior to Encode(), with a non-zero bitrate. + DCHECK_NE(0, bitrate_kbps_); + frame_params.bitrate_kbps = bitrate_kbps_; + frame_params.duration = current_frame_interval_; + frame_params.fps = current_frame_interval_.ToHz(); + + frame_params.vpx_min_quantizer = + ShouldDropQualityForLargeFrame(*desktop_frame) ? kMaxQuantizer + : kMinQuantizer; + frame_params.vpx_max_quantizer = kMaxQuantizer; + frame_params.clear_active_map = !top_off_active_; + + frame_params.key_frame = pending_key_frame_request_; + pending_key_frame_request_ = false; + + encode_pending_ = true; + + auto encode_callback = base::BindPostTaskToCurrentDefault(base::BindOnce( + &WebrtcVideoEncoderWrapper::OnFrameEncoded, weak_factory_.GetWeakPtr())); + encode_task_runner_->PostTask( + FROM_HERE, + base::BindOnce(&WebrtcVideoEncoder::Encode, + base::Unretained(encoder_.get()), std::move(desktop_frame), + frame_params, std::move(encode_callback))); +} + +void WebrtcVideoEncoderWrapper::UpdateTopOffExtrapolationTimer() { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + if (top_off_active_) { + // For constant rate capturers, top-off frames are extrapolated in a + // frequency slightly lower than the targeted frame rate so that it can be + // suppressed by capturer-fed frames. For push-based capturers, the top-off + // frequency is slightly lower than the minimal frame rate + // (1 / kMaxFrameDuration). + base::TimeDelta top_off_interval = + std::max(current_frame_interval_ * 1.1, + current_frame_interval_ + base::Milliseconds(2)); + top_off_timer_.Start(FROM_HERE, top_off_interval, this, + &WebrtcVideoEncoderWrapper::ExtrapolateFrame); + } else { + top_off_timer_.Stop(); + } +} + +void WebrtcVideoEncoderWrapper::ExtrapolateFrame() { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + if (encode_pending_ || pending_frame_) { + VLOG(1) << "Top-off frame not extrapolated because encoder is busy."; + return; + } + if (!last_capturer_fed_frame_) { + LOG(ERROR) << "No top-off frame is available."; + return; + } + latest_frame_encode_start_time_ = base::TimeTicks::Now(); + frame_stats_->encode_started_time = latest_frame_encode_start_time_; + // WebRTC requires the RTP timestamp be increasing, so we just add 1. + rtp_timestamp_++; + EncodeDesktopFrame(last_capturer_fed_frame_->Share()); +} + +// static +base::TimeDelta WebrtcVideoEncoderWrapper::GetKeepAliveIntervalForTesting() { + return kKeepAliveInterval; +} + } // namespace remoting::protocol
diff --git a/remoting/protocol/webrtc_video_encoder_wrapper.h b/remoting/protocol/webrtc_video_encoder_wrapper.h index b65add82..1108cf88 100644 --- a/remoting/protocol/webrtc_video_encoder_wrapper.h +++ b/remoting/protocol/webrtc_video_encoder_wrapper.h
@@ -13,6 +13,8 @@ #include "base/sequence_checker.h" #include "base/task/single_thread_task_runner.h" #include "base/thread_annotations.h" +#include "base/time/time.h" +#include "base/timer/timer.h" #include "remoting/base/constants.h" #include "remoting/base/running_samples.h" #include "remoting/base/session_options.h" @@ -21,6 +23,8 @@ #include "third_party/webrtc/api/video_codecs/sdp_video_format.h" #include "third_party/webrtc/api/video_codecs/video_encoder.h" #include "third_party/webrtc/modules/desktop_capture/desktop_capture_types.h" +#include "third_party/webrtc/modules/desktop_capture/desktop_frame.h" +#include "third_party/webrtc/modules/desktop_capture/shared_desktop_frame.h" namespace remoting::protocol { @@ -57,6 +61,8 @@ void OnRttUpdate(int64_t rtt_ms) override; webrtc::VideoEncoder::EncoderInfo GetEncoderInfo() const override; + static base::TimeDelta GetKeepAliveIntervalForTesting(); + private: static constexpr int kStatsWindow = 5; @@ -85,6 +91,16 @@ // |pending_frame_| contains valid frame data. void DropPendingFrame(); + // Encodes a desktop frame. Only one frame can be encoded at a time. + void EncodeDesktopFrame(std::unique_ptr<webrtc::DesktopFrame> desktop_frame); + + // If `top_off_active_` is true, (re)starts the top-off extrapolation timer + // with a recalculated interval, otherwise stops the timer. + void UpdateTopOffExtrapolationTimer(); + + // Re-encodes the last capturer-fed frame. + void ExtrapolateFrame(); + std::unique_ptr<WebrtcVideoEncoder> encoder_ GUARDED_BY_CONTEXT(sequence_checker_); @@ -98,7 +114,8 @@ uint32_t rtp_timestamp_ GUARDED_BY_CONTEXT(sequence_checker_); // FrameStats taken from the input VideoFrameAdapter, then added to the - // EncodedFrame when encoding is complete. + // EncodedFrame when encoding is complete. This is also used for top-off and + // keep-alive extrapolation. std::unique_ptr<WebrtcVideoEncoder::FrameStats> frame_stats_; // Bandwidth estimate from SetRates(), which is expected to be called before @@ -112,6 +129,23 @@ // True when encoding unchanged frames for top-off. bool top_off_active_ GUARDED_BY_CONTEXT(sequence_checker_) = false; + // Timer to extrapolate top-off frames in a reasonable interval, until + // `top_off_active_` is false. It will be suppressed if either a capturer-fed + // frame or a keep-alive frame is encoded within the top-off interval. + base::RetainingOneShotTimer top_off_timer_ + GUARDED_BY_CONTEXT(sequence_checker_); + + // Timer to extrapolate keep-alive frames. It will be suppressed if either a + // capturer-fed frame or a top-off frame is encoded within the keep-alive + // interval. + base::RetainingOneShotTimer keep_alive_timer_ + GUARDED_BY_CONTEXT(sequence_checker_); + + // The last capturer-fed desktop frame, used for top-off and keep-alive + // extrapolation. + std::unique_ptr<webrtc::SharedDesktopFrame> last_capturer_fed_frame_ + GUARDED_BY_CONTEXT(sequence_checker_); + webrtc::VideoCodecType codec_type_ GUARDED_BY_CONTEXT(sequence_checker_); // True when a frame is being encoded. This guards against encoding multiple
diff --git a/remoting/protocol/webrtc_video_encoder_wrapper_unittest.cc b/remoting/protocol/webrtc_video_encoder_wrapper_unittest.cc index 980358a5..abf8d5b 100644 --- a/remoting/protocol/webrtc_video_encoder_wrapper_unittest.cc +++ b/remoting/protocol/webrtc_video_encoder_wrapper_unittest.cc
@@ -5,6 +5,7 @@ #include "remoting/protocol/webrtc_video_encoder_wrapper.h" #include "base/test/task_environment.h" +#include "base/time/time.h" #include "remoting/base/session_options.h" #include "remoting/protocol/video_channel_state_observer.h" #include "remoting/protocol/video_stream_event_router.h" @@ -165,33 +166,44 @@ } // namespace class WebrtcVideoEncoderWrapperTest : public testing::Test { + protected: + // Returns a lambda for stubbing mock_video_encoder_.Encode(). + // `quantizer_rate` controls the quantizer of the encoded frame; 0 means + // `vpx_min_quantizer` while 1 means `vpx_max_quantizer`. + decltype(auto) RespondWithEncodedFrame(float quantizer_rate = 0.f) { + return [this, quantizer_rate]( + std::unique_ptr<webrtc::DesktopFrame> frame, + const WebrtcVideoEncoder::FrameParams& frame_params, + WebrtcVideoEncoder::EncodeCallback done) { + auto encoded_frame = std::make_unique<WebrtcVideoEncoder::EncodedFrame>(); + encoded_frame->dimensions = frame->size(); + encoded_frame->data = webrtc::EncodedImageBuffer::Create( + frame->size().width() * frame->size().height()); + encoded_frame->key_frame = frame_params.key_frame; + encoded_frame->quantizer = + frame_params.vpx_min_quantizer + + (frame_params.vpx_max_quantizer - frame_params.vpx_min_quantizer) * + quantizer_rate; + encoded_frame->codec = kVideoCodecVP9; + + auto expected_framerate = get_expected_framerate(); + if (expected_framerate.has_value()) { + EXPECT_EQ(frame_params.fps, *expected_framerate); + EXPECT_NEAR(frame_params.duration.InMilliseconds(), + base::Hertz(*expected_framerate).InMilliseconds(), + kDurationMsFudgeFactor); + } + std::move(done).Run(WebrtcVideoEncoder::EncodeResult::SUCCEEDED, + std::move(encoded_frame)); + }; + } + public: void SetUp() override { // Configure the mock encoder's default behavior to mimic a real encoder. mock_video_encoder_ = std::make_unique<NiceMock<MockVideoEncoder>>(); ON_CALL(*mock_video_encoder_, Encode) - .WillByDefault([&](std::unique_ptr<webrtc::DesktopFrame> frame, - const WebrtcVideoEncoder::FrameParams& frame_params, - WebrtcVideoEncoder::EncodeCallback done) { - auto encoded_frame = - std::make_unique<WebrtcVideoEncoder::EncodedFrame>(); - encoded_frame->dimensions = frame->size(); - encoded_frame->data = webrtc::EncodedImageBuffer::Create( - frame->size().width() * frame->size().height()); - encoded_frame->key_frame = frame_params.key_frame; - encoded_frame->quantizer = frame_params.vpx_min_quantizer; - encoded_frame->codec = kVideoCodecVP9; - - auto expected_framerate = get_expected_framerate(); - if (expected_framerate.has_value()) { - EXPECT_EQ(frame_params.fps, *expected_framerate); - EXPECT_NEAR(frame_params.duration.InMilliseconds(), - base::Hertz(*expected_framerate).InMilliseconds(), - kDurationMsFudgeFactor); - } - std::move(done).Run(WebrtcVideoEncoder::EncodeResult::SUCCEEDED, - std::move(encoded_frame)); - }); + .WillByDefault(RespondWithEncodedFrame()); video_stream_event_router_.SetVideoChannelStateObserver( "screen_stream", observer_.GetWeakPtr()); @@ -396,24 +408,6 @@ PostQuitAndRun(); } -TEST_F(WebrtcVideoEncoderWrapperTest, EmptyFrameNotDroppedAfter2Seconds) { - EXPECT_CALL(callback_, OnEncodedImage(_, _)) - .Times(2) - .WillRepeatedly(Return(kResultOk)); - - auto frame1 = MakeVideoFrame(); - auto frame2 = MakeEmptyVideoFrame(); - auto encoder = InitEncoder(GetVp9Format(), GetVp9Codec()); - // Delta is used in this test, because key-frames should never be dropped - // anyway. - std::vector<VideoFrameType> frame_types{VideoFrameType::kVideoFrameDelta}; - encoder->Encode(frame1, &frame_types); - task_environment_.FastForwardBy(base::Milliseconds(2500)); - encoder->Encode(frame2, &frame_types); - - PostQuitAndRun(); -} - TEST_F(WebrtcVideoEncoderWrapperTest, EmptyFrameNotDroppedIfKeyFrame) { EXPECT_CALL(callback_, OnEncodedImage(_, _)) .Times(2) @@ -508,4 +502,87 @@ PostQuitAndRun(); } +TEST_F(WebrtcVideoEncoderWrapperTest, ExtrapolateTopOffFrames) { + EXPECT_CALL(*mock_video_encoder_, Encode) + .WillOnce(RespondWithEncodedFrame(1.f)) + .WillOnce(RespondWithEncodedFrame(0.50f)) + .WillOnce(RespondWithEncodedFrame(0.25f)) + .WillOnce(RespondWithEncodedFrame(0.f)); + EXPECT_CALL(callback_, OnEncodedImage(_, _)) + .Times(4) + .WillRepeatedly(Return(kResultOk)); + + auto encoder = InitEncoder(GetVp9Format(), GetVp9Codec()); + encoder->SetEncoderForTest(std::move(mock_video_encoder_)); + + std::vector<VideoFrameType> frame_types{VideoFrameType::kVideoFrameKey}; + encoder->Encode(MakeVideoFrame(), &frame_types); + ASSERT_LT(base::Seconds(1), + WebrtcVideoEncoderWrapper::GetKeepAliveIntervalForTesting()); + task_environment_.FastForwardBy(base::Seconds(1)); + + PostQuitAndRun(); +} + +TEST_F(WebrtcVideoEncoderWrapperTest, + TopOffExtrapolationSuppressedByCapturerFedFrames) { + EXPECT_CALL(*mock_video_encoder_, Encode) + .Times(2) + .WillRepeatedly(RespondWithEncodedFrame(1.f)); + EXPECT_CALL(callback_, OnEncodedImage(_, _)) + .Times(2) + .WillRepeatedly(Return(kResultOk)); + + auto encoder = InitEncoder(GetVp9Format(), GetVp9Codec()); + encoder->SetEncoderForTest(std::move(mock_video_encoder_)); + + std::vector<VideoFrameType> frame_types{VideoFrameType::kVideoFrameKey}; + encoder->Encode(MakeVideoFrame(), &frame_types); + task_environment_.FastForwardBy(base::Hertz(kTargetFrameRate)); + encoder->Encode(MakeVideoFrame(), &frame_types); + // This would extrapolate a top-off frame if it weren't suppressed. + task_environment_.FastForwardBy(base::Hertz(kTargetFrameRate)); + + PostQuitAndRun(); +} + +TEST_F(WebrtcVideoEncoderWrapperTest, ExtrapolateKeepAliveFrames) { + EXPECT_CALL(callback_, OnEncodedImage(_, _)) + .Times(6) // 1 capturer-fed frame plus 5 extrapolated frames. + .WillRepeatedly(Return(kResultOk)); + + auto encoder = InitEncoder(GetVp9Format(), GetVp9Codec()); + encoder->SetEncoderForTest(std::move(mock_video_encoder_)); + + std::vector<VideoFrameType> frame_types{VideoFrameType::kVideoFrameKey}; + encoder->Encode(MakeVideoFrame(), &frame_types); + task_environment_.FastForwardBy( + WebrtcVideoEncoderWrapper::GetKeepAliveIntervalForTesting() * 5); + + PostQuitAndRun(); +} + +TEST_F(WebrtcVideoEncoderWrapperTest, + KeepAliveExtrapolationSuppressedByCapturerFedFrames) { + EXPECT_CALL(callback_, OnEncodedImage(_, _)) + .Times(2) + .WillRepeatedly(Return(kResultOk)); + + auto encoder = InitEncoder(GetVp9Format(), GetVp9Codec()); + encoder->SetEncoderForTest(std::move(mock_video_encoder_)); + + std::vector<VideoFrameType> frame_types{VideoFrameType::kVideoFrameKey}; + encoder->Encode(MakeVideoFrame(), &frame_types); + task_environment_.FastForwardBy( + WebrtcVideoEncoderWrapper::GetKeepAliveIntervalForTesting() - + base::Milliseconds(100)); + encoder->Encode(MakeVideoFrame(), &frame_types); + // This would extrapolate a keep-alive frame if it weren't suppressed. + task_environment_.FastForwardBy( + WebrtcVideoEncoderWrapper::GetKeepAliveIntervalForTesting() - + base::Milliseconds(100)); + + PostQuitAndRun(); +} + } // namespace remoting::protocol
diff --git a/sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.cc b/sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.cc index 420c9c80..ee52cba 100644 --- a/sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.cc +++ b/sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.cc
@@ -58,6 +58,7 @@ #endif base::debug::CrashKeyString* seccomp_crash_key = nullptr; +base::debug::CrashKeyString* seccomp_ioctl_crash_key = nullptr; inline bool IsArchitectureX86_64() { #if defined(__x86_64__) @@ -210,6 +211,29 @@ __FILE__ ":**CRASHING**:" SECCOMP_MESSAGE_IOCTL_CONTENT "\n"; WriteToStdErr(kSeccompIoctlError, sizeof(kSeccompIoctlError) - 1); PrintAndSetSeccompCrashKey(args); + + // Log information about the file descriptor. + char message[256]; + size_t message_len; + default_stat_struct stat_buf; + const int fstat_ret = + syscall(__NR_fstat_default, static_cast<int>(args.args[0]), &stat_buf); + if (fstat_ret == 0) { + message_len = base::strings::SafeSPrintf( + message, + "dev=0x%x,ino=%d,mode=0%o,nlink=%d," + "uid=%d,gid=%d,rdev=0x%x,size=%d,blksize=%d,blocks=%d", + stat_buf.st_dev, stat_buf.st_ino, stat_buf.st_mode, stat_buf.st_nlink, + stat_buf.st_uid, stat_buf.st_gid, stat_buf.st_rdev, stat_buf.st_size, + stat_buf.st_blksize, stat_buf.st_blocks); + } else { + // fstat failed, log the errno. + message_len = base::strings::SafeSPrintf(message, "fstat failed, errno=%d", + -fstat_ret); + } + WriteToStdErr(message, message_len); + base::debug::SetCrashKeyString(seccomp_ioctl_crash_key, message); + // Make "request" volatile so that we can see it on the stack in a minidump. volatile uint64_t request = args.args[1]; volatile char* addr = reinterpret_cast<volatile char*>(request & 0xFFFF); @@ -524,6 +548,8 @@ seccomp_crash_key = base::debug::AllocateCrashKeyString( "seccomp-sigsys", base::debug::CrashKeySize::Size256); + seccomp_ioctl_crash_key = base::debug::AllocateCrashKeyString( + "seccomp-sigsys-ioctl", base::debug::CrashKeySize::Size256); } const char* GetErrorMessageContentForTests() {
diff --git a/sandbox/linux/seccomp-bpf-helpers/sigsys_handlers_unittest.cc b/sandbox/linux/seccomp-bpf-helpers/sigsys_handlers_unittest.cc index 5a0fe9f..391d9ca 100644 --- a/sandbox/linux/seccomp-bpf-helpers/sigsys_handlers_unittest.cc +++ b/sandbox/linux/seccomp-bpf-helpers/sigsys_handlers_unittest.cc
@@ -9,15 +9,26 @@ #include "sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.h" +#include <fcntl.h> #include <linux/net.h> +#include <sys/ioctl.h> #include <sys/socket.h> #include <sys/syscall.h> +#include <sys/types.h> +#include <termios.h> +#include <unistd.h> + +#include <utility> #include "base/check_op.h" +#include "base/files/file_util.h" +#include "base/files/scoped_file.h" #include "base/strings/safe_sprintf.h" #include "sandbox/linux/bpf_dsl/bpf_dsl.h" #include "sandbox/linux/bpf_dsl/policy.h" #include "sandbox/linux/seccomp-bpf/bpf_tests.h" +#include "sandbox/linux/seccomp-bpf/sandbox_bpf.h" +#include "sandbox/linux/system_headers/linux_stat.h" #include "sandbox/linux/system_headers/linux_syscalls.h" #include "sandbox/linux/tests/unit_tests.h" @@ -119,6 +130,41 @@ #pragma GCC diagnostic pop } +class CrashIoctlPolicy : public bpf_dsl::Policy { + public: + CrashIoctlPolicy() = default; + ~CrashIoctlPolicy() override = default; + + ResultExpr EvaluateSyscall(int sysno) const override { + switch (sysno) { + case __NR_ioctl: + return CrashSIGSYSIoctl(); + // The handler needs write() and fstat() for logging. + case __NR_write: + case __NR_fstat_default: + return Allow(); + default: + return Allow(); + } + } +}; + +BPF_DEATH_TEST_C( + SigsysHandlers, + SIGSYSIoctlFailureLogsFdInfo, + DEATH_SEGV_MESSAGE_PATTERN( + "*dev=0x*,ino=*,mode=0*,nlink=*,uid=*,gid=*,rdev=0x*,size=*," + "blksize=*,blocks=*"), + CrashIoctlPolicy) { + base::FilePath temp_path; + CHECK(base::CreateTemporaryFile(&temp_path)); + base::ScopedFD fd(open(temp_path.value().c_str(), O_RDONLY)); + CHECK(fd.is_valid()); + + // This ioctl should be trapped and cause a crash. + ioctl(fd.get(), 0, 0); +} + const char kSigsysMessage[] = "nr=0x42 arg1=0xffffffffffffffff arg2=0x0 arg3=0xabcdef arg4=0xffffffff";
diff --git a/sandbox/linux/tests/unit_tests.cc b/sandbox/linux/tests/unit_tests.cc index 4a6305c..f04066c 100644 --- a/sandbox/linux/tests/unit_tests.cc +++ b/sandbox/linux/tests/unit_tests.cc
@@ -7,6 +7,8 @@ #pragma allow_unsafe_libc_calls #endif +#include "sandbox/linux/tests/unit_tests.h" + #include <fcntl.h> #include <poll.h> #include <signal.h> @@ -26,8 +28,8 @@ #include "base/debug/leak_annotations.h" #include "base/files/file_util.h" #include "base/posix/eintr_wrapper.h" +#include "base/strings/pattern.h" #include "build/build_config.h" -#include "sandbox/linux/tests/unit_tests.h" // Specifically, PNaCl toolchain does not have this flag. #if !defined(POLLRDHUP) @@ -63,6 +65,16 @@ return num_threads; } +// Helper for DeathSEGVMessage and DeathSEGVMessagePattern. +// Checks that the process died with SIGSEGV. +void CheckDeathBySEGV(int status, const std::string& details) { + const bool subprocess_got_sigsegv = + WIFSIGNALED(status) && (SIGSEGV == WTERMSIG(status)); + + ASSERT_TRUE(subprocess_got_sigsegv) + << "Exit status: " << status << " " << details; +} + } // namespace namespace sandbox { @@ -299,18 +311,24 @@ const void* aux) { std::string details(TestFailedMessage(msg)); const char* expected_msg = static_cast<const char*>(aux); - - const bool subprocess_got_sigsegv = - WIFSIGNALED(status) && (SIGSEGV == WTERMSIG(status)); - - ASSERT_TRUE(subprocess_got_sigsegv) << "Exit status: " << status - << " " << details; - + CheckDeathBySEGV(status, details); bool subprocess_exited_without_matching_message = !base::Contains(msg, expected_msg); EXPECT_FALSE(subprocess_exited_without_matching_message) << details; } +void UnitTests::DeathSEGVMessagePattern(int status, + const std::string& msg, + const void* aux) { + std::string details(TestFailedMessage(msg)); + const char* expected_msg = static_cast<const char*>(aux); + CheckDeathBySEGV(status, details); + std::string pattern(expected_msg); + bool subprocess_exited_without_matching_message = + !base::MatchPattern(msg, pattern); + EXPECT_FALSE(subprocess_exited_without_matching_message) << details; +} + void UnitTests::DeathExitCode(int status, const std::string& msg, const void* aux) {
diff --git a/sandbox/linux/tests/unit_tests.h b/sandbox/linux/tests/unit_tests.h index d51eff26..d1c7cfe2 100644 --- a/sandbox/linux/tests/unit_tests.h +++ b/sandbox/linux/tests/unit_tests.h
@@ -75,6 +75,9 @@ #define DEATH_SEGV_MESSAGE(msg) \ sandbox::UnitTests::DeathSEGVMessage, \ static_cast<const void*>(static_cast<const char*>(msg)) +#define DEATH_SEGV_MESSAGE_PATTERN(msg) \ + sandbox::UnitTests::DeathSEGVMessagePattern, \ + static_cast<const void*>(static_cast<const char*>(msg)) #define DEATH_EXIT_CODE(rc) \ sandbox::UnitTests::DeathExitCode, \ reinterpret_cast<void*>(static_cast<intptr_t>(rc)) @@ -186,6 +189,12 @@ const std::string& msg, const void* aux); + // A DeathCheck that verifies that the child process died with a SIGSEGV + // and printed a message matching a pattern. + static void DeathSEGVMessagePattern(int status, + const std::string& msg, + const void* aux); + // A DeathCheck method that verifies that the test completed with a // particular exit code. If the test output any messages to stderr, they are // silently ignored. The expected exit code should be passed in by @@ -203,6 +212,6 @@ const void* aux); }; -} // namespace +} // namespace sandbox #endif // SANDBOX_LINUX_TESTS_UNIT_TESTS_H_
diff --git a/services/accessibility/BUILD.gn b/services/accessibility/BUILD.gn index 92dc930..07984152 100644 --- a/services/accessibility/BUILD.gn +++ b/services/accessibility/BUILD.gn
@@ -73,7 +73,7 @@ public_deps += [ "public/mojom:os_service_mojom", "//gin", - "//ui/accessibility:accessibility", + "//ui/accessibility", ] deps = [ "public/mojom:os_service_mojom_js__generator",
diff --git a/services/accessibility/android/BUILD.gn b/services/accessibility/android/BUILD.gn index b351df4..891dc1a 100644 --- a/services/accessibility/android/BUILD.gn +++ b/services/accessibility/android/BUILD.gn
@@ -4,9 +4,9 @@ source_set("android_lib") { public_deps = [ - "//ash/public/cpp:cpp", + "//ash/public/cpp", "//chrome/app:generated_resources_grit", - "//extensions/browser/api/automation_internal:automation_internal", + "//extensions/browser/api/automation_internal", "//services/accessibility/android/public/mojom", ]
diff --git a/services/accessibility/public/mojom/BUILD.gn b/services/accessibility/public/mojom/BUILD.gn index 1a19f4b9..e02d1db 100644 --- a/services/accessibility/public/mojom/BUILD.gn +++ b/services/accessibility/public/mojom/BUILD.gn
@@ -60,10 +60,10 @@ public_deps = [ ":assistive_technology_type", "//mojo/public/mojom/base", - "//skia/public/mojom:mojom", - "//ui/events/mojom:mojom", + "//skia/public/mojom", + "//ui/events/mojom", "//ui/gfx/geometry/mojom", - "//ui/latency/mojom:mojom", + "//ui/latency/mojom", ] }
diff --git a/services/cert_verifier/BUILD.gn b/services/cert_verifier/BUILD.gn index 0c988c2..4342e3d 100644 --- a/services/cert_verifier/BUILD.gn +++ b/services/cert_verifier/BUILD.gn
@@ -55,7 +55,7 @@ "//net", "//net:test_support", "//net/cert:root_store_proto_lite", - "//services/cert_verifier/cert_net_url_loader:cert_net_url_loader", + "//services/cert_verifier/cert_net_url_loader", "//services/cert_verifier/public/mojom", "//services/network:network_service", "//services/network:test_support",
diff --git a/services/data_decoder/BUILD.gn b/services/data_decoder/BUILD.gn index 45bf1e5..1a1d17d 100644 --- a/services/data_decoder/BUILD.gn +++ b/services/data_decoder/BUILD.gn
@@ -87,7 +87,7 @@ "//base/test:test_support", "//components/cbor", "//components/web_package", - "//components/web_package/test_support:test_support", + "//components/web_package/test_support", "//services/data_decoder/public/cpp", "//services/data_decoder/public/cpp:test_support", "//skia",
diff --git a/services/device/BUILD.gn b/services/device/BUILD.gn index d4d400c..6b03f876 100644 --- a/services/device/BUILD.gn +++ b/services/device/BUILD.gn
@@ -220,7 +220,7 @@ "generic_sensor/platform_sensor_provider_chromeos_unittest.cc", ] deps += [ - "//chromeos/components/sensors:sensors", + "//chromeos/components/sensors", "//chromeos/components/sensors:test_support", ] } else if (is_linux && use_udev) { @@ -324,7 +324,7 @@ deps += [ "//device/bluetooth:mocks", - "//services/device/public/cpp/bluetooth:bluetooth", + "//services/device/public/cpp/bluetooth", "//services/device/serial", "//services/device/serial:test_support", ]
diff --git a/services/device/battery/BUILD.gn b/services/device/battery/BUILD.gn index a4c9e2b..0168a24 100644 --- a/services/device/battery/BUILD.gn +++ b/services/device/battery/BUILD.gn
@@ -52,7 +52,7 @@ "IOKit.framework", ] } else if (is_win) { - deps += [ "//ui/gfx:gfx" ] + deps += [ "//ui/gfx" ] sources += [ "battery_status_manager_win.cc", "battery_status_manager_win.h",
diff --git a/services/device/compute_pressure/BUILD.gn b/services/device/compute_pressure/BUILD.gn index a2768b75..afc311d 100644 --- a/services/device/compute_pressure/BUILD.gn +++ b/services/device/compute_pressure/BUILD.gn
@@ -29,7 +29,7 @@ deps = [ "//base", - "//components/system_cpu:system_cpu", + "//components/system_cpu", "//mojo/public/cpp/bindings", "//services/device/public/cpp:device_features", ]
diff --git a/services/device/generic_sensor/BUILD.gn b/services/device/generic_sensor/BUILD.gn index f335c58..b3fbdb98 100644 --- a/services/device/generic_sensor/BUILD.gn +++ b/services/device/generic_sensor/BUILD.gn
@@ -57,7 +57,7 @@ "//base", "//device/base/synchronization", "//services/device/public/cpp:device_features", - "//ui/gfx/geometry:geometry", + "//ui/gfx/geometry", ] public_deps = [ "//services/device/public/cpp/generic_sensor" ]
diff --git a/services/device/public/mojom/BUILD.gn b/services/device/public/mojom/BUILD.gn index cb4962db..7ada789 100644 --- a/services/device/public/mojom/BUILD.gn +++ b/services/device/public/mojom/BUILD.gn
@@ -219,7 +219,7 @@ mojom("geoposition") { generate_java = true sources = [ "geoposition.mojom" ] - public_deps = [ "//mojo/public/mojom/base:base" ] + public_deps = [ "//mojo/public/mojom/base" ] if (use_blink) { # The blink variant of the geoposition mojom is depended on by the blink
diff --git a/services/device/serial/BUILD.gn b/services/device/serial/BUILD.gn index 644e539..928f80d 100644 --- a/services/device/serial/BUILD.gn +++ b/services/device/serial/BUILD.gn
@@ -44,12 +44,12 @@ deps = [ "//base", "//components/device_event_log", - "//device/bluetooth:bluetooth", + "//device/bluetooth", "//device/bluetooth/public/cpp", "//mojo/public/cpp/bindings", "//net", "//services/device/public/cpp:device_features", - "//services/device/public/cpp/bluetooth:bluetooth", + "//services/device/public/cpp/bluetooth", ] if (is_linux || is_chromeos) {
diff --git a/services/image_annotation/BUILD.gn b/services/image_annotation/BUILD.gn index 3331cc89..f4c8704 100644 --- a/services/image_annotation/BUILD.gn +++ b/services/image_annotation/BUILD.gn
@@ -51,7 +51,7 @@ ":lib", "//base", "//base/test:test_support", - "//components/manta:manta", + "//components/manta", "//mojo/public/cpp/bindings", "//net", "//services/image_annotation/public/cpp",
diff --git a/services/network/BUILD.gn b/services/network/BUILD.gn index e9b6941..ec50789 100644 --- a/services/network/BUILD.gn +++ b/services/network/BUILD.gn
@@ -420,9 +420,9 @@ "network_sandbox_hook_linux.h", ] deps = [ - "//base:base", + "//base", "//sandbox/linux:sandbox_services", - "//sandbox/policy:policy", + "//sandbox/policy", ] configs += [ "//build/config/compiler:wexit_time_destructors" ] } @@ -708,13 +708,13 @@ "//services/network/public/cpp", "//services/network/public/cpp:buildflags", "//services/network/public/mojom", + "//services/network/trust_tokens", "//services/network/trust_tokens:test_support", - "//services/network/trust_tokens:trust_tokens", ] deps = [ "//base", - "//components/cbor:cbor", + "//components/cbor", "//mojo/public/cpp/bindings", "//net", "//net:test_support",
diff --git a/services/network/public/cpp/BUILD.gn b/services/network/public/cpp/BUILD.gn index 3fcd5fefa..48c3ad6 100644 --- a/services/network/public/cpp/BUILD.gn +++ b/services/network/public/cpp/BUILD.gn
@@ -851,7 +851,7 @@ "//mojo/public/cpp/test_support:test_utils", "//net", "//testing/gtest", - "//testing/perf:perf", + "//testing/perf", "//third_party/google_benchmark", ] }
diff --git a/services/on_device_model/android/BUILD.gn b/services/on_device_model/android/BUILD.gn index b6122450..942c4c0 100644 --- a/services/on_device_model/android/BUILD.gn +++ b/services/on_device_model/android/BUILD.gn
@@ -52,6 +52,7 @@ deps = [ "//base:base_java", "//base:service_loader_java", + "//services/on_device_model/public/mojom:mojom_java", "//third_party/androidx:androidx_annotation_annotation_java", "//third_party/jni_zero:jni_zero_java", ] @@ -66,6 +67,7 @@ "//base:base_java", "//base:base_java_test_support", "//base:service_loader_java", + "//services/on_device_model/public/mojom:mojom_java", "//third_party/jni_zero:jni_zero_java", "//third_party/junit", ]
diff --git a/services/on_device_model/android/backend_impl_android_unittest.cc b/services/on_device_model/android/backend_impl_android_unittest.cc index 08faced..ddde3ec9 100644 --- a/services/on_device_model/android/backend_impl_android_unittest.cc +++ b/services/on_device_model/android/backend_impl_android_unittest.cc
@@ -35,6 +35,13 @@ model_ = std::move(model_result.value()); } + mojom::SessionParamsPtr MakeSessionParams(int top_k, float temperature) { + auto params = mojom::SessionParams::New(); + params->top_k = top_k; + params->temperature = temperature; + return params; + } + mojom::AppendOptionsPtr MakeInput(std::vector<ml::InputPiece> input) { auto options = mojom::AppendOptions::New(); options->input = mojom::Input::New(std::move(input)); @@ -50,8 +57,9 @@ }; TEST_F(BackendImplAndroidTest, GenerateWithDefaultFactory) { - std::unique_ptr<BackendSession> session = - model_->CreateSession(/*adaptation=*/nullptr, /*params=*/nullptr); + std::unique_ptr<BackendSession> session = model_->CreateSession( + /*adaptation=*/nullptr, + MakeSessionParams(/*top_k=*/3, /*temperature=*/1.0f)); TestResponseHolder response_holder; session->Generate(mojom::GenerateOptions::New(), response_holder.BindRemote(), @@ -64,8 +72,11 @@ Java_OnDeviceModelBridgeNativeUnitTestHelper_setMockAiCoreSessionFactory( env_, java_helper_); - std::unique_ptr<BackendSession> session = - model_->CreateSession(/*adaptation=*/nullptr, /*params=*/nullptr); + std::unique_ptr<BackendSession> session = model_->CreateSession( + /*adaptation=*/nullptr, + MakeSessionParams(/*top_k=*/3, /*temperature=*/1.0f)); + Java_OnDeviceModelBridgeNativeUnitTestHelper_verifySessionParams( + env_, java_helper_, /*topK=*/3, /*temperature=*/1.0f); { std::vector<ml::InputPiece> pieces; @@ -104,8 +115,9 @@ Java_OnDeviceModelBridgeNativeUnitTestHelper_setMockAiCoreSessionFactory( env_, java_helper_); - std::unique_ptr<BackendSession> session = - model_->CreateSession(/*adaptation=*/nullptr, /*params=*/nullptr); + std::unique_ptr<BackendSession> session = model_->CreateSession( + /*adaptation=*/nullptr, + MakeSessionParams(/*top_k=*/3, /*temperature=*/1.0f)); { std::vector<ml::InputPiece> pieces;
diff --git a/services/on_device_model/android/backend_model_impl_android.cc b/services/on_device_model/android/backend_model_impl_android.cc index 41ed65c..8661e72 100644 --- a/services/on_device_model/android/backend_model_impl_android.cc +++ b/services/on_device_model/android/backend_model_impl_android.cc
@@ -18,7 +18,7 @@ std::unique_ptr<BackendSession> BackendModelImplAndroid::CreateSession( const ScopedAdaptation* adaptation, on_device_model::mojom::SessionParamsPtr params) { - return std::make_unique<BackendSessionImplAndroid>(); + return std::make_unique<BackendSessionImplAndroid>(std::move(params)); } std::unique_ptr<BackendModel::ScopedAdaptation>
diff --git a/services/on_device_model/android/backend_session_impl_android.cc b/services/on_device_model/android/backend_session_impl_android.cc index 9488807..4d5b925 100644 --- a/services/on_device_model/android/backend_session_impl_android.cc +++ b/services/on_device_model/android/backend_session_impl_android.cc
@@ -58,8 +58,9 @@ } // namespace -BackendSessionImplAndroid::BackendSessionImplAndroid() - : java_session_(OnDeviceModelBridge::CreateSession()) {} +BackendSessionImplAndroid::BackendSessionImplAndroid( + on_device_model::mojom::SessionParamsPtr params) + : java_session_(OnDeviceModelBridge::CreateSession(std::move(params))) {} BackendSessionImplAndroid::~BackendSessionImplAndroid() = default;
diff --git a/services/on_device_model/android/backend_session_impl_android.h b/services/on_device_model/android/backend_session_impl_android.h index b4e2bf3..16523acbf 100644 --- a/services/on_device_model/android/backend_session_impl_android.h +++ b/services/on_device_model/android/backend_session_impl_android.h
@@ -17,7 +17,8 @@ // lifetime will be created when this object is created. class BackendSessionImplAndroid : public BackendSession { public: - BackendSessionImplAndroid(); + explicit BackendSessionImplAndroid( + on_device_model::mojom::SessionParamsPtr params); ~BackendSessionImplAndroid() override; // BackendSession:
diff --git a/services/on_device_model/android/java/src/org/chromium/on_device_model/AiCoreSessionFactory.java b/services/on_device_model/android/java/src/org/chromium/on_device_model/AiCoreSessionFactory.java index 71de8b3..29ac3b3 100644 --- a/services/on_device_model/android/java/src/org/chromium/on_device_model/AiCoreSessionFactory.java +++ b/services/on_device_model/android/java/src/org/chromium/on_device_model/AiCoreSessionFactory.java
@@ -5,6 +5,7 @@ package org.chromium.on_device_model; import org.chromium.build.annotations.NullMarked; +import org.chromium.on_device_model.mojom.SessionParams; /** * A factory to create AiCoreSession. This is null when the AiCore API is not available. Downstream @@ -12,5 +13,5 @@ */ @NullMarked public interface AiCoreSessionFactory { - AiCoreSession createSession(); + AiCoreSession createSession(SessionParams params); }
diff --git a/services/on_device_model/android/java/src/org/chromium/on_device_model/OnDeviceModelBridge.java b/services/on_device_model/android/java/src/org/chromium/on_device_model/OnDeviceModelBridge.java index 0afa6bc..a599d889 100644 --- a/services/on_device_model/android/java/src/org/chromium/on_device_model/OnDeviceModelBridge.java +++ b/services/on_device_model/android/java/src/org/chromium/on_device_model/OnDeviceModelBridge.java
@@ -9,6 +9,7 @@ import org.chromium.base.ServiceLoaderUtil; import org.chromium.build.annotations.NullMarked; +import org.chromium.on_device_model.mojom.SessionParams; /** * A central bridge to connect between the native and java code for on-device model. Responsible @@ -22,14 +23,19 @@ /** * Creates a new AiCoreSession. * + * @param topK The top K value for sampling. + * @param temperature The temperature value for sampling. * @return The AiCoreSession instance. */ @CalledByNative - private static AiCoreSession createSession() { + private static AiCoreSession createSession(int topK, float temperature) { + SessionParams params = new SessionParams(); + params.topK = topK; + params.temperature = temperature; AiCoreSessionFactory factory = ServiceLoaderUtil.maybeCreate(AiCoreSessionFactory.class); if (factory == null) { return new AiCoreSessionUpstreamImpl(); } - return factory.createSession(); + return factory.createSession(params); } }
diff --git a/services/on_device_model/android/native_java_unittests/src/org/chromium/on_device_model/OnDeviceModelBridgeNativeUnitTestHelper.java b/services/on_device_model/android/native_java_unittests/src/org/chromium/on_device_model/OnDeviceModelBridgeNativeUnitTestHelper.java index 43ec436..3385290 100644 --- a/services/on_device_model/android/native_java_unittests/src/org/chromium/on_device_model/OnDeviceModelBridgeNativeUnitTestHelper.java +++ b/services/on_device_model/android/native_java_unittests/src/org/chromium/on_device_model/OnDeviceModelBridgeNativeUnitTestHelper.java
@@ -3,9 +3,12 @@ // found in the LICENSE file. package org.chromium.on_device_model; +import static org.junit.Assert.assertEquals; + import org.jni_zero.CalledByNative; import org.chromium.base.ServiceLoaderUtil; +import org.chromium.on_device_model.mojom.SessionParams; /** * Helper class to verify the JNI bridge. Invoked by native unit tests: @@ -17,6 +20,12 @@ * back as the response. */ public static class MockAiCoreSession implements AiCoreSession { + private final SessionParams mParams; + + public MockAiCoreSession(SessionParams params) { + mParams = params; + } + @Override public void generate(long nativeBackendSession, InputPiece[] inputPieces) { StringBuilder sb = new StringBuilder(); @@ -49,12 +58,11 @@ public static class MockAiCoreSessionFactory implements AiCoreSessionFactory { MockAiCoreSession mSession; - public MockAiCoreSessionFactory() { - mSession = new MockAiCoreSession(); - } + public MockAiCoreSessionFactory() {} @Override - public AiCoreSession createSession() { + public AiCoreSession createSession(SessionParams params) { + mSession = new MockAiCoreSession(params); return mSession; } } @@ -69,6 +77,13 @@ } @CalledByNative + public void verifySessionParams(int topK, float temperature) { + SessionParams params = mMockAiCoreSessionFactory.mSession.mParams; + assertEquals(topK, params.topK); + assertEquals(temperature, params.temperature, 0.01f); + } + + @CalledByNative public static OnDeviceModelBridgeNativeUnitTestHelper create() { return new OnDeviceModelBridgeNativeUnitTestHelper(); }
diff --git a/services/on_device_model/android/on_device_model_bridge.cc b/services/on_device_model/android/on_device_model_bridge.cc index 7bb9687..bd05c60 100644 --- a/services/on_device_model/android/on_device_model_bridge.cc +++ b/services/on_device_model/android/on_device_model_bridge.cc
@@ -13,10 +13,15 @@ namespace on_device_model { // static -base::android::ScopedJavaLocalRef<jobject> -OnDeviceModelBridge::CreateSession() { +base::android::ScopedJavaLocalRef<jobject> OnDeviceModelBridge::CreateSession( + on_device_model::mojom::SessionParamsPtr params) { + CHECK(params) << "SessionParams is required to create a session."; JNIEnv* env = base::android::AttachCurrentThread(); - return Java_OnDeviceModelBridge_createSession(env); + // There isn't a generic mojo utility for converting c++ mojo struct to java, + // so disassemble the struct here and reassemble it in java. + // Only passing the parameters that are supported on Android. + return Java_OnDeviceModelBridge_createSession(env, params->top_k, + params->temperature); } } // namespace on_device_model
diff --git a/services/on_device_model/android/on_device_model_bridge.h b/services/on_device_model/android/on_device_model_bridge.h index 897d2be..169fc59 100644 --- a/services/on_device_model/android/on_device_model_bridge.h +++ b/services/on_device_model/android/on_device_model_bridge.h
@@ -6,6 +6,7 @@ #define SERVICES_ON_DEVICE_MODEL_ANDROID_ON_DEVICE_MODEL_BRIDGE_H_ #include "base/android/scoped_java_ref.h" +#include "services/on_device_model/public/mojom/on_device_model.mojom.h" namespace on_device_model { @@ -15,7 +16,8 @@ public: // Creates a new AiCoreSession instance. Caller is responsible for // creating a global ref if it needs to be stored. - static base::android::ScopedJavaLocalRef<jobject> CreateSession(); + static base::android::ScopedJavaLocalRef<jobject> CreateSession( + on_device_model::mojom::SessionParamsPtr params); }; } // namespace on_device_model
diff --git a/services/passage_embeddings/BUILD.gn b/services/passage_embeddings/BUILD.gn index 478c34770..7128e22e 100644 --- a/services/passage_embeddings/BUILD.gn +++ b/services/passage_embeddings/BUILD.gn
@@ -23,7 +23,7 @@ "passage_embeddings_op_resolver.h", ] public_deps += [ - "//third_party/sentencepiece:sentencepiece", + "//third_party/sentencepiece", "//third_party/sentencepiece:sentencepiece_proto", "//third_party/tflite", "//third_party/tflite:tflite_public_headers",
diff --git a/services/preferences/tracked/BUILD.gn b/services/preferences/tracked/BUILD.gn index 7188263..69661ce8 100644 --- a/services/preferences/tracked/BUILD.gn +++ b/services/preferences/tracked/BUILD.gn
@@ -96,7 +96,7 @@ "//components/prefs:test_support", "//components/safe_browsing/core/common:features", "//components/sync_preferences:test_support", - "//crypto:crypto", + "//crypto", "//services/preferences/public/cpp/tracked:test_support", "//testing/gtest", ]
diff --git a/services/resource_coordinator/BUILD.gn b/services/resource_coordinator/BUILD.gn index e413fb0..740327e3 100644 --- a/services/resource_coordinator/BUILD.gn +++ b/services/resource_coordinator/BUILD.gn
@@ -62,7 +62,7 @@ "//components/ukm:test_support", "//mojo/public/cpp/bindings", "//services/resource_coordinator/public/cpp:resource_coordinator_cpp", - "//services/resource_coordinator/public/cpp/memory_instrumentation:memory_instrumentation", + "//services/resource_coordinator/public/cpp/memory_instrumentation", "//services/tracing:test_utils", "//testing/gmock", "//testing/gtest",
diff --git a/services/screen_ai/BUILD.gn b/services/screen_ai/BUILD.gn index 53e854a..5235382b5 100644 --- a/services/screen_ai/BUILD.gn +++ b/services/screen_ai/BUILD.gn
@@ -37,10 +37,10 @@ "//services/screen_ai/proto", "//services/screen_ai/public/cpp:metrics", "//services/screen_ai/public/cpp:utilities", + "//services/screen_ai/public/mojom", "//services/screen_ai/public/mojom:factory", - "//services/screen_ai/public/mojom:mojom", "//skia", - "//ui/accessibility:accessibility", + "//ui/accessibility", ] if (is_linux) {
diff --git a/services/tracing/BUILD.gn b/services/tracing/BUILD.gn index 89056bfad..faae7e9 100644 --- a/services/tracing/BUILD.gn +++ b/services/tracing/BUILD.gn
@@ -34,7 +34,7 @@ "//build:blink_buildflags", "//mojo/public/cpp/bindings", "//services/tracing/public/cpp", - "//services/tracing/public/mojom:mojom", + "//services/tracing/public/mojom", "//third_party/perfetto:libperfetto", "//third_party/perfetto/include/perfetto/ext/trace_processor:export_json", "//third_party/perfetto/include/perfetto/trace_processor:basic_types", @@ -108,10 +108,10 @@ "//mojo/public/cpp/bindings", "//services/tracing/public/cpp:buildflags", "//services/tracing/public/cpp/background_tracing:unit_tests", - "//services/tracing/public/mojom:mojom", + "//services/tracing/public/mojom", "//testing/gmock", "//testing/gtest", - "//third_party/perfetto/include/perfetto/protozero:protozero", + "//third_party/perfetto/include/perfetto/protozero", "//third_party/perfetto/protos/perfetto/common:lite", "//third_party/perfetto/protos/perfetto/trace:lite", "//third_party/perfetto/protos/perfetto/trace/chrome:lite",
diff --git a/services/tracing/public/cpp/BUILD.gn b/services/tracing/public/cpp/BUILD.gn index 2a7bcfa..7cd998a 100644 --- a/services/tracing/public/cpp/BUILD.gn +++ b/services/tracing/public/cpp/BUILD.gn
@@ -134,9 +134,9 @@ deps += [ ":buildflags", "//build:chromecast_buildflags", - "//components/system_cpu:system_cpu", + "//components/system_cpu", "//third_party/perfetto/protos/perfetto/trace/chrome:minimal_complete_lite", - "//third_party/snappy:snappy", + "//third_party/snappy", ] if (is_win) { @@ -149,7 +149,7 @@ # Add the SystemProducer implementations. if (is_posix || is_fuchsia) { - deps += [ "//third_party/perfetto/include/perfetto/ext/ipc:ipc" ] + deps += [ "//third_party/perfetto/include/perfetto/ext/ipc" ] if (is_fuchsia) { sources += [
diff --git a/services/tracing/public/cpp/background_tracing/BUILD.gn b/services/tracing/public/cpp/background_tracing/BUILD.gn index 950d8a0..ca0bcffd 100644 --- a/services/tracing/public/cpp/background_tracing/BUILD.gn +++ b/services/tracing/public/cpp/background_tracing/BUILD.gn
@@ -18,7 +18,7 @@ public_deps = [ "//services/tracing/public/mojom" ] deps = [ "//base", - "//services/tracing/public/cpp:cpp", + "//services/tracing/public/cpp", ] }
diff --git a/services/video_capture/BUILD.gn b/services/video_capture/BUILD.gn index 1fe0ec3..635b91e 100644 --- a/services/video_capture/BUILD.gn +++ b/services/video_capture/BUILD.gn
@@ -41,15 +41,15 @@ public_deps = [ "//base", "//media", - "//media/capture:capture", + "//media/capture", "//media/capture/mojom:image_capture", - "//media/mojo/common:common", + "//media/mojo/common", "//mojo/public/cpp/system", "//services/video_capture/public/cpp", "//services/video_capture/public/mojom", "//services/video_capture/public/mojom:constants", "//services/video_effects/buildflags", - "//services/video_effects/public/mojom:mojom", + "//services/video_effects/public/mojom", "//services/viz/public/cpp/gpu", ] @@ -75,7 +75,7 @@ deps += [ "//base", - "//services/video_capture/public/cpp:cpp", + "//services/video_capture/public/cpp", "//services/video_capture/public/mojom", ]
diff --git a/services/video_capture/public/cpp/BUILD.gn b/services/video_capture/public/cpp/BUILD.gn index cabb135..c3550de 100644 --- a/services/video_capture/public/cpp/BUILD.gn +++ b/services/video_capture/public/cpp/BUILD.gn
@@ -19,11 +19,11 @@ public_deps = [ "//base", "//media", - "//media/capture:capture", + "//media/capture", "//services/video_capture/public/mojom", ] - deps = [ "//mojo/public/cpp/bindings:bindings" ] + deps = [ "//mojo/public/cpp/bindings" ] } source_set("mocks") {
diff --git a/services/video_capture/public/mojom/BUILD.gn b/services/video_capture/public/mojom/BUILD.gn index 9b72ac7..3c5617d4 100644 --- a/services/video_capture/public/mojom/BUILD.gn +++ b/services/video_capture/public/mojom/BUILD.gn
@@ -22,7 +22,7 @@ "//media/capture/mojom:image_capture", "//media/capture/mojom:video_capture", "//media/mojo/mojom", - "//services/video_effects/public/mojom:mojom", + "//services/video_effects/public/mojom", "//ui/gfx/geometry/mojom", ]
diff --git a/services/video_effects/BUILD.gn b/services/video_effects/BUILD.gn index 85fce00..b5512c5 100644 --- a/services/video_effects/BUILD.gn +++ b/services/video_effects/BUILD.gn
@@ -25,13 +25,13 @@ ] visibility = [ - "//content/utility:utility", + "//content/utility", "//services/video_effects:tests", ] public_deps = [ - "//services/video_effects/public/mojom:mojom", - "//services/viz/public/cpp/gpu:gpu", + "//services/video_effects/public/mojom", + "//services/viz/public/cpp/gpu", ] deps = [
diff --git a/services/video_effects/public/cpp/BUILD.gn b/services/video_effects/public/cpp/BUILD.gn index 6ad67a58..fdbdeb6 100644 --- a/services/video_effects/public/cpp/BUILD.gn +++ b/services/video_effects/public/cpp/BUILD.gn
@@ -11,7 +11,7 @@ "video_effects_service_host.h", ] - public_deps = [ "//services/video_effects/public/mojom:mojom" ] + public_deps = [ "//services/video_effects/public/mojom" ] deps = [ "//content/public/browser",
diff --git a/services/video_effects/public/mojom/BUILD.gn b/services/video_effects/public/mojom/BUILD.gn index 3781190..852f20d2 100644 --- a/services/video_effects/public/mojom/BUILD.gn +++ b/services/video_effects/public/mojom/BUILD.gn
@@ -14,7 +14,7 @@ deps = [ "//media/capture/mojom:video_capture", "//media/capture/mojom:video_effects_manager", - "//services/viz/public/mojom:mojom", + "//services/viz/public/mojom", ] enabled_features = []
diff --git a/services/viz/privileged/mojom/BUILD.gn b/services/viz/privileged/mojom/BUILD.gn index 40f7103..df9b6c2 100644 --- a/services/viz/privileged/mojom/BUILD.gn +++ b/services/viz/privileged/mojom/BUILD.gn
@@ -35,7 +35,7 @@ deps = [ "//base/test:test_support", - "//components/viz/common:common", + "//components/viz/common", "//media/capture/mojom:video_capture", "//services/service_manager/public/cpp", "//services/viz/privileged/mojom/compositing",
diff --git a/services/viz/privileged/mojom/gl/BUILD.gn b/services/viz/privileged/mojom/gl/BUILD.gn index e237eb8..5b0052f2 100644 --- a/services/viz/privileged/mojom/gl/BUILD.gn +++ b/services/viz/privileged/mojom/gl/BUILD.gn
@@ -21,7 +21,7 @@ "//gpu/ipc/common:surface_handle", "//media/mojo/mojom", "//services/webnn/public/mojom", - "//third_party/blink/public/mojom/tokens:tokens", + "//third_party/blink/public/mojom/tokens", "//ui/gfx/geometry/mojom", "//ui/gfx/mojom", "//ui/gl/mojom",
diff --git a/services/viz/public/cpp/compositing/BUILD.gn b/services/viz/public/cpp/compositing/BUILD.gn index b230e060..12dd47d9 100644 --- a/services/viz/public/cpp/compositing/BUILD.gn +++ b/services/viz/public/cpp/compositing/BUILD.gn
@@ -9,7 +9,7 @@ deps = [ "//base/test:test_support", - "//components/viz/common:common", + "//components/viz/common", "//components/viz/test:test_support", "//gpu/ipc/common", "//ipc",
diff --git a/services/viz/public/cpp/hit_test/BUILD.gn b/services/viz/public/cpp/hit_test/BUILD.gn index 2f1b5722..a4daf22 100644 --- a/services/viz/public/cpp/hit_test/BUILD.gn +++ b/services/viz/public/cpp/hit_test/BUILD.gn
@@ -9,7 +9,7 @@ deps = [ "//base/test:test_support", - "//components/viz/common:common", + "//components/viz/common", "//components/viz/test:test_support", "//mojo/public/cpp/test_support:test_utils", "//services/viz/public/mojom",
diff --git a/services/viz/public/mojom/BUILD.gn b/services/viz/public/mojom/BUILD.gn index 1aac4f1..c305546 100644 --- a/services/viz/public/mojom/BUILD.gn +++ b/services/viz/public/mojom/BUILD.gn
@@ -67,7 +67,7 @@ "//media/mojo/mojom", "//mojo/public/mojom/base", "//skia/public/mojom", - "//third_party/blink/public/mojom/tokens:tokens", + "//third_party/blink/public/mojom/tokens", "//ui/gfx/geometry/mojom", "//ui/gfx/mojom", "//ui/gfx/mojom:hdr_metadata",
diff --git a/testing/perf/cbb_ref_info/chrome/dev/Android.json b/testing/perf/cbb_ref_info/chrome/dev/Android.json index 9f22263..7a84e56 100644 --- a/testing/perf/cbb_ref_info/chrome/dev/Android.json +++ b/testing/perf/cbb_ref_info/chrome/dev/Android.json
@@ -2,5 +2,5 @@ "browser": "Chrome", "channel": "Dev", "platform": "Android", - "version": "140.0.7259.0" + "version": "140.0.7313.0" } \ No newline at end of file
diff --git a/testing/perf/cbb_ref_info/chrome/dev/Windows.json b/testing/perf/cbb_ref_info/chrome/dev/Windows.json index 0da757b..e10800dd 100644 --- a/testing/perf/cbb_ref_info/chrome/dev/Windows.json +++ b/testing/perf/cbb_ref_info/chrome/dev/Windows.json
@@ -2,5 +2,5 @@ "browser": "Chrome", "channel": "Dev", "platform": "Windows", - "version": "140.0.7259.2" + "version": "140.0.7312.0" } \ No newline at end of file
diff --git a/testing/perf/cbb_ref_info/chrome/dev/macOS.json b/testing/perf/cbb_ref_info/chrome/dev/macOS.json index 6fc0d92..37e0993 100644 --- a/testing/perf/cbb_ref_info/chrome/dev/macOS.json +++ b/testing/perf/cbb_ref_info/chrome/dev/macOS.json
@@ -2,5 +2,5 @@ "browser": "Chrome", "channel": "Dev", "platform": "Mac", - "version": "140.0.7259.2" + "version": "140.0.7312.0" } \ No newline at end of file
diff --git a/testing/perf/cbb_ref_info/chrome/stable/Android.json b/testing/perf/cbb_ref_info/chrome/stable/Android.json index 9bea93d6..19d6e69 100644 --- a/testing/perf/cbb_ref_info/chrome/stable/Android.json +++ b/testing/perf/cbb_ref_info/chrome/stable/Android.json
@@ -2,5 +2,5 @@ "browser": "Chrome", "channel": "Stable", "platform": "Android", - "version": "138.0.7204.63" + "version": "138.0.7204.168" } \ No newline at end of file
diff --git a/testing/perf/cbb_ref_info/chrome/stable/Windows.json b/testing/perf/cbb_ref_info/chrome/stable/Windows.json index 6c5dfc3d..ec2105b9 100644 --- a/testing/perf/cbb_ref_info/chrome/stable/Windows.json +++ b/testing/perf/cbb_ref_info/chrome/stable/Windows.json
@@ -2,5 +2,5 @@ "browser": "Chrome", "channel": "Stable", "platform": "Windows", - "version": "138.0.7204.50" + "version": "138.0.7204.169" } \ No newline at end of file
diff --git a/testing/perf/cbb_ref_info/chrome/stable/macOS.json b/testing/perf/cbb_ref_info/chrome/stable/macOS.json index 58f280b..1d34ea2d 100644 --- a/testing/perf/cbb_ref_info/chrome/stable/macOS.json +++ b/testing/perf/cbb_ref_info/chrome/stable/macOS.json
@@ -2,5 +2,5 @@ "browser": "Chrome", "channel": "Stable", "platform": "Mac", - "version": "138.0.7204.50" + "version": "138.0.7204.169" } \ No newline at end of file
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json index 18ee3fd..a039f361 100644 --- a/testing/variations/fieldtrial_testing_config.json +++ b/testing/variations/fieldtrial_testing_config.json
@@ -10463,7 +10463,8 @@ "ForceOffTextAutosizing": [ { "platforms": [ - "android" + "android", + "android_webview" ], "experiments": [ { @@ -14735,24 +14736,6 @@ ] } ], - "MemoryCacheIntelligentPruning": [ - { - "platforms": [ - "chromeos", - "linux", - "mac", - "windows" - ], - "experiments": [ - { - "name": "Enabled", - "enable_features": [ - "MemoryCacheIntelligentPruning" - ] - } - ] - } - ], "MemoryCacheStrongRefPruningTuneUp": [ { "platforms": [ @@ -16580,6 +16563,7 @@ "offer_notification": "true", "price_insights": "true", "product_specifications": "true", + "pwa_install": "true", "translate": "true", "zoom": "true" }, @@ -24117,7 +24101,6 @@ "tab_search_toolbar_button": "true" }, "enable_features": [ - "IPH_TabSearchToolbarButton", "TabstripComboButton" ] }
diff --git a/third_party/BUILD.gn b/third_party/BUILD.gn index 372514fe..5a35bc4 100644 --- a/third_party/BUILD.gn +++ b/third_party/BUILD.gn
@@ -31,7 +31,7 @@ public_deps = [ "//third_party/libjpeg_turbo:libjpeg" ] public_configs = [ ":libjpeg_turbo_config" ] } else { - public_deps = [ "//third_party/libjpeg:libjpeg" ] + public_deps = [ "//third_party/libjpeg" ] } }
diff --git a/third_party/abseil-cpp/CMake/AbseilDll.cmake b/third_party/abseil-cpp/CMake/AbseilDll.cmake index f70d6f0..be5aaa9c6 100644 --- a/third_party/abseil-cpp/CMake/AbseilDll.cmake +++ b/third_party/abseil-cpp/CMake/AbseilDll.cmake
@@ -214,10 +214,14 @@ "numeric/int128.h" "numeric/internal/bits.h" "numeric/internal/representation.h" + "profiling/hashtable.cc" + "profiling/hashtable.h" "profiling/internal/exponential_biased.cc" "profiling/internal/exponential_biased.h" "profiling/internal/periodic_sampler.cc" "profiling/internal/periodic_sampler.h" + "profiling/internal/profile_builder.cc" + "profiling/internal/profile_builder.h" "profiling/internal/sample_recorder.h" "random/bernoulli_distribution.h" "random/beta_distribution.h"
diff --git a/third_party/abseil-cpp/README.chromium b/third_party/abseil-cpp/README.chromium index 8e74febb..09ea45e 100644 --- a/third_party/abseil-cpp/README.chromium +++ b/third_party/abseil-cpp/README.chromium
@@ -4,7 +4,7 @@ License: Apache-2.0 License File: LICENSE Version: N/A -Revision: af00a9295f47b4d3441184d5701505b7edec4a4a +Revision: 64a9eafe33d1ac88ea66d620aeae0da513b515e3 Update Mechanism: Manual Security Critical: yes Shipped: yes
diff --git a/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc b/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc index c0fce87..965476a 100644 --- a/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +++ b/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc
@@ -94,8 +94,9 @@ // The inliner makes hardcoded skip_count difficult (especially when combined // with LTO). We use the ability to exclude stacks by regex when encoding // instead. - depth = absl::GetStackTrace(stack, HashtablezInfo::kMaxStackDepth, - /* skip_count= */ 0); + depth = static_cast<unsigned>( + absl::GetStackTrace(stack, HashtablezInfo::kMaxStackDepth, + /* skip_count= */ 0)); inline_element_size = inline_element_size_value; key_size = key_size_value; value_size = value_size_value;
diff --git a/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h b/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h index 305dc85..55ce7ed 100644 --- a/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h +++ b/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h
@@ -97,7 +97,7 @@ // the lock. static constexpr int kMaxStackDepth = 64; absl::Time create_time; - int32_t depth; + uint32_t depth; // The SOO capacity for this table in elements (not bytes). Note that sampled // tables are never SOO because we need to store the infoz handle on the heap. // Tables that would be SOO if not sampled should have: soo_capacity > 0 &&
diff --git a/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc b/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc index bd03ac1..9f4ceff 100644 --- a/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc +++ b/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc
@@ -45,15 +45,9 @@ // uninitialized because reading this memory is a bug. ABSL_DLL ctrl_t kDefaultIterControl; -// We need one full byte followed by a sentinel byte for iterator::operator++ to -// work. We have a full group after kSentinel to be safe (in case operator++ is -// changed to read a full group). -ABSL_CONST_INIT ABSL_DLL const ctrl_t kSooControl[17] = { - ZeroCtrlT(), ctrl_t::kSentinel, ZeroCtrlT(), ctrl_t::kEmpty, - ctrl_t::kEmpty, ctrl_t::kEmpty, ctrl_t::kEmpty, ctrl_t::kEmpty, - ctrl_t::kEmpty, ctrl_t::kEmpty, ctrl_t::kEmpty, ctrl_t::kEmpty, - ctrl_t::kEmpty, ctrl_t::kEmpty, ctrl_t::kEmpty, ctrl_t::kEmpty, - ctrl_t::kEmpty}; +// We need one full byte followed by a sentinel byte for iterator::operator++. +ABSL_CONST_INIT ABSL_DLL const ctrl_t kSooControl[2] = {ZeroCtrlT(), + ctrl_t::kSentinel}; namespace { @@ -521,16 +515,23 @@ } // namespace -void EraseMetaOnly(CommonFields& c, const ctrl_t* ctrl, size_t slot_size) { +void EraseMetaOnlySmall(CommonFields& c, bool soo_enabled, size_t slot_size) { + ABSL_SWISSTABLE_ASSERT(c.is_small()); + if (soo_enabled) { + c.set_empty_soo(); + return; + } + c.decrement_size(); + c.infoz().RecordErase(); + SanitizerPoisonMemoryRegion(c.slot_array(), slot_size); +} + +void EraseMetaOnlyLarge(CommonFields& c, const ctrl_t* ctrl, size_t slot_size) { + ABSL_SWISSTABLE_ASSERT(!c.is_small()); ABSL_SWISSTABLE_ASSERT(IsFull(*ctrl) && "erasing a dangling iterator"); c.decrement_size(); c.infoz().RecordErase(); - if (c.is_small()) { - SanitizerPoisonMemoryRegion(c.slot_array(), slot_size); - return; - } - size_t index = static_cast<size_t>(ctrl - c.control()); if (WasNeverFull(c, index)) {
diff --git a/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h b/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h index 1c8e654..5fe3367 100644 --- a/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h +++ b/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h
@@ -368,17 +368,6 @@ std::declval<Ts>()...))>, Policy, Hash, Eq, Ts...> : std::true_type {}; -// TODO(alkis): Switch to std::is_nothrow_swappable when gcc/clang supports it. -template <class T> -constexpr bool IsNoThrowSwappable(std::true_type = {} /* is_swappable */) { - using std::swap; - return noexcept(swap(std::declval<T&>(), std::declval<T&>())); -} -template <class T> -constexpr bool IsNoThrowSwappable(std::false_type /* is_swappable */) { - return false; -} - ABSL_DLL extern ctrl_t kDefaultIterControl; // We use these sentinel capacity values in debug mode to indicate different @@ -400,7 +389,7 @@ // For use in SOO iterators. // TODO(b/289225379): we could potentially get rid of this by adding an is_soo // bit in iterators. This would add branches but reduce cache misses. -ABSL_DLL extern const ctrl_t kSooControl[17]; +ABSL_DLL extern const ctrl_t kSooControl[2]; // Returns a pointer to a full byte followed by a sentinel byte. inline ctrl_t* SooControl() { @@ -1794,8 +1783,9 @@ void ClearBackingArray(CommonFields& c, const PolicyFunctions& policy, void* alloc, bool reuse, bool soo_enabled); -// Type-erased version of raw_hash_set::erase_meta_only. -void EraseMetaOnly(CommonFields& c, const ctrl_t* ctrl, size_t slot_size); +// Type-erased versions of raw_hash_set::erase_meta_only_{small,large}. +void EraseMetaOnlySmall(CommonFields& c, bool soo_enabled, size_t slot_size); +void EraseMetaOnlyLarge(CommonFields& c, const ctrl_t* ctrl, size_t slot_size); // For trivially relocatable types we use memcpy directly. This allows us to // share the same function body for raw_hash_set instantiations that have the @@ -2062,20 +2052,8 @@ // `slot_` until they reach one. void skip_empty_or_deleted() { while (IsEmptyOrDeleted(*ctrl_)) { - auto mask = GroupFullEmptyOrDeleted{ctrl_}.MaskFullOrSentinel(); - // Generally it is possible to compute `shift` branchless. - // This branch is useful to: - // 1. Avoid checking `IsEmptyOrDeleted` after the shift for the most - // common dense table case. - // 2. Avoid the cost of `LowestBitSet` for extremely sparse tables. - if (ABSL_PREDICT_TRUE(mask)) { - auto shift = mask.LowestBitSet(); - ctrl_ += shift; - slot_ += shift; - return; - } - ctrl_ += Group::kWidth; - slot_ += Group::kWidth; + ++ctrl_; + ++slot_; } } @@ -2333,7 +2311,7 @@ } raw_hash_set& operator=(raw_hash_set&& that) noexcept( - absl::allocator_traits<allocator_type>::is_always_equal::value && + AllocTraits::is_always_equal::value && std::is_nothrow_move_assignable<hasher>::value && std::is_nothrow_move_assignable<key_equal>::value) { // TODO(sbenza): We should only use the operations from the noexcept clause @@ -2703,7 +2681,7 @@ if (first == last) return last.inner_; if (is_small()) { destroy(single_slot()); - erase_meta_only(single_iterator()); + erase_meta_only_small(); return end(); } if (first == begin() && last == end()) { @@ -2738,12 +2716,12 @@ if (src.is_small()) { if (src.empty()) return; if (insert_slot(src.single_slot())) - src.erase_meta_only(src.single_iterator()); + src.erase_meta_only_small(); return; } for (auto it = src.begin(), e = src.end(); it != e;) { auto next = std::next(it); - if (insert_slot(it.slot())) src.erase_meta_only(it); + if (insert_slot(it.slot())) src.erase_meta_only_large(it); it = next; } } @@ -2770,9 +2748,9 @@ } void swap(raw_hash_set& that) noexcept( - IsNoThrowSwappable<hasher>() && IsNoThrowSwappable<key_equal>() && - IsNoThrowSwappable<allocator_type>( - typename AllocTraits::propagate_on_container_swap{})) { + AllocTraits::is_always_equal::value && + std::is_nothrow_swappable<hasher>::value && + std::is_nothrow_swappable<key_equal>::value) { AssertNotDebugCapacity(); that.AssertNotDebugCapacity(); using std::swap; @@ -3085,11 +3063,17 @@ // This merely updates the pertinent control byte. This can be used in // conjunction with Policy::transfer to move the object to another place. void erase_meta_only(const_iterator it) { - if (is_soo()) { - common().set_empty_soo(); + if (is_small()) { + erase_meta_only_small(); return; } - EraseMetaOnly(common(), it.control(), sizeof(slot_type)); + erase_meta_only_large(it); + } + void erase_meta_only_small() { + EraseMetaOnlySmall(common(), SooEnabled(), sizeof(slot_type)); + } + void erase_meta_only_large(const_iterator it) { + EraseMetaOnlyLarge(common(), it.control(), sizeof(slot_type)); } template <class K> @@ -3636,7 +3620,7 @@ return 0; } c->destroy(it.slot()); - c->erase_meta_only(it); + c->erase_meta_only_small(); return 1; } [[maybe_unused]] const size_t original_size_for_assert = c->size(); @@ -3648,7 +3632,7 @@ auto* slot = static_cast<SlotType*>(slot_void); if (pred(Set::PolicyTraits::element(slot))) { c->destroy(slot); - EraseMetaOnly(c->common(), ctrl, sizeof(*slot)); + EraseMetaOnlyLarge(c->common(), ctrl, sizeof(*slot)); ++num_deleted; } });
diff --git a/third_party/abseil-cpp/absl/container/internal/raw_hash_set_allocator_test.cc b/third_party/abseil-cpp/absl/container/internal/raw_hash_set_allocator_test.cc index 2e6f8f5..b268d9e3 100644 --- a/third_party/abseil-cpp/absl/container/internal/raw_hash_set_allocator_test.cc +++ b/third_party/abseil-cpp/absl/container/internal/raw_hash_set_allocator_test.cc
@@ -436,13 +436,14 @@ } TEST_F(PropagateOnAll, Swap) { - auto it = t1.insert(0).first; + t1.insert(0); Table u(0, a2); u.swap(t1); EXPECT_EQ(a1, u.get_allocator()); EXPECT_EQ(a2, t1.get_allocator()); EXPECT_EQ(1, a1.num_allocs()); EXPECT_EQ(0, a2.num_allocs()); + auto it = u.begin(); EXPECT_EQ(0, it->num_moves()); EXPECT_EQ(0, it->num_copies()); }
diff --git a/third_party/abseil-cpp/absl/container/internal/raw_hash_set_test.cc b/third_party/abseil-cpp/absl/container/internal/raw_hash_set_test.cc index e1dafff..044e5b5 100644 --- a/third_party/abseil-cpp/absl/container/internal/raw_hash_set_test.cc +++ b/third_party/abseil-cpp/absl/container/internal/raw_hash_set_test.cc
@@ -2247,12 +2247,10 @@ } TEST(Table, NoThrowSwappable) { - ASSERT_TRUE( - container_internal::IsNoThrowSwappable<absl::Hash<absl::string_view>>()); - ASSERT_TRUE(container_internal::IsNoThrowSwappable< - std::equal_to<absl::string_view>>()); - ASSERT_TRUE(container_internal::IsNoThrowSwappable<std::allocator<int>>()); - EXPECT_TRUE(container_internal::IsNoThrowSwappable<StringTable>()); + ASSERT_TRUE(std::is_nothrow_swappable<absl::Hash<absl::string_view>>()); + ASSERT_TRUE(std::is_nothrow_swappable<std::equal_to<absl::string_view>>()); + ASSERT_TRUE(std::is_nothrow_swappable<std::allocator<int>>()); + EXPECT_TRUE(std::is_nothrow_swappable<StringTable>()); } TEST(Table, HeterogeneousLookup) {
diff --git a/third_party/abseil-cpp/absl/crc/internal/crc_x86_arm_combined.cc b/third_party/abseil-cpp/absl/crc/internal/crc_x86_arm_combined.cc index 3194bec46..ee9778d 100644 --- a/third_party/abseil-cpp/absl/crc/internal/crc_x86_arm_combined.cc +++ b/third_party/abseil-cpp/absl/crc/internal/crc_x86_arm_combined.cc
@@ -137,6 +137,13 @@ // Compute a magic constant, so that multiplying by it is the same as // extending crc by length zeros. +#if defined(NDEBUG) && ABSL_HAVE_CPP_ATTRIBUTE(clang::no_sanitize) +// The array accesses in this are safe: +// length > 3, so countr_zero(length >> 2) < 62, and length & (length - 1) +// cannot introduce bits >= 62. +// The compiler cannot prove this, so manually disable bounds checking. +[[clang::no_sanitize("array-bounds")]] +#endif uint32_t CRC32AcceleratedX86ARMCombined::ComputeZeroConstant( size_t length) const { // Lowest 2 bits are handled separately in ExtendByZeroes
diff --git a/third_party/abseil-cpp/absl/debugging/stacktrace.cc b/third_party/abseil-cpp/absl/debugging/stacktrace.cc index f71e80c..30d032a4 100644 --- a/third_party/abseil-cpp/absl/debugging/stacktrace.cc +++ b/third_party/abseil-cpp/absl/debugging/stacktrace.cc
@@ -124,6 +124,19 @@ internal_stacktrace::GetStackFrames(void** result, uintptr_t* frames, int* sizes, int max_depth, int skip_count) { if (internal_stacktrace::ShouldFixUpStack()) { + if constexpr (kHaveAlloca) { + // Some implementations of FixUpStack may need to be passed frame + // information from Unwind, even if the caller doesn't need that + // information. We allocate the necessary buffers for such implementations + // here. + const size_t nmax = static_cast<size_t>(max_depth); + if (frames == nullptr) { + frames = static_cast<uintptr_t*>(alloca(nmax * sizeof(*frames))); + } + if (sizes == nullptr) { + sizes = static_cast<int*>(alloca(nmax * sizeof(*sizes))); + } + } size_t depth = static_cast<size_t>(Unwind<true, true>( result, frames, sizes, max_depth, skip_count, nullptr, nullptr)); internal_stacktrace::FixUpStack(result, frames, sizes, @@ -141,6 +154,19 @@ int skip_count, const void* uc, int* min_dropped_frames) { if (internal_stacktrace::ShouldFixUpStack()) { + if constexpr (kHaveAlloca) { + // Some implementations of FixUpStack may need to be passed frame + // information from Unwind, even if the caller doesn't need that + // information. We allocate the necessary buffers for such implementations + // here. + const size_t nmax = static_cast<size_t>(max_depth); + if (frames == nullptr) { + frames = static_cast<uintptr_t*>(alloca(nmax * sizeof(*frames))); + } + if (sizes == nullptr) { + sizes = static_cast<int*>(alloca(nmax * sizeof(*sizes))); + } + } size_t depth = static_cast<size_t>(Unwind<true, true>( result, frames, sizes, max_depth, skip_count, uc, min_dropped_frames)); internal_stacktrace::FixUpStack(result, frames, sizes,
diff --git a/third_party/abseil-cpp/absl/profiling/BUILD.bazel b/third_party/abseil-cpp/absl/profiling/BUILD.bazel index f9a2a72..5afdb96 100644 --- a/third_party/abseil-cpp/absl/profiling/BUILD.bazel +++ b/third_party/abseil-cpp/absl/profiling/BUILD.bazel
@@ -144,3 +144,44 @@ "@google_benchmark//:benchmark_main", ], ) + +cc_library( + name = "profile_builder", + srcs = ["internal/profile_builder.cc"], + hdrs = ["internal/profile_builder.h"], + copts = ABSL_DEFAULT_COPTS, + linkopts = ABSL_DEFAULT_LINKOPTS, + visibility = [ + "//absl:__subpackages__", + ], + deps = [ + "//absl/base", + "//absl/base:config", + "//absl/base:raw_logging_internal", + "//absl/container:btree", + "//absl/container:flat_hash_map", + "//absl/strings", + "//absl/types:span", + ], +) + +cc_library( + name = "hashtable", + srcs = ["hashtable.cc"], + hdrs = ["hashtable.h"], + copts = ABSL_DEFAULT_COPTS, + linkopts = ABSL_DEFAULT_LINKOPTS, + visibility = [ + "//absl:__subpackages__", + ], + deps = [ + ":profile_builder", + "//absl/base:config", + "//absl/container:hashtablez_sampler", + "//absl/status:statusor", + "//absl/strings", + "//absl/strings:string_view", + "//absl/time", + "//absl/types:span", + ], +)
diff --git a/third_party/abseil-cpp/absl/profiling/BUILD.gn b/third_party/abseil-cpp/absl/profiling/BUILD.gn index 16b37de5..23764a27 100644 --- a/third_party/abseil-cpp/absl/profiling/BUILD.gn +++ b/third_party/abseil-cpp/absl/profiling/BUILD.gn
@@ -63,3 +63,32 @@ "//third_party/abseil-cpp/absl/base:core_headers", ] } + +absl_source_set("profile_builder") { + sources = [ "internal/profile_builder.cc" ] + public = [ "internal/profile_builder.h" ] + deps = [ + "//third_party/abseil-cpp/absl/base", + "//third_party/abseil-cpp/absl/base:config", + "//third_party/abseil-cpp/absl/base:raw_logging_internal", + "//third_party/abseil-cpp/absl/container:btree", + "//third_party/abseil-cpp/absl/container:flat_hash_map", + "//third_party/abseil-cpp/absl/strings", + "//third_party/abseil-cpp/absl/types:span", + ] +} + +absl_source_set("hashtable") { + sources = [ "hashtable.cc" ] + public = [ "hashtable.h" ] + deps = [ + ":profile_builder", + "//third_party/abseil-cpp/absl/base:config", + "//third_party/abseil-cpp/absl/container:hashtablez_sampler", + "//third_party/abseil-cpp/absl/status:statusor", + "//third_party/abseil-cpp/absl/strings", + "//third_party/abseil-cpp/absl/strings:string_view", + "//third_party/abseil-cpp/absl/time", + "//third_party/abseil-cpp/absl/types:span", + ] +}
diff --git a/third_party/abseil-cpp/absl/profiling/CMakeLists.txt b/third_party/abseil-cpp/absl/profiling/CMakeLists.txt index 84b8b3b8..4807f0dde 100644 --- a/third_party/abseil-cpp/absl/profiling/CMakeLists.txt +++ b/third_party/abseil-cpp/absl/profiling/CMakeLists.txt
@@ -92,3 +92,40 @@ GTest::gmock_main ) +# Internal-only target, do not depend on directly +absl_cc_library( + NAME + profile_builder + HDRS + "internal/profile_builder.h" + SRCS + "internal/profile_builder.cc" + COPTS + ${ABSL_DEFAULT_COPTS} + DEPS + absl::config + absl::core_headers + absl::raw_logging_internal + absl::flat_hash_map + absl::btree + absl::strings + absl::span +) + +absl_cc_library( + NAME + hashtable_profiler + HDRS + "hashtable.h" + SRCS + "hashtable.cc" + COPTS + ${ABSL_DEFAULT_COPTS} + DEPS + absl::profile_builder + absl::config + absl::core_headers + absl::strings + absl::span + absl::hashtablez_sampler +)
diff --git a/third_party/abseil-cpp/absl/profiling/hashtable.cc b/third_party/abseil-cpp/absl/profiling/hashtable.cc new file mode 100644 index 0000000..bfec0d5 --- /dev/null +++ b/third_party/abseil-cpp/absl/profiling/hashtable.cc
@@ -0,0 +1,124 @@ +// Copyright 2025 The Abseil Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may +// obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "absl/profiling/hashtable.h" + +#include <atomic> +#include <cstddef> +#include <cstdint> +#include <string> +#include <utility> +#include <vector> + +#include "absl/base/config.h" +#include "absl/container/internal/hashtablez_sampler.h" +#include "absl/profiling/internal/profile_builder.h" +#include "absl/status/statusor.h" +#include "absl/strings/str_cat.h" +#include "absl/strings/string_view.h" +#include "absl/time/clock.h" +#include "absl/time/time.h" +#include "absl/types/span.h" + +namespace absl { +ABSL_NAMESPACE_BEGIN + +StatusOr<std::string> MarshalHashtableProfile() { + return debugging_internal::MarshalHashtableProfile( + container_internal::GlobalHashtablezSampler(), Now()); +} + +namespace debugging_internal { + +StatusOr<std::string> MarshalHashtableProfile( + container_internal::HashtablezSampler& sampler, Time now) { + static constexpr absl::string_view kDropFrames = + "(::)?absl::container_internal::.*|" + "(::)?absl::(flat|node)_hash_(map|set).*"; + + ProfileBuilder builder; + StringId drop_frames_id = builder.InternString(kDropFrames); + builder.set_drop_frames_id(drop_frames_id); + builder.AddSampleType(builder.InternString("capacity"), + builder.InternString("count")); + builder.set_default_sample_type_id(builder.InternString("capacity")); + + const auto capacity_id = builder.InternString("capacity"); + const auto size_id = builder.InternString("size"); + const auto num_erases_id = builder.InternString("num_erases"); + const auto num_rehashes_id = builder.InternString("num_rehashes"); + const auto max_probe_length_id = builder.InternString("max_probe_length"); + const auto total_probe_length_id = builder.InternString("total_probe_length"); + const auto stuck_bits_id = builder.InternString("stuck_bits"); + const auto inline_element_size_id = + builder.InternString("inline_element_size"); + const auto key_size_id = builder.InternString("key_size"); + const auto value_size_id = builder.InternString("value_size"); + const auto soo_capacity_id = builder.InternString("soo_capacity"); + const auto checksum_id = builder.InternString("checksum"); + const auto table_age_id = builder.InternString("table_age"); + const auto max_reserve_id = builder.InternString("max_reserve"); + + size_t dropped = + sampler.Iterate([&](const container_internal::HashtablezInfo& info) { + const size_t capacity = info.capacity.load(std::memory_order_relaxed); + std::vector<std::pair<StringId, int64_t>> labels; + + auto add_label = [&](StringId tag, uint64_t value) { + if (value == 0) { + return; + } + labels.emplace_back(tag, static_cast<int64_t>(value)); + }; + + add_label(capacity_id, capacity); + add_label(size_id, info.size.load(std::memory_order_relaxed)); + add_label(num_erases_id, + info.num_erases.load(std::memory_order_relaxed)); + add_label(num_rehashes_id, + info.num_rehashes.load(std::memory_order_relaxed)); + add_label(max_probe_length_id, + info.max_probe_length.load(std::memory_order_relaxed)); + add_label(total_probe_length_id, + info.total_probe_length.load(std::memory_order_relaxed)); + add_label(stuck_bits_id, + (info.hashes_bitwise_and.load(std::memory_order_relaxed) | + ~info.hashes_bitwise_or.load(std::memory_order_relaxed))); + add_label(inline_element_size_id, info.inline_element_size); + add_label(key_size_id, info.key_size); + add_label(value_size_id, info.value_size); + add_label(soo_capacity_id, info.soo_capacity); + add_label(checksum_id, + info.hashes_bitwise_xor.load(std::memory_order_relaxed)); + add_label( + table_age_id, + static_cast<uint64_t>(ToInt64Microseconds(now - info.create_time))); + add_label(max_reserve_id, + info.max_reserve.load(std::memory_order_relaxed)); + builder.AddSample(static_cast<int64_t>(capacity) * info.weight, + MakeSpan(info.stack, info.depth), labels); + }); + + // TODO(b/262310142): Make this more structured data. + StringId comment_id = + builder.InternString(StrCat("dropped_samples: ", dropped)); + builder.set_comment_id(comment_id); + builder.AddCurrentMappings(); + return std::move(builder).Emit(); +} + +} // namespace debugging_internal +ABSL_NAMESPACE_END +} // namespace absl
diff --git a/third_party/abseil-cpp/absl/profiling/hashtable.h b/third_party/abseil-cpp/absl/profiling/hashtable.h new file mode 100644 index 0000000..9e490dcd --- /dev/null +++ b/third_party/abseil-cpp/absl/profiling/hashtable.h
@@ -0,0 +1,40 @@ +// Copyright 2025 The Abseil Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef ABSL_PROFILING_HASHTABLE_H_ +#define ABSL_PROFILING_HASHTABLE_H_ + +#include <cstdint> +#include <string> + +#include "absl/container/internal/hashtablez_sampler.h" +#include "absl/status/statusor.h" +#include "absl/strings/string_view.h" +#include "absl/time/time.h" + +namespace absl { +ABSL_NAMESPACE_BEGIN + +absl::StatusOr<std::string> MarshalHashtableProfile(); + +namespace debugging_internal { + +absl::StatusOr<std::string> MarshalHashtableProfile( + container_internal::HashtablezSampler& sampler, absl::Time now); + +} // namespace debugging_internal +ABSL_NAMESPACE_END +} // namespace absl + +#endif // ABSL_PROFILING_HASHTABLE_H_
diff --git a/third_party/abseil-cpp/absl/profiling/internal/profile_builder.cc b/third_party/abseil-cpp/absl/profiling/internal/profile_builder.cc new file mode 100644 index 0000000..f0bb40b7 --- /dev/null +++ b/third_party/abseil-cpp/absl/profiling/internal/profile_builder.cc
@@ -0,0 +1,462 @@ +// Copyright 2025 The Abseil Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may +// obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "absl/profiling/internal/profile_builder.h" + +#ifdef __linux__ +#include <elf.h> +#include <link.h> +#endif // __linux__ + +#include <cassert> +#include <cstdint> +#include <cstring> +#include <string> +#include <utility> +#include <vector> + +#include "absl/base/casts.h" +#include "absl/base/config.h" +#include "absl/base/internal/raw_logging.h" +#include "absl/strings/escaping.h" +#include "absl/strings/str_cat.h" +#include "absl/types/span.h" + +namespace absl { +ABSL_NAMESPACE_BEGIN +namespace debugging_internal { + +namespace { + +// This file contains a simplified implementation of the pprof profile builder, +// which avoids a dependency on protobuf. +// +// The canonical profile proto definition is at +// https://github.com/google/pprof/blob/master/proto/profile.proto +// +// Wire-format encoding is a simple sequence of (tag, value) pairs. The tag +// is a varint-encoded integer, where the low 3 bits are the wire type, and the +// high bits are the field number. +// +// For the fields we care about, we'll be using the following wire types: +// +// Wire Type 0: Varint-encoded integer. +// Wire Type 2: Length-delimited. Used for strings and sub-messages. +enum class WireType { + kVarint = 0, + kLengthDelimited = 2, +}; + +#ifdef __linux__ +// Returns the Phdr of the first segment of the given type. +const ElfW(Phdr) * GetFirstSegment(const dl_phdr_info* const info, + const ElfW(Word) segment_type) { + for (int i = 0; i < info->dlpi_phnum; ++i) { + if (info->dlpi_phdr[i].p_type == segment_type) { + return &info->dlpi_phdr[i]; + } + } + return nullptr; +} + +// Return DT_SONAME for the given image. If there is no PT_DYNAMIC or if +// PT_DYNAMIC does not contain DT_SONAME, return nullptr. +static const char* GetSoName(const dl_phdr_info* const info) { + const ElfW(Phdr)* const pt_dynamic = GetFirstSegment(info, PT_DYNAMIC); + if (pt_dynamic == nullptr) { + return nullptr; + } + const ElfW(Dyn)* dyn = + reinterpret_cast<ElfW(Dyn)*>(info->dlpi_addr + pt_dynamic->p_vaddr); + const ElfW(Dyn)* dt_strtab = nullptr; + const ElfW(Dyn)* dt_strsz = nullptr; + const ElfW(Dyn)* dt_soname = nullptr; + for (; dyn->d_tag != DT_NULL; ++dyn) { + if (dyn->d_tag == DT_SONAME) { + dt_soname = dyn; + } else if (dyn->d_tag == DT_STRTAB) { + dt_strtab = dyn; + } else if (dyn->d_tag == DT_STRSZ) { + dt_strsz = dyn; + } + } + if (dt_soname == nullptr) { + return nullptr; + } + ABSL_RAW_CHECK(dt_strtab != nullptr, "Unexpected nullptr"); + ABSL_RAW_CHECK(dt_strsz != nullptr, "Unexpected nullptr"); + const char* const strtab = reinterpret_cast<char*>( + info->dlpi_addr + static_cast<ElfW(Word)>(dt_strtab->d_un.d_val)); + ABSL_RAW_CHECK(dt_soname->d_un.d_val < dt_strsz->d_un.d_val, + "Unexpected order"); + return strtab + dt_soname->d_un.d_val; +} + +// Helper function to get the build ID of a shared object. +std::string GetBuildId(const dl_phdr_info* const info) { + std::string result; + + // pt_note contains entries (of type ElfW(Nhdr)) starting at + // info->dlpi_addr + pt_note->p_vaddr + // with length + // pt_note->p_memsz + // + // The length of each entry is given by + // Align(sizeof(ElfW(Nhdr)) + nhdr->n_namesz) + Align(nhdr->n_descsz) + for (int i = 0; i < info->dlpi_phnum; ++i) { + const ElfW(Phdr)* pt_note = &info->dlpi_phdr[i]; + if (pt_note->p_type != PT_NOTE) continue; + + const char* note = + reinterpret_cast<char*>(info->dlpi_addr + pt_note->p_vaddr); + const char* const last = note + pt_note->p_filesz; + const ElfW(Xword) align = pt_note->p_align; + while (note < last) { + const ElfW(Nhdr)* const nhdr = reinterpret_cast<const ElfW(Nhdr)*>(note); + if (note + sizeof(*nhdr) > last) { + // Corrupt PT_NOTE + break; + } + + // Both the start and end of the descriptor are aligned by sh_addralign + // (= p_align). + const ElfW(Xword) desc_start = + (sizeof(*nhdr) + nhdr->n_namesz + align - 1) & -align; + const ElfW(Xword) size = + desc_start + ((nhdr->n_descsz + align - 1) & -align); + + // Beware of wrap-around. + if (nhdr->n_namesz >= static_cast<ElfW(Word)>(-align) || + nhdr->n_descsz >= static_cast<ElfW(Word)>(-align) || + desc_start < sizeof(*nhdr) || size < desc_start || + size > static_cast<ElfW(Xword)>(last - note)) { + // Corrupt PT_NOTE + break; + } + + if (nhdr->n_type == NT_GNU_BUILD_ID) { + const char* const note_name = note + sizeof(*nhdr); + // n_namesz is the length of note_name. + if (nhdr->n_namesz == 4 && memcmp(note_name, "GNU\0", 4) == 0) { + if (!result.empty()) { + // Repeated build-ids. Ignore them. + return ""; + } + result = absl::BytesToHexString( + absl::string_view(note + desc_start, nhdr->n_descsz)); + } + } + note += size; + } + } + + return result; +} +#endif // __linux__ + +// A varint-encoded integer. +struct Varint { + explicit Varint(uint64_t v) : value(v) {} + explicit Varint(StringId v) : value(static_cast<uint64_t>(v)) {} + explicit Varint(LocationId v) : value(static_cast<uint64_t>(v)) {} + explicit Varint(MappingId v) : value(static_cast<uint64_t>(v)) {} + + uint64_t value; + + template <typename Sink> + friend void AbslStringify(Sink& sink, const Varint& v) { + char buf[10]; + char* p = buf; + uint64_t u = v.value; + while (u >= 0x80) { + *p++ = static_cast<char>((u & 0x7f) | 0x80); + u >>= 7; + } + *p++ = static_cast<char>(u); + sink.Append(absl::string_view(buf, static_cast<size_t>(p - buf))); + } +}; + +struct Tag { + int field_number; + WireType wire_type; + + template <typename Sink> + friend void AbslStringify(Sink& sink, const Tag& t) { + absl::Format(&sink, "%v", + Varint((static_cast<uint64_t>(t.field_number) << 3) | + static_cast<uint64_t>(t.wire_type))); + } +}; + +struct LengthDelimited { + int field_number; + absl::string_view value; + + template <typename Sink> + friend void AbslStringify(Sink& sink, const LengthDelimited& ld) { + absl::Format(&sink, "%v%v%v", + Tag{ld.field_number, WireType::kLengthDelimited}, + Varint(ld.value.size()), ld.value); + } +}; + +struct VarintField { + int field_number; + Varint value; + + template <typename Sink> + friend void AbslStringify(Sink& sink, const VarintField& vf) { + absl::Format(&sink, "%v%v", Tag{vf.field_number, WireType::kVarint}, + vf.value); + } +}; + +} // namespace + +StringId ProfileBuilder::InternString(absl::string_view str) { + if (str.empty()) return StringId(0); + return string_table_.emplace(str, StringId(string_table_.size())) + .first->second; +} + +LocationId ProfileBuilder::InternLocation(const void* address) { + return location_table_ + .emplace(absl::bit_cast<uintptr_t>(address), + LocationId(location_table_.size() + 1)) + .first->second; +} + +void ProfileBuilder::AddSample( + int64_t value, absl::Span<const void* const> stack, + absl::Span<const std::pair<StringId, int64_t>> labels) { + std::string sample_proto; + absl::StrAppend( + &sample_proto, + VarintField{SampleProto::kValue, Varint(static_cast<uint64_t>(value))}); + + for (const void* addr : stack) { + // Profile addresses are raw stack unwind addresses, so they should be + // adjusted by -1 to land inside the call instruction (although potentially + // misaligned). + absl::StrAppend( + &sample_proto, + VarintField{SampleProto::kLocationId, + Varint(InternLocation(absl::bit_cast<const void*>( + absl::bit_cast<uintptr_t>(addr) - 1)))}); + } + + for (const auto& label : labels) { + std::string label_proto = + absl::StrCat(VarintField{LabelProto::kKey, Varint(label.first)}, + VarintField{LabelProto::kNum, + Varint(static_cast<uint64_t>(label.second))}); + absl::StrAppend(&sample_proto, + LengthDelimited{SampleProto::kLabel, label_proto}); + } + samples_.push_back(std::move(sample_proto)); +} + +void ProfileBuilder::AddSampleType(StringId type, StringId unit) { + std::string sample_type_proto = + absl::StrCat(VarintField{ValueTypeProto::kType, Varint(type)}, + VarintField{ValueTypeProto::kUnit, Varint(unit)}); + sample_types_.push_back(std::move(sample_type_proto)); +} + +MappingId ProfileBuilder::AddMapping(uintptr_t memory_start, + uintptr_t memory_limit, + uintptr_t file_offset, + absl::string_view filename, + absl::string_view build_id) { + size_t index = mappings_.size() + 1; + auto [it, inserted] = mapping_table_.emplace(memory_start, index); + if (!inserted) { + return static_cast<MappingId>(it->second); + } + + Mapping m; + m.start = memory_start; + m.limit = memory_limit; + m.offset = file_offset; + m.filename = std::string(filename); + m.build_id = std::string(build_id); + + mappings_.push_back(std::move(m)); + return static_cast<MappingId>(index); +} + +std::string ProfileBuilder::Emit() && { + std::string profile_proto; + for (const auto& sample_type : sample_types_) { + absl::StrAppend(&profile_proto, + LengthDelimited{ProfileProto::kSampleType, sample_type}); + } + for (const auto& sample : samples_) { + absl::StrAppend(&profile_proto, + LengthDelimited{ProfileProto::kSample, sample}); + } + + // Build mapping table. + for (size_t i = 0, n = mappings_.size(); i < n; ++i) { + const auto& mapping = mappings_[i]; + std::string mapping_proto = absl::StrCat( + VarintField{MappingProto::kId, Varint(static_cast<uint64_t>(i + 1))}, + VarintField{MappingProto::kMemoryStart, Varint(mapping.start)}, + VarintField{MappingProto::kMemoryLimit, Varint(mapping.limit)}, + VarintField{MappingProto::kFileOffset, Varint(mapping.offset)}, + VarintField{MappingProto::kFilename, + Varint(InternString(mapping.filename))}, + VarintField{MappingProto::kBuildId, + Varint(InternString(mapping.build_id))}); + + absl::StrAppend(&profile_proto, + LengthDelimited{ProfileProto::kMapping, mapping_proto}); + } + + // Build location table. + for (const auto& [address, id] : location_table_) { + std::string location = + absl::StrCat(VarintField{LocationProto::kId, Varint(id)}, + VarintField{LocationProto::kAddress, Varint(address)}); + + if (!mappings_.empty()) { + // Find the mapping ID. + auto it = mapping_table_.upper_bound(address); + if (it != mapping_table_.begin()) { + --it; + } + + // If *it contains address, add mapping to location. + const size_t mapping_index = it->second; + const Mapping& mapping = mappings_[mapping_index - 1]; + + if (it->first <= address && address < mapping.limit) { + absl::StrAppend( + &location, + VarintField{LocationProto::kMappingId, + Varint(static_cast<uint64_t>(mapping_index))}); + } + } + + absl::StrAppend(&profile_proto, + LengthDelimited{ProfileProto::kLocation, location}); + } + + std::string string_table_proto; + std::vector<absl::string_view> sorted_strings(string_table_.size()); + for (const auto& p : string_table_) { + sorted_strings[static_cast<size_t>(p.second)] = p.first; + } + for (const auto& s : sorted_strings) { + absl::StrAppend(&string_table_proto, + LengthDelimited{ProfileProto::kStringTable, s}); + } + absl::StrAppend(&profile_proto, VarintField{ProfileProto::kDropFrames, + Varint(drop_frames_id_)}); + absl::StrAppend(&profile_proto, + VarintField{ProfileProto::kComment, Varint(comment_id_)}); + absl::StrAppend(&profile_proto, VarintField{ProfileProto::kDefaultSampleType, + Varint(default_sample_type_id_)}); + return absl::StrCat(string_table_proto, profile_proto); +} + +void ProfileBuilder::set_drop_frames_id(StringId drop_frames_id) { + drop_frames_id_ = drop_frames_id; +} + +void ProfileBuilder::set_comment_id(StringId comment_id) { + comment_id_ = comment_id; +} + +void ProfileBuilder::set_default_sample_type_id( + StringId default_sample_type_id) { + default_sample_type_id_ = default_sample_type_id; +} + +void ProfileBuilder::AddCurrentMappings() { +#ifdef __linux__ + dl_iterate_phdr( + +[](dl_phdr_info* info, size_t, void* data) { + auto& builder = *reinterpret_cast<ProfileBuilder*>(data); + + // Skip dummy entry introduced since glibc 2.18. + if (info->dlpi_phdr == nullptr && info->dlpi_phnum == 0) { + return 0; + } + + const bool is_main_executable = builder.mappings_.empty(); + + // Evaluate all the loadable segments. + for (int i = 0; i < info->dlpi_phnum; ++i) { + if (info->dlpi_phdr[i].p_type != PT_LOAD) { + continue; + } + const ElfW(Phdr)* pt_load = &info->dlpi_phdr[i]; + + ABSL_RAW_CHECK(pt_load != nullptr, "Unexpected nullptr"); + + // Extract data. + const size_t memory_start = info->dlpi_addr + pt_load->p_vaddr; + const size_t memory_limit = memory_start + pt_load->p_memsz; + const size_t file_offset = pt_load->p_offset; + + // Storage for path to executable as dlpi_name isn't populated for the + // main executable. +1 to allow for the null terminator that readlink + // does not add. + char self_filename[PATH_MAX + 1]; + const char* filename = info->dlpi_name; + if (filename == nullptr || filename[0] == '\0') { + // This is either the main executable or the VDSO. The main + // executable is always the first entry processed by callbacks. + if (is_main_executable) { + // This is the main executable. + ssize_t ret = readlink("/proc/self/exe", self_filename, + sizeof(self_filename) - 1); + if (ret >= 0 && + static_cast<size_t>(ret) < sizeof(self_filename)) { + self_filename[ret] = '\0'; + filename = self_filename; + } + } else { + // This is the VDSO. + filename = GetSoName(info); + } + } + + char resolved_path[PATH_MAX]; + absl::string_view resolved_filename; + if (realpath(filename, resolved_path)) { + resolved_filename = resolved_path; + } else { + resolved_filename = filename; + } + + const std::string build_id = GetBuildId(info); + + // Add to profile. + builder.AddMapping(memory_start, memory_limit, file_offset, + resolved_filename, build_id); + } + // Keep going. + return 0; + }, + this); +#endif // __linux__ +} + +} // namespace debugging_internal +ABSL_NAMESPACE_END +} // namespace absl
diff --git a/third_party/abseil-cpp/absl/profiling/internal/profile_builder.h b/third_party/abseil-cpp/absl/profiling/internal/profile_builder.h new file mode 100644 index 0000000..45075e60 --- /dev/null +++ b/third_party/abseil-cpp/absl/profiling/internal/profile_builder.h
@@ -0,0 +1,138 @@ +// Copyright 2025 The Abseil Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may +// obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef ABSL_PROFILING_INTERNAL_PROFILE_BUILDER_H_ +#define ABSL_PROFILING_INTERNAL_PROFILE_BUILDER_H_ + +#include <cstddef> +#include <cstdint> +#include <string> +#include <vector> + +#include "absl/container/btree_map.h" +#include "absl/container/flat_hash_map.h" +#include "absl/strings/string_view.h" +#include "absl/types/span.h" + +namespace absl { +ABSL_NAMESPACE_BEGIN +namespace debugging_internal { + +// Field numbers for perftools.profiles.Profile. +// https://github.com/google/pprof/blob/master/proto/profile.proto +struct ProfileProto { + static constexpr int kSampleType = 1; + static constexpr int kSample = 2; + static constexpr int kMapping = 3; + static constexpr int kLocation = 4; + static constexpr int kStringTable = 6; + static constexpr int kDropFrames = 7; + static constexpr int kComment = 13; + static constexpr int kDefaultSampleType = 14; +}; + +struct ValueTypeProto { + static constexpr int kType = 1; + static constexpr int kUnit = 2; +}; + +struct SampleProto { + static constexpr int kLocationId = 1; + static constexpr int kValue = 2; + static constexpr int kLabel = 3; +}; + +struct LabelProto { + static constexpr int kKey = 1; + static constexpr int kStr = 2; + static constexpr int kNum = 3; + static constexpr int kNumUnit = 4; +}; + +struct MappingProto { + static constexpr int kId = 1; + static constexpr int kMemoryStart = 2; + static constexpr int kMemoryLimit = 3; + static constexpr int kFileOffset = 4; + static constexpr int kFilename = 5; + static constexpr int kBuildId = 6; +}; + +struct LocationProto { + static constexpr int kId = 1; + static constexpr int kMappingId = 2; + static constexpr int kAddress = 3; +}; + +enum class StringId : size_t {}; +enum class LocationId : size_t {}; +enum class MappingId : size_t {}; + +// A helper class to build a profile protocol buffer. +class ProfileBuilder { + public: + struct Mapping { + uint64_t start; + uint64_t limit; + uint64_t offset; + std::string filename; + std::string build_id; + }; + + StringId InternString(absl::string_view str); + + LocationId InternLocation(const void* address); + + void AddSample(int64_t value, absl::Span<const void* const> stack, + absl::Span<const std::pair<StringId, int64_t>> labels); + + void AddSampleType(StringId type, StringId unit); + + // Adds the current process mappings to the profile. + void AddCurrentMappings(); + + // Adds a single mapping to the profile and to lookup cache and returns the + // resulting ID. + MappingId AddMapping(uintptr_t memory_start, uintptr_t memory_limit, + uintptr_t file_offset, absl::string_view filename, + absl::string_view build_id); + + std::string Emit() &&; + + void set_drop_frames_id(StringId drop_frames_id); + void set_comment_id(StringId comment_id); + void set_default_sample_type_id(StringId default_sample_type_id); + + private: + absl::flat_hash_map<std::string, StringId> string_table_{{"", StringId(0)}}; + absl::flat_hash_map<uintptr_t, LocationId> location_table_; + // mapping_table_ stores the start address of each mapping in mapping_ + // to its index. + absl::btree_map<uintptr_t, size_t> mapping_table_; + std::vector<Mapping> mappings_; + + std::vector<std::string> sample_types_; + std::vector<std::string> samples_; + + StringId drop_frames_id_{}; + StringId comment_id_{}; + StringId default_sample_type_id_{}; +}; + +} // namespace debugging_internal +ABSL_NAMESPACE_END +} // namespace absl + +#endif // ABSL_PROFILING_INTERNAL_PROFILE_BUILDER_H_
diff --git a/third_party/abseil-cpp/absl/profiling/internal/sample_recorder.h b/third_party/abseil-cpp/absl/profiling/internal/sample_recorder.h index 371f6c4..84843fd 100644 --- a/third_party/abseil-cpp/absl/profiling/internal/sample_recorder.h +++ b/third_party/abseil-cpp/absl/profiling/internal/sample_recorder.h
@@ -75,7 +75,7 @@ // Iterates over all the registered `StackInfo`s. Returning the number of // samples that have been dropped. - int64_t Iterate(const std::function<void(const T& stack)>& f); + size_t Iterate(const std::function<void(const T& stack)>& f); size_t GetMaxSamples() const; void SetMaxSamples(size_t max); @@ -222,7 +222,7 @@ } template <typename T> -int64_t SampleRecorder<T>::Iterate( +size_t SampleRecorder<T>::Iterate( const std::function<void(const T& stack)>& f) { T* s = all_.load(std::memory_order_acquire); while (s != nullptr) {
diff --git a/third_party/abseil-cpp/ci/absl_alternate_options.h b/third_party/abseil-cpp/ci/absl_alternate_options.h index a563859..20bf010 100644 --- a/third_party/abseil-cpp/ci/absl_alternate_options.h +++ b/third_party/abseil-cpp/ci/absl_alternate_options.h
@@ -15,13 +15,12 @@ // Alternate options.h file, used in continuous integration testing to exercise // option settings not used by default. +// SKIP_ABSL_INLINE_NAMESPACE_CHECK + #ifndef ABSL_CI_ABSL_ALTERNATE_OPTIONS_H_ #define ABSL_CI_ABSL_ALTERNATE_OPTIONS_H_ -#define ABSL_OPTION_USE_STD_ANY 0 -#define ABSL_OPTION_USE_STD_OPTIONAL 0 #define ABSL_OPTION_USE_STD_STRING_VIEW 0 -#define ABSL_OPTION_USE_STD_VARIANT 0 #define ABSL_OPTION_USE_STD_ORDERING 0 #define ABSL_OPTION_USE_INLINE_NAMESPACE 1 #define ABSL_OPTION_INLINE_NAMESPACE_NAME ns
diff --git a/third_party/abseil-cpp/symbols_arm64_dbg.def b/third_party/abseil-cpp/symbols_arm64_dbg.def index 7945785d..cdd9fb7 100644 --- a/third_party/abseil-cpp/symbols_arm64_dbg.def +++ b/third_party/abseil-cpp/symbols_arm64_dbg.def
@@ -3082,7 +3082,8 @@ ?EqualsImpl@Cord@absl@@AEBA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_K@Z ?EquivTransitions@TimeZoneInfo@cctz@time_internal@absl@@AEBA_NEE@Z ?Erase@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAPEAUPayload@status_internal@3@PEBU453@0@Z - ?EraseMetaOnly@container_internal@absl@@YAXAEAVCommonFields@12@PEBW4ctrl_t@12@_K@Z + ?EraseMetaOnlyLarge@container_internal@absl@@YAXAEAVCommonFields@12@PEBW4ctrl_t@12@_K@Z + ?EraseMetaOnlySmall@container_internal@absl@@YAXAEAVCommonFields@12@_N_K@Z ?ErasePayload@StatusRep@status_internal@absl@@QEAA?AUEraseResult@123@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z ?ErrnoToStatus@absl@@YA?AVStatus@1@HV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z ?ErrnoToStatusCode@absl@@YA?AW4StatusCode@1@H@Z @@ -3558,7 +3559,6 @@ ?MaskEmpty@GroupAArch64Impl@container_internal@absl@@QEBA@XZ ?MaskEmptyOrDeleted@GroupPortableImpl@container_internal@absl@@QEBA@XZ ?MaskFull@GroupPortableImpl@container_internal@absl@@QEBA@XZ - ?MaskFullOrSentinel@GroupPortableImpl@container_internal@absl@@QEBA@XZ ?MaskNonFull@GroupAArch64Impl@container_internal@absl@@QEBA@XZ ?Match@GroupAArch64Impl@container_internal@absl@@QEBA@E@Z ?MatchesConversions@ParsedFormatBase@str_format_internal@absl@@AEBA_N_NV?$initializer_list@W4FormatConversionCharSet@absl@@@std@@@Z @@ -5287,6 +5287,7 @@ ?set_cordz_mean_interval@cord_internal@absl@@YAXH@Z ?set_data@InlineRep@Cord@absl@@QEAAPEAD_K@Z ?set_data@InlineRep@Cord@absl@@QEAAXPEBD_K@Z + ?set_empty_soo@CommonFields@container_internal@absl@@QEAAXXZ ?set_end@CordRepBtree@cord_internal@absl@@AEAAX_K@Z ?set_from_arg@InputValue@UnboundConversion@str_format_internal@absl@@QEAAXH@Z ?set_full_soo@CommonFields@container_internal@absl@@QEAAXXZ
diff --git a/third_party/abseil-cpp/symbols_arm64_rel.def b/third_party/abseil-cpp/symbols_arm64_rel.def index 3b37358..4f7a2ab 100644 --- a/third_party/abseil-cpp/symbols_arm64_rel.def +++ b/third_party/abseil-cpp/symbols_arm64_rel.def
@@ -331,7 +331,6 @@ ??ACord@absl@@QEBAD_K@Z ??BCord@absl@@QEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ ??Bint128@absl@@QEBANXZ - ??Eiterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QEAAAEAV0123@XZ ??Gdetail@cctz@time_internal@absl@@YA?AV?$civil_time@Uday_tag@detail@cctz@time_internal@absl@@@0123@V40123@_J@Z ??Gdetail@cctz@time_internal@absl@@YA?AV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@0123@V40123@_J@Z ??Gdetail@cctz@time_internal@absl@@YA_JV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@0123@0@Z @@ -585,7 +584,8 @@ ?EqualsImpl@Cord@absl@@AEBA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_K@Z ?EquivTransitions@TimeZoneInfo@cctz@time_internal@absl@@AEBA_NEE@Z ?Erase@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAPEAUPayload@status_internal@3@PEBU453@0@Z - ?EraseMetaOnly@container_internal@absl@@YAXAEAVCommonFields@12@PEBW4ctrl_t@12@_K@Z + ?EraseMetaOnlyLarge@container_internal@absl@@YAXAEAVCommonFields@12@PEBW4ctrl_t@12@_K@Z + ?EraseMetaOnlySmall@container_internal@absl@@YAXAEAVCommonFields@12@_N_K@Z ?ErasePayload@StatusRep@status_internal@absl@@QEAA?AUEraseResult@123@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z ?ErrnoToStatus@absl@@YA?AVStatus@1@HV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z ?ErrnoToStatusCode@absl@@YA?AW4StatusCode@1@H@Z
diff --git a/third_party/abseil-cpp/symbols_x64_dbg.def b/third_party/abseil-cpp/symbols_x64_dbg.def index 8cb1b02..ef69b47 100644 --- a/third_party/abseil-cpp/symbols_x64_dbg.def +++ b/third_party/abseil-cpp/symbols_x64_dbg.def
@@ -3083,7 +3083,8 @@ ?EqualsImpl@Cord@absl@@AEBA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_K@Z ?EquivTransitions@TimeZoneInfo@cctz@time_internal@absl@@AEBA_NEE@Z ?Erase@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAPEAUPayload@status_internal@3@PEBU453@0@Z - ?EraseMetaOnly@container_internal@absl@@YAXAEAVCommonFields@12@PEBW4ctrl_t@12@_K@Z + ?EraseMetaOnlyLarge@container_internal@absl@@YAXAEAVCommonFields@12@PEBW4ctrl_t@12@_K@Z + ?EraseMetaOnlySmall@container_internal@absl@@YAXAEAVCommonFields@12@_N_K@Z ?ErasePayload@StatusRep@status_internal@absl@@QEAA?AUEraseResult@123@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z ?ErrnoToStatus@absl@@YA?AVStatus@1@HV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z ?ErrnoToStatusCode@absl@@YA?AW4StatusCode@1@H@Z @@ -3561,7 +3562,6 @@ ?MaskEmptyOrDeleted@GroupSse2Impl@container_internal@absl@@QEBA?AV?$NonIterableBitMask@G$0BA@$0A@@23@XZ ?MaskFull@GroupPortableImpl@container_internal@absl@@QEBA@XZ ?MaskFull@GroupSse2Impl@container_internal@absl@@QEBA?AV?$BitMask@G$0BA@$0A@$0A@@23@XZ - ?MaskFullOrSentinel@GroupSse2Impl@container_internal@absl@@QEBA?AV?$NonIterableBitMask@G$0BA@$0A@@23@XZ ?MaskNonFull@GroupSse2Impl@container_internal@absl@@QEBA@XZ ?Match@GroupSse2Impl@container_internal@absl@@QEBA?AV?$BitMask@G$0BA@$0A@$0A@@23@E@Z ?MatchesConversions@ParsedFormatBase@str_format_internal@absl@@AEBA_N_NV?$initializer_list@W4FormatConversionCharSet@absl@@@std@@@Z @@ -5291,6 +5291,7 @@ ?set_cordz_mean_interval@cord_internal@absl@@YAXH@Z ?set_data@InlineRep@Cord@absl@@QEAAPEAD_K@Z ?set_data@InlineRep@Cord@absl@@QEAAXPEBD_K@Z + ?set_empty_soo@CommonFields@container_internal@absl@@QEAAXXZ ?set_end@CordRepBtree@cord_internal@absl@@AEAAX_K@Z ?set_from_arg@InputValue@UnboundConversion@str_format_internal@absl@@QEAAXH@Z ?set_full_soo@CommonFields@container_internal@absl@@QEAAXXZ
diff --git a/third_party/abseil-cpp/symbols_x64_rel.def b/third_party/abseil-cpp/symbols_x64_rel.def index b854eea..30d5ce84 100644 --- a/third_party/abseil-cpp/symbols_x64_rel.def +++ b/third_party/abseil-cpp/symbols_x64_rel.def
@@ -332,7 +332,6 @@ ??ACord@absl@@QEBAD_K@Z ??BCord@absl@@QEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ ??Bint128@absl@@QEBANXZ - ??Eiterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QEAAAEAV0123@XZ ??Gdetail@cctz@time_internal@absl@@YA?AV?$civil_time@Uday_tag@detail@cctz@time_internal@absl@@@0123@V40123@_J@Z ??Gdetail@cctz@time_internal@absl@@YA?AV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@0123@V40123@_J@Z ??Gdetail@cctz@time_internal@absl@@YA_JV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@0123@0@Z @@ -584,7 +583,8 @@ ?EqualsImpl@Cord@absl@@AEBA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_K@Z ?EquivTransitions@TimeZoneInfo@cctz@time_internal@absl@@AEBA_NEE@Z ?Erase@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAPEAUPayload@status_internal@3@PEBU453@0@Z - ?EraseMetaOnly@container_internal@absl@@YAXAEAVCommonFields@12@PEBW4ctrl_t@12@_K@Z + ?EraseMetaOnlyLarge@container_internal@absl@@YAXAEAVCommonFields@12@PEBW4ctrl_t@12@_K@Z + ?EraseMetaOnlySmall@container_internal@absl@@YAXAEAVCommonFields@12@_N_K@Z ?ErasePayload@StatusRep@status_internal@absl@@QEAA?AUEraseResult@123@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z ?ErrnoToStatus@absl@@YA?AVStatus@1@HV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z ?ErrnoToStatusCode@absl@@YA?AW4StatusCode@1@H@Z
diff --git a/third_party/abseil-cpp/symbols_x64_rel_asan.def b/third_party/abseil-cpp/symbols_x64_rel_asan.def index f9c2b4b..c98a750 100644 --- a/third_party/abseil-cpp/symbols_x64_rel_asan.def +++ b/third_party/abseil-cpp/symbols_x64_rel_asan.def
@@ -609,7 +609,8 @@ ?EqualsImpl@Cord@absl@@AEBA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_K@Z ?EquivTransitions@TimeZoneInfo@cctz@time_internal@absl@@AEBA_NEE@Z ?Erase@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAPEAUPayload@status_internal@3@PEBU453@0@Z - ?EraseMetaOnly@container_internal@absl@@YAXAEAVCommonFields@12@PEBW4ctrl_t@12@_K@Z + ?EraseMetaOnlyLarge@container_internal@absl@@YAXAEAVCommonFields@12@PEBW4ctrl_t@12@_K@Z + ?EraseMetaOnlySmall@container_internal@absl@@YAXAEAVCommonFields@12@_N_K@Z ?ErasePayload@StatusRep@status_internal@absl@@QEAA?AUEraseResult@123@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z ?ErrnoToStatus@absl@@YA?AVStatus@1@HV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z ?ErrnoToStatusCode@absl@@YA?AW4StatusCode@1@H@Z
diff --git a/third_party/abseil-cpp/symbols_x86_dbg.def b/third_party/abseil-cpp/symbols_x86_dbg.def index 65c4b20..e5178a7 100644 --- a/third_party/abseil-cpp/symbols_x86_dbg.def +++ b/third_party/abseil-cpp/symbols_x86_dbg.def
@@ -3081,7 +3081,8 @@ ?EqualsImpl@Cord@absl@@ABE_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@I@Z ?EquivTransitions@TimeZoneInfo@cctz@time_internal@absl@@ABE_NEE@Z ?Erase@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QAEPAUPayload@status_internal@3@PBU453@0@Z - ?EraseMetaOnly@container_internal@absl@@YAXAAVCommonFields@12@PBW4ctrl_t@12@I@Z + ?EraseMetaOnlyLarge@container_internal@absl@@YAXAAVCommonFields@12@PBW4ctrl_t@12@I@Z + ?EraseMetaOnlySmall@container_internal@absl@@YAXAAVCommonFields@12@_NI@Z ?ErasePayload@StatusRep@status_internal@absl@@QAE?AUEraseResult@123@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z ?ErrnoToStatus@absl@@YA?AVStatus@1@HV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z ?ErrnoToStatusCode@absl@@YA?AW4StatusCode@1@H@Z @@ -3559,7 +3560,6 @@ ?MaskEmptyOrDeleted@GroupSse2Impl@container_internal@absl@@QBE?AV?$NonIterableBitMask@G$0BA@$0A@@23@XZ ?MaskFull@GroupPortableImpl@container_internal@absl@@QBE@XZ ?MaskFull@GroupSse2Impl@container_internal@absl@@QBE?AV?$BitMask@G$0BA@$0A@$0A@@23@XZ - ?MaskFullOrSentinel@GroupSse2Impl@container_internal@absl@@QBE?AV?$NonIterableBitMask@G$0BA@$0A@@23@XZ ?MaskNonFull@GroupSse2Impl@container_internal@absl@@QBE@XZ ?Match@GroupSse2Impl@container_internal@absl@@QBE?AV?$BitMask@G$0BA@$0A@$0A@@23@E@Z ?MatchesConversions@ParsedFormatBase@str_format_internal@absl@@ABE_N_NV?$initializer_list@W4FormatConversionCharSet@absl@@@std@@@Z @@ -5289,6 +5289,7 @@ ?set_cordz_mean_interval@cord_internal@absl@@YAXH@Z ?set_data@InlineRep@Cord@absl@@QAEPADI@Z ?set_data@InlineRep@Cord@absl@@QAEXPBDI@Z + ?set_empty_soo@CommonFields@container_internal@absl@@QAEXXZ ?set_end@CordRepBtree@cord_internal@absl@@AAEXI@Z ?set_from_arg@InputValue@UnboundConversion@str_format_internal@absl@@QAEXH@Z ?set_full_soo@CommonFields@container_internal@absl@@QAEXXZ
diff --git a/third_party/abseil-cpp/symbols_x86_rel.def b/third_party/abseil-cpp/symbols_x86_rel.def index 628d35a..3e829c7 100644 --- a/third_party/abseil-cpp/symbols_x86_rel.def +++ b/third_party/abseil-cpp/symbols_x86_rel.def
@@ -338,7 +338,6 @@ ??ACord@absl@@QBEDI@Z ??BCord@absl@@QBE?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ ??Bint128@absl@@QBENXZ - ??Eiterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QAEAAV0123@XZ ??Gdetail@cctz@time_internal@absl@@YA?AV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@0123@V40123@_J@Z ??Kabsl@@YA?AVint128@0@V10@0@Z ??Kabsl@@YA?AVuint128@0@V10@0@Z @@ -589,7 +588,8 @@ ?EqualsImpl@Cord@absl@@ABE_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@I@Z ?EquivTransitions@TimeZoneInfo@cctz@time_internal@absl@@ABE_NEE@Z ?Erase@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QAEPAUPayload@status_internal@3@PBU453@0@Z - ?EraseMetaOnly@container_internal@absl@@YAXAAVCommonFields@12@PBW4ctrl_t@12@I@Z + ?EraseMetaOnlyLarge@container_internal@absl@@YAXAAVCommonFields@12@PBW4ctrl_t@12@I@Z + ?EraseMetaOnlySmall@container_internal@absl@@YAXAAVCommonFields@12@_NI@Z ?ErasePayload@StatusRep@status_internal@absl@@QAE?AUEraseResult@123@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z ?ErrnoToStatus@absl@@YA?AVStatus@1@HV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z ?ErrnoToStatusCode@absl@@YA?AW4StatusCode@1@H@Z
diff --git a/third_party/androidx/build.gradle b/third_party/androidx/build.gradle index b0b7f98..45ffb7b6 100644 --- a/third_party/androidx/build.gradle +++ b/third_party/androidx/build.gradle
@@ -314,7 +314,7 @@ google() maven { // This URL is generated by the fetch_all_androidx.py script. - url 'https://androidx.dev/snapshots/builds/13836489/artifacts/repository' + url 'https://androidx.dev/snapshots/builds/13838515/artifacts/repository' } mavenCentral() }
diff --git a/third_party/androidx_javascriptengine/BUILD.gn b/third_party/androidx_javascriptengine/BUILD.gn index 14e8cca..8c7045f 100644 --- a/third_party/androidx_javascriptengine/BUILD.gn +++ b/third_party/androidx_javascriptengine/BUILD.gn
@@ -84,7 +84,7 @@ "//third_party/androidx:androidx_test_core_java", "//third_party/androidx:androidx_test_ext_junit_java", "//third_party/androidx:androidx_test_runner_java", - "//third_party/junit:junit", + "//third_party/junit", ] # Tell GN to ignore 'incremental_install' even if the user has it in their GN
diff --git a/third_party/angle b/third_party/angle index e4007ff..c8209fe 160000 --- a/third_party/angle +++ b/third_party/angle
@@ -1 +1 @@ -Subproject commit e4007fff3335258e97e5e8b9569d8d698df820c9 +Subproject commit c8209fec9a5f8d4eef073fb21a8db0c7d51c531d
diff --git a/third_party/anonymous_tokens/BUILD.gn b/third_party/anonymous_tokens/BUILD.gn index 3e485f4..e9deb58 100644 --- a/third_party/anonymous_tokens/BUILD.gn +++ b/third_party/anonymous_tokens/BUILD.gn
@@ -269,7 +269,7 @@ ":constants", ":crypto_utils", ":status_utils", - "//base:base", + "//base", ] public_deps = [ ":anonymous_tokens_cc_proto",
diff --git a/third_party/blink/common/features.cc b/third_party/blink/common/features.cc index 2a4bed991..8ccd1e2 100644 --- a/third_party/blink/common/features.cc +++ b/third_party/blink/common/features.cc
@@ -408,7 +408,7 @@ // Enables camera preview in permission bubble and site settings. BASE_FEATURE(kCameraMicPreview, "CameraMicPreview", - base::FEATURE_DISABLED_BY_DEFAULT); + base::FEATURE_ENABLED_BY_DEFAULT); #endif // Temporarily disabled due to issues: @@ -1147,7 +1147,7 @@ // Defers device selection until after permission is granted. BASE_FEATURE(kGetUserMediaDeferredDeviceSettingsSelection, "GetUserMediaDeferredDeviceSettingsSelection", - base::FEATURE_DISABLED_BY_DEFAULT); + base::FEATURE_ENABLED_BY_DEFAULT); #endif BASE_FEATURE_PARAM(std::string,
diff --git a/third_party/blink/public/mojom/choosers/file_chooser.mojom b/third_party/blink/public/mojom/choosers/file_chooser.mojom index 411e5aee..c7929be 100644 --- a/third_party/blink/public/mojom/choosers/file_chooser.mojom +++ b/third_party/blink/public/mojom/choosers/file_chooser.mojom
@@ -31,7 +31,7 @@ kOpenDirectory, // Allows picking a nonexistent file, and prompts to overwrite if the file - // already exists. This is not for Blink but for PPAPI. + // already exists. kSave, }; Mode mode = kOpen; @@ -40,7 +40,8 @@ // which will be either "Open" or "Save" depending on the mode. mojo_base.mojom.String16 title; - // Default file name to select in the dialog with kSave mode. + // Default file name to select in the dialog with kSave mode. This value + // is cleared if mode is not kSave. mojo_base.mojom.FilePath default_file_name; // |selected_files| has filenames which a file upload control already
diff --git a/third_party/blink/renderer/core/layout/out_of_flow_layout_part.cc b/third_party/blink/renderer/core/layout/out_of_flow_layout_part.cc index 9a77cea5..4a1c140 100644 --- a/third_party/blink/renderer/core/layout/out_of_flow_layout_part.cc +++ b/third_party/blink/renderer/core/layout/out_of_flow_layout_part.cc
@@ -2342,31 +2342,6 @@ node_info.node, space.AvailableSize(), alignment, insets, static_position, container_writing_direction, candidate_writing_direction); - { - auto& document = node_info.node.GetDocument(); - if (alignment.inline_alignment.GetPosition() != ItemPosition::kNormal) { - if (insets.inline_start && insets.inline_end) { - UseCounter::Count(document, - WebFeature::kOutOfFlowJustifySelfBothInsets); - } else if (insets.inline_start || insets.inline_end) { - UseCounter::Count(document, - WebFeature::kOutOfFlowJustifySelfSingleInset); - } else { - UseCounter::Count(document, WebFeature::kOutOfFlowJustifySelfNoInsets); - } - } - - if (alignment.block_alignment.GetPosition() != ItemPosition::kNormal) { - if (insets.block_start && insets.block_end) { - UseCounter::Count(document, WebFeature::kOutOfFlowAlignSelfBothInsets); - } else if (insets.block_start || insets.block_end) { - UseCounter::Count(document, WebFeature::kOutOfFlowAlignSelfSingleInset); - } else { - UseCounter::Count(document, WebFeature::kOutOfFlowAlignSelfNoInsets); - } - } - } - const BoxStrut border_padding = ComputeBorders(space, node_info.node) + ComputePadding(space, candidate_style);
diff --git a/third_party/blink/renderer/core/layout/out_of_flow_layout_part_test.cc b/third_party/blink/renderer/core/layout/out_of_flow_layout_part_test.cc index 6cfcfe4..3fa5c76 100644 --- a/third_party/blink/renderer/core/layout/out_of_flow_layout_part_test.cc +++ b/third_party/blink/renderer/core/layout/out_of_flow_layout_part_test.cc
@@ -1759,36 +1759,6 @@ EXPECT_EQ(fragmentainer->Children().size(), 2u); } -TEST_F(OutOfFlowLayoutPartTest, UseCountOutOfFlowNoInsets) { - SetBodyInnerHTML(R"HTML( - <div style="position: absolute; justify-self: center;"></div> - )HTML"); - EXPECT_TRUE( - GetDocument().IsUseCounted(WebFeature::kOutOfFlowJustifySelfNoInsets)); - EXPECT_FALSE( - GetDocument().IsUseCounted(WebFeature::kOutOfFlowAlignSelfNoInsets)); -} - -TEST_F(OutOfFlowLayoutPartTest, UseCountOutOfFlowSingleInset) { - SetBodyInnerHTML(R"HTML( - <div style="position: absolute; right: 0; bottom: 0; justify-self: center;"></div> - )HTML"); - EXPECT_TRUE( - GetDocument().IsUseCounted(WebFeature::kOutOfFlowJustifySelfSingleInset)); - EXPECT_FALSE( - GetDocument().IsUseCounted(WebFeature::kOutOfFlowAlignSelfSingleInset)); -} - -TEST_F(OutOfFlowLayoutPartTest, UseCountOutOfFlowBothInsets) { - SetBodyInnerHTML(R"HTML( - <div style="position: absolute; inset: 0; justify-self: center;"></div> - )HTML"); - EXPECT_TRUE( - GetDocument().IsUseCounted(WebFeature::kOutOfFlowJustifySelfBothInsets)); - EXPECT_FALSE( - GetDocument().IsUseCounted(WebFeature::kOutOfFlowAlignSelfBothInsets)); -} - TEST_F(OutOfFlowLayoutPartTest, EmptyFragmentainersBeforeOOF) { // There's an OOF in the fourth, fifth and sixth columns. SetBodyInnerHTML(
diff --git a/third_party/blink/renderer/core/timing/soft_navigation_heuristics.cc b/third_party/blink/renderer/core/timing/soft_navigation_heuristics.cc index f8cc2c75..448748f 100644 --- a/third_party/blink/renderer/core/timing/soft_navigation_heuristics.cc +++ b/third_party/blink/renderer/core/timing/soft_navigation_heuristics.cc
@@ -460,15 +460,21 @@ SoftNavigationContext* SoftNavigationHeuristics::MaybeGetSoftNavigationContextForTiming(Node* node) { - if (!context_for_current_url_ || - !context_for_current_url_->IsRecordingLargestContentfulPaint()) { + // In modes other than pre-paint-based attribution, this is constrained to + // `context_for_current_url_` for efficiency. + SoftNavigationContext* context = + IsPrePaintBasedAttributionEnabled() + ? paint_attribution_tracker_->GetSoftNavigationContextForNode(node) + : context_for_current_url_.Get(); + if (!context || !context->IsRecordingLargestContentfulPaint()) { return nullptr; } - bool attributable = IsPrePaintBasedAttributionEnabled() - ? paint_attribution_tracker_->IsAttributable( - node, context_for_current_url_) - : context_for_current_url_->IsNeededForTiming(node); - return attributable ? context_for_current_url_ : nullptr; + // For pre-paint-based attribution, `context` being non-null implies paints + // for `node` are attributable to `context`. + if (IsPrePaintBasedAttributionEnabled()) { + return context; + } + return context->IsNeededForTiming(node) ? context : nullptr; } void SoftNavigationHeuristics::OnPaintFinished() {
diff --git a/third_party/blink/renderer/core/timing/soft_navigation_paint_attribution_tracker.h b/third_party/blink/renderer/core/timing/soft_navigation_paint_attribution_tracker.h index 46284bb..b0ad1dfa 100644 --- a/third_party/blink/renderer/core/timing/soft_navigation_paint_attribution_tracker.h +++ b/third_party/blink/renderer/core/timing/soft_navigation_paint_attribution_tracker.h
@@ -83,6 +83,12 @@ // are not considered. void MarkNodeAsDirectlyModified(Node*, SoftNavigationContext*); + // Returns the `SoftNavigationContext` associated with `node`, if any. + SoftNavigationContext* GetSoftNavigationContextForNode(Node* node) { + auto* state = GetNodeState(node); + return state ? state->GetSoftNavigationContext() : nullptr; + } + // Returns true if the node is attributable to the given context, and false // otherwise. The node must be an image, text aggregation node, or something // explicitly modified, otherwise this returns false.
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5 index 24d89744..cfef477c 100644 --- a/third_party/blink/renderer/platform/runtime_enabled_features.json5 +++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -379,6 +379,7 @@ "default": "", }, origin_trial_feature_name: "AIRewriterAPI", + origin_trial_os: ["win", "mac", "linux"], origin_trial_allows_third_party: true, base_feature_status: "enabled", copied_from_base_feature_if: "overridden", @@ -411,6 +412,7 @@ "default": "", }, origin_trial_feature_name: "AIWriterAPI", + origin_trial_os: ["win", "mac", "linux"], origin_trial_allows_third_party: true, base_feature_status: "enabled", copied_from_base_feature_if: "overridden",
diff --git a/third_party/blink/web_tests/VirtualTestSuites b/third_party/blink/web_tests/VirtualTestSuites index 1c4ce92d..05824d0 100644 --- a/third_party/blink/web_tests/VirtualTestSuites +++ b/third_party/blink/web_tests/VirtualTestSuites
@@ -4215,6 +4215,9 @@ "bases": [ "external/wpt/soft-navigation-heuristics/" ], + "exclusive_tests": [ + "external/wpt/soft-navigation-heuristics/smoke/tentative/late-url-change.html" + ], "args": [ "--enable-features=SoftNavigationDetectionPrePaintBasedAttribution" ],
diff --git a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json index 88270e1..da50c0e 100644 --- a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json +++ b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json
@@ -6915,6 +6915,13 @@ {} ] ], + "delete-after-input-setRangeText.html": [ + "ed33cdd5b978dac7698329b2c4dc34468ab0ebc7", + [ + null, + {} + ] + ], "delete-after-justifyleft-in-closed-editable-dialog.html": [ "185cb01ee51dbf91717887f51ad82812690e0e90", [ @@ -7013,6 +7020,13 @@ {} ] ], + "delete-in-xml-space-preserve.html": [ + "017af10545a6e4de37010920a14eade6f240566d", + [ + null, + {} + ] + ], "delete-selection-with-null-range.html": [ "4d814eab807facfa13a11084b2d5f1ecda712c18", [ @@ -7412,6 +7426,13 @@ {} ] ], + "inserttext-with-empty-string-to-replace-selection.html": [ + "4821d77339473d1c745806d4d6b9772488367722", + [ + null, + {} + ] + ], "insertunorderedlist-in-empty-inline-editing-host.html": [ "74b0993322eda076a13023c96261840eadd53339", [ @@ -8172,6 +8193,15 @@ ] }, "widgets": { + "button-layout": { + "input-fragmentation-crash.html": [ + "78fa40f08203f1f3a900e73efd2968985754f661", + [ + null, + {} + ] + ] + }, "input-checkbox-appearance-none-dynamic-crash.html": [ "fb10f6a7fa63a62eee988778b902179ab38e3603", [ @@ -75833,6 +75863,19 @@ {} ] ], + "position-area-anchor-001.html": [ + "24b9bbcf1d6bbb17d8a9130983f57f289a6679e6", + [ + null, + [ + [ + "/css/css-anchor-position/position-area-anchor-001-ref.html", + "==" + ] + ], + {} + ] + ], "position-area-inline-container.html": [ "b6661ce5baa4a2d8ee3c6a69291096b2be9c74fd", [ @@ -137180,6 +137223,32 @@ {} ] ], + "grid-abspos-staticpos-align-self-end-large-border-padding.html": [ + "09647be71c9c63f01703f66bf666e7315b39558f", + [ + null, + [ + [ + "/css/css-grid/abspos/grid-abspos-staticpos-align-self-end-large-border-padding-ref.html", + "==" + ] + ], + {} + ] + ], + "grid-abspos-staticpos-align-self-end.html": [ + "c8176f1ab7684c130d5039cf38df349543d4ace9", + [ + null, + [ + [ + "/css/css-grid/abspos/grid-abspos-staticpos-align-self-end-ref.html", + "==" + ] + ], + {} + ] + ], "grid-abspos-staticpos-align-self-img-001.html": [ "cb5906603b35912cf2e649b1fa0a049d801ec236", [ @@ -155938,6 +156007,19 @@ ] ] }, + "empty-span-height.html": [ + "d849938d4438fdf12e60e46a29c608c2e33b9224", + [ + null, + [ + [ + "/css/css-inline/empty-span-height-ref.html", + "==" + ] + ], + {} + ] + ], "empty-span-scroll.html": [ "a7bb092660246ab370ffd04d16e13a11e20c803e", [ @@ -162336,6 +162418,45 @@ {} ] ], + "clip-path-animation-set-currenttime-forward-finish.html": [ + "29108b189daf4e1dd3d482544d8c0401f0026394", + [ + null, + [ + [ + "/css/css-masking/clip-path/animations/clip-path-animation-set-currenttime-ref.html", + "==" + ] + ], + {} + ] + ], + "clip-path-animation-set-currenttime-negative.html": [ + "11ef17c4d0ed09ef91a2d592decdc9e49e5668d7", + [ + null, + [ + [ + "/css/css-masking/clip-path/animations/clip-path-animation-set-currenttime-ref.html", + "==" + ] + ], + {} + ] + ], + "clip-path-animation-set-duration-animation-finish.html": [ + "2e138a7af887131f131e6fa840659c824b7cbaa6", + [ + null, + [ + [ + "/css/css-masking/clip-path/animations/clip-path-animation-set-currenttime-ref.html", + "==" + ] + ], + {} + ] + ], "clip-path-animation-set-effect.html": [ "a3fae2733d0a6050ca60409a11b69042347adf74", [ @@ -162349,6 +162470,19 @@ {} ] ], + "clip-path-animation-start-time.html": [ + "56ed807f4d05913ed6247dfed0c07187a0645b5e", + [ + null, + [ + [ + "/css/css-masking/clip-path/animations/clip-path-animation-start-time-ref.html", + "==" + ] + ], + {} + ] + ], "clip-path-animation-svg-zoom.html": [ "0accfd2102b72b196a4cfa987f88a5e31223d249", [ @@ -175607,7 +175741,7 @@ ] ], "line-clamp-010.html": [ - "1386b147ce639f511fa1fc58e0c0cd75ab99efc2", + "edeb89897bc610f093b7a5e8a7d49125ec480a74", [ null, [ @@ -175620,7 +175754,7 @@ ] ], "line-clamp-011.tentative.html": [ - "953f0c4faa9e57975cfabfd10d20ae4e1f9c45a3", + "69effbcca17061a7519316ef097b9903fbe7968e", [ null, [ @@ -175723,8 +175857,8 @@ {} ] ], - "line-clamp-019.tentative.html": [ - "b39376d39502ff643d41543c26db8f43abcc35bd", + "line-clamp-019.html": [ + "e956fe8686dec75f28d918ee33b6266fe9bdf6e4", [ null, [ @@ -175918,6 +176052,32 @@ {} ] ], + "line-clamp-034.html": [ + "bb703dd2aec73e95b353482aa940b4a2568a33e7", + [ + null, + [ + [ + "/css/css-overflow/line-clamp/reference/webkit-line-clamp-001-ref.html", + "==" + ] + ], + {} + ] + ], + "line-clamp-035.tentative.html": [ + "feb4aac618a21851ad1fb1fe8aa7a3ce80c8e045", + [ + null, + [ + [ + "/css/css-overflow/line-clamp/reference/webkit-line-clamp-005-ref.html", + "==" + ] + ], + {} + ] + ], "line-clamp-auto-001.tentative.html": [ "02d8479736d4d6fd7e26df53611624e7a75d0989", [ @@ -176049,7 +176209,7 @@ ] ], "line-clamp-auto-011.tentative.html": [ - "50513516cc9daa3d90063277f2d8d00e52db4f78", + "00076a5336e89004b6a2143e9bd6c72ec9fe95e0", [ null, [ @@ -176230,6 +176390,19 @@ {} ] ], + "line-clamp-auto-025.tentative.html": [ + "7144be1a6e024f5f7dc42407cd8a5821632e3489", + [ + null, + [ + [ + "/css/css-overflow/line-clamp/reference/line-clamp-auto-025-ref.html", + "==" + ] + ], + {} + ] + ], "line-clamp-auto-027.tentative.html": [ "9ed461d8cfb4c2ee035987148e15b6dcce3cdffa", [ @@ -176295,6 +176468,19 @@ {} ] ], + "line-clamp-auto-032.tentative.html": [ + "17c6981ae33f115d8b7ab4245f44c6c837b44d1a", + [ + null, + [ + [ + "/css/css-overflow/line-clamp/reference/line-clamp-auto-032-ref.html", + "==" + ] + ], + {} + ] + ], "line-clamp-auto-033.tentative.html": [ "f18d7eefb271e8529d0f2dedde8fe3fe9d7ea947", [ @@ -176309,12 +176495,12 @@ ] ], "line-clamp-auto-034.tentative.html": [ - "96fe675d1b10c74516b7d2e1a38425b220817a52", + "ebb676dfd8e0fa265ddf0280b3987fd1eb8f3587", [ null, [ [ - "/css/css-overflow/line-clamp/reference/webkit-line-clamp-005-ref.html", + "/css/css-overflow/line-clamp/reference/line-clamp-auto-034-ref.html", "==" ] ], @@ -176348,12 +176534,12 @@ ] ], "line-clamp-auto-037.tentative.html": [ - "37b366660241f9542b273d5999d357b8bdb497fe", + "4a2fc3c82064e12b5ff282c56f4e3a03035ee9e9", [ null, [ [ - "/css/css-overflow/line-clamp/reference/line-clamp-auto-037-ref.html", + "/css/css-overflow/line-clamp/reference/line-clamp-auto-011-ref.html", "==" ] ], @@ -214493,6 +214679,19 @@ {} ] ], + "text-spacing-trim-fallback-001.html": [ + "1a13be3b30635d036d3b990c8084c19e8efe9171", + [ + null, + [ + [ + "/css/css-text/text-spacing-trim/text-spacing-trim-fallback-001-ref.html", + "==" + ] + ], + {} + ] + ], "text-spacing-trim-feature-001.html": [ "25ddad34aee7d99ae1b17949773087f2ff558ac3", [ @@ -253908,6 +254107,19 @@ {} ] ], + "inline-cache-base-uri.html": [ + "96249058d5d0b4a81b52963844b4b628ece300fd", + [ + null, + [ + [ + "/css/css-values/inline-cache-base-uri-ref.html", + "==" + ] + ], + {} + ] + ], "lh-unit-001.html": [ "f7a6fc9551b4524a41bdb97cb9293ff973cf3e52", [ @@ -261791,6 +262003,19 @@ ] ], "scoped": { + "display-change.html": [ + "74428fafc7a714ed10bbbed9208a1736e82848c8", + [ + null, + [ + [ + "/css/css-view-transitions/scoped/content-ref.html", + "==" + ] + ], + {} + ] + ], "from-scale-zero.html": [ "029b8301512e3fc94fc8b428186e811cd376edc7", [ @@ -279530,7 +279755,7 @@ ] ], "backdrop-filter-edge-behavior.html": [ - "2123e76d3832b8f7bf7a1a92c01d652ce1a1b358", + "7649bfd8f968860f9e7307fcf601c9beb4f03884", [ null, [ @@ -282396,7 +282621,7 @@ ] ], "svg-image-root-filter.html": [ - "6df6eb23b9a1443c8c35fe8343a291dd079a03af", + "c3d99d0a3cdac080f09633f445a4ef66109585be", [ null, [ @@ -282405,7 +282630,23 @@ "==" ] ], - {} + { + "fuzzy": [ + [ + null, + [ + [ + 0, + 1 + ], + [ + 0, + 400 + ] + ] + ] + ] + } ] ], "svg-multiple-filter-functions.html": [ @@ -324543,11 +324784,11 @@ "8ab9db7bf71318b6b030f32ab7b8bd2554efa3e1", [] ], - "cfrg_curves_bits_curve448.https.any-expected.txt": [ + "cfrg_curves_bits_curve448.tentative.https.any-expected.txt": [ "66ab63a4e41ed1cbba4838edb1641e59f3c419b0", [] ], - "cfrg_curves_bits_curve448.https.any.worker-expected.txt": [ + "cfrg_curves_bits_curve448.tentative.https.any.worker-expected.txt": [ "66ab63a4e41ed1cbba4838edb1641e59f3c419b0", [] ], @@ -324559,11 +324800,11 @@ "62f9e00aa338468f1a33a5fe91931378a4a72cad", [] ], - "cfrg_curves_keys_curve448.https.any-expected.txt": [ + "cfrg_curves_keys_curve448.tentative.https.any-expected.txt": [ "d5317de7e76c0d7f37472222b902ca2d078dc3d8", [] ], - "cfrg_curves_keys_curve448.https.any.worker-expected.txt": [ + "cfrg_curves_keys_curve448.tentative.https.any.worker-expected.txt": [ "d5317de7e76c0d7f37472222b902ca2d078dc3d8", [] ], @@ -324815,19 +325056,19 @@ "ab3908ab689aa4d5d1ea9fc73f2637d5c06cf127", [] ], - "failures_Ed448.https.any-expected.txt": [ + "failures_Ed448.tentative.https.any-expected.txt": [ "9e773ae68af00710e3ef5a44a921d178d7c5d4df", [] ], - "failures_Ed448.https.any.worker-expected.txt": [ + "failures_Ed448.tentative.https.any.worker-expected.txt": [ "9e773ae68af00710e3ef5a44a921d178d7c5d4df", [] ], - "failures_X448.https.any-expected.txt": [ + "failures_X448.tentative.https.any-expected.txt": [ "53b8a7e9c387fc3e374b0a595d53ae66b007af36", [] ], - "failures_X448.https.any.worker-expected.txt": [ + "failures_X448.tentative.https.any.worker-expected.txt": [ "53b8a7e9c387fc3e374b0a595d53ae66b007af36", [] ], @@ -324867,19 +325108,19 @@ "74b757b8e50c2418f328be60c8bea7dea8862100", [] ], - "successes_Ed448.https.any-expected.txt": [ + "successes_Ed448.tentative.https.any-expected.txt": [ "30f29525521455688b1c57973eb48f039224b4cc", [] ], - "successes_Ed448.https.any.worker-expected.txt": [ + "successes_Ed448.tentative.https.any.worker-expected.txt": [ "30f29525521455688b1c57973eb48f039224b4cc", [] ], - "successes_X448.https.any-expected.txt": [ + "successes_X448.tentative.https.any-expected.txt": [ "b47aa9dd80efc5d50eeba04e8040fc5696a0a68d", [] ], - "successes_X448.https.any.worker-expected.txt": [ + "successes_X448.tentative.https.any.worker-expected.txt": [ "b47aa9dd80efc5d50eeba04e8040fc5696a0a68d", [] ] @@ -324905,35 +325146,35 @@ "8627f85e466199453efb59109e2ba1d7eb025ff8", [] ], - "okp_importKey_Ed448.https.any-expected.txt": [ + "okp_importKey_Ed448.tentative.https.any-expected.txt": [ "5ad60d082bfab7b9881fae59280d42cb19cd7154", [] ], - "okp_importKey_Ed448.https.any.worker-expected.txt": [ + "okp_importKey_Ed448.tentative.https.any.worker-expected.txt": [ "5ad60d082bfab7b9881fae59280d42cb19cd7154", [] ], - "okp_importKey_X448.https.any-expected.txt": [ + "okp_importKey_X448.tentative.https.any-expected.txt": [ "e6052c5ef1b5501fda60cb3bd128d10df4f65c5f", [] ], - "okp_importKey_X448.https.any.worker-expected.txt": [ + "okp_importKey_X448.tentative.https.any.worker-expected.txt": [ "e6052c5ef1b5501fda60cb3bd128d10df4f65c5f", [] ], - "okp_importKey_failures_Ed448.https.any-expected.txt": [ + "okp_importKey_failures_Ed448.tentative.https.any-expected.txt": [ "59e83f578305511158c2b951884d97cfa3eccbd2", [] ], - "okp_importKey_failures_Ed448.https.any.worker-expected.txt": [ + "okp_importKey_failures_Ed448.tentative.https.any.worker-expected.txt": [ "59e83f578305511158c2b951884d97cfa3eccbd2", [] ], - "okp_importKey_failures_X448.https.any-expected.txt": [ + "okp_importKey_failures_X448.tentative.https.any-expected.txt": [ "903dd31e8abc800680c6856b78046d2c2acd05a4", [] ], - "okp_importKey_failures_X448.https.any.worker-expected.txt": [ + "okp_importKey_failures_X448.tentative.https.any.worker-expected.txt": [ "903dd31e8abc800680c6856b78046d2c2acd05a4", [] ], @@ -324967,11 +325208,11 @@ "4024674e3c3d7f0500cfc10192714de392e4db1d", [] ], - "eddsa_curve448.https.any-expected.txt": [ + "eddsa_curve448.tentative.https.any-expected.txt": [ "a3c791dfc4385fb5e57f0b99ce450046f357e9e8", [] ], - "eddsa_curve448.https.any.worker-expected.txt": [ + "eddsa_curve448.tentative.https.any.worker-expected.txt": [ "a3c791dfc4385fb5e57f0b99ce450046f357e9e8", [] ], @@ -327499,7 +327740,7 @@ [] ], "get-host-info.sub.js": [ - "f680cd8b1999a317066de5ce3aab1c682b081bc5", + "42369c7370b91cc2daf46c17a6fd73318327effb", [] ], "get-host-info.sub.js.headers": [ @@ -330488,6 +330729,18 @@ ] } }, + "origin-bound-cookies": { + "resources": { + "scheme-bound-cookies-window.html": [ + "0ad1d0b23aaf451d8e0b5f02cc4b5023da54303f", + [] + ] + }, + "scheme-bound-cookies.https-expected.txt": [ + "8b137891791fe96927ad78e64b0aad7bded08bdc", + [] + ] + }, "partitioned-cookies": { "OWNERS": [ "34b3b91a2f61e5e74a2b3e305dbbda30e2031ab6", @@ -337969,6 +338222,10 @@ "dd922b0bb218311665711ca9d14d60bdfb72ba98", [] ], + "position-area-anchor-001-ref.html": [ + "a97d290bfda8e46e69f87cfa518a0739ecdf86bd", + [] + ], "position-area-inline-container-ref.html": [ "ecf54f1a9ac2d756cb78f4d2c0690c1ac8b65916", [] @@ -355834,6 +356091,14 @@ "ddb89d1fb2a3601509dbf19219b03b91c930ae84", [] ], + "grid-abspos-staticpos-align-self-end-large-border-padding-ref.html": [ + "7f2a5ad8377f9948d7640673eb76cfac3edfa3cd", + [] + ], + "grid-abspos-staticpos-align-self-end-ref.html": [ + "868717bc53ba75e1d6244fbaccddcf178c8c14da", + [] + ], "grid-abspos-staticpos-align-self-img-001-ref.html": [ "06d9d366127609b22f599fd87528693e37c8e6f4", [] @@ -359159,6 +359424,10 @@ [] ] }, + "empty-span-height-ref.html": [ + "34a81ce598333cec011ec83f7a3493d562580ac2", + [] + ], "empty-span-scroll-ref.html": [ "28b7f6e2df48fe2124ed8c623cabb56c1aecb35e", [] @@ -359603,7 +359872,7 @@ [] ], "text-box-trim-line-clamp-001-ref.html": [ - "9d03140f4d7454f77e960816b8fe96d05f2aec89", + "c24d6197fc1f293fe1c3268902c82db045980e53", [] ], "text-box-trim-line-clamp-auto-001-ref.html": [ @@ -360601,6 +360870,14 @@ "b1e9ef5764029a5bd0645b71eb2ece265e340281", [] ], + "clip-path-animation-set-currenttime-ref.html": [ + "b65392923527a6cabeed5222ecf262fd6f71da8f", + [] + ], + "clip-path-animation-start-time-ref.html": [ + "067d779b075431e392be9267d7a9ccc5d57110a0", + [] + ], "clip-path-animation-svg-ref.html": [ "6cc3b4d58bd2ce7c1c9aef9df84dbff47d783f34", [] @@ -362637,6 +362914,22 @@ "2944307d2d976a1690bb0f06d8ee85df18d1ea3c", [] ], + "column-scroll-marker-focus-001-expected.txt": [ + "9765fd727215447cd9b2a91a0a2a0d07a00f9cb0", + [] + ], + "column-scroll-marker-focus-002-expected.txt": [ + "7c7381cf2744290b94eea2a46f51723286da0562", + [] + ], + "column-scroll-marker-focus-003-expected.txt": [ + "9f6b9d845e982d01640b611d174eeb62bc265102", + [] + ], + "column-scroll-marker-focus-004-expected.txt": [ + "9ca55ef8842c2878ab0d215f13eb84decf427071", + [] + ], "column-scroll-marker-reattach-target-current-ref.html": [ "3a5b5cc94bf7c2b3affc363ad0e903155283b6bb", [] @@ -362658,7 +362951,7 @@ [] ], "inheritance-expected.txt": [ - "c622cbc364d03c4b7c0d81ec09bde9bb1342109b", + "4a57f459d0d7152aec425a44e54433efc6efe8cd", [] ], "line-clamp": { @@ -362732,7 +363025,7 @@ [] ], "line-clamp-011-ref.html": [ - "04297fff2b5538a8be020d780cba3d82aa30fa9e", + "02ef71d56193c97f8662f1ddd81633181deaf7b5", [] ], "line-clamp-012-ref.html": [ @@ -362784,7 +363077,7 @@ [] ], "line-clamp-auto-011-ref.html": [ - "27a2e7b2bc07ba80f6bfda6b6b10f2c417b27bbb", + "5f7120ee39a2014f75f2f700ebedcc0b0e6e6275", [] ], "line-clamp-auto-016-ref.html": [ @@ -362811,6 +363104,10 @@ "adb4b6dc6edf2a401cd4016f394c74b9bf9b89cb", [] ], + "line-clamp-auto-025-ref.html": [ + "c404f65ce6a342b8bb2b7715bd9c7c1b912940ee", + [] + ], "line-clamp-auto-027-ref.html": [ "fa0ade7a61d0729dc216fe92fc9d1f49bcd31991", [] @@ -362827,6 +363124,14 @@ "2d3c9d0261b7eb369d99dbd842309f697e80bad8", [] ], + "line-clamp-auto-032-ref.html": [ + "4768c77ddabc93d3519e671c10d584b12e8a69ad", + [] + ], + "line-clamp-auto-034-ref.html": [ + "8fae3b278c124db00b8f79eb0cd0b91cb8752217", + [] + ], "line-clamp-auto-036-ref.html": [ "0ad96e88d14a735ce9416dba2b31f5f66936b19f", [] @@ -363295,19 +363600,11 @@ [] ], "continue-valid-expected.txt": [ - "820be9471b599145f4f420aa66ccda17c48a7c3e", - [] - ], - "line-clamp-invalid-expected.txt": [ - "2421724b28f9b349121c0360e7d7b919127bfa0d", + "88b127f7ef1046fd8ff5cc5ee1b87140c5d34faa", [] ], "line-clamp-valid-expected.txt": [ - "1bead233776ea1520a1c446eedd988e0a79997ab", - [] - ], - "max-lines-valid-expected.txt": [ - "616418e1723574341bc33a131faf44d371c5cf44", + "8253f838ffd72482334d4fb044826daecc4684be", [] ], "scroll-markers-computed-expected.txt": [ @@ -363463,14 +363760,26 @@ "dca775fcecadf26d115e3961da6affb519b0fdba", [] ], + "scroll-marker-activation-retains-focus-expected.txt": [ + "af10820b3b174b512fdf47baffff33c6ca1dfded", + [] + ], "scroll-marker-counters-ref.html": [ "7113a5c5d23a97cf83f173a72ef96b57ecf09263", [] ], + "scroll-marker-double-activation-expected.txt": [ + "74f0476528995fa1ba02abe2727bb80853f2df1c", + [] + ], "scroll-marker-dynamic-ref.html": [ "a004a8583f20e3d0e082c7390e20b040b960bfec", [] ], + "scroll-marker-focus-within-expected.txt": [ + "a96eb2255f7fdd7768522f7d969e1e1e95795f66", + [] + ], "scroll-marker-group-001-ref.html": [ "7f980f575d3a763a84dfb79a00416f2ce656b4d8", [] @@ -363519,10 +363828,26 @@ "58670072f696c6a2143591395512fd17bd4ffa7f", [] ], + "scroll-marker-navigation-cycles-expected.txt": [ + "c0f03de8c90601482fe8862ca03111eeb6452581", + [] + ], + "scroll-marker-next-focus-expected.txt": [ + "18b61ad397ab6e05140958fe017326a5c2b92136", + [] + ], "scroll-marker-selection-in-2d-ref.html": [ "d16263a12a37bf65cf57c46e0a644637462f262d", [] ], + "scroll-markers-focus-active-element-expected.txt": [ + "c658a9b236ce27f3cd262e1fd2e9c75a64ce2920", + [] + ], + "scroll-markers-focus-on-scrolling-expected.txt": [ + "ecc60f3952d8f321f30f1616fdd68648831967f3", + [] + ], "scroll-markers-under-content-visibility-auto-ref.html": [ "559ff4e5aa2cffec5966938a824826a41fbc07d8", [] @@ -371503,14 +371828,6 @@ "word-space-transform-valid-expected.txt": [ "a62737d545b509d0175fc41937ebac799189d48b", [] - ], - "word-spacing-computed-expected.txt": [ - "9045a13d63617d22ffca2707c88ed3ee911e54b9", - [] - ], - "word-spacing-valid-expected.txt": [ - "77e20da66a1af65c8bde82422205413e505b6ff4", - [] ] }, "shaping": { @@ -372338,6 +372655,10 @@ "57013882323048ccc8d651929fdb42f413953882", [] ], + "text-spacing-trim-fallback-001-ref.html": [ + "d3f72b2ecee9848c1a9460ce2bda82bef848798e", + [] + ], "text-spacing-trim-feature-001-ref.html": [ "86b61e064076ab4224a65021e31b5678a54e3ec0", [] @@ -376199,10 +376520,6 @@ [] ] }, - "properties-value-001-expected.txt": [ - "6bfe748e6c8666807f25e11081b411a7173b1de4", - [] - ], "properties-value-002-expected.txt": [ "da2ba17acd4db3a02b424f727f9fabeab4a22b38", [] @@ -376211,10 +376528,6 @@ "467d5504ab32556cff3232c145c1dfd83fad2ece", [] ], - "properties-value-inherit-002-expected.txt": [ - "6bfe748e6c8666807f25e11081b411a7173b1de4", - [] - ], "pseudo-element-transform-ref.html": [ "05ea20b69c4b45bb4c9eb49ffa10a342ab97b7ac", [] @@ -376860,7 +377173,7 @@ [] ], "text-overflow-expected.txt": [ - "79d91df730299c387b59bd7d4b15ab064ea8276c", + "65900d570b7084f12e9a26bcada7ed8cc207c620", [] ], "text-size-adjust-expected.txt": [ @@ -376888,7 +377201,7 @@ [] ], "word-spacing-expected.txt": [ - "114a52f457182ab2da0f7e904b75f75888398d7c", + "9bb0afa12b149498a3a8af035045b8cc19e35c6a", [] ], "word-wrap-expected.txt": [ @@ -378529,6 +378842,24 @@ "888a51ea9b6ac04fb065ee5d84a18be8fe765aca", [] ], + "inline-cache-base-uri": { + "inline-cache-base-uri.css": [ + "df719dd6cc5ed6996ffd0762f9ee380394cab9de", + [] + ], + "inner.html": [ + "7a23e13a21bbe5c1bb57c6f0cd19d9d04b4dea4c", + [] + ] + }, + "inline-cache-base-uri-ref.html": [ + "07f7449d52be5f1f82b97b19dfd57a3290e16293", + [] + ], + "inline-cache-base-uri.css": [ + "2efbfba62bd32e22840cfb3e44fda8f5371a9394", + [] + ], "minmax-percentage-serialize-expected.txt": [ "ae7598061a545cb00b15fa5d7ce7cae14af6e41c", [] @@ -383618,7 +383949,7 @@ [] ], "backdrop-filter-edge-behavior-ref.html": [ - "d5e8fa878cb1930f922f11042d97651746ccb40d", + "11246d799658499721e56d8dc1d8b023abc1fa1f", [] ], "backdrop-filter-edge-pixels-ref.html": [ @@ -386347,7 +386678,7 @@ [] ], "helper.js": [ - "58b7a5fe7a2da56b9c6555f6e21510abd1c81473", + "e364e2e24f1d296346fb9025adec160a10ffed8f", [] ], "includeInScopeSpecification": { @@ -386385,7 +386716,7 @@ [] ], "session_manager.py": [ - "98e01309192cce32d5437e0b10549ca572a7f0ef", + "779d1435ac7edfe57842abddbba6ad2ea64b130d", [] ], "set_cookie.py": [ @@ -386393,13 +386724,17 @@ [] ], "setup_sharded_server_state.py": [ - "f3e6029e8f3d6fb27cfe9262a419b8eb793c0dd0", + "57e935ea57e50a478f3c9ac9684fefb4d121a99b", [] ], "start_session.py": [ "d2b7ee878188e0c928959445cc7722f5725e0da1", [] ], + "url_fetcher.html": [ + "be1cb97921972e0dc577e9f1906ccb0752b96b24", + [] + ], "verify_authenticated.py": [ "ea4b5a2162a366fe8fd04d069f992a909236be66", [] @@ -386450,6 +386785,10 @@ ] }, "digital-credentials": { + "DIR_METADATA": [ + "47815934a4db38ef67f84d3de2ba6fa1a66aef68", + [] + ], "META.yml": [ "177f1411bb96680e76e05f71988dc669f67c9d3a", [] @@ -386467,7 +386806,7 @@ [] ], "dc-types.ts": [ - "6555add5b5d7d45ebc1004d1d27c329aaf6f55e8", + "1f3d620790c14557ba4eeb884b00520b6f1ea9c8", [] ], "digital-credentials-static-methods.tentative.https-expected.txt": [ @@ -386487,7 +386826,7 @@ [] ], "get.tentative.https-expected.txt": [ - "e6017b50bf9e6c03cd298118e5b7cc1380c72d66", + "70beb5727e47727d8c2edb7fa20c03de930b4e78", [] ], "support": { @@ -388778,7 +389117,7 @@ [] ], "insertparagraph_1-1000-expected.txt": [ - "c2132fd2be3c2f4565f95791352602ddc38fce5c", + "710205557b55312803f09679fcffaa22bd19be70", [] ], "insertparagraph_1001-2000-expected.txt": [ @@ -391046,7 +391385,7 @@ ] }, "fedcm-helper.sub.js": [ - "f88fd62bd129fa2530b359eca65798b0e0dabde5", + "d370ea6e374c0eb7272201452baac874771dce82", [] ], "fedcm-helper.sub.js.headers": [ @@ -393546,7 +393885,7 @@ [] ], "README.md": [ - "95066cdcd0ba6f2baed3cd02d67610420367b6df", + "d4945a0bfb21417f61fca4cf400713089881ba37", [] ], "resources": { @@ -395956,6 +396295,14 @@ "8aa4c66254cf0e4595a51a083af347e357f4c991", [] ], + "NotoSansCJKjp-Regular-subset-halt-3002.otf": [ + "cd0f08ca4f8d4bff4828034df9332b7a69d4fdd7", + [] + ], + "NotoSansCJKjp-Regular-subset-halt-FF1A.otf": [ + "159aec5f717017658ac416a789722e3ae937f196", + [] + ], "NotoSansCJKjp-Regular-subset-halt-min.otf": [ "1ec5a7dbea3c9ccd088b9ef15e5b67074c830686", [] @@ -395969,7 +396316,7 @@ [] ], "subset.sh": [ - "c34840667624f7750d8c85b7c4f7b176d1f60581", + "899db77945df516444a327b88e6e3db79f421de1", [] ] }, @@ -403568,7 +403915,17 @@ "README.md": [ "f6b4470618d98cdc0dc09eef7e508c31bee41531", [] - ] + ], + "resources": { + "delay.py": [ + "d1cc3a9fdfa5e29d81c5b5dca2c405ffea3ec776", + [] + ], + "included.txt": [ + "929838d5eab5dca3e21fe0295dfc3ed3b6cc7a28", + [] + ] + } } }, "reflection-embedded-expected.txt": [ @@ -407594,12 +407951,6 @@ ] } }, - "sections-and-headings": { - "headings-styles-expected.txt": [ - "e3679dfece450fc9c20be020181da561cf3c5993", - [] - ] - }, "tables": { "DIR_METADATA": [ "c8909f2b9c86237b881f6f2465f13e4fb1ce162f", @@ -413151,6 +413502,14 @@ "a-onclick-handler-iframe.html": [ "711e40f9d4bd83700ed8ab39bdf3795d9287deca", [] + ], + "plain-text.unknown": [ + "efbf544ad0b5fd91a7e4fc42bf98228f065bc240", + [] + ], + "plain-text.unknown.headers": [ + "036ddf96fd8ffb393f8ccdf398d08b2a09b1b15e", + [] ] } }, @@ -418457,7 +418816,15 @@ "780d5736c49065f1ea4140cfb8375aeb1005f039", [] ] - } + }, + "web-font-styled-text-resize-swap-expected.txt": [ + "bd90b52636f88f730a07d492db075f16719ec83a", + [] + ], + "web-font-styled-text-resize-swap-subnode-expected.txt": [ + "149db54d04d18a25db719d059f88d19ac77f094b", + [] + ] }, "layout-instability": { "DIR_METADATA": [ @@ -427600,6 +427967,10 @@ [] ] }, + "sync-network-logo.png": [ + "91212531e00396593b5c0f6b92713f518a34b125", + [] + ], "troy.png": [ "4987ba65c2cefafeaa07abd87f47431ac7b6ca3a", [] @@ -427609,7 +427980,7 @@ [] ], "utils.sub.js": [ - "ab7407f7d6c41fd3e77db443dacf3b18252e26e6", + "6d66a2186c75ebeb3c5cd5b1c8e0a67e22229be2", [] ] }, @@ -432406,7 +432777,7 @@ [] ], "partitioned-estimate-usage-details-caches-helper-frame.html": [ - "0679c1decf55835a0de37a9e64f12647da2a6c0a", + "c97fffd4c9369ed9e0c92fdc8a33ff7d0b29107a", [] ], "partitioned-estimate-usage-details-indexeddb-helper-frame.html": [ @@ -437741,7 +438112,7 @@ [] ], "accumulation-per-property-002-expected.txt": [ - "c06b654a1f0adbc286b528eb1e935874fb62ce9a", + "49497594c0310210b762d47f6c158be0b20db7c0", [] ], "addition-per-property-001-expected.txt": [ @@ -437749,7 +438120,7 @@ [] ], "addition-per-property-002-expected.txt": [ - "64682d589996bdf1e9fa5ec481ef42ff06f35de1", + "2acc6f2369149657fc3fe14fcdf678cdf714c9a0", [] ], "interpolation-per-property-001-expected.txt": [ @@ -437757,7 +438128,7 @@ [] ], "interpolation-per-property-002-expected.txt": [ - "b6734d945426c656c44c4bac181f428ef3aeadf5", + "075ea6fad635e8cf95e68589207edaee2533ba6a", [] ], "property-list.js": [ @@ -438606,7 +438977,7 @@ [] ], "audit-util.js": [ - "e036445e4fe6e0cd1ace431742760a3d06f9f9c0", + "544bd202ee74033feb8b897914af5a90f24692a3", [] ], "audit.js": [ @@ -441059,6 +441430,10 @@ "9755ac3a6212a7faff06d9522531f2b6ffc1c7b1", [] ], + "setter-argument-expected.txt": [ + "023b960bf637bbde50a27dfb4739d806e4946fa8", + [] + ], "support": { "constructors-support.html": [ "3b2616170b1d4f48f9dab114e4135222ed10a6ea", @@ -441278,7 +441653,7 @@ }, "resources": { "utils.js": [ - "1e7b5a9ca79f822d67028e5004583934424903e3", + "c2af1ad77e16458f5390795458e99fbe2d3d3c44", [] ], "utils_validation.js": [ @@ -442341,10 +442716,6 @@ "storage_session_setitem_quotaexceedederr.window-expected.txt": [ "c5fe5ba652b61147ac139cf107297347df9bbbf9", [] - ], - "symbol-props.window-expected.txt": [ - "63078d0da1d964829d01d262953f4ea2c8641d29", - [] ] }, "webtransport": { @@ -448447,6 +448818,85 @@ } ] ], + "blob-valid-after-abort.any.js": [ + "169073b822be5d2ef5800c73352887a888500bb7", + [ + "IndexedDB/blob-valid-after-abort.any.html", + { + "script_metadata": [ + [ + "title", + "Blob Valid After Abort" + ], + [ + "global", + "window,worker" + ], + [ + "script", + "resources/support.js" + ] + ] + } + ], + [ + "IndexedDB/blob-valid-after-abort.any.serviceworker.html", + { + "script_metadata": [ + [ + "title", + "Blob Valid After Abort" + ], + [ + "global", + "window,worker" + ], + [ + "script", + "resources/support.js" + ] + ] + } + ], + [ + "IndexedDB/blob-valid-after-abort.any.sharedworker.html", + { + "script_metadata": [ + [ + "title", + "Blob Valid After Abort" + ], + [ + "global", + "window,worker" + ], + [ + "script", + "resources/support.js" + ] + ] + } + ], + [ + "IndexedDB/blob-valid-after-abort.any.worker.html", + { + "script_metadata": [ + [ + "title", + "Blob Valid After Abort" + ], + [ + "global", + "window,worker" + ], + [ + "script", + "resources/support.js" + ] + ] + } + ] + ], "blob-valid-after-deletion.any.js": [ "3a10fbde216acfea9251f40f0d26ad2838b64c87", [ @@ -496418,7 +496868,7 @@ ] ], "cookieStore_special_names.https.any.js": [ - "706eb16b55bc4de4d6e67b96e15f74a3690e4b55", + "36761b4493995e1bc41d56068b95b745b4cea3c5", [ "cookie-store/cookieStore_special_names.https.any.html", { @@ -497015,6 +497465,22 @@ ] ] }, + "origin-bound-cookies": { + "port-bound-cookies.html": [ + "696e53818cba033c9c3a68fc4bb44c23dffcbe61", + [ + null, + {} + ] + ], + "scheme-bound-cookies.https.html": [ + "e7f1158fe1d3768a967be1b69bd55e5e368dd8a0", + [ + null, + {} + ] + ] + }, "partitioned-cookies": { "partitioned-cookies-a-b-a-embed.tentative.https.html": [ "071948ea8d7b2d95124031d84ecea4be3df2ff4d", @@ -500170,6 +500636,20 @@ {} ] ], + "anchor-in-anchor-positioned.html": [ + "8cd341aece12dc41cfb8a853e181c460ec184319", + [ + null, + {} + ] + ], + "anchor-in-popover.html": [ + "97ae61793e3e98d3b01b3d578eaabfe04d079428", + [ + null, + {} + ] + ], "anchor-inherited.html": [ "0f84311d6d784fdb33fd2c6642a838deefb60830", [ @@ -500423,7 +500903,7 @@ ] ], "anchor-position-multicol-002.html": [ - "1e1f0a5c95b1b5f1d86efc5f22ffc87afbbab453", + "6ca4c22d8cd1e4f86a2d06e1a32460b16b7c756b", [ null, {} @@ -508741,6 +509221,13 @@ null, {} ] + ], + "multiline-align-self.html": [ + "3b8f1ca230326584930a2f1f54467e0442508f0d", + [ + null, + {} + ] ] }, "animation": { @@ -518971,7 +519458,7 @@ ] ], "inheritance.html": [ - "ffc6b2f881965883e74d53b49c2495b141724a06", + "bc166cb4205fc176b9e859e776150136ef33b28a", [ null, {} @@ -519121,42 +519608,42 @@ ] ], "continue-invalid.html": [ - "36e164158f3975e735f66c8ae9bcf819694d6b84", + "df09e0912bebd72332a8d4a03bed1644ca2c1e66", [ null, {} ] ], "continue-valid.html": [ - "97524cf80db239e111e4f503f5eea397129dca10", + "9d9f71e79ccf3d4be71ae2bbaf9cb7e7078f126c", [ null, {} ] ], "line-clamp-invalid.html": [ - "7b64e4735867396c650a7dd29c17577c896daea0", + "decff49ecbb16feeb02ab3aa3a31a3d51b5f0044", [ null, {} ] ], "line-clamp-valid.html": [ - "735300c9efe783da28700e082144f01b40c02ac0", + "43de2e01372b7b9909868341ab42d8663b562c85", [ null, {} ] ], "max-lines-invalid.html": [ - "85fe77fdb7a6d88c8f2a170b5f86646e5ee7b39c", + "8b6da0dcb89693dec8f4eb533e01713e800267f0", [ null, {} ] ], "max-lines-valid.html": [ - "f2fda80c3b3d95137e5e0117467cfb267ce3082b", + "431eb5b457367b26414fd9ee89f92aff6de4b130", [ null, {} @@ -519282,21 +519769,21 @@ ] ], "text-overflow-computed.html": [ - "60add5dd12d6435377ab039c4401be1de256ddc4", + "32670db9df33bfb5e17eb38851f2052b0f0cd572", [ null, {} ] ], "text-overflow-invalid.html": [ - "785632a727a5643e13ed25e12d71c6c541969e1a", + "12e65a893607c67d2ecc05b0d6ff714b34ff5954", [ null, {} ] ], "text-overflow-valid.html": [ - "df77dffd6d8bb89334bd676302842e7483851647", + "fbf6a8b15e6a9f09f5e470c357ba39ed598cf74a", [ null, {} @@ -519310,14 +519797,14 @@ ] ], "webkit-line-clamp-invalid.html": [ - "6bb90fa9e1779c09d79b1da04a14ee406fa1833d", + "77cbc99d9fee30706d904c152f0b38157293fb95", [ null, {} ] ], "webkit-line-clamp-valid.html": [ - "8b0e9c49e925713f71b63a5fd3ca1941639be160", + "9e4541ed5ebf7df74377d5a312516c4322d070bb", [ null, {} @@ -519489,6 +519976,24 @@ {} ] ], + "scroll-marker-activation-focus-behaviour-links-mode.tentative.html": [ + "77b0a2527217fa7435a530d6c0a9c8380e45eb64", + [ + null, + { + "testdriver": true + } + ] + ], + "scroll-marker-activation-focus-behaviour-tabs-mode.tentative.html": [ + "dff1b14ab18c7ebd34fc712146e4764d222d132d", + [ + null, + { + "testdriver": true + } + ] + ], "scroll-marker-activation-retains-focus.html": [ "cf38ed354c73d3c5840258f87912a76c50ccebed", [ @@ -524568,6 +525073,13 @@ {} ] ], + "host-part-003.html": [ + "7aac235a043b6c92425e7b8f57c2837a2503e97f", + [ + null, + {} + ] + ], "host-part-nesting.html": [ "c0dc8e20eee9ab3fda124ef99cb7623146b8a321", [ @@ -530594,7 +531106,7 @@ ] ], "text-decoration-computed.html": [ - "5371c42249c77c52da09e01ae75c1414da52db83", + "c0783969ab30346955c4a46190ab836acdcbab51", [ null, {} @@ -530678,7 +531190,7 @@ ] ], "text-decoration-valid.html": [ - "ad82dd203cdfafc5ee5960837a23bf14cd661cf3", + "35fd8f3b906e9ef258bbb859752503fe41670446", [ null, {} @@ -532415,7 +532927,7 @@ ] ], "historical.html": [ - "ceb4dfe56772e26c10b88a01b37470751014bdc7", + "3c8ff65102d540522e54c5b4fb46e0451b5df01f", [ null, {} @@ -532571,7 +533083,7 @@ }, "stylevalue-subclasses": { "cssColorValue.html": [ - "59a03c138d52e5f42c5deee49525ea6a00fada37", + "9a319a51816040ab18f19ef6513815f86667eecc", [ null, {} @@ -532655,7 +533167,7 @@ ] ], "cssRGB.html": [ - "8ec193da4d1ced0169f4b04ec17e3fa55c06f983", + "ecd30d7fd4228a76374fc04ccd5bf0fa78cecef9", [ null, {} @@ -540020,7 +540532,7 @@ ] ], "shorthand-values.html": [ - "f831cba2ca5f9aae6a4d610eeba3bfd42ab4d056", + "861e4f92fa3ccd6391687f9adfd3c1ce89c71e36", [ null, {} @@ -544823,7 +545335,7 @@ ] ], "Document.html": [ - "da2ea0db4ee937c6ef702c7b08632a1a3b3b452d", + "4c5d2eb6e2ee0c580f2490c8a5d7d14f27ca79e0", [ null, {} @@ -545191,7 +545703,7 @@ ] ], "CustomElementRegistry-upgrade.html": [ - "c68bc37df1b04cb451aba83fceb414958149cae3", + "5a5d594959c2f28aad2504610a2fe0457732aa33", [ null, {} @@ -545218,6 +545730,13 @@ {} ] ], + "Document-importNode-cross-document.window.js": [ + "0501e53c1ccb6f621a212bea5439f62d6ce24b87", + [ + "custom-elements/registries/Document-importNode-cross-document.window.html", + {} + ] + ], "Document-importNode.html": [ "89fc0773b5bda78826ff3cfe8a42606b3f725d2d", [ @@ -545260,6 +545779,13 @@ {} ] ], + "adoption.window.js": [ + "6371b368a884eddb7c437c776554318ee046fc81", + [ + "custom-elements/registries/adoption.window.html", + {} + ] + ], "constructor-reentry-with-different-definition.html": [ "ef104ebe4c1df1affe6540dae1138e40b724432e", [ @@ -545281,6 +545807,13 @@ {} ] ], + "global.window.js": [ + "7993ccb93e1c94caf307f025fc9caff15477a583", + [ + "custom-elements/registries/global.window.html", + {} + ] + ], "initial-about-blank.window.js": [ "b3bb7e139b5c543bae2d4cc86d3f5ebe1fe197f1", [ @@ -545303,7 +545836,7 @@ ] ], "scoped-registry-define-upgrade-criteria.html": [ - "9c9b076aa8d615c43fecaa77c62e404739db8cfc", + "f281f7f74429b9fd2de6e02ffb8778f5c79dc4e8", [ null, {} @@ -545316,6 +545849,13 @@ {} ] ], + "scoped-registry-initialize.html": [ + "18dbd0ebeddc0d115d596058fc11d863397c4ee5", + [ + null, + {} + ] + ], "scoped-registry-registry-define-get-etc.html": [ "29e11d97052c0683d92089583957c8217a98fa4f", [ @@ -545345,13 +545885,6 @@ ] ] }, - "scoped-registry-initialize.html": [ - "18dbd0ebeddc0d115d596058fc11d863397c4ee5", - [ - null, - {} - ] - ], "state": { "ElementInternals-states.html": [ "1521a8098a36f0c0339fc1e7dceac12d149de385", @@ -545439,7 +545972,7 @@ ] ], "Document-importNode.html": [ - "9f960127eecf7da66885b433508b9998236f83d5", + "3f49d1f53b38ddf47a0b377c7f0f56404baac200", [ null, {} @@ -545584,134 +546117,141 @@ ] }, "device-bound-session-credentials": { + "allowed-refresh-initiators.https.html": [ + "bef2d55c906d0d7fe5818ba3d8fbbde1f5146ad1", + [ + null, + {} + ] + ], "clear-site-data.https.html": [ - "94f2d96a358138054c427360d3301f875496876c", + "ba76a901662b37bc7ca047c52f6469194294367a", [ null, {} ] ], "create-session.https.html": [ - "13e17de37441b4d86b98787718af6477fd27604f", + "1ed8ac5e8e20a32d130d074e37eaf4948fe55d8b", [ null, {} ] ], "credentials-matching.https.html": [ - "28af9153db41aa04b9cba84903b3b75c7986be33", + "cdbfa6704597c16445f0300be153b63745b29abf", [ null, {} ] ], "debug-header.https.html": [ - "4f384bf11952babc676d3ae23c6ec291aa736862", + "b3e09e7fe095f7ced76c341441490d530aa79dac", [ null, {} ] ], "fetch-no-credentials.https.html": [ - "4cac685727ad29cd96be041753623cbc4fdd1be6", + "bd87e688648750875bf312b123c5bcd5293b60bb", [ null, {} ] ], "include-site.https.html": [ - "6eaf522c73ba6d6378c60f8460fb3497cd8df424", + "3441acfc625f9e7859388d269629f9c88835fb14", [ null, {} ] ], "multiple-credentials.https.html": [ - "57fe9294a7737d5817d127baa29f445bfdd3d1cb", + "54fc182b7276d44096f37d8435833fa4032cc96e", [ null, {} ] ], "multiple-registrations.https.html": [ - "ef024bd0c77a3ae432d382d8bacb694e054f250f", + "fb0ce500aa4cd764ec3f9d3a7aeeaf059a926fe0", [ null, {} ] ], "not-secure-connection.html": [ - "b2c99b139c8d983dfdf498a6c28aab2f1540b218", + "9bc736f1b421409b5188c9a3fd44bed2538bf38d", [ null, {} ] ], "refresh-does-not-send-challenge.https.html": [ - "d882cfe571751191184c442d737bc33260feb225", + "a53245c590b905978df79e8b16e4172d4d3978f2", [ null, {} ] ], "refresh-replaces-config.https.html": [ - "d9e8ff27ebbfe5b057eeffbd761f1d9981cc3e13", + "74264888075c44c52e65855fc69ad652706a4fb9", [ null, {} ] ], "refresh-with-continue-false.https.html": [ - "7814a49687c5441d7a552bb4329744822d78d5aa", + "1953af5c0d29ad10a5b81e5732bb31c2d222f874", [ null, {} ] ], "registration-sends-challenge.https.html": [ - "d95fa429153219fdafe5cdc8ca33a4cf62d2601a", + "ab8d033afac166730edafe4f124928b5cf048e16", [ null, {} ] ], "resolving-urls.https.html": [ - "79f1594ba71914fd672a4065374c554820d749c1", + "bb10cf52ee17fff4c67f03e1d5546c377fc01b2f", [ null, {} ] ], "session-cookie-has-no-attributes.https.html": [ - "734b4d1a69e636ceecfbbd92280dd5a9962011bd", + "5bf07abcac1c880dac4ecd772fc94449f2599905", [ null, {} ] ], "set-authorization.https.html": [ - "26969d40b75950361cbc0cb46c13aff607dd5640", + "7e2d8a0819bdc613d984cf05a0de86c49c265016", [ null, {} ] ], "set-early-challenge.https.html": [ - "a6d032f9fe1ec13617f39bd180b68b7642d01d60", + "22166c86ffe5c40762276cf5ec1091dbee876c8f", [ null, {} ] ], "set-scope-origin.https.html": [ - "817d5cdaf7f94bf0735fd0ede7aaab03b12e1c3e", + "f56778a9e5786e51f1c77a4c8447d71dc8c61676", [ null, {} ] ], "set-scope-specification.https.html": [ - "8ec125d7aa481f2e6d90bd5e6bd7d460d40bec25", + "5a36831f6dd73398e1373a7e2971ea133e20b5a7", [ null, {} @@ -572313,7 +572853,7 @@ ] ], "fedcm-auto-selected-flag.https.html": [ - "471f02a9d2c56bdcc2f94d7e5208f1c2a19de94a", + "d06aba73bc1de9a9b6e238695587c1ff47480de3", [ null, { @@ -644769,6 +645309,13 @@ {} ] ], + "patch-all.html": [ + "437a071cd8246629800a8d3a7ee6629658a7a3f7", + [ + null, + {} + ] + ], "patch-event.html": [ "e4a66254c65da6d3649a178519fcb3d0db6d7b1d", [ @@ -644776,6 +645323,13 @@ {} ] ], + "patch-self.html": [ + "e5938b69554929a91caafdfefcbef469ee0e8555", + [ + null, + {} + ] + ], "patching-pseudo.html": [ "7724d2e1f260b2d9c8976a5beccd8952dd829c89", [ @@ -644783,6 +645337,13 @@ {} ] ], + "patchsrc.html": [ + "5b2f319fa342efc9dd1d07ee5a2dd46e91504ab2", + [ + null, + {} + ] + ], "template-patchfor-innerHTML-ambiguous.html": [ "f83395850de49835ddfda11449ebf52c9a49d9fa", [ @@ -644811,6 +645372,20 @@ {} ] ], + "template-patchfor-script-eval.html": [ + "04426e11714fbf5e80b09dd31a496d5c4841562d", + [ + null, + {} + ] + ], + "template-patchfor-script-plaintext.html": [ + "7e90fdc9d6078c172bb78790f7d285a39f123277", + [ + null, + {} + ] + ], "template-patchfor-shadow-nested.html": [ "e99d8b8e9e0732b7861f7f6667040c98d7ac72da", [ @@ -644825,8 +645400,15 @@ {} ] ], + "template-patchfor-style-plaintext.html": [ + "1b6db2d7cfd370559f40de3997ebab2e8117dd54", + [ + null, + {} + ] + ], "template-patchfor.html": [ - "82ff12445fa611987f47d66e3143e8ebe343810f", + "0b54a7458da98d5bfbb29fde3751cf4253cd552f", [ null, {} @@ -645679,7 +646261,7 @@ ] ], "023.html": [ - "4765d792f40145b0479c6f1226f46562288b6b31", + "7109fde453ba6258e8600dda858ddf7583f6a6c7", [ null, { @@ -645688,7 +646270,7 @@ ] ], "024.html": [ - "0e695cf1df1adb330fb1b537481bd6e94d60aad5", + "f2814ced61e99d236a8a29140257e0059a131fd3", [ null, { @@ -656686,6 +657268,15 @@ } ] ], + "radio-focused-and-scrolled-into-view.html": [ + "b6584d835e8e5325db35aaeac149b88230b21997", + [ + null, + { + "testdriver": true + } + ] + ], "radio-groupname-case.html": [ "3c54aca3e76bafe4c409ed33b7833dc982fea693", [ @@ -664188,6 +664779,13 @@ {} ] ], + "a-type.historical.html": [ + "a6ded3b43062ba489e0af0b11e7bd5d919e5229e", + [ + null, + {} + ] + ], "a.text-getter-01.html": [ "e0bb73be0ff0ca65efc6542e24c3c4f161d222fe", [ @@ -674587,14 +675185,14 @@ ] ], "web-font-styled-text-resize-swap-subnode.html": [ - "eca5f3590f3b1b84c8a1f4bbd22876ebcf8a26d0", + "bd368d66e047499a9e2eeee49596b8a87c33b8a4", [ null, {} ] ], "web-font-styled-text-resize-swap.html": [ - "61c00fad20a375bb22338b24d7814fcc0832edac", + "a2250e8d9fbcc9171fa724c4b6933bdab0f4d372", [ null, {} @@ -677350,7 +677948,7 @@ ] ], "space-like-003.html": [ - "5b693fb3c900a7161ac91934ea385f787ac738ed", + "649dbe299710e6b16a9eb977633942be6ea1fdd5", [ null, {} @@ -682800,7 +683398,7 @@ }, "focus-reset": { "autofocus.html": [ - "60444473673bb8a082d277106a13d70b5a33e0e1", + "c40e2f68f11ee1d3147bcfaf1e2dd74e93f399a5", [ null, {} @@ -713111,7 +713709,7 @@ ] ], "authentication-accepted.https.html": [ - "4d8152b816b207c714283040dc63cb5f364d367a", + "58b251010a900753e1a949f9dd4634704460ccfe", [ null, { @@ -713173,6 +713771,15 @@ } ] ], + "authentication-invalid-payment-entity-logo.https.html": [ + "e229fb2e0d8f3d843a1c8e0b5576ac33772a5213", + [ + null, + { + "testdriver": true + } + ] + ], "authentication-optout.https.html": [ "a69e0a456a7558825a451c1cd600ab9843fca38f", [ @@ -713201,7 +713808,7 @@ ] ], "constructor-validate-payment-method-data.https.html": [ - "ecf432b2857f7f44e13c1ac95e573e852ddb4025", + "5d34f68fafb4d23479dc8393d88a5f6df8454576", [ null, { @@ -725412,7 +726019,7 @@ ] ], "partitioned-estimate-usage-details-caches.tentative.https.sub.html": [ - "dc2af7c213c549534f23929bbea210527d1a1f99", + "0856648324471c11d165b5673a896ce15c0799ac", [ null, {} @@ -740446,7 +741053,7 @@ ] ], "svg-get-bounding-client-rect-in-non-rendered-elements.html": [ - "41f3fb6bc906b05a2537af20ca1eacb6a4c41935", + "c45542d2a25c9e2a325f7408d32a1b7bcb57624c", [ null, {} @@ -760338,7 +760945,7 @@ ] ], "setting-the-start-time-of-an-animation.html": [ - "fee3f1e0de7940beeb46178080c2638454a4af29", + "6dabf07d8f419eb7927c2e124cff3256be0ddb70", [ null, {} @@ -763404,7 +764011,7 @@ }, "the-channelsplitternode-interface": { "audiochannelsplitter.html": [ - "954c71a96b288530e6c22878fed7a91f42091dc2", + "9cb2ab5a4ab9601150cd278bc386e50fa6efa0fb", [ null, {} @@ -763698,7 +764305,7 @@ ] ], "iirfilter-getFrequencyResponse.html": [ - "c98555f1610693abaa0bbe858e826bd1f776fb5b", + "eeb4af34f7d439db5b5cba8ee449d234a495f445", [ null, {} @@ -775393,7 +776000,7 @@ "webnn": { "conformance_tests": { "abs.https.any.js": [ - "ea4370c84dc84733290de06391c76f21b2945a37", + "20e260b45b47f8c0b9a54f63aca1aebe6e11eb31", [ "webnn/conformance_tests/abs.https.any.html?cpu", { @@ -775504,7 +776111,7 @@ ] ], "add.https.any.js": [ - "5a370de82cc726836ceb5f99075a92b9e24626dd", + "8fa8176f6517583f049ca91e436564d1155f86a9", [ "webnn/conformance_tests/add.https.any.html?cpu", { @@ -775615,7 +776222,7 @@ ] ], "arg_min_max.https.any.js": [ - "f0d38cbff82bc89e0fb552583d1ab6d19307b6c3", + "33105b7e7ba7d562a4148755d425a0183bb0dfb0", [ "webnn/conformance_tests/arg_min_max.https.any.html?cpu", { @@ -775726,7 +776333,7 @@ ] ], "averagePool2d.https.any.js": [ - "c112cd89c036a5961d8e6b55a35c3581651e168c", + "3637f50d75de6016a1207cad18cc4a0ec5e47519", [ "webnn/conformance_tests/averagePool2d.https.any.html?cpu", { @@ -775837,7 +776444,7 @@ ] ], "batch_normalization.https.any.js": [ - "b559cbc26d4d2dda5dfd57307a03fb48f9980f43", + "dd23ccec530723e330168580fa5cacd2c95956c4", [ "webnn/conformance_tests/batch_normalization.https.any.html?cpu", { @@ -776431,7 +777038,7 @@ ] ], "cast.https.any.js": [ - "8fd62981f521f4604a94b4a1d94e91c5bcbe05ba", + "0219420bb8dc9dc33cd172d77fa34ae3afc5c139", [ "webnn/conformance_tests/cast.https.any.html?cpu", { @@ -776542,7 +777149,7 @@ ] ], "ceil.https.any.js": [ - "7d487dd65fa708e2a94c83a7278d7693359075bf", + "20d8a4d188e2efdb28ab1a0fe65fe5307fd6e82c", [ "webnn/conformance_tests/ceil.https.any.html?cpu", { @@ -776653,7 +777260,7 @@ ] ], "clamp.https.any.js": [ - "ebcec4233963c3c8ea23adfc6703856a589d2b30", + "cf77b67aa0e981e9e8aa37554f4921ca410a71d8", [ "webnn/conformance_tests/clamp.https.any.html?cpu", { @@ -776764,7 +777371,7 @@ ] ], "concat.https.any.js": [ - "aaecaecc9eb2166658c0e1115265aef9d3d768f5", + "821a85e700e759755dc8b30ad5e4e935cd0f441a", [ "webnn/conformance_tests/concat.https.any.html?cpu", { @@ -776875,7 +777482,7 @@ ] ], "constant-reshape-optimization.https.any.js": [ - "eaa232b7413ebd132509ae9a605d3f5e49dc8d17", + "3428772ecd04f0f1b8b6f1ef862166964ee6db7f", [ "webnn/conformance_tests/constant-reshape-optimization.https.any.html?cpu", { @@ -776986,7 +777593,7 @@ ] ], "conv2d.https.any.js": [ - "45fecb2b40cc399ace227264e881d2009d467cd2", + "9962f210e949e7426b2cbbd0dea82c46b204024c", [ "webnn/conformance_tests/conv2d.https.any.html?cpu", { @@ -777097,7 +777704,7 @@ ] ], "conv_transpose2d.https.any.js": [ - "a17df911e4482de7e49874d84f5818694515e722", + "4e5525a8fb3d8f7fa89b341ea06dc07b18f194e2", [ "webnn/conformance_tests/conv_transpose2d.https.any.html?cpu", { @@ -777208,7 +777815,7 @@ ] ], "cos.https.any.js": [ - "6926962d543fa9651d2b7ae8935799641f06ea88", + "780474923425e6ea6954ec8c97f9e2eabe7fb5df", [ "webnn/conformance_tests/cos.https.any.html?cpu", { @@ -777319,7 +777926,7 @@ ] ], "cumulative_sum.https.any.js": [ - "34a625152b26a3183a7cd62c38883a684ac93908", + "4264b14e366cae9188556a018020b29e42f5a776", [ "webnn/conformance_tests/cumulative_sum.https.any.html?cpu", { @@ -777430,7 +778037,7 @@ ] ], "dequantizeLinear.https.any.js": [ - "85f51e173901eda7608207f484c2d50c2d2116ca", + "9ac74fc22402ba40753495b08685faf6c427891c", [ "webnn/conformance_tests/dequantizeLinear.https.any.html?cpu", { @@ -777541,7 +778148,7 @@ ] ], "div.https.any.js": [ - "1914c4829c47a622881d84f69f6c445cc1a37da4", + "8749f9f68c42a9e7c7ce9ad74230a3220d43a6e2", [ "webnn/conformance_tests/div.https.any.html?cpu", { @@ -777652,7 +778259,7 @@ ] ], "elu.https.any.js": [ - "09cb0a99115f4089aa82ea6bcb978e9ff6c3c853", + "b96929868161a097c2da831d5835dae169c9050d", [ "webnn/conformance_tests/elu.https.any.html?cpu", { @@ -777763,7 +778370,7 @@ ] ], "equal.https.any.js": [ - "33d27cf74b15a84fd672f9793d0c5b53c58d320c", + "c2badc5a33743c064741e97d279472581472f2d3", [ "webnn/conformance_tests/equal.https.any.html?cpu", { @@ -777874,7 +778481,7 @@ ] ], "erf.https.any.js": [ - "0c97253eb13e16d628b0937940c9d965f6e887d8", + "752623b7bd2aded12be80cb9fc5e728844a992b1", [ "webnn/conformance_tests/erf.https.any.html?cpu", { @@ -777985,7 +778592,7 @@ ] ], "exp.https.any.js": [ - "0f9b648cb9bf6a088e6aeac8240816c01c8d65f2", + "179d0e954a2345b2347ba24bff795c846f7ec611", [ "webnn/conformance_tests/exp.https.any.html?cpu", { @@ -778096,7 +778703,7 @@ ] ], "expand.https.any.js": [ - "f9040f25e47912928035dd9aee525334756b0002", + "b17c9c665a8693262f7f391bbd7a212576c1e6e7", [ "webnn/conformance_tests/expand.https.any.html?cpu", { @@ -778207,7 +778814,7 @@ ] ], "floor.https.any.js": [ - "50eaa31aee9f85b9923fdb4413879b186f7982de", + "ccb0be896c7da57725b4656ef9bd09c1736ec216", [ "webnn/conformance_tests/floor.https.any.html?cpu", { @@ -778318,7 +778925,7 @@ ] ], "gather.https.any.js": [ - "7f3c9c113583fb345c781e93682006c77caf3ecc", + "08a14f3baf25cb60dcf7677428cc50f854da57bf", [ "webnn/conformance_tests/gather.https.any.html?cpu", { @@ -778429,7 +779036,7 @@ ] ], "gatherElements.https.any.js": [ - "2b13f59678055b377ef243f442088abc718c5474", + "565332aa67244556c26cf25bd883c5bc2687a3a3", [ "webnn/conformance_tests/gatherElements.https.any.html?cpu", { @@ -778540,7 +779147,7 @@ ] ], "gatherND.https.any.js": [ - "41e1bc78790a439dc46efdccfefa32ce4ab4997a", + "434410f1a20e3d2cbb672a35421315839a87a0fc", [ "webnn/conformance_tests/gatherND.https.any.html?cpu", { @@ -778651,7 +779258,7 @@ ] ], "gelu.https.any.js": [ - "23b70f1eddf0ad6ed00468b0f48e6041554dc9db", + "9c06af3eb563dcb40ccfa3bbc5ea8ca3f3afdb55", [ "webnn/conformance_tests/gelu.https.any.html?cpu", { @@ -778762,7 +779369,7 @@ ] ], "gemm.https.any.js": [ - "b24c806e2849c13e2a489765a84256e48d776373", + "f9f15d65a644018b641e6007065157d20c829612", [ "webnn/conformance_tests/gemm.https.any.html?cpu", { @@ -778984,7 +779591,7 @@ ] ], "greater.https.any.js": [ - "bf6f884588518cdadc7a656a16246cc574a06eac", + "26723c191126913b9dc88684973c8ac8a697a811", [ "webnn/conformance_tests/greater.https.any.html?cpu", { @@ -779095,7 +779702,7 @@ ] ], "greater_or_equal.https.any.js": [ - "7dffe0980eaa31c262549e94e7c264f92431c507", + "18f6b0c0b5bdcd878176d8438f96a6d690d2ef86", [ "webnn/conformance_tests/greater_or_equal.https.any.html?cpu", { @@ -779206,7 +779813,7 @@ ] ], "gru.https.any.js": [ - "4118643044f9255535fbc5bd2352486b37039108", + "06ff4a5d344be1741309a3785a9bca78d78a9da1", [ "webnn/conformance_tests/gru.https.any.html?cpu", { @@ -779317,7 +779924,7 @@ ] ], "gru_cell.https.any.js": [ - "4e7452033a069fdaad0dec875b873a5961f15513", + "8d2c5992bae020124da1ca601041ba4f78aed6d1", [ "webnn/conformance_tests/gru_cell.https.any.html?cpu", { @@ -779428,7 +780035,7 @@ ] ], "hard_sigmoid.https.any.js": [ - "b5f6fd0c97aa71d8bb75b466dd72526724681060", + "5ad5a815dce41b71ebe8238739ca4546c3da51dc", [ "webnn/conformance_tests/hard_sigmoid.https.any.html?cpu", { @@ -779539,7 +780146,7 @@ ] ], "hard_swish.https.any.js": [ - "e49ea6fd719f17aea3c58c7ed78c0bbad3685399", + "02d902cea2523bb5df9763da670c61fe5a0589d7", [ "webnn/conformance_tests/hard_swish.https.any.html?cpu", { @@ -779650,7 +780257,7 @@ ] ], "identity.https.any.js": [ - "be645fd8966dae9134f5bbc8282b79a821753012", + "a68d0be7cd40fb7f200de84b33fb5a9e38b5ff2f", [ "webnn/conformance_tests/identity.https.any.html?cpu", { @@ -780631,7 +781238,7 @@ ] ], "instance_normalization.https.any.js": [ - "2766f914b3dd66ef5f8120642bfaf30dc3a052fa", + "0011a970c67cbdd1fe1ca5c3db52ce502dfc0d30", [ "webnn/conformance_tests/instance_normalization.https.any.html?cpu", { @@ -780742,7 +781349,7 @@ ] ], "l2Pool2d.https.any.js": [ - "f0e16be927bd637fbebd4eb3a63a4fba237e0e8d", + "bb4d3d79723af9d41f1d220e0922441857d21441", [ "webnn/conformance_tests/l2Pool2d.https.any.html?cpu", { @@ -780853,7 +781460,7 @@ ] ], "layer_normalization.https.any.js": [ - "f22d0444cfa79285cc9860b7b5a75a7cdfb0f18e", + "d0f4f9ac5f5fa7476c2430f69bdd49f5d98fb005", [ "webnn/conformance_tests/layer_normalization.https.any.html?cpu", { @@ -780964,7 +781571,7 @@ ] ], "leaky_relu.https.any.js": [ - "03c8985c6c64e12b8aca59caf071493c7daefa61", + "44ba712633141af631aeab44fd46371354d260de", [ "webnn/conformance_tests/leaky_relu.https.any.html?cpu", { @@ -781075,7 +781682,7 @@ ] ], "lesser.https.any.js": [ - "0238a00fca103f571af7c7d296b70ba61f0e1864", + "d39c85b0a87f36a53c1e1790f8cc6035f41cc0f5", [ "webnn/conformance_tests/lesser.https.any.html?cpu", { @@ -781186,7 +781793,7 @@ ] ], "lesser_or_equal.https.any.js": [ - "e268dd4d762091758e91d3ddfb8f3e80c5927f7a", + "dfdb7bc964db3474f938671a521fa4c7f6010760", [ "webnn/conformance_tests/lesser_or_equal.https.any.html?cpu", { @@ -781297,7 +781904,7 @@ ] ], "linear.https.any.js": [ - "1f13fe170d46fa157035bd6e14de6eb68462c7a4", + "794981d1f5f7d915dec09aafdff9016bc235d9ee", [ "webnn/conformance_tests/linear.https.any.html?cpu", { @@ -781408,7 +782015,7 @@ ] ], "log.https.any.js": [ - "8ed807b3401330e961f2ae9721f6378147580ddd", + "055d600e2e13952adba394639fdb949227f13052", [ "webnn/conformance_tests/log.https.any.html?cpu", { @@ -781519,7 +782126,7 @@ ] ], "logical_and.https.any.js": [ - "40ba45df42d47d4dfe3f7d174703ba0831aa76f2", + "823771c5c5d65936c7bc9f42cd40ca13717330f8", [ "webnn/conformance_tests/logical_and.https.any.html?cpu", { @@ -781630,7 +782237,7 @@ ] ], "logical_not.https.any.js": [ - "5b0b8da43da233886d73f6c3b21efc382c967162", + "63bea6fba64ed596f1539c3ccce5a58dafe26ee4", [ "webnn/conformance_tests/logical_not.https.any.html?cpu", { @@ -781741,7 +782348,7 @@ ] ], "logical_or.https.any.js": [ - "587a56710a73be7810f691a9dcd1737c1f377f6a", + "60c594233c2d8e428b357fad70688d8993a08a4b", [ "webnn/conformance_tests/logical_or.https.any.html?cpu", { @@ -781852,7 +782459,7 @@ ] ], "logical_xor.https.any.js": [ - "423d36db2ccedb76ef986ca3ef20e1de5ea26bc7", + "af5b5dfd06e9c6dfa36c291584bc07049465f5d5", [ "webnn/conformance_tests/logical_xor.https.any.html?cpu", { @@ -781963,7 +782570,7 @@ ] ], "lstm.https.any.js": [ - "74e8cfb7b0cedd87a64d2bd45666b297f24e6c69", + "8c0ed856055bb27ab796c1643fe79dc9e59c3363", [ "webnn/conformance_tests/lstm.https.any.html?cpu", { @@ -782074,7 +782681,7 @@ ] ], "lstm_cell.https.any.js": [ - "a1d97ddff4247567276292885c21dcfde6e3f24b", + "345c516fdd75411fae990d5d738e3cfd1562c269", [ "webnn/conformance_tests/lstm_cell.https.any.html?cpu", { @@ -782185,7 +782792,7 @@ ] ], "matmul.https.any.js": [ - "f452d59e4a8096621d39b955bd98ef41d8c2bbc8", + "f5f79e3aadc21c30dfacdf693bd9e4d8c6753bc6", [ "webnn/conformance_tests/matmul.https.any.html?cpu", { @@ -782296,7 +782903,7 @@ ] ], "max.https.any.js": [ - "bbea2391a3e3a6b2491b6bcc5ba7db79da60e010", + "07d600a71f24bd76e8b001f813281d56b4d4b7c6", [ "webnn/conformance_tests/max.https.any.html?cpu", { @@ -782407,7 +783014,7 @@ ] ], "maxPool2d.https.any.js": [ - "6ee8b1976d27b3a7418ccdf9fea56a7ee62e1052", + "6fecb3bf979e87a072e739e47bc448c0fe59c174", [ "webnn/conformance_tests/maxPool2d.https.any.html?cpu", { @@ -782518,7 +783125,7 @@ ] ], "min.https.any.js": [ - "3abd2e63fbb85fd34fc91415e4b1229317e7525f", + "41e8e43eb4f6a048dbca328e236c3457ca7df395", [ "webnn/conformance_tests/min.https.any.html?cpu", { @@ -782629,7 +783236,7 @@ ] ], "mlNumber.https.any.js": [ - "643d09b767c8528e921bd714a1beabeaf4beeb83", + "df7781837761bb2b7d8afb7a3070a0dd9c2d735a", [ "webnn/conformance_tests/mlNumber.https.any.html?cpu", { @@ -782740,7 +783347,7 @@ ] ], "mul.https.any.js": [ - "f8606849dd42aa96f5a8c5bf3a28ba05d3634956", + "a026584db94d99d1d3a6b957afb7215bfcc1eaed", [ "webnn/conformance_tests/mul.https.any.html?cpu", { @@ -782851,7 +783458,7 @@ ] ], "neg.https.any.js": [ - "5c5045d355ef1a0f2e7abab561cf48e848189a59", + "02ce39617f8086c75aa5098f0f5e14b4dfb25778", [ "webnn/conformance_tests/neg.https.any.html?cpu", { @@ -782962,7 +783569,7 @@ ] ], "not_equal.https.any.js": [ - "e7440799b6eb8bec1cccd3dd1eece1fbf9a5ab83", + "ee4f2ded8ea9e2972cf5eccb229d03edfa588172", [ "webnn/conformance_tests/not_equal.https.any.html?cpu", { @@ -783073,7 +783680,7 @@ ] ], "pad.https.any.js": [ - "ad334675a64e284e7c0e073c5a508413e1515e49", + "67fb9118969b4fd90106e0d56d8f5731eb1dd52c", [ "webnn/conformance_tests/pad.https.any.html?cpu", { @@ -783619,7 +784226,7 @@ ] ], "pow.https.any.js": [ - "f51feca4eacae6a0a36bd6125e78bb889aac011d", + "cf895f4c47ab5770d6a5a97ff47040438f7d64c4", [ "webnn/conformance_tests/pow.https.any.html?cpu", { @@ -783730,7 +784337,7 @@ ] ], "prelu.https.any.js": [ - "cc6e0052e28dd36a0862a8d02815211ad43d9bff", + "5f64ff60c768554039eb2a82b6c0b5fb838dfd33", [ "webnn/conformance_tests/prelu.https.any.html?cpu", { @@ -783841,7 +784448,7 @@ ] ], "qdq_subgraph.https.any.js": [ - "8c81447daebe54ef5ba0882254c99ff47125f819", + "0e747e761ef2b052520d3bcb38e9b64385499502", [ "webnn/conformance_tests/qdq_subgraph.https.any.html?cpu", { @@ -784276,7 +784883,7 @@ ] ], "quantizeLinear.https.any.js": [ - "7ba2fd4b4c525428c282c76743127cc4ed6e8a75", + "95b43b51d97570026a964956636c922e133fa0ec", [ "webnn/conformance_tests/quantizeLinear.https.any.html?cpu", { @@ -784387,7 +784994,7 @@ ] ], "reciprocal.https.any.js": [ - "f21ec78f850e1922eff65c55bd76b6465e7b413d", + "40a17940d0d99363c8a2b265b4cc8b58b908892d", [ "webnn/conformance_tests/reciprocal.https.any.html?cpu", { @@ -784498,7 +785105,7 @@ ] ], "reduce_l1.https.any.js": [ - "d59909f50c17d38bb4bd77a8fa14208e815d3aa7", + "9465777f206171392f0027460d86cd596327b466", [ "webnn/conformance_tests/reduce_l1.https.any.html?cpu", { @@ -784609,7 +785216,7 @@ ] ], "reduce_l2.https.any.js": [ - "9ccd350772d95e26e45ea65b5baf8e022b476545", + "2a4e94abe943a506787f179e6764709376bacf7c", [ "webnn/conformance_tests/reduce_l2.https.any.html?cpu", { @@ -784720,7 +785327,7 @@ ] ], "reduce_log_sum.https.any.js": [ - "714ba1c8b5f74f9ca30fb47569294b049851a58c", + "6d98832c072d24b5ad8bc588e6b25c465807300a", [ "webnn/conformance_tests/reduce_log_sum.https.any.html?cpu", { @@ -784831,7 +785438,7 @@ ] ], "reduce_log_sum_exp.https.any.js": [ - "298e143af9c55133724b8f53fefcc82ac968979e", + "6770b74475d0505f24696360ba5185668a4ce105", [ "webnn/conformance_tests/reduce_log_sum_exp.https.any.html?cpu", { @@ -784942,7 +785549,7 @@ ] ], "reduce_max.https.any.js": [ - "659641c5c5f28845ef80b98127d296e131937346", + "dc08e1c8c82b6078cda51e85f246db25ee9d72e0", [ "webnn/conformance_tests/reduce_max.https.any.html?cpu", { @@ -785053,7 +785660,7 @@ ] ], "reduce_mean.https.any.js": [ - "4851e51674c1b5de93cad461386676871bc62f9d", + "a402c253bd9c7b13904e5ee6f2299c2dc69b8b48", [ "webnn/conformance_tests/reduce_mean.https.any.html?cpu", { @@ -785164,7 +785771,7 @@ ] ], "reduce_min.https.any.js": [ - "42fc3e464d27d89229247d0d437828037b5aceac", + "8e1604558c85e5657a9cbd5ddbfb720ac92b7cb9", [ "webnn/conformance_tests/reduce_min.https.any.html?cpu", { @@ -785275,7 +785882,7 @@ ] ], "reduce_product.https.any.js": [ - "17ee27ed0e980db142d61fa4344190c7fa35e4db", + "cb1f16de53c2115e5e5e6f7fada76d3c94e4c621", [ "webnn/conformance_tests/reduce_product.https.any.html?cpu", { @@ -785386,7 +785993,7 @@ ] ], "reduce_sum.https.any.js": [ - "1d6f944f6166d10ab4aaa5862d46d693f68fcbc1", + "d4120ac88a2bc63e1ca53eb6979c1eee09cb75ae", [ "webnn/conformance_tests/reduce_sum.https.any.html?cpu", { @@ -785497,7 +786104,7 @@ ] ], "reduce_sum_square.https.any.js": [ - "73762e4b8dc877bf26ef5ff2c4b083a9150a389e", + "167f4f3a0ae59071bd972bdcc7357ba44297def2", [ "webnn/conformance_tests/reduce_sum_square.https.any.html?cpu", { @@ -785608,7 +786215,7 @@ ] ], "relu.https.any.js": [ - "05e9e32bf85aeaded7978198f3d965b8075aa797", + "d6fda23369d5dfd959c7fcbc9e359f238170167d", [ "webnn/conformance_tests/relu.https.any.html?cpu", { @@ -785719,7 +786326,7 @@ ] ], "resample2d.https.any.js": [ - "fe50b8ccb77b20d22b39c0469320861af3ca1910", + "7872bd247edf3a4586029ff2c3c40bf2a4d1d3d6", [ "webnn/conformance_tests/resample2d.https.any.html?cpu", { @@ -785830,7 +786437,7 @@ ] ], "reshape.https.any.js": [ - "e54d0f60be2f9f5542aef1821c17f9ffad132a83", + "d9fa87fa2f7b23ccaf690a69948df103bfde263c", [ "webnn/conformance_tests/reshape.https.any.html?cpu", { @@ -785941,7 +786548,7 @@ ] ], "reverse.https.any.js": [ - "3b1d8bf7efe0aa573a174e9aead1b31672982c20", + "9d6fccad266f5497e07ed73abba0df631bd84bc9", [ "webnn/conformance_tests/reverse.https.any.html?cpu", { @@ -786487,7 +787094,7 @@ ] ], "scatterElements.https.any.js": [ - "e76494b2f2f6469c33b0319ba13e677cd4fdefa3", + "a388ad13b99ab4532d46e059a488216421cf6147", [ "webnn/conformance_tests/scatterElements.https.any.html?cpu", { @@ -786598,7 +787205,7 @@ ] ], "scatterND.https.any.js": [ - "93b5ca52aa2de12850a43590fab77c446a266fc2", + "919639bc028c7ccf60ddca7dcb23bb7b102a9868", [ "webnn/conformance_tests/scatterND.https.any.html?cpu", { @@ -787072,7 +787679,7 @@ ] ], "sigmoid.https.any.js": [ - "7474fe98f654af81f053bb7bd3df383bfc62d753", + "a8a310e141e60b2398b7d983f406ab30d4158456", [ "webnn/conformance_tests/sigmoid.https.any.html?cpu", { @@ -787183,7 +787790,7 @@ ] ], "sign.https.any.js": [ - "004c03bdf1339d74a84c95d5b03b31b56876d0fe", + "d61ce38dedbef5b80457d400e98052e66038db28", [ "webnn/conformance_tests/sign.https.any.html?cpu", { @@ -787294,7 +787901,7 @@ ] ], "sin.https.any.js": [ - "a6148529b9956e06b86e6d87afb6f4839e111ee1", + "1f9a5eaac540218dce2a415ab87b34ac8c2bb6cf", [ "webnn/conformance_tests/sin.https.any.html?cpu", { @@ -787405,7 +788012,7 @@ ] ], "slice.https.any.js": [ - "7603e47c699a7163d740988a9d41f03fc5601b62", + "b1a30fc8106d96600703f1afc93e16d896ff2795", [ "webnn/conformance_tests/slice.https.any.html?cpu", { @@ -787516,7 +788123,7 @@ ] ], "softmax.https.any.js": [ - "33c2e1db9efd23499a0ea12826916b8a8b8a69b7", + "2d9f28dbf6a335f0961d2ff9c53750801a6af95f", [ "webnn/conformance_tests/softmax.https.any.html?cpu", { @@ -787627,7 +788234,7 @@ ] ], "softplus.https.any.js": [ - "36386c03378eabe3dd2baecb2cf6c46d92cadcc1", + "ba8b8f3001827f34b5186dd11b6bddf1117126bb", [ "webnn/conformance_tests/softplus.https.any.html?cpu", { @@ -787738,7 +788345,7 @@ ] ], "softsign.https.any.js": [ - "cf06bbc4fdb8c5e57d247955ba53a5dca7597941", + "9c7c4d10774221f622273e2d913165e881213713", [ "webnn/conformance_tests/softsign.https.any.html?cpu", { @@ -787849,7 +788456,7 @@ ] ], "split.https.any.js": [ - "925ba6244d03963fd64d14663d6d81fe3e8f3742", + "a6695e202d488c9079e81236efa20476120fd13b", [ "webnn/conformance_tests/split.https.any.html?cpu", { @@ -787960,7 +788567,7 @@ ] ], "sqrt.https.any.js": [ - "57cf5e89168ae8f9bfe30466e2dd395bc501caf1", + "f56dde65a1a18ac2319c6d2aa9f011d0c98ffbcb", [ "webnn/conformance_tests/sqrt.https.any.html?cpu", { @@ -788071,7 +788678,7 @@ ] ], "sub.https.any.js": [ - "31d5e9fb9f70ff4ffcf0a14dfa8ad883325f1e6a", + "d93acf5e30e7eb04360268735eba1c589bee64eb", [ "webnn/conformance_tests/sub.https.any.html?cpu", { @@ -788182,7 +788789,7 @@ ] ], "subgraph.https.any.js": [ - "8a0b7faa92f938282c7a6bb02ac61ef6730f021d", + "dd361692d3fdcbe0e585410a90c8aed60f3db312", [ "webnn/conformance_tests/subgraph.https.any.html?cpu", { @@ -788617,7 +789224,7 @@ ] ], "tan.https.any.js": [ - "054be65be8060c14d8e219e847b95969a08168b1", + "79194b34dd022ff33b2d4334f3954fe24126c309", [ "webnn/conformance_tests/tan.https.any.html?cpu", { @@ -788728,7 +789335,7 @@ ] ], "tanh.https.any.js": [ - "88d48e9eb79c8ef2306c262a0c10d1685b97aa54", + "6d61fd5d388712c17ab02ab6dbba26b9072ef359", [ "webnn/conformance_tests/tanh.https.any.html?cpu", { @@ -789322,7 +789929,7 @@ ] ], "tile.https.any.js": [ - "3e4ea39653b4fbd1dbc91f725a012c82dd86f62c", + "fae0c07ccdaffb8f6a91a8f6ac6400bbef628257", [ "webnn/conformance_tests/tile.https.any.html?cpu", { @@ -789433,7 +790040,7 @@ ] ], "transpose.https.any.js": [ - "27b7e743e800aae3a022bc7eebc55a948a4bc08a", + "e50317dcab941b0eb3ca54ffb511b924390b3a40", [ "webnn/conformance_tests/transpose.https.any.html?cpu", { @@ -789544,7 +790151,7 @@ ] ], "triangular.https.any.js": [ - "8006672f17d47da162864f0591028cabb1ed1c64", + "2e5ea0ddfffb8895994d7f1efb73a9625cbdb1f0", [ "webnn/conformance_tests/triangular.https.any.html?cpu", { @@ -789655,7 +790262,7 @@ ] ], "where.https.any.js": [ - "21975b4610389067d4b1e09062601f66af59a78a", + "1100fdda17caacd99d754bdcca0e3ac23c2025ef", [ "webnn/conformance_tests/where.https.any.html?cpu", { @@ -792169,7 +792776,7 @@ ] ], "dequantizeLinear.https.any.js": [ - "a3af5b8a59f032d7f4f58c1d28baa9d68480f97a", + "acd2b85b5f05f6ea91ae18fe5eb26d0f709b4b38", [ "webnn/validation_tests/dequantizeLinear.https.any.html?cpu", { @@ -802819,7 +803426,7 @@ ] ], "quantizeLinear.https.any.js": [ - "5c96cfe0c1662a26ed93b99d8faf649cc59382a0", + "518246a82810ef56b75a7269df4a3a0655a2d860", [ "webnn/validation_tests/quantizeLinear.https.any.html?cpu", { @@ -806434,7 +807041,7 @@ ] ], "crypto-suite.https.html": [ - "c3941e409ffa10f2a85fb0cd0cd7d59732fbf717", + "18c671724210cec47ed70264536973a78390bf87", [ null, {} @@ -846108,7 +846715,7 @@ }, "set_locale_override": { "contexts.py": [ - "9cc395e4f20bc057381b64525f51e00c652f83f3", + "3a3fa527c4f208b93c0756be1ec2bb798eb7b5e4", [ null, {}
diff --git a/third_party/blink/web_tests/external/wpt/cookie-store/cookieStore_special_names.https.any.js b/third_party/blink/web_tests/external/wpt/cookie-store/cookieStore_special_names.https.any.js index 706eb16..36761b4 100644 --- a/third_party/blink/web_tests/external/wpt/cookie-store/cookieStore_special_names.https.any.js +++ b/third_party/blink/web_tests/external/wpt/cookie-store/cookieStore_special_names.https.any.js
@@ -56,7 +56,8 @@ }, `cookieStore.set with ${prefix} prefix a path option`); }); -['__HostHttp-', '__hosthttp-', '__Http-', '__http-'].forEach(prefix => { +['__HostHttp-', '__hosthttp-', '__Http-', '__http-', ' __Http-', '\t__Http-', + ' __HostHttp-', '\t__HostHttp-'].forEach(prefix => { promise_test(async testCase => { await promise_rejects_js(testCase, TypeError, cookieStore.set({ name: `${prefix}cookie-name`, value: 'cookie-value'})); @@ -74,32 +75,20 @@ assert_true(exceptionThrown, "No exception thrown."); }, 'cookieStore.set with malformed name.'); -promise_test(async testCase => { - // Nameless cookies cannot have a __Host- prefix - await cookieStore.delete(''); +['__Host-', '__Secure-', '__Http-', '__HostHttp-', ' __Host-', '\t__Host-', ' __Secure-', + '\t__Secure-', ' __Http-', '\t__Http-', ' __HostHttp-', '\t__HostHttp-'].forEach(prefix => { + promise_test(async testCase => { + // Nameless cookies cannot have special prefixes + await cookieStore.delete(''); - const currentUrl = new URL(self.location.href); - const currentDomain = currentUrl.hostname; + const currentUrl = new URL(self.location.href); + const currentDomain = currentUrl.hostname; - await promise_rejects_js(testCase, TypeError, cookieStore.set( - { name: '', - value: '__Host-nameless-cookie', - domain: `.${currentDomain}` })); - const cookie = await cookieStore.get(''); - assert_equals(cookie, null); -}, 'cookieStore.set a nameless cookie cannot have __Host- prefix'); - -promise_test(async testCase => { - // Nameless cookies cannot have a __Secure- prefix - await cookieStore.delete(''); - - const currentUrl = new URL(self.location.href); - const currentDomain = currentUrl.hostname; - - await promise_rejects_js(testCase, TypeError, cookieStore.set( - { name: '', - value: '__Secure-nameless-cookie', - domain: `.${currentDomain}` })); - const cookie = await cookieStore.get(''); - assert_equals(cookie, null); -}, 'cookieStore.set a nameless cookie cannot have __Secure- prefix'); + await promise_rejects_js(testCase, TypeError, cookieStore.set( + { name: '', + value: `${prefix}nameless-cookie`, + domain: `.${currentDomain}` })); + const cookie = await cookieStore.get(''); + assert_equals(cookie, null); + }, `cookieStore.set a nameless cookie cannot have ${prefix} prefix`); +});
diff --git a/third_party/blink/web_tests/external/wpt/core-aam/arianotify/aria-notify-body-announcement-manual.html b/third_party/blink/web_tests/external/wpt/core-aam/arianotify/aria-notify-body-announcement-manual.html deleted file mode 100644 index 83e5138..0000000 --- a/third_party/blink/web_tests/external/wpt/core-aam/arianotify/aria-notify-body-announcement-manual.html +++ /dev/null
@@ -1,33 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <title>ARIA Notify API Test: Body Element Announcement</title> - <link rel="help" href="https://github.com/w3c/aria/pull/2577"> - <link rel="author" title="Jacques Newman" href="mailto:janewman@microsoft.com"> - <script src="core-aam/arianotify/resources/aria-notify-helpers.js"></script> -</head> -<body> - <h1>ARIA Notify API Test: Body Element Announcement</h1> - <p>This test checks the behavior of the <code>ariaNotify</code> API with an announcement on the body element.</p> - - <h2>Setup Instructions</h2> - <p><strong>Setup:</strong> Use a screen reader (NVDA, JAWS, VoiceOver, etc.) or other assistive technology that - supports the ARIA Notify API.</p> - <p><strong>Instructions:</strong> Click the "Run Test" button and listen for the announced text from your screen reader.</p> - - <div> - <h3>Test: Simple Announcement on Body Element</h3> - <p><strong>Expected:</strong> Screen reader should announce "Body notification test"</p> - - <button onclick="test()">Run Test</button> - <div id="status"></div> - - <script> - function test() { - document.getElementById('status').textContent = tryCallAriaNotify(document.body, 'Body notification test'); - } - </script> - </div> -</body> - -</html> \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/core-aam/arianotify/aria-notify-document-announcement-manual.html b/third_party/blink/web_tests/external/wpt/core-aam/arianotify/aria-notify-document-announcement-manual.html deleted file mode 100644 index 73cfd27..0000000 --- a/third_party/blink/web_tests/external/wpt/core-aam/arianotify/aria-notify-document-announcement-manual.html +++ /dev/null
@@ -1,44 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <title>ARIA Notify API Test: Document Announcement</title> - <link rel="help" href="https://github.com/w3c/aria/pull/2577"> - <link rel="author" title="Jacques Newman" href="mailto:janewman@microsoft.com"> -</head> -<body> - <h1>ARIA Notify API Test: Document Announcement</h1> - <p>This test checks the behavior of the <code>ariaNotify</code> API with a - simple announcement on the document object.</p> - - <h2>Setup Instructions</h2> - <p><strong>Setup:</strong> Use a screen reader (NVDA, JAWS, VoiceOver, etc.) or other assistive technology that - supports the ARIA Notify API.</p> - <p><strong>Instructions:</strong> Click the "Run Test" button and listen for the announced text from your screen reader.</p> - - <script> - function tryCallAriaNotify(element, message, options = {}) { - if (element.ariaNotify) { - element.ariaNotify(message, options); - return 'ariaNotify called' + ` with message: "${message}" and options: ${JSON.stringify(options)}`; - } else { - return 'the ariaNotify API is not supported in this browser'; - } - } - </script> - - <div> - <h3>Test: Simple Announcement</h3> - <p><strong>Expected:</strong> Screen reader should announce "Hello, world!" using default priority (normal).</p> - - <button onclick="test()">Run Test</button> - <div id="status"></div> - - <script> - function test() { - document.getElementById('status').textContent = tryCallAriaNotify(document, 'Hello, world!'); - } - </script> - </div> -</body> - -</html> \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/core-aam/arianotify/aria-notify-element-announcement-manual.html b/third_party/blink/web_tests/external/wpt/core-aam/arianotify/aria-notify-element-announcement-manual.html deleted file mode 100644 index 0a6d8d8..0000000 --- a/third_party/blink/web_tests/external/wpt/core-aam/arianotify/aria-notify-element-announcement-manual.html +++ /dev/null
@@ -1,37 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <title>ARIA Notify API Test: Element Announcement</title> - <link rel="help" href="https://github.com/w3c/aria/pull/2577"> - <link rel="author" title="Jacques Newman" href="mailto:janewman@microsoft.com"> - <script src="core-aam/arianotify/resources/aria-notify-helpers.js"></script> -</head> -<body> - <h1>ARIA Notify API Test: Element Announcement</h1> - <p>This test checks the behavior of the <code>ariaNotify</code> API with an announcement on a specific element.</p> - - <h2>Setup Instructions</h2> - <p><strong>Setup:</strong> Use a screen reader (NVDA, JAWS, VoiceOver, etc.) or other assistive technology that - supports the ARIA Notify API.</p> - <p><strong>Instructions:</strong> Click the "Run Test" button and listen for the announced text from your screen reader.</p> - - <p><strong>Note:</strong> If the ariaNotify API is not supported in your browser, the test will show an appropriate - error message.</p> - - <div> - <h3>Test: Simple Announcement on Specific Element</h3> - <p><strong>Expected:</strong> Screen reader should announce "Hello, world!" using the button element as context.</p> - - <button id="test-button" onclick="test()">Run Test</button> - <div id="status"></div> - - <script> - function test() { - const button = document.getElementById('test-button'); - document.getElementById('status').textContent = tryCallAriaNotify(button, 'Hello, world!'); - } - </script> - </div> -</body> - -</html> \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/core-aam/arianotify/aria-notify-iframe-default-permissions-manual.html b/third_party/blink/web_tests/external/wpt/core-aam/arianotify/aria-notify-iframe-default-permissions-manual.html deleted file mode 100644 index 160358c..0000000 --- a/third_party/blink/web_tests/external/wpt/core-aam/arianotify/aria-notify-iframe-default-permissions-manual.html +++ /dev/null
@@ -1,22 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <title>ARIA Notify API Test: iframe Default Permissions Policy Manual</title> - <link rel="help" href="https://github.com/w3c/aria/pull/2577"> - <link rel="author" title="Jacques Newman" href="mailto:janewman@microsoft.com"> -</head> -<body> - <p>This test checks the behavior of the <code>ariaNotify</code> API when used within an iframe with default permissions policy settings.</p> - - <h2>Setup Instructions</h2> - <p><strong>Setup:</strong> Use a screen reader (NVDA, JAWS, VoiceOver, etc.) or other assistive technology that supports the ARIA Notify API.</p> - <p><strong>Instructions:</strong> Listen for the announced text from your screen reader. The test will run automatically when the page loads.</p> - - <div> - <h3>Test: iframe with Default Permissions Policy</h3> - <p><strong>Expected:</strong> Screen reader should announce "Announcement from iframe with default permissions".</p> - <iframe id="testIframe" src="resources/aria-notify-iframe-manual-test.html?message=Announcement from iframe with default permissions"></iframe> - </div> - -</body> -</html>
diff --git a/third_party/blink/web_tests/external/wpt/core-aam/arianotify/aria-notify-iframe-denied-permissions-manual.html b/third_party/blink/web_tests/external/wpt/core-aam/arianotify/aria-notify-iframe-denied-permissions-manual.html deleted file mode 100644 index 633e0b3e..0000000 --- a/third_party/blink/web_tests/external/wpt/core-aam/arianotify/aria-notify-iframe-denied-permissions-manual.html +++ /dev/null
@@ -1,23 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <title>ARIA Notify API Test: iframe Denied Permissions Policy Manual</title> - <link rel="help" href="https://github.com/w3c/aria/pull/2577"> - <link rel="author" title="Jacques Newman" href="mailto:janewman@microsoft.com"> -</head> -<body> - <p>This test checks the behavior of the <code>ariaNotify</code> API when used within an iframe with aria-notify explicitly denied by permissions policy.</p> - - <h2>Setup Instructions</h2> - <p><strong>Setup:</strong> Use a screen reader (NVDA, JAWS, VoiceOver, etc.) or other assistive technology that supports the ARIA Notify API.</p> - <p><strong>Instructions:</strong> Listen for the announced text from your screen reader. The test will run automatically when the page loads.</p> - - <div> - <h3>Test: iframe with aria-notify Denied by Permissions Policy</h3> - <p><strong>Expected:</strong> Screen reader should NOT announce: "This should not be announced".</p> - - <iframe id="testIframe" src="resources/aria-notify-iframe-manual-test.html?message=This%20should%20not%20be%20announced" allow="aria-notify 'none'"></iframe> - </div> - -</body> -</html>
diff --git a/third_party/blink/web_tests/external/wpt/core-aam/arianotify/aria-notify-language-announcement-manual.html b/third_party/blink/web_tests/external/wpt/core-aam/arianotify/aria-notify-language-announcement-manual.html deleted file mode 100644 index 5bd1514..0000000 --- a/third_party/blink/web_tests/external/wpt/core-aam/arianotify/aria-notify-language-announcement-manual.html +++ /dev/null
@@ -1,50 +0,0 @@ -<!DOCTYPE html> -<head> - <title>ARIA Notify API Test: Language Announcement</title> - <link rel="help" href="https://github.com/w3c/aria/pull/2577"> - <link rel="author" title="Jacques Newman" href="mailto:janewman@microsoft.com"> - <script src="core-aam/arianotify/resources/aria-notify-helpers.js"></script> -</head> -<html> -<head> - <title>ARIA Notify API Test: Language-Specific Announcement</title> - <link rel="help" href="https://github.com/w3c/aria/pull/2577"> - <link rel="author" title="Jacques Newman" href="mailto:janewman@microsoft.com"> -</head> -<body> - <h1>ARIA Notify API Test: Language-Specific Announcement</h1> - <p>This test checks the behavior of the <code>ariaNotify</code> API with a language-specific announcement.</p> - - <h2>Setup Instructions</h2> - <p><strong>Setup:</strong> Use a screen reader (NVDA, JAWS, VoiceOver, etc.) or other assistive technology that - supports the ARIA Notify API.</p> - <p><strong>Instructions:</strong> Click the "Run Test" button and listen for the announced text from your screen reader.</p> - - <h2>Test Expectations</h2> - <ul> - <li>Screen reader should announce "¡Hola mundo!" using Spanish pronunciation and the button element as context</li> - </ul> - - <p><strong>Note:</strong> If the ariaNotify API is not supported in your browser, the test will show an appropriate - error message.</p> - - <div> - <h3>Test: Simple Announcement on Specific Element with Specific Language</h3> - <p>A screen reader announcement against the button that triggers it, with no additional options but a lang attribute - on the button set to "es" for Spanish. The announcement text is "¡Hola mundo!".</p> - <p><strong>Expected:</strong> Screen reader should announce "¡Hola mundo!" using Spanish pronunciation and the - button element as context.</p> - - <button id="test-button" lang="es" onclick="test()">Ejecutar Prueba</button> - <div id="status"></div> - - <script> - function test() { - const button = document.getElementById('test-button'); - document.getElementById('status').textContent = tryCallAriaNotify(button, '¡Hola mundo!'); - } - </script> - </div> -</body> - -</html> \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/core-aam/arianotify/aria-notify-mixed-priorities-manual.html b/third_party/blink/web_tests/external/wpt/core-aam/arianotify/aria-notify-mixed-priorities-manual.html deleted file mode 100644 index 3137b8c..0000000 --- a/third_party/blink/web_tests/external/wpt/core-aam/arianotify/aria-notify-mixed-priorities-manual.html +++ /dev/null
@@ -1,48 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <title>ARIA Notify API Test: Mixed Priorities</title> - <link rel="help" href="https://github.com/w3c/aria/pull/2577"> - <link rel="author" title="Jacques Newman" href="mailto:janewman@microsoft.com"> - <script src="core-aam/arianotify/resources/aria-notify-helpers.js"></script> -</head> -<body> - <h1>ARIA Notify API Test: Mixed Priorities</h1> - <p>This test checks the behavior of the <code>ariaNotify</code> API when a high priority message interrupts a normal - priority message.</p> - - <h2>Setup Instructions</h2> - <p><strong>Setup:</strong> Use a screen reader (NVDA, JAWS, VoiceOver, etc.) or other assistive technology that - supports the ARIA Notify API.</p> - <p><strong>Instructions:</strong> Click the "Run Test" button and listen for the announced text from your screen reader.</p> - <p><strong>Note:</strong> You may need to slow down your screen reader speech rate so that the second, higher priority - notification occurs while the first message is still being spoken. - </p> - - <div> - <h3>Test: A Normal Priority Message Interrupted by a High Priority Message</h3> - - <p><strong>Expected:</strong> Screen reader should start announcing the long message, then be interrupted after a - 2 second delay by "This is a high priority notification!" at high priority. This second notification should occur mid-speech if the - speech rate is slow enough. - </p> - - <button onclick="test()">Run Test</button> - <div id="status"></div> - - <script> - function test() { - // Start the long message first - document.getElementById('status').textContent = - tryCallAriaNotify(document, 'This is a longer message that tests how well the ariaNotify API handles interruptions, it will repeat once for extra length. This is a longer message that tests how well the ariaNotify API handles interruptions.', { priority: 'normal' }); - - setTimeout(() => { - document.getElementById('status').textContent += ' ' + - tryCallAriaNotify(document, 'This is a high priority notification!', { priority: 'high' }); - }, 2000); - } - </script> - </div> -</body> - -</html> \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/core-aam/arianotify/aria-notify-multiple-high-priority-manual.html b/third_party/blink/web_tests/external/wpt/core-aam/arianotify/aria-notify-multiple-high-priority-manual.html deleted file mode 100644 index 124e271..0000000 --- a/third_party/blink/web_tests/external/wpt/core-aam/arianotify/aria-notify-multiple-high-priority-manual.html +++ /dev/null
@@ -1,50 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <title>ARIA Notify API Test: Multiple High Priority Messages</title> - <link rel="help" href="https://github.com/w3c/aria/pull/2577"> - <link rel="author" title="Jacques Newman" href="mailto:janewman@microsoft.com"> - <script src="core-aam/arianotify/resources/aria-notify-helpers.js"></script> -</head> -<body> - <h1>ARIA Notify API Test: Multiple High Priority Messages</h1> - <p>This test checks the behavior of the <code>ariaNotify</code> API with multiple consecutive high priority messages. - </p> - - <h2>Setup Instructions</h2> - <p><strong>Setup:</strong> Use a screen reader (NVDA, JAWS, VoiceOver, etc.) or other assistive technology that - supports the ARIA Notify API.</p> - <p><strong>Instructions:</strong> Click the "Run Test" button and listen for the announced text from your screen reader.</p> - - <h2>Test Expectations</h2> - <ul> - <li>Screen reader should announce "Loading..." followed by "Loading failed." in sequence, both at high priority with - potential for rapid delivery</li> - </ul> - - <p><strong>Note:</strong> If the ariaNotify API is not supported in your browser, the test will show an appropriate - error message.</p> - - <div> - <h3>Test: Multiple Consecutive High Priority Messages</h3> - <p>A "Loading..." message followed by a "Loading failed." message, both at high priority and fired against the - document.</p> - <p><strong>Expected:</strong> Screen reader should announce "Loading..." followed by "Loading failed." in sequence, - both at high priority with potential for rapid delivery.</p> - - <button onclick="test()">Run Test</button> - <div id="status"></div> - - <script> - function test() { - // Fire the first message - let status = tryCallAriaNotify(document, 'Loading...', { priority: 'high' }); - // Fire the second message - status += ' ' + tryCallAriaNotify(document, 'Loading failed.', { priority: 'high' }); - document.getElementById('status').textContent = status; - } - </script> - </div> -</body> - -</html> \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/core-aam/arianotify/aria-notify-multiple-normal-priority-manual.html b/third_party/blink/web_tests/external/wpt/core-aam/arianotify/aria-notify-multiple-normal-priority-manual.html deleted file mode 100644 index 5c527c2..0000000 --- a/third_party/blink/web_tests/external/wpt/core-aam/arianotify/aria-notify-multiple-normal-priority-manual.html +++ /dev/null
@@ -1,41 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <title>ARIA Notify API Test: Multiple Normal Priority Messages</title> - <link rel="help" href="https://github.com/w3c/aria/pull/2577"> - <link rel="author" title="Jacques Newman" href="mailto:janewman@microsoft.com"> - <script src="core-aam/arianotify/resources/aria-notify-helpers.js"></script> -</head> -<body> - <h1>ARIA Notify API Test: Multiple Normal Priority Messages</h1> - <p>This test checks the behavior of the <code>ariaNotify</code> API with multiple consecutive normal priority - messages.</p> - - <h2>Setup Instructions</h2> - <p><strong>Setup:</strong> Use a screen reader (NVDA, JAWS, VoiceOver, etc.) or other assistive technology that - supports the ARIA Notify API.</p> - <p><strong>Instructions:</strong> Click the "Run Test" button and listen for the announced text from your screen reader.</p> - - <div> - <h3>Test: Multiple Consecutive Normal Priority Messages</h3> - <p>A "Loading..." message followed by a "Loading failed." message, both at normal priority and fired against the - document.</p> - <p><strong>Expected:</strong> Screen reader should announce "Loading..." followed by "Loading failed." in sequence, - both at normal priority without interruption.</p> - - <button onclick="test()">Run Test</button> - <div id="status"></div> - - <script> - function test() { - // Fire the first message - let status = tryCallAriaNotify(document, 'Loading...', { priority: 'normal' }); - // Fire the second message - status += ' ' + tryCallAriaNotify(document, 'Loading failed.', { priority: 'normal' }); - document.getElementById('status').textContent = status; - } - </script> - </div> -</body> - -</html> \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/core-aam/arianotify/aria-notify-priority-queue-manual.html b/third_party/blink/web_tests/external/wpt/core-aam/arianotify/aria-notify-priority-queue-manual.html deleted file mode 100644 index 569f9650..0000000 --- a/third_party/blink/web_tests/external/wpt/core-aam/arianotify/aria-notify-priority-queue-manual.html +++ /dev/null
@@ -1,41 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <title>ARIA Notify API Test: Priority Queue</title> - <link rel="help" href="https://github.com/w3c/aria/pull/2577"> - <link rel="author" title="Jacques Newman" href="mailto:janewman@microsoft.com"> - <script src="core-aam/arianotify/resources/aria-notify-helpers.js"></script> -</head> -<body> - <h1>ARIA Notify API Test: Priority Queue</h1> - <p>This test checks the behavior of the <code>ariaNotify</code> API with mixed priority messages to test queue - behavior.</p> - - <h2>Setup Instructions</h2> - <p><strong>Setup:</strong> Use a screen reader (NVDA, JAWS, VoiceOver, etc.) or other assistive technology that - supports the ARIA Notify API.</p> - <p><strong>Instructions:</strong> Click the "Run Test" button and listen for the announced text from your screen reader.</p> - - <div> - <h3>Test: A Normal Priority Message Followed by a High Priority Message</h3> - <p>A normal-priority "Loading..." message followed by a high-priority "Loading failed." message, both fired against - the document.</p> - <p><strong>Expected:</strong> Screen reader should announce "Loading..." at normal priority, then "Loading failed." - at high priority. The high priority message should be prioritized in the queue.</p> - - <button onclick="test()">Run Test</button> - <div id="status"></div> - - <script> - function test() { - // Fire the first message at normal priority - let status = tryCallAriaNotify(document, 'Loading...', { priority: 'normal' }); - // Fire the second message at high priority - status += ' ' + tryCallAriaNotify(document, 'Loading failed.', { priority: 'high' }); - document.getElementById('status').textContent = status; - } - </script> - </div> -</body> - -</html> \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/core-aam/arianotify/resources/aria-notify-helpers.js b/third_party/blink/web_tests/external/wpt/core-aam/arianotify/resources/aria-notify-helpers.js deleted file mode 100644 index c1b3a53..0000000 --- a/third_party/blink/web_tests/external/wpt/core-aam/arianotify/resources/aria-notify-helpers.js +++ /dev/null
@@ -1,9 +0,0 @@ -// Helper for ariaNotify manual tests. -function tryCallAriaNotify(element, message, options = {}) { - if (element.ariaNotify) { - element.ariaNotify(message, options); - return 'ariaNotify called' + ` with message: "${message}" and options: ${JSON.stringify(options)}`; - } else { - return 'the ariaNotify API is not supported in this browser'; - } -}
diff --git a/third_party/blink/web_tests/external/wpt/core-aam/arianotify/resources/aria-notify-iframe-manual-test.html b/third_party/blink/web_tests/external/wpt/core-aam/arianotify/resources/aria-notify-iframe-manual-test.html deleted file mode 100644 index f34c17e..0000000 --- a/third_party/blink/web_tests/external/wpt/core-aam/arianotify/resources/aria-notify-iframe-manual-test.html +++ /dev/null
@@ -1,29 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <title>ARIA Notify iframe Manual Test</title> -</head> -<body> - <script> - 'use strict'; - - function testAriaNotify() { - const resultDiv = document.getElementById('result'); - const urlParams = new URLSearchParams(window.location.search); - const message = urlParams.get('message') || 'Default announcement message'; - - if (!document.ariaNotify) { - resultDiv.textContent = 'ariaNotify API is not supported in this browser'; - return; - } - - // Check if the feature is allowed by permissions policy - document.ariaNotify(message); - resultDiv.textContent = `ariaNotify called with message: "${message}"`; - } - </script> - <button onclick="testAriaNotify()">Make Announcement</button> - <div id="result"></div> - -</body> -</html>
diff --git a/third_party/blink/web_tests/external/wpt/core-aam/arianotify/resources/aria-notify-iframe-test.html b/third_party/blink/web_tests/external/wpt/core-aam/arianotify/resources/aria-notify-iframe-test.html deleted file mode 100644 index 02f4396..0000000 --- a/third_party/blink/web_tests/external/wpt/core-aam/arianotify/resources/aria-notify-iframe-test.html +++ /dev/null
@@ -1,17 +0,0 @@ -<!DOCTYPE html> -<script> -'use strict'; - -window.onload = function() { - let result = { }; - - if (document.ariaNotify) { - result.supportsAriaNotify = true; - result.allowsFeature = document.featurePolicy?.allowsFeature('aria-notify'); - } else { - result.supportsAriaNotify = false; - } - - parent.postMessage(result, '*'); -} -</script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-anchor-position/anchor-in-anchor-positioned.html b/third_party/blink/web_tests/external/wpt/css/css-anchor-position/anchor-in-anchor-positioned.html new file mode 100644 index 0000000..8cd341a --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-anchor-position/anchor-in-anchor-positioned.html
@@ -0,0 +1,67 @@ +<!DOCTYPE html> + +<title>Tests that anchors in anchor-positioned elements are discoverable</title> + +<link rel="help" href="https://drafts.csswg.org/css-anchor-position-1/#determining"> +<link rel="author" title="Kiet Ho" href="mailto:kiet.ho@apple.com"> + +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/check-layout-th.js"></script> +<script src="support/test-common.js"></script> + +<style> + .containing-block { + border: 1px solid black; + + position: relative; + width: 200px; + height: 150px; + } + + .box { + width: 50px; + height: 50px; + } + + #anchor-1 { + position: absolute; + top: 50px; + left: 50px; + + anchor-name: --anchor-1; + + background: green; + } + + #anchor-positioned-1 { + position: absolute; + position-anchor: --anchor-1; + position-area: top right; + } + + #anchor-2 { + anchor-name: --anchor-2; + background: blue; + } + + #anchor-positioned-2 { + position: absolute; + position-anchor: --anchor-2; + position-area: bottom right; + + background: cyan; + } +</style> + +<body onload="checkLayoutForAnchorPos('.target')"> + <div class="containing-block"> + <div class="box" id="anchor-1"></div> + + <div class="box target" id="anchor-positioned-1" data-offset-x="100" data-offset-y="0"> + <div class="box" id="anchor-2"></div> + </div> + + <div class="box target" id="anchor-positioned-2" data-offset-x="150" data-offset-y="50"></div> + </div> +</body> \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/css/css-anchor-position/anchor-in-popover.html b/third_party/blink/web_tests/external/wpt/css/css-anchor-position/anchor-in-popover.html new file mode 100644 index 0000000..97ae617 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-anchor-position/anchor-in-popover.html
@@ -0,0 +1,115 @@ +<!DOCTYPE html> + +<title>Tests that anchors in a popover are discoverable</title> + +<link rel="help" href="https://drafts.csswg.org/css-anchor-position-1/#determining"> +<link rel="author" title="Kiet Ho" href="mailto:kiet.ho@apple.com"> + +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/check-layout-th.js"></script> +<script src="support/test-common.js"></script> + +<style> + body { + margin: 0; + } + + #containing-block { + position: relative; + width: 100px; + height: 100px; + + border: 1px black solid; + } + + #anchor-1 { + width: 50px; + height: 50px; + + position: absolute; + top: 25px; + left: 25px; + + background: green; + + anchor-name: --anchor-1; + } + + #popover-1 { + margin: 0; + border: 1px black solid; + padding: 0; + + width: 100px; + height: 100px; + + position: absolute; + position-anchor: --anchor-1; + position-area: bottom right; + } + + #anchor-2 { + width: 50px; + height: 50px; + + position: absolute; + top: 25px; + left: 25px; + + background: cyan; + + anchor-name: --anchor-2; + } + + #popover-2 { + margin: 0; + border: 1px black solid; + padding: 0; + + width: 100px; + height: 100px; + + position: absolute; + position-anchor: --anchor-2; + position-area: bottom right; + } +</style> + +<body> + <div id="containing-block"> + <div id="anchor-1"></div> + </div> + + <!-- + 1px border of #containing-block + + 25px gap between #containing-block and #anchor-1 + + 50px width of #anchor-1 + = 76px + --> + <div class="target" id="popover-1" popover data-offset-x="76" data-offset-y="76"> + <div id="anchor-2"> + <!-- + 76px left offset of #anchor-1 + + 1px border of #popover-2 + + 25px gap between #popover-2 and #anchor-2 + + 50px width of #anchor-2 + = 152px + --> + + <!-- #popover-2 has to be here to trigger a bug in Safari --> + <div class="target" id="popover-2" popover data-offset-x="152" data-offset-y="152"></div> + </div> + </div> + + + <script> + const popover1 = document.getElementById("popover-1"); + const popover2 = document.getElementById("popover-2"); + + popover1.showPopover(); + popover2.showPopover(); + + checkLayoutForAnchorPos('.target'); + </script> +</body> \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/css/css-anchor-position/anchor-position-multicol-002.html b/third_party/blink/web_tests/external/wpt/css/css-anchor-position/anchor-position-multicol-002.html index 1e1f0a5..6ca4c22d 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-anchor-position/anchor-position-multicol-002.html +++ b/third_party/blink/web_tests/external/wpt/css/css-anchor-position/anchor-position-multicol-002.html
@@ -24,14 +24,14 @@ } .spacer { height: 10px; - background: pink; + background: silver; } .anchor1 { anchor-name: --a1; margin-left: 10px; width: 50px; height: 90px; - background: blue; + background: yellow; } .target { position: absolute; @@ -44,26 +44,37 @@ top: anchor(--a1 top); width: anchor-size(--a1 width); height: anchor-size(--a1 height); - background: lime; - opacity: .3; + border: dashed 4px aqua; + opacity: .2; + box-sizing: border-box; } .target1-rb { right: anchor(--a1 right); bottom: anchor(--a1 bottom); width: 10px; height: 10px; + background: teal; +} + +.inner .target1 { + border-color: fuchsia; + border-style: solid; +} +.inner .target1-rb { background: purple; } + </style> <body onload="checkLayoutForAnchorPos('.target')"> - <p>The green box should be a union of blue boxes, - and the purple box should be at the right-bottom of the green box. - </p> + <p>The dashed aqua rectangle should encompass both yellow fragments, + and the teal box should be at the bottom-right of the aqua box. + <p>The fuchsia rectangle should match the edge of the yellow box except where it's split across columns, + and the purple box should be at the bottom-right of the fuchsia rectangle. <div class="spacer" style="height: 10px"></div> - <div class="cb"> + <div class="cb outer"> <div class="columns"> <div class="spacer" style="height: 30px"></div> - <div class="cb"> + <div class="cb inner"> <!-- This spacer fills up to the middle of the 2nd column. --> <div class="spacer" style="height: 130px"></div> <div class="anchor1"></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-anchor-position/position-area-anchor-001-ref.html b/third_party/blink/web_tests/external/wpt/css/css-anchor-position/position-area-anchor-001-ref.html new file mode 100644 index 0000000..a97d290 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-anchor-position/position-area-anchor-001-ref.html
@@ -0,0 +1,85 @@ +<!DOCTYPE html> +<title>anchor() resolution in position-area</title> + +<style> + .container { + width: 100px; height: 100px; + border: solid gray; + margin: 6px; + position: relative; + anchor-scope: all; + float: left; + } + + .block { + background: silver; + height: 40px; + width: 40px; + margin: 10px; + } + + .anchor { + position: absolute; + border: solid orange; + margin: 25px; + } + .controls .anchor, + .pull-up .anchor { + width: 5px; + height: 5px; + } + .push-down .anchor { + width: 40px; + height: 40px; + } + + .anchored { + border: solid blue; + position: absolute; + inset: 0; + place-self: stretch; + } + + body > div { clear: both; } +</style> + +<div class=pull-up> + <div class=container> + <div class=anchor></div> + <div class=block></div> + <div class=anchored style="top: 36px; left: 36px;"></div> + </div> + + <div class=container> + <div class=anchor></div> + <div class=block></div> + <div class=anchored style="top: 36px; left: 50px;"></div> + </div> +</div> + +<div class=push-down> + <div class=container> + <div class=anchor></div> + <div class=block></div> + <div class=anchored style="top: 71px; left: 71px"></div> + </div> + + <div class=container> + <div class=anchor></div> + <div class=block></div> + <div class=anchored style="top: 71px; left: 50px"></div> + </div> +</div> + +<div class=controls> + <div class=container> + <div class=anchor></div> + <div class=block></div> + <div class=anchored style="top: 36px"></div> + </div> + <div class=container> + <div class=anchor></div> + <div class=block></div> + <div class=anchored style="top: 25px; left: 36px"></div> + </div> +</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-anchor-position/position-area-anchor-001.html b/third_party/blink/web_tests/external/wpt/css/css-anchor-position/position-area-anchor-001.html new file mode 100644 index 0000000..24b9bbc --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-anchor-position/position-area-anchor-001.html
@@ -0,0 +1,90 @@ +<!DOCTYPE html> +<title>anchor() resolution in position-area</title> + +<link rel="help" href="https://www.w3.org/TR/css-anchor-position/#position-area"> +<link rel="match" href="position-area-anchor-001-ref.html"> +<link rel="author" name="Elika J. Etemad" href="http://fantasai.inkedblade.net/contact"> + +<style> + .container { + width: 100px; height: 100px; + border: solid gray; + margin: 6px; + position: relative; + anchor-scope: all; + float: left; + } + + .block { + background: silver; + height: 40px; + width: 40px; + margin: 10px; + } + + .anchor { + position: absolute; + border: solid orange; + margin: 25px; + } + .controls .anchor, + .pull-up .anchor { + width: 5px; + height: 5px; + } + .push-down .anchor { + width: 40px; + height: 40px; + } + + .anchored { + border: solid blue; + position: absolute; + position-area: span-bottom right; + inset: 0; + place-self: stretch; + } + + body > div { clear: both; } +</style> + +<div class=pull-up> + <div class=container> + <div class=anchor style="anchor-name: --foo"></div> + <div class=block></div> + <div class=anchored style="top: anchor(bottom); position-anchor: --foo"></div> + </div> + + <div class=container> + <div class=anchor style="anchor-name: --foo"></div> + <div class=block style="anchor-name: --bar"></div> + <div class=anchored style="top: anchor(--foo bottom); position-anchor: --bar"></div> + </div> +</div> + +<div class=push-down> + <div class=container> + <div class=anchor style="anchor-name: --foo"></div> + <div class=block></div> + <div class=anchored style="top: anchor(bottom); position-anchor: --foo"></div> + </div> + + <div class=container> + <div class=anchor style="anchor-name: --foo"></div> + <div class=block style="anchor-name: --bar"></div> + <div class=anchored style="top: anchor(--foo bottom); position-anchor: --bar"></div> + </div> +</div> + +<div class=controls> + <div class=container> + <div class=anchor style="anchor-name: --foo"></div> + <div class=block></div> + <div class=anchored style="top: anchor(--foo bottom)"></div> + </div> + <div class=container> + <div class=anchor style="anchor-name: --foo"></div> + <div class=block></div> + <div class=anchored style="position-anchor: --foo"></div> + </div> +</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-flexbox/alignment/multiline-align-self.html b/third_party/blink/web_tests/external/wpt/css/css-flexbox/alignment/multiline-align-self.html new file mode 100644 index 0000000..3b8f1ca2 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-flexbox/alignment/multiline-align-self.html
@@ -0,0 +1,1630 @@ +<html> +<head> +<link rel="help" href="https://drafts.csswg.org/css-flexbox-1/#align-items-property"> +<style> +.flexbox { + position: relative; + display: flex; + background-color: grey; + max-width: 600px; + align-content: flex-start; +} +.title { + margin-top: 1em; +} +.ltr { + direction: ltr; +} +.rtl { + direction: rtl; +} +.horizontal-tb { + writing-mode: horizontal-tb; +} +.vertical-rl { + writing-mode: vertical-rl; +} +.vertical-lr { + writing-mode: vertical-lr; +} +.row { + flex-flow: row; +} +.row-reverse { + flex-flow: row-reverse; +} +.column { + flex-flow: column; +} +.column-reverse { + flex-flow: column-reverse; +} +.wrap { + flex-wrap: wrap; +} +.wrap-reverse { + flex-wrap: wrap-reverse; +} +.flexbox> :nth-child(1) { + background-color: #0f0; +} +.flexbox> :nth-child(2) { + background-color: #0d0; +} +.flexbox> :nth-child(3) { + background-color: #0b0; +} +.flexbox> :nth-child(4) { + background-color: #090; +} +.flexbox> :nth-child(5) { + background-color: #070; +} +.flexbox> :nth-child(6) { + background-color: #050; +} +.flexbox> :nth-child(7) { + background-color: #030; +} +.flexbox> :nth-child(8) { + background-color: #00f; +} +.flexbox> :nth-child(9) { + background-color: #00d; +} +.flexbox> :nth-child(10) { + background-color: #00b; +} +.flexbox> :nth-child(11) { + background-color: #009; +} +.flexbox> :nth-child(12) { + background-color: #007; +} +.flexbox> :nth-child(13) { + background-color: #005; +} +.flexbox> :nth-child(14) { + background-color: #003; +} +</style> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/check-layout-th.js"></script> +</head> + +<body onload="checkLayout('.flexbox')"> + <div class="title">horizontal-tb ltr row wrap</div> + <div class="flexbox horizontal-tb ltr row wrap" style="width: 70px" data-expected-width="70" + data-expected-height="60"> + <div style="flex: 1 10px;height: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10" + data-offset-x="0" data-offset-y="0"></div> + <div style="flex: 1 10px;height: 10px;align-self: center" data-expected-width="10" data-expected-height="10" + data-offset-x="10" data-offset-y="10"></div> + <div style="flex: 1 10px;height: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10" + data-offset-x="20" data-offset-y="20"></div> + <div style="flex: 1 10px;height: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10" + data-offset-x="30" data-offset-y="5"></div> + <div style="flex: 1 10px;height: 10px;align-self: baseline; margin-block-start: 5px;" data-expected-width="10" + data-expected-height="10" data-offset-x="40" data-offset-y="5"></div> + <div style="flex: 1 10px;height: auto;align-self: stretch" data-expected-width="10" data-expected-height="30" + data-offset-x="50" data-offset-y="0"></div> + <div style="flex: 1 10px;height: 30px;align-self: flex-start" data-expected-width="10" data-expected-height="30" + data-offset-x="60" data-offset-y="0"></div> + <div style="flex: 1 10px;height: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10" + data-offset-x="0" data-offset-y="30"></div> + <div style="flex: 1 10px;height: 10px;align-self: center" data-expected-width="10" data-expected-height="10" + data-offset-x="10" data-offset-y="40"></div> + <div style="flex: 1 10px;height: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10" + data-offset-x="20" data-offset-y="50"></div> + <div style="flex: 1 10px;height: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10" + data-offset-x="30" data-offset-y="35"></div> + <div style="flex: 1 10px;height: 10px;align-self: baseline; margin-block-start: 5px;" data-expected-width="10" + data-expected-height="10" data-offset-x="40" data-offset-y="35"></div> + <div style="flex: 1 10px;height: auto;align-self: stretch" data-expected-width="10" data-expected-height="30" + data-offset-x="50" data-offset-y="30"></div> + <div style="flex: 1 10px;height: 30px;align-self: flex-start" data-expected-width="10" data-expected-height="30" + data-offset-x="60" data-offset-y="30"></div> + </div> + <div class="title">horizontal-tb ltr row wrap-reverse</div> + <div class="flexbox horizontal-tb ltr row wrap-reverse" style="width: 70px" data-expected-width="70" + data-expected-height="60"> + <div style="flex: 1 10px;height: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10" + data-offset-x="0" data-offset-y="50"></div> + <div style="flex: 1 10px;height: 10px;align-self: center" data-expected-width="10" data-expected-height="10" + data-offset-x="10" data-offset-y="40"></div> + <div style="flex: 1 10px;height: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10" + data-offset-x="20" data-offset-y="30"></div> + <div style="flex: 1 10px;height: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10" + data-offset-x="30" data-offset-y="50"></div> + <div style="flex: 1 10px;height: 10px;align-self: baseline; margin-block-start: 5px;" data-expected-width="10" + data-expected-height="10" data-offset-x="40" data-offset-y="50"></div> + <div style="flex: 1 10px;height: auto;align-self: stretch" data-expected-width="10" data-expected-height="30" + data-offset-x="50" data-offset-y="30"></div> + <div style="flex: 1 10px;height: 30px;align-self: flex-start" data-expected-width="10" data-expected-height="30" + data-offset-x="60" data-offset-y="30"></div> + <div style="flex: 1 10px;height: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10" + data-offset-x="0" data-offset-y="20"></div> + <div style="flex: 1 10px;height: 10px;align-self: center" data-expected-width="10" data-expected-height="10" + data-offset-x="10" data-offset-y="10"></div> + <div style="flex: 1 10px;height: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10" + data-offset-x="20" data-offset-y="0"></div> + <div style="flex: 1 10px;height: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10" + data-offset-x="30" data-offset-y="20"></div> + <div style="flex: 1 10px;height: 10px;align-self: baseline; margin-block-start: 5px;" data-expected-width="10" + data-expected-height="10" data-offset-x="40" data-offset-y="20"></div> + <div style="flex: 1 10px;height: auto;align-self: stretch" data-expected-width="10" data-expected-height="30" + data-offset-x="50" data-offset-y="0"></div> + <div style="flex: 1 10px;height: 30px;align-self: flex-start" data-expected-width="10" data-expected-height="30" + data-offset-x="60" data-offset-y="0"></div> + </div> + <div class="title">horizontal-tb rtl row wrap</div> + <div class="flexbox horizontal-tb rtl row wrap" style="width: 70px" data-expected-width="70" + data-expected-height="60"> + <div style="flex: 1 10px;height: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10" + data-offset-x="60" data-offset-y="0"></div> + <div style="flex: 1 10px;height: 10px;align-self: center" data-expected-width="10" data-expected-height="10" + data-offset-x="50" data-offset-y="10"></div> + <div style="flex: 1 10px;height: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10" + data-offset-x="40" data-offset-y="20"></div> + <div style="flex: 1 10px;height: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10" + data-offset-x="30" data-offset-y="5"></div> + <div style="flex: 1 10px;height: 10px;align-self: baseline; margin-block-start: 5px;" data-expected-width="10" + data-expected-height="10" data-offset-x="20" data-offset-y="5"></div> + <div style="flex: 1 10px;height: auto;align-self: stretch" data-expected-width="10" data-expected-height="30" + data-offset-x="10" data-offset-y="0"></div> + <div style="flex: 1 10px;height: 30px;align-self: flex-start" data-expected-width="10" data-expected-height="30" + data-offset-x="0" data-offset-y="0"></div> + <div style="flex: 1 10px;height: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10" + data-offset-x="60" data-offset-y="30"></div> + <div style="flex: 1 10px;height: 10px;align-self: center" data-expected-width="10" data-expected-height="10" + data-offset-x="50" data-offset-y="40"></div> + <div style="flex: 1 10px;height: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10" + data-offset-x="40" data-offset-y="50"></div> + <div style="flex: 1 10px;height: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10" + data-offset-x="30" data-offset-y="35"></div> + <div style="flex: 1 10px;height: 10px;align-self: baseline; margin-block-start: 5px;" data-expected-width="10" + data-expected-height="10" data-offset-x="20" data-offset-y="35"></div> + <div style="flex: 1 10px;height: auto;align-self: stretch" data-expected-width="10" data-expected-height="30" + data-offset-x="10" data-offset-y="30"></div> + <div style="flex: 1 10px;height: 30px;align-self: flex-start" data-expected-width="10" data-expected-height="30" + data-offset-x="0" data-offset-y="30"></div> + </div> + <div class="title">horizontal-tb rtl row wrap-reverse</div> + <div class="flexbox horizontal-tb rtl row wrap-reverse" style="width: 70px" data-expected-width="70" + data-expected-height="60"> + <div style="flex: 1 10px;height: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10" + data-offset-x="60" data-offset-y="50"></div> + <div style="flex: 1 10px;height: 10px;align-self: center" data-expected-width="10" data-expected-height="10" + data-offset-x="50" data-offset-y="40"></div> + <div style="flex: 1 10px;height: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10" + data-offset-x="40" data-offset-y="30"></div> + <div style="flex: 1 10px;height: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10" + data-offset-x="30" data-offset-y="50"></div> + <div style="flex: 1 10px;height: 10px;align-self: baseline; margin-block-start: 5px;" data-expected-width="10" + data-expected-height="10" data-offset-x="20" data-offset-y="50"></div> + <div style="flex: 1 10px;height: auto;align-self: stretch" data-expected-width="10" data-expected-height="30" + data-offset-x="10" data-offset-y="30"></div> + <div style="flex: 1 10px;height: 30px;align-self: flex-start" data-expected-width="10" data-expected-height="30" + data-offset-x="0" data-offset-y="30"></div> + <div style="flex: 1 10px;height: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10" + data-offset-x="60" data-offset-y="20"></div> + <div style="flex: 1 10px;height: 10px;align-self: center" data-expected-width="10" data-expected-height="10" + data-offset-x="50" data-offset-y="10"></div> + <div style="flex: 1 10px;height: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10" + data-offset-x="40" data-offset-y="0"></div> + <div style="flex: 1 10px;height: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10" + data-offset-x="30" data-offset-y="20"></div> + <div style="flex: 1 10px;height: 10px;align-self: baseline; margin-block-start: 5px;" data-expected-width="10" + data-expected-height="10" data-offset-x="20" data-offset-y="20"></div> + <div style="flex: 1 10px;height: auto;align-self: stretch" data-expected-width="10" data-expected-height="30" + data-offset-x="10" data-offset-y="0"></div> + <div style="flex: 1 10px;height: 30px;align-self: flex-start" data-expected-width="10" data-expected-height="30" + data-offset-x="0" data-offset-y="0"></div> + </div> + <div class="title">horizontal-tb ltr column wrap</div> + <div class="flexbox horizontal-tb ltr column wrap" style="height: 70px" data-expected-width="600" + data-expected-height="70"> + <div style="flex: 1 10px;width: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10" + data-offset-x="0" data-offset-y="0"></div> + <div style="flex: 1 10px;width: 10px;align-self: center" data-expected-width="10" data-expected-height="10" + data-offset-x="10" data-offset-y="10"></div> + <div style="flex: 1 10px;width: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10" + data-offset-x="20" data-offset-y="20"></div> + <div style="flex: 1 10px;width: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10" + data-offset-x="5" data-offset-y="30"></div> + <div style="flex: 1 10px;width: 10px;align-self: baseline; margin-inline-start: 5px;" data-expected-width="10" + data-expected-height="10" data-offset-x="5" data-offset-y="40"></div> + <div style="flex: 1 10px;width: auto;align-self: stretch" data-expected-width="30" data-expected-height="10" + data-offset-x="0" data-offset-y="50"></div> + <div style="flex: 1 10px;width: 30px;align-self: flex-start" data-expected-width="30" data-expected-height="10" + data-offset-x="0" data-offset-y="60"></div> + <div style="flex: 1 10px;width: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10" + data-offset-x="30" data-offset-y="0"></div> + <div style="flex: 1 10px;width: 10px;align-self: center" data-expected-width="10" data-expected-height="10" + data-offset-x="40" data-offset-y="10"></div> + <div style="flex: 1 10px;width: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10" + data-offset-x="50" data-offset-y="20"></div> + <div style="flex: 1 10px;width: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10" + data-offset-x="35" data-offset-y="30"></div> + <div style="flex: 1 10px;width: 10px;align-self: baseline; margin-inline-start: 5px;" data-expected-width="10" + data-expected-height="10" data-offset-x="35" data-offset-y="40"></div> + <div style="flex: 1 10px;width: auto;align-self: stretch" data-expected-width="30" data-expected-height="10" + data-offset-x="30" data-offset-y="50"></div> + <div style="flex: 1 10px;width: 30px;align-self: flex-start" data-expected-width="30" data-expected-height="10" + data-offset-x="30" data-offset-y="60"></div> + </div> + <div class="title">horizontal-tb ltr column wrap-reverse</div> + <div class="flexbox horizontal-tb ltr column wrap-reverse" style="height: 70px" data-expected-width="600" + data-expected-height="70"> + <div style="flex: 1 10px;width: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10" + data-offset-x="590" data-offset-y="0"></div> + <div style="flex: 1 10px;width: 10px;align-self: center" data-expected-width="10" data-expected-height="10" + data-offset-x="580" data-offset-y="10"></div> + <div style="flex: 1 10px;width: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10" + data-offset-x="570" data-offset-y="20"></div> + <div style="flex: 1 10px;width: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10" + data-offset-x="590" data-offset-y="30"></div> + <div style="flex: 1 10px;width: 10px;align-self: baseline; margin-inline-start: 5px;" data-expected-width="10" + data-expected-height="10" data-offset-x="590" data-offset-y="40"></div> + <div style="flex: 1 10px;width: auto;align-self: stretch" data-expected-width="30" data-expected-height="10" + data-offset-x="570" data-offset-y="50"></div> + <div style="flex: 1 10px;width: 30px;align-self: flex-start" data-expected-width="30" data-expected-height="10" + data-offset-x="570" data-offset-y="60"></div> + <div style="flex: 1 10px;width: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10" + data-offset-x="560" data-offset-y="0"></div> + <div style="flex: 1 10px;width: 10px;align-self: center" data-expected-width="10" data-expected-height="10" + data-offset-x="550" data-offset-y="10"></div> + <div style="flex: 1 10px;width: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10" + data-offset-x="540" data-offset-y="20"></div> + <div style="flex: 1 10px;width: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10" + data-offset-x="560" data-offset-y="30"></div> + <div style="flex: 1 10px;width: 10px;align-self: baseline; margin-inline-start: 5px;" data-expected-width="10" + data-expected-height="10" data-offset-x="560" data-offset-y="40"></div> + <div style="flex: 1 10px;width: auto;align-self: stretch" data-expected-width="30" data-expected-height="10" + data-offset-x="540" data-offset-y="50"></div> + <div style="flex: 1 10px;width: 30px;align-self: flex-start" data-expected-width="30" data-expected-height="10" + data-offset-x="540" data-offset-y="60"></div> + </div> + <div class="title">horizontal-tb rtl column wrap</div> + <div class="flexbox horizontal-tb rtl column wrap" style="height: 70px" data-expected-width="600" + data-expected-height="70"> + <div style="flex: 1 10px;width: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10" + data-offset-x="590" data-offset-y="0"></div> + <div style="flex: 1 10px;width: 10px;align-self: center" data-expected-width="10" data-expected-height="10" + data-offset-x="580" data-offset-y="10"></div> + <div style="flex: 1 10px;width: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10" + data-offset-x="570" data-offset-y="20"></div> + <div style="flex: 1 10px;width: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10" + data-offset-x="585" data-offset-y="30"></div> + <div style="flex: 1 10px;width: 10px;align-self: baseline; margin-inline-start: 5px;" data-expected-width="10" + data-expected-height="10" data-offset-x="585" data-offset-y="40"></div> + <div style="flex: 1 10px;width: auto;align-self: stretch" data-expected-width="30" data-expected-height="10" + data-offset-x="570" data-offset-y="50"></div> + <div style="flex: 1 10px;width: 30px;align-self: flex-start" data-expected-width="30" data-expected-height="10" + data-offset-x="570" data-offset-y="60"></div> + <div style="flex: 1 10px;width: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10" + data-offset-x="560" data-offset-y="0"></div> + <div style="flex: 1 10px;width: 10px;align-self: center" data-expected-width="10" data-expected-height="10" + data-offset-x="550" data-offset-y="10"></div> + <div style="flex: 1 10px;width: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10" + data-offset-x="540" data-offset-y="20"></div> + <div style="flex: 1 10px;width: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10" + data-offset-x="555" data-offset-y="30"></div> + <div style="flex: 1 10px;width: 10px;align-self: baseline; margin-inline-start: 5px;" data-expected-width="10" + data-expected-height="10" data-offset-x="555" data-offset-y="40"></div> + <div style="flex: 1 10px;width: auto;align-self: stretch" data-expected-width="30" data-expected-height="10" + data-offset-x="540" data-offset-y="50"></div> + <div style="flex: 1 10px;width: 30px;align-self: flex-start" data-expected-width="30" data-expected-height="10" + data-offset-x="540" data-offset-y="60"></div> + </div> + <div class="title">horizontal-tb rtl column wrap-reverse</div> + <div class="flexbox horizontal-tb rtl column wrap-reverse" style="height: 70px" data-expected-width="600" + data-expected-height="70"> + <div style="flex: 1 10px;width: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10" + data-offset-x="0" data-offset-y="0"></div> + <div style="flex: 1 10px;width: 10px;align-self: center" data-expected-width="10" data-expected-height="10" + data-offset-x="10" data-offset-y="10"></div> + <div style="flex: 1 10px;width: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10" + data-offset-x="20" data-offset-y="20"></div> + <div style="flex: 1 10px;width: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10" + data-offset-x="0" data-offset-y="30"></div> + <div style="flex: 1 10px;width: 10px;align-self: baseline; margin-inline-start: 5px;" data-expected-width="10" + data-expected-height="10" data-offset-x="0" data-offset-y="40"></div> + <div style="flex: 1 10px;width: auto;align-self: stretch" data-expected-width="30" data-expected-height="10" + data-offset-x="0" data-offset-y="50"></div> + <div style="flex: 1 10px;width: 30px;align-self: flex-start" data-expected-width="30" data-expected-height="10" + data-offset-x="0" data-offset-y="60"></div> + <div style="flex: 1 10px;width: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10" + data-offset-x="30" data-offset-y="0"></div> + <div style="flex: 1 10px;width: 10px;align-self: center" data-expected-width="10" data-expected-height="10" + data-offset-x="40" data-offset-y="10"></div> + <div style="flex: 1 10px;width: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10" + data-offset-x="50" data-offset-y="20"></div> + <div style="flex: 1 10px;width: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10" + data-offset-x="30" data-offset-y="30"></div> + <div style="flex: 1 10px;width: 10px;align-self: baseline; margin-inline-start: 5px;" data-expected-width="10" + data-expected-height="10" data-offset-x="30" data-offset-y="40"></div> + <div style="flex: 1 10px;width: auto;align-self: stretch" data-expected-width="30" data-expected-height="10" + data-offset-x="30" data-offset-y="50"></div> + <div style="flex: 1 10px;width: 30px;align-self: flex-start" data-expected-width="30" data-expected-height="10" + data-offset-x="30" data-offset-y="60"></div> + </div> + <div class="title">horizontal-tb ltr row-reverse wrap</div> + <div class="flexbox horizontal-tb ltr row-reverse wrap" style="width: 70px" data-expected-width="70" + data-expected-height="60"> + <div style="flex: 1 10px;height: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10" + data-offset-x="60" data-offset-y="0"></div> + <div style="flex: 1 10px;height: 10px;align-self: center" data-expected-width="10" data-expected-height="10" + data-offset-x="50" data-offset-y="10"></div> + <div style="flex: 1 10px;height: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10" + data-offset-x="40" data-offset-y="20"></div> + <div style="flex: 1 10px;height: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10" + data-offset-x="30" data-offset-y="5"></div> + <div style="flex: 1 10px;height: 10px;align-self: baseline; margin-block-start: 5px;" data-expected-width="10" + data-expected-height="10" data-offset-x="20" data-offset-y="5"></div> + <div style="flex: 1 10px;height: auto;align-self: stretch" data-expected-width="10" data-expected-height="30" + data-offset-x="10" data-offset-y="0"></div> + <div style="flex: 1 10px;height: 30px;align-self: flex-start" data-expected-width="10" data-expected-height="30" + data-offset-x="0" data-offset-y="0"></div> + <div style="flex: 1 10px;height: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10" + data-offset-x="60" data-offset-y="30"></div> + <div style="flex: 1 10px;height: 10px;align-self: center" data-expected-width="10" data-expected-height="10" + data-offset-x="50" data-offset-y="40"></div> + <div style="flex: 1 10px;height: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10" + data-offset-x="40" data-offset-y="50"></div> + <div style="flex: 1 10px;height: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10" + data-offset-x="30" data-offset-y="35"></div> + <div style="flex: 1 10px;height: 10px;align-self: baseline; margin-block-start: 5px;" data-expected-width="10" + data-expected-height="10" data-offset-x="20" data-offset-y="35"></div> + <div style="flex: 1 10px;height: auto;align-self: stretch" data-expected-width="10" data-expected-height="30" + data-offset-x="10" data-offset-y="30"></div> + <div style="flex: 1 10px;height: 30px;align-self: flex-start" data-expected-width="10" data-expected-height="30" + data-offset-x="0" data-offset-y="30"></div> + </div> + <div class="title">horizontal-tb ltr row-reverse wrap-reverse</div> + <div class="flexbox horizontal-tb ltr row-reverse wrap-reverse" style="width: 70px" data-expected-width="70" + data-expected-height="60"> + <div style="flex: 1 10px;height: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10" + data-offset-x="60" data-offset-y="50"></div> + <div style="flex: 1 10px;height: 10px;align-self: center" data-expected-width="10" data-expected-height="10" + data-offset-x="50" data-offset-y="40"></div> + <div style="flex: 1 10px;height: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10" + data-offset-x="40" data-offset-y="30"></div> + <div style="flex: 1 10px;height: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10" + data-offset-x="30" data-offset-y="50"></div> + <div style="flex: 1 10px;height: 10px;align-self: baseline; margin-block-start: 5px;" data-expected-width="10" + data-expected-height="10" data-offset-x="20" data-offset-y="50"></div> + <div style="flex: 1 10px;height: auto;align-self: stretch" data-expected-width="10" data-expected-height="30" + data-offset-x="10" data-offset-y="30"></div> + <div style="flex: 1 10px;height: 30px;align-self: flex-start" data-expected-width="10" data-expected-height="30" + data-offset-x="0" data-offset-y="30"></div> + <div style="flex: 1 10px;height: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10" + data-offset-x="60" data-offset-y="20"></div> + <div style="flex: 1 10px;height: 10px;align-self: center" data-expected-width="10" data-expected-height="10" + data-offset-x="50" data-offset-y="10"></div> + <div style="flex: 1 10px;height: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10" + data-offset-x="40" data-offset-y="0"></div> + <div style="flex: 1 10px;height: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10" + data-offset-x="30" data-offset-y="20"></div> + <div style="flex: 1 10px;height: 10px;align-self: baseline; margin-block-start: 5px;" data-expected-width="10" + data-expected-height="10" data-offset-x="20" data-offset-y="20"></div> + <div style="flex: 1 10px;height: auto;align-self: stretch" data-expected-width="10" data-expected-height="30" + data-offset-x="10" data-offset-y="0"></div> + <div style="flex: 1 10px;height: 30px;align-self: flex-start" data-expected-width="10" data-expected-height="30" + data-offset-x="0" data-offset-y="0"></div> + </div> + <div class="title">horizontal-tb rtl row-reverse wrap</div> + <div class="flexbox horizontal-tb rtl row-reverse wrap" style="width: 70px" data-expected-width="70" + data-expected-height="60"> + <div style="flex: 1 10px;height: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10" + data-offset-x="0" data-offset-y="0"></div> + <div style="flex: 1 10px;height: 10px;align-self: center" data-expected-width="10" data-expected-height="10" + data-offset-x="10" data-offset-y="10"></div> + <div style="flex: 1 10px;height: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10" + data-offset-x="20" data-offset-y="20"></div> + <div style="flex: 1 10px;height: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10" + data-offset-x="30" data-offset-y="5"></div> + <div style="flex: 1 10px;height: 10px;align-self: baseline; margin-block-start: 5px;" data-expected-width="10" + data-expected-height="10" data-offset-x="40" data-offset-y="5"></div> + <div style="flex: 1 10px;height: auto;align-self: stretch" data-expected-width="10" data-expected-height="30" + data-offset-x="50" data-offset-y="0"></div> + <div style="flex: 1 10px;height: 30px;align-self: flex-start" data-expected-width="10" data-expected-height="30" + data-offset-x="60" data-offset-y="0"></div> + <div style="flex: 1 10px;height: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10" + data-offset-x="0" data-offset-y="30"></div> + <div style="flex: 1 10px;height: 10px;align-self: center" data-expected-width="10" data-expected-height="10" + data-offset-x="10" data-offset-y="40"></div> + <div style="flex: 1 10px;height: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10" + data-offset-x="20" data-offset-y="50"></div> + <div style="flex: 1 10px;height: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10" + data-offset-x="30" data-offset-y="35"></div> + <div style="flex: 1 10px;height: 10px;align-self: baseline; margin-block-start: 5px;" data-expected-width="10" + data-expected-height="10" data-offset-x="40" data-offset-y="35"></div> + <div style="flex: 1 10px;height: auto;align-self: stretch" data-expected-width="10" data-expected-height="30" + data-offset-x="50" data-offset-y="30"></div> + <div style="flex: 1 10px;height: 30px;align-self: flex-start" data-expected-width="10" data-expected-height="30" + data-offset-x="60" data-offset-y="30"></div> + </div> + <div class="title">horizontal-tb rtl row-reverse wrap-reverse</div> + <div class="flexbox horizontal-tb rtl row-reverse wrap-reverse" style="width: 70px" data-expected-width="70" + data-expected-height="60"> + <div style="flex: 1 10px;height: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10" + data-offset-x="0" data-offset-y="50"></div> + <div style="flex: 1 10px;height: 10px;align-self: center" data-expected-width="10" data-expected-height="10" + data-offset-x="10" data-offset-y="40"></div> + <div style="flex: 1 10px;height: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10" + data-offset-x="20" data-offset-y="30"></div> + <div style="flex: 1 10px;height: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10" + data-offset-x="30" data-offset-y="50"></div> + <div style="flex: 1 10px;height: 10px;align-self: baseline; margin-block-start: 5px;" data-expected-width="10" + data-expected-height="10" data-offset-x="40" data-offset-y="50"></div> + <div style="flex: 1 10px;height: auto;align-self: stretch" data-expected-width="10" data-expected-height="30" + data-offset-x="50" data-offset-y="30"></div> + <div style="flex: 1 10px;height: 30px;align-self: flex-start" data-expected-width="10" data-expected-height="30" + data-offset-x="60" data-offset-y="30"></div> + <div style="flex: 1 10px;height: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10" + data-offset-x="0" data-offset-y="20"></div> + <div style="flex: 1 10px;height: 10px;align-self: center" data-expected-width="10" data-expected-height="10" + data-offset-x="10" data-offset-y="10"></div> + <div style="flex: 1 10px;height: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10" + data-offset-x="20" data-offset-y="0"></div> + <div style="flex: 1 10px;height: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10" + data-offset-x="30" data-offset-y="20"></div> + <div style="flex: 1 10px;height: 10px;align-self: baseline; margin-block-start: 5px;" data-expected-width="10" + data-expected-height="10" data-offset-x="40" data-offset-y="20"></div> + <div style="flex: 1 10px;height: auto;align-self: stretch" data-expected-width="10" data-expected-height="30" + data-offset-x="50" data-offset-y="0"></div> + <div style="flex: 1 10px;height: 30px;align-self: flex-start" data-expected-width="10" data-expected-height="30" + data-offset-x="60" data-offset-y="0"></div> + </div> + <div class="title">horizontal-tb ltr column-reverse wrap</div> + <div class="flexbox horizontal-tb ltr column-reverse wrap" style="height: 70px" data-expected-width="600" + data-expected-height="70"> + <div style="flex: 1 10px;width: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10" + data-offset-x="0" data-offset-y="60"></div> + <div style="flex: 1 10px;width: 10px;align-self: center" data-expected-width="10" data-expected-height="10" + data-offset-x="10" data-offset-y="50"></div> + <div style="flex: 1 10px;width: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10" + data-offset-x="20" data-offset-y="40"></div> + <div style="flex: 1 10px;width: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10" + data-offset-x="5" data-offset-y="30"></div> + <div style="flex: 1 10px;width: 10px;align-self: baseline; margin-inline-start: 5px;" data-expected-width="10" + data-expected-height="10" data-offset-x="5" data-offset-y="20"></div> + <div style="flex: 1 10px;width: auto;align-self: stretch" data-expected-width="30" data-expected-height="10" + data-offset-x="0" data-offset-y="10"></div> + <div style="flex: 1 10px;width: 30px;align-self: flex-start" data-expected-width="30" data-expected-height="10" + data-offset-x="0" data-offset-y="0"></div> + <div style="flex: 1 10px;width: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10" + data-offset-x="30" data-offset-y="60"></div> + <div style="flex: 1 10px;width: 10px;align-self: center" data-expected-width="10" data-expected-height="10" + data-offset-x="40" data-offset-y="50"></div> + <div style="flex: 1 10px;width: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10" + data-offset-x="50" data-offset-y="40"></div> + <div style="flex: 1 10px;width: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10" + data-offset-x="35" data-offset-y="30"></div> + <div style="flex: 1 10px;width: 10px;align-self: baseline; margin-inline-start: 5px;" data-expected-width="10" + data-expected-height="10" data-offset-x="35" data-offset-y="20"></div> + <div style="flex: 1 10px;width: auto;align-self: stretch" data-expected-width="30" data-expected-height="10" + data-offset-x="30" data-offset-y="10"></div> + <div style="flex: 1 10px;width: 30px;align-self: flex-start" data-expected-width="30" data-expected-height="10" + data-offset-x="30" data-offset-y="0"></div> + </div> + <div class="title">horizontal-tb ltr column-reverse wrap-reverse</div> + <div class="flexbox horizontal-tb ltr column-reverse wrap-reverse" style="height: 70px" data-expected-width="600" + data-expected-height="70"> + <div style="flex: 1 10px;width: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10" + data-offset-x="590" data-offset-y="60"></div> + <div style="flex: 1 10px;width: 10px;align-self: center" data-expected-width="10" data-expected-height="10" + data-offset-x="580" data-offset-y="50"></div> + <div style="flex: 1 10px;width: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10" + data-offset-x="570" data-offset-y="40"></div> + <div style="flex: 1 10px;width: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10" + data-offset-x="590" data-offset-y="30"></div> + <div style="flex: 1 10px;width: 10px;align-self: baseline; margin-inline-start: 5px;" data-expected-width="10" + data-expected-height="10" data-offset-x="590" data-offset-y="20"></div> + <div style="flex: 1 10px;width: auto;align-self: stretch" data-expected-width="30" data-expected-height="10" + data-offset-x="570" data-offset-y="10"></div> + <div style="flex: 1 10px;width: 30px;align-self: flex-start" data-expected-width="30" data-expected-height="10" + data-offset-x="570" data-offset-y="0"></div> + <div style="flex: 1 10px;width: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10" + data-offset-x="560" data-offset-y="60"></div> + <div style="flex: 1 10px;width: 10px;align-self: center" data-expected-width="10" data-expected-height="10" + data-offset-x="550" data-offset-y="50"></div> + <div style="flex: 1 10px;width: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10" + data-offset-x="540" data-offset-y="40"></div> + <div style="flex: 1 10px;width: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10" + data-offset-x="560" data-offset-y="30"></div> + <div style="flex: 1 10px;width: 10px;align-self: baseline; margin-inline-start: 5px;" data-expected-width="10" + data-expected-height="10" data-offset-x="560" data-offset-y="20"></div> + <div style="flex: 1 10px;width: auto;align-self: stretch" data-expected-width="30" data-expected-height="10" + data-offset-x="540" data-offset-y="10"></div> + <div style="flex: 1 10px;width: 30px;align-self: flex-start" data-expected-width="30" data-expected-height="10" + data-offset-x="540" data-offset-y="0"></div> + </div> + <div class="title">horizontal-tb rtl column-reverse wrap</div> + <div class="flexbox horizontal-tb rtl column-reverse wrap" style="height: 70px" data-expected-width="600" + data-expected-height="70"> + <div style="flex: 1 10px;width: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10" + data-offset-x="590" data-offset-y="60"></div> + <div style="flex: 1 10px;width: 10px;align-self: center" data-expected-width="10" data-expected-height="10" + data-offset-x="580" data-offset-y="50"></div> + <div style="flex: 1 10px;width: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10" + data-offset-x="570" data-offset-y="40"></div> + <div style="flex: 1 10px;width: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10" + data-offset-x="585" data-offset-y="30"></div> + <div style="flex: 1 10px;width: 10px;align-self: baseline; margin-inline-start: 5px;" data-expected-width="10" + data-expected-height="10" data-offset-x="585" data-offset-y="20"></div> + <div style="flex: 1 10px;width: auto;align-self: stretch" data-expected-width="30" data-expected-height="10" + data-offset-x="570" data-offset-y="10"></div> + <div style="flex: 1 10px;width: 30px;align-self: flex-start" data-expected-width="30" data-expected-height="10" + data-offset-x="570" data-offset-y="0"></div> + <div style="flex: 1 10px;width: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10" + data-offset-x="560" data-offset-y="60"></div> + <div style="flex: 1 10px;width: 10px;align-self: center" data-expected-width="10" data-expected-height="10" + data-offset-x="550" data-offset-y="50"></div> + <div style="flex: 1 10px;width: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10" + data-offset-x="540" data-offset-y="40"></div> + <div style="flex: 1 10px;width: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10" + data-offset-x="555" data-offset-y="30"></div> + <div style="flex: 1 10px;width: 10px;align-self: baseline; margin-inline-start: 5px;" data-expected-width="10" + data-expected-height="10" data-offset-x="555" data-offset-y="20"></div> + <div style="flex: 1 10px;width: auto;align-self: stretch" data-expected-width="30" data-expected-height="10" + data-offset-x="540" data-offset-y="10"></div> + <div style="flex: 1 10px;width: 30px;align-self: flex-start" data-expected-width="30" data-expected-height="10" + data-offset-x="540" data-offset-y="0"></div> + </div> + <div class="title">horizontal-tb rtl column-reverse wrap-reverse</div> + <div class="flexbox horizontal-tb rtl column-reverse wrap-reverse" style="height: 70px" data-expected-width="600" + data-expected-height="70"> + <div style="flex: 1 10px;width: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10" + data-offset-x="0" data-offset-y="60"></div> + <div style="flex: 1 10px;width: 10px;align-self: center" data-expected-width="10" data-expected-height="10" + data-offset-x="10" data-offset-y="50"></div> + <div style="flex: 1 10px;width: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10" + data-offset-x="20" data-offset-y="40"></div> + <div style="flex: 1 10px;width: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10" + data-offset-x="0" data-offset-y="30"></div> + <div style="flex: 1 10px;width: 10px;align-self: baseline; margin-inline-start: 5px;" data-expected-width="10" + data-expected-height="10" data-offset-x="0" data-offset-y="20"></div> + <div style="flex: 1 10px;width: auto;align-self: stretch" data-expected-width="30" data-expected-height="10" + data-offset-x="0" data-offset-y="10"></div> + <div style="flex: 1 10px;width: 30px;align-self: flex-start" data-expected-width="30" data-expected-height="10" + data-offset-x="0" data-offset-y="0"></div> + <div style="flex: 1 10px;width: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10" + data-offset-x="30" data-offset-y="60"></div> + <div style="flex: 1 10px;width: 10px;align-self: center" data-expected-width="10" data-expected-height="10" + data-offset-x="40" data-offset-y="50"></div> + <div style="flex: 1 10px;width: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10" + data-offset-x="50" data-offset-y="40"></div> + <div style="flex: 1 10px;width: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10" + data-offset-x="30" data-offset-y="30"></div> + <div style="flex: 1 10px;width: 10px;align-self: baseline; margin-inline-start: 5px;" data-expected-width="10" + data-expected-height="10" data-offset-x="30" data-offset-y="20"></div> + <div style="flex: 1 10px;width: auto;align-self: stretch" data-expected-width="30" data-expected-height="10" + data-offset-x="30" data-offset-y="10"></div> + <div style="flex: 1 10px;width: 30px;align-self: flex-start" data-expected-width="30" data-expected-height="10" + data-offset-x="30" data-offset-y="0"></div> + </div> + <div class="title">vertical-rl ltr row wrap</div> + <div class="flexbox vertical-rl ltr row wrap" style="height: 70px" data-expected-width="60" data-expected-height="70"> + <div style="flex: 1 10px;width: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10" + data-offset-x="50" data-offset-y="0"></div> + <div style="flex: 1 10px;width: 10px;align-self: center" data-expected-width="10" data-expected-height="10" + data-offset-x="40" data-offset-y="10"></div> + <div style="flex: 1 10px;width: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10" + data-offset-x="30" data-offset-y="20"></div> + <div style="flex: 1 10px;width: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10" + data-offset-x="45" data-offset-y="30"></div> + <div style="flex: 1 10px;width: 10px;align-self: baseline; margin-block-start: 5px;" data-expected-width="10" + data-expected-height="10" data-offset-x="45" data-offset-y="40"></div> + <div style="flex: 1 10px;width: auto;align-self: stretch" data-expected-width="30" data-expected-height="10" + data-offset-x="30" data-offset-y="50"></div> + <div style="flex: 1 10px;width: 30px;align-self: flex-start" data-expected-width="30" data-expected-height="10" + data-offset-x="30" data-offset-y="60"></div> + <div style="flex: 1 10px;width: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10" + data-offset-x="20" data-offset-y="0"></div> + <div style="flex: 1 10px;width: 10px;align-self: center" data-expected-width="10" data-expected-height="10" + data-offset-x="10" data-offset-y="10"></div> + <div style="flex: 1 10px;width: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10" + data-offset-x="0" data-offset-y="20"></div> + <div style="flex: 1 10px;width: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10" + data-offset-x="15" data-offset-y="30"></div> + <div style="flex: 1 10px;width: 10px;align-self: baseline; margin-block-start: 5px;" data-expected-width="10" + data-expected-height="10" data-offset-x="15" data-offset-y="40"></div> + <div style="flex: 1 10px;width: auto;align-self: stretch" data-expected-width="30" data-expected-height="10" + data-offset-x="0" data-offset-y="50"></div> + <div style="flex: 1 10px;width: 30px;align-self: flex-start" data-expected-width="30" data-expected-height="10" + data-offset-x="0" data-offset-y="60"></div> + </div> + <div class="title">vertical-rl ltr row wrap-reverse</div> + <div class="flexbox vertical-rl ltr row wrap-reverse" style="height: 70px" data-expected-width="60" + data-expected-height="70"> + <div style="flex: 1 10px;width: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10" + data-offset-x="0" data-offset-y="0"></div> + <div style="flex: 1 10px;width: 10px;align-self: center" data-expected-width="10" data-expected-height="10" + data-offset-x="10" data-offset-y="10"></div> + <div style="flex: 1 10px;width: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10" + data-offset-x="20" data-offset-y="20"></div> + <div style="flex: 1 10px;width: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10" + data-offset-x="0" data-offset-y="30"></div> + <div style="flex: 1 10px;width: 10px;align-self: baseline; margin-block-start: 5px;" data-expected-width="10" + data-expected-height="10" data-offset-x="0" data-offset-y="40"></div> + <div style="flex: 1 10px;width: auto;align-self: stretch" data-expected-width="30" data-expected-height="10" + data-offset-x="0" data-offset-y="50"></div> + <div style="flex: 1 10px;width: 30px;align-self: flex-start" data-expected-width="30" data-expected-height="10" + data-offset-x="0" data-offset-y="60"></div> + <div style="flex: 1 10px;width: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10" + data-offset-x="30" data-offset-y="0"></div> + <div style="flex: 1 10px;width: 10px;align-self: center" data-expected-width="10" data-expected-height="10" + data-offset-x="40" data-offset-y="10"></div> + <div style="flex: 1 10px;width: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10" + data-offset-x="50" data-offset-y="20"></div> + <div style="flex: 1 10px;width: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10" + data-offset-x="30" data-offset-y="30"></div> + <div style="flex: 1 10px;width: 10px;align-self: baseline; margin-block-start: 5px;" data-expected-width="10" + data-expected-height="10" data-offset-x="30" data-offset-y="40"></div> + <div style="flex: 1 10px;width: auto;align-self: stretch" data-expected-width="30" data-expected-height="10" + data-offset-x="30" data-offset-y="50"></div> + <div style="flex: 1 10px;width: 30px;align-self: flex-start" data-expected-width="30" data-expected-height="10" + data-offset-x="30" data-offset-y="60"></div> + </div> + <div class="title">vertical-rl rtl row wrap</div> + <div class="flexbox vertical-rl rtl row wrap" style="height: 70px" data-expected-width="60" data-expected-height="70"> + <div style="flex: 1 10px;width: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10" + data-offset-x="50" data-offset-y="60"></div> + <div style="flex: 1 10px;width: 10px;align-self: center" data-expected-width="10" data-expected-height="10" + data-offset-x="40" data-offset-y="50"></div> + <div style="flex: 1 10px;width: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10" + data-offset-x="30" data-offset-y="40"></div> + <div style="flex: 1 10px;width: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10" + data-offset-x="45" data-offset-y="30"></div> + <div style="flex: 1 10px;width: 10px;align-self: baseline; margin-block-start: 5px;" data-expected-width="10" + data-expected-height="10" data-offset-x="45" data-offset-y="20"></div> + <div style="flex: 1 10px;width: auto;align-self: stretch" data-expected-width="30" data-expected-height="10" + data-offset-x="30" data-offset-y="10"></div> + <div style="flex: 1 10px;width: 30px;align-self: flex-start" data-expected-width="30" data-expected-height="10" + data-offset-x="30" data-offset-y="0"></div> + <div style="flex: 1 10px;width: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10" + data-offset-x="20" data-offset-y="60"></div> + <div style="flex: 1 10px;width: 10px;align-self: center" data-expected-width="10" data-expected-height="10" + data-offset-x="10" data-offset-y="50"></div> + <div style="flex: 1 10px;width: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10" + data-offset-x="0" data-offset-y="40"></div> + <div style="flex: 1 10px;width: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10" + data-offset-x="15" data-offset-y="30"></div> + <div style="flex: 1 10px;width: 10px;align-self: baseline; margin-block-start: 5px;" data-expected-width="10" + data-expected-height="10" data-offset-x="15" data-offset-y="20"></div> + <div style="flex: 1 10px;width: auto;align-self: stretch" data-expected-width="30" data-expected-height="10" + data-offset-x="0" data-offset-y="10"></div> + <div style="flex: 1 10px;width: 30px;align-self: flex-start" data-expected-width="30" data-expected-height="10" + data-offset-x="0" data-offset-y="0"></div> + </div> + <div class="title">vertical-rl rtl row wrap-reverse</div> + <div class="flexbox vertical-rl rtl row wrap-reverse" style="height: 70px" data-expected-width="60" + data-expected-height="70"> + <div style="flex: 1 10px;width: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10" + data-offset-x="0" data-offset-y="60"></div> + <div style="flex: 1 10px;width: 10px;align-self: center" data-expected-width="10" data-expected-height="10" + data-offset-x="10" data-offset-y="50"></div> + <div style="flex: 1 10px;width: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10" + data-offset-x="20" data-offset-y="40"></div> + <div style="flex: 1 10px;width: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10" + data-offset-x="0" data-offset-y="30"></div> + <div style="flex: 1 10px;width: 10px;align-self: baseline; margin-block-start: 5px;" data-expected-width="10" + data-expected-height="10" data-offset-x="0" data-offset-y="20"></div> + <div style="flex: 1 10px;width: auto;align-self: stretch" data-expected-width="30" data-expected-height="10" + data-offset-x="0" data-offset-y="10"></div> + <div style="flex: 1 10px;width: 30px;align-self: flex-start" data-expected-width="30" data-expected-height="10" + data-offset-x="0" data-offset-y="0"></div> + <div style="flex: 1 10px;width: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10" + data-offset-x="30" data-offset-y="60"></div> + <div style="flex: 1 10px;width: 10px;align-self: center" data-expected-width="10" data-expected-height="10" + data-offset-x="40" data-offset-y="50"></div> + <div style="flex: 1 10px;width: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10" + data-offset-x="50" data-offset-y="40"></div> + <div style="flex: 1 10px;width: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10" + data-offset-x="30" data-offset-y="30"></div> + <div style="flex: 1 10px;width: 10px;align-self: baseline; margin-block-start: 5px;" data-expected-width="10" + data-expected-height="10" data-offset-x="30" data-offset-y="20"></div> + <div style="flex: 1 10px;width: auto;align-self: stretch" data-expected-width="30" data-expected-height="10" + data-offset-x="30" data-offset-y="10"></div> + <div style="flex: 1 10px;width: 30px;align-self: flex-start" data-expected-width="30" data-expected-height="10" + data-offset-x="30" data-offset-y="0"></div> + </div> + <div class="title">vertical-rl ltr column wrap</div> + <div class="flexbox vertical-rl ltr column wrap" style="width: 70px" data-expected-width="70" + data-expected-height="60"> + <div style="flex: 1 10px;height: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10" + data-offset-x="60" data-offset-y="0"></div> + <div style="flex: 1 10px;height: 10px;align-self: center" data-expected-width="10" data-expected-height="10" + data-offset-x="50" data-offset-y="10"></div> + <div style="flex: 1 10px;height: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10" + data-offset-x="40" data-offset-y="20"></div> + <div style="flex: 1 10px;height: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10" + data-offset-x="30" data-offset-y="5"></div> + <div style="flex: 1 10px;height: 10px;align-self: baseline; margin-inline-start: 5px;" data-expected-width="10" + data-expected-height="10" data-offset-x="20" data-offset-y="5"></div> + <div style="flex: 1 10px;height: auto;align-self: stretch" data-expected-width="10" data-expected-height="30" + data-offset-x="10" data-offset-y="0"></div> + <div style="flex: 1 10px;height: 30px;align-self: flex-start" data-expected-width="10" data-expected-height="30" + data-offset-x="0" data-offset-y="0"></div> + <div style="flex: 1 10px;height: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10" + data-offset-x="60" data-offset-y="30"></div> + <div style="flex: 1 10px;height: 10px;align-self: center" data-expected-width="10" data-expected-height="10" + data-offset-x="50" data-offset-y="40"></div> + <div style="flex: 1 10px;height: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10" + data-offset-x="40" data-offset-y="50"></div> + <div style="flex: 1 10px;height: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10" + data-offset-x="30" data-offset-y="35"></div> + <div style="flex: 1 10px;height: 10px;align-self: baseline; margin-inline-start: 5px;" data-expected-width="10" + data-expected-height="10" data-offset-x="20" data-offset-y="35"></div> + <div style="flex: 1 10px;height: auto;align-self: stretch" data-expected-width="10" data-expected-height="30" + data-offset-x="10" data-offset-y="30"></div> + <div style="flex: 1 10px;height: 30px;align-self: flex-start" data-expected-width="10" data-expected-height="30" + data-offset-x="0" data-offset-y="30"></div> + </div> + <div class="title">vertical-rl ltr column wrap-reverse</div> + <div class="flexbox vertical-rl ltr column wrap-reverse" style="width: 70px" data-expected-width="70" + data-expected-height="60"> + <div style="flex: 1 10px;height: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10" + data-offset-x="60" data-offset-y="50"></div> + <div style="flex: 1 10px;height: 10px;align-self: center" data-expected-width="10" data-expected-height="10" + data-offset-x="50" data-offset-y="40"></div> + <div style="flex: 1 10px;height: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10" + data-offset-x="40" data-offset-y="30"></div> + <div style="flex: 1 10px;height: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10" + data-offset-x="30" data-offset-y="50"></div> + <div style="flex: 1 10px;height: 10px;align-self: baseline; margin-inline-start: 5px;" data-expected-width="10" + data-expected-height="10" data-offset-x="20" data-offset-y="50"></div> + <div style="flex: 1 10px;height: auto;align-self: stretch" data-expected-width="10" data-expected-height="30" + data-offset-x="10" data-offset-y="30"></div> + <div style="flex: 1 10px;height: 30px;align-self: flex-start" data-expected-width="10" data-expected-height="30" + data-offset-x="0" data-offset-y="30"></div> + <div style="flex: 1 10px;height: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10" + data-offset-x="60" data-offset-y="20"></div> + <div style="flex: 1 10px;height: 10px;align-self: center" data-expected-width="10" data-expected-height="10" + data-offset-x="50" data-offset-y="10"></div> + <div style="flex: 1 10px;height: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10" + data-offset-x="40" data-offset-y="0"></div> + <div style="flex: 1 10px;height: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10" + data-offset-x="30" data-offset-y="20"></div> + <div style="flex: 1 10px;height: 10px;align-self: baseline; margin-inline-start: 5px;" data-expected-width="10" + data-expected-height="10" data-offset-x="20" data-offset-y="20"></div> + <div style="flex: 1 10px;height: auto;align-self: stretch" data-expected-width="10" data-expected-height="30" + data-offset-x="10" data-offset-y="0"></div> + <div style="flex: 1 10px;height: 30px;align-self: flex-start" data-expected-width="10" data-expected-height="30" + data-offset-x="0" data-offset-y="0"></div> + </div> + <div class="title">vertical-rl rtl column wrap</div> + <div class="flexbox vertical-rl rtl column wrap" style="width: 70px" data-expected-width="70" + data-expected-height="60"> + <div style="flex: 1 10px;height: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10" + data-offset-x="60" data-offset-y="50"></div> + <div style="flex: 1 10px;height: 10px;align-self: center" data-expected-width="10" data-expected-height="10" + data-offset-x="50" data-offset-y="40"></div> + <div style="flex: 1 10px;height: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10" + data-offset-x="40" data-offset-y="30"></div> + <div style="flex: 1 10px;height: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10" + data-offset-x="30" data-offset-y="30"></div> + <div style="flex: 1 10px;height: 10px;align-self: baseline; margin-inline-start: 5px;" data-expected-width="10" + data-expected-height="10" data-offset-x="20" data-offset-y="30"></div> + <div style="flex: 1 10px;height: auto;align-self: stretch" data-expected-width="10" data-expected-height="30" + data-offset-x="10" data-offset-y="30"></div> + <div style="flex: 1 10px;height: 30px;align-self: flex-start" data-expected-width="10" data-expected-height="30" + data-offset-x="0" data-offset-y="30"></div> + <div style="flex: 1 10px;height: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10" + data-offset-x="60" data-offset-y="20"></div> + <div style="flex: 1 10px;height: 10px;align-self: center" data-expected-width="10" data-expected-height="10" + data-offset-x="50" data-offset-y="10"></div> + <div style="flex: 1 10px;height: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10" + data-offset-x="40" data-offset-y="0"></div> + <div style="flex: 1 10px;height: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10" + data-offset-x="30" data-offset-y="0"></div> + <div style="flex: 1 10px;height: 10px;align-self: baseline; margin-inline-start: 5px;" data-expected-width="10" + data-expected-height="10" data-offset-x="20" data-offset-y="0"></div> + <div style="flex: 1 10px;height: auto;align-self: stretch" data-expected-width="10" data-expected-height="30" + data-offset-x="10" data-offset-y="0"></div> + <div style="flex: 1 10px;height: 30px;align-self: flex-start" data-expected-width="10" data-expected-height="30" + data-offset-x="0" data-offset-y="0"></div> + </div> + <div class="title">vertical-rl rtl column wrap-reverse</div> + <div class="flexbox vertical-rl rtl column wrap-reverse" style="width: 70px" data-expected-width="70" + data-expected-height="60"> + <div style="flex: 1 10px;height: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10" + data-offset-x="60" data-offset-y="0"></div> + <div style="flex: 1 10px;height: 10px;align-self: center" data-expected-width="10" data-expected-height="10" + data-offset-x="50" data-offset-y="10"></div> + <div style="flex: 1 10px;height: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10" + data-offset-x="40" data-offset-y="20"></div> + <div style="flex: 1 10px;height: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10" + data-offset-x="30" data-offset-y="15"></div> + <div style="flex: 1 10px;height: 10px;align-self: baseline; margin-inline-start: 5px;" data-expected-width="10" + data-expected-height="10" data-offset-x="20" data-offset-y="15"></div> + <div style="flex: 1 10px;height: auto;align-self: stretch" data-expected-width="10" data-expected-height="30" + data-offset-x="10" data-offset-y="0"></div> + <div style="flex: 1 10px;height: 30px;align-self: flex-start" data-expected-width="10" data-expected-height="30" + data-offset-x="0" data-offset-y="0"></div> + <div style="flex: 1 10px;height: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10" + data-offset-x="60" data-offset-y="30"></div> + <div style="flex: 1 10px;height: 10px;align-self: center" data-expected-width="10" data-expected-height="10" + data-offset-x="50" data-offset-y="40"></div> + <div style="flex: 1 10px;height: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10" + data-offset-x="40" data-offset-y="50"></div> + <div style="flex: 1 10px;height: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10" + data-offset-x="30" data-offset-y="45"></div> + <div style="flex: 1 10px;height: 10px;align-self: baseline; margin-inline-start: 5px;" data-expected-width="10" + data-expected-height="10" data-offset-x="20" data-offset-y="45"></div> + <div style="flex: 1 10px;height: auto;align-self: stretch" data-expected-width="10" data-expected-height="30" + data-offset-x="10" data-offset-y="30"></div> + <div style="flex: 1 10px;height: 30px;align-self: flex-start" data-expected-width="10" data-expected-height="30" + data-offset-x="0" data-offset-y="30"></div> + </div> + <div class="title">vertical-rl ltr row-reverse wrap</div> + <div class="flexbox vertical-rl ltr row-reverse wrap" style="height: 70px" data-expected-width="60" + data-expected-height="70"> + <div style="flex: 1 10px;width: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10" + data-offset-x="50" data-offset-y="60"></div> + <div style="flex: 1 10px;width: 10px;align-self: center" data-expected-width="10" data-expected-height="10" + data-offset-x="40" data-offset-y="50"></div> + <div style="flex: 1 10px;width: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10" + data-offset-x="30" data-offset-y="40"></div> + <div style="flex: 1 10px;width: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10" + data-offset-x="45" data-offset-y="30"></div> + <div style="flex: 1 10px;width: 10px;align-self: baseline; margin-block-start: 5px;" data-expected-width="10" + data-expected-height="10" data-offset-x="45" data-offset-y="20"></div> + <div style="flex: 1 10px;width: auto;align-self: stretch" data-expected-width="30" data-expected-height="10" + data-offset-x="30" data-offset-y="10"></div> + <div style="flex: 1 10px;width: 30px;align-self: flex-start" data-expected-width="30" data-expected-height="10" + data-offset-x="30" data-offset-y="0"></div> + <div style="flex: 1 10px;width: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10" + data-offset-x="20" data-offset-y="60"></div> + <div style="flex: 1 10px;width: 10px;align-self: center" data-expected-width="10" data-expected-height="10" + data-offset-x="10" data-offset-y="50"></div> + <div style="flex: 1 10px;width: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10" + data-offset-x="0" data-offset-y="40"></div> + <div style="flex: 1 10px;width: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10" + data-offset-x="15" data-offset-y="30"></div> + <div style="flex: 1 10px;width: 10px;align-self: baseline; margin-block-start: 5px;" data-expected-width="10" + data-expected-height="10" data-offset-x="15" data-offset-y="20"></div> + <div style="flex: 1 10px;width: auto;align-self: stretch" data-expected-width="30" data-expected-height="10" + data-offset-x="0" data-offset-y="10"></div> + <div style="flex: 1 10px;width: 30px;align-self: flex-start" data-expected-width="30" data-expected-height="10" + data-offset-x="0" data-offset-y="0"></div> + </div> + <div class="title">vertical-rl ltr row-reverse wrap-reverse</div> + <div class="flexbox vertical-rl ltr row-reverse wrap-reverse" style="height: 70px" data-expected-width="60" + data-expected-height="70"> + <div style="flex: 1 10px;width: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10" + data-offset-x="0" data-offset-y="60"></div> + <div style="flex: 1 10px;width: 10px;align-self: center" data-expected-width="10" data-expected-height="10" + data-offset-x="10" data-offset-y="50"></div> + <div style="flex: 1 10px;width: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10" + data-offset-x="20" data-offset-y="40"></div> + <div style="flex: 1 10px;width: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10" + data-offset-x="0" data-offset-y="30"></div> + <div style="flex: 1 10px;width: 10px;align-self: baseline; margin-block-start: 5px;" data-expected-width="10" + data-expected-height="10" data-offset-x="0" data-offset-y="20"></div> + <div style="flex: 1 10px;width: auto;align-self: stretch" data-expected-width="30" data-expected-height="10" + data-offset-x="0" data-offset-y="10"></div> + <div style="flex: 1 10px;width: 30px;align-self: flex-start" data-expected-width="30" data-expected-height="10" + data-offset-x="0" data-offset-y="0"></div> + <div style="flex: 1 10px;width: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10" + data-offset-x="30" data-offset-y="60"></div> + <div style="flex: 1 10px;width: 10px;align-self: center" data-expected-width="10" data-expected-height="10" + data-offset-x="40" data-offset-y="50"></div> + <div style="flex: 1 10px;width: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10" + data-offset-x="50" data-offset-y="40"></div> + <div style="flex: 1 10px;width: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10" + data-offset-x="30" data-offset-y="30"></div> + <div style="flex: 1 10px;width: 10px;align-self: baseline; margin-block-start: 5px;" data-expected-width="10" + data-expected-height="10" data-offset-x="30" data-offset-y="20"></div> + <div style="flex: 1 10px;width: auto;align-self: stretch" data-expected-width="30" data-expected-height="10" + data-offset-x="30" data-offset-y="10"></div> + <div style="flex: 1 10px;width: 30px;align-self: flex-start" data-expected-width="30" data-expected-height="10" + data-offset-x="30" data-offset-y="0"></div> + </div> + <div class="title">vertical-rl rtl row-reverse wrap</div> + <div class="flexbox vertical-rl rtl row-reverse wrap" style="height: 70px" data-expected-width="60" + data-expected-height="70"> + <div style="flex: 1 10px;width: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10" + data-offset-x="50" data-offset-y="0"></div> + <div style="flex: 1 10px;width: 10px;align-self: center" data-expected-width="10" data-expected-height="10" + data-offset-x="40" data-offset-y="10"></div> + <div style="flex: 1 10px;width: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10" + data-offset-x="30" data-offset-y="20"></div> + <div style="flex: 1 10px;width: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10" + data-offset-x="45" data-offset-y="30"></div> + <div style="flex: 1 10px;width: 10px;align-self: baseline; margin-block-start: 5px;" data-expected-width="10" + data-expected-height="10" data-offset-x="45" data-offset-y="40"></div> + <div style="flex: 1 10px;width: auto;align-self: stretch" data-expected-width="30" data-expected-height="10" + data-offset-x="30" data-offset-y="50"></div> + <div style="flex: 1 10px;width: 30px;align-self: flex-start" data-expected-width="30" data-expected-height="10" + data-offset-x="30" data-offset-y="60"></div> + <div style="flex: 1 10px;width: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10" + data-offset-x="20" data-offset-y="0"></div> + <div style="flex: 1 10px;width: 10px;align-self: center" data-expected-width="10" data-expected-height="10" + data-offset-x="10" data-offset-y="10"></div> + <div style="flex: 1 10px;width: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10" + data-offset-x="0" data-offset-y="20"></div> + <div style="flex: 1 10px;width: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10" + data-offset-x="15" data-offset-y="30"></div> + <div style="flex: 1 10px;width: 10px;align-self: baseline; margin-block-start: 5px;" data-expected-width="10" + data-expected-height="10" data-offset-x="15" data-offset-y="40"></div> + <div style="flex: 1 10px;width: auto;align-self: stretch" data-expected-width="30" data-expected-height="10" + data-offset-x="0" data-offset-y="50"></div> + <div style="flex: 1 10px;width: 30px;align-self: flex-start" data-expected-width="30" data-expected-height="10" + data-offset-x="0" data-offset-y="60"></div> + </div> + <div class="title">vertical-rl rtl row-reverse wrap-reverse</div> + <div class="flexbox vertical-rl rtl row-reverse wrap-reverse" style="height: 70px" data-expected-width="60" + data-expected-height="70"> + <div style="flex: 1 10px;width: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10" + data-offset-x="0" data-offset-y="0"></div> + <div style="flex: 1 10px;width: 10px;align-self: center" data-expected-width="10" data-expected-height="10" + data-offset-x="10" data-offset-y="10"></div> + <div style="flex: 1 10px;width: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10" + data-offset-x="20" data-offset-y="20"></div> + <div style="flex: 1 10px;width: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10" + data-offset-x="0" data-offset-y="30"></div> + <div style="flex: 1 10px;width: 10px;align-self: baseline; margin-block-start: 5px;" data-expected-width="10" + data-expected-height="10" data-offset-x="0" data-offset-y="40"></div> + <div style="flex: 1 10px;width: auto;align-self: stretch" data-expected-width="30" data-expected-height="10" + data-offset-x="0" data-offset-y="50"></div> + <div style="flex: 1 10px;width: 30px;align-self: flex-start" data-expected-width="30" data-expected-height="10" + data-offset-x="0" data-offset-y="60"></div> + <div style="flex: 1 10px;width: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10" + data-offset-x="30" data-offset-y="0"></div> + <div style="flex: 1 10px;width: 10px;align-self: center" data-expected-width="10" data-expected-height="10" + data-offset-x="40" data-offset-y="10"></div> + <div style="flex: 1 10px;width: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10" + data-offset-x="50" data-offset-y="20"></div> + <div style="flex: 1 10px;width: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10" + data-offset-x="30" data-offset-y="30"></div> + <div style="flex: 1 10px;width: 10px;align-self: baseline; margin-block-start: 5px;" data-expected-width="10" + data-expected-height="10" data-offset-x="30" data-offset-y="40"></div> + <div style="flex: 1 10px;width: auto;align-self: stretch" data-expected-width="30" data-expected-height="10" + data-offset-x="30" data-offset-y="50"></div> + <div style="flex: 1 10px;width: 30px;align-self: flex-start" data-expected-width="30" data-expected-height="10" + data-offset-x="30" data-offset-y="60"></div> + </div> + <div class="title">vertical-rl ltr column-reverse wrap</div> + <div class="flexbox vertical-rl ltr column-reverse wrap" style="width: 70px" data-expected-width="70" + data-expected-height="60"> + <div style="flex: 1 10px;height: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10" + data-offset-x="0" data-offset-y="0"></div> + <div style="flex: 1 10px;height: 10px;align-self: center" data-expected-width="10" data-expected-height="10" + data-offset-x="10" data-offset-y="10"></div> + <div style="flex: 1 10px;height: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10" + data-offset-x="20" data-offset-y="20"></div> + <div style="flex: 1 10px;height: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10" + data-offset-x="30" data-offset-y="5"></div> + <div style="flex: 1 10px;height: 10px;align-self: baseline; margin-inline-start: 5px;" data-expected-width="10" + data-expected-height="10" data-offset-x="40" data-offset-y="5"></div> + <div style="flex: 1 10px;height: auto;align-self: stretch" data-expected-width="10" data-expected-height="30" + data-offset-x="50" data-offset-y="0"></div> + <div style="flex: 1 10px;height: 30px;align-self: flex-start" data-expected-width="10" data-expected-height="30" + data-offset-x="60" data-offset-y="0"></div> + <div style="flex: 1 10px;height: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10" + data-offset-x="0" data-offset-y="30"></div> + <div style="flex: 1 10px;height: 10px;align-self: center" data-expected-width="10" data-expected-height="10" + data-offset-x="10" data-offset-y="40"></div> + <div style="flex: 1 10px;height: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10" + data-offset-x="20" data-offset-y="50"></div> + <div style="flex: 1 10px;height: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10" + data-offset-x="30" data-offset-y="35"></div> + <div style="flex: 1 10px;height: 10px;align-self: baseline; margin-inline-start: 5px;" data-expected-width="10" + data-expected-height="10" data-offset-x="40" data-offset-y="35"></div> + <div style="flex: 1 10px;height: auto;align-self: stretch" data-expected-width="10" data-expected-height="30" + data-offset-x="50" data-offset-y="30"></div> + <div style="flex: 1 10px;height: 30px;align-self: flex-start" data-expected-width="10" data-expected-height="30" + data-offset-x="60" data-offset-y="30"></div> + </div> + <div class="title">vertical-rl ltr column-reverse wrap-reverse</div> + <div class="flexbox vertical-rl ltr column-reverse wrap-reverse" style="width: 70px" data-expected-width="70" + data-expected-height="60"> + <div style="flex: 1 10px;height: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10" + data-offset-x="0" data-offset-y="50"></div> + <div style="flex: 1 10px;height: 10px;align-self: center" data-expected-width="10" data-expected-height="10" + data-offset-x="10" data-offset-y="40"></div> + <div style="flex: 1 10px;height: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10" + data-offset-x="20" data-offset-y="30"></div> + <div style="flex: 1 10px;height: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10" + data-offset-x="30" data-offset-y="50"></div> + <div style="flex: 1 10px;height: 10px;align-self: baseline; margin-inline-start: 5px;" data-expected-width="10" + data-expected-height="10" data-offset-x="40" data-offset-y="50"></div> + <div style="flex: 1 10px;height: auto;align-self: stretch" data-expected-width="10" data-expected-height="30" + data-offset-x="50" data-offset-y="30"></div> + <div style="flex: 1 10px;height: 30px;align-self: flex-start" data-expected-width="10" data-expected-height="30" + data-offset-x="60" data-offset-y="30"></div> + <div style="flex: 1 10px;height: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10" + data-offset-x="0" data-offset-y="20"></div> + <div style="flex: 1 10px;height: 10px;align-self: center" data-expected-width="10" data-expected-height="10" + data-offset-x="10" data-offset-y="10"></div> + <div style="flex: 1 10px;height: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10" + data-offset-x="20" data-offset-y="0"></div> + <div style="flex: 1 10px;height: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10" + data-offset-x="30" data-offset-y="20"></div> + <div style="flex: 1 10px;height: 10px;align-self: baseline; margin-inline-start: 5px;" data-expected-width="10" + data-expected-height="10" data-offset-x="40" data-offset-y="20"></div> + <div style="flex: 1 10px;height: auto;align-self: stretch" data-expected-width="10" data-expected-height="30" + data-offset-x="50" data-offset-y="0"></div> + <div style="flex: 1 10px;height: 30px;align-self: flex-start" data-expected-width="10" data-expected-height="30" + data-offset-x="60" data-offset-y="0"></div> + </div> + <div class="title">vertical-rl rtl column-reverse wrap</div> + <div class="flexbox vertical-rl rtl column-reverse wrap" style="width: 70px" data-expected-width="70" + data-expected-height="60"> + <div style="flex: 1 10px;height: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10" + data-offset-x="0" data-offset-y="50"></div> + <div style="flex: 1 10px;height: 10px;align-self: center" data-expected-width="10" data-expected-height="10" + data-offset-x="10" data-offset-y="40"></div> + <div style="flex: 1 10px;height: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10" + data-offset-x="20" data-offset-y="30"></div> + <div style="flex: 1 10px;height: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10" + data-offset-x="30" data-offset-y="30"></div> + <div style="flex: 1 10px;height: 10px;align-self: baseline; margin-inline-start: 5px;" data-expected-width="10" + data-expected-height="10" data-offset-x="40" data-offset-y="30"></div> + <div style="flex: 1 10px;height: auto;align-self: stretch" data-expected-width="10" data-expected-height="30" + data-offset-x="50" data-offset-y="30"></div> + <div style="flex: 1 10px;height: 30px;align-self: flex-start" data-expected-width="10" data-expected-height="30" + data-offset-x="60" data-offset-y="30"></div> + <div style="flex: 1 10px;height: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10" + data-offset-x="0" data-offset-y="20"></div> + <div style="flex: 1 10px;height: 10px;align-self: center" data-expected-width="10" data-expected-height="10" + data-offset-x="10" data-offset-y="10"></div> + <div style="flex: 1 10px;height: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10" + data-offset-x="20" data-offset-y="0"></div> + <div style="flex: 1 10px;height: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10" + data-offset-x="30" data-offset-y="0"></div> + <div style="flex: 1 10px;height: 10px;align-self: baseline; margin-inline-start: 5px;" data-expected-width="10" + data-expected-height="10" data-offset-x="40" data-offset-y="0"></div> + <div style="flex: 1 10px;height: auto;align-self: stretch" data-expected-width="10" data-expected-height="30" + data-offset-x="50" data-offset-y="0"></div> + <div style="flex: 1 10px;height: 30px;align-self: flex-start" data-expected-width="10" data-expected-height="30" + data-offset-x="60" data-offset-y="0"></div> + </div> + <div class="title">vertical-rl rtl column-reverse wrap-reverse</div> + <div class="flexbox vertical-rl rtl column-reverse wrap-reverse" style="width: 70px" data-expected-width="70" + data-expected-height="60"> + <div style="flex: 1 10px;height: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10" + data-offset-x="0" data-offset-y="0"></div> + <div style="flex: 1 10px;height: 10px;align-self: center" data-expected-width="10" data-expected-height="10" + data-offset-x="10" data-offset-y="10"></div> + <div style="flex: 1 10px;height: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10" + data-offset-x="20" data-offset-y="20"></div> + <div style="flex: 1 10px;height: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10" + data-offset-x="30" data-offset-y="15"></div> + <div style="flex: 1 10px;height: 10px;align-self: baseline; margin-inline-start: 5px;" data-expected-width="10" + data-expected-height="10" data-offset-x="40" data-offset-y="15"></div> + <div style="flex: 1 10px;height: auto;align-self: stretch" data-expected-width="10" data-expected-height="30" + data-offset-x="50" data-offset-y="0"></div> + <div style="flex: 1 10px;height: 30px;align-self: flex-start" data-expected-width="10" data-expected-height="30" + data-offset-x="60" data-offset-y="0"></div> + <div style="flex: 1 10px;height: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10" + data-offset-x="0" data-offset-y="30"></div> + <div style="flex: 1 10px;height: 10px;align-self: center" data-expected-width="10" data-expected-height="10" + data-offset-x="10" data-offset-y="40"></div> + <div style="flex: 1 10px;height: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10" + data-offset-x="20" data-offset-y="50"></div> + <div style="flex: 1 10px;height: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10" + data-offset-x="30" data-offset-y="45"></div> + <div style="flex: 1 10px;height: 10px;align-self: baseline; margin-inline-start: 5px;" data-expected-width="10" + data-expected-height="10" data-offset-x="40" data-offset-y="45"></div> + <div style="flex: 1 10px;height: auto;align-self: stretch" data-expected-width="10" data-expected-height="30" + data-offset-x="50" data-offset-y="30"></div> + <div style="flex: 1 10px;height: 30px;align-self: flex-start" data-expected-width="10" data-expected-height="30" + data-offset-x="60" data-offset-y="30"></div> + </div> + <div class="title">vertical-lr ltr row wrap</div> + <div class="flexbox vertical-lr ltr row wrap" style="height: 70px" data-expected-width="60" data-expected-height="70"> + <div style="flex: 1 10px;width: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10" + data-offset-x="0" data-offset-y="0"></div> + <div style="flex: 1 10px;width: 10px;align-self: center" data-expected-width="10" data-expected-height="10" + data-offset-x="10" data-offset-y="10"></div> + <div style="flex: 1 10px;width: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10" + data-offset-x="20" data-offset-y="20"></div> + <div style="flex: 1 10px;width: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10" + data-offset-x="5" data-offset-y="30"></div> + <div style="flex: 1 10px;width: 10px;align-self: baseline; margin-block-start: 5px;" data-expected-width="10" + data-expected-height="10" data-offset-x="5" data-offset-y="40"></div> + <div style="flex: 1 10px;width: auto;align-self: stretch" data-expected-width="30" data-expected-height="10" + data-offset-x="0" data-offset-y="50"></div> + <div style="flex: 1 10px;width: 30px;align-self: flex-start" data-expected-width="30" data-expected-height="10" + data-offset-x="0" data-offset-y="60"></div> + <div style="flex: 1 10px;width: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10" + data-offset-x="30" data-offset-y="0"></div> + <div style="flex: 1 10px;width: 10px;align-self: center" data-expected-width="10" data-expected-height="10" + data-offset-x="40" data-offset-y="10"></div> + <div style="flex: 1 10px;width: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10" + data-offset-x="50" data-offset-y="20"></div> + <div style="flex: 1 10px;width: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10" + data-offset-x="35" data-offset-y="30"></div> + <div style="flex: 1 10px;width: 10px;align-self: baseline; margin-block-start: 5px;" data-expected-width="10" + data-expected-height="10" data-offset-x="35" data-offset-y="40"></div> + <div style="flex: 1 10px;width: auto;align-self: stretch" data-expected-width="30" data-expected-height="10" + data-offset-x="30" data-offset-y="50"></div> + <div style="flex: 1 10px;width: 30px;align-self: flex-start" data-expected-width="30" data-expected-height="10" + data-offset-x="30" data-offset-y="60"></div> + </div> + <div class="title">vertical-lr ltr row wrap-reverse</div> + <div class="flexbox vertical-lr ltr row wrap-reverse" style="height: 70px" data-expected-width="60" + data-expected-height="70"> + <div style="flex: 1 10px;width: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10" + data-offset-x="50" data-offset-y="0"></div> + <div style="flex: 1 10px;width: 10px;align-self: center" data-expected-width="10" data-expected-height="10" + data-offset-x="40" data-offset-y="10"></div> + <div style="flex: 1 10px;width: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10" + data-offset-x="30" data-offset-y="20"></div> + <div style="flex: 1 10px;width: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10" + data-offset-x="50" data-offset-y="30"></div> + <div style="flex: 1 10px;width: 10px;align-self: baseline; margin-block-start: 5px;" data-expected-width="10" + data-expected-height="10" data-offset-x="50" data-offset-y="40"></div> + <div style="flex: 1 10px;width: auto;align-self: stretch" data-expected-width="30" data-expected-height="10" + data-offset-x="30" data-offset-y="50"></div> + <div style="flex: 1 10px;width: 30px;align-self: flex-start" data-expected-width="30" data-expected-height="10" + data-offset-x="30" data-offset-y="60"></div> + <div style="flex: 1 10px;width: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10" + data-offset-x="20" data-offset-y="0"></div> + <div style="flex: 1 10px;width: 10px;align-self: center" data-expected-width="10" data-expected-height="10" + data-offset-x="10" data-offset-y="10"></div> + <div style="flex: 1 10px;width: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10" + data-offset-x="0" data-offset-y="20"></div> + <div style="flex: 1 10px;width: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10" + data-offset-x="20" data-offset-y="30"></div> + <div style="flex: 1 10px;width: 10px;align-self: baseline; margin-block-start: 5px;" data-expected-width="10" + data-expected-height="10" data-offset-x="20" data-offset-y="40"></div> + <div style="flex: 1 10px;width: auto;align-self: stretch" data-expected-width="30" data-expected-height="10" + data-offset-x="0" data-offset-y="50"></div> + <div style="flex: 1 10px;width: 30px;align-self: flex-start" data-expected-width="30" data-expected-height="10" + data-offset-x="0" data-offset-y="60"></div> + </div> + <div class="title">vertical-lr rtl row wrap</div> + <div class="flexbox vertical-lr rtl row wrap" style="height: 70px" data-expected-width="60" data-expected-height="70"> + <div style="flex: 1 10px;width: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10" + data-offset-x="0" data-offset-y="60"></div> + <div style="flex: 1 10px;width: 10px;align-self: center" data-expected-width="10" data-expected-height="10" + data-offset-x="10" data-offset-y="50"></div> + <div style="flex: 1 10px;width: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10" + data-offset-x="20" data-offset-y="40"></div> + <div style="flex: 1 10px;width: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10" + data-offset-x="5" data-offset-y="30"></div> + <div style="flex: 1 10px;width: 10px;align-self: baseline; margin-block-start: 5px;" data-expected-width="10" + data-expected-height="10" data-offset-x="5" data-offset-y="20"></div> + <div style="flex: 1 10px;width: auto;align-self: stretch" data-expected-width="30" data-expected-height="10" + data-offset-x="0" data-offset-y="10"></div> + <div style="flex: 1 10px;width: 30px;align-self: flex-start" data-expected-width="30" data-expected-height="10" + data-offset-x="0" data-offset-y="0"></div> + <div style="flex: 1 10px;width: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10" + data-offset-x="30" data-offset-y="60"></div> + <div style="flex: 1 10px;width: 10px;align-self: center" data-expected-width="10" data-expected-height="10" + data-offset-x="40" data-offset-y="50"></div> + <div style="flex: 1 10px;width: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10" + data-offset-x="50" data-offset-y="40"></div> + <div style="flex: 1 10px;width: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10" + data-offset-x="35" data-offset-y="30"></div> + <div style="flex: 1 10px;width: 10px;align-self: baseline; margin-block-start: 5px;" data-expected-width="10" + data-expected-height="10" data-offset-x="35" data-offset-y="20"></div> + <div style="flex: 1 10px;width: auto;align-self: stretch" data-expected-width="30" data-expected-height="10" + data-offset-x="30" data-offset-y="10"></div> + <div style="flex: 1 10px;width: 30px;align-self: flex-start" data-expected-width="30" data-expected-height="10" + data-offset-x="30" data-offset-y="0"></div> + </div> + <div class="title">vertical-lr rtl row wrap-reverse</div> + <div class="flexbox vertical-lr rtl row wrap-reverse" style="height: 70px" data-expected-width="60" + data-expected-height="70"> + <div style="flex: 1 10px;width: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10" + data-offset-x="50" data-offset-y="60"></div> + <div style="flex: 1 10px;width: 10px;align-self: center" data-expected-width="10" data-expected-height="10" + data-offset-x="40" data-offset-y="50"></div> + <div style="flex: 1 10px;width: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10" + data-offset-x="30" data-offset-y="40"></div> + <div style="flex: 1 10px;width: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10" + data-offset-x="50" data-offset-y="30"></div> + <div style="flex: 1 10px;width: 10px;align-self: baseline; margin-block-start: 5px;" data-expected-width="10" + data-expected-height="10" data-offset-x="50" data-offset-y="20"></div> + <div style="flex: 1 10px;width: auto;align-self: stretch" data-expected-width="30" data-expected-height="10" + data-offset-x="30" data-offset-y="10"></div> + <div style="flex: 1 10px;width: 30px;align-self: flex-start" data-expected-width="30" data-expected-height="10" + data-offset-x="30" data-offset-y="0"></div> + <div style="flex: 1 10px;width: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10" + data-offset-x="20" data-offset-y="60"></div> + <div style="flex: 1 10px;width: 10px;align-self: center" data-expected-width="10" data-expected-height="10" + data-offset-x="10" data-offset-y="50"></div> + <div style="flex: 1 10px;width: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10" + data-offset-x="0" data-offset-y="40"></div> + <div style="flex: 1 10px;width: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10" + data-offset-x="20" data-offset-y="30"></div> + <div style="flex: 1 10px;width: 10px;align-self: baseline; margin-block-start: 5px;" data-expected-width="10" + data-expected-height="10" data-offset-x="20" data-offset-y="20"></div> + <div style="flex: 1 10px;width: auto;align-self: stretch" data-expected-width="30" data-expected-height="10" + data-offset-x="0" data-offset-y="10"></div> + <div style="flex: 1 10px;width: 30px;align-self: flex-start" data-expected-width="30" data-expected-height="10" + data-offset-x="0" data-offset-y="0"></div> + </div> + <div class="title">vertical-lr ltr column wrap</div> + <div class="flexbox vertical-lr ltr column wrap" style="width: 70px" data-expected-width="70" + data-expected-height="60"> + <div style="flex: 1 10px;height: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10" + data-offset-x="0" data-offset-y="0"></div> + <div style="flex: 1 10px;height: 10px;align-self: center" data-expected-width="10" data-expected-height="10" + data-offset-x="10" data-offset-y="10"></div> + <div style="flex: 1 10px;height: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10" + data-offset-x="20" data-offset-y="20"></div> + <div style="flex: 1 10px;height: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10" + data-offset-x="30" data-offset-y="5"></div> + <div style="flex: 1 10px;height: 10px;align-self: baseline; margin-inline-start: 5px;" data-expected-width="10" + data-expected-height="10" data-offset-x="40" data-offset-y="5"></div> + <div style="flex: 1 10px;height: auto;align-self: stretch" data-expected-width="10" data-expected-height="30" + data-offset-x="50" data-offset-y="0"></div> + <div style="flex: 1 10px;height: 30px;align-self: flex-start" data-expected-width="10" data-expected-height="30" + data-offset-x="60" data-offset-y="0"></div> + <div style="flex: 1 10px;height: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10" + data-offset-x="0" data-offset-y="30"></div> + <div style="flex: 1 10px;height: 10px;align-self: center" data-expected-width="10" data-expected-height="10" + data-offset-x="10" data-offset-y="40"></div> + <div style="flex: 1 10px;height: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10" + data-offset-x="20" data-offset-y="50"></div> + <div style="flex: 1 10px;height: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10" + data-offset-x="30" data-offset-y="35"></div> + <div style="flex: 1 10px;height: 10px;align-self: baseline; margin-inline-start: 5px;" data-expected-width="10" + data-expected-height="10" data-offset-x="40" data-offset-y="35"></div> + <div style="flex: 1 10px;height: auto;align-self: stretch" data-expected-width="10" data-expected-height="30" + data-offset-x="50" data-offset-y="30"></div> + <div style="flex: 1 10px;height: 30px;align-self: flex-start" data-expected-width="10" data-expected-height="30" + data-offset-x="60" data-offset-y="30"></div> + </div> + <div class="title">vertical-lr ltr column wrap-reverse</div> + <div class="flexbox vertical-lr ltr column wrap-reverse" style="width: 70px" data-expected-width="70" + data-expected-height="60"> + <div style="flex: 1 10px;height: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10" + data-offset-x="0" data-offset-y="50"></div> + <div style="flex: 1 10px;height: 10px;align-self: center" data-expected-width="10" data-expected-height="10" + data-offset-x="10" data-offset-y="40"></div> + <div style="flex: 1 10px;height: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10" + data-offset-x="20" data-offset-y="30"></div> + <div style="flex: 1 10px;height: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10" + data-offset-x="30" data-offset-y="50"></div> + <div style="flex: 1 10px;height: 10px;align-self: baseline; margin-inline-start: 5px;" data-expected-width="10" + data-expected-height="10" data-offset-x="40" data-offset-y="50"></div> + <div style="flex: 1 10px;height: auto;align-self: stretch" data-expected-width="10" data-expected-height="30" + data-offset-x="50" data-offset-y="30"></div> + <div style="flex: 1 10px;height: 30px;align-self: flex-start" data-expected-width="10" data-expected-height="30" + data-offset-x="60" data-offset-y="30"></div> + <div style="flex: 1 10px;height: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10" + data-offset-x="0" data-offset-y="20"></div> + <div style="flex: 1 10px;height: 10px;align-self: center" data-expected-width="10" data-expected-height="10" + data-offset-x="10" data-offset-y="10"></div> + <div style="flex: 1 10px;height: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10" + data-offset-x="20" data-offset-y="0"></div> + <div style="flex: 1 10px;height: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10" + data-offset-x="30" data-offset-y="20"></div> + <div style="flex: 1 10px;height: 10px;align-self: baseline; margin-inline-start: 5px;" data-expected-width="10" + data-expected-height="10" data-offset-x="40" data-offset-y="20"></div> + <div style="flex: 1 10px;height: auto;align-self: stretch" data-expected-width="10" data-expected-height="30" + data-offset-x="50" data-offset-y="0"></div> + <div style="flex: 1 10px;height: 30px;align-self: flex-start" data-expected-width="10" data-expected-height="30" + data-offset-x="60" data-offset-y="0"></div> + </div> + <div class="title">vertical-lr rtl column wrap</div> + <div class="flexbox vertical-lr rtl column wrap" style="width: 70px" data-expected-width="70" + data-expected-height="60"> + <div style="flex: 1 10px;height: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10" + data-offset-x="0" data-offset-y="50"></div> + <div style="flex: 1 10px;height: 10px;align-self: center" data-expected-width="10" data-expected-height="10" + data-offset-x="10" data-offset-y="40"></div> + <div style="flex: 1 10px;height: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10" + data-offset-x="20" data-offset-y="30"></div> + <div style="flex: 1 10px;height: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10" + data-offset-x="30" data-offset-y="30"></div> + <div style="flex: 1 10px;height: 10px;align-self: baseline; margin-inline-start: 5px;" data-expected-width="10" + data-expected-height="10" data-offset-x="40" data-offset-y="30"></div> + <div style="flex: 1 10px;height: auto;align-self: stretch" data-expected-width="10" data-expected-height="30" + data-offset-x="50" data-offset-y="30"></div> + <div style="flex: 1 10px;height: 30px;align-self: flex-start" data-expected-width="10" data-expected-height="30" + data-offset-x="60" data-offset-y="30"></div> + <div style="flex: 1 10px;height: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10" + data-offset-x="0" data-offset-y="20"></div> + <div style="flex: 1 10px;height: 10px;align-self: center" data-expected-width="10" data-expected-height="10" + data-offset-x="10" data-offset-y="10"></div> + <div style="flex: 1 10px;height: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10" + data-offset-x="20" data-offset-y="0"></div> + <div style="flex: 1 10px;height: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10" + data-offset-x="30" data-offset-y="0"></div> + <div style="flex: 1 10px;height: 10px;align-self: baseline; margin-inline-start: 5px;" data-expected-width="10" + data-expected-height="10" data-offset-x="40" data-offset-y="0"></div> + <div style="flex: 1 10px;height: auto;align-self: stretch" data-expected-width="10" data-expected-height="30" + data-offset-x="50" data-offset-y="0"></div> + <div style="flex: 1 10px;height: 30px;align-self: flex-start" data-expected-width="10" data-expected-height="30" + data-offset-x="60" data-offset-y="0"></div> + </div> + <div class="title">vertical-lr rtl column wrap-reverse</div> + <div class="flexbox vertical-lr rtl column wrap-reverse" style="width: 70px" data-expected-width="70" + data-expected-height="60"> + <div style="flex: 1 10px;height: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10" + data-offset-x="0" data-offset-y="0"></div> + <div style="flex: 1 10px;height: 10px;align-self: center" data-expected-width="10" data-expected-height="10" + data-offset-x="10" data-offset-y="10"></div> + <div style="flex: 1 10px;height: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10" + data-offset-x="20" data-offset-y="20"></div> + <div style="flex: 1 10px;height: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10" + data-offset-x="30" data-offset-y="15"></div> + <div style="flex: 1 10px;height: 10px;align-self: baseline; margin-inline-start: 5px;" data-expected-width="10" + data-expected-height="10" data-offset-x="40" data-offset-y="15"></div> + <div style="flex: 1 10px;height: auto;align-self: stretch" data-expected-width="10" data-expected-height="30" + data-offset-x="50" data-offset-y="0"></div> + <div style="flex: 1 10px;height: 30px;align-self: flex-start" data-expected-width="10" data-expected-height="30" + data-offset-x="60" data-offset-y="0"></div> + <div style="flex: 1 10px;height: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10" + data-offset-x="0" data-offset-y="30"></div> + <div style="flex: 1 10px;height: 10px;align-self: center" data-expected-width="10" data-expected-height="10" + data-offset-x="10" data-offset-y="40"></div> + <div style="flex: 1 10px;height: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10" + data-offset-x="20" data-offset-y="50"></div> + <div style="flex: 1 10px;height: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10" + data-offset-x="30" data-offset-y="45"></div> + <div style="flex: 1 10px;height: 10px;align-self: baseline; margin-inline-start: 5px;" data-expected-width="10" + data-expected-height="10" data-offset-x="40" data-offset-y="45"></div> + <div style="flex: 1 10px;height: auto;align-self: stretch" data-expected-width="10" data-expected-height="30" + data-offset-x="50" data-offset-y="30"></div> + <div style="flex: 1 10px;height: 30px;align-self: flex-start" data-expected-width="10" data-expected-height="30" + data-offset-x="60" data-offset-y="30"></div> + </div> + <div class="title">vertical-lr ltr row-reverse wrap</div> + <div class="flexbox vertical-lr ltr row-reverse wrap" style="height: 70px" data-expected-width="60" + data-expected-height="70"> + <div style="flex: 1 10px;width: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10" + data-offset-x="0" data-offset-y="60"></div> + <div style="flex: 1 10px;width: 10px;align-self: center" data-expected-width="10" data-expected-height="10" + data-offset-x="10" data-offset-y="50"></div> + <div style="flex: 1 10px;width: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10" + data-offset-x="20" data-offset-y="40"></div> + <div style="flex: 1 10px;width: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10" + data-offset-x="5" data-offset-y="30"></div> + <div style="flex: 1 10px;width: 10px;align-self: baseline; margin-block-start: 5px;" data-expected-width="10" + data-expected-height="10" data-offset-x="5" data-offset-y="20"></div> + <div style="flex: 1 10px;width: auto;align-self: stretch" data-expected-width="30" data-expected-height="10" + data-offset-x="0" data-offset-y="10"></div> + <div style="flex: 1 10px;width: 30px;align-self: flex-start" data-expected-width="30" data-expected-height="10" + data-offset-x="0" data-offset-y="0"></div> + <div style="flex: 1 10px;width: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10" + data-offset-x="30" data-offset-y="60"></div> + <div style="flex: 1 10px;width: 10px;align-self: center" data-expected-width="10" data-expected-height="10" + data-offset-x="40" data-offset-y="50"></div> + <div style="flex: 1 10px;width: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10" + data-offset-x="50" data-offset-y="40"></div> + <div style="flex: 1 10px;width: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10" + data-offset-x="35" data-offset-y="30"></div> + <div style="flex: 1 10px;width: 10px;align-self: baseline; margin-block-start: 5px;" data-expected-width="10" + data-expected-height="10" data-offset-x="35" data-offset-y="20"></div> + <div style="flex: 1 10px;width: auto;align-self: stretch" data-expected-width="30" data-expected-height="10" + data-offset-x="30" data-offset-y="10"></div> + <div style="flex: 1 10px;width: 30px;align-self: flex-start" data-expected-width="30" data-expected-height="10" + data-offset-x="30" data-offset-y="0"></div> + </div> + <div class="title">vertical-lr ltr row-reverse wrap-reverse</div> + <div class="flexbox vertical-lr ltr row-reverse wrap-reverse" style="height: 70px" data-expected-width="60" + data-expected-height="70"> + <div style="flex: 1 10px;width: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10" + data-offset-x="50" data-offset-y="60"></div> + <div style="flex: 1 10px;width: 10px;align-self: center" data-expected-width="10" data-expected-height="10" + data-offset-x="40" data-offset-y="50"></div> + <div style="flex: 1 10px;width: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10" + data-offset-x="30" data-offset-y="40"></div> + <div style="flex: 1 10px;width: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10" + data-offset-x="50" data-offset-y="30"></div> + <div style="flex: 1 10px;width: 10px;align-self: baseline; margin-block-start: 5px;" data-expected-width="10" + data-expected-height="10" data-offset-x="50" data-offset-y="20"></div> + <div style="flex: 1 10px;width: auto;align-self: stretch" data-expected-width="30" data-expected-height="10" + data-offset-x="30" data-offset-y="10"></div> + <div style="flex: 1 10px;width: 30px;align-self: flex-start" data-expected-width="30" data-expected-height="10" + data-offset-x="30" data-offset-y="0"></div> + <div style="flex: 1 10px;width: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10" + data-offset-x="20" data-offset-y="60"></div> + <div style="flex: 1 10px;width: 10px;align-self: center" data-expected-width="10" data-expected-height="10" + data-offset-x="10" data-offset-y="50"></div> + <div style="flex: 1 10px;width: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10" + data-offset-x="0" data-offset-y="40"></div> + <div style="flex: 1 10px;width: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10" + data-offset-x="20" data-offset-y="30"></div> + <div style="flex: 1 10px;width: 10px;align-self: baseline; margin-block-start: 5px;" data-expected-width="10" + data-expected-height="10" data-offset-x="20" data-offset-y="20"></div> + <div style="flex: 1 10px;width: auto;align-self: stretch" data-expected-width="30" data-expected-height="10" + data-offset-x="0" data-offset-y="10"></div> + <div style="flex: 1 10px;width: 30px;align-self: flex-start" data-expected-width="30" data-expected-height="10" + data-offset-x="0" data-offset-y="0"></div> + </div> + <div class="title">vertical-lr rtl row-reverse wrap</div> + <div class="flexbox vertical-lr rtl row-reverse wrap" style="height: 70px" data-expected-width="60" + data-expected-height="70"> + <div style="flex: 1 10px;width: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10" + data-offset-x="0" data-offset-y="0"></div> + <div style="flex: 1 10px;width: 10px;align-self: center" data-expected-width="10" data-expected-height="10" + data-offset-x="10" data-offset-y="10"></div> + <div style="flex: 1 10px;width: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10" + data-offset-x="20" data-offset-y="20"></div> + <div style="flex: 1 10px;width: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10" + data-offset-x="5" data-offset-y="30"></div> + <div style="flex: 1 10px;width: 10px;align-self: baseline; margin-block-start: 5px;" data-expected-width="10" + data-expected-height="10" data-offset-x="5" data-offset-y="40"></div> + <div style="flex: 1 10px;width: auto;align-self: stretch" data-expected-width="30" data-expected-height="10" + data-offset-x="0" data-offset-y="50"></div> + <div style="flex: 1 10px;width: 30px;align-self: flex-start" data-expected-width="30" data-expected-height="10" + data-offset-x="0" data-offset-y="60"></div> + <div style="flex: 1 10px;width: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10" + data-offset-x="30" data-offset-y="0"></div> + <div style="flex: 1 10px;width: 10px;align-self: center" data-expected-width="10" data-expected-height="10" + data-offset-x="40" data-offset-y="10"></div> + <div style="flex: 1 10px;width: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10" + data-offset-x="50" data-offset-y="20"></div> + <div style="flex: 1 10px;width: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10" + data-offset-x="35" data-offset-y="30"></div> + <div style="flex: 1 10px;width: 10px;align-self: baseline; margin-block-start: 5px;" data-expected-width="10" + data-expected-height="10" data-offset-x="35" data-offset-y="40"></div> + <div style="flex: 1 10px;width: auto;align-self: stretch" data-expected-width="30" data-expected-height="10" + data-offset-x="30" data-offset-y="50"></div> + <div style="flex: 1 10px;width: 30px;align-self: flex-start" data-expected-width="30" data-expected-height="10" + data-offset-x="30" data-offset-y="60"></div> + </div> + <div class="title">vertical-lr rtl row-reverse wrap-reverse</div> + <div class="flexbox vertical-lr rtl row-reverse wrap-reverse" style="height: 70px" data-expected-width="60" + data-expected-height="70"> + <div style="flex: 1 10px;width: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10" + data-offset-x="50" data-offset-y="0"></div> + <div style="flex: 1 10px;width: 10px;align-self: center" data-expected-width="10" data-expected-height="10" + data-offset-x="40" data-offset-y="10"></div> + <div style="flex: 1 10px;width: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10" + data-offset-x="30" data-offset-y="20"></div> + <div style="flex: 1 10px;width: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10" + data-offset-x="50" data-offset-y="30"></div> + <div style="flex: 1 10px;width: 10px;align-self: baseline; margin-block-start: 5px;" data-expected-width="10" + data-expected-height="10" data-offset-x="50" data-offset-y="40"></div> + <div style="flex: 1 10px;width: auto;align-self: stretch" data-expected-width="30" data-expected-height="10" + data-offset-x="30" data-offset-y="50"></div> + <div style="flex: 1 10px;width: 30px;align-self: flex-start" data-expected-width="30" data-expected-height="10" + data-offset-x="30" data-offset-y="60"></div> + <div style="flex: 1 10px;width: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10" + data-offset-x="20" data-offset-y="0"></div> + <div style="flex: 1 10px;width: 10px;align-self: center" data-expected-width="10" data-expected-height="10" + data-offset-x="10" data-offset-y="10"></div> + <div style="flex: 1 10px;width: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10" + data-offset-x="0" data-offset-y="20"></div> + <div style="flex: 1 10px;width: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10" + data-offset-x="20" data-offset-y="30"></div> + <div style="flex: 1 10px;width: 10px;align-self: baseline; margin-block-start: 5px;" data-expected-width="10" + data-expected-height="10" data-offset-x="20" data-offset-y="40"></div> + <div style="flex: 1 10px;width: auto;align-self: stretch" data-expected-width="30" data-expected-height="10" + data-offset-x="0" data-offset-y="50"></div> + <div style="flex: 1 10px;width: 30px;align-self: flex-start" data-expected-width="30" data-expected-height="10" + data-offset-x="0" data-offset-y="60"></div> + </div> + <div class="title">vertical-lr ltr column-reverse wrap</div> + <div class="flexbox vertical-lr ltr column-reverse wrap" style="width: 70px" data-expected-width="70" + data-expected-height="60"> + <div style="flex: 1 10px;height: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10" + data-offset-x="60" data-offset-y="0"></div> + <div style="flex: 1 10px;height: 10px;align-self: center" data-expected-width="10" data-expected-height="10" + data-offset-x="50" data-offset-y="10"></div> + <div style="flex: 1 10px;height: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10" + data-offset-x="40" data-offset-y="20"></div> + <div style="flex: 1 10px;height: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10" + data-offset-x="30" data-offset-y="5"></div> + <div style="flex: 1 10px;height: 10px;align-self: baseline; margin-inline-start: 5px;" data-expected-width="10" + data-expected-height="10" data-offset-x="20" data-offset-y="5"></div> + <div style="flex: 1 10px;height: auto;align-self: stretch" data-expected-width="10" data-expected-height="30" + data-offset-x="10" data-offset-y="0"></div> + <div style="flex: 1 10px;height: 30px;align-self: flex-start" data-expected-width="10" data-expected-height="30" + data-offset-x="0" data-offset-y="0"></div> + <div style="flex: 1 10px;height: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10" + data-offset-x="60" data-offset-y="30"></div> + <div style="flex: 1 10px;height: 10px;align-self: center" data-expected-width="10" data-expected-height="10" + data-offset-x="50" data-offset-y="40"></div> + <div style="flex: 1 10px;height: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10" + data-offset-x="40" data-offset-y="50"></div> + <div style="flex: 1 10px;height: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10" + data-offset-x="30" data-offset-y="35"></div> + <div style="flex: 1 10px;height: 10px;align-self: baseline; margin-inline-start: 5px;" data-expected-width="10" + data-expected-height="10" data-offset-x="20" data-offset-y="35"></div> + <div style="flex: 1 10px;height: auto;align-self: stretch" data-expected-width="10" data-expected-height="30" + data-offset-x="10" data-offset-y="30"></div> + <div style="flex: 1 10px;height: 30px;align-self: flex-start" data-expected-width="10" data-expected-height="30" + data-offset-x="0" data-offset-y="30"></div> + </div> + <div class="title">vertical-lr ltr column-reverse wrap-reverse</div> + <div class="flexbox vertical-lr ltr column-reverse wrap-reverse" style="width: 70px" data-expected-width="70" + data-expected-height="60"> + <div style="flex: 1 10px;height: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10" + data-offset-x="60" data-offset-y="50"></div> + <div style="flex: 1 10px;height: 10px;align-self: center" data-expected-width="10" data-expected-height="10" + data-offset-x="50" data-offset-y="40"></div> + <div style="flex: 1 10px;height: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10" + data-offset-x="40" data-offset-y="30"></div> + <div style="flex: 1 10px;height: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10" + data-offset-x="30" data-offset-y="50"></div> + <div style="flex: 1 10px;height: 10px;align-self: baseline; margin-inline-start: 5px;" data-expected-width="10" + data-expected-height="10" data-offset-x="20" data-offset-y="50"></div> + <div style="flex: 1 10px;height: auto;align-self: stretch" data-expected-width="10" data-expected-height="30" + data-offset-x="10" data-offset-y="30"></div> + <div style="flex: 1 10px;height: 30px;align-self: flex-start" data-expected-width="10" data-expected-height="30" + data-offset-x="0" data-offset-y="30"></div> + <div style="flex: 1 10px;height: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10" + data-offset-x="60" data-offset-y="20"></div> + <div style="flex: 1 10px;height: 10px;align-self: center" data-expected-width="10" data-expected-height="10" + data-offset-x="50" data-offset-y="10"></div> + <div style="flex: 1 10px;height: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10" + data-offset-x="40" data-offset-y="0"></div> + <div style="flex: 1 10px;height: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10" + data-offset-x="30" data-offset-y="20"></div> + <div style="flex: 1 10px;height: 10px;align-self: baseline; margin-inline-start: 5px;" data-expected-width="10" + data-expected-height="10" data-offset-x="20" data-offset-y="20"></div> + <div style="flex: 1 10px;height: auto;align-self: stretch" data-expected-width="10" data-expected-height="30" + data-offset-x="10" data-offset-y="0"></div> + <div style="flex: 1 10px;height: 30px;align-self: flex-start" data-expected-width="10" data-expected-height="30" + data-offset-x="0" data-offset-y="0"></div> + </div> + <div class="title">vertical-lr rtl column-reverse wrap</div> + <div class="flexbox vertical-lr rtl column-reverse wrap" style="width: 70px" data-expected-width="70" + data-expected-height="60"> + <div style="flex: 1 10px;height: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10" + data-offset-x="60" data-offset-y="50"></div> + <div style="flex: 1 10px;height: 10px;align-self: center" data-expected-width="10" data-expected-height="10" + data-offset-x="50" data-offset-y="40"></div> + <div style="flex: 1 10px;height: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10" + data-offset-x="40" data-offset-y="30"></div> + <div style="flex: 1 10px;height: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10" + data-offset-x="30" data-offset-y="30"></div> + <div style="flex: 1 10px;height: 10px;align-self: baseline; margin-inline-start: 5px;" data-expected-width="10" + data-expected-height="10" data-offset-x="20" data-offset-y="30"></div> + <div style="flex: 1 10px;height: auto;align-self: stretch" data-expected-width="10" data-expected-height="30" + data-offset-x="10" data-offset-y="30"></div> + <div style="flex: 1 10px;height: 30px;align-self: flex-start" data-expected-width="10" data-expected-height="30" + data-offset-x="0" data-offset-y="30"></div> + <div style="flex: 1 10px;height: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10" + data-offset-x="60" data-offset-y="20"></div> + <div style="flex: 1 10px;height: 10px;align-self: center" data-expected-width="10" data-expected-height="10" + data-offset-x="50" data-offset-y="10"></div> + <div style="flex: 1 10px;height: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10" + data-offset-x="40" data-offset-y="0"></div> + <div style="flex: 1 10px;height: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10" + data-offset-x="30" data-offset-y="0"></div> + <div style="flex: 1 10px;height: 10px;align-self: baseline; margin-inline-start: 5px;" data-expected-width="10" + data-expected-height="10" data-offset-x="20" data-offset-y="0"></div> + <div style="flex: 1 10px;height: auto;align-self: stretch" data-expected-width="10" data-expected-height="30" + data-offset-x="10" data-offset-y="0"></div> + <div style="flex: 1 10px;height: 30px;align-self: flex-start" data-expected-width="10" data-expected-height="30" + data-offset-x="0" data-offset-y="0"></div> + </div> + <div class="title">vertical-lr rtl column-reverse wrap-reverse</div> + <div class="flexbox vertical-lr rtl column-reverse wrap-reverse" style="width: 70px" data-expected-width="70" + data-expected-height="60"> + <div style="flex: 1 10px;height: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10" + data-offset-x="60" data-offset-y="0"></div> + <div style="flex: 1 10px;height: 10px;align-self: center" data-expected-width="10" data-expected-height="10" + data-offset-x="50" data-offset-y="10"></div> + <div style="flex: 1 10px;height: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10" + data-offset-x="40" data-offset-y="20"></div> + <div style="flex: 1 10px;height: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10" + data-offset-x="30" data-offset-y="15"></div> + <div style="flex: 1 10px;height: 10px;align-self: baseline; margin-inline-start: 5px;" data-expected-width="10" + data-expected-height="10" data-offset-x="20" data-offset-y="15"></div> + <div style="flex: 1 10px;height: auto;align-self: stretch" data-expected-width="10" data-expected-height="30" + data-offset-x="10" data-offset-y="0"></div> + <div style="flex: 1 10px;height: 30px;align-self: flex-start" data-expected-width="10" data-expected-height="30" + data-offset-x="0" data-offset-y="0"></div> + <div style="flex: 1 10px;height: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10" + data-offset-x="60" data-offset-y="30"></div> + <div style="flex: 1 10px;height: 10px;align-self: center" data-expected-width="10" data-expected-height="10" + data-offset-x="50" data-offset-y="40"></div> + <div style="flex: 1 10px;height: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10" + data-offset-x="40" data-offset-y="50"></div> + <div style="flex: 1 10px;height: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10" + data-offset-x="30" data-offset-y="45"></div> + <div style="flex: 1 10px;height: 10px;align-self: baseline; margin-inline-start: 5px;" data-expected-width="10" + data-expected-height="10" data-offset-x="20" data-offset-y="45"></div> + <div style="flex: 1 10px;height: auto;align-self: stretch" data-expected-width="10" data-expected-height="30" + data-offset-x="10" data-offset-y="30"></div> + <div style="flex: 1 10px;height: 30px;align-self: flex-start" data-expected-width="10" data-expected-height="30" + data-offset-x="0" data-offset-y="30"></div> + </div> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-end-large-border-padding-ref.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-end-large-border-padding-ref.html new file mode 100644 index 0000000..7f2a5ad --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-end-large-border-padding-ref.html
@@ -0,0 +1,25 @@ +<!DOCTYPE html> +<html> +<style> +.grid { + display: grid; + padding: 13px; + padding-bottom: 42px; + border: 23px solid black; + border-bottom-width: 45px; + width: 100px; + height: 100px; +} +.item { + width: 50px; + height: 50px; + background-color: green; + align-self: end; +} +</style> +<body> +<div class="grid"> + <div class="item"></div> +</div> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-end-large-border-padding.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-end-large-border-padding.html new file mode 100644 index 0000000..09647be7 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-end-large-border-padding.html
@@ -0,0 +1,32 @@ +<!DOCTYPE html> +<html> +<head> +<link rel="help" href="https://drafts.csswg.org/css-align-3/#align-abspos"> +<link rel="help" href="https://www.w3.org/TR/css-position-3/#staticpos-rect"> +<link rel="match" href="grid-abspos-staticpos-align-self-end-large-border-padding-ref.html" +<meta name="assert" content="Abspos child of grid is aligned to end of grid content box when statically positioned and end self alignment."> +<style> +.grid { + display: grid; + padding: 13px; + padding-bottom: 42px; + border: 23px solid black; + border-bottom-width: 45px; + width: 100px; + height: 100px; +} +.abspos { + position: absolute; + width: 50px; + height: 50px; + background-color: green; + align-self: end; +} +</style> +</head> +<body> +<div class="grid"> + <div class="abspos"></div> +</div> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-end-ref.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-end-ref.html new file mode 100644 index 0000000..868717bc --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-end-ref.html
@@ -0,0 +1,22 @@ +<!DOCTYPE html> +<html> +<style> +.grid { + display: grid; + border: 1px solid black; + width: 100px; + height: 100px; +} +.item { + width: 50px; + height: 50px; + background-color: green; + align-self: end; +} +</style> +<body> +<div class="grid"> + <div class="item"></div> +</div> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-end.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-end.html new file mode 100644 index 0000000..c8176f1 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-end.html
@@ -0,0 +1,29 @@ +<!DOCTYPE html> +<html> +<head> +<link rel="help" href="https://drafts.csswg.org/css-align-3/#align-abspos"> +<link rel="help" href="https://www.w3.org/TR/css-position-3/#staticpos-rect"> +<link rel="match" href="grid-abspos-staticpos-align-self-end-ref.html" +<meta name="assert" content="Abspos child of grid is aligned to end of grid content box when statically positioned and end self alignment."> +<style> +.grid { + display: grid; + border: 1px solid black; + width: 100px; + height: 100px; +} +.abspos { + position: absolute; + width: 50px; + height: 50px; + background-color: green; + align-self: end; +} +</style> +</head> +<body> +<div class="grid"> + <div class="abspos"></div> +</div> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/parsing/text-decoration-computed.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/parsing/text-decoration-computed.html index 5371c42..c078396 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-text-decor/parsing/text-decoration-computed.html +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/parsing/text-decoration-computed.html
@@ -30,6 +30,9 @@ test_computed_value("text-decoration", "underline dashed rgb(0, 255, 0)"); +// Test backwards compatibility of blink. +test_computed_value("text-decoration", "underline overline line-through blink red", ["underline overline line-through rgb(255, 0, 0)", "underline overline line-through blink rgb(255, 0, 0)"]); + // Add text-decoration-thickness in [css-text-decor-4]. test_computed_value("text-decoration", "auto", currentColor); test_computed_value("text-decoration", "from-font", "from-font " + currentColor);
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/parsing/text-decoration-valid-expected.txt b/third_party/blink/web_tests/external/wpt/css/css-text-decor/parsing/text-decoration-valid-expected.txt new file mode 100644 index 0000000..bbee844 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/parsing/text-decoration-valid-expected.txt
@@ -0,0 +1,5 @@ +This is a testharness.js-based test. +[FAIL] e.style['text-decoration'] = "underline overline line-through blink red" should set the property value + assert_in_array: serialization should be sound value "underline overline line-through blink red" not in array ["underline overline line-through rgb(255, 0, 0)", "underline overline line-through blink rgb(255, 0, 0)"] +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/parsing/text-decoration-valid.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/parsing/text-decoration-valid.html index ad82dd20..35fd8f3 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-text-decor/parsing/text-decoration-valid.html +++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/parsing/text-decoration-valid.html
@@ -18,6 +18,8 @@ test_valid_value("text-decoration", "double overline underline", "underline overline double"); test_valid_value("text-decoration", "underline overline line-through red"); +test_valid_value("text-decoration", "underline overline line-through blink", ["underline overline line-through", "underline overline line-through blink"]); +test_valid_value("text-decoration", "underline overline line-through blink red", ["underline overline line-through rgb(255, 0, 0)", "underline overline line-through blink rgb(255, 0, 0)"]); test_valid_value("text-decoration", "rgba(10, 20, 30, 0.4) dotted", "dotted rgba(10, 20, 30, 0.4)"); test_valid_value("text-decoration", "overline green from-font", "overline from-font green"); test_valid_value("text-decoration", "underline dashed green");
diff --git a/third_party/blink/web_tests/external/wpt/css/css-typed-om/historical-expected.txt b/third_party/blink/web_tests/external/wpt/css/css-typed-om/historical-expected.txt index 5be521fe..72454f2c 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-typed-om/historical-expected.txt +++ b/third_party/blink/web_tests/external/wpt/css/css-typed-om/historical-expected.txt
@@ -1,5 +1,11 @@ This is a testharness.js-based test. [FAIL] Support for CSSPositionValue assert_false: expected false got true +[FAIL] toRGB should not exist on CSSColorValue + assert_false: expected false got true +[FAIL] toHSL should not exist on CSSColorValue + assert_false: expected false got true +[FAIL] toHWB should not exist on CSSColorValue + assert_false: expected false got true Harness: the test ran to completion.
diff --git a/third_party/blink/web_tests/external/wpt/css/css-typed-om/historical.html b/third_party/blink/web_tests/external/wpt/css/css-typed-om/historical.html index ceb4dfe..3c8ff65 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-typed-om/historical.html +++ b/third_party/blink/web_tests/external/wpt/css/css-typed-om/historical.html
@@ -10,4 +10,14 @@ // https://github.com/w3c/css-houdini-drafts/commit/5261c1a323ea062d69cb5a3f1e69734fd176948a assert_false("CSSPositionValue" in self); }, "Support for CSSPositionValue"); + +// https://github.com/w3c/css-houdini-drafts/commit/5a1663db3f9c36ffa7b2013afdd345e98ae03d5e +// https://github.com/w3c/css-houdini-drafts/commit/223258ea4c71aa60b1bd675602dddfbb414e0481 +const deprecatedProperties = ["toRGB", "toHSL", "toHWB", "toGray", "toLCH", "toLab", "toColor", "toDeviceCMYK", "to", "colorSpace"]; +for (const deprecatedProperty of deprecatedProperties) { + test(function() { + const cssColorValue = new CSSRGB(0, 0, 0); + assert_false(deprecatedProperty in cssColorValue); + }, `${deprecatedProperty} should not exist on CSSColorValue`); +} </script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-typed-om/stylevalue-subclasses/cssColorValue.html b/third_party/blink/web_tests/external/wpt/css/css-typed-om/stylevalue-subclasses/cssColorValue.html index 59a03c138..9a319a51 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-typed-om/stylevalue-subclasses/cssColorValue.html +++ b/third_party/blink/web_tests/external/wpt/css/css-typed-om/stylevalue-subclasses/cssColorValue.html
@@ -8,102 +8,10 @@ <script> 'use strict'; -const TEST_COLORS = [ - {name: "magenta", rgb: [1, 0, 1], hsl: [300, 1, 0.5], hwb: [300, 0, 0]}, - {name: "dark cyan", rgb: [0, 0.545, 0.545], hsl: [180, 1, 0.2725], hwb: [180, 0, 0.455]}, - {name: "light goldenrod yellow", rgb: [1, 1, 0.82], hsl: [60, 1, 0.91], hwb: [60, 0.82, 0]}, - {name: "medium purple", rgb: [0.58, 0.44, 0.86], hsl: [260, 0.5977, 0.649], hwb: [260, 0.44, 0.14]}, -] const rgb_attributes = ['r', 'g', 'b', 'alpha'] const hsl_attributes = ['h', 's', 'l', 'alpha'] const hwb_attributes = ['h', 'w', 'b', 'alpha'] -for (const color of TEST_COLORS) { - const hsl_color_degrees = new CSSHSL(CSS.deg(color.hsl[0]), color.hsl[1], color.hsl[2]) - const hsl_color_radians = new CSSHSL(CSS.rad(color.hsl[0]/360 * 2 * Math.PI), color.hsl[1], color.hsl[2]) - const hsl_color_gradians = new CSSHSL(CSS.grad(color.hsl[0]/360 * 400), color.hsl[1], color.hsl[2]) - - const hwb_color_degrees = new CSSHWB(CSS.deg(color.hwb[0]), color.hwb[1], color.hwb[2]) - const hwb_color_radians = new CSSHWB(CSS.rad(color.hwb[0]/360 * 2 * Math.PI), color.hwb[1], color.hwb[2]) - const hwb_color_gradians = new CSSHWB(CSS.grad(color.hwb[0]/360 * 400), color.hwb[1], color.hwb[2]) - - const rgb_color = new CSSRGB(color.rgb[0], color.rgb[1], color.rgb[2]) - - // Test conversion from CSSHSL to others. - test(() => { - const hsl_to_rgb = hsl_color_degrees.toRGB(); - for (const attr of rgb_attributes) { - assert_color_channel_approx_equals(hsl_to_rgb[attr], rgb_color[attr]); - } - }, `Converting HSL using degrees to RGB works for ${color.name}.`); - - test(() => { - const hsl_to_rgb = hsl_color_radians.toRGB(); - for (const attr of rgb_attributes) { - assert_color_channel_approx_equals(hsl_to_rgb[attr], rgb_color[attr]); - } - }, `Converting HSL using radians to RGB works for ${color.name}.`); - - test(() => { - const hsl_to_rgb = hsl_color_gradians.toRGB(); - for (const attr of rgb_attributes) { - assert_color_channel_approx_equals(hsl_to_rgb[attr], rgb_color[attr]); - } - }, `Converting HSL using gradians to RGB works for ${color.name}.`); - - test(() => { - const hsl_to_hwb = hsl_color_degrees.toHWB(); - for (const attr of hwb_attributes) { - assert_color_channel_approx_equals(hwb_color_degrees[attr], hsl_to_hwb[attr]); - } - }, `Converting HSL to HWB works for ${color.name}.`); - - // Test conversion from CSSHWB to others. - test(() => { - const hwb_to_rgb = hwb_color_degrees.toRGB(); - for (const attr of rgb_attributes) { - assert_color_channel_approx_equals(hwb_to_rgb[attr], rgb_color[attr]); - } - }, `Converting HWB using degrees to RGB works for ${color.name}.`); - - test(() => { - const hwb_to_rgb = hwb_color_radians.toRGB(); - for (const attr of rgb_attributes) { - assert_color_channel_approx_equals(hwb_to_rgb[attr], rgb_color[attr]); - } - }, `Converting HWB using radians to RGB works for ${color.name}.`); - - test(() => { - const hwb_to_rgb = hwb_color_gradians.toRGB(); - for (const attr of rgb_attributes) { - assert_color_channel_approx_equals(hwb_to_rgb[attr], rgb_color[attr]); - } - }, `Converting HWB using gradians to RGB works for ${color.name}.`); - - test(() => { - const hwb_to_hsl = hwb_color_degrees.toHSL(); - for (const attr of hsl_attributes) { - assert_color_channel_approx_equals(hsl_color_degrees[attr], hwb_to_hsl[attr]); - } - }, `Converting HWB to HSL works for ${color.name}.`); - - // Test conversion from CSSRGB to others - test(() => { - const rgb_to_hsl = rgb_color.toHSL(); - for (const attr of hsl_attributes) { - assert_color_channel_approx_equals(hsl_color_degrees[attr], rgb_to_hsl[attr]); - } - }, `Converting RGB to HSL works for ${color.name}.`); - - test(() => { - - const rgb_to_hwb = rgb_color.toHWB(); - for (const attr of hwb_attributes) { - assert_color_channel_approx_equals(hwb_color_degrees[attr], rgb_to_hwb[attr]); - } - }, `Converting RGB to HWB works for ${color.name}.`); -} - const PARSING_COLOR_TEST_CASES = [ { value: 'rgb(255,255,255)',
diff --git a/third_party/blink/web_tests/external/wpt/css/css-typed-om/stylevalue-subclasses/cssRGB.html b/third_party/blink/web_tests/external/wpt/css/css-typed-om/stylevalue-subclasses/cssRGB.html index 8ec193d..ecd30d7 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-typed-om/stylevalue-subclasses/cssRGB.html +++ b/third_party/blink/web_tests/external/wpt/css/css-typed-om/stylevalue-subclasses/cssRGB.html
@@ -84,33 +84,4 @@ }, `CSSRGB.${attr} can be updated with ${testCase.desc}`); } } - -test(() => { - const color = new CSSRGB( - new CSSMathSum(CSS.percent(10), CSS.percent(20)), - new CSSMathProduct(CSS.percent(10), CSS.number(2)), - new CSSMathMax(CSS.percent(10), CSS.percent(50)) - ); - assert_color_channel_approx_equals(color.r, new CSSMathSum(CSS.percent(10), CSS.percent(20))); - assert_color_channel_approx_equals(color.g, new CSSMathProduct(CSS.percent(10), CSS.number(2))); - assert_color_channel_approx_equals(color.b, new CSSMathMax(CSS.percent(10), CSS.percent(50))); - let result = color.toRGB(); - assert_color_channel_approx_equals(result.r, CSS.percent(30)); - assert_color_channel_approx_equals(result.g, CSS.percent(20)); - assert_color_channel_approx_equals(result.b, CSS.percent(50)); -}, `toRGB function evaluates sum, product and max objects.`); - -test(() => { - const color = new CSSRGB(1, 0.5, CSS.number(0.3), CSS.percent(50)); - let result = color.toRGB(); - assert_color_channel_approx_equals(result.r, CSS.percent(100)); - assert_color_channel_approx_equals(result.g, CSS.percent(50)); - assert_color_channel_approx_equals(result.b, CSS.percent(30)); - assert_color_channel_approx_equals(result.alpha, CSS.percent(50)); - for (const attr of ["r", "g", "b", "alpha"]) { - color[attr] = 0.7; - result = color.toRGB(); - assert_color_channel_approx_equals(result[attr], CSS.percent(70)); - } -}, "toRGB() function works as expected and values can be updated."); </script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-values/inline-cache-base-uri-ref.html b/third_party/blink/web_tests/external/wpt/css/css-values/inline-cache-base-uri-ref.html new file mode 100644 index 0000000..07f7449d --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-values/inline-cache-base-uri-ref.html
@@ -0,0 +1,24 @@ +<!doctype html> +<meta charset="utf-8"> +<title>CSS test reference</title> +<style> + :root { + background-image: url("/images/blue.png"); + } + .frame { + box-sizing: border-box; + width: 100px; + height: 100px; + background-color: purple; + padding: 8px; /* Matches default body margin */ + } + + .frame > div { + width: 50px; + height: 50px; + background-color: lime; + } +</style> +<div class="frame"> + <div></div> +</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-values/inline-cache-base-uri.css b/third_party/blink/web_tests/external/wpt/css/css-values/inline-cache-base-uri.css new file mode 100644 index 0000000..2efbfba --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-values/inline-cache-base-uri.css
@@ -0,0 +1 @@ +div { background-color: red !important }
diff --git a/third_party/blink/web_tests/external/wpt/css/css-values/inline-cache-base-uri.html b/third_party/blink/web_tests/external/wpt/css/css-values/inline-cache-base-uri.html new file mode 100644 index 0000000..9624905 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-values/inline-cache-base-uri.html
@@ -0,0 +1,28 @@ +<!doctype html> +<meta charset="utf-8"> +<title>Test that base URIs are correct in presence of the same inline stylesheet</title> +<link rel="author" href="mailto:emilio@crisal.io" title="Emilio Cobos Álvarez"> +<link rel="author" href="https://mozilla.org" title="Mozilla"> +<link rel="help" href="https://drafts.csswg.org/css-values-4/#relative-urls"> +<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1978217"> +<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1978555"> +<link rel="match" href="inline-cache-base-uri-ref.html"> +<!-- NOTE(emilio): inline-cache-base-uri.css is invalid from here --> +<style>@import "inline-cache-base-uri.css";</style> +<style> + :root { + background-image: url("../../images/blue.png"); + background-color: purple; + } +</style> +<script> + // This script ensures that @import above has fully loaded +</script> +<style>@import "inline-cache-base-uri.css";</style> +<script> + // Same, but this should make extra sure that we cache the @import before we start the frame load. + document.documentElement.getBoundingClientRect(); +</script> +<iframe style="width: 100px; height: 100px; border: 0;" src="inline-cache-base-uri/inner.html"></iframe> +<!-- This div makes sure that the inner inline-cache-base-uri.css is not loaded in this page (otherwise the test would fail) --> +<div></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-values/inline-cache-base-uri/inline-cache-base-uri.css b/third_party/blink/web_tests/external/wpt/css/css-values/inline-cache-base-uri/inline-cache-base-uri.css new file mode 100644 index 0000000..df719dd --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-values/inline-cache-base-uri/inline-cache-base-uri.css
@@ -0,0 +1,5 @@ +div { + width: 50px; + height: 50px; + background-color: lime; +}
diff --git a/third_party/blink/web_tests/external/wpt/css/css-values/inline-cache-base-uri/inner.html b/third_party/blink/web_tests/external/wpt/css/css-values/inline-cache-base-uri/inner.html new file mode 100644 index 0000000..7a23e13 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-values/inline-cache-base-uri/inner.html
@@ -0,0 +1,11 @@ +<!doctype html> +<meta charset="utf-8"> +<!-- NOTE(emilio): It's important the text content of these matches exactly inline-cache-base-uri.html --> +<style>@import "inline-cache-base-uri.css";</style> +<style> + :root { + background-image: url("../../images/blue.png"); + background-color: purple; + } +</style> +<div></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/filter-effects/backdrop-filter-edge-behavior-ref.html b/third_party/blink/web_tests/external/wpt/css/filter-effects/backdrop-filter-edge-behavior-ref.html index d5e8fa8..11246d7 100644 --- a/third_party/blink/web_tests/external/wpt/css/filter-effects/backdrop-filter-edge-behavior-ref.html +++ b/third_party/blink/web_tests/external/wpt/css/filter-effects/backdrop-filter-edge-behavior-ref.html
@@ -3,9 +3,6 @@ <title>backdrop-filter: Edge behavior</title> <link rel="author" href="mailto:masonf@chromium.org"> - - - <div> <p>Expected: The black box inside the red box should contain some red, despite being outside of the scroller's clip</p> </div> @@ -18,6 +15,7 @@ <style> html { scrollbar-width: none; + overflow: hidden; } #scroller { width: 250px;
diff --git a/third_party/blink/web_tests/external/wpt/css/filter-effects/backdrop-filter-edge-behavior.html b/third_party/blink/web_tests/external/wpt/css/filter-effects/backdrop-filter-edge-behavior.html index 2123e76..7649bfd8 100644 --- a/third_party/blink/web_tests/external/wpt/css/filter-effects/backdrop-filter-edge-behavior.html +++ b/third_party/blink/web_tests/external/wpt/css/filter-effects/backdrop-filter-edge-behavior.html
@@ -17,6 +17,9 @@ </div> <style> + html { + overflow: hidden; + } #scroller { width: 250px; height: 250px;
diff --git a/third_party/blink/web_tests/external/wpt/css/filter-effects/svg-image-root-filter.html b/third_party/blink/web_tests/external/wpt/css/filter-effects/svg-image-root-filter.html index 6df6eb2..c3d99d0 100644 --- a/third_party/blink/web_tests/external/wpt/css/filter-effects/svg-image-root-filter.html +++ b/third_party/blink/web_tests/external/wpt/css/filter-effects/svg-image-root-filter.html
@@ -6,5 +6,6 @@ <link rel="author" title="Emilio Cobos Álvarez" href="mailto:emilio@crisal.io"> <link rel="author" title="Mozilla" href="https://mozilla.org"> <link rel="match" href="svg-image-root-filter-ref.html"> +<meta name="fuzzy" content="maxDifference=0-1; totalPixels=0-400"> <img id="image" src="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' height='50px' width='50px' style='filter: hue-rotate(90deg)'><rect width='20px' height='20px' fill='red'></rect></svg>">
diff --git a/third_party/blink/web_tests/external/wpt/custom-elements/reactions/Document-expected.txt b/third_party/blink/web_tests/external/wpt/custom-elements/reactions/Document-expected.txt deleted file mode 100644 index b68f94c..0000000 --- a/third_party/blink/web_tests/external/wpt/custom-elements/reactions/Document-expected.txt +++ /dev/null
@@ -1,5 +0,0 @@ -This is a testharness.js-based test. -[FAIL] importNode on Document must construct a new custom element when importing a custom element into a window-less document - assert_array_equals: lengths differ, expected array ["constructed"] length 1, got [] length 0 -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/external/wpt/custom-elements/reactions/Document.html b/third_party/blink/web_tests/external/wpt/custom-elements/reactions/Document.html index da2ea0d..4c5d2eb 100644 --- a/third_party/blink/web_tests/external/wpt/custom-elements/reactions/Document.html +++ b/third_party/blink/web_tests/external/wpt/custom-elements/reactions/Document.html
@@ -23,8 +23,8 @@ const newDoc = contentDocument.implementation.createHTMLDocument(); newDoc.importNode(instance); - assert_array_equals(element.takeLog().types(), ['constructed']); -}, 'importNode on Document must construct a new custom element when importing a custom element into a window-less document'); + assert_array_equals(element.takeLog().types(), []); +}, 'importNode on Document must not construct a new custom element when importing a custom element into a window-less document'); test_with_window(function (contentWindow, contentDocument) { const element = define_custom_element_in_window(contentWindow, 'custom-element', []);
diff --git a/third_party/blink/web_tests/external/wpt/custom-elements/registries/CustomElementRegistry-upgrade.html b/third_party/blink/web_tests/external/wpt/custom-elements/registries/CustomElementRegistry-upgrade.html index c68bc37d..5a5d594 100644 --- a/third_party/blink/web_tests/external/wpt/custom-elements/registries/CustomElementRegistry-upgrade.html +++ b/third_party/blink/web_tests/external/wpt/custom-elements/registries/CustomElementRegistry-upgrade.html
@@ -11,11 +11,11 @@ <template shadowrootmode="closed" shadowrootclonable="true" shadowrootcustomelementregistry> <a-b> <template shadowrootmode="closed" shadowrootclonable="true" shadowrootcustomelementregistry> - <c-d/> + <c-d> <template shadowrootmode="closed" shadowrootclonable="true"> <a-b></a-b> </template> - <c-d> + </c-d> </template> </a-b> </template>
diff --git a/third_party/blink/web_tests/external/wpt/custom-elements/registries/Document-importNode-cross-document.window-expected.txt b/third_party/blink/web_tests/external/wpt/custom-elements/registries/Document-importNode-cross-document.window-expected.txt new file mode 100644 index 0000000..359c67a --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/custom-elements/registries/Document-importNode-cross-document.window-expected.txt
@@ -0,0 +1,27 @@ +This is a testharness.js-based test. +[FAIL] Cloning with global registry + assert_equals: expected (object) object "[object CustomElementRegistry]" but got (undefined) undefined +[FAIL] Cloning with explicit global registry + assert_equals: expected (object) object "[object CustomElementRegistry]" but got (undefined) undefined +[FAIL] Cloning with scoped registry + Failed to construct 'CustomElementRegistry': Illegal constructor +[FAIL] Cloning including shadow tree with global registry + assert_equals: expected (object) object "[object CustomElementRegistry]" but got (undefined) undefined +[FAIL] Cloning including shadow tree with explicit global registry + assert_equals: expected (object) object "[object CustomElementRegistry]" but got (undefined) undefined +[FAIL] Cloning including shadow tree with scoped registry + Failed to construct 'CustomElementRegistry': Illegal constructor +[FAIL] Cloning with global registry (null registry target) + assert_equals: expected (object) null but got (undefined) undefined +[FAIL] Cloning with explicit global registry (null registry target) + assert_equals: expected (object) null but got (undefined) undefined +[FAIL] Cloning with scoped registry (null registry target) + Failed to construct 'CustomElementRegistry': Illegal constructor +[FAIL] Cloning including shadow tree with global registry (null registry target) + assert_equals: expected (object) null but got (undefined) undefined +[FAIL] Cloning including shadow tree with explicit global registry (null registry target) + assert_equals: expected (object) null but got (undefined) undefined +[FAIL] Cloning including shadow tree with scoped registry (null registry target) + Failed to construct 'CustomElementRegistry': Illegal constructor +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/external/wpt/custom-elements/registries/Document-importNode-cross-document.window.js b/third_party/blink/web_tests/external/wpt/custom-elements/registries/Document-importNode-cross-document.window.js new file mode 100644 index 0000000..0501e53 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/custom-elements/registries/Document-importNode-cross-document.window.js
@@ -0,0 +1,116 @@ +// Target document has a global registry + +test(t => { + const contentDocument = document.body.appendChild(document.createElement('iframe')).contentDocument; + t.add_cleanup(() => contentDocument.defaultView.frameElement.remove()); + + const element = document.createElement("div"); + const clone = contentDocument.importNode(element); + assert_equals(clone.customElementRegistry, contentDocument.defaultView.customElements); +}, "Cloning with global registry"); + +test(t => { + const contentDocument = document.body.appendChild(document.createElement('iframe')).contentDocument; + t.add_cleanup(() => contentDocument.defaultView.frameElement.remove()); + + const element = document.createElement("div", { customElementRegistry: customElements }); + const clone = contentDocument.importNode(element); + assert_equals(clone.customElementRegistry, contentDocument.defaultView.customElements); +}, "Cloning with explicit global registry"); + +test(t => { + const contentDocument = document.body.appendChild(document.createElement('iframe')).contentDocument; + t.add_cleanup(() => contentDocument.defaultView.frameElement.remove()); + + const scoped = new CustomElementRegistry(); + const element = document.createElement("div", { customElementRegistry: scoped }); + const clone = contentDocument.importNode(element); + assert_equals(clone.customElementRegistry, scoped); +}, "Cloning with scoped registry"); + +test(t => { + const contentDocument = document.body.appendChild(document.createElement('iframe')).contentDocument; + t.add_cleanup(() => contentDocument.defaultView.frameElement.remove()); + + const element = document.createElement("div"); + const elementShadow = element.attachShadow({ mode: "open", clonable: true }); + const clone = contentDocument.importNode(element); + assert_equals(clone.shadowRoot.customElementRegistry, contentDocument.defaultView.customElements); +}, "Cloning including shadow tree with global registry"); + +test(t => { + const contentDocument = document.body.appendChild(document.createElement('iframe')).contentDocument; + t.add_cleanup(() => contentDocument.defaultView.frameElement.remove()); + + const element = document.createElement("div"); + const elementShadow = element.attachShadow({ mode: "open", clonable: true, customElementRegistry: customElements }); + const clone = contentDocument.importNode(element); + assert_equals(clone.shadowRoot.customElementRegistry, contentDocument.defaultView.customElements); +}, "Cloning including shadow tree with explicit global registry"); + +test(t => { + const contentDocument = document.body.appendChild(document.createElement('iframe')).contentDocument; + t.add_cleanup(() => contentDocument.defaultView.frameElement.remove()); + + const scoped = new CustomElementRegistry(); + const element = document.createElement("div"); + const elementShadow = element.attachShadow({ mode: "open", clonable: true, customElementRegistry: scoped }); + const clone = contentDocument.importNode(element); + assert_equals(clone.shadowRoot.customElementRegistry, scoped); +}, "Cloning including shadow tree with scoped registry"); + + +// Target document has a null registry + +test(t => { + const contentDocument = document.implementation.createHTMLDocument(); + + const element = document.createElement("div"); + const clone = contentDocument.importNode(element); + assert_equals(clone.customElementRegistry, null); +}, "Cloning with global registry (null registry target)"); + +test(t => { + const contentDocument = document.implementation.createHTMLDocument(); + + const element = document.createElement("div", { customElementRegistry: customElements }); + const clone = contentDocument.importNode(element); + assert_equals(clone.customElementRegistry, null); +}, "Cloning with explicit global registry (null registry target)"); + +test(t => { + const contentDocument = document.implementation.createHTMLDocument(); + + const scoped = new CustomElementRegistry(); + const element = document.createElement("div", { customElementRegistry: scoped }); + const clone = contentDocument.importNode(element); + assert_equals(clone.customElementRegistry, scoped); +}, "Cloning with scoped registry (null registry target)"); + +test(t => { + const contentDocument = document.implementation.createHTMLDocument(); + + const element = document.createElement("div"); + const elementShadow = element.attachShadow({ mode: "open", clonable: true }); + const clone = contentDocument.importNode(element); + assert_equals(clone.shadowRoot.customElementRegistry, null); +}, "Cloning including shadow tree with global registry (null registry target)"); + +test(t => { + const contentDocument = document.implementation.createHTMLDocument(); + + const element = document.createElement("div"); + const elementShadow = element.attachShadow({ mode: "open", clonable: true, customElementRegistry: customElements }); + const clone = contentDocument.importNode(element); + assert_equals(clone.shadowRoot.customElementRegistry, null); +}, "Cloning including shadow tree with explicit global registry (null registry target)"); + +test(t => { + const contentDocument = document.implementation.createHTMLDocument(); + + const scoped = new CustomElementRegistry(); + const element = document.createElement("div"); + const elementShadow = element.attachShadow({ mode: "open", clonable: true, customElementRegistry: scoped }); + const clone = contentDocument.importNode(element); + assert_equals(clone.shadowRoot.customElementRegistry, scoped); +}, "Cloning including shadow tree with scoped registry (null registry target)");
diff --git a/third_party/blink/web_tests/external/wpt/custom-elements/registries/adoption.window-expected.txt b/third_party/blink/web_tests/external/wpt/custom-elements/registries/adoption.window-expected.txt new file mode 100644 index 0000000..834b0d8 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/custom-elements/registries/adoption.window-expected.txt
@@ -0,0 +1,75 @@ +This is a testharness.js-based test. +[FAIL] Adoption with global registry + assert_equals: expected (object) object "[object CustomElementRegistry]" but got (undefined) undefined +[FAIL] Adoption with explicit global registry + assert_equals: expected (object) object "[object CustomElementRegistry]" but got (undefined) undefined +[FAIL] Adoption with scoped registry + Failed to construct 'CustomElementRegistry': Illegal constructor +[FAIL] Adoption with global registry into a scoped registry + assert_equals: expected (object) object "[object CustomElementRegistry]" but got (undefined) undefined +[FAIL] Adoption with explicit global registry into a scoped registry + assert_equals: expected (object) object "[object CustomElementRegistry]" but got (undefined) undefined +[FAIL] Adoption with scoped registry into a scoped registry + Failed to construct 'CustomElementRegistry': Illegal constructor +[FAIL] Adoption including shadow root with global registry + assert_equals: expected (object) object "[object CustomElementRegistry]" but got (undefined) undefined +[FAIL] Adoption including shadow root with explicit global registry + assert_equals: expected (object) object "[object CustomElementRegistry]" but got (undefined) undefined +[FAIL] Adoption including shadow root with scoped registry + Failed to construct 'CustomElementRegistry': Illegal constructor +[FAIL] Adoption including shadow root with global registry into a scoped registry + assert_equals: expected (object) object "[object CustomElementRegistry]" but got (undefined) undefined +[FAIL] Adoption including shadow root with explicit global registry into a scoped registry + assert_equals: expected (object) object "[object CustomElementRegistry]" but got (undefined) undefined +[FAIL] Adoption including shadow root with scoped registry into a scoped registry + Failed to construct 'CustomElementRegistry': Illegal constructor +[FAIL] Adoption with global registry (null registry target) + assert_equals: expected (object) object "[object CustomElementRegistry]" but got (undefined) undefined +[FAIL] Adoption with explicit global registry (null registry target) + assert_equals: expected (object) object "[object CustomElementRegistry]" but got (undefined) undefined +[FAIL] Adoption with scoped registry (null registry target) + Failed to construct 'CustomElementRegistry': Illegal constructor +[FAIL] Adoption with global registry into a scoped registry (null registry target) + assert_equals: expected (object) object "[object CustomElementRegistry]" but got (undefined) undefined +[FAIL] Adoption with explicit global registry into a scoped registry (null registry target) + assert_equals: expected (object) object "[object CustomElementRegistry]" but got (undefined) undefined +[FAIL] Adoption with scoped registry into a scoped registry (null registry target) + Failed to construct 'CustomElementRegistry': Illegal constructor +[FAIL] Adoption including shadow root with global registry (null registry target) + assert_equals: expected (object) object "[object CustomElementRegistry]" but got (undefined) undefined +[FAIL] Adoption including shadow root with explicit global registry (null registry target) + assert_equals: expected (object) object "[object CustomElementRegistry]" but got (undefined) undefined +[FAIL] Adoption including shadow root with scoped registry (null registry target) + Failed to construct 'CustomElementRegistry': Illegal constructor +[FAIL] Adoption including shadow root with global registry into a scoped registry (null registry target) + assert_equals: expected (object) object "[object CustomElementRegistry]" but got (undefined) undefined +[FAIL] Adoption including shadow root with explicit global registry into a scoped registry (null registry target) + assert_equals: expected (object) object "[object CustomElementRegistry]" but got (undefined) undefined +[FAIL] Adoption including shadow root with scoped registry into a scoped registry (null registry target) + Failed to construct 'CustomElementRegistry': Illegal constructor +[FAIL] Adoption with global registry (scoped registry target) + Failed to construct 'CustomElementRegistry': Illegal constructor +[FAIL] Adoption with explicit global registry (scoped registry target) + Failed to construct 'CustomElementRegistry': Illegal constructor +[FAIL] Adoption with scoped registry (scoped registry target) + Failed to construct 'CustomElementRegistry': Illegal constructor +[FAIL] Adoption with global registry into a scoped registry (scoped registry target) + Failed to construct 'CustomElementRegistry': Illegal constructor +[FAIL] Adoption with explicit global registry into a scoped registry (scoped registry target) + Failed to construct 'CustomElementRegistry': Illegal constructor +[FAIL] Adoption with scoped registry into a scoped registry (scoped registry target) + Failed to construct 'CustomElementRegistry': Illegal constructor +[FAIL] Adoption including shadow root with global registry (scoped registry target) + Failed to construct 'CustomElementRegistry': Illegal constructor +[FAIL] Adoption including shadow root with explicit global registry (scoped registry target) + Failed to construct 'CustomElementRegistry': Illegal constructor +[FAIL] Adoption including shadow root with scoped registry (scoped registry target) + Failed to construct 'CustomElementRegistry': Illegal constructor +[FAIL] Adoption including shadow root with global registry into a scoped registry (scoped registry target) + Failed to construct 'CustomElementRegistry': Illegal constructor +[FAIL] Adoption including shadow root with explicit global registry into a scoped registry (scoped registry target) + Failed to construct 'CustomElementRegistry': Illegal constructor +[FAIL] Adoption including shadow root with scoped registry into a scoped registry (scoped registry target) + Failed to construct 'CustomElementRegistry': Illegal constructor +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/external/wpt/custom-elements/registries/adoption.window.js b/third_party/blink/web_tests/external/wpt/custom-elements/registries/adoption.window.js new file mode 100644 index 0000000..6371b36 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/custom-elements/registries/adoption.window.js
@@ -0,0 +1,496 @@ +// Target document has a global registry + +test(t => { + const contentDocument = document.body.appendChild(document.createElement('iframe')).contentDocument; + t.add_cleanup(() => contentDocument.defaultView.frameElement.remove()); + const element = document.createElement('div'); + assert_equals(element.customElementRegistry, customElements); + + contentDocument.body.appendChild(element); + assert_equals(element.customElementRegistry, contentDocument.customElementRegistry); +}, "Adoption with global registry"); + +test(t => { + const contentDocument = document.body.appendChild(document.createElement('iframe')).contentDocument; + t.add_cleanup(() => contentDocument.defaultView.frameElement.remove()); + const element = document.createElement('div', { customElementRegistry: customElements }); + assert_equals(element.customElementRegistry, customElements); + + contentDocument.body.appendChild(element); + assert_equals(element.customElementRegistry, contentDocument.customElementRegistry); +}, "Adoption with explicit global registry"); + +test(t => { + const contentDocument = document.body.appendChild(document.createElement('iframe')).contentDocument; + t.add_cleanup(() => contentDocument.defaultView.frameElement.remove()); + const scoped = new CustomElementRegistry(); + const element = document.createElement('div', { customElementRegistry: scoped }); + assert_equals(element.customElementRegistry, scoped); + + contentDocument.body.appendChild(element); + assert_equals(element.customElementRegistry, scoped); +}, "Adoption with scoped registry"); + +test(t => { + const contentDocument = document.body.appendChild(document.createElement('iframe')).contentDocument; + t.add_cleanup(() => contentDocument.defaultView.frameElement.remove()); + const element = document.createElement('div'); + assert_equals(element.customElementRegistry, customElements); + + const scoped = new CustomElementRegistry(); + const scopedElement = contentDocument.createElement('div', { customElementRegistry: scoped }); + contentDocument.body.appendChild(scopedElement); + assert_equals(scopedElement.customElementRegistry, scoped); + scopedElement.appendChild(element); + assert_equals(element.customElementRegistry, contentDocument.customElementRegistry); +}, "Adoption with global registry into a scoped registry"); + +test(t => { + const contentDocument = document.body.appendChild(document.createElement('iframe')).contentDocument; + t.add_cleanup(() => contentDocument.defaultView.frameElement.remove()); + const element = document.createElement('div', { customElementRegistry: customElements }); + assert_equals(element.customElementRegistry, customElements); + + const scoped = new CustomElementRegistry(); + const scopedElement = contentDocument.createElement('div', { customElementRegistry: scoped }); + contentDocument.body.appendChild(scopedElement); + assert_equals(scopedElement.customElementRegistry, scoped); + scopedElement.appendChild(element); + assert_equals(element.customElementRegistry, contentDocument.customElementRegistry); +}, "Adoption with explicit global registry into a scoped registry"); + +test(t => { + const contentDocument = document.body.appendChild(document.createElement('iframe')).contentDocument; + t.add_cleanup(() => contentDocument.defaultView.frameElement.remove()); + const scoped = new CustomElementRegistry(); + const element = document.createElement('div', { customElementRegistry: scoped }); + assert_equals(element.customElementRegistry, scoped); + + const scoped2 = new CustomElementRegistry(); + const scopedElement = contentDocument.createElement('div', { customElementRegistry: scoped2 }); + contentDocument.body.appendChild(scopedElement); + assert_equals(scopedElement.customElementRegistry, scoped2); + scopedElement.appendChild(element); + assert_equals(element.customElementRegistry, scoped); +}, "Adoption with scoped registry into a scoped registry"); + +test(t => { + const contentDocument = document.body.appendChild(document.createElement('iframe')).contentDocument; + t.add_cleanup(() => contentDocument.defaultView.frameElement.remove()); + const element = document.createElement('div'); + const elementShadow = element.attachShadow({ mode: "closed" }); + assert_equals(elementShadow.customElementRegistry, customElements); + + contentDocument.body.appendChild(element); + // In certain implementations touching element.customElementRegistry can poison the results so we + // don't do that here. + assert_equals(elementShadow.customElementRegistry, contentDocument.customElementRegistry); +}, "Adoption including shadow root with global registry"); + +test(t => { + const contentDocument = document.body.appendChild(document.createElement('iframe')).contentDocument; + t.add_cleanup(() => contentDocument.defaultView.frameElement.remove()); + const element = document.createElement('div'); + const elementShadow = element.attachShadow({ mode: "closed", customElementRegistry: customElements }); + assert_equals(elementShadow.customElementRegistry, customElements); + + contentDocument.body.appendChild(element); + assert_equals(elementShadow.customElementRegistry, contentDocument.customElementRegistry); +}, "Adoption including shadow root with explicit global registry"); + +test(t => { + const contentDocument = document.body.appendChild(document.createElement('iframe')).contentDocument; + t.add_cleanup(() => contentDocument.defaultView.frameElement.remove()); + const element = document.createElement('div'); + const scoped = new CustomElementRegistry(); + const elementShadow = element.attachShadow({ mode: "closed", customElementRegistry: scoped }); + assert_equals(elementShadow.customElementRegistry, scoped); + + contentDocument.body.appendChild(element); + assert_equals(elementShadow.customElementRegistry, scoped); +}, "Adoption including shadow root with scoped registry"); + +test(t => { + const contentDocument = document.body.appendChild(document.createElement('iframe')).contentDocument; + t.add_cleanup(() => contentDocument.defaultView.frameElement.remove()); + const element = document.createElement('div'); + const elementShadow = element.attachShadow({ mode: "closed" }); + assert_equals(elementShadow.customElementRegistry, customElements); + + const scoped = new CustomElementRegistry(); + const scopedElement = contentDocument.createElement('div', { customElementRegistry: scoped }); + contentDocument.body.appendChild(scopedElement); + assert_equals(scopedElement.customElementRegistry, scoped); + scopedElement.appendChild(element); + assert_equals(elementShadow.customElementRegistry, contentDocument.customElementRegistry); +}, "Adoption including shadow root with global registry into a scoped registry"); + +test(t => { + const contentDocument = document.body.appendChild(document.createElement('iframe')).contentDocument; + t.add_cleanup(() => contentDocument.defaultView.frameElement.remove()); + const element = document.createElement('div'); + const elementShadow = element.attachShadow({ mode: "closed", customElementRegistry: customElements }); + assert_equals(elementShadow.customElementRegistry, customElements); + + const scoped = new CustomElementRegistry(); + const scopedElement = contentDocument.createElement('div', { customElementRegistry: scoped }); + contentDocument.body.appendChild(scopedElement); + assert_equals(scopedElement.customElementRegistry, scoped); + scopedElement.appendChild(element); + assert_equals(elementShadow.customElementRegistry, contentDocument.customElementRegistry); +}, "Adoption including shadow root with explicit global registry into a scoped registry"); + +test(t => { + const contentDocument = document.body.appendChild(document.createElement('iframe')).contentDocument; + t.add_cleanup(() => contentDocument.defaultView.frameElement.remove()); + const element = document.createElement('div'); + const scoped = new CustomElementRegistry(); + const elementShadow = element.attachShadow({ mode: "closed", customElementRegistry: scoped }); + assert_equals(elementShadow.customElementRegistry, scoped); + + const scoped2 = new CustomElementRegistry(); + const scopedElement = contentDocument.createElement('div', { customElementRegistry: scoped2 }); + contentDocument.body.appendChild(scopedElement); + assert_equals(scopedElement.customElementRegistry, scoped2); + scopedElement.appendChild(element); + assert_equals(elementShadow.customElementRegistry, scoped); +}, "Adoption including shadow root with scoped registry into a scoped registry"); + + +// Target document has a null registry + +test(t => { + const contentDocument = document.implementation.createHTMLDocument(); + const element = document.createElement('div'); + assert_equals(element.customElementRegistry, customElements); + + contentDocument.body.appendChild(element); + assert_equals(element.customElementRegistry, null); +}, "Adoption with global registry (null registry target)"); + +test(t => { + const contentDocument = document.implementation.createHTMLDocument(); + const element = document.createElement('div', { customElementRegistry: customElements }); + assert_equals(element.customElementRegistry, customElements); + + contentDocument.body.appendChild(element); + assert_equals(element.customElementRegistry, null); +}, "Adoption with explicit global registry (null registry target)"); + +test(t => { + const contentDocument = document.implementation.createHTMLDocument(); + const scoped = new CustomElementRegistry(); + const element = document.createElement('div', { customElementRegistry: scoped }); + assert_equals(element.customElementRegistry, scoped); + + contentDocument.body.appendChild(element); + assert_equals(element.customElementRegistry, scoped); +}, "Adoption with scoped registry (null registry target)"); + +test(t => { + const contentDocument = document.implementation.createHTMLDocument(); + const element = document.createElement('div'); + assert_equals(element.customElementRegistry, customElements); + + const scoped = new CustomElementRegistry(); + const scopedElement = contentDocument.createElement('div', { customElementRegistry: scoped }); + contentDocument.body.appendChild(scopedElement); + assert_equals(scopedElement.customElementRegistry, scoped); + scopedElement.appendChild(element); + assert_equals(element.customElementRegistry, null); +}, "Adoption with global registry into a scoped registry (null registry target)"); + +test(t => { + const contentDocument = document.implementation.createHTMLDocument(); + const element = document.createElement('div', { customElementRegistry: customElements }); + assert_equals(element.customElementRegistry, customElements); + + const scoped = new CustomElementRegistry(); + const scopedElement = contentDocument.createElement('div', { customElementRegistry: scoped }); + contentDocument.body.appendChild(scopedElement); + assert_equals(scopedElement.customElementRegistry, scoped); + scopedElement.appendChild(element); + assert_equals(element.customElementRegistry, null); +}, "Adoption with explicit global registry into a scoped registry (null registry target)"); + +test(t => { + const contentDocument = document.implementation.createHTMLDocument(); + const scoped = new CustomElementRegistry(); + const element = document.createElement('div', { customElementRegistry: scoped }); + assert_equals(element.customElementRegistry, scoped); + + const scoped2 = new CustomElementRegistry(); + const scopedElement = contentDocument.createElement('div', { customElementRegistry: scoped2 }); + contentDocument.body.appendChild(scopedElement); + assert_equals(scopedElement.customElementRegistry, scoped2); + scopedElement.appendChild(element); + assert_equals(element.customElementRegistry, scoped); +}, "Adoption with scoped registry into a scoped registry (null registry target)"); + +test(t => { + const contentDocument = document.implementation.createHTMLDocument(); + const element = document.createElement('div'); + const elementShadow = element.attachShadow({ mode: "closed" }); + assert_equals(elementShadow.customElementRegistry, customElements); + + contentDocument.body.appendChild(element); + // In certain implementations touching element.customElementRegistry can poison the results so we + // don't do that here. + assert_equals(elementShadow.customElementRegistry, null); +}, "Adoption including shadow root with global registry (null registry target)"); + +test(t => { + const contentDocument = document.implementation.createHTMLDocument(); + const element = document.createElement('div'); + const elementShadow = element.attachShadow({ mode: "closed", customElementRegistry: customElements }); + assert_equals(elementShadow.customElementRegistry, customElements); + + contentDocument.body.appendChild(element); + assert_equals(elementShadow.customElementRegistry, null); +}, "Adoption including shadow root with explicit global registry (null registry target)"); + +test(t => { + const contentDocument = document.implementation.createHTMLDocument(); + const element = document.createElement('div'); + const scoped = new CustomElementRegistry(); + const elementShadow = element.attachShadow({ mode: "closed", customElementRegistry: scoped }); + assert_equals(elementShadow.customElementRegistry, scoped); + + contentDocument.body.appendChild(element); + assert_equals(elementShadow.customElementRegistry, scoped); +}, "Adoption including shadow root with scoped registry (null registry target)"); + +test(t => { + const contentDocument = document.implementation.createHTMLDocument(); + const element = document.createElement('div'); + const elementShadow = element.attachShadow({ mode: "closed" }); + assert_equals(elementShadow.customElementRegistry, customElements); + + const scoped = new CustomElementRegistry(); + const scopedElement = contentDocument.createElement('div', { customElementRegistry: scoped }); + contentDocument.body.appendChild(scopedElement); + assert_equals(scopedElement.customElementRegistry, scoped); + scopedElement.appendChild(element); + assert_equals(elementShadow.customElementRegistry, null); +}, "Adoption including shadow root with global registry into a scoped registry (null registry target)"); + +test(t => { + const contentDocument = document.implementation.createHTMLDocument(); + const element = document.createElement('div'); + const elementShadow = element.attachShadow({ mode: "closed", customElementRegistry: customElements }); + assert_equals(elementShadow.customElementRegistry, customElements); + + const scoped = new CustomElementRegistry(); + const scopedElement = contentDocument.createElement('div', { customElementRegistry: scoped }); + contentDocument.body.appendChild(scopedElement); + assert_equals(scopedElement.customElementRegistry, scoped); + scopedElement.appendChild(element); + assert_equals(elementShadow.customElementRegistry, null); +}, "Adoption including shadow root with explicit global registry into a scoped registry (null registry target)"); + +test(t => { + const contentDocument = document.implementation.createHTMLDocument(); + const element = document.createElement('div'); + const scoped = new CustomElementRegistry(); + const elementShadow = element.attachShadow({ mode: "closed", customElementRegistry: scoped }); + assert_equals(elementShadow.customElementRegistry, scoped); + + const scoped2 = new CustomElementRegistry(); + const scopedElement = contentDocument.createElement('div', { customElementRegistry: scoped2 }); + contentDocument.body.appendChild(scopedElement); + assert_equals(scopedElement.customElementRegistry, scoped2); + scopedElement.appendChild(element); + assert_equals(elementShadow.customElementRegistry, scoped); +}, "Adoption including shadow root with scoped registry into a scoped registry (null registry target)"); + + +// Target document has a scoped registry + +test(t => { + const documentRegistry = new CustomElementRegistry(); + const contentDocument = document.implementation.createHTMLDocument(); + documentRegistry.initialize(contentDocument); + assert_equals(contentDocument.customElementRegistry, documentRegistry); + const element = document.createElement('div'); + assert_equals(element.customElementRegistry, customElements); + + contentDocument.body.appendChild(element); + assert_equals(element.customElementRegistry, null); +}, "Adoption with global registry (scoped registry target)"); + +test(t => { + const documentRegistry = new CustomElementRegistry(); + const contentDocument = document.implementation.createHTMLDocument(); + documentRegistry.initialize(contentDocument); + assert_equals(contentDocument.customElementRegistry, documentRegistry); + + const element = document.createElement('div', { customElementRegistry: customElements }); + assert_equals(element.customElementRegistry, customElements); + + contentDocument.body.appendChild(element); + assert_equals(element.customElementRegistry, null); +}, "Adoption with explicit global registry (scoped registry target)"); + +test(t => { + const documentRegistry = new CustomElementRegistry(); + const contentDocument = document.implementation.createHTMLDocument(); + documentRegistry.initialize(contentDocument); + assert_equals(contentDocument.customElementRegistry, documentRegistry); + + const scoped = new CustomElementRegistry(); + const element = document.createElement('div', { customElementRegistry: scoped }); + assert_equals(element.customElementRegistry, scoped); + + contentDocument.body.appendChild(element); + assert_equals(element.customElementRegistry, scoped); +}, "Adoption with scoped registry (scoped registry target)"); + +test(t => { + const documentRegistry = new CustomElementRegistry(); + const contentDocument = document.implementation.createHTMLDocument(); + documentRegistry.initialize(contentDocument); + assert_equals(contentDocument.customElementRegistry, documentRegistry); + + const element = document.createElement('div'); + assert_equals(element.customElementRegistry, customElements); + + const scoped = new CustomElementRegistry(); + const scopedElement = contentDocument.createElement('div', { customElementRegistry: scoped }); + contentDocument.body.appendChild(scopedElement); + assert_equals(scopedElement.customElementRegistry, scoped); + scopedElement.appendChild(element); + assert_equals(element.customElementRegistry, null); +}, "Adoption with global registry into a scoped registry (scoped registry target)"); + +test(t => { + const documentRegistry = new CustomElementRegistry(); + const contentDocument = document.implementation.createHTMLDocument(); + documentRegistry.initialize(contentDocument); + assert_equals(contentDocument.customElementRegistry, documentRegistry); + + const element = document.createElement('div', { customElementRegistry: customElements }); + assert_equals(element.customElementRegistry, customElements); + + const scoped = new CustomElementRegistry(); + const scopedElement = contentDocument.createElement('div', { customElementRegistry: scoped }); + contentDocument.body.appendChild(scopedElement); + assert_equals(scopedElement.customElementRegistry, scoped); + scopedElement.appendChild(element); + assert_equals(element.customElementRegistry, null); +}, "Adoption with explicit global registry into a scoped registry (scoped registry target)"); + +test(t => { + const documentRegistry = new CustomElementRegistry(); + const contentDocument = document.implementation.createHTMLDocument(); + documentRegistry.initialize(contentDocument); + assert_equals(contentDocument.customElementRegistry, documentRegistry); + + const scoped = new CustomElementRegistry(); + const element = document.createElement('div', { customElementRegistry: scoped }); + assert_equals(element.customElementRegistry, scoped); + + const scoped2 = new CustomElementRegistry(); + const scopedElement = contentDocument.createElement('div', { customElementRegistry: scoped2 }); + contentDocument.body.appendChild(scopedElement); + assert_equals(scopedElement.customElementRegistry, scoped2); + scopedElement.appendChild(element); + assert_equals(element.customElementRegistry, scoped); +}, "Adoption with scoped registry into a scoped registry (scoped registry target)"); + +test(t => { + const documentRegistry = new CustomElementRegistry(); + const contentDocument = document.implementation.createHTMLDocument(); + documentRegistry.initialize(contentDocument); + assert_equals(contentDocument.customElementRegistry, documentRegistry); + + const element = document.createElement('div'); + const elementShadow = element.attachShadow({ mode: "closed" }); + assert_equals(elementShadow.customElementRegistry, customElements); + + contentDocument.body.appendChild(element); + // In certain implementations touching element.customElementRegistry can poison the results so we + // don't do that here. + assert_equals(elementShadow.customElementRegistry, null); +}, "Adoption including shadow root with global registry (scoped registry target)"); + +test(t => { + const documentRegistry = new CustomElementRegistry(); + const contentDocument = document.implementation.createHTMLDocument(); + documentRegistry.initialize(contentDocument); + assert_equals(contentDocument.customElementRegistry, documentRegistry); + + const element = document.createElement('div'); + const elementShadow = element.attachShadow({ mode: "closed", customElementRegistry: customElements }); + assert_equals(elementShadow.customElementRegistry, customElements); + + contentDocument.body.appendChild(element); + assert_equals(elementShadow.customElementRegistry, null); +}, "Adoption including shadow root with explicit global registry (scoped registry target)"); + +test(t => { + const documentRegistry = new CustomElementRegistry(); + const contentDocument = document.implementation.createHTMLDocument(); + documentRegistry.initialize(contentDocument); + assert_equals(contentDocument.customElementRegistry, documentRegistry); + + const element = document.createElement('div'); + const scoped = new CustomElementRegistry(); + const elementShadow = element.attachShadow({ mode: "closed", customElementRegistry: scoped }); + assert_equals(elementShadow.customElementRegistry, scoped); + + contentDocument.body.appendChild(element); + assert_equals(elementShadow.customElementRegistry, scoped); +}, "Adoption including shadow root with scoped registry (scoped registry target)"); + +test(t => { + const documentRegistry = new CustomElementRegistry(); + const contentDocument = document.implementation.createHTMLDocument(); + documentRegistry.initialize(contentDocument); + assert_equals(contentDocument.customElementRegistry, documentRegistry); + + const element = document.createElement('div'); + const elementShadow = element.attachShadow({ mode: "closed" }); + assert_equals(elementShadow.customElementRegistry, customElements); + + const scoped = new CustomElementRegistry(); + const scopedElement = contentDocument.createElement('div', { customElementRegistry: scoped }); + contentDocument.body.appendChild(scopedElement); + assert_equals(scopedElement.customElementRegistry, scoped); + scopedElement.appendChild(element); + assert_equals(elementShadow.customElementRegistry, null); +}, "Adoption including shadow root with global registry into a scoped registry (scoped registry target)"); + +test(t => { + const documentRegistry = new CustomElementRegistry(); + const contentDocument = document.implementation.createHTMLDocument(); + documentRegistry.initialize(contentDocument); + assert_equals(contentDocument.customElementRegistry, documentRegistry); + const element = document.createElement('div'); + const elementShadow = element.attachShadow({ mode: "closed", customElementRegistry: customElements }); + assert_equals(elementShadow.customElementRegistry, customElements); + + const scoped = new CustomElementRegistry(); + const scopedElement = contentDocument.createElement('div', { customElementRegistry: scoped }); + contentDocument.body.appendChild(scopedElement); + assert_equals(scopedElement.customElementRegistry, scoped); + scopedElement.appendChild(element); + assert_equals(elementShadow.customElementRegistry, null); +}, "Adoption including shadow root with explicit global registry into a scoped registry (scoped registry target)"); + +test(t => { + const documentRegistry = new CustomElementRegistry(); + const contentDocument = document.implementation.createHTMLDocument(); + documentRegistry.initialize(contentDocument); + assert_equals(contentDocument.customElementRegistry, documentRegistry); + const element = document.createElement('div'); + const scoped = new CustomElementRegistry(); + const elementShadow = element.attachShadow({ mode: "closed", customElementRegistry: scoped }); + assert_equals(elementShadow.customElementRegistry, scoped); + + const scoped2 = new CustomElementRegistry(); + const scopedElement = contentDocument.createElement('div', { customElementRegistry: scoped2 }); + contentDocument.body.appendChild(scopedElement); + assert_equals(scopedElement.customElementRegistry, scoped2); + scopedElement.appendChild(element); + assert_equals(elementShadow.customElementRegistry, scoped); +}, "Adoption including shadow root with scoped registry into a scoped registry (scoped registry target)");
diff --git a/third_party/blink/web_tests/external/wpt/custom-elements/registries/global.window-expected.txt b/third_party/blink/web_tests/external/wpt/custom-elements/registries/global.window-expected.txt new file mode 100644 index 0000000..c848fee3 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/custom-elements/registries/global.window-expected.txt
@@ -0,0 +1,13 @@ +This is a testharness.js-based test. +[FAIL] initialize() of global registry should throw for nodes from another document + assert_throws_dom: function "() => customElements.initialize(contentDocument)" threw object "TypeError: customElements.initialize is not a function" that is not a DOMException NotSupportedError: property "code" is equal to undefined, expected 9 +[FAIL] createElement() should throw with global registry from another document + assert_throws_dom: function "() => contentDocument.createElement("div", { customElementRegistry: customElements })" did not throw +[FAIL] createElementNS() should throw with global registry from another document + assert_throws_dom: function "() => contentDocument.createElementNS("x", "div", { customElementRegistry: customElements })" did not throw +[FAIL] attachShadow() should throw with global registry from another document + assert_throws_dom: function "() => element.attachShadow({ mode: "closed", customElementRegistry: customElements })" did not throw +[FAIL] importNode() should throw with global registry from another document + assert_throws_dom: function "() => contentDocument.importNode(element, { customElementRegistry: customElements })" did not throw +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/external/wpt/custom-elements/registries/global.window.js b/third_party/blink/web_tests/external/wpt/custom-elements/registries/global.window.js new file mode 100644 index 0000000..7993ccb --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/custom-elements/registries/global.window.js
@@ -0,0 +1,27 @@ +test(() => { + const contentDocument = document.implementation.createHTMLDocument(); + assert_throws_dom("NotSupportedError", () => customElements.initialize(contentDocument)); + assert_throws_dom("NotSupportedError", () => customElements.initialize(contentDocument.createElement("x"))); +}, "initialize() of global registry should throw for nodes from another document"); + +test(() => { + const contentDocument = document.implementation.createHTMLDocument(); + assert_throws_dom("NotSupportedError", () => contentDocument.createElement("div", { customElementRegistry: customElements })); +}, "createElement() should throw with global registry from another document"); + +test(() => { + const contentDocument = document.implementation.createHTMLDocument(); + assert_throws_dom("NotSupportedError", () => contentDocument.createElementNS("x", "div", { customElementRegistry: customElements })); +}, "createElementNS() should throw with global registry from another document"); + +test(() => { + const contentDocument = document.implementation.createHTMLDocument(); + const element = contentDocument.createElement("div"); + assert_throws_dom("NotSupportedError", () => element.attachShadow({ mode: "closed", customElementRegistry: customElements })); +}, "attachShadow() should throw with global registry from another document"); + +test(() => { + const contentDocument = document.implementation.createHTMLDocument(); + const element = contentDocument.createElement("div"); + assert_throws_dom("NotSupportedError", () => contentDocument.importNode(element, { customElementRegistry: customElements })); +}, "importNode() should throw with global registry from another document");
diff --git a/third_party/blink/web_tests/external/wpt/custom-elements/registries/scoped-registry-define-upgrade-criteria-expected.txt b/third_party/blink/web_tests/external/wpt/custom-elements/registries/scoped-registry-define-upgrade-criteria-expected.txt index 7d8ba8367..4b5efd5 100644 --- a/third_party/blink/web_tests/external/wpt/custom-elements/registries/scoped-registry-define-upgrade-criteria-expected.txt +++ b/third_party/blink/web_tests/external/wpt/custom-elements/registries/scoped-registry-define-upgrade-criteria-expected.txt
@@ -14,7 +14,7 @@ [FAIL] Adding definition to scoped registry affects associated shadow roots in all iframes Failed to construct 'CustomElementRegistry': Illegal constructor [FAIL] Adding definition to scoped registry affects associated shadow roots in other frame trees - assert_true: expected true got false + Failed to construct 'CustomElementRegistry': Illegal constructor [FAIL] Adding definition to scoped registry should not upgrade disconnected elements Failed to construct 'CustomElementRegistry': Illegal constructor [FAIL] Adding definition to scoped registry should not upgrade nodes in constructed documents
diff --git a/third_party/blink/web_tests/external/wpt/custom-elements/registries/scoped-registry-define-upgrade-criteria.html b/third_party/blink/web_tests/external/wpt/custom-elements/registries/scoped-registry-define-upgrade-criteria.html index 9c9b076a..f281f7f 100644 --- a/third_party/blink/web_tests/external/wpt/custom-elements/registries/scoped-registry-define-upgrade-criteria.html +++ b/third_party/blink/web_tests/external/wpt/custom-elements/registries/scoped-registry-define-upgrade-criteria.html
@@ -169,16 +169,18 @@ test(t => { const name = nextCustomElementName(); + const registry = new CustomElementRegistry; + const newWindow = window.open('about:blank'); t.add_cleanup(() => newWindow.close()); const host = newWindow.document.createElement('div'); - const shadow = host.attachShadow({mode: 'open', customElementRegistry: window.customElements}); + const shadow = host.attachShadow({mode: 'open', customElementRegistry: registry}); const node = shadow.appendChild(newWindow.document.createElement(name)); newWindow.document.body.appendChild(host); class TestElement extends HTMLElement {}; - window.customElements.define(name, TestElement); + registry.define(name, TestElement); assert_true(node instanceof TestElement); }, 'Adding definition to scoped registry affects associated shadow roots in other frame trees');
diff --git a/third_party/blink/web_tests/external/wpt/custom-elements/scoped-registry-initialize-expected.txt b/third_party/blink/web_tests/external/wpt/custom-elements/registries/scoped-registry-initialize-expected.txt similarity index 100% rename from third_party/blink/web_tests/external/wpt/custom-elements/scoped-registry-initialize-expected.txt rename to third_party/blink/web_tests/external/wpt/custom-elements/registries/scoped-registry-initialize-expected.txt
diff --git a/third_party/blink/web_tests/external/wpt/custom-elements/scoped-registry-initialize.html b/third_party/blink/web_tests/external/wpt/custom-elements/registries/scoped-registry-initialize.html similarity index 100% rename from third_party/blink/web_tests/external/wpt/custom-elements/scoped-registry-initialize.html rename to third_party/blink/web_tests/external/wpt/custom-elements/registries/scoped-registry-initialize.html
diff --git a/third_party/blink/web_tests/external/wpt/custom-elements/upgrading/Document-importNode.html b/third_party/blink/web_tests/external/wpt/custom-elements/upgrading/Document-importNode.html index 9f960127..3f49d1f 100644 --- a/third_party/blink/web_tests/external/wpt/custom-elements/upgrading/Document-importNode.html +++ b/third_party/blink/web_tests/external/wpt/custom-elements/upgrading/Document-importNode.html
@@ -16,9 +16,9 @@ assert_equals(original.customElementRegistry, customElements); let imported = doc.importNode(original); - assert_true(imported instanceof MyElement); - assert_false(imported instanceof MyElement2); - assert_equals(imported.customElementRegistry, customElements); + assert_true(imported instanceof MyElement2); + assert_false(imported instanceof MyElement); + assert_equals(imported.customElementRegistry, w.customElements); }, 'autonomous: document.importNode() should import custom elements successfully'); test_with_window((w, doc) => { @@ -30,7 +30,7 @@ assert_equals(original.customElementRegistry, customElements); let imported = doc.importNode(original); - assert_equals(imported.customElementRegistry, customElements); + assert_equals(imported.customElementRegistry, w.customElements); }, 'autonomous: document.importNode() should import "undefined" custom elements successfully'); </script> </body>
diff --git a/third_party/blink/web_tests/external/wpt/editing/crashtests/delete-after-input-setRangeText.html b/third_party/blink/web_tests/external/wpt/editing/crashtests/delete-after-input-setRangeText.html new file mode 100644 index 0000000..ed33cdd5 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/editing/crashtests/delete-after-input-setRangeText.html
@@ -0,0 +1,30 @@ +<!doctype html> +<html> +<head> +<meta charset="utf-8"> +<script> +addEventListener("DOMContentLoaded", () => { + document.getElementById("input").setRangeText("A", 6, 134); + document.getElementById("center").replaceChild( + document.getElementById("label"), + document.getElementById("center").firstChild + ); + document.designMode = "on"; + document.execCommand("delete"); +}, {once: true}); +</script> +</head> +<body> +<h5> +AA +<ruby> +<rt hidden=""> +<label> +</ruby> +<label id="label" contenteditable="true"> +<input id="input" pattern="^\d+$"> +</h5> +<center id="center"> + +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/editing/crashtests/delete-in-xml-space-preserve.html b/third_party/blink/web_tests/external/wpt/editing/crashtests/delete-in-xml-space-preserve.html new file mode 100644 index 0000000..017af10 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/editing/crashtests/delete-in-xml-space-preserve.html
@@ -0,0 +1,25 @@ +<!doctype html> +<html> +<head> +<meta charset="utf-8"> +<script> +"use strict"; + +addEventListener("load", () => { + document.designMode = "on"; + getSelection().collapse(document.querySelector("hatchpath"), 2); + document.execCommand("delete"); +}, {once: true}); +</script> +</head> +<body>TEST + <svg xml:space="preserve"> + <hatchpath> + <test> + <meshgradient> + </meshgradient> + </test> + </hatchpath> + </svg> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/editing/crashtests/inserttext-with-empty-string-to-replace-selection.html b/third_party/blink/web_tests/external/wpt/editing/crashtests/inserttext-with-empty-string-to-replace-selection.html new file mode 100644 index 0000000..4821d77 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/editing/crashtests/inserttext-with-empty-string-to-replace-selection.html
@@ -0,0 +1,29 @@ +<!doctype html> +<html> +<head> +<meta charset="utf-8"> +<script> +"use strict"; + +addEventListener("load", async () => { + const slot = document.createElement("slot"); + const mspace = document.getElementById("id_0"); + const metadata = document.getElementById("id_1"); + document.documentElement.appendChild(slot); + mspace.outerHTML = "<mark id='id_2' contenteditable='true'><meta id='id_3'></mark>"; + try { + await timeout(metadata.requestFullScreen()); + } catch (e) {} + getSelection().selectAllChildren(document.querySelector("#id_2")); + slot.contentEditable = "true"; + getSelection().collapseToEnd(); + getSelection().extend(document.querySelector("#id_3"), 0); + document.designMode = "on"; + document.execCommand("insertText", false, ""); +}); +</script> +</head><body><math> + <mspace id="id_0"></mspace> + <metadata id="id_1"></metadata> +</math> +</body></html> \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/html/rendering/widgets/button-layout/input-fragmentation-crash.html b/third_party/blink/web_tests/external/wpt/html/rendering/widgets/button-layout/input-fragmentation-crash.html new file mode 100644 index 0000000..78fa40f --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/rendering/widgets/button-layout/input-fragmentation-crash.html
@@ -0,0 +1,13 @@ +<!doctype html> +<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1978487"> +<style> +.parent { + columns: 2; +} +input { + float: inline-start; +} +</style> +<div class="parent"> + <input style="display: block" type="color"> +</div>
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-input-element/radio-focused-and-scrolled-into-view.html b/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-input-element/radio-focused-and-scrolled-into-view.html new file mode 100644 index 0000000..b6584d8 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-input-element/radio-focused-and-scrolled-into-view.html
@@ -0,0 +1,60 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <title>Radio buttons should scroll into view when focused (if off-screen)</title> + <link rel="help" href="https://html.spec.whatwg.org/multipage/interaction.html#keyboard-accessibility-navigation-radios"> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <script src="/resources/testdriver.js"></script> + <script src="/resources/testdriver-actions.js"></script> + <script src="/resources/testdriver-vendor.js"></script> + <style> + input[type="radio"] { + display: block; + } + #offscreen-radio { + margin-top: 200vh; + } + </style> +</head> +<body> + +<h1>Radio buttons should scroll into view when focused (if off-screen)</h1> + +<form> + <input type="radio" name="group" id="radio1"> + <input type="radio" name="group" id="radio2"> + <input type="radio" name="group" id="offscreen-radio"> +</form> + +<script> + function simulateArrowDown() { + return new test_driver.Actions() + .keyDown("\uE015") // "ArrowDown" code point: https://www.w3.org/TR/webdriver2/#keyboard-actions + .send(); + } + + promise_test(async t => { + const firstRadio = document.getElementById("radio1"); + const offscreenRadio = document.getElementById("offscreen-radio"); + const focusPromise = new Promise(resolve => + offscreenRadio.onfocus = () => t.step_timeout(resolve, 50) + ); + + firstRadio.focus(); + await simulateArrowDown(); + await simulateArrowDown(); + await focusPromise; + + const scrollTop = document.scrollingElement.scrollTop; + + assert_equals(offscreenRadio, document.activeElement, 'offscreen radio is focused'); + assert_greater_than(scrollTop, 500, `out-of-viewport radio should trigger scroll — scrollTop=${scrollTop}`); + }, 'Focusing offscreen radio via keyboard should scroll it into view'); + +</script> + +</body> +</html> +
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/text-level-semantics/the-a-element/a-type.historical.html b/third_party/blink/web_tests/external/wpt/html/semantics/text-level-semantics/the-a-element/a-type.historical.html new file mode 100644 index 0000000..a6ded3b4 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/semantics/text-level-semantics/the-a-element/a-type.historical.html
@@ -0,0 +1,22 @@ +<!DOCTYPE html> +<title>The type attribute is purely advisory</title> +<link rel="help" href="https://html.spec.whatwg.org/multipage/links.html#attr-hyperlink-type"> +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> + +<body> +<iframe name="i"></iframe> +<a id="link" href="resources/plain-text.unknown" target="i" type="text/html">click me</a> +<script> +async_test(t => { + let link = document.getElementById("link"); + link.click(); + + let iframe = document.querySelector("iframe"); + iframe.onload = t.step_func_done(() => { + assert_true(iframe.contentWindow.location.href.endsWith(".unknown")); + assert_equals(iframe.contentDocument.contentType, "text/plain"); + }); +}, "type attribute on anchor doesn't cause document to be loaded as HTML"); +</script> +</body>
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/text-level-semantics/the-a-element/resources/plain-text.unknown b/third_party/blink/web_tests/external/wpt/html/semantics/text-level-semantics/the-a-element/resources/plain-text.unknown new file mode 100644 index 0000000..efbf544a --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/semantics/text-level-semantics/the-a-element/resources/plain-text.unknown
@@ -0,0 +1 @@ +Hello World! \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/text-level-semantics/the-a-element/resources/plain-text.unknown.headers b/third_party/blink/web_tests/external/wpt/html/semantics/text-level-semantics/the-a-element/resources/plain-text.unknown.headers new file mode 100644 index 0000000..036ddf96 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/semantics/text-level-semantics/the-a-element/resources/plain-text.unknown.headers
@@ -0,0 +1 @@ +Content-Type: */*
diff --git a/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/spaces/space-like-003.html b/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/spaces/space-like-003.html index 5b693fb3..649dbe2 100644 --- a/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/spaces/space-like-003.html +++ b/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/spaces/space-like-003.html
@@ -90,7 +90,7 @@ <math> <mn>X</mn> <mrow> - <mi class="testedElement">X</mi> + <mi class="testedElement" mathvariant="normal">X</mi> <mo lspace="1em" rspace="0em">X</mo> </mrow> <mn>X</mn>
diff --git a/third_party/blink/web_tests/external/wpt/navigation-api/focus-reset/autofocus.html b/third_party/blink/web_tests/external/wpt/navigation-api/focus-reset/autofocus.html index 6044447..c40e2f6 100644 --- a/third_party/blink/web_tests/external/wpt/navigation-api/focus-reset/autofocus.html +++ b/third_party/blink/web_tests/external/wpt/navigation-api/focus-reset/autofocus.html
@@ -120,7 +120,6 @@ assert_equals(document.activeElement, decoy, "Focus stays on the initially-focused button during the transition"); decoy.disabled = true; - assert_equals(document.activeElement, document.body, "Disabling the initially-focused button temporarily resets focus to the body"); await finished; assert_equals(document.activeElement, autofocusTarget, "Focus moves to the second autofocused button after the transition");
diff --git a/third_party/blink/web_tests/external/wpt/secure-payment-confirmation/authentication-accepted.https.html b/third_party/blink/web_tests/external/wpt/secure-payment-confirmation/authentication-accepted.https.html index 4d8152b8..58b2510 100644 --- a/third_party/blink/web_tests/external/wpt/secure-payment-confirmation/authentication-accepted.https.html +++ b/third_party/blink/web_tests/external/wpt/secure-payment-confirmation/authentication-accepted.https.html
@@ -14,7 +14,7 @@ const kPayeeOrigin = 'https://merchant.com'; const kInstrumentDisplayName = 'Troycard'; -async function triggerSpc(t, instrumentDetails) { +async function triggerSpc(t, instrumentDetails, paymentEntitiesLogos) { const authenticator = await window.test_driver.add_virtual_authenticator( AUTHENTICATOR_OPTS); t.add_cleanup(() => { @@ -44,6 +44,10 @@ data.instrument.details = instrumentDetails; } + if (paymentEntitiesLogos !== undefined) { + data.paymentEntitiesLogos = paymentEntitiesLogos; + } + const request = new PaymentRequest([{ supportedMethods: 'secure-payment-confirmation', data }], PAYMENT_DETAILS); @@ -90,9 +94,17 @@ promise_test(async t => { const instrumentDetails = '***1234'; - const clientDataJSON = await triggerSpc(t, instrumentDetails); + const paymentEntityLogoLabel = 'Sync Network'; + const paymentEntitiesLogos = [{ + url: PAYMENT_ENTITY_LOGO_URL, + label: paymentEntityLogoLabel, + }]; + const clientDataJSON = await triggerSpc(t, instrumentDetails, paymentEntitiesLogos); // Payment-specific information. assert_equals(clientDataJSON.payment.instrument.details, instrumentDetails); + assert_equals(clientDataJSON.payment.paymentEntitiesLogos.length, 1); + assert_equals(clientDataJSON.payment.paymentEntitiesLogos[0].url, PAYMENT_ENTITY_LOGO_URL); + assert_equals(clientDataJSON.payment.paymentEntitiesLogos[0].label, paymentEntityLogoLabel); }, 'Successful SPC authentication - optional fields'); </script>
diff --git a/third_party/blink/web_tests/external/wpt/secure-payment-confirmation/authentication-invalid-payment-entity-logo.https-expected.txt b/third_party/blink/web_tests/external/wpt/secure-payment-confirmation/authentication-invalid-payment-entity-logo.https-expected.txt new file mode 100644 index 0000000..4a77d491 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/secure-payment-confirmation/authentication-invalid-payment-entity-logo.https-expected.txt
@@ -0,0 +1,5 @@ +This is a testharness.js-based test. +[FAIL] SPC authentication with a PaymentEntityLogo that cannot be downloaded. + promise_test: Unhandled rejection with value: object "TypeError: Cannot read properties of undefined (reading 'length')" +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/external/wpt/secure-payment-confirmation/authentication-invalid-payment-entity-logo.https.html b/third_party/blink/web_tests/external/wpt/secure-payment-confirmation/authentication-invalid-payment-entity-logo.https.html new file mode 100644 index 0000000..e229fb2e --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/secure-payment-confirmation/authentication-invalid-payment-entity-logo.https.html
@@ -0,0 +1,74 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>Test for the 'secure-payment-confirmation' payment method authentication - invalid payment entity logo</title> +<link rel="help" href="https://w3c.github.io/secure-payment-confirmation#sctn-steps-to-check-if-a-payment-can-be-made"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/testdriver.js"></script> +<script src="/resources/testdriver-vendor.js"></script> +<script src="utils.sub.js"></script> +<script> +'use strict'; + +promise_test(async t => { + const authenticator = await window.test_driver.add_virtual_authenticator( + AUTHENTICATOR_OPTS); + t.add_cleanup(() => { + return window.test_driver.remove_virtual_authenticator(authenticator); + }); + + await window.test_driver.set_spc_transaction_mode("autoAccept"); + t.add_cleanup(() => { + return window.test_driver.set_spc_transaction_mode("none"); + }); + + const credential = await createCredential(); + + const challenge = 'server challenge'; + const payeeOrigin = 'https://merchant.com'; + const displayName = 'Troycard ***1234'; + + const paymentEntity1Label = 'Payment Entity #1'; + const paymentEntity2Label = 'Payment Entity #2'; + + let request = new PaymentRequest([{ + supportedMethods: 'secure-payment-confirmation', + data: { + credentialIds: [credential.rawId], + challenge: Uint8Array.from(challenge, c => c.charCodeAt(0)), + payeeOrigin, + rpId: window.location.hostname, + timeout: 60000, + instrument: { + displayName, + icon: ICON_URL, + }, + paymentEntitiesLogos: [ + { + url: NONEXISTENT_PAYMENT_ENTITY_LOGO_URL, + label: paymentEntity1Label, + }, + { + url: PAYMENT_ENTITY_LOGO_URL, + label: paymentEntity2Label, + }, + ], + } + }], PAYMENT_DETAILS); + + await test_driver.bless('user activation'); + const responsePromise = request.show(); + const response = await responsePromise; + await response.complete('success'); + const cred = response.details; + const clientDataJSON = JSON.parse(arrayBufferToString(cred.response.clientDataJSON)); + + // Both PaymentEntityLogos should still be present, but the non-existent url + // should have been replaced by an empty string. + assert_equals(clientDataJSON.payment.paymentEntitiesLogos.length, 2); + assert_equals(clientDataJSON.payment.paymentEntitiesLogos[0].url, ''); + assert_equals(clientDataJSON.payment.paymentEntitiesLogos[0].label, paymentEntity1Label); + assert_equals(clientDataJSON.payment.paymentEntitiesLogos[1].url, PAYMENT_ENTITY_LOGO_URL); + assert_equals(clientDataJSON.payment.paymentEntitiesLogos[1].label, paymentEntity2Label); +}, 'SPC authentication with a PaymentEntityLogo that cannot be downloaded.'); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/secure-payment-confirmation/constructor-validate-payment-method-data.https-expected.txt b/third_party/blink/web_tests/external/wpt/secure-payment-confirmation/constructor-validate-payment-method-data.https-expected.txt index 0d94a62d..2b79dec2 100644 --- a/third_party/blink/web_tests/external/wpt/secure-payment-confirmation/constructor-validate-payment-method-data.https-expected.txt +++ b/third_party/blink/web_tests/external/wpt/secure-payment-confirmation/constructor-validate-payment-method-data.https-expected.txt
@@ -1,5 +1,11 @@ This is a testharness.js-based test. [FAIL] Empty instrument.details field throws exception. assert_throws_js: function "() => {\n new PaymentRequest([{\n supportedMethods: 'secure-payment-confirmation',\n data: {\n credentialIds: [Uint8Array.from('x', c => c.charCodeAt(0))],\n challenge: Uint8Array.from('x', c => c.charCodeAt(0)),\n payeeOrigin: window.location.origin,\n timeout: 60000,\n instrument: {\n displayName: 'X',\n icon: 'https://example.test/icon.png',\n // Details can be omitted, but if present cannot be empty.\n details: '',\n },\n rpId: 'relying-party.example',\n },\n }], details);\n }" did not throw +[FAIL] Empty url field in a PaymentEntityLogo throws exception. + assert_throws_js: function "() => {\n new PaymentRequest([{\n supportedMethods: 'secure-payment-confirmation',\n data: {\n credentialIds: [Uint8Array.from('x', c => c.charCodeAt(0))],\n challenge: Uint8Array.from('x', c => c.charCodeAt(0)),\n payeeOrigin: window.location.origin,\n timeout: 60000,\n instrument: {\n displayName: 'X',\n icon: 'https://example.test/icon.png',\n },\n rpId: 'relying-party.example',\n paymentEntitiesLogos: [{\n url: '',\n label: 'Payment Entity Label',\n }],\n },\n }], details);\n }" did not throw +[FAIL] Invalid url field in a PaymentEntityLogo throws exception. + assert_throws_js: function "() => {\n new PaymentRequest([{\n supportedMethods: 'secure-payment-confirmation',\n data: {\n credentialIds: [Uint8Array.from('x', c => c.charCodeAt(0))],\n challenge: Uint8Array.from('x', c => c.charCodeAt(0)),\n payeeOrigin: window.location.origin,\n timeout: 60000,\n instrument: {\n displayName: 'X',\n icon: 'https://example.test/icon.png',\n },\n rpId: 'relying-party.example',\n paymentEntitiesLogos: [{\n url: 'thisisnotaurl',\n label: 'Payment Entity Label',\n }],\n },\n }], details);\n }" did not throw +[FAIL] Empty logo field in a PaymentEntityLogo throws exception. + assert_throws_js: function "() => {\n new PaymentRequest([{\n supportedMethods: 'secure-payment-confirmation',\n data: {\n credentialIds: [Uint8Array.from('x', c => c.charCodeAt(0))],\n challenge: Uint8Array.from('x', c => c.charCodeAt(0)),\n payeeOrigin: window.location.origin,\n timeout: 60000,\n instrument: {\n displayName: 'X',\n icon: 'https://example.test/icon.png',\n },\n rpId: 'relying-party.example',\n paymentEntitiesLogos: [{\n url: 'https://example.test/logo.png',\n label: '',\n }],\n },\n }], details);\n }" did not throw Harness: the test ran to completion.
diff --git a/third_party/blink/web_tests/external/wpt/secure-payment-confirmation/constructor-validate-payment-method-data.https.html b/third_party/blink/web_tests/external/wpt/secure-payment-confirmation/constructor-validate-payment-method-data.https.html index ecf432b2..5d34f68f 100644 --- a/third_party/blink/web_tests/external/wpt/secure-payment-confirmation/constructor-validate-payment-method-data.https.html +++ b/third_party/blink/web_tests/external/wpt/secure-payment-confirmation/constructor-validate-payment-method-data.https.html
@@ -376,4 +376,91 @@ }], details); }); }, 'Non-HTTPS payee origin throws exception.'); + +test(() => { + new PaymentRequest([{ + supportedMethods: 'secure-payment-confirmation', + data: { + credentialIds: [Uint8Array.from('x', c => c.charCodeAt(0))], + challenge: Uint8Array.from('x', c => c.charCodeAt(0)), + payeeOrigin: window.location.origin, + timeout: 60000, + instrument: { + displayName: 'X', + icon: 'https://example.test/icon.png', + }, + rpId: 'relying-party.example', + paymentEntitiesLogos: [], + }, + }], details); +}, 'Empty paymentEntitiesLogo field is valid.'); + +test(() => { + assert_throws_js(TypeError, () => { + new PaymentRequest([{ + supportedMethods: 'secure-payment-confirmation', + data: { + credentialIds: [Uint8Array.from('x', c => c.charCodeAt(0))], + challenge: Uint8Array.from('x', c => c.charCodeAt(0)), + payeeOrigin: window.location.origin, + timeout: 60000, + instrument: { + displayName: 'X', + icon: 'https://example.test/icon.png', + }, + rpId: 'relying-party.example', + paymentEntitiesLogos: [{ + url: '', + label: 'Payment Entity Label', + }], + }, + }], details); + }); +}, 'Empty url field in a PaymentEntityLogo throws exception.'); + +test(() => { + assert_throws_js(TypeError, () => { + new PaymentRequest([{ + supportedMethods: 'secure-payment-confirmation', + data: { + credentialIds: [Uint8Array.from('x', c => c.charCodeAt(0))], + challenge: Uint8Array.from('x', c => c.charCodeAt(0)), + payeeOrigin: window.location.origin, + timeout: 60000, + instrument: { + displayName: 'X', + icon: 'https://example.test/icon.png', + }, + rpId: 'relying-party.example', + paymentEntitiesLogos: [{ + url: 'thisisnotaurl', + label: 'Payment Entity Label', + }], + }, + }], details); + }); +}, 'Invalid url field in a PaymentEntityLogo throws exception.'); + +test(() => { + assert_throws_js(TypeError, () => { + new PaymentRequest([{ + supportedMethods: 'secure-payment-confirmation', + data: { + credentialIds: [Uint8Array.from('x', c => c.charCodeAt(0))], + challenge: Uint8Array.from('x', c => c.charCodeAt(0)), + payeeOrigin: window.location.origin, + timeout: 60000, + instrument: { + displayName: 'X', + icon: 'https://example.test/icon.png', + }, + rpId: 'relying-party.example', + paymentEntitiesLogos: [{ + url: 'https://example.test/logo.png', + label: '', + }], + }, + }], details); + }); +}, 'Empty logo field in a PaymentEntityLogo throws exception.'); </script>
diff --git a/third_party/blink/web_tests/external/wpt/secure-payment-confirmation/sync-network-logo.png b/third_party/blink/web_tests/external/wpt/secure-payment-confirmation/sync-network-logo.png new file mode 100644 index 0000000..91212531 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/secure-payment-confirmation/sync-network-logo.png Binary files differ
diff --git a/third_party/blink/web_tests/external/wpt/secure-payment-confirmation/utils.sub.js b/third_party/blink/web_tests/external/wpt/secure-payment-confirmation/utils.sub.js index ab7407f..6d66a21 100644 --- a/third_party/blink/web_tests/external/wpt/secure-payment-confirmation/utils.sub.js +++ b/third_party/blink/web_tests/external/wpt/secure-payment-confirmation/utils.sub.js
@@ -15,6 +15,9 @@ const ICON_DATA_URL = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAUCAYAAADskT9PAAAAAXNSR0IArs4c6QAAA+lJREFUSEvtlmtQVGUYx3/n7I1dLgtSsIm4ss1EogM4Uanp6IeGqQ81Do0xECyWxKTkWAxDOkmCDYSOmUZjph8wyj7gTDT1oYnJC3ITYrSLkgMul1lCLsouugvs7tnd5pwJx6ZZ40NDfeg5H95z5rzzPv/n8v+/j2C1Wsubmpr26nQ6FQtoHo/Hn5mZWSmYTCbJ6XSqZmdnF9A96PV6jEajXzCbzcGhoaEFdT7nzGw28z+AkBmIioyguLCAXtsAX37zLcFg8B8vU8gSqFQiqSnLOXGkhkH7b+QV7USSJDRaDT6fhCAIqESRWY8HjSigFUU8gQAiAt5AAK1Wg0qlwu/34/X6lP06nVZZJZ+ET5KUYEICyFiVSumOIh6xWLjjcnHmQhtnW9rJ2fQ8Z1vbUKnUrExJpurAEfIS4ticEM9hm52Hw8M4OTRCbl4O6SnJ/HT1GsfrvyBx8UO8sa0Qg17HZ6e/or2z+/4ArNkvUJifTWR4BMNjo3R2/4hjcootuVncdk0jCkE6f+7hZt2nHEg2MyKIvHWlj/oUC7X2US6lpvP6ViujYzfJshbxZvGrvPjcMwwOj7J1Rym3Xa77AzAY9ByqKicjLZWyvdW0dHSxv3I3G9Y8wa+9NuobGhnp7+e75cswCAKbu69w3TXN92tXYdKoyR6+xa6DVQR9EiXl71K9p4xwg5491e9zrqX9bi+FLIFOp+N03VEWm+IpKC6hzzbAqU8+xGJOpKyyhjPNrcRpVfQ/u4HxGQ8Z57sQgMbVaayN1LP+hx62VVWSnLSU1o4uNq5bw8Xuy5S8vQ+P1/v3AIxRETTUHSM22khzRxefNzTy0f59+P0BNuUXMulwKo33cfqjFMQt4uWrNp56IJqC+BguuGbJar9Mbn4Or215iWAgiGPKyc5dFfT0Xv8Tk0JmQKNRU2TN5cnH0hHVao6fPMX2V/IZHZ+g9J0qhRGypRkjKU1K4OsJB9stS7jlclM7PEbzhIP1qx/n8HsVSmbOtV7kYO0xboxPzA+ATJfIiHCijVEIgojD6SR2UQwej1eJXvJLzMmCUaPGHwhiCtPi8PqwrFzBssQE0lNX8PTGdQwM2fng6AkmHVNc67PND4AoiiQtXYLBYFC4OzMzo/Da5Z5WgEAQr1dSKGqMivrj0CBut5uait2YHowlTKfD4bxDxf5DXPqlR9nj8/nmB0DepdFoFLGRHcvCISuhnE75W36XH7knRFFQQMqm1WgpLrQSYTBgH7nB+bYO+gftf3E878tIPlhxfM96bwhz8jwHQP4XE21UgHt9PtzT00iSP6SE/zduQ3kgmZqaUsl1Xki7O5D82yPZ7y210ZoMhOgBAAAAAElFTkSuQmCC'; const INVALID_ICON_DATA_URL = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAUCAYAAADskT9PAAAAAXNSR0IArs4c6QAAA+lJREFUSEvtlmtQVGUYx3/n7I1dLgtSsIm4ss1EogM4Uanp6IeGqQ81Do0xECyWxKTkWAxDOkmCDYSOmUZjph8wyj7gTDT1oYnJC3ITYrSLkgMul1lCLsouugvs7tnd5pwJx6ZZ40NDfeg5H95z5rzzPv/n8v+/j2C1Wsubmpr26nQ6FQtoHo/Hn5mZWSmYTCbJ6XSqZmdnF9A96PV6jEajXzCbzcGhoaEFdT7nzGw28z+AkBmIioyguLCAXtsAX37zLcFg8B8vU8gSqFQiqSnLOXGkhkH7b+QV7USSJDRaDT6fhCAIqESRWY8HjSigFUU8gQAiAt5AAK1Wg0qlwu/34/X6lP06nVZZJZ+ET5KUYEICyFiVSumOIh6xWLjjcnHmQhtnW9rJ2fQ8Z1vbUKnUrExJpurAEfIS4ticEM9hm52Hw8M4OTRCbl4O6SnJ/HT1GsfrvyBx8UO8sa0Qg17HZ6e/or2z+/4ArNkvUJifTWR4BMNjo3R2/4hjcootuVncdk0jCkE6f+7hZt2nHEg2MyKIvHWlj/oUC7X2US6lpvP6ViujYzfJshbxZvGrvPjcThisIsNonsenseG9Y8wa+9NuobGhnp7+e75cswCAKbu69w3TXN92tXYdKoyR6+xa6DVQR9EiXl71K9p4xwg5491e9zrqX9bi+FLIFOp+N03VEWm+IpKC6hzzbAqU8+xGJOpKyyhjPNrcRpVfQ/u4HxGQ8Z57sQgMbVaayN1LP+hx62VVWSnLSU1o4uNq5bw8Xuy5S8vQ+P1/v3AIxRETTUHSM22khzRxefNzTy0f59+P0BNuUXMulwKo33cfqjFMQt4uWrNp56IJqC+BguuGbJar9Mbn4Or215iWAgiGPKyc5dFfT0Xv8Tk0JmQKNRU2TN5cnH0hHVao6fPMX2V/IZHZ+g9J0qhRGypRkjKU1K4OsJB9stS7jlclM7PEbzhIP1qx/n8HsVSmbOtV7kYO0xboxPzA+ATJfIiHCijVEIgojD6SR2UQwej1eJXvJLzMmCUaPGHwhiCtPi8PqwrFzBssQE0lNX8PTGdQwM2fng6AkmHVNc67PND4AoiiQtXYLBYFC4OzMzo/Da5Z5WgEAQr1dSKGqMivrj0CBut5uait2YHowlTKfD4bxDxf5DXPqlR9nj8/nmB0DepdFoFLGRHcvCISuhnE75W36XH7knRFFQQMqm1WgpLrQSYTBgH7nB+bYO+gftf3E878tIPlhxfM96bwhz8jwHQP4XE21UgHt9PtzT00iSP6SE/zduQ3kgmZqaUsl1Xki7O5D82yPZ7y210ZoMhOgBAAAAAElFTkSuQmCC'; +const PAYMENT_ENTITY_LOGO_URL = 'https://{{hosts[][www]}}:{{ports[https][0]}}/secure-payment-confirmation/sync-network-logo.png'; +const NONEXISTENT_PAYMENT_ENTITY_LOGO_URL = 'https://{{hosts[][www]}}:{{ports[https][0]}}/secure-payment-confirmation/nonexistent.png'; + // Creates and returns a WebAuthn credential, optionally with the payment // extension set. //
diff --git a/third_party/blink/web_tests/external/wpt/soft-navigation-heuristics/smoke/tentative/late-url-change.html b/third_party/blink/web_tests/external/wpt/soft-navigation-heuristics/smoke/tentative/late-url-change.html new file mode 100644 index 0000000..fbd0465 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/soft-navigation-heuristics/smoke/tentative/late-url-change.html
@@ -0,0 +1,50 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/testdriver.js"></script> +<script src="/resources/testdriver-vendor.js"></script> +<script src="/soft-navigation-heuristics/resources/soft-navigation-test-helper.js"></script> + +<button id="navigateButton">Click here!</button> +<div id="content"></div> + +<script> + promise_test(async t => { + const URL = '/late-url-change'; + + navigateButton.addEventListener("click", async () => { + content.innerHTML = '<img src="/images/lcp-256x256.png" elementtiming="test-image"></img>'; + + const entries = await new Promise(resolve => { + new PerformanceObserver((list, observer) => { + resolve(list.getEntries()); + observer.disconnect(); + }).observe({type: 'element', buffered: true}); + }); + assert_equals( + entries.length, 1, 'Expected exactly one ElementTiming entry'); + assert_equals( + entries[0].identifier, 'test-image', 'Unexpected ElementTiming entry.'); + history.pushState({}, '', URL); + }, {once: true}); + + const softNavPromise = SoftNavigationTestHelper.getPerformanceEntries( + /*type=*/ "soft-navigation", + /*include_soft_navigation_observations=*/ false, + /*min_num_entries=*/ 1, + ); + + if (test_driver) { + test_driver.click(navigateButton); + } + + const helper = new SoftNavigationTestHelper(t); + const entries = await helper.withTimeoutMessage( + softNavPromise, "Soft navigation entry never arrived.", 3000); + assert_equals(entries.length, 1, 'Expected exactly one soft navigation.'); + assert_true( + entries[0].name.endsWith(URL), + 'Unexpected Soft Navigation URL.'); + }, 'Soft Navigation Detection supports setting URL after paint'); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/svg/geometry/svg-get-bounding-client-rect-in-non-rendered-elements-expected.txt b/third_party/blink/web_tests/external/wpt/svg/geometry/svg-get-bounding-client-rect-in-non-rendered-elements-expected.txt new file mode 100644 index 0000000..b74a8cd --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/svg/geometry/svg-get-bounding-client-rect-in-non-rendered-elements-expected.txt
@@ -0,0 +1,5 @@ +This is a testharness.js-based test. +[FAIL] Get Bounding Client Rect + assert_equals: g1 expected 10 but got 45 +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/external/wpt/svg/geometry/svg-get-bounding-client-rect-in-non-rendered-elements.html b/third_party/blink/web_tests/external/wpt/svg/geometry/svg-get-bounding-client-rect-in-non-rendered-elements.html index 41f3fb6..c45542d2 100644 --- a/third_party/blink/web_tests/external/wpt/svg/geometry/svg-get-bounding-client-rect-in-non-rendered-elements.html +++ b/third_party/blink/web_tests/external/wpt/svg/geometry/svg-get-bounding-client-rect-in-non-rendered-elements.html
@@ -22,6 +22,13 @@ <g> <rect id="rect6" width="10" height="10" /> </g> + <g id="g1"> + <rect x="5" y="5" width="10" height="10"/> + <g> + <!-- This rect has neither fill, nor stroke so has no bounds. --> + <rect x="20" y="20" width="30" height="30" fill="none"/> + </g> + </g> </svg> <script> let rect1 = document.getElementById("rect1"), @@ -30,7 +37,8 @@ rect4 = document.getElementById("rect4"); rect5 = document.getElementById("rect5"), rect6 = document.getElementById("rect6"), - symbol = document.getElementById("symbol"); + symbol = document.getElementById("symbol"), + g1 = document.getElementById("g1"); test(function () { assert_equals(rect1.getBoundingClientRect().width, 0, "rect1"); @@ -40,6 +48,7 @@ assert_equals(rect5.getBoundingClientRect().width, 0, "rect5"); assert_equals(rect6.getBoundingClientRect().width, 10, "rect6"); assert_equals(symbol.getBoundingClientRect().width, 0, "symbol"); + assert_equals(g1.getBoundingClientRect().width, 10, "g1"); assert_equals(rect1.getBoundingClientRect().height, 0, "rect1"); assert_equals(rect2.getBoundingClientRect().height, 0, "rect2"); @@ -48,5 +57,6 @@ assert_equals(rect5.getBoundingClientRect().height, 0, "rect5"); assert_equals(rect6.getBoundingClientRect().height, 10, "rect6"); assert_equals(symbol.getBoundingClientRect().height, 0, "symbol"); + assert_equals(g1.getBoundingClientRect().height, 10, "g1"); }, "Get Bounding Client Rect"); </script>
diff --git a/third_party/blink/web_tests/external/wpt/web-animations/timing-model/animations/setting-the-start-time-of-an-animation.html b/third_party/blink/web_tests/external/wpt/web-animations/timing-model/animations/setting-the-start-time-of-an-animation.html index fee3f1e..6dabf07 100644 --- a/third_party/blink/web_tests/external/wpt/web-animations/timing-model/animations/setting-the-start-time-of-an-animation.html +++ b/third_party/blink/web_tests/external/wpt/web-animations/timing-model/animations/setting-the-start-time-of-an-animation.html
@@ -325,5 +325,58 @@ }, 'Setting the start time on a reverse running animation updates the play ' + 'state'); +promise_test(async t => { + const make_animation = () => createDiv(t).animate(null, 100 * MS_PER_SEC); + + // Wait for a couple of page rendering updates to run and record the timeline time. + await waitForAnimationFrames(2); + const timelineTimeForFirstPageRenderingUpdate = document.timeline.currentTime; + + // Create a first animation that is created during the page rendering update. + // This animation should have its start time set to the current timeline time. + const animStartedDuringPageRenderingUpdate = make_animation(); + + // Wait for a new JS call frame and start another animation. This animation + // should have its start time set to the timeline time of the next page + // rendering update. + await new Promise(setTimeout); + const animStartedAfterTimeout = make_animation(); + + // Wait for another new JS call frame and start another animation. This + // animation, like the previous one, should have its start time set to + // the timeline time of the next page rendering update. + await new Promise(setTimeout); + const animStartedAfterAnotherTimeout = make_animation(); + + // Now wait until the next page rendering update and record the timeline time. + await waitForAnimationFrames(1); + const timelineTimeForSecondPageRenderingUpdate = document.timeline.currentTime; + + // Create an animation that is created during this second page rendering update. + // This animation should have its start time set to the new timeline time. + const animStartedDuringSecondPageRenderingUpdate = make_animation(); + + // All animations should be ready by the next animation frame. + await waitForAnimationFrames(1); + + const assert_start_time = (animation, expected, description) => { + assert_approx_equals(animation.startTime, expected, 0.0001, + `Start time of animation started ${description}`); + }; + + assert_start_time(animStartedDuringPageRenderingUpdate, + timelineTimeForFirstPageRenderingUpdate, + "during the first page rendering update"); + assert_start_time(animStartedAfterTimeout, + timelineTimeForSecondPageRenderingUpdate, + "after waiting for a new JS call frame"); + assert_start_time(animStartedAfterAnotherTimeout, + timelineTimeForSecondPageRenderingUpdate, + "after waiting for another new JS call frame"); + assert_start_time(animStartedDuringSecondPageRenderingUpdate, + timelineTimeForSecondPageRenderingUpdate, + "during the second page rendering update"); +}, 'Checking the start time of animations started at various times between two page rendering updates'); + </script> </body>
diff --git a/third_party/blink/web_tests/external/wpt/webdriver/tests/bidi/emulation/set_locale_override/contexts.py b/third_party/blink/web_tests/external/wpt/webdriver/tests/bidi/emulation/set_locale_override/contexts.py index 9cc395e4..3a3fa52 100644 --- a/third_party/blink/web_tests/external/wpt/webdriver/tests/bidi/emulation/set_locale_override/contexts.py +++ b/third_party/blink/web_tests/external/wpt/webdriver/tests/bidi/emulation/set_locale_override/contexts.py
@@ -47,3 +47,46 @@ # Assert the locale is restored to the initial one. assert await get_current_locale(new_tab) == default_locale assert await get_current_locale(new_context) == default_locale + + +@pytest.mark.parametrize("domain", ["", "alt"], ids=["same_origin", "cross_origin"]) +async def test_iframe( + bidi_session, + new_tab, + get_current_locale, + some_locale, + domain, + inline, + another_locale, +): + # Set locale override. + await bidi_session.emulation.set_locale_override( + contexts=[new_tab["context"]], locale=some_locale + ) + + # Assert locale emulated in the required context. + assert await get_current_locale(new_tab) == some_locale + + iframe_url = inline("<div id='in-iframe'>foo</div>", domain=domain) + page_url = inline(f"<iframe src='{iframe_url}'></iframe>") + + # Load the page with iframes. + await bidi_session.browsing_context.navigate( + context=new_tab["context"], + url=page_url, + wait="complete", + ) + + contexts = await bidi_session.browsing_context.get_tree(root=new_tab["context"]) + iframe = contexts[0]["children"][0] + + # Assert locale is emulated in the iframe context. + assert await get_current_locale(iframe) == some_locale + + # Set another locale override. + await bidi_session.emulation.set_locale_override( + contexts=[new_tab["context"]], locale=another_locale + ) + + # Assert locale is emulated in the iframe context. + assert await get_current_locale(iframe) == another_locale
diff --git a/third_party/catapult b/third_party/catapult index 5b2aa83..1addc95 160000 --- a/third_party/catapult +++ b/third_party/catapult
@@ -1 +1 @@ -Subproject commit 5b2aa8309e962decb237aefa7e3c39df5f38dfcf +Subproject commit 1addc95539476f179b854ae82c1ae6aa7bdffcbc
diff --git a/third_party/crashpad/crashpad/client/BUILD.gn b/third_party/crashpad/crashpad/client/BUILD.gn index a3ccc71..e57e0e0c 100644 --- a/third_party/crashpad/crashpad/client/BUILD.gn +++ b/third_party/crashpad/crashpad/client/BUILD.gn
@@ -221,8 +221,8 @@ "../compat", "../snapshot", "../test", + "../third_party/googletest", "../third_party/googletest:googlemock", - "../third_party/googletest:googletest", "../util", ]
diff --git a/third_party/crashpad/crashpad/handler/BUILD.gn b/third_party/crashpad/crashpad/handler/BUILD.gn index 99f47015..b3fc5d1 100644 --- a/third_party/crashpad/crashpad/handler/BUILD.gn +++ b/third_party/crashpad/crashpad/handler/BUILD.gn
@@ -142,7 +142,7 @@ "../snapshot", "../snapshot:test_support", "../test", - "../third_party/googletest:googletest", + "../third_party/googletest", "../third_party/mini_chromium:base", "../util", ] @@ -285,7 +285,7 @@ deps = [ "../client", "../test", - "../third_party/googletest:googletest", + "../third_party/googletest", "../third_party/mini_chromium:base", ] }
diff --git a/third_party/crashpad/crashpad/handler/win/wer/BUILD.gn b/third_party/crashpad/crashpad/handler/win/wer/BUILD.gn index 71c0126..084d209 100644 --- a/third_party/crashpad/crashpad/handler/win/wer/BUILD.gn +++ b/third_party/crashpad/crashpad/handler/win/wer/BUILD.gn
@@ -40,9 +40,9 @@ deps = [ ":crashpad_wer", ":crashpad_wer_handler", - "../../../client:client", - "../../../test:test", - "../../../third_party/googletest:googletest", + "../../../client", + "../../../test", + "../../../third_party/googletest", "../../../util:util_registration_protocol", ] }
diff --git a/third_party/crashpad/crashpad/minidump/BUILD.gn b/third_party/crashpad/crashpad/minidump/BUILD.gn index 6c4a1aa3..5b235aa 100644 --- a/third_party/crashpad/crashpad/minidump/BUILD.gn +++ b/third_party/crashpad/crashpad/minidump/BUILD.gn
@@ -138,7 +138,7 @@ "$mini_chromium_source_parent:base", "../snapshot:test_support", "../test", - "../third_party/googletest:googletest", + "../third_party/googletest", "../util", ] @@ -182,7 +182,7 @@ "$mini_chromium_source_parent:base", "../snapshot:test_support", "../test", - "../third_party/googletest:googletest", + "../third_party/googletest", "../util", ]
diff --git a/third_party/crashpad/crashpad/snapshot/BUILD.gn b/third_party/crashpad/crashpad/snapshot/BUILD.gn index 2ae944c..5ae9c10 100644 --- a/third_party/crashpad/crashpad/snapshot/BUILD.gn +++ b/third_party/crashpad/crashpad/snapshot/BUILD.gn
@@ -286,7 +286,7 @@ deps = [ ":snapshot", "$mini_chromium_source_parent:base", - "../util:util", + "../util", ] seed_corpus = "elf/elf_image_reader_fuzzer_corpus" } @@ -436,8 +436,8 @@ "../compat", "../minidump:format", "../test", + "../third_party/googletest", "../third_party/googletest:googlemock", - "../third_party/googletest:googletest", "../util", ]
diff --git a/third_party/crashpad/crashpad/test/BUILD.gn b/third_party/crashpad/crashpad/test/BUILD.gn index 20ad67e..5d35284 100644 --- a/third_party/crashpad/crashpad/test/BUILD.gn +++ b/third_party/crashpad/crashpad/test/BUILD.gn
@@ -135,7 +135,7 @@ deps = [ "$mini_chromium_source_parent:base", "../compat", - "../third_party/googletest:googletest", + "../third_party/googletest", "../util", ] @@ -214,8 +214,8 @@ ":test", "$mini_chromium_source_parent:base", "../compat", + "../third_party/googletest", "../third_party/googletest:googlemock", - "../third_party/googletest:googletest", "../util", ] @@ -249,8 +249,8 @@ ":test", "$mini_chromium_source_parent:base", "$mini_chromium_source_parent:base_test_support", + "../third_party/googletest", "../third_party/googletest:googlemock", - "../third_party/googletest:googletest", ] if (crashpad_is_android) { deps += [ "../util" ] @@ -269,7 +269,7 @@ ":test", "$mini_chromium_source_parent:base", "$mini_chromium_source_parent:base_test_support", - "../third_party/googletest:googletest", + "../third_party/googletest", ] if (crashpad_is_android) { deps += [ "../util" ]
diff --git a/third_party/crashpad/crashpad/test/ios/BUILD.gn b/third_party/crashpad/crashpad/test/ios/BUILD.gn index 6b1deca..ba4c5271 100644 --- a/third_party/crashpad/crashpad/test/ios/BUILD.gn +++ b/third_party/crashpad/crashpad/test/ios/BUILD.gn
@@ -58,7 +58,7 @@ ":google_test_runner_shared_headers", "../$mini_chromium_source_parent:base", "../../build:apple_enable_arc", - "../../third_party/googletest:googletest", + "../../third_party/googletest", ] frameworks = [ "UIKit.framework" ] }
diff --git a/third_party/crashpad/crashpad/util/BUILD.gn b/third_party/crashpad/crashpad/util/BUILD.gn index 31eb3d7..5c15d647 100644 --- a/third_party/crashpad/crashpad/util/BUILD.gn +++ b/third_party/crashpad/crashpad/util/BUILD.gn
@@ -939,8 +939,8 @@ "../client", "../compat", "../test", + "../third_party/googletest", "../third_party/googletest:googlemock", - "../third_party/googletest:googletest", "../third_party/zlib", ]
diff --git a/third_party/dawn b/third_party/dawn index fb4d361..564c7c9 160000 --- a/third_party/dawn +++ b/third_party/dawn
@@ -1 +1 @@ -Subproject commit fb4d36177feeea4831be2d0ba5d845149ac4f105 +Subproject commit 564c7c94378c0ef081277fe57ca14a2d9dc35476
diff --git a/third_party/freetype/BUILD.gn b/third_party/freetype/BUILD.gn index ee785cc..3762c0f 100644 --- a/third_party/freetype/BUILD.gn +++ b/third_party/freetype/BUILD.gn
@@ -67,7 +67,7 @@ } component("freetype") { - visibility = [ "//build/config/freetype:freetype" ] + visibility = [ "//build/config/freetype" ] defines = [] include_dirs = []
diff --git a/third_party/google-truth/BUILD.gn b/third_party/google-truth/BUILD.gn index bc47466..49269b2de 100644 --- a/third_party/google-truth/BUILD.gn +++ b/third_party/google-truth/BUILD.gn
@@ -80,6 +80,6 @@ "//third_party/android_deps:com_google_errorprone_error_prone_annotations_java", "//third_party/android_deps:guava_android_java", "//third_party/android_deps:org_checkerframework_checker_qual_java", - "//third_party/junit:junit", + "//third_party/junit", ] }
diff --git a/third_party/grpc/BUILD.gn b/third_party/grpc/BUILD.gn index b4672217..065d164 100644 --- a/third_party/grpc/BUILD.gn +++ b/third_party/grpc/BUILD.gn
@@ -1536,9 +1536,8 @@ "//third_party/abseil-cpp:absl", "//third_party/boringssl", "//third_party/protobuf:protobuf_lite", - "//third_party/re2:re2", + "//third_party/re2", "//third_party/zlib", - "//third_party/zlib:zlib", ] allow_circular_includes_from = [ ":upb_reflection_internal_lib" ] public_configs = [ ":grpc_config" ] @@ -2396,9 +2395,8 @@ "//third_party/abseil-cpp:absl", "//third_party/boringssl", "//third_party/protobuf:protobuf_lite", - "//third_party/re2:re2", + "//third_party/re2", "//third_party/zlib", - "//third_party/zlib:zlib", ] public_configs = [ ":grpc_config" ] configs += [ ":grpc_config_private" ] @@ -2504,9 +2502,8 @@ "//third_party/abseil-cpp:absl", "//third_party/boringssl", "//third_party/protobuf:protobuf_lite", - "//third_party/re2:re2", + "//third_party/re2", "//third_party/zlib", - "//third_party/zlib:zlib", ] public_configs = [ ":grpc_config" ] configs += [ ":grpc_config_private" ] @@ -2543,9 +2540,8 @@ "//third_party/abseil-cpp:absl", "//third_party/boringssl", "//third_party/protobuf:protobuf_lite", - "//third_party/re2:re2", + "//third_party/re2", "//third_party/zlib", - "//third_party/zlib:zlib", ] public_configs = [ ":grpc_config" ] configs += [ ":grpc_config_private" ] @@ -2567,9 +2563,8 @@ "//third_party/abseil-cpp:absl", "//third_party/boringssl", "//third_party/protobuf:protobuf_lite", - "//third_party/re2:re2", + "//third_party/re2", "//third_party/zlib", - "//third_party/zlib:zlib", ] public_configs = [ ":grpc_config" ] configs += [ ":grpc_config_private" ] @@ -2589,9 +2584,8 @@ "//third_party/abseil-cpp:absl", "//third_party/boringssl", "//third_party/protobuf:protobuf_lite", - "//third_party/re2:re2", + "//third_party/re2", "//third_party/zlib", - "//third_party/zlib:zlib", ] public_configs = [ ":grpc_config" ] configs += [ ":grpc_config_private" ]
diff --git a/third_party/hunspell/BUILD.gn b/third_party/hunspell/BUILD.gn index 533da3eb..0125a29 100644 --- a/third_party/hunspell/BUILD.gn +++ b/third_party/hunspell/BUILD.gn
@@ -122,7 +122,7 @@ ] deps = [ ":hunspell", - "//base:base", + "//base", ] # This is a dictionary for the fuzzer, not a spellcheck dictionary. @@ -136,7 +136,7 @@ ] deps = [ ":hunspell", - "//base:base", + "//base", ] # This is a dictionary for the fuzzer, not a spellcheck dictionary. @@ -147,7 +147,7 @@ sources = [ "fuzz/bdict_fuzzer.cc" ] deps = [ ":hunspell", - "//base:base", + "//base", ] seed_corpus = "fuzz/bdict_corpus" }
diff --git a/third_party/jni_zero/java_refs.h b/third_party/jni_zero/java_refs.h index 4b91ee6..b334639 100644 --- a/third_party/jni_zero/java_refs.h +++ b/third_party/jni_zero/java_refs.h
@@ -155,7 +155,7 @@ // Only defined for JavaRef<jobjectArray>. // You must pass the type of the array elements (usually jobject) as the // template parameter. - template <typename ElementType, + template <typename ElementType = jobject, typename T_ = T, typename = std::enable_if_t<std::is_same_v<T_, jobjectArray>>> JavaObjectArrayReader<ElementType> ReadElements() const {
diff --git a/third_party/libc++/src b/third_party/libc++/src index ed0f32e..be9dd89 160000 --- a/third_party/libc++/src +++ b/third_party/libc++/src
@@ -1 +1 @@ -Subproject commit ed0f32ee7a8d9481bfd26cfa6f5940b9f296f371 +Subproject commit be9dd89ffbfdf2b6cf6b9c5ec076d6adbc5d25a6
diff --git a/third_party/liburlpattern/BUILD.gn b/third_party/liburlpattern/BUILD.gn index f68354922..eaed1d6e 100644 --- a/third_party/liburlpattern/BUILD.gn +++ b/third_party/liburlpattern/BUILD.gn
@@ -12,9 +12,9 @@ component("liburlpattern") { defines = [ "IS_LIBURLPATTERN_IMPL" ] public_deps = [ - "//base:base", + "//base", "//third_party/abseil-cpp:absl", - "//third_party/icu:icu", + "//third_party/icu", ] configs += [ ":warnings" ] @@ -43,7 +43,7 @@ "//base/test:run_all_unittests", "//testing/gtest", "//third_party/abseil-cpp:absl", - "//third_party/icu:icu", + "//third_party/icu", ] # Note, also update the local modifications in README.chromium.
diff --git a/third_party/libwebp/BUILD.gn b/third_party/libwebp/BUILD.gn index 6c577df3..003bc93 100644 --- a/third_party/libwebp/BUILD.gn +++ b/third_party/libwebp/BUILD.gn
@@ -759,7 +759,7 @@ deps = [ ":libwebp_dsp_headers", ":libwebp_webp", - "//third_party/fuzztest:fuzztest", + "//third_party/fuzztest", ] } @@ -769,7 +769,7 @@ ":libwebp", ":libwebp_fuzz_utils", ":libwebp_webp", - "//third_party/fuzztest:fuzztest", + "//third_party/fuzztest", "//third_party/fuzztest:fuzztest_gtest_main", ] defines = [ "WEBP_MAX_IMAGE_SIZE=838860800" ] @@ -784,7 +784,7 @@ ":libwebp_fuzz_utils", ":libwebp_utils", ":libwebp_webp", - "//third_party/fuzztest:fuzztest", + "//third_party/fuzztest", "//third_party/fuzztest:fuzztest_gtest_main", ] defines = [ "WEBP_MAX_IMAGE_SIZE=838860800" ] @@ -801,7 +801,7 @@ ":libwebp_fuzz_utils", ":libwebp_utils", ":libwebp_webp", - "//third_party/fuzztest:fuzztest", + "//third_party/fuzztest", "//third_party/fuzztest:fuzztest_gtest_main", ] defines = [ "WEBP_MAX_IMAGE_SIZE=838860800" ] @@ -814,7 +814,7 @@ ":libwebp", ":libwebp_fuzz_utils", ":libwebp_webp", - "//third_party/fuzztest:fuzztest", + "//third_party/fuzztest", "//third_party/fuzztest:fuzztest_gtest_main", ] defines = [ "WEBP_MAX_IMAGE_SIZE=838860800" ] @@ -828,7 +828,7 @@ ":libwebp_dsp_headers", ":libwebp_fuzz_utils", ":libwebp_webp", - "//third_party/fuzztest:fuzztest", + "//third_party/fuzztest", "//third_party/fuzztest:fuzztest_gtest_main", ] defines = [ "WEBP_MAX_IMAGE_SIZE=838860800" ] @@ -842,7 +842,7 @@ ":libwebp_dsp_headers", ":libwebp_fuzz_utils", ":libwebp_webp", - "//third_party/fuzztest:fuzztest", + "//third_party/fuzztest", "//third_party/fuzztest:fuzztest_gtest_main", ] defines = [ "WEBP_MAX_IMAGE_SIZE=838860800" ] @@ -857,7 +857,7 @@ ":libwebp_fuzz_utils", ":libwebp_utils", ":libwebp_webp", - "//third_party/fuzztest:fuzztest", + "//third_party/fuzztest", "//third_party/fuzztest:fuzztest_gtest_main", ] configs += [ ":libwebp_config" ]
diff --git a/third_party/llvm-libc/BUILD.gn b/third_party/llvm-libc/BUILD.gn index 91028fd..53fd4104 100644 --- a/third_party/llvm-libc/BUILD.gn +++ b/third_party/llvm-libc/BUILD.gn
@@ -10,7 +10,7 @@ group("llvm-libc-shared") { # llvm-libc is only used as a dependency of libc++. - visibility = [ "//buildtools/third_party/libc++:libc++" ] + visibility = [ "//buildtools/third_party/libc++" ] public_configs = [ ":config" ] }
diff --git a/third_party/llvm-libc/src b/third_party/llvm-libc/src index 73cbf2b1..ebfb379 160000 --- a/third_party/llvm-libc/src +++ b/third_party/llvm-libc/src
@@ -1 +1 @@ -Subproject commit 73cbf2b1662754e29ac2698830b7952c80f22b62 +Subproject commit ebfb379c5464568cd3961cdf60e55dee9f512098
diff --git a/third_party/lzma_sdk/C/Util/SfxSetup/BUILD.gn b/third_party/lzma_sdk/C/Util/SfxSetup/BUILD.gn index b360426..f7ed8ef 100644 --- a/third_party/lzma_sdk/C/Util/SfxSetup/BUILD.gn +++ b/third_party/lzma_sdk/C/Util/SfxSetup/BUILD.gn
@@ -9,5 +9,5 @@ ".", "../..", ] - public_deps = [ "//third_party/lzma_sdk:lzma_sdk" ] + public_deps = [ "//third_party/lzma_sdk" ] }
diff --git a/third_party/mockito/BUILD.gn b/third_party/mockito/BUILD.gn index 607d37c..9beefdb 100644 --- a/third_party/mockito/BUILD.gn +++ b/third_party/mockito/BUILD.gn
@@ -39,7 +39,7 @@ # earlier in the classpath. "//third_party/android_deps:org_mockito_mockito_android_java", "//third_party/android_deps:org_mockito_mockito_core_java", - "//third_party/junit:junit", + "//third_party/junit", ] sources = [ "local/src/main/java/org/mockito/internal/junit/ExceptionFactory.java",
diff --git a/third_party/mutter/BUILD.gn b/third_party/mutter/BUILD.gn index ccb00c7..71364ca 100644 --- a/third_party/mutter/BUILD.gn +++ b/third_party/mutter/BUILD.gn
@@ -206,7 +206,7 @@ public_configs = [ ":mtk_public_config" ] public_deps = [ - "//third_party/glib:glib", + "//third_party/glib", "//third_party/glib:gobject", ] }
diff --git a/third_party/nearby/BUILD.gn b/third_party/nearby/BUILD.gn index 840fc4a..e3790616 100644 --- a/third_party/nearby/BUILD.gn +++ b/third_party/nearby/BUILD.gn
@@ -539,7 +539,7 @@ ":platform_base_logging", ":platform_public_types", "//third_party/abseil-cpp:absl", - "//third_party/boringssl:boringssl", + "//third_party/boringssl", ] configs -= [ "//build/config/compiler:chromium_code" ] configs += [ "//build/config/compiler:no_chromium_code" ] @@ -589,9 +589,9 @@ ] public_deps = [ ":platform_base_logging", - "//base:base", + "//base", "//third_party/abseil-cpp:absl", - "//third_party/boringssl:boringssl", + "//third_party/boringssl", ] configs -= [ "//build/config/compiler:chromium_code" ] configs += [ "//build/config/compiler:no_chromium_code" ] @@ -742,7 +742,7 @@ public_deps = [ ":platform_base", ":platform_impl_crypto", - "//crypto:crypto", + "//crypto", "//third_party/abseil-cpp:absl", ] configs -= [ "//build/config/compiler:chromium_code" ] @@ -832,7 +832,7 @@ public_deps = [ ":platform_base", "//third_party/abseil-cpp:absl", - "//third_party/boringssl:boringssl", + "//third_party/boringssl", ] configs -= [ "//build/config/compiler:chromium_code" ] configs += [ "//build/config/compiler:no_chromium_code" ] @@ -868,7 +868,7 @@ public_deps = [ ":platform_api_platform", ":platform_api_types", - "//base:base", + "//base", ] configs -= [ "//build/config/compiler:chromium_code" ] configs += [ "//build/config/compiler:no_chromium_code" ] @@ -1007,7 +1007,7 @@ ":platform_base_util", ":platform_mutex", ":platform_public_logging", - "//crypto:crypto", + "//crypto", "//third_party/abseil-cpp:absl", ] configs -= [ "//build/config/compiler:chromium_code" ] @@ -1218,7 +1218,7 @@ ":presence_mediums", ":presence_types", "//third_party/abseil-cpp:absl", - "//third_party/boringssl:boringssl", + "//third_party/boringssl", ] configs -= [ "//build/config/compiler:chromium_code" ] configs += [ "//build/config/compiler:no_chromium_code" ]
diff --git a/third_party/netty-tcnative/BUILD.gn b/third_party/netty-tcnative/BUILD.gn index 883ee5b..0dc0b21 100644 --- a/third_party/netty-tcnative/BUILD.gn +++ b/third_party/netty-tcnative/BUILD.gn
@@ -27,7 +27,7 @@ configs -= [ "//build/config/android:hide_all_but_jni_onload" ] deps = [ "//third_party/apache-portable-runtime:apr", - "//third_party/boringssl:boringssl", + "//third_party/boringssl", ] }
diff --git a/third_party/perfetto b/third_party/perfetto index 9231d0a..83bcbbb 160000 --- a/third_party/perfetto +++ b/third_party/perfetto
@@ -1 +1 @@ -Subproject commit 9231d0a42f8fc75aa3ba973269f3ee9a0c195b95 +Subproject commit 83bcbbbf67ed17934ddd3b667ed19c120c9ed504
diff --git a/third_party/polymer/v3_0/components-chromium/iron-a11y-keys/BUILD.gn b/third_party/polymer/v3_0/components-chromium/iron-a11y-keys/BUILD.gn index 809696a8..c77990e 100644 --- a/third_party/polymer/v3_0/components-chromium/iron-a11y-keys/BUILD.gn +++ b/third_party/polymer/v3_0/components-chromium/iron-a11y-keys/BUILD.gn
@@ -8,7 +8,7 @@ js_library("iron-a11y-keys") { deps = [ - "../iron-a11y-keys-behavior:iron-a11y-keys-behavior", + "../iron-a11y-keys-behavior", "../polymer:polymer_bundled", ] }
diff --git a/third_party/polymer/v3_0/components-chromium/iron-collapse/BUILD.gn b/third_party/polymer/v3_0/components-chromium/iron-collapse/BUILD.gn index 6c372785..ac3e997 100644 --- a/third_party/polymer/v3_0/components-chromium/iron-collapse/BUILD.gn +++ b/third_party/polymer/v3_0/components-chromium/iron-collapse/BUILD.gn
@@ -8,7 +8,7 @@ js_library("iron-collapse") { deps = [ - "../iron-resizable-behavior:iron-resizable-behavior", + "../iron-resizable-behavior", "../polymer:polymer_bundled", ] }
diff --git a/third_party/polymer/v3_0/components-chromium/iron-dropdown/BUILD.gn b/third_party/polymer/v3_0/components-chromium/iron-dropdown/BUILD.gn index a55520a..fee0db8a 100644 --- a/third_party/polymer/v3_0/components-chromium/iron-dropdown/BUILD.gn +++ b/third_party/polymer/v3_0/components-chromium/iron-dropdown/BUILD.gn
@@ -8,9 +8,9 @@ js_library("iron-dropdown") { deps = [ - "../iron-a11y-keys-behavior:iron-a11y-keys-behavior", + "../iron-a11y-keys-behavior", "../iron-behaviors:iron-control-state", - "../iron-overlay-behavior:iron-overlay-behavior", + "../iron-overlay-behavior", "../neon-animation:neon-animation-runner-behavior", "../polymer:polymer_bundled", ]
diff --git a/third_party/polymer/v3_0/components-chromium/iron-icon/BUILD.gn b/third_party/polymer/v3_0/components-chromium/iron-icon/BUILD.gn index b473919..d060f5d 100644 --- a/third_party/polymer/v3_0/components-chromium/iron-icon/BUILD.gn +++ b/third_party/polymer/v3_0/components-chromium/iron-icon/BUILD.gn
@@ -8,7 +8,7 @@ js_library("iron-icon") { deps = [ - "../iron-meta:iron-meta", + "../iron-meta", "../polymer:polymer_bundled", ] }
diff --git a/third_party/polymer/v3_0/components-chromium/iron-iconset-svg/BUILD.gn b/third_party/polymer/v3_0/components-chromium/iron-iconset-svg/BUILD.gn index 2a489069..b3a9155f 100644 --- a/third_party/polymer/v3_0/components-chromium/iron-iconset-svg/BUILD.gn +++ b/third_party/polymer/v3_0/components-chromium/iron-iconset-svg/BUILD.gn
@@ -8,7 +8,7 @@ js_library("iron-iconset-svg") { deps = [ - "../iron-meta:iron-meta", + "../iron-meta", "../polymer:polymer_bundled", ] }
diff --git a/third_party/polymer/v3_0/components-chromium/iron-list/BUILD.gn b/third_party/polymer/v3_0/components-chromium/iron-list/BUILD.gn index 6309941a2..79dc53e 100644 --- a/third_party/polymer/v3_0/components-chromium/iron-list/BUILD.gn +++ b/third_party/polymer/v3_0/components-chromium/iron-list/BUILD.gn
@@ -8,9 +8,9 @@ js_library("iron-list") { deps = [ - "../iron-a11y-keys-behavior:iron-a11y-keys-behavior", - "../iron-resizable-behavior:iron-resizable-behavior", - "../iron-scroll-target-behavior:iron-scroll-target-behavior", + "../iron-a11y-keys-behavior", + "../iron-resizable-behavior", + "../iron-scroll-target-behavior", "../polymer:polymer_bundled", ] }
diff --git a/third_party/polymer/v3_0/components-chromium/iron-overlay-behavior/BUILD.gn b/third_party/polymer/v3_0/components-chromium/iron-overlay-behavior/BUILD.gn index fc21821..51f03364 100644 --- a/third_party/polymer/v3_0/components-chromium/iron-overlay-behavior/BUILD.gn +++ b/third_party/polymer/v3_0/components-chromium/iron-overlay-behavior/BUILD.gn
@@ -19,8 +19,8 @@ ".:iron-focusables-helper", ".:iron-overlay-manager", ".:iron-scroll-manager", - "../iron-fit-behavior:iron-fit-behavior", - "../iron-resizable-behavior:iron-resizable-behavior", + "../iron-fit-behavior", + "../iron-resizable-behavior", "../polymer:polymer_bundled", ] } @@ -28,7 +28,7 @@ js_library("iron-overlay-manager") { deps = [ ".:iron-overlay-backdrop", - "../iron-a11y-keys-behavior:iron-a11y-keys-behavior", + "../iron-a11y-keys-behavior", "../polymer:polymer_bundled", ] }
diff --git a/third_party/polymer/v3_0/components-chromium/iron-pages/BUILD.gn b/third_party/polymer/v3_0/components-chromium/iron-pages/BUILD.gn index 01e9de66..a77e9e5 100644 --- a/third_party/polymer/v3_0/components-chromium/iron-pages/BUILD.gn +++ b/third_party/polymer/v3_0/components-chromium/iron-pages/BUILD.gn
@@ -8,7 +8,7 @@ js_library("iron-pages") { deps = [ - "../iron-resizable-behavior:iron-resizable-behavior", + "../iron-resizable-behavior", "../iron-selector:iron-selectable", "../polymer:polymer_bundled", ]
diff --git a/third_party/polymer/v3_0/components-chromium/iron-scroll-threshold/BUILD.gn b/third_party/polymer/v3_0/components-chromium/iron-scroll-threshold/BUILD.gn index 1a86799..f5c7c6d 100644 --- a/third_party/polymer/v3_0/components-chromium/iron-scroll-threshold/BUILD.gn +++ b/third_party/polymer/v3_0/components-chromium/iron-scroll-threshold/BUILD.gn
@@ -8,7 +8,7 @@ js_library("iron-scroll-threshold") { deps = [ - "../iron-scroll-target-behavior:iron-scroll-target-behavior", + "../iron-scroll-target-behavior", "../polymer:polymer_bundled", ] }
diff --git a/third_party/polymer/v3_0/components-chromium/neon-animation/BUILD.gn b/third_party/polymer/v3_0/components-chromium/neon-animation/BUILD.gn index a387a58..723a197cb 100644 --- a/third_party/polymer/v3_0/components-chromium/neon-animation/BUILD.gn +++ b/third_party/polymer/v3_0/components-chromium/neon-animation/BUILD.gn
@@ -9,7 +9,7 @@ js_library("neon-animatable") { deps = [ ".:neon-animatable-behavior", - "../iron-resizable-behavior:iron-resizable-behavior", + "../iron-resizable-behavior", "../polymer:polymer_bundled", ] } @@ -21,7 +21,7 @@ js_library("neon-animated-pages") { deps = [ ".:neon-animation-runner-behavior", - "../iron-resizable-behavior:iron-resizable-behavior", + "../iron-resizable-behavior", "../iron-selector:iron-selectable", "../polymer:polymer_bundled", ]
diff --git a/third_party/polymer/v3_0/components-chromium/paper-behaviors/BUILD.gn b/third_party/polymer/v3_0/components-chromium/paper-behaviors/BUILD.gn index 6e8bfcf..77f82a5 100644 --- a/third_party/polymer/v3_0/components-chromium/paper-behaviors/BUILD.gn +++ b/third_party/polymer/v3_0/components-chromium/paper-behaviors/BUILD.gn
@@ -8,7 +8,7 @@ js_library("paper-ripple-mixin") { deps = [ - "../paper-ripple:paper-ripple", + "../paper-ripple", "../polymer:polymer_bundled", ] }
diff --git a/third_party/polymer/v3_0/components-chromium/paper-progress/BUILD.gn b/third_party/polymer/v3_0/components-chromium/paper-progress/BUILD.gn index 2f16584..07a675c 100644 --- a/third_party/polymer/v3_0/components-chromium/paper-progress/BUILD.gn +++ b/third_party/polymer/v3_0/components-chromium/paper-progress/BUILD.gn
@@ -8,7 +8,7 @@ js_library("paper-progress") { deps = [ - "../iron-range-behavior:iron-range-behavior", + "../iron-range-behavior", "../polymer:polymer_bundled", ] }
diff --git a/third_party/polymer/v3_0/components-chromium/paper-ripple/BUILD.gn b/third_party/polymer/v3_0/components-chromium/paper-ripple/BUILD.gn index 4119f96a..4834584c 100644 --- a/third_party/polymer/v3_0/components-chromium/paper-ripple/BUILD.gn +++ b/third_party/polymer/v3_0/components-chromium/paper-ripple/BUILD.gn
@@ -8,7 +8,7 @@ js_library("paper-ripple") { deps = [ - "../iron-a11y-keys-behavior:iron-a11y-keys-behavior", + "../iron-a11y-keys-behavior", "../polymer:polymer_bundled", ] }
diff --git a/third_party/private_membership/BUILD.gn b/third_party/private_membership/BUILD.gn index 5fdbfe8..bd0c9020 100644 --- a/third_party/private_membership/BUILD.gn +++ b/third_party/private_membership/BUILD.gn
@@ -158,7 +158,7 @@ public_deps = [ ":private_membership", ":private_membership_proto", - "//testing/gmock:gmock", + "//testing/gmock", "//testing/gtest:gtest_main", "//third_party/shell-encryption:shell_encryption_test_library", ]
diff --git a/third_party/puffin/BUILD.gn b/third_party/puffin/BUILD.gn index 8553b84..1a3ca305 100644 --- a/third_party/puffin/BUILD.gn +++ b/third_party/puffin/BUILD.gn
@@ -120,6 +120,6 @@ ":libpuffdiff", ":libpuffpatch", "//base", - "//testing/gtest:gtest", + "//testing/gtest", ] }
diff --git a/third_party/shell-encryption/BUILD.gn b/third_party/shell-encryption/BUILD.gn index d63ebe38..5ad10cf 100644 --- a/third_party/shell-encryption/BUILD.gn +++ b/third_party/shell-encryption/BUILD.gn
@@ -106,9 +106,9 @@ ] public_deps = [ ":serialization_proto", - "//base:base", + "//base", "//third_party/abseil-cpp:absl", - "//third_party/boringssl:boringssl", + "//third_party/boringssl", "//third_party/protobuf:protobuf_lite", ] } @@ -138,8 +138,8 @@ ":coefficient_polynomial_proto", ":serialization_proto", ":shell_encryption", - "//testing/gmock:gmock", - "//testing/gtest:gtest", + "//testing/gmock", + "//testing/gtest", ] }
diff --git a/third_party/skia b/third_party/skia index 768ace3..c15b236 160000 --- a/third_party/skia +++ b/third_party/skia
@@ -1 +1 @@ -Subproject commit 768ace3fd14422db1cb326e1abc69f51efe2d74a +Subproject commit c15b236c12edeb2ad43d650d6e0df5a4fec068ab
diff --git a/third_party/wayland/BUILD.gn b/third_party/wayland/BUILD.gn index bce9108..d2a86c8 100644 --- a/third_party/wayland/BUILD.gn +++ b/third_party/wayland/BUILD.gn
@@ -294,7 +294,7 @@ deps = [ ":wayland_util", - "//third_party/expat:expat", + "//third_party/expat", ] configs -= [ "//build/config/compiler:chromium_code" ]
diff --git a/third_party/webrtc_overrides/BUILD.gn b/third_party/webrtc_overrides/BUILD.gn index 4b00340..d692a91 100644 --- a/third_party/webrtc_overrides/BUILD.gn +++ b/third_party/webrtc_overrides/BUILD.gn
@@ -67,7 +67,7 @@ "//third_party/webrtc/api/environment:environment_factory", "//third_party/webrtc/api/metronome", "//third_party/webrtc/api/rtc_event_log:rtc_event_log_factory", - "//third_party/webrtc/api/task_queue:task_queue", + "//third_party/webrtc/api/task_queue", "//third_party/webrtc/api/transport:ecn_marking", "//third_party/webrtc/api/transport:enums", "//third_party/webrtc/api/transport:field_trial_based_config", @@ -90,7 +90,6 @@ "//third_party/webrtc/api/video_codecs:video_codecs_api", "//third_party/webrtc/call:simulated_network", "//third_party/webrtc/common_video", - "//third_party/webrtc/common_video:common_video", "//third_party/webrtc/media:codec", "//third_party/webrtc/media:media_channel", "//third_party/webrtc/media:media_constants", @@ -106,7 +105,6 @@ "//third_party/webrtc/modules/audio_processing:api", "//third_party/webrtc/modules/audio_processing:audio_processing_statistics", "//third_party/webrtc/modules/audio_processing/aec_dump", - "//third_party/webrtc/modules/audio_processing/aec_dump:aec_dump", "//third_party/webrtc/modules/desktop_capture", "//third_party/webrtc/modules/desktop_capture:primitives", "//third_party/webrtc/modules/video_coding:video_codec_interface", @@ -162,7 +160,6 @@ "//third_party/webrtc/rtc_base/network:received_packet", "//third_party/webrtc/rtc_base/system:rtc_export", "//third_party/webrtc/rtc_base/third_party/sigslot", - "//third_party/webrtc/rtc_base/third_party/sigslot:sigslot", "//third_party/webrtc/stats", "//third_party/webrtc/stats:rtc_stats", "//third_party/webrtc/stats:rtc_stats_test_utils", @@ -316,7 +313,7 @@ deps = [ ":webrtc_component", "//base/test:test_support", - "//testing/gtest:gtest", + "//testing/gtest", ] } @@ -334,7 +331,7 @@ ":webrtc_component", "//base", "//base/test:test_support", - "//testing/gtest:gtest", + "//testing/gtest", ] }
diff --git a/tools/json_schema_compiler/idl_schema.py b/tools/json_schema_compiler/idl_schema.py index 51a3624..eb998c99 100755 --- a/tools/json_schema_compiler/idl_schema.py +++ b/tools/json_schema_compiler/idl_schema.py
@@ -420,9 +420,8 @@ 'type': 'string', 'enum': enum } - for property_name in ['cpp_enum_prefix_override', 'nodoc']: - if self.node.GetProperty(property_name): - result[property_name] = self.node.GetProperty(property_name) + if self.node.GetProperty('nodoc'): + result['nodoc'] = self.node.GetProperty('nodoc') if self.node.GetProperty('deprecated'): result['deprecated'] = self.node.GetProperty('deprecated') return result
diff --git a/tools/json_schema_compiler/model.py b/tools/json_schema_compiler/model.py index 9fc2ac8..6e7e0e5d 100644 --- a/tools/json_schema_compiler/model.py +++ b/tools/json_schema_compiler/model.py
@@ -258,7 +258,6 @@ 'See crbug.com/472279' % (name, namespace.name)) self.property_type = PropertyType.ENUM self.enum_values = [EnumValue(value, namespace) for value in json['enum']] - self.cpp_enum_prefix_override = json.get('cpp_enum_prefix_override', None) elif json_type == 'any': self.property_type = PropertyType.ANY elif json_type == 'binary':
diff --git a/tools/mac/icons/compile_car.py b/tools/mac/icons/compile_car.py index 5dd340c..e2ff598 100755 --- a/tools/mac/icons/compile_car.py +++ b/tools/mac/icons/compile_car.py
@@ -45,7 +45,7 @@ _REQUIRED_OS_VERSION = _split_version('15.5') -_REQUIRED_ACTOOL_VERSION = _split_version('16.4') +_REQUIRED_ACTOOL_VERSION = _split_version('26.0') def _verify_os_version() -> None: @@ -138,11 +138,37 @@ source_dir = path.joinpath(os.pardir) command = [ - 'xcrun', 'actool', '--output-format=xml1', '--notices', - '--warnings', '--errors', '--platform=macosx', - '--target-device=mac', '--app-icon=AppIcon', + # The binary. + 'xcrun', + 'actool', + + # Output and error handling. + '--output-format=xml1', + '--notices', + '--warnings', + '--errors', + + # Platform. + '--platform=macosx', + '--target-device=mac', + + # Correctness. This command-line argument is undocumented. It forces + # `actool` aka `ibtool` to use bundled versions of the asset catalog + # frameworks so that it generates consistent results no matter what + # OS release it is run on. Xcode 26+ includes this when invoking + # `actool`; see various copies of the `AssetCatalogCompiler.xcspec` + # file found in various places inside the Xcode package. + '--lightweight-asset-runtime-mode=enabled', + + # Target information. + '--app-icon=AppIcon', f'--minimum-deployment-target={min_deployment_target}', - f'--output-partial-info-plist={tmp_plist}', f'--compile={tmp_dir}', + + # Where to place the outputs. + f'--output-partial-info-plist={tmp_plist}', + f'--compile={tmp_dir}', + + # What to compile. path ] if verbose:
diff --git a/tools/metrics/histograms/metadata/extensions/histograms.xml b/tools/metrics/histograms/metadata/extensions/histograms.xml index 7432acdd..0479c93 100644 --- a/tools/metrics/histograms/metadata/extensions/histograms.xml +++ b/tools/metrics/histograms/metadata/extensions/histograms.xml
@@ -328,21 +328,6 @@ </summary> </histogram> -<histogram name="Extensions.BackgroundPageType" - enum="ExtensionBackgroundPageType" expires_after="2023-07-07"> - <owner>rdevlin.cronin@chromium.org</owner> - <owner>extensions-core@chromium.org</owner> - <summary> - The type (if any) of background page the extension has. Recorded for - installed extensions on profile open. - - Histogram is in the process of being removed in favor of its incremented - version that emits only on profile open for "user" profiles - (profiles where people can install extensions, specifically profiles that - can have non-component extensions installed). - </summary> -</histogram> - <histogram name="Extensions.BackgroundPageType2" enum="ExtensionBackgroundPageType" expires_after="never"> <!-- expires-never: Used for monitoring user extension usage. --> @@ -743,22 +728,6 @@ </summary> </histogram> -<histogram name="Extensions.CorruptExtensionTotalDisables" units="units" - expires_after="2023-07-07"> - <owner>jlulejian@chromium.org</owner> - <owner>extensions-core@chromium.org</owner> - <summary> - Logged once on profile open, this is the value of a counter that is - incremented anytime we disable a corrupted extension because its content - didn't match an expected content hash. - - Histogram is in the process of being removed in favor of its incremented - version that emits only on profile open for "user" profiles - (profiles where people can install extensions, specifically profiles that - can have non-component extensions installed). - </summary> -</histogram> - <histogram name="Extensions.CorruptExtensionTotalDisables2" units="units" expires_after="never"> <!-- expires-never: Used for monitoring corrupt extensions. --> @@ -1462,18 +1431,6 @@ </summary> </histogram> -<histogram name="Extensions.Disabled" units="units" expires_after="2023-07-07"> - <owner>rdevlin.cronin@chromium.org</owner> - <summary> - The number of extensions that are disabled at browser profile open. - - Histogram is in the process of being removed in favor of its incremented - version that emits only on profile open for "user" profiles - (profiles where people can install extensions, specifically profiles that - can have non-component extensions installed). - </summary> -</histogram> - <histogram name="Extensions.Disabled2" units="units" expires_after="never"> <!-- expires-never: Used for monitoring user extension usage. --> @@ -1486,20 +1443,6 @@ </summary> </histogram> -<histogram name="Extensions.DisabledForPermissions" units="units" - expires_after="2023-07-07"> - <owner>rdevlin.cronin@chromium.org</owner> - <summary> - The number of extensions that are disabled at browser profile open due to - permissions increases. - - Histogram is in the process of being removed in favor of its incremented - version that emits only on profile open for "user" profiles - (profiles where people can install extensions, specifically profiles that - can have non-component extensions installed). - </summary> -</histogram> - <histogram name="Extensions.DisabledForPermissions2" units="units" expires_after="never"> <!-- expires-never: Used for monitoring user extension usage. --> @@ -1976,20 +1919,6 @@ </summary> </histogram> -<histogram name="Extensions.ExtensionLocation" enum="ExtensionLocation" - expires_after="2023-07-07"> - <owner>rdevlin.cronin@chromium.org</owner> - <summary> - The install location for a given extension. Recorded once per enabled - extension on profile initialization. - - Histogram is in the process of being removed in favor of its incremented - version that emits only on profile open for "user" profiles - (profiles where people can install extensions, specifically profiles that - can have non-component extensions installed). - </summary> -</histogram> - <histogram name="Extensions.ExtensionLocation2" enum="ExtensionLocation" expires_after="never"> <!-- expires-never: Monitoring core extension usage. --> @@ -2539,22 +2468,6 @@ </token> </histogram> -<histogram name="Extensions.FromWebstoreInconsistency" - enum="ExtensionFromWebstoreInconcistencyEnum" expires_after="2023-07-07"> - <owner>anunoy@chromium.org</owner> - <summary> - Number of apps/extensions loaded on profile open with an inconsistent - "from webstore" state. This means an item that is flagged as - from_webstore, but with either a non-webstore update_url or an external - install location. - - Histogram is in the process of being removed in favor of its incremented - version that emits only on profile open for "user" profiles - (profiles where people can install extensions, specifically profiles that - can have non-component extensions installed). - </summary> -</histogram> - <histogram name="Extensions.FromWebstoreInconsistency2" enum="ExtensionFromWebstoreInconcistencyEnum" expires_after="2025-03-02"> <owner>anunoy@chromium.org</owner> @@ -2841,23 +2754,6 @@ </summary> </histogram> -<histogram name="Extensions.HasPermissions_Install3" enum="Boolean" - expires_after="2023-07-07"> - <owner>rdevlin.cronin@chromium.org</owner> - <owner>extensions-core@chromium.org</owner> - <summary> - Whether there were any permissions present in an extension when it was - installed . To find places where this histogram may be emitted, look for - calls to InstalledLoader::RecordPermissionMessagesHistogram with the - argument Install. For Sync users, this is reported for each device. - - Histogram is in the process of being removed in favor of its incremented - version that emits only on profile open for "user" profiles - (profiles where people can install extensions, specifically profiles that - can have non-component extensions installed). - </summary> -</histogram> - <histogram name="Extensions.HasPermissions_Install4" enum="Boolean" expires_after="never"> <!-- expires-never: Monitoring extension usage. --> @@ -2874,23 +2770,6 @@ </summary> </histogram> -<histogram name="Extensions.HasPermissions_Load3" enum="Boolean" - expires_after="2023-07-07"> - <owner>rdevlin.cronin@chromium.org</owner> - <owner>extensions-core@chromium.org</owner> - <summary> - Whether there were any permissions present in an extension when it was - loaded (which happens at profile open or extension install). To find places - where this histogram may be emitted, look for calls to - InstalledLoader::RecordPermissionMessagesHistogram with the argument Load. - - Histogram is in the process of being removed in favor of its incremented - version that emits only on profile open for "user" profiles - (profiles where people can install extensions, specifically profiles that - can have non-component extensions installed). - </summary> -</histogram> - <histogram name="Extensions.HasPermissions_Load4" enum="Boolean" expires_after="never"> <!-- expires-never: Monitoring extension usage. --> @@ -2907,21 +2786,6 @@ </summary> </histogram> -<histogram name="Extensions.HomepageOverrides" units="units" - expires_after="2023-07-07"> - <owner>rdevlin.cronin@chromium.org</owner> - <owner>kelvinjiang@chromium.org</owner> - <summary> - The number of enabled extensions with a homepage override specified in their - manifest. Recorded once per profile at profile initialization. - - Histogram is in the process of being removed in favor of its incremented - version that emits only on profile open for "user" profiles - (profiles where people can install extensions, specifically profiles that - can have non-component extensions installed). - </summary> -</histogram> - <histogram name="Extensions.HomepageOverrides2" units="units" expires_after="2025-11-02"> <owner>rdevlin.cronin@chromium.org</owner> @@ -2950,22 +2814,6 @@ </summary> </histogram> -<histogram name="Extensions.HostPermissions.GrantedAccess" - enum="HostPermissionsAccess" expires_after="2023-07-07"> - <owner>emiliapaz@chromium.org</owner> - <owner>extensions-core@chromium.org</owner> - <summary> - Records the host permissions access for a enabled extension as a result of - the RuntimeHostPermissions feature. Recorded once per extension at profile - initialization. - - Histogram is in the process of being removed in favor of its incremented - version that emits only on profile open for "user" profiles - (profiles where people can install extensions, specifically profiles that - can have non-component extensions installed). - </summary> -</histogram> - <histogram name="Extensions.HostPermissions.GrantedAccess2" enum="HostPermissionsAccess" expires_after="never"> <!-- expires-never: Monitors core extension usage. --> @@ -2981,22 +2829,6 @@ </summary> </histogram> -<histogram name="Extensions.HostPermissions.GrantedAccessForBroadRequests" - enum="HostPermissionsAccess" expires_after="2023-07-07"> - <owner>emiliapaz@chromium.org</owner> - <owner>extensions-core@chromium.org</owner> - <summary> - Records the host permissions access for each enabled extension that - specifies a host permission that matches an effective TLD. Recorded once per - extension at profile initialization. - - Histogram is in the process of being removed in favor of its incremented - version that emits only on profile open for "user" profiles - (profiles where people can install extensions, specifically profiles that - can have non-component extensions installed). - </summary> -</histogram> - <histogram name="Extensions.HostPermissions.GrantedAccessForBroadRequests2" enum="HostPermissionsAccess" expires_after="never"> <!-- expires-never: Monitors core extension usage. --> @@ -3012,22 +2844,6 @@ </summary> </histogram> -<histogram name="Extensions.HostPermissions.GrantedAccessForTargetedRequests" - enum="HostPermissionsAccess" expires_after="2023-07-07"> - <owner>emiliapaz@chromium.org</owner> - <owner>extensions-core@chromium.org</owner> - <summary> - Records the host permissions access for each enabled extension that - specifies hosts, but has no host permission that matches an effective TLD. - Recorded once per extension at profile initialization. - - Histogram is in the process of being removed in favor of its incremented - version that emits only on profile open for "user" profiles - (profiles where people can install extensions, specifically profiles that - can have non-component extensions installed). - </summary> -</histogram> - <histogram name="Extensions.HostPermissions.GrantedAccessForTargetedRequests2" enum="HostPermissionsAccess" expires_after="never"> <!-- expires-never: Monitors core extension usage. --> @@ -3043,23 +2859,6 @@ </summary> </histogram> -<histogram name="Extensions.IncognitoAllowed" units="units" - expires_after="2023-07-07"> - <owner>rdevlin.cronin@chromium.org</owner> - <summary> - The number of extensions (and friends) that could have been allowed in - incognito, and were, for users that have at least one extension that could - have been allowed. This excludes anything that doesn't show up in - chrome://extensions (platform apps, hosted apps, component extensions), - policy-installed extensions, and unpacked extensions. - - Histogram is in the process of being removed in favor of its incremented - version that emits only on profile open for "user" profiles - (profiles where people can install extensions, specifically profiles that - can have non-component extensions installed). - </summary> -</histogram> - <histogram name="Extensions.IncognitoAllowed2" units="units" expires_after="never"> <!-- expires-never: Monitoring extension usage. --> @@ -3220,22 +3019,6 @@ </summary> </histogram> -<histogram name="Extensions.InstallSource" enum="ExtensionLocation" - expires_after="2025-11-30"> - <owner>rdevlin.cronin@chromium.org</owner> - <owner>extensions-core@chromium.org</owner> - <summary> - Installs grouped by the location property in prefs. Emitted once per profile - open. - - Histogram is in the process of being removed in favor of its new versions - (Extensions.InstallType.User2 and Extensions.InstallType.Nonuser2) that emit - only on profile open for "user" profiles (profiles where people - can install extensions, specifically profiles that can have non-component - extensions installed). - </summary> -</histogram> - <!-- TODO(crbug.com/40878021): Change all .NonUser/.User metrics to use histogram suffixes rather than be duplicated here. --> <histogram name="Extensions.InstallSource{UserType}2" enum="ExtensionLocation" @@ -3251,21 +3034,6 @@ <token key="UserType" variants="UserType"/> </histogram> -<histogram name="Extensions.InstallType" enum="ExtensionType" - expires_after="2023-07-07"> - <owner>rdevlin.cronin@chromium.org</owner> - <summary> - Installs grouped by Extension::HistogramType emitted once per extension - install. - - Histogram is in the process of being removed in favor of its new versions - (Extensions.InstallType.User and Extensions.InstallType.Nonuser) that emit - only on profile open for "user" profiles (profiles where people - can install extensions, specifically profiles that can have non-component - extensions installed). - </summary> -</histogram> - <histogram name="Extensions.InstallType{UserType}" enum="ExtensionType" expires_after="never"> <!-- expires-never: Monitoring extension usage. --> @@ -3306,18 +3074,6 @@ </token> </histogram> -<histogram name="Extensions.LoadAll" units="units" expires_after="2023-07-07"> - <owner>rdevlin.cronin@chromium.org</owner> - <summary> - The number of extensions and themes loaded at profile open. - - Histogram is in the process of being removed in favor of its incremented - version that emits only on profile open for "user" profiles - (profiles where people can install extensions, specifically profiles that - can have non-component extensions installed). - </summary> -</histogram> - <histogram name="Extensions.LoadAll2" units="units" expires_after="never"> <!-- expires-never: Monitoring extension usage. --> @@ -3377,21 +3133,6 @@ </summary> </histogram> -<histogram name="Extensions.LoadAllTime2" units="ms" expires_after="2023-07-07"> - <owner>rdevlin.cronin@chromium.org</owner> - <summary> - Time taken to load all non-component extensions at profile open and record - metrics. This happens as part of the total initialization time of - ExtensionService, measured in Extensions.ExtensionServiceInitTime. - - Histogram is in the process of being removed in favor of its new versions - (Extensions.LoadAllTime2.NonUser and Extensions.LoadAllTime2.User) that emit - only on profile open for "user" profiles (profiles where people - can install extensions, specifically profiles that can have non-component - extensions installed). - </summary> -</histogram> - <histogram name="Extensions.LoadAllTime2.NonUser" units="ms" expires_after="never"> <!-- expires-never: Monitoring core extensions system performance. --> @@ -3423,18 +3164,6 @@ </summary> </histogram> -<histogram name="Extensions.LoadApp" units="units" expires_after="2023-07-07"> - <owner>rdevlin.cronin@chromium.org</owner> - <summary> - The number of apps loaded by each user at profile open. - - Histogram is in the process of being removed in favor of its incremented - version that emits only on profile open for "user" profiles - (profiles where people can install extensions, specifically profiles that - can have non-component extensions installed). - </summary> -</histogram> - <histogram name="Extensions.LoadApp2" units="units" expires_after="never"> <!-- expires-never: Monitoring extension usage. --> @@ -3447,20 +3176,6 @@ </summary> </histogram> -<histogram name="Extensions.LoadAppExternal" units="units" - expires_after="2023-07-07"> - <owner>rdevlin.cronin@chromium.org</owner> - <owner>extensions-core@chromium.org</owner> - <summary> - The number of externally managed apps loaded by each user at profile open. - - Histogram is in the process of being removed in favor of its incremented - version that emits only on profile open for "user" profiles - (profiles where people can install extensions, specifically profiles that - can have non-component extensions installed). - </summary> -</histogram> - <histogram name="Extensions.LoadAppExternal2" units="units" expires_after="never"> <!-- expires-never: Monitoring extension usage. --> @@ -3473,19 +3188,6 @@ </summary> </histogram> -<histogram name="Extensions.LoadAppUser" units="units" - expires_after="2023-07-07"> - <owner>rdevlin.cronin@chromium.org</owner> - <summary> - The number of user-installed apps loaded by each user at profile open. - - Histogram is in the process of being removed in favor of its incremented - version that emits only on profile open for "user" profiles - (profiles where people can install extensions, specifically profiles that - can have non-component extensions installed). - </summary> -</histogram> - <histogram name="Extensions.LoadAppUser2" units="units" expires_after="never"> <!-- expires-never: Monitoring extension usage. --> @@ -3498,19 +3200,6 @@ </summary> </histogram> -<histogram name="Extensions.LoadBrowserAction" units="units" - expires_after="2023-07-07"> - <owner>rdevlin.cronin@chromium.org</owner> - <summary> - The number of browser action extensions loaded at profile open. - - Histogram is in the process of being removed in favor of its incremented - version that emits only on profile open for "user" profiles - (profiles where people can install extensions, specifically profiles that - can have non-component extensions installed). - </summary> -</histogram> - <histogram name="Extensions.LoadBrowserAction2" units="units" expires_after="never"> <!-- expires-never: Monitoring extension usage. --> @@ -3524,19 +3213,6 @@ </summary> </histogram> -<histogram name="Extensions.LoadExtension" units="units" - expires_after="2023-07-07"> - <owner>rdevlin.cronin@chromium.org</owner> - <summary> - The number of extensions loaded at profile open. - - Histogram is in the process of being removed in favor of its incremented - version that emits only on profile open for "user" profiles - (profiles where people can install extensions, specifically profiles that - can have non-component extensions installed). - </summary> -</histogram> - <histogram name="Extensions.LoadExtension2" units="units" expires_after="never"> <!-- expires-never: Monitoring extension usage. --> @@ -3549,20 +3225,6 @@ </summary> </histogram> -<histogram name="Extensions.LoadExtensionExternal" units="units" - expires_after="2023-07-07"> - <owner>rdevlin.cronin@chromium.org</owner> - <owner>extensions-core@chromium.org</owner> - <summary> - The number of externally managed extensions loaded at profile open. - - Histogram is in the process of being removed in favor of its incremented - version that emits only on profile open for "user" profiles - (profiles where people can install extensions, specifically profiles that - can have non-component extensions installed). - </summary> -</histogram> - <histogram name="Extensions.LoadExtensionExternal2" units="units" expires_after="never"> <!-- expires-never: Monitoring extension usage. --> @@ -3597,19 +3259,6 @@ </summary> </histogram> -<histogram name="Extensions.LoadHostedApp" units="units" - expires_after="2023-07-07"> - <owner>rdevlin.cronin@chromium.org</owner> - <summary> - The number of hosted apps loaded by each user at profile open. - - Histogram is in the process of being removed in favor of its incremented - version that emits only on profile open for "user" profiles - (profiles where people can install extensions, specifically profiles that - can have non-component extensions installed). - </summary> -</histogram> - <histogram name="Extensions.LoadHostedApp2" units="units" expires_after="never"> <!-- expires-never: Monitoring extension usage. --> @@ -3634,20 +3283,6 @@ </summary> </histogram> -<histogram name="Extensions.LoadNoExtensionAction" units="units" - expires_after="2023-07-07"> - <owner>rdevlin.cronin@chromium.org</owner> - <summary> - The number of extensions that had neither a page nor browser action - specified in their manifest. Recorded at profile open. - - Histogram is in the process of being removed in favor of its incremented - version that emits only on profile open for "user" profiles - (profiles where people can install extensions, specifically profiles that - can have non-component extensions installed). - </summary> -</histogram> - <histogram name="Extensions.LoadNoExtensionAction2" units="units" expires_after="never"> <!-- expires-never: Monitoring extension usage. --> @@ -3662,21 +3297,6 @@ </summary> </histogram> -<histogram name="Extensions.LoadOffStoreItems" units="Number of items" - expires_after="2023-07-07"> - <owner>rdevlin.cronin@chromium.org</owner> - <owner>extensions-core@chromium.org</owner> - <summary> - The number of enabled extensions or apps the user has installed that do not - update from the Chrome Web Store. Recorded during profile initialization. - - Histogram is in the process of being removed in favor of its incremented - version that emits only on profile open for "user" profiles - (profiles where people can install extensions, specifically profiles that - can have non-component extensions installed). - </summary> -</histogram> - <histogram name="Extensions.LoadOffStoreItems2" units="Number of items" expires_after="never"> <!-- expires-never: Monitoring core extension usage. --> @@ -3691,19 +3311,6 @@ </summary> </histogram> -<histogram name="Extensions.LoadPackagedApp" units="units" - expires_after="2023-07-07"> - <owner>rdevlin.cronin@chromium.org</owner> - <summary> - The number of legacy packaged apps loaded by each user at profile open. - - Histogram is in the process of being removed in favor of its incremented - version that emits only on profile open for "user" profiles - (profiles where people can install extensions, specifically profiles that - can have non-component extensions installed). - </summary> -</histogram> - <histogram name="Extensions.LoadPackagedApp2" units="units" expires_after="never"> <!-- expires-never: Monitoring extension usage. --> @@ -3716,19 +3323,6 @@ </summary> </histogram> -<histogram name="Extensions.LoadPlatformApp" units="units" - expires_after="2023-07-07"> - <owner>rdevlin.cronin@chromium.org</owner> - <summary> - The number of platform apps loaded at profile open. - - Histogram is in the process of being removed in favor of its incremented - version that emits only on profile open for "user" profiles - (profiles where people can install extensions, specifically profiles that - can have non-component extensions installed). - </summary> -</histogram> - <histogram name="Extensions.LoadPlatformApp2" units="units" expires_after="never"> <!-- expires-never: Monitoring extension usage. --> @@ -3741,19 +3335,6 @@ </summary> </histogram> -<histogram name="Extensions.LoadTheme" units="units" expires_after="2023-07-07"> - <owner>rdevlin.cronin@chromium.org</owner> - <owner>extensions-core@chromium.org</owner> - <summary> - The number of themes loaded at profile open. - - Histogram is in the process of being removed in favor of its incremented - version that emits only on profile open for "user" profiles - (profiles where people can install extensions, specifically profiles that - can have non-component extensions installed). - </summary> -</histogram> - <histogram name="Extensions.LoadTheme2" units="units" expires_after="2025-12-14"> <owner>rdevlin.cronin@chromium.org</owner> @@ -3765,21 +3346,6 @@ </summary> </histogram> -<histogram name="Extensions.LoadType" enum="ExtensionType" - expires_after="2023-07-07"> - <owner>rdevlin.cronin@chromium.org</owner> - <owner>extensions-core@chromium.org</owner> - <summary> - The number of extensions loaded at profile open grouped by - Extension::HistogramType. - - Histogram is in the process of being removed in favor of its incremented - version that emits only on profile open for "user" profiles - (profiles where people can install extensions, specifically profiles that - can have non-component extensions installed). - </summary> -</histogram> - <histogram name="Extensions.LoadType2" enum="ExtensionType" expires_after="2026-01-18"> <owner>rdevlin.cronin@chromium.org</owner> @@ -4074,21 +3640,6 @@ </summary> </histogram> -<histogram name="Extensions.NewTabPageOverrides" units="units" - expires_after="2023-07-07"> - <owner>rdevlin.cronin@chromium.org</owner> - <owner>kelvinjiang@chromium.org</owner> - <summary> - The number of enabled extensions with a New Tab Page override specified in - their manifest. Recorded once per profile at profile initialization. - - Histogram is in the process of being removed in favor of its incremented - version that emits only on profile open for "user" profiles - (profiles where people can install extensions, specifically profiles that - can have non-component extensions installed). - </summary> -</histogram> - <histogram name="Extensions.NewTabPageOverrides2" units="units" expires_after="2025-12-01"> <owner>rdevlin.cronin@chromium.org</owner> @@ -4101,20 +3652,6 @@ </summary> </histogram> -<histogram name="Extensions.NonWebstoreLocation" enum="ExtensionLocation" - expires_after="2023-07-07"> - <owner>rdevlin.cronin@chromium.org</owner> - <summary> - The number of apps/extensions with a non-webstore update_url loaded on - profile open and grouped by Extension::Location. - - Histogram is in the process of being removed in favor of its incremented - version that emits only on profile open for "user" profiles - (profiles where people can install extensions, specifically profiles that - can have non-component extensions installed). - </summary> -</histogram> - <histogram name="Extensions.NonWebstoreLocation2" enum="ExtensionLocation" expires_after="never"> <!-- expires-never: Monitoring extension usage. --> @@ -4149,20 +3686,6 @@ <token key="ExtensionState" variants="ExtensionState"/> </histogram> -<histogram name="Extensions.NonWebStoreNewTabPageOverrides" units="units" - expires_after="2023-07-07"> - <owner>anunoy@chromium.org</owner> - <summary> - Number of non-WebStore extensions on profile open that override the new tab - page. - - Histogram is in the process of being removed in favor of its incremented - version that emits only on profile open for "user" profiles - (profiles where people can install extensions, specifically profiles that - can have non-component extensions installed). - </summary> -</histogram> - <histogram name="Extensions.NonWebStoreNewTabPageOverrides2" units="units" expires_after="2025-12-01"> <owner>anunoy@chromium.org</owner> @@ -4175,22 +3698,6 @@ </summary> </histogram> -<histogram name="Extensions.NotAllowlistedDisabled" units="extensions" - expires_after="2023-07-07"> - <owner>jeffcyr@google.com</owner> - <owner>chrome-counter-abuse-alerts@google.com</owner> - <summary> - The total number of disabled extensions that are not present in the Enhanced - Safe Browsing CRX allowlist. Recorded for all users on profile - initialization. - - Histogram is in the process of being removed in favor of its incremented - version that emits only on profile open for "user" profiles - (profiles where people can install extensions, specifically profiles that - can have non-component extensions installed). - </summary> -</histogram> - <histogram name="Extensions.NotAllowlistedDisabled2" units="extensions" expires_after="2025-01-01"> <owner>jeffcyr@google.com</owner> @@ -4203,22 +3710,6 @@ </summary> </histogram> -<histogram name="Extensions.NotAllowlistedDisabledAndEsbUser" - units="extensions" expires_after="2023-10-01"> - <owner>jeffcyr@google.com</owner> - <owner>chrome-counter-abuse-alerts@google.com</owner> - <summary> - The total number of disabled extensions that are not present in the Enhanced - Safe Browsing CRX allowlist. Recorded for only for Enhanced Safe Browsing - users on profile initialization. - - Histogram is in the process of being removed in favor of its incremented - version that emits only on profile open for "user" profiles - (profiles where people can install extensions, specifically profiles that - can have non-component extensions installed). - </summary> -</histogram> - <histogram name="Extensions.NotAllowlistedDisabledAndEsbUser2" units="extensions" expires_after="2025-01-01"> <owner>jeffcyr@google.com</owner> @@ -4232,22 +3723,6 @@ </summary> </histogram> -<histogram name="Extensions.NotAllowlistedEnabled" units="extensions" - expires_after="2023-10-01"> - <owner>jeffcyr@google.com</owner> - <owner>chrome-counter-abuse-alerts@google.com</owner> - <summary> - The total number of enabled extensions that are not present in the Enhanced - Safe Browsing CRX allowlist. Recorded for all users on profile - initialization. - - Histogram is in the process of being removed in favor of its incremented - version that emits only on profile open for "user" profiles - (profiles where people can install extensions, specifically profiles that - can have non-component extensions installed). - </summary> -</histogram> - <histogram name="Extensions.NotAllowlistedEnabled2" units="extensions" expires_after="2025-01-01"> <owner>jeffcyr@google.com</owner> @@ -4260,22 +3735,6 @@ </summary> </histogram> -<histogram name="Extensions.NotAllowlistedEnabledAndEsbUser" units="extensions" - expires_after="2023-10-01"> - <owner>jeffcyr@google.com</owner> - <owner>chrome-counter-abuse-alerts@google.com</owner> - <summary> - The total number of enabled extensions that are not present in the Enhanced - Safe Browsing CRX allowlist. Recorded for only for Enhanced Safe Browsing - users on profile initialization. - - Histogram is in the process of being removed in favor of its incremented - version that emits only on profile open for "user" profiles - (profiles where people can install extensions, specifically profiles that - can have non-component extensions installed). - </summary> -</histogram> - <histogram name="Extensions.NotAllowlistedEnabledAndEsbUser2" units="extensions" expires_after="2025-01-01"> <owner>jeffcyr@google.com</owner> @@ -4289,23 +3748,6 @@ </summary> </histogram> -<histogram name="Extensions.Permissions_Install3" enum="ExtensionPermission3" - expires_after="2023-07-07"> - <owner>rdevlin.cronin@chromium.org</owner> - <owner>extensions-core@chromium.org</owner> - <summary> - The permissions present in an extension when it was installed. To find - places where this histogram may be emitted, look for calls to - InstalledLoader::RecordPermissionMessagesHistogram with the argument - Install. For Sync users, this is reported for each device. - - Histogram is in the process of being removed in favor of its incremented - version that emits only on profile open for "user" profiles - (profiles where people can install extensions, specifically profiles that - can have non-component extensions installed). - </summary> -</histogram> - <histogram name="Extensions.Permissions_Install4" enum="ExtensionPermission3" expires_after="never"> <!-- expires-never: Monitoring extension usage. --> @@ -4323,23 +3765,6 @@ </summary> </histogram> -<histogram name="Extensions.Permissions_Load3" enum="ExtensionPermission3" - expires_after="2023-07-07"> - <owner>rdevlin.cronin@chromium.org</owner> - <owner>extensions-core@chromium.org</owner> - <summary> - The permissions present in an extension when it was loaded (which happens at - profile open or extension install). To find places where this histogram may - be emitted, look for calls to - InstalledLoader::RecordPermissionMessagesHistogram with the argument Load. - - Histogram is in the process of being removed in favor of its incremented - version that emits only on profile open for "user" profiles - (profiles where people can install extensions, specifically profiles that - can have non-component extensions installed). - </summary> -</histogram> - <histogram name="Extensions.Permissions_Load4" enum="ExtensionPermission3" expires_after="never"> <!-- expires-never: Monitoring core extension usage. --> @@ -4376,24 +3801,6 @@ </summary> </histogram> -<histogram name="Extensions.RuntimeHostPermissions.ExtensionHasWithheldHosts" - enum="BooleanHasWithheldHosts" expires_after="2023-07-07"> - <owner>rdevlin.cronin@chromium.org</owner> - <owner>src/extensions/OWNERS</owner> - <summary> - Whether an extension had host permissions withheld as a result of the - RuntimeHostPermissions feature. Recorded once per extension at profile - initialization if and only if the RuntimeHostPermissions feature is enabled - and the extension requests any host permissions (i.e., could be affected by - the feature). - - Histogram is in the process of being removed in favor of its incremented - version that emits only on profile open for "user" profiles - (profiles where people can install extensions, specifically profiles that - can have non-component extensions installed). - </summary> -</histogram> - <histogram name="Extensions.RuntimeHostPermissions.ExtensionHasWithheldHosts2" enum="BooleanHasWithheldHosts" expires_after="never"> <!-- expires-never: Monitors core extension usage. --> @@ -4410,25 +3817,6 @@ </summary> </histogram> -<histogram name="Extensions.RuntimeHostPermissions.GrantedHostCount" - units="Granted hosts" expires_after="2023-07-07"> - <owner>rdevlin.cronin@chromium.org</owner> - <owner>src/extensions/OWNERS</owner> - <summary> - The number of hosts an extension has been granted explicit access to that it - also requested (note that if the user granted unrequested hosts, those will - not be included in this count). Recorded once per extension at profile - initialization if and only if the RuntimeHostPermissions feature is enabled - and the extension has had host permissions withheld. See also - Extensions.RuntimeHostPermissions.ExtensionHasWithheldHosts. - - Histogram is in the process of being removed in favor of its incremented - version that emits only on profile open for "user" profiles - (profiles where people can install extensions, specifically profiles that - can have non-component extensions installed). - </summary> -</histogram> - <histogram name="Extensions.RuntimeHostPermissions.GrantedHostCount2" units="Granted hosts" expires_after="never"> <!-- expires-never: Monitors core extension usage. --> @@ -4470,21 +3858,6 @@ <summary>Count the number of times a sandboxed CRX unpack succeeds.</summary> </histogram> -<histogram name="Extensions.SearchEngineOverrides" units="units" - expires_after="2023-07-07"> - <owner>rdevlin.cronin@chromium.org</owner> - <owner>kelvinjiang@chromium.org</owner> - <summary> - The number of enabled extensions with a search engine override specified in - their manifest. Recorded once per profile at profile initialization. - - Histogram is in the process of being removed in favor of its incremented - version that emits only on profile open for "user" profiles - (profiles where people can install extensions, specifically profiles that - can have non-component extensions installed). - </summary> -</histogram> - <histogram name="Extensions.SearchEngineOverrides2" units="units" expires_after="2025-12-28"> <owner>rdevlin.cronin@chromium.org</owner> @@ -5002,21 +4375,6 @@ </summary> </histogram> -<histogram name="Extensions.StartupPagesOverrides" units="units" - expires_after="2023-07-07"> - <owner>rdevlin.cronin@chromium.org</owner> - <owner>kelvinjiang@chromium.org</owner> - <summary> - The number of enabled extensions with startup page overrides specified in - their manifest. Recorded once per profile at profile initialization. - - Histogram is in the process of being removed in favor of its incremented - version that emits only on profile open for "user" profiles - (profiles where people can install extensions, specifically profiles that - can have non-component extensions installed). - </summary> -</histogram> - <histogram name="Extensions.StartupPagesOverrides2" units="units" expires_after="2026-01-18"> <owner>rdevlin.cronin@chromium.org</owner> @@ -5431,23 +4789,6 @@ </summary> </histogram> -<histogram name="Extensions.WebRequestBlockingCount" units="extensions" - expires_after="2023-07-07"> - <owner>rdevlin.cronin@chromium.org</owner> - <owner>src/extensions/OWNERS</owner> - <summary> - Number of enabled extensions which have requested the - "webRequestBlocking" permission. Includes all kinds of extensions, - including component and unpacked extensions. Recorded during profile - initialization. - - Histogram is in the process of being removed in favor of its incremented - version that emits only on profile open for "user" profiles - (profiles where people can install extensions, specifically profiles that - can have non-component extensions installed). - </summary> -</histogram> - <histogram name="Extensions.WebRequestBlockingCount2" units="extensions" expires_after="never"> <!-- expires-never: For monitoring Web request API usage. --> @@ -5463,22 +4804,6 @@ </summary> </histogram> -<histogram name="Extensions.WebRequestCount" units="extensions" - expires_after="2023-07-07"> - <owner>rdevlin.cronin@chromium.org</owner> - <owner>src/extensions/OWNERS</owner> - <summary> - Number of enabled extensions which have requested the "webRequest" - permission. Includes all kinds of extensions, including component and - unpacked extensions. Recorded during profile initialization. - - Histogram is in the process of being removed in favor of its incremented - version that emits only on profile open for "user" profiles - (profiles where people can install extensions, specifically profiles that - can have non-component extensions installed). - </summary> -</histogram> - <histogram name="Extensions.WebRequestCount2" units="extensions" expires_after="never"> <!-- expires-never: For monitoring Web request API usage. -->
diff --git a/tools/metrics/histograms/metadata/glic/histograms.xml b/tools/metrics/histograms/metadata/glic/histograms.xml index edc4d9f..7b25462 100644 --- a/tools/metrics/histograms/metadata/glic/histograms.xml +++ b/tools/metrics/histograms/metadata/glic/histograms.xml
@@ -484,8 +484,19 @@ <owner>harringtond@chromium.org</owner> <owner>erikchen@chromium.org</owner> <summary> - Recorded when a page context gets screenshot (post-encoding and scaling). - Measure the time from start. + Recorded when a page context successfully gets a screenshot (post-encoding + and scaling). Measure the time from start. + </summary> +</histogram> + +<histogram name="Glic.PageContextFetcher.GetEncodedScreenshot.Failure" + units="ms" expires_after="2026-01-15"> + <owner>carlosk@chromium.org</owner> + <owner>harringtond@chromium.org</owner> + <owner>erikchen@chromium.org</owner> + <summary> + Recorded when a page context fails to get a screenshot. This includes any + kind of error, including timeout. Measure the time from start. </summary> </histogram>
diff --git a/tools/metrics/histograms/metadata/new_tab_page/enums.xml b/tools/metrics/histograms/metadata/new_tab_page/enums.xml index 3b53ebc..f9f2a6d 100644 --- a/tools/metrics/histograms/metadata/new_tab_page/enums.xml +++ b/tools/metrics/histograms/metadata/new_tab_page/enums.xml
@@ -38,6 +38,13 @@ <int value="2" label="Discover Feed Bottom Sheet"/> </enum> +<enum name="ComposeboxFileValidationError"> + <int value="0" label="No error"/> + <int value="1" label="Too many files uploaded"/> + <int value="2" label="File is empty"/> + <int value="3" label="File size is too large"/> +</enum> + <enum name="Entry"> <summary/> <int value="0" label="App Menu"/> @@ -323,6 +330,12 @@ <int value="1967788069" label="solidcolors_for_NTP">Colors for NTP</int> </enum> +<enum name="NtpComposeboxMultimodalState"> + <int value="1" label="Text Only"/> + <int value="2" label="File Only"/> + <int value="3" label="Text and File"/> +</enum> + <enum name="NTPCustomizeChromeBackgroundAction"> <int value="0" label="Collection selected in the 'Chrome backgrounds' dialog."/>
diff --git a/tools/metrics/histograms/metadata/new_tab_page/histograms.xml b/tools/metrics/histograms/metadata/new_tab_page/histograms.xml index 9ad67f4..529525e 100644 --- a/tools/metrics/histograms/metadata/new_tab_page/histograms.xml +++ b/tools/metrics/histograms/metadata/new_tab_page/histograms.xml
@@ -271,6 +271,32 @@ </summary> </histogram> +<histogram name="NewTabPage.Composebox.File.Size.{ComposeboxFileTypes}" + units="bytes" expires_after="2026-01-20"> + <owner>jennserrano@google.com</owner> + <owner>chrome-desktop-ntp@google.com</owner> + <owner>chrome-desktop-search@google.com</owner> + <summary> + The size of the file received by the browser from the WebUI. Recorded as + soon as the browser receives it. + </summary> + <token key="ComposeboxFileTypes" variants="ComposeboxFileTypes"> + <variant name=""/> + </token> +</histogram> + +<histogram name="NewTabPage.Composebox.File.WebUI.UploadAttemptFailure" + enum="ComposeboxFileValidationError" expires_after="2026-01-20"> + <owner>jennserrano@google.com</owner> + <owner>chrome-desktop-ntp@google.com</owner> + <owner>chrome-desktop-search@google.com</owner> + <summary> + Records the validation error hit on the WebUI side when a file is uploaded. + If no error occurred, this is logged as "No error." Recorded when + a file upload is attempted. + </summary> +</histogram> + <histogram name="NewTabPage.Composebox.FromNTPLoadToSessionStart" units="ms" expires_after="2026-06-17"> <owner>niharm@google.com</owner> @@ -284,6 +310,40 @@ </summary> </histogram> +<histogram name="NewTabPage.Composebox.Query.FileCount" units="count" + expires_after="2026-01-20"> + <owner>jennserrano@google.com</owner> + <owner>chrome-desktop-ntp@google.com</owner> + <owner>chrome-desktop-search@google.com</owner> + <summary> + Number of files included in a completed query. May be zero in the case that + the input was only text. Recorded after navigation to the AIM page occurs. + </summary> +</histogram> + +<histogram name="NewTabPage.Composebox.Query.Modality" + enum="NtpComposeboxMultimodalState" expires_after="2026-01-20"> + <owner>jennserrano@google.com</owner> + <owner>chrome-desktop-ntp@google.com</owner> + <owner>chrome-desktop-search@google.com</owner> + <summary> + Records the combination of input types used to form the query. Recorded + after navigation to the AIM page occurs. + </summary> +</histogram> + +<histogram name="NewTabPage.Composebox.Query.TextLength" units="characters" + expires_after="2026-01-20"> + <owner>jennserrano@google.com</owner> + <owner>chrome-desktop-ntp@google.com</owner> + <owner>chrome-desktop-search@google.com</owner> + <summary> + Number of characters in the composebox submission request. May be zero in + the case that only a file was uploaded. Recorded after navigation to the AIM + page occurs. + </summary> +</histogram> + <histogram name="NewTabPage.Composebox.Query.Time.ToSubmission" units="ms" expires_after="2026-01-20"> <owner>jennserrano@google.com</owner> @@ -291,39 +351,10 @@ <owner>chrome-desktop-search@google.com</owner> <summary> Tracks the duration from composebox session start time to the time a query - was submitted. A session starts when the compose button is clicked and the - composebox shown. There may be multiple query submission times recorded per - composebox shown. Recorded at the end of the session. Only recorded if the - user is redirected to the AIM page. - </summary> -</histogram> - -<histogram name="NewTabPage.Composebox.Session.Duration.Abandoned" units="ms" - expires_after="2026-01-20"> - <owner>jennserrano@google.com</owner> - <owner>chrome-desktop-ntp@google.com</owner> - <owner>chrome-desktop-search@google.com</owner> - <summary> - Tracks the duration from when a composebox session starts to its - abandonment. A session starts when the compose button is clicked and the - composebox shown. A composebox session is abandoned if the user ends the - session by closing the composebox or by closing the NTP without submitting a - query. Recorded at the end of the session. - </summary> -</histogram> - -<histogram name="NewTabPage.Composebox.Session.Duration.Completed" units="ms" - expires_after="2026-01-20"> - <owner>jennserrano@google.com</owner> - <owner>chrome-desktop-ntp@google.com</owner> - <owner>chrome-desktop-search@google.com</owner> - <summary> - Tracks the duration from composebox session start time to completion. A - session starts when the compose button is clicked and the composebox shown. - Completion is when the following happens: 1) user submits a query 2) user is - redirected to the AIM page 3) the composebox is closed. Duplicate session - durations may be recorded if multiple navigations occur. Recorded at the end - of the session. + was submitted. Recorded as soon as the query is submitted, but before + navigation. Note: A session starts when the compose button is clicked and + the composebox shown. There may be multiple query submission times recorded + per composebox shown. </summary> </histogram> @@ -338,12 +369,30 @@ clicked and the composebox shown. Completion is when the following happens: 1) user submits a query 2) user is redirected to the AIM page 3) the composebox is closed. Abandonment is when a user closes the composebox or - closes the NTP without query submission. For completed sessions there may be - duplicate sessions recorded if multiple navigations occur. Recorded at the - end of the session. + closes the NTP without query submission. Recorded at the end of the session. </summary> </histogram> +<histogram name="NewTabPage.Composebox.Session.Duration.{Status}" units="ms" + expires_after="2026-01-20"> + <owner>jennserrano@google.com</owner> + <owner>chrome-desktop-ntp@google.com</owner> + <owner>chrome-desktop-search@google.com</owner> + <summary> + Tracks the duration of composebox sessions from start time to the end of the + session. Recorded at the end of the session. Note: A session starts when the + compose button is clicked and the composebox shown. A composebox session + ends 1) when it is abandoned 2) a query is submitted and the composebox is + closed. A session can be abandoned by the user closing the composebox or by + exiting out of the NTP while the composebox is open without having submitted + a query. + </summary> + <token key="Status"> + <variant name="Abandoned"/> + <variant name="QuerySubmitted"/> + </token> +</histogram> + <histogram name="NewTabPage.Composebox.Session.File.Browser.UploadAttemptCount.{ComposeboxFileTypes}" units="count" expires_after="2026-01-20"> @@ -421,6 +470,18 @@ </token> </histogram> +<histogram name="NewTabPage.Composebox.Session.QueryCount" units="count" + expires_after="2026-01-20"> + <owner>jennserrano@google.com</owner> + <owner>chrome-desktop-ntp@google.com</owner> + <owner>chrome-desktop-search@google.com</owner> + <summary> + Tracks the number of queries submitted per session. Multiple queries may be + submitted when the AIM page is opened in a new tab or window and the + composebox remains open. Recorded at the end of the session. + </summary> +</histogram> + <histogram name="NewTabPage.ComposeEntrypoint.Click.UserTextPresent" enum="Boolean" expires_after="2026-06-10"> <owner>niharm@google.com</owner>
diff --git a/tools/perf/core/perfetto_binary_roller/binary_deps.json b/tools/perf/core/perfetto_binary_roller/binary_deps.json index 4024def..a48cbb0 100644 --- a/tools/perf/core/perfetto_binary_roller/binary_deps.json +++ b/tools/perf/core/perfetto_binary_roller/binary_deps.json
@@ -5,8 +5,8 @@ "full_remote_path": "perfetto-luci-artifacts/361808c959b026d558c9948602ea38bf25d8981e/linux-arm64/trace_processor_shell" }, "win": { - "hash": "bb1e11cad5b2695a4bfd297148cfb02c621309f0", - "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/win/ab99948900d2ed4ae1a9ef40a462ed1f690b3d61/trace_processor_shell.exe" + "hash": "5a94d43415a11093bc3f54dc919844924f85a289", + "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/win/83bcbbbf67ed17934ddd3b667ed19c120c9ed504/trace_processor_shell.exe" }, "linux_arm": { "hash": "ab1a0d9236a63649044414663b6ace711253648f", @@ -21,8 +21,8 @@ "full_remote_path": "perfetto-luci-artifacts/v51.2/mac-arm64/trace_processor_shell" }, "linux": { - "hash": "ba35f0f44df2c0459f56dc20bb1922e1db88aa37", - "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux/6b489d9b215629622d86698dcf5e463bd18a11c5/trace_processor_shell" + "hash": "44df4a1f45be831967a23f4485b234e255701313", + "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux/83bcbbbf67ed17934ddd3b667ed19c120c9ed504/trace_processor_shell" } }, "power_profile.sql": {
diff --git a/ui/android/java/src/org/chromium/ui/listmenu/BasicListMenu.java b/ui/android/java/src/org/chromium/ui/listmenu/BasicListMenu.java index 20cfd16..56c38e1 100644 --- a/ui/android/java/src/org/chromium/ui/listmenu/BasicListMenu.java +++ b/ui/android/java/src/org/chromium/ui/listmenu/BasicListMenu.java
@@ -4,13 +4,14 @@ package org.chromium.ui.listmenu; +import static org.chromium.ui.listmenu.ListMenuUtils.createAdapter; + import android.content.Context; import android.content.Intent; import android.content.res.ColorStateList; import android.graphics.drawable.Drawable; import android.view.View; -import android.widget.AdapterView; -import android.widget.AdapterView.OnItemClickListener; +import android.view.ViewGroup; import android.widget.ListView; import androidx.annotation.ColorRes; @@ -21,7 +22,6 @@ import org.chromium.build.annotations.Nullable; import org.chromium.ui.R; import org.chromium.ui.UiUtils; -import org.chromium.ui.modelutil.LayoutViewBuilder; import org.chromium.ui.modelutil.MVCListAdapter.ListItem; import org.chromium.ui.modelutil.MVCListAdapter.ModelList; import org.chromium.ui.modelutil.ModelListAdapter; @@ -29,13 +29,14 @@ import java.util.LinkedList; import java.util.List; +import java.util.Set; /** * An implementation of a list menu. Uses app_menu_layout as the default layout of menu and * list_menu_item as the default layout of a menu item. */ @NullMarked -public class BasicListMenu implements ListMenu, OnItemClickListener { +public class BasicListMenu implements ListMenu { /** * Helper function to build a ListItem of a divider. @@ -104,15 +105,15 @@ private final ListView mListView; private final ModelListAdapter mAdapter; private final View mContentView; - private final List<Runnable> mClickRunnables; - private final Delegate mDelegate; + private final List<Runnable> mClickRunnables = new LinkedList<>(); /** * @param context The {@link Context} to inflate the layout. * @param data Data representing the list items. All items in data are assumed to be enabled. * @param contentView The background of the list menu. * @param listView The {@link ListView} of the list menu. - * @param delegate The {@link Delegate} that would be called when the menu is clicked. + * @param delegate The {@link ListMenu.Delegate} used to handle menu clicks. If not provided, + * the item's CLICK_LISTENER or listMenu's onMenuItemSelected method will be used. * @param backgroundTintColor The background tint color of the menu. */ public BasicListMenu( @@ -120,17 +121,24 @@ ModelList data, View contentView, ListView listView, - Delegate delegate, + @Nullable Delegate delegate, @ColorRes int backgroundTintColor) { - mAdapter = new ListMenuItemAdapter(data); - registerListItemTypes(); + mAdapter = + createAdapter( + data, + Set.of(), + (model) -> { + if (delegate != null) delegate.onItemSelected(model); + // We will run the runnables that are registered by the time this lambda + // is called. + for (Runnable r : mClickRunnables) { + r.run(); + } + }); mContentView = contentView; mListView = listView; mListView.setAdapter(mAdapter); mListView.setDivider(null); - mListView.setOnItemClickListener(this); - mDelegate = delegate; - mClickRunnables = new LinkedList<>(); if (backgroundTintColor != 0) { ViewCompat.setBackgroundTintList( @@ -154,14 +162,6 @@ } @Override - public void onItemClick(AdapterView<?> parent, View view, int position, long id) { - mDelegate.onItemSelected(((ListItem) mAdapter.getItem(position)).model); - for (Runnable r : mClickRunnables) { - r.run(); - } - } - - @Override public int getMaxItemWidth() { return UiUtils.computeListAdapterContentDimensions(mAdapter, mListView)[0]; } @@ -180,18 +180,12 @@ return result; } - private void registerListItemTypes() { - mAdapter.registerType( - ListItemType.MENU_ITEM, - new LayoutViewBuilder(R.layout.list_menu_item), - ListMenuItemViewBinder::binder); - mAdapter.registerType( - ListItemType.DIVIDER, - new LayoutViewBuilder(R.layout.list_section_divider), - ListSectionDividerViewBinder::bind); - } - public ModelListAdapter getAdapterForTesting() { return mAdapter; } + + public void clickItemForTesting(int i) { + mAdapter.getView(i, new View(mContentView.getContext()), (ViewGroup) mContentView) + .performClick(); + } }
diff --git a/ui/android/java/src/org/chromium/ui/listmenu/ListMenuItemAdapter.java b/ui/android/java/src/org/chromium/ui/listmenu/ListMenuItemAdapter.java index 0aafe9fe..46afb3c 100644 --- a/ui/android/java/src/org/chromium/ui/listmenu/ListMenuItemAdapter.java +++ b/ui/android/java/src/org/chromium/ui/listmenu/ListMenuItemAdapter.java
@@ -4,14 +4,18 @@ package org.chromium.ui.listmenu; +import static org.chromium.ui.listmenu.ListMenuItemProperties.CLICK_LISTENER; import static org.chromium.ui.listmenu.ListMenuItemProperties.ENABLED; import static org.chromium.ui.listmenu.ListMenuItemProperties.MENU_ITEM_ID; +import static org.chromium.ui.listmenu.ListMenuUtils.hasClickListener; import android.view.View; import android.view.ViewGroup; import android.widget.ListView; import org.chromium.build.annotations.NullMarked; +import org.chromium.build.annotations.Nullable; +import org.chromium.ui.listmenu.ListMenu.Delegate; import org.chromium.ui.modelutil.MVCListAdapter.ModelList; import org.chromium.ui.modelutil.ModelListAdapter; @@ -24,10 +28,11 @@ private static final int INVALID_ITEM_ID = -1; private final Collection<Integer> mDisabledTypes; + private final @Nullable Delegate mDelegate; /** Returns a {@link ListMenuItemAdapter} for a list containing {@param data}. */ public ListMenuItemAdapter(ModelList data) { - this(data, Set.of()); + this(data, Set.of(), /* delegate= */ null); } /** @@ -38,10 +43,14 @@ * @param data The {@link ModelList} whose data we should show. * @param disabledTypes The type enums which should be disabled in the adapter (i.e. not * keyboard-focusable or interactable). + * @param delegate The {@link Delegate} used to handle menu clicks. If not provided, the item's + * CLICK_LISTENER or listMenu's onMenuItemSelected method will be used. */ - public ListMenuItemAdapter(ModelList data, Collection<Integer> disabledTypes) { + public ListMenuItemAdapter( + ModelList data, Collection<Integer> disabledTypes, @Nullable Delegate delegate) { super(data); mDisabledTypes = disabledTypes; + mDelegate = delegate; } @Override @@ -70,19 +79,30 @@ @Override public View getView(int position, View convertView, ViewGroup parent) { + ListItem item = ((ListItem) getItem(position)); + if (canReuseView(convertView, item.type)) { + // If the view is going to be reused, strip existing onClickListeners before binding + convertView.setOnClickListener(null); + } + View view = super.getView(position, convertView, parent); - ListItem item = ((ListItem) getItem(position)); - if (!view.hasOnClickListeners()) { - // https://crbug.copm/802284 Pre-Q only. - // The view needs to have an OnClickListener for TalkBack to announce the disabled - // state. In - // this case, we need to let the ListView handle the click. view.setOnClickListener( (v) -> { - long id = getItemId(position); - ((ListView) parent).performItemClick(v, position, id); + if (mDelegate != null) { + // Delegate, if possible. + mDelegate.onItemSelected(item.model); + } else if (hasClickListener(item)) { + // The item had a click listener in the model, but none was bound by the + // ViewBinder, and there is no click delegate to use. In this case, call + // the model click listener directly. + item.model.get(CLICK_LISTENER).onClick(view); + } else { + // As a fallback, use ListView's performItemClick. + long id = getItemId(position); + ((ListView) parent).performItemClick(v, position, id); + } }); } // some items have styles specific for disabled state
diff --git a/ui/android/java/src/org/chromium/ui/listmenu/ListMenuUtils.java b/ui/android/java/src/org/chromium/ui/listmenu/ListMenuUtils.java index 0524773..a70e8ded 100644 --- a/ui/android/java/src/org/chromium/ui/listmenu/ListMenuUtils.java +++ b/ui/android/java/src/org/chromium/ui/listmenu/ListMenuUtils.java
@@ -41,7 +41,7 @@ */ @NonNull public static ModelListAdapter createAdapter(ModelList listItems) { - return createAdapter(listItems, Set.of()); + return createAdapter(listItems, Set.of(), /* delegate= */ null); } /** @@ -53,12 +53,16 @@ * * @param listItems The {@link ModelList} containing the items to be displayed in the menu. * @param disabledTypes Additional integer types which should not be enabled in the adapter. + * @param delegate The {@link ListMenu.Delegate} used to handle menu clicks. If not provided, + * the item's CLICK_LISTENER or listMenu's onMenuItemSelected method will be used. * @return A configured {@link ModelListAdapter} ready to be set on the {@link ListView}. */ @NonNull public static ModelListAdapter createAdapter( - ModelList listItems, Collection<Integer> disabledTypes) { - ModelListAdapter adapter = new ListMenuItemAdapter(listItems, disabledTypes); + ModelList listItems, + Collection<Integer> disabledTypes, + ListMenu.@Nullable Delegate delegate) { + ModelListAdapter adapter = new ListMenuItemAdapter(listItems, disabledTypes, delegate); adapter.registerType( ListItemType.DIVIDER,
diff --git a/ui/gfx/render_text.h b/ui/gfx/render_text.h index 55d05c7..1877ce66 100644 --- a/ui/gfx/render_text.h +++ b/ui/gfx/render_text.h
@@ -1028,6 +1028,8 @@ internal::StyleArray styles_; BreakList<bool> elidings_; + // Layout breaklists. These are used for eliding, and should not be manually + // cleared. mutable BreakList<SkColor> layout_colors_; mutable BreakList<BaselineStyle> layout_baselines_; mutable BreakList<int> layout_font_size_overrides_;
diff --git a/ui/gfx/render_text_harfbuzz.cc b/ui/gfx/render_text_harfbuzz.cc index b3647af3..49bf7e2 100644 --- a/ui/gfx/render_text_harfbuzz.cc +++ b/ui/gfx/render_text_harfbuzz.cc
@@ -1992,10 +1992,6 @@ if (BuildResolvedTypefaceBreakList(run_list)) { ItemizeAndShapeTextImpl(&commonized_run_map, text, run_list); } - - // Resolved typefaces are no longer used and can be cleared. - layout_resolved_typefaces().Reset(); - resolved_typefaces().Reset(); } // Now that potentially two passes to ItemizeAndShapeTextImpl have occurred,
diff --git a/ui/gfx/render_text_unittest.cc b/ui/gfx/render_text_unittest.cc index 3b22479..b26414fd 100644 --- a/ui/gfx/render_text_unittest.cc +++ b/ui/gfx/render_text_unittest.cc
@@ -2423,6 +2423,22 @@ EXPECT_EQ(u"…ef", render_text->GetDisplayText()); } +TEST_F(RenderTextTest, ElideMissingGlyphs) { + constexpr int kGlyphWidth = 10; + SetGlyphWidth(kGlyphWidth); + + RenderText* render_text = GetRenderText(); + render_text->SetText(u"𪛗𪛗𪛗𪛗龭疆龭疆龭疆龭疆疆疆疆"); + render_text->SetCursorEnabled(false); + render_text->SetDisplayRect(Rect(0, 0, 10 * kGlyphWidth, 100)); + + // Missing glyph state shouldn't change with elision. + const bool has_missing_glyphs = GetHarfBuzzRunList()->HasMissingGlyphs(); + render_text->SetElideBehavior(ELIDE_TAIL); + EXPECT_EQ(u"𪛗𪛗𪛗𪛗龭疆龭疆龭…", render_text->GetDisplayText()); + EXPECT_EQ(has_missing_glyphs, GetHarfBuzzRunList()->HasMissingGlyphs()); +} + TEST_F(RenderTextTest, SetWhitespaceElision) { // This test requires glyphs to be the same width. constexpr int kGlyphWidth = 10;
diff --git a/v8 b/v8 index 6f17f338..5d83ccf 160000 --- a/v8 +++ b/v8
@@ -1 +1 @@ -Subproject commit 6f17f338ff1df4623bfdca257fe911442c35f60f +Subproject commit 5d83ccf80ddd9959325fde53ce0b9869e76505b8