diff --git a/.vpython3 b/.vpython3 index 499d76cb..a3cb9aa 100644 --- a/.vpython3 +++ b/.vpython3
@@ -501,7 +501,7 @@ # //third_party/blink/tools/blinkpy/web_tests/port/server_process.py wheel: < name: "infra/python/wheels/pywin32/${vpython_platform}" - version: "version:300" + version: "version:306" match_tag: < platform: "win32" >
diff --git a/DEPS b/DEPS index 33a9383..b9e75de 100644 --- a/DEPS +++ b/DEPS
@@ -280,15 +280,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': '5f2e30e0c8bd00b2ff314a6c751ceac95fedb913', + 'skia_revision': 'dba7f46122ba3b1cdb8890eec92aa7b3534781b6', # 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': 'ce9a1aa9762102a7b70395e9e5e5cdbbb46b1c3f', + 'v8_revision': '083f3ab01f8de699e3300350e6c45be0d0488484', # 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': 'd4a3dbee0da44da98eea4d36bbfa769221583a23', + 'angle_revision': 'c10f5e3fbf61e024ed298700dbc0b5faf888ec5f', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling SwiftShader # and whatever else without interference from each other. @@ -304,7 +304,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling Fuchsia sdk # and whatever else without interference from each other. - 'fuchsia_version': 'version:26.20250103.4.1', + 'fuchsia_version': 'version:26.20250110.4.1', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling google-toolbox-for-mac # and whatever else without interference from each other. @@ -364,7 +364,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling fuzztest # and whatever else without interference from each other. - 'fuzztest_revision': '70e24aa9499f5563bb13ec9d0b8490ec2bf09510', + 'fuzztest_revision': '032f0bdd8c0a3800eb49131d212142a61df81b0c', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling domato # and whatever else without interference from each other. @@ -372,7 +372,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling devtools-frontend # and whatever else without interference from each other. - 'devtools_frontend_revision': '32ab3025514394538797f79c89b2f0a02fed255f', + 'devtools_frontend_revision': 'ed19c1e8985293025be2e812b86ea7619185fcfd', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling libprotobuf-mutator # and whatever else without interference from each other. @@ -396,7 +396,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': 'e2894d1f5a19ec70b65828be0c2363f55e1a4327', + 'dawn_revision': '07cbbfbf05a3b1e9f22b3d0ac3203a5a70c15689', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. @@ -496,7 +496,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': '44258fc58f1db70b223625a1dbc9c1ceea184ecf', + 'llvm_libc_revision': '9ee890194fe9d4f39b1d5114c6e291b72e6062dd', # If you change this, also update the libc++ revision in # //buildtools/deps_revisions.gni. @@ -1439,12 +1439,12 @@ 'src/clank': { 'url': Var('chrome_git') + '/clank/internal/apps.git' + '@' + - 'c78bc64124bbc9103a59307e508591bf82cf7eb4', + 'de102b699470b4d92be37fc98f29f6c668e419f2', 'condition': 'checkout_android and checkout_src_internal', }, 'src/docs/website': { - 'url': Var('chromium_git') + '/website.git' + '@' + 'b2946942a27e261a3a94a354d819b842c4b10c57', + 'url': Var('chromium_git') + '/website.git' + '@' + '939010115caac895e1879c5af408c4550a547db6', }, 'src/ios/third_party/earl_grey2/src': { @@ -1904,7 +1904,7 @@ # Tools used when building Chrome for Chrome OS. This affects both the Simple # Chrome workflow, as well as the chromeos-chrome ebuild. 'src/third_party/chromite': { - 'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + '0998de1c990e33172ed27fdd13252e062cd2d4c7', + 'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + 'a9fdaf06401860211c818d7000208547d9de4b1b', 'condition': 'checkout_chromeos', }, @@ -2284,7 +2284,7 @@ }, 'src/third_party/libunwindstack': { - 'url': Var('chromium_git') + '/chromium/src/third_party/libunwindstack.git' + '@' + 'c8ff202d9233cc0781715cb87f354045bb0dbee9', + 'url': Var('chromium_git') + '/chromium/src/third_party/libunwindstack.git' + '@' + 'e5061bbda4c2ba6438020669ed06b122032433dd', 'condition': 'checkout_android', }, @@ -2436,7 +2436,7 @@ Var('pdfium_git') + '/pdfium.git' + '@' + Var('pdfium_revision'), 'src/third_party/perfetto': - Var('android_git') + '/platform/external/perfetto.git' + '@' + 'a49395d104cee4a11408de2a0b8cde127ba67b5f', + Var('android_git') + '/platform/external/perfetto.git' + '@' + '0893e2af69caf8592f6e38f34ccdd4ad6615de9d', 'src/base/tracing/test/data': { 'bucket': 'perfetto', @@ -2800,13 +2800,13 @@ Var('chromium_git') + '/external/khronosgroup/webgl.git' + '@' + '450cceb587613ac1469c5a131fac15935c99e0e7', 'src/third_party/webgpu-cts/src': - Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + '467b5f74035710a7e94553d060ec73dbb4b50f13', + Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + '18742954f642e134d9080840bdb2a884aad09776', 'src/third_party/webpagereplay': Var('chromium_git') + '/webpagereplay.git' + '@' + Var('webpagereplay_revision'), 'src/third_party/webrtc': - Var('webrtc_git') + '/src.git' + '@' + 'cdd2922312848149a9954e3e7f7c327a9010afda', + Var('webrtc_git') + '/src.git' + '@' + '2c96934699b1f75572f1dd6f508e85ab0c96a356', # Wuffs' canonical repository is at github.com/google/wuffs, but we use # Skia's mirror of Wuffs, the same as in upstream Skia's DEPS file. @@ -2943,7 +2943,7 @@ 'packages': [ { 'package': 'chromeos_internal/apps/help_app/app', - 'version': 'iaDfe6Hb0fX1OERnWIX30SPwq0vk6N0KwdXQsPL98sMC', + 'version': 'U-e0ZakbgdWyK3PfOkyY2LjFMKErlhNfhXoPyZkCtfAC', }, ], 'condition': 'checkout_chromeos and checkout_src_internal', @@ -2954,7 +2954,7 @@ 'packages': [ { 'package': 'chromeos_internal/apps/media_app/app', - 'version': 'biwjMds6KgeCMke13Hh01tpBx9RRb5wnpm1hlNAi5xkC', + 'version': 'PtlyC_RQp-DTGJStt6rFF9j9VKN78T7iRML3szOQ_EUC', }, ], 'condition': 'checkout_chromeos and checkout_src_internal', @@ -4634,7 +4634,7 @@ 'src/ios_internal': { 'url': Var('chrome_git') + '/chrome/ios_internal.git' + '@' + - 'ae4eac69b182afea8eeb44148e709b4338bbb276', + 'fa89054d303701d661169f5d7cf4e8473dd3fe98', 'condition': 'checkout_ios and checkout_src_internal', },
diff --git a/android_webview/BUILD.gn b/android_webview/BUILD.gn index cb4d955..55593fe 100644 --- a/android_webview/BUILD.gn +++ b/android_webview/BUILD.gn
@@ -579,6 +579,7 @@ "java/src/org/chromium/android_webview/AwContentsClientBridge.java", "java/src/org/chromium/android_webview/AwContentsClientCallbackHelper.java", "java/src/org/chromium/android_webview/AwContentsIoThreadClient.java", + "java/src/org/chromium/android_webview/AwContentsIoThreadClientImpl.java", "java/src/org/chromium/android_webview/AwContentsLifecycleNotifier.java", "java/src/org/chromium/android_webview/AwContentsOriginMatcher.java", "java/src/org/chromium/android_webview/AwContentsStatics.java",
diff --git a/android_webview/common/aw_features.cc b/android_webview/common/aw_features.cc index 49f4bef..d9ae230 100644 --- a/android_webview/common/aw_features.cc +++ b/android_webview/common/aw_features.cc
@@ -238,15 +238,25 @@ "WebViewRenderDocument", base::FEATURE_DISABLED_BY_DEFAULT); -// When enabled, the cookie header will be included in the request headers -// for shouldInterceptRequest, excepting when -// kWebViewInterceptedCookieHeaderReadWrite is also enabled. +// When enabled, WebView performs normal processing work for cookie request +// headers and response headers for the shouldInterceptRequest API. However, +// whether the app is provided the cookie jar contents is controlled by +// WebViewInterceptedCookieHeaderReadWrite. Whether Set-Cookie headers +// affect the cookie jar is also controlled by +// WebViewInterceptedCookieHeaderReadWrite. When that flag is disabled, +// set-cookie headers are ignored and the response headers passed to the +// app remain unchanged. BASE_FEATURE(kWebViewInterceptedCookieHeader, "WebViewInterceptedCookieHeader", base::FEATURE_DISABLED_BY_DEFAULT); -// When enabled, the cookie header will be included in the request headers -// for shouldInterceptRequest. +// When enabled in conjunction with WebViewInterceptedCookieHeader flag, the +// cookie header in the request headers will be included for +// shouldInterceptRequest. Also, the set-cookie header in the response headers +// will be processed and stored in the cookie jar for shouldInterceptRequest. +// When disabled while WebViewInterceptedCookieHeader is enabled, the response +// headers passed to the app remain unchanged. Also, the set-cookie +// header has no effect on the cookie jar. BASE_FEATURE(kWebViewInterceptedCookieHeaderReadWrite, "WebViewInterceptedCookieHeaderReadWrite", base::FEATURE_DISABLED_BY_DEFAULT);
diff --git a/android_webview/glue/BUILD.gn b/android_webview/glue/BUILD.gn index 1ed02e1..81fccd1a 100644 --- a/android_webview/glue/BUILD.gn +++ b/android_webview/glue/BUILD.gn
@@ -68,6 +68,7 @@ "java/src/com/android/webview/chromium/SharedWebViewChromium.java", "java/src/com/android/webview/chromium/SharedWebViewContentsClientAdapter.java", "java/src/com/android/webview/chromium/SharedWebViewRendererClientAdapter.java", + "java/src/com/android/webview/chromium/SpeculativeLoadingConfig.java", "java/src/com/android/webview/chromium/SplitApkWorkaround.java", "java/src/com/android/webview/chromium/TracingControllerAdapter.java", "java/src/com/android/webview/chromium/WebBackForwardListChromium.java",
diff --git a/android_webview/glue/java/src/com/android/webview/chromium/Profile.java b/android_webview/glue/java/src/com/android/webview/chromium/Profile.java index b1064161..e32e8b80 100644 --- a/android_webview/glue/java/src/com/android/webview/chromium/Profile.java +++ b/android_webview/glue/java/src/com/android/webview/chromium/Profile.java
@@ -159,4 +159,7 @@ public void cancelPrefetch(String url) { // TODO(334016945): do the actual implementation } + + @UiThread + public void setSpeculativeLoadingConfig(SpeculativeLoadingConfig speculativeLoadingConfig) {} }
diff --git a/android_webview/glue/java/src/com/android/webview/chromium/SpeculativeLoadingConfig.java b/android_webview/glue/java/src/com/android/webview/chromium/SpeculativeLoadingConfig.java new file mode 100644 index 0000000..d803c38 --- /dev/null +++ b/android_webview/glue/java/src/com/android/webview/chromium/SpeculativeLoadingConfig.java
@@ -0,0 +1,22 @@ +// 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 com.android.webview.chromium; + +import org.chromium.android_webview.common.Lifetime; + +@Lifetime.Temporary +public class SpeculativeLoadingConfig { + + /** Represents the maximum number of cached prefetched that can exist at a time. */ + public final int maxPrefetches; + + /** The Time-To-Live in seconds for the prefetch request inside the prefetch cache. */ + public final int prefetchTTLSeconds; + + public SpeculativeLoadingConfig(int maxPrefetches, int prefetchTTLSeconds) { + this.maxPrefetches = maxPrefetches; + this.prefetchTTLSeconds = prefetchTTLSeconds; + } +}
diff --git a/android_webview/java/src/org/chromium/android_webview/AwContents.java b/android_webview/java/src/org/chromium/android_webview/AwContents.java index ee8e3a4..b2f13af2c 100644 --- a/android_webview/java/src/org/chromium/android_webview/AwContents.java +++ b/android_webview/java/src/org/chromium/android_webview/AwContents.java
@@ -680,55 +680,6 @@ private CleanupReference mCleanupReference; // -------------------------------------------------------------------------------------------- - private class IoThreadClientImpl extends AwContentsIoThreadClient { - // All methods are called on the IO thread. - - @Override - public int getCacheMode() { - return mSettings.getCacheMode(); - } - - @Override - public AwContentsBackgroundThreadClient getBackgroundThreadClient() { - return mBackgroundThreadClient; - } - - @Override - public boolean shouldBlockContentUrls() { - return !mSettings.getAllowContentAccess(); - } - - @Override - public boolean shouldBlockFileUrls() { - return !mSettings.getAllowFileAccess(); - } - - @Override - public boolean shouldBlockSpecialFileUrls() { - return mSettings.getBlockSpecialFileUrls(); - } - - @Override - public boolean shouldBlockNetworkLoads() { - return mSettings.getBlockNetworkLoads(); - } - - @Override - public boolean shouldAcceptCookies() { - return mBrowserContext.getCookieManager().acceptCookie(); - } - - @Override - public boolean shouldAcceptThirdPartyCookies() { - return mSettings.getAcceptThirdPartyCookies(); - } - - @Override - public boolean getSafeBrowsingEnabled() { - return mSettings.getSafeBrowsingEnabled(); - } - } - private class BackgroundThreadClientImpl extends AwContentsBackgroundThreadClient { // All methods are called on the background thread. @@ -1123,7 +1074,11 @@ mContext, contentsClient, AwContentsStatics.getClientCertLookupTable()); mZoomControls = new AwZoomControls(this); mBackgroundThreadClient = new BackgroundThreadClientImpl(); - mIoThreadClient = new IoThreadClientImpl(); + mIoThreadClient = + new AwContentsIoThreadClientImpl( + mSettings, + mBackgroundThreadClient, + () -> mBrowserContext.getCookieManager().acceptCookie()); mInterceptNavigationDelegate = new InterceptNavigationDelegateImpl(); mDisplayObserver = new AwDisplayAndroidObserver(); mUpdateVisibilityRunnable = () -> updateWebContentsVisibility();
diff --git a/android_webview/java/src/org/chromium/android_webview/AwContentsIoThreadClient.java b/android_webview/java/src/org/chromium/android_webview/AwContentsIoThreadClient.java index bf5f892a..84f8911 100644 --- a/android_webview/java/src/org/chromium/android_webview/AwContentsIoThreadClient.java +++ b/android_webview/java/src/org/chromium/android_webview/AwContentsIoThreadClient.java
@@ -10,11 +10,12 @@ /** * Delegate for handling callbacks. All methods are called on the IO thread. * - * You should create a separate instance for every WebContents that requires the - * provided functionality. + * <p>You should create a separate instance for every WebContents that requires the provided + * functionality. */ @JNINamespace("android_webview") public abstract class AwContentsIoThreadClient { + // TODO(crbug.com/389047726): Rename this to IoThreadClient. @CalledByNative public abstract int getCacheMode();
diff --git a/android_webview/java/src/org/chromium/android_webview/AwContentsIoThreadClientImpl.java b/android_webview/java/src/org/chromium/android_webview/AwContentsIoThreadClientImpl.java new file mode 100644 index 0000000..027e274 --- /dev/null +++ b/android_webview/java/src/org/chromium/android_webview/AwContentsIoThreadClientImpl.java
@@ -0,0 +1,76 @@ +// 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.android_webview; + +import org.chromium.android_webview.common.Lifetime; + +import java.util.function.BooleanSupplier; + +/** + * An implementation of {@link AwContentsIoThreadClient} used by AwContents, not Service Workers. + * + * <p>All methods are called on the IO thread. + */ +@Lifetime.WebView +class AwContentsIoThreadClientImpl extends AwContentsIoThreadClient { + private final AwSettings mSettings; + private final AwContentsBackgroundThreadClient mBackgroundThreadClient; + // We could turn this into a delegate if we start needing more things from AwContents. + private final BooleanSupplier mShouldAcceptCookies; + + public AwContentsIoThreadClientImpl( + AwSettings settings, + AwContentsBackgroundThreadClient backgroundThreadClient, + BooleanSupplier shouldAcceptCookies) { + mSettings = settings; + mBackgroundThreadClient = backgroundThreadClient; + mShouldAcceptCookies = shouldAcceptCookies; + } + + @Override + public int getCacheMode() { + return mSettings.getCacheMode(); + } + + @Override + public AwContentsBackgroundThreadClient getBackgroundThreadClient() { + return mBackgroundThreadClient; + } + + @Override + public boolean shouldBlockContentUrls() { + return !mSettings.getAllowContentAccess(); + } + + @Override + public boolean shouldBlockFileUrls() { + return !mSettings.getAllowFileAccess(); + } + + @Override + public boolean shouldBlockSpecialFileUrls() { + return mSettings.getBlockSpecialFileUrls(); + } + + @Override + public boolean shouldBlockNetworkLoads() { + return mSettings.getBlockNetworkLoads(); + } + + @Override + public boolean shouldAcceptCookies() { + return mShouldAcceptCookies.getAsBoolean(); + } + + @Override + public boolean shouldAcceptThirdPartyCookies() { + return mSettings.getAcceptThirdPartyCookies(); + } + + @Override + public boolean getSafeBrowsingEnabled() { + return mSettings.getSafeBrowsingEnabled(); + } +}
diff --git a/android_webview/java/src/org/chromium/android_webview/AwServiceWorkerController.java b/android_webview/java/src/org/chromium/android_webview/AwServiceWorkerController.java index 23ac10dc..a6761ee 100644 --- a/android_webview/java/src/org/chromium/android_webview/AwServiceWorkerController.java +++ b/android_webview/java/src/org/chromium/android_webview/AwServiceWorkerController.java
@@ -37,7 +37,7 @@ mBrowserContext = browserContext; mServiceWorkerSettings = new AwServiceWorkerSettings(applicationContext, mBrowserContext); mServiceWorkerBackgroundThreadClient = new ServiceWorkerBackgroundThreadClientImpl(); - mServiceWorkerIoThreadClient = new ServiceWorkerIoThreadClientImpl(); + mServiceWorkerIoThreadClient = new ServiceWorkerIoThreadClient(); mBrowserContext.setServiceWorkerIoThreadClient(mServiceWorkerIoThreadClient); } @@ -55,7 +55,7 @@ // Helper classes implementations - private class ServiceWorkerIoThreadClientImpl extends AwContentsIoThreadClient { + private class ServiceWorkerIoThreadClient extends AwContentsIoThreadClient { // All methods are called on the IO thread. @Override
diff --git a/android_webview/java/src/org/chromium/android_webview/common/ProductionSupportedFlagList.java b/android_webview/java/src/org/chromium/android_webview/common/ProductionSupportedFlagList.java index 1d699f0..2362f67 100644 --- a/android_webview/java/src/org/chromium/android_webview/common/ProductionSupportedFlagList.java +++ b/android_webview/java/src/org/chromium/android_webview/common/ProductionSupportedFlagList.java
@@ -913,16 +913,25 @@ + "navigation starts"), Flag.baseFeature(ContentFeatures.PWA_NAVIGATION_CAPTURING), Flag.baseFeature("TransportSecurityFileWriterSchedule"), - Flag.commandLine( + Flag.baseFeature( AwFeatures.WEBVIEW_INTERCEPTED_COOKIE_HEADER, - "When enabled, the cookie header will be included in the request headers" - + " for shouldInterceptRequest, excepting when " + "When enabled, WebView performs normal processing work for cookie request headers" + + " and response headers for the shouldInterceptRequest API. However, whether" + + " the app is provided the cookie jar contents is controlled by " + AwFeatures.WEBVIEW_INTERCEPTED_COOKIE_HEADER_READ_WRITE - + " is enabled."), - Flag.commandLine( + + ". Whether Set-Cookie headers affect the cookie jar is also controlled by" + + " " + + AwFeatures.WEBVIEW_INTERCEPTED_COOKIE_HEADER_READ_WRITE + + ". When this flag is disabled, set-cookie headers are ignored and the" + + " cookie jar is never read."), + Flag.baseFeature( AwFeatures.WEBVIEW_INTERCEPTED_COOKIE_HEADER_READ_WRITE, - "When enabled, the cookie header will not be included in the request headers" - + " for shouldInterceptRequest"), + "When enabled in conjunction with WebViewInterceptedCookieHeader flag, the cookie" + + " header in the request headers will be included for shouldInterceptRequest." + + " Also, the set-cookie header in the response headers will be processed for" + + " shouldInterceptRequest. When disabled while WebViewInterceptedCookieHeader" + + " is enabled, the response headers passed to the app remain unchanged. Also," + + " the set-cookie header has no effect on the cookie jar."), Flag.baseFeature( VizFeatures.RENDER_PASS_DRAWN_RECT, "Enable optimization for tracking damage in a drawn rect for each render pass."),
diff --git a/android_webview/support_library/BUILD.gn b/android_webview/support_library/BUILD.gn index ddf128b..84f74f0f 100644 --- a/android_webview/support_library/BUILD.gn +++ b/android_webview/support_library/BUILD.gn
@@ -30,6 +30,7 @@ "java/src/org/chromium/support_lib_glue/SupportLibWebMessagePortAdapter.java", "java/src/org/chromium/support_lib_glue/SupportLibWebResourceRequest.java", "java/src/org/chromium/support_lib_glue/SupportLibWebSettingsAdapter.java", + "java/src/org/chromium/support_lib_glue/SupportLibWebSettingsNoOpAdapter.java", "java/src/org/chromium/support_lib_glue/SupportLibWebStorageAdapter.java", "java/src/org/chromium/support_lib_glue/SupportLibWebViewChromium.java", "java/src/org/chromium/support_lib_glue/SupportLibWebViewChromiumFactory.java",
diff --git a/android_webview/support_library/boundary_interfaces/BUILD.gn b/android_webview/support_library/boundary_interfaces/BUILD.gn index 6eae83e..85db016 100644 --- a/android_webview/support_library/boundary_interfaces/BUILD.gn +++ b/android_webview/support_library/boundary_interfaces/BUILD.gn
@@ -24,6 +24,7 @@ "src/org/chromium/support_lib_boundary/ServiceWorkerClientBoundaryInterface.java", "src/org/chromium/support_lib_boundary/ServiceWorkerControllerBoundaryInterface.java", "src/org/chromium/support_lib_boundary/ServiceWorkerWebSettingsBoundaryInterface.java", + "src/org/chromium/support_lib_boundary/SpeculativeLoadingConfigBoundaryInterface.java", "src/org/chromium/support_lib_boundary/SpeculativeLoadingParametersBoundaryInterface.java", "src/org/chromium/support_lib_boundary/StaticsBoundaryInterface.java", "src/org/chromium/support_lib_boundary/TracingControllerBoundaryInterface.java",
diff --git a/android_webview/support_library/boundary_interfaces/src/org/chromium/support_lib_boundary/ProfileBoundaryInterface.java b/android_webview/support_library/boundary_interfaces/src/org/chromium/support_lib_boundary/ProfileBoundaryInterface.java index ab10a31..86e8e95 100644 --- a/android_webview/support_library/boundary_interfaces/src/org/chromium/support_lib_boundary/ProfileBoundaryInterface.java +++ b/android_webview/support_library/boundary_interfaces/src/org/chromium/support_lib_boundary/ProfileBoundaryInterface.java
@@ -42,4 +42,6 @@ String url, Executor callbackExecutor, /* PrefetchOperationCallback */ InvocationHandler callback); + + void setSpeculativeLoadingConfig(/* SpeculativeLoadingConfig */ InvocationHandler config); }
diff --git a/android_webview/support_library/boundary_interfaces/src/org/chromium/support_lib_boundary/SpeculativeLoadingConfigBoundaryInterface.java b/android_webview/support_library/boundary_interfaces/src/org/chromium/support_lib_boundary/SpeculativeLoadingConfigBoundaryInterface.java new file mode 100644 index 0000000..ad140998 --- /dev/null +++ b/android_webview/support_library/boundary_interfaces/src/org/chromium/support_lib_boundary/SpeculativeLoadingConfigBoundaryInterface.java
@@ -0,0 +1,13 @@ +// 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.support_lib_boundary; + +/** Boundary interface for SpeculativeLoadingConfig. */ +public interface SpeculativeLoadingConfigBoundaryInterface { + + int getMaxPrefetches(); + + int getPrefetchTTLSeconds(); +}
diff --git a/android_webview/support_library/boundary_interfaces/src/org/chromium/support_lib_boundary/util/Features.java b/android_webview/support_library/boundary_interfaces/src/org/chromium/support_lib_boundary/util/Features.java index 472825b1..efda275c 100644 --- a/android_webview/support_library/boundary_interfaces/src/org/chromium/support_lib_boundary/util/Features.java +++ b/android_webview/support_library/boundary_interfaces/src/org/chromium/support_lib_boundary/util/Features.java
@@ -287,6 +287,7 @@ // Profile.prefetchUrlAsync // Profile.clearPrefetchAsync + // Profile.setSpeculativeLoadingConfig public static final String PREFETCH_WITH_URL = "PREFETCH_URL_V3"; // WebviewCompat.setDefaultTrafficStatsTag
diff --git a/android_webview/support_library/java/src/org/chromium/support_lib_glue/SupportLibProfile.java b/android_webview/support_library/java/src/org/chromium/support_lib_glue/SupportLibProfile.java index 79d3683..2a4be551 100644 --- a/android_webview/support_library/java/src/org/chromium/support_lib_glue/SupportLibProfile.java +++ b/android_webview/support_library/java/src/org/chromium/support_lib_glue/SupportLibProfile.java
@@ -19,6 +19,7 @@ import com.android.webview.chromium.PrefetchNetworkException; import com.android.webview.chromium.PrefetchOperationCallback; import com.android.webview.chromium.Profile; +import com.android.webview.chromium.SpeculativeLoadingConfig; import org.chromium.android_webview.common.Lifetime; import org.chromium.support_lib_boundary.PrefetchOperationCallbackBoundaryInterface; @@ -128,6 +129,16 @@ mProfileImpl.clearPrefetch(url, createOperationCallback(callback)); } + @Override + public void setSpeculativeLoadingConfig( + /* SpeculativeLoadingConfig */ InvocationHandler config) { + recordApiCall(ApiCall.SET_SPECULATIVE_LOADING_CONFIG); + SpeculativeLoadingConfig speculativeLoadingConfig = + BoundaryInterfaceReflectionUtil.castToSuppLibClass( + SpeculativeLoadingConfig.class, config); + mProfileImpl.setSpeculativeLoadingConfig(speculativeLoadingConfig); + } + private PrefetchOperationCallback createOperationCallback( /* PrefetchOperationCallback */ InvocationHandler callback) { PrefetchOperationCallbackBoundaryInterface operationCallback =
diff --git a/android_webview/support_library/java/src/org/chromium/support_lib_glue/SupportLibWebSettingsNoOpAdapter.java b/android_webview/support_library/java/src/org/chromium/support_lib_glue/SupportLibWebSettingsNoOpAdapter.java new file mode 100644 index 0000000..ebe2d857 --- /dev/null +++ b/android_webview/support_library/java/src/org/chromium/support_lib_glue/SupportLibWebSettingsNoOpAdapter.java
@@ -0,0 +1,202 @@ +// 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.support_lib_glue; + +import static org.chromium.support_lib_glue.SupportLibWebViewChromiumFactory.recordApiCall; + +import android.webkit.WebSettings; + +import org.chromium.support_lib_boundary.WebSettingsBoundaryInterface; +import org.chromium.support_lib_glue.SupportLibWebViewChromiumFactory.ApiCall; + +import java.util.Collections; +import java.util.Map; +import java.util.Set; + +/** + * Mock adapter for WebSettings that doesn't do anything. + * + * <p>This class is used as a return value in the rare instances when the WebSettings object being + * passed into the support lib layer is not an implementation from Chromium, and therefore not + * castable to the implementation class. + */ +class SupportLibWebSettingsNoOpAdapter implements WebSettingsBoundaryInterface { + + public SupportLibWebSettingsNoOpAdapter() {} + + @Override + public void setOffscreenPreRaster(boolean enabled) { + recordApiCall(ApiCall.WEB_SETTINGS_SET_OFFSCREEN_PRE_RASTER); + } + + @Override + public boolean getOffscreenPreRaster() { + recordApiCall(ApiCall.WEB_SETTINGS_GET_OFFSCREEN_PRE_RASTER); + return false; + } + + @Override + public void setSafeBrowsingEnabled(boolean enabled) { + recordApiCall(ApiCall.WEB_SETTINGS_SET_SAFE_BROWSING_ENABLED); + } + + @Override + public boolean getSafeBrowsingEnabled() { + recordApiCall(ApiCall.WEB_SETTINGS_GET_SAFE_BROWSING_ENABLED); + return true; + } + + @Override + public void setDisabledActionModeMenuItems(int menuItems) { + recordApiCall(ApiCall.WEB_SETTINGS_SET_DISABLED_ACTION_MODE_MENU_ITEMS); + } + + @Override + public int getDisabledActionModeMenuItems() { + recordApiCall(ApiCall.WEB_SETTINGS_GET_DISABLED_ACTION_MODE_MENU_ITEMS); + return 0; + } + + @Override + public boolean getWillSuppressErrorPage() { + return false; + } + + @Override + public void setWillSuppressErrorPage(boolean suppressed) { + recordApiCall(ApiCall.WEB_SETTINGS_SET_WILL_SUPPRESS_ERROR_PAGE); + } + + @Override + public void setForceDark(int forceDarkMode) { + recordApiCall(ApiCall.WEB_SETTINGS_SET_FORCE_DARK); + } + + @Override + public int getForceDark() { + recordApiCall(ApiCall.WEB_SETTINGS_GET_FORCE_DARK); + return WebSettings.FORCE_DARK_AUTO; + } + + @Override + public void setForceDarkBehavior(int forceDarkBehavior) { + recordApiCall(ApiCall.WEB_SETTINGS_SET_FORCE_DARK_BEHAVIOR); + } + + @Override + public int getForceDarkBehavior() { + recordApiCall(ApiCall.WEB_SETTINGS_GET_FORCE_DARK_BEHAVIOR); + return ForceDarkBehavior.PREFER_MEDIA_QUERY_OVER_FORCE_DARK; + } + + @Override + public void setAlgorithmicDarkeningAllowed(boolean allow) { + recordApiCall(ApiCall.WEB_SETTINGS_SET_ALGORITHMIC_DARKENING_ALLOWED); + } + + @Override + public boolean isAlgorithmicDarkeningAllowed() { + recordApiCall(ApiCall.WEB_SETTINGS_IS_ALGORITHMIC_DARKENING_ALLOWED); + return false; + } + + @Override + public void setWebauthnSupport(@WebauthnSupport int support) { + recordApiCall(ApiCall.WEB_SETTINGS_SET_WEBAUTHN_SUPPORT); + } + + @Override + public @WebauthnSupport int getWebauthnSupport() { + recordApiCall(ApiCall.WEB_SETTINGS_GET_WEBAUTHN_SUPPORT); + return WebauthnSupport.NONE; + } + + @Override + public void setRequestedWithHeaderOriginAllowList(Set<String> allowedOriginRules) { + recordApiCall(ApiCall.WEB_SETTINGS_SET_REQUESTED_WITH_HEADER_ORIGIN_ALLOWLIST); + } + + @Override + public Set<String> getRequestedWithHeaderOriginAllowList() { + recordApiCall(ApiCall.WEB_SETTINGS_GET_REQUESTED_WITH_HEADER_ORIGIN_ALLOWLIST); + return Collections.emptySet(); + } + + @Override + public void setEnterpriseAuthenticationAppLinkPolicyEnabled(boolean enabled) { + recordApiCall(ApiCall.WEB_SETTINGS_SET_ENTERPRISE_AUTHENTICATION_APP_LINK_POLICY_ENABLED); + } + + @Override + public boolean getEnterpriseAuthenticationAppLinkPolicyEnabled() { + recordApiCall(ApiCall.WEB_SETTINGS_GET_ENTERPRISE_AUTHENTICATION_APP_LINK_POLICY_ENABLED); + return false; + } + + @Override + public void setUserAgentMetadataFromMap(Map<String, Object> uaMetadata) { + recordApiCall(ApiCall.WEB_SETTINGS_SET_USER_AGENT_METADATA); + } + + @Override + public Map<String, Object> getUserAgentMetadataMap() { + recordApiCall(ApiCall.WEB_SETTINGS_GET_USER_AGENT_METADATA); + return Collections.emptyMap(); + } + + @Override + public void setAttributionBehavior(@AttributionBehavior int behavior) { + recordApiCall(ApiCall.SET_ATTRIBUTION_BEHAVIOR); + } + + @Override + public int getAttributionBehavior() { + recordApiCall(ApiCall.GET_ATTRIBUTION_BEHAVIOR); + return AttributionBehavior.APP_SOURCE_AND_WEB_TRIGGER; + } + + @Override + public void setWebViewMediaIntegrityApiStatus( + @WebViewMediaIntegrityApiStatus int defaultStatus, + Map<String, @WebViewMediaIntegrityApiStatus Integer> permissionConfig) { + recordApiCall(ApiCall.SET_WEBVIEW_MEDIA_INTEGRITY_API_STATUS); + } + + @Override + public @WebViewMediaIntegrityApiStatus int getWebViewMediaIntegrityApiDefaultStatus() { + recordApiCall(ApiCall.GET_WEBVIEW_MEDIA_INTEGRITY_API_DEFAULT_STATUS); + return WebViewMediaIntegrityApiStatus.ENABLED; + } + + @Override + public Map<String, @WebViewMediaIntegrityApiStatus Integer> + getWebViewMediaIntegrityApiOverrideRules() { + recordApiCall(ApiCall.GET_WEBVIEW_MEDIA_INTEGRITY_API_OVERRIDE_RULES); + return Collections.emptyMap(); + } + + @Override + public void setSpeculativeLoadingStatus( + @SpeculativeLoadingStatus int speculativeLoadingStatus) { + recordApiCall(ApiCall.SET_SPECULATIVE_LOADING_STATUS); + } + + @Override + public @SpeculativeLoadingStatus int getSpeculativeLoadingStatus() { + recordApiCall(ApiCall.GET_SPECULATIVE_LOADING_STATUS); + return SpeculativeLoadingStatus.DISABLED; + } + + @Override + public void setBackForwardCacheEnabled(boolean backForwardCacheEnabled) { + recordApiCall(ApiCall.SET_BACK_FORWARD_CACHE_ENABLED); + } + + @Override + public boolean getBackForwardCacheEnabled() { + recordApiCall(ApiCall.GET_BACK_FORWARD_CACHE_ENABLED); + return false; + } +}
diff --git a/android_webview/support_library/java/src/org/chromium/support_lib_glue/SupportLibWebViewChromiumFactory.java b/android_webview/support_library/java/src/org/chromium/support_lib_glue/SupportLibWebViewChromiumFactory.java index 8029288..524fc30 100644 --- a/android_webview/support_library/java/src/org/chromium/support_lib_glue/SupportLibWebViewChromiumFactory.java +++ b/android_webview/support_library/java/src/org/chromium/support_lib_glue/SupportLibWebViewChromiumFactory.java
@@ -98,7 +98,7 @@ Features.WEB_AUTHENTICATION, Features.SPECULATIVE_LOADING, Features.BACK_FORWARD_CACHE, - Features.PREFETCH_WITH_URL + Features.DEV_SUFFIX, + Features.PREFETCH_WITH_URL, Features.DEFAULT_TRAFFICSTATS_TAGGING, Features.ASYNC_WEBVIEW_STARTUP, Features.PRERENDER_WITH_URL + Features.DEV_SUFFIX, @@ -230,6 +230,7 @@ ApiCall.PRERENDER_URL_WITH_PARAMS, ApiCall.WEB_STORAGE_DELETE_BROWSING_DATA, ApiCall.WEB_STORAGE_DELETE_BROWSING_DATA_FOR_SITE, + ApiCall.SET_SPECULATIVE_LOADING_CONFIG, // Add new constants above. The final constant should have a trailing comma for cleaner // diffs. ApiCall.COUNT, // Added to suppress WrongConstant in #recordApiCall @@ -355,8 +356,10 @@ int PRERENDER_URL_WITH_PARAMS = 116; int WEB_STORAGE_DELETE_BROWSING_DATA = 117; int WEB_STORAGE_DELETE_BROWSING_DATA_FOR_SITE = 118; + int SET_SPECULATIVE_LOADING_CONFIG = 119; + // Remember to update AndroidXWebkitApiCall in enums.xml when adding new values here - int COUNT = 119; + int COUNT = 120; } // LINT.ThenChange(/tools/metrics/histograms/metadata/android/enums.xml:AndroidXWebkitApiCall)
diff --git a/android_webview/support_library/java/src/org/chromium/support_lib_glue/SupportLibWebkitToCompatConverterAdapter.java b/android_webview/support_library/java/src/org/chromium/support_lib_glue/SupportLibWebkitToCompatConverterAdapter.java index 120d44dd..f0c07e0 100644 --- a/android_webview/support_library/java/src/org/chromium/support_lib_glue/SupportLibWebkitToCompatConverterAdapter.java +++ b/android_webview/support_library/java/src/org/chromium/support_lib_glue/SupportLibWebkitToCompatConverterAdapter.java
@@ -22,6 +22,7 @@ import com.android.webview.chromium.WebResourceErrorAdapter; import com.android.webview.chromium.WebkitToSharedGlueConverter; +import org.chromium.base.Log; import org.chromium.support_lib_boundary.WebkitToCompatConverterBoundaryInterface; import org.chromium.support_lib_boundary.util.BoundaryInterfaceReflectionUtil; import org.chromium.support_lib_callback_glue.SupportLibSafeBrowsingResponse; @@ -34,14 +35,36 @@ * webkit-object. */ class SupportLibWebkitToCompatConverterAdapter implements WebkitToCompatConverterBoundaryInterface { + + private static final String TAG = "SupportLibAdapter"; + SupportLibWebkitToCompatConverterAdapter() {} // WebSettingsBoundaryInterface @Override public InvocationHandler convertSettings(WebSettings webSettings) { - return BoundaryInterfaceReflectionUtil.createInvocationHandlerFor( - new SupportLibWebSettingsAdapter( - WebkitToSharedGlueConverter.getSettings(webSettings))); + try { + return BoundaryInterfaceReflectionUtil.createInvocationHandlerFor( + new SupportLibWebSettingsAdapter( + WebkitToSharedGlueConverter.getSettings(webSettings))); + } catch (ClassCastException e) { + if (Build.VERSION.SDK_INT == 30 + && "android.webkit.WebSettingsWrapper" + .equals(webSettings.getClass().getCanonicalName())) { + // This is a patch for a bug observed only on OnePlus devices running SDK version + // 30. + // See https://crbug.com/388824130 + Log.e( + TAG, + "Error converting WebSettings to Chrome implementation. All AndroidX method" + + " calls on this WebSettings instance will be no-op calls. See" + + " https://crbug.com/388824130 for more info.", + e); + return BoundaryInterfaceReflectionUtil.createInvocationHandlerFor( + new SupportLibWebSettingsNoOpAdapter()); + } + throw e; + } } // WebResourceRequestBoundaryInterface
diff --git a/ash/BUILD.gn b/ash/BUILD.gn index aa037a2..6ffb5c72 100644 --- a/ash/BUILD.gn +++ b/ash/BUILD.gn
@@ -4964,6 +4964,7 @@ "//components/feature_engagement/public", "//components/history/core/browser", "//components/history/core/test", + "//components/prefs:test_support", "//components/sync_preferences:test_support", "//components/user_education/common", "//components/user_education/views",
diff --git a/ash/accessibility/switch_access/DIR_METADATA b/ash/accessibility/switch_access/DIR_METADATA index 998cb50..7e0cc2b 100644 --- a/ash/accessibility/switch_access/DIR_METADATA +++ b/ash/accessibility/switch_access/DIR_METADATA
@@ -1 +1 @@ -mixins: "//chrome/browser/resources/chromeos/accessibility/switch_access/COMMON_METADATA" +mixins: "//chrome/browser/resources/chromeos/accessibility/switch_access/mv2/COMMON_METADATA"
diff --git a/ash/auth/test/active_session_auth_controller_unittest.cc b/ash/auth/test/active_session_auth_controller_unittest.cc index c185aa8..6ffb8e87 100644 --- a/ash/auth/test/active_session_auth_controller_unittest.cc +++ b/ash/auth/test/active_session_auth_controller_unittest.cc
@@ -20,9 +20,11 @@ #include "chromeos/ash/components/osauth/impl/request/webauthn_auth_request.h" #include "chromeos/ash/components/osauth/public/auth_parts.h" #include "chromeos/ash/components/osauth/public/request/auth_request.h" +#include "components/prefs/testing_pref_service.h" #include "components/user_manager/fake_user_manager.h" #include "components/user_manager/known_user.h" #include "components/user_manager/user_manager.h" +#include "google_apis/gaia/gaia_id.h" #include "third_party/cros_system_api/dbus/cryptohome/dbus-constants.h" #include "ui/base/l10n/l10n_util.h" @@ -31,6 +33,7 @@ namespace { constexpr char kUserEmail[] = "expected_email@example.com"; +constexpr char kFakeGaia[] = "fake_gaia"; constexpr char kExpectedPassword[] = "expected_password"; constexpr char kExpectedPin[] = "123456"; constexpr char kExpectedSalt[] = "test salt"; @@ -93,10 +96,13 @@ } void AddUserToUserManager() { - account_id_ = AccountId::FromUserEmail(kUserEmail); - const user_manager::User* user = user_manager_->AddUser(account_id_); - user_manager_->UserLoggedIn(account_id_, user->username_hash(), false, - false); + account_id_ = AccountId::FromUserEmailGaiaId(kUserEmail, GaiaId(kFakeGaia)); + user_manager_->AddGaiaUser(account_id_, user_manager::UserType::kRegular); + user_manager_->UserLoggedIn( + account_id_, + user_manager::FakeUserManager::GetFakeUsernameHash(account_id_), + /*browser_restart=*/false, + /*is_child=*/false); user_manager_->SetUserCryptohomeDataEphemeral(account_id_, false); }
diff --git a/ash/auth/views/active_session_auth_view_unittest.cc b/ash/auth/views/active_session_auth_view_unittest.cc index a83a2ea..14be6696 100644 --- a/ash/auth/views/active_session_auth_view_unittest.cc +++ b/ash/auth/views/active_session_auth_view_unittest.cc
@@ -18,8 +18,10 @@ #include "base/time/time.h" #include "chromeos/ash/components/cryptohome/auth_factor.h" #include "components/account_id/account_id.h" +#include "components/prefs/testing_pref_service.h" #include "components/user_manager/fake_user_manager.h" #include "components/user_manager/scoped_user_manager.h" +#include "google_apis/gaia/gaia_id.h" #include "ui/events/keycodes/keyboard_code_conversion.h" #include "ui/views/test/views_test_utils.h" #include "ui/views/view.h" @@ -31,6 +33,7 @@ namespace { const char kTestAccount[] = "user@test.com"; +const char kFakeGaia[] = "fake_gaia"; const std::u16string title = u"title"; const std::u16string description = u"description"; @@ -50,9 +53,14 @@ widget_->SetFullscreen(true); widget_->Show(); - AccountId account_id = AccountId::FromUserEmail(kTestAccount); - auto fake_user_manager = std::make_unique<user_manager::FakeUserManager>(); - fake_user_manager->AddUser(account_id); + user_manager::UserManagerImpl::RegisterPrefs(local_state_.registry()); + auto fake_user_manager = + std::make_unique<user_manager::FakeUserManager>(&local_state_); + + AccountId account_id = + AccountId::FromUserEmailGaiaId(kTestAccount, GaiaId(kFakeGaia)); + fake_user_manager->AddGaiaUser(account_id, + user_manager::UserType::kRegular); scoped_user_manager_ = std::make_unique<user_manager::ScopedUserManager>( std::move(fake_user_manager)); @@ -109,6 +117,7 @@ AshTestBase::TearDown(); } + TestingPrefServiceSimple local_state_; std::unique_ptr<views::Widget> widget_; std::unique_ptr<MockActiveSessionAuthViewObserver> mock_observer_; std::unique_ptr<AuthInputRowView::TestApi> test_api_pin_input_;
diff --git a/ash/auth/views/auth_header_view_pixeltest.cc b/ash/auth/views/auth_header_view_pixeltest.cc index 4897349..758daa9 100644 --- a/ash/auth/views/auth_header_view_pixeltest.cc +++ b/ash/auth/views/auth_header_view_pixeltest.cc
@@ -12,8 +12,10 @@ #include "ash/test/ash_test_util.h" #include "ash/test/pixel/ash_pixel_differ.h" #include "ash/test/pixel/ash_pixel_test_init_params.h" +#include "components/prefs/testing_pref_service.h" #include "components/user_manager/fake_user_manager.h" #include "components/user_manager/scoped_user_manager.h" +#include "google_apis/gaia/gaia_id.h" #include "ui/chromeos/styles/cros_tokens_color_mappings.h" #include "ui/views/view.h" #include "ui/views/widget/widget.h" @@ -22,11 +24,11 @@ namespace { -const std::string kUserEmail("user1@gmail.com"); +constexpr char kUserEmail[] = "user1@gmail.com"; +constexpr char kFakeGaia[] = "fake_gaia"; const std::u16string kTitle(u"Auth header view pixeltest title"); const std::u16string kErrorTitle(u"Auth header view pixeltest error"); - const std::u16string kDescription(u"Auth header view pixeltest description"); class AuthHeaderPixelTest : public AshTestBase { @@ -47,14 +49,18 @@ AshTestBase::SetUp(); UpdateDisplay("600x800"); - widget_ = CreateFramelessTestWidget(); - - AccountId account_id = AccountId::FromUserEmail(kUserEmail); - auto fake_user_manager = std::make_unique<user_manager::FakeUserManager>(); - fake_user_manager->AddUser(account_id); + user_manager::UserManagerImpl::RegisterPrefs(local_state_.registry()); + auto fake_user_manager = + std::make_unique<user_manager::FakeUserManager>(&local_state_); + AccountId account_id = + AccountId::FromUserEmailGaiaId(kUserEmail, GaiaId(kFakeGaia)); + fake_user_manager->AddGaiaUser(account_id, + user_manager::UserType::kRegular); scoped_user_manager_ = std::make_unique<user_manager::ScopedUserManager>( std::move(fake_user_manager)); + widget_ = CreateFramelessTestWidget(); + std::unique_ptr<AuthHeaderView> header_view = std::make_unique<AuthHeaderView>(account_id, kTitle, kDescription); @@ -75,9 +81,11 @@ void TearDown() override { header_view_ = nullptr; widget_.reset(); + scoped_user_manager_.reset(); AshTestBase::TearDown(); } + TestingPrefServiceSimple local_state_; std::unique_ptr<views::Widget> widget_; raw_ptr<AuthHeaderView> header_view_ = nullptr; std::unique_ptr<user_manager::ScopedUserManager> scoped_user_manager_;
diff --git a/ash/capture_mode/base_capture_mode_session.h b/ash/capture_mode/base_capture_mode_session.h index 4c91ebf..df422624 100644 --- a/ash/capture_mode/base_capture_mode_session.h +++ b/ash/capture_mode/base_capture_mode_session.h
@@ -146,7 +146,7 @@ // If there's a user nudge currently showing, it will be dismissed forever, // and will no longer be shown to the user. - virtual void MaybeDismissUserNudgeForever() = 0; + virtual void MaybeDismissSunfishRegionNudgeForever() = 0; // Handles changing `root_window_`. For example, moving the mouse cursor to // another display, a display was removed or the game window of the
diff --git a/ash/capture_mode/capture_mode_controller.cc b/ash/capture_mode/capture_mode_controller.cc index b46ac76..c22e71cc 100644 --- a/ash/capture_mode/capture_mode_controller.cc +++ b/ash/capture_mode/capture_mode_controller.cc
@@ -132,6 +132,7 @@ constexpr char kShareToYouTubeURL[] = "https://youtube.com/upload"; +// TODO: crbug.com/388287849 - Clear this pref. // The name of a boolean pref that determines whether we can show the demo tools // user nudge. When this pref is false, it means that we showed the nudge at // some point and the user interacted with the capture mode session UI in such a @@ -139,6 +140,13 @@ constexpr char kCanShowDemoToolsNudge[] = "ash.capture_mode.can_show_demo_tools_nudge"; +// The name of a boolean pref that determines whether we can show the sunfish +// region user nudge. When this pref is false, it means that we showed the nudge +// at some point and the user interacted with the capture mode session UI in +// such a way that the nudge no longer needs to be displayed again. +constexpr char kCanShowSunfishRegionNudge[] = + "ash.capture_mode.can_show_sunfish_region_nudge"; + // The ID for the toast shown when text is copied to clipboard. constexpr char kCaptureModeTextCopiedToastId[] = "capture_mode_text_copied"; @@ -676,12 +684,15 @@ /*default_value=*/base::FilePath()); registry->RegisterBooleanPref(kUsesDefaultCapturePathPrefName, /*default_value=*/false); + // TODO: crbug.com/388287849 - Clear this pref. registry->RegisterBooleanPref(kCanShowDemoToolsNudge, /*default_value=*/true); registry->RegisterBooleanPref(prefs::kSunfishEnabled, /*default_value=*/true); registry->RegisterBooleanPref(capture_mode::kSunfishConsentDisclaimerAccepted, /*default_value=*/false); + registry->RegisterBooleanPref(kCanShowSunfishRegionNudge, + /*default_value=*/true); } SearchResultsPanel* CaptureModeController::GetSearchResultsPanel() const { @@ -961,7 +972,7 @@ camera_controller_->MaybeReparentPreviewWidget(); } -bool CaptureModeController::CanShowUserNudge() const { +bool CaptureModeController::CanShowSunfishRegionNudge() const { auto* session_controller = Shell::Get()->session_controller(); DCHECK(session_controller->IsActiveUserSessionStarted()); @@ -985,12 +996,12 @@ auto* pref_service = session_controller->GetActivePrefService(); DCHECK(pref_service); - return pref_service->GetBoolean(kCanShowDemoToolsNudge); + return pref_service->GetBoolean(kCanShowSunfishRegionNudge); } -void CaptureModeController::DisableUserNudgeForever() { +void CaptureModeController::DisableSunfishRegionNudgeForever() { capture_mode_util::GetActiveUserPrefService()->SetBoolean( - kCanShowDemoToolsNudge, false); + kCanShowSunfishRegionNudge, false); } void CaptureModeController::SetUsesDefaultCaptureFolder(bool value) { @@ -1106,9 +1117,6 @@ DCHECK(!pending_dlp_check_); pending_dlp_check_ = true; capture_mode_session_->OnWaitingForDlpConfirmationStarted(); - if (capture_type != PerformCaptureType::kTextDetection) { - capture_mode_session_->MaybeDismissUserNudgeForever(); - } delegate_->CheckCaptureOperationRestrictionByDlp( capture_params->window, capture_params->bounds, base::BindOnce(
diff --git a/ash/capture_mode/capture_mode_controller.h b/ash/capture_mode/capture_mode_controller.h index 08292e2e..0262fed 100644 --- a/ash/capture_mode/capture_mode_controller.h +++ b/ash/capture_mode/capture_mode_controller.h
@@ -239,12 +239,12 @@ // Returns true if we can show a user nudge animation and a toast message to // alert users any available new features. - bool CanShowUserNudge() const; + bool CanShowSunfishRegionNudge() const; // Disables showing the user nudge from now on. Calling the above - // CanShowUserNudge() will return false for the current active user going - // forward. - void DisableUserNudgeForever(); + // CanShowSunfishRegionNudge() will return false for the current active user + // going forward. + void DisableSunfishRegionNudgeForever(); // Sets whether the currently logged in user selected to use the default // "Downloads" folder as the current save location, even while they already
diff --git a/ash/capture_mode/capture_mode_session.cc b/ash/capture_mode/capture_mode_session.cc index c4900a73..7a64dd1f 100644 --- a/ash/capture_mode/capture_mode_session.cc +++ b/ash/capture_mode/capture_mode_session.cc
@@ -663,7 +663,6 @@ auto* parent = GetParentContainer(current_root_); capture_mode_settings_widget_ = std::make_unique<views::Widget>(); - MaybeDismissUserNudgeForever(); capture_toast_controller_.DismissCurrentToastIfAny(); capture_mode_settings_widget_->Init(CreateWidgetParams( @@ -1264,11 +1263,7 @@ kShellWindowId_UnparentedContainer; if (capture_surface_became_too_small && !is_drag_in_progress_ && !is_parented_to_unparented_container) { - // Since the user nudge toast has lower priority, if the toast for the - // camera preview needs to be shown, user nudge toast should be dismissed - // forever when applicable. - MaybeDismissUserNudgeForever(); - + user_nudge_controller_.reset(); capture_toast_controller_.ShowCaptureToast( CaptureToastType::kCameraPreview); } else { @@ -1286,7 +1281,7 @@ CaptureToastType::kCameraPreview); } -void CaptureModeSession::MaybeDismissUserNudgeForever() { +void CaptureModeSession::MaybeDismissSunfishRegionNudgeForever() { if (user_nudge_controller_) { user_nudge_controller_->set_should_dismiss_nudge_forever(true); } @@ -1413,6 +1408,11 @@ CHECK(action_container_view_); + // If the user is shown an action button, they have successfully selected a + // region and invoked a backend response, so there is no need to show the + // nudge anymore. + MaybeDismissSunfishRegionNudgeForever(); + // Collect the existing buttons and newly requested button, and sort them by // rank. std::vector<std::unique_ptr<ActionButtonView>> action_buttons; @@ -1985,21 +1985,22 @@ capture_label_widget_->GetWindowBoundsInScreen())); } -void CaptureModeSession::MaybeCreateUserNudge() { +void CaptureModeSession::MaybeCreateSunfishRegionNudge() { user_nudge_controller_.reset(); if (!active_behavior_->ShouldShowUserNudge()) { return; } - if (!controller_->CanShowUserNudge()) { + if (!controller_->CanShowSunfishRegionNudge()) { return; } - auto* settings_button = capture_mode_bar_view_->settings_button(); - CHECK(settings_button); + auto* region_button = + capture_mode_bar_view_->GetCaptureSourceView()->region_toggle_button(); + CHECK(region_button); user_nudge_controller_ = - std::make_unique<UserNudgeController>(this, settings_button); + std::make_unique<UserNudgeController>(this, region_button); user_nudge_controller_->SetVisible(true); } @@ -3197,7 +3198,6 @@ auto* parent = GetParentContainer(current_root_); recording_type_menu_widget_ = std::make_unique<views::Widget>(); - MaybeDismissUserNudgeForever(); capture_toast_controller_.DismissCurrentToastIfAny(); recording_type_menu_widget_->Init( @@ -3655,7 +3655,7 @@ // the initialization of the capture session, the type change is not triggered // by the user. capture_mode_bar_view_->OnCaptureTypeChanged(controller_->type()); - MaybeCreateUserNudge(); + MaybeCreateSunfishRegionNudge(); if (active_behavior_->ShouldRegionOverlayBeAllowed()) { capture_region_overlay_controller_ =
diff --git a/ash/capture_mode/capture_mode_session.h b/ash/capture_mode/capture_mode_session.h index 8713cb87..07bfd50 100644 --- a/ash/capture_mode/capture_mode_session.h +++ b/ash/capture_mode/capture_mode_session.h
@@ -181,7 +181,7 @@ bool capture_surface_became_too_small, bool did_bounds_or_visibility_change) override; void OnCameraPreviewDestroyed() override; - void MaybeDismissUserNudgeForever() override; + void MaybeDismissSunfishRegionNudgeForever() override; void MaybeChangeRoot(aura::Window* new_root, bool root_window_will_shutdown) override; std::set<aura::Window*> GetWindowsToIgnoreFromWidgets() override; @@ -267,9 +267,10 @@ bool CanShowWidget(views::Widget* widget) const; // If possible, this recreates and shows the nudge that alerts the user about - // the new folder selection settings. The nudge will be created on top of the - // the settings button on the capture mode bar. - void MaybeCreateUserNudge(); + // to sunfish or scanner features in a regular capture mode region screenshot + // session. The nudge will be created on top of the the region mode button on + // the capture mode bar. + void MaybeCreateSunfishRegionNudge(); // Called to accept and trigger a capture operation. This happens e.g. when // the user hits enter, selects a window/display to capture, or presses on the
diff --git a/ash/capture_mode/capture_mode_toast_controller.cc b/ash/capture_mode/capture_mode_toast_controller.cc index 420696e..9f82067 100644 --- a/ash/capture_mode/capture_mode_toast_controller.cc +++ b/ash/capture_mode/capture_mode_toast_controller.cc
@@ -34,14 +34,11 @@ std::u16string GetCaptureToastTextOnToastType( CaptureToastType capture_toast_type) { - const int nudge_message_id = - IDS_ASH_SCREEN_CAPTURE_SHOW_DEMO_TOOLS_USER_NUDGE; - - const int message_id = - capture_toast_type == CaptureToastType::kCameraPreview - ? IDS_ASH_SCREEN_CAPTURE_SURFACE_TOO_SMALL_USER_NUDGE - : nudge_message_id; - return l10n_util::GetStringUTF16(message_id); + // TODO: crbug.com/388898754 - Upload string for translation. + return capture_toast_type == CaptureToastType::kCameraPreview + ? l10n_util::GetStringUTF16( + IDS_ASH_SCREEN_CAPTURE_SURFACE_TOO_SMALL_USER_NUDGE) + : u"Select anything on your screen to search, copy text, and more"; } // Returns the init params that will be used for the toast widget.
diff --git a/ash/capture_mode/capture_mode_unittests.cc b/ash/capture_mode/capture_mode_unittests.cc index b79a53f..95dc7cf 100644 --- a/ash/capture_mode/capture_mode_unittests.cc +++ b/ash/capture_mode/capture_mode_unittests.cc
@@ -6518,100 +6518,6 @@ } }; -enum class NudgeDismissalCause { - kPressSettingsButton, - kCaptureViaEnterKey, - kCaptureViaClickOnScreen, - kCaptureViaLabelButton, -}; - -// Test fixture to test that various causes that lead to the dismissal of the -// user nudge, they dismiss it forever. -class CaptureModeNudgeDismissalTest - : public CaptureModeSettingsTest, - public ::testing::WithParamInterface<NudgeDismissalCause> { - public: - // Starts a session appropriate for the test param. - CaptureModeController* StartSession() { - switch (GetParam()) { - case NudgeDismissalCause::kPressSettingsButton: - case NudgeDismissalCause::kCaptureViaEnterKey: - case NudgeDismissalCause::kCaptureViaClickOnScreen: - return StartCaptureSession(CaptureModeSource::kFullscreen, - CaptureModeType::kImage); - case NudgeDismissalCause::kCaptureViaLabelButton: - auto* controller = CaptureModeController::Get(); - controller->SetUserCaptureRegion(gfx::Rect(200, 300), /*by_user=*/true); - StartCaptureSession(CaptureModeSource::kRegion, - CaptureModeType::kImage); - return controller; - } - } - - void DoDismissalAction() { - auto* controller = CaptureModeController::Get(); - auto* event_generator = GetEventGenerator(); - switch (GetParam()) { - case NudgeDismissalCause::kPressSettingsButton: - ClickOnView(GetSettingsButton(), event_generator); - break; - case NudgeDismissalCause::kCaptureViaEnterKey: - PressAndReleaseKey(ui::VKEY_RETURN); - EXPECT_FALSE(controller->IsActive()); - break; - case NudgeDismissalCause::kCaptureViaClickOnScreen: - event_generator->MoveMouseToCenterOf(Shell::GetPrimaryRootWindow()); - event_generator->ClickLeftButton(); - EXPECT_FALSE(controller->IsActive()); - break; - case NudgeDismissalCause::kCaptureViaLabelButton: - auto* label_button_widget = - CaptureModeSessionTestApi(controller->capture_mode_session()) - .GetCaptureLabelWidget(); - EXPECT_TRUE(label_button_widget); - ClickOnView(label_button_widget->GetContentsView(), event_generator); - break; - } - } -}; - -TEST_P(CaptureModeNudgeDismissalTest, NudgeDismissedForever) { - auto* controller = StartSession(); - auto* capture_session = - static_cast<CaptureModeSession*>(controller->capture_mode_session()); - ASSERT_EQ(capture_session->session_type(), SessionType::kReal); - auto* capture_toast_controller = capture_session->capture_toast_controller(); - auto* nudge_controller = GetUserNudgeController(); - ASSERT_TRUE(nudge_controller); - EXPECT_TRUE(nudge_controller->is_visible()); - EXPECT_TRUE(capture_toast_controller->capture_toast_widget()); - ASSERT_TRUE(capture_toast_controller->current_toast_type()); - EXPECT_EQ(*(capture_toast_controller->current_toast_type()), - CaptureToastType::kUserNudge); - - // Trigger the action that dismisses the nudge forever, it should be removed - // in this session (if the action doesn't stop the session) and any future - // sessions. - DoDismissalAction(); - if (controller->IsActive()) { - EXPECT_FALSE(GetUserNudgeController()); - // Close the session in preparation for opening a new one. - controller->Stop(); - } - - // Reopen a new session, the nudge should not show anymore. - StartImageRegionCapture(); - EXPECT_FALSE(GetUserNudgeController()); -} - -INSTANTIATE_TEST_SUITE_P( - All, - CaptureModeNudgeDismissalTest, - testing::Values(NudgeDismissalCause::kPressSettingsButton, - NudgeDismissalCause::kCaptureViaEnterKey, - NudgeDismissalCause::kCaptureViaClickOnScreen, - NudgeDismissalCause::kCaptureViaLabelButton)); - TEST_F(CaptureModeSettingsTest, NudgeChangesRootWithBar) { UpdateDisplay("800x700,801+0-800x700"); @@ -6657,7 +6563,9 @@ event_generator->MoveMouseTo(gfx::Point(1000, 500)); event_generator->PressLeftButton(); EXPECT_FALSE(nudge_controller->is_visible()); - event_generator->MoveMouseBy(50, 60); + + // If we release without selecting a valid region (i.e., an empty region), the + // nudge should be visible again. event_generator->ReleaseLeftButton(); EXPECT_EQ(Shell::GetAllRootWindows()[1], session->current_root()); @@ -6690,7 +6598,7 @@ SimulateUserLogin("example@gmail.com", test_case.user_type); auto* controller = StartImageRegionCapture(); - EXPECT_EQ(test_case.can_see_nudge, controller->CanShowUserNudge()); + EXPECT_EQ(test_case.can_see_nudge, controller->CanShowSunfishRegionNudge()); auto* nudge_controller = GetUserNudgeController(); EXPECT_EQ(test_case.can_see_nudge, !!nudge_controller);
diff --git a/ash/capture_mode/null_capture_mode_session.cc b/ash/capture_mode/null_capture_mode_session.cc index f58a259..c122e40 100644 --- a/ash/capture_mode/null_capture_mode_session.cc +++ b/ash/capture_mode/null_capture_mode_session.cc
@@ -100,7 +100,7 @@ void NullCaptureModeSession::OnCameraPreviewDestroyed() {} -void NullCaptureModeSession::MaybeDismissUserNudgeForever() {} +void NullCaptureModeSession::MaybeDismissSunfishRegionNudgeForever() {} void NullCaptureModeSession::MaybeChangeRoot(aura::Window* new_root, bool root_window_will_shutdown) {
diff --git a/ash/capture_mode/null_capture_mode_session.h b/ash/capture_mode/null_capture_mode_session.h index 298decf4..d866ad8 100644 --- a/ash/capture_mode/null_capture_mode_session.h +++ b/ash/capture_mode/null_capture_mode_session.h
@@ -44,7 +44,7 @@ bool capture_surface_became_too_small, bool did_bounds_or_visibility_change) override; void OnCameraPreviewDestroyed() override; - void MaybeDismissUserNudgeForever() override; + void MaybeDismissSunfishRegionNudgeForever() override; void MaybeChangeRoot(aura::Window* new_root, bool root_window_will_shutdown) override; void OnPerformCaptureForSearchStarting(
diff --git a/ash/capture_mode/sunfish_unittest.cc b/ash/capture_mode/sunfish_unittest.cc index ce37508db..785369e 100644 --- a/ash/capture_mode/sunfish_unittest.cc +++ b/ash/capture_mode/sunfish_unittest.cc
@@ -2154,6 +2154,42 @@ EXPECT_TRUE(ToastManager::Get()->IsToastShown(kCaptureModeTextCopiedToastId)); } +// Tests that the Sunfish region nudge is dismissed forever when an action +// button is shown to the user. +TEST_F(SunfishTest, SunfishRegionNudgeDismissedForever) { + auto* controller = + StartCaptureSession(CaptureModeSource::kRegion, CaptureModeType::kImage); + auto* capture_session = + static_cast<CaptureModeSession*>(controller->capture_mode_session()); + ASSERT_EQ(capture_session->session_type(), SessionType::kReal); + + // Starting a regular capture session should show the sunfish region nudge. + auto* capture_toast_controller = capture_session->capture_toast_controller(); + auto* nudge_controller = GetUserNudgeController(); + ASSERT_TRUE(nudge_controller); + EXPECT_TRUE(nudge_controller->is_visible()); + EXPECT_TRUE(capture_toast_controller->capture_toast_widget()); + ASSERT_TRUE(capture_toast_controller->current_toast_type()); + EXPECT_EQ(*(capture_toast_controller->current_toast_type()), + CaptureToastType::kUserNudge); + + // Select a valid region. There should be at least one action button, and the + // sunfish nudge should be dismissed. + SelectCaptureModeRegion(GetEventGenerator(), gfx::Rect(100, 100, 100, 100), + /*release_mouse=*/true, /*verify_region=*/true); + ASSERT_TRUE(capture_session->action_container_widget()); + ASSERT_GE(CaptureModeSessionTestApi(controller->capture_mode_session()) + .GetActionButtons() + .size(), + 1u); + EXPECT_FALSE(GetUserNudgeController()); + + // Stop and restart the session. The nudge should not show again. + controller->Stop(); + StartCaptureSession(CaptureModeSource::kRegion, CaptureModeType::kImage); + EXPECT_FALSE(GetUserNudgeController()); +} + using SunfishMultiDisplayTest = SunfishTest; TEST_F(SunfishMultiDisplayTest, SelectNewRegionAndPanelRoot) {
diff --git a/ash/capture_mode/user_nudge_controller.cc b/ash/capture_mode/user_nudge_controller.cc index 4c4e9907..b69e58a 100644 --- a/ash/capture_mode/user_nudge_controller.cc +++ b/ash/capture_mode/user_nudge_controller.cc
@@ -79,7 +79,7 @@ UserNudgeController::~UserNudgeController() { if (should_dismiss_nudge_forever_) - CaptureModeController::Get()->DisableUserNudgeForever(); + CaptureModeController::Get()->DisableSunfishRegionNudgeForever(); capture_session_->capture_toast_controller()->MaybeDismissCaptureToast( CaptureToastType::kUserNudge, /*animate=*/false);
diff --git a/ash/constants/ash_features.cc b/ash/constants/ash_features.cc index 869d90d..d3369c30 100644 --- a/ash/constants/ash_features.cc +++ b/ash/constants/ash_features.cc
@@ -1636,10 +1636,10 @@ "KerberosRememberPasswordByDefault", base::FEATURE_ENABLED_BY_DEFAULT); -// Enables System Web Apps for the Kiosk session. -BASE_FEATURE(kKioskEnableSystemWebApps, - "KioskEnableSystemWebApps", - base::FEATURE_DISABLED_BY_DEFAULT); +// Enables IME button in the floating accessibility menu for the Kiosk session. +BASE_FEATURE(kKioskEnableImeButton, + "KioskEnableImeButton", + base::FEATURE_ENABLED_BY_DEFAULT); // Enables automatic downloading and installing fonts via language packs, based // on the user's preferences.
diff --git a/ash/constants/ash_features.h b/ash/constants/ash_features.h index c68da15..baf594dd 100644 --- a/ash/constants/ash_features.h +++ b/ash/constants/ash_features.h
@@ -554,7 +554,7 @@ BASE_DECLARE_FEATURE(kJapaneseOSSettings); COMPONENT_EXPORT(ASH_CONSTANTS) BASE_DECLARE_FEATURE(kKerberosRememberPasswordByDefault); -COMPONENT_EXPORT(ASH_CONSTANTS) BASE_DECLARE_FEATURE(kKioskEnableSystemWebApps); +COMPONENT_EXPORT(ASH_CONSTANTS) BASE_DECLARE_FEATURE(kKioskEnableImeButton); COMPONENT_EXPORT(ASH_CONSTANTS) BASE_DECLARE_FEATURE(kLanguagePacksFonts); COMPONENT_EXPORT(ASH_CONSTANTS)
diff --git a/ash/display/display_manager_unittest.cc b/ash/display/display_manager_unittest.cc index d8603912e..674235b 100644 --- a/ash/display/display_manager_unittest.cc +++ b/ash/display/display_manager_unittest.cc
@@ -39,7 +39,6 @@ #include "base/run_loop.h" #include "base/strings/string_number_conversions.h" #include "base/strings/stringprintf.h" -#include "base/test/scoped_feature_list.h" #include "build/build_config.h" #include "chromeos/ui/base/app_types.h" #include "chromeos/ui/base/window_properties.h" @@ -50,7 +49,6 @@ #include "ui/base/l10n/l10n_util.h" #include "ui/compositor/layer.h" #include "ui/display/display.h" -#include "ui/display/display_features.h" #include "ui/display/display_layout.h" #include "ui/display/display_layout_builder.h" #include "ui/display/display_observer.h" @@ -326,10 +324,6 @@ check_root_window_on_destruction_ = false; } - base::test::ScopedFeatureList& scoped_feature_list() { - return scoped_features_; - } - private: vector<display::Display> changed_; vector<display::Display> added_; @@ -347,18 +341,10 @@ base::ScopedObservation<display::DisplayManager, display::DisplayManagerObserver> display_manager_observation_{this}; - - // Currently `display::features::kRoundedDisplay` feature is used during the - // `ash::Shell` shutdown as we call `AshTestBase::TearDown()`, therefore - // `scoped_features_` needs to outlive the call. - base::test::ScopedFeatureList scoped_features_; }; TEST_F(DisplayManagerTest, RoundedDisplayProviderIsOnlyCreatedForEachRoundedDisplay) { - scoped_feature_list().InitAndEnableFeature( - display::features::kRoundedDisplay); - WindowTreeHostManager* window_tree_host_manager = Shell::Get()->window_tree_host_manager(); @@ -378,9 +364,6 @@ } TEST_F(DisplayManagerTest, RoundedDisplayProviderIsRemovedForRemovedDisplay) { - scoped_feature_list().InitAndEnableFeature( - display::features::kRoundedDisplay); - WindowTreeHostManager* window_tree_host_manager = Shell::Get()->window_tree_host_manager();
diff --git a/ash/display/window_tree_host_manager.cc b/ash/display/window_tree_host_manager.cc index 701ad69..97f0830 100644 --- a/ash/display/window_tree_host_manager.cc +++ b/ash/display/window_tree_host_manager.cc
@@ -48,11 +48,9 @@ #include "ui/base/class_property.h" #include "ui/base/ime/init/input_method_factory.h" #include "ui/base/l10n/l10n_util.h" -#include "ui/base/ui_base_features.h" #include "ui/compositor/compositor.h" #include "ui/compositor/layer.h" #include "ui/display/display.h" -#include "ui/display/display_features.h" #include "ui/display/display_layout.h" #include "ui/display/display_transform.h" #include "ui/display/manager/display_configurator.h" @@ -336,9 +334,7 @@ } void WindowTreeHostManager::ShutdownRoundedDisplays() { - if (display::features::IsRoundedDisplayEnabled()) { - rounded_display_providers_map_.clear(); - } + rounded_display_providers_map_.clear(); } void WindowTreeHostManager::Shutdown() { @@ -402,13 +398,11 @@ } } - if (display::features::IsRoundedDisplayEnabled()) { - // We need to initialize rounded display providers after we have initialized - // the root controllers for each display. - for (size_t i = 0; i < display_manager->GetNumDisplays(); ++i) { - const display::Display& display = display_manager->GetDisplayAt(i); - EnableRoundedCorners(display); - } + // We need to initialize rounded display providers after we have initialized + // the root controllers for each display. + for (size_t i = 0; i < display_manager->GetNumDisplays(); ++i) { + const display::Display& display = display_manager->GetDisplayAt(i); + EnableRoundedCorners(display); } } @@ -663,9 +657,7 @@ RootWindowController::CreateForSecondaryDisplay(ash_host); } - if (display::features::IsRoundedDisplayEnabled()) { - EnableRoundedCorners(display); - } + EnableRoundedCorners(display); } void WindowTreeHostManager::DeleteHost(AshWindowTreeHost* host_to_delete) { @@ -696,9 +688,7 @@ AshWindowTreeHost* host_to_delete = window_tree_hosts_[display.id()]; CHECK(host_to_delete) << display.ToString(); - if (display::features::IsRoundedDisplayEnabled()) { - RemoveRoundedDisplayProvider(display); - } + RemoveRoundedDisplayProvider(display); // When the primary root window's display is removed, move the primary // root to the other display. @@ -777,12 +767,10 @@ DM::DISPLAY_METRIC_DEVICE_SCALE_FACTOR); SetDisplayPropertiesOnHost(ash_host, display, needs_redraw); - if (display::features::IsRoundedDisplayEnabled()) { - // We need to update the surface on which rounded display mask textures are - // rendered when ever the display device scale factor or display rotation - // changes. - MaybeUpdateRoundedDisplaySurface(display); - } + // We need to update the surface on which rounded display mask textures are + // rendered when ever the display device scale factor or display rotation + // changes. + MaybeUpdateRoundedDisplaySurface(display); } void WindowTreeHostManager::EnableRoundedCorners(
diff --git a/ash/display/window_tree_host_manager_unittest.cc b/ash/display/window_tree_host_manager_unittest.cc index b976ac8c..51f4397 100644 --- a/ash/display/window_tree_host_manager_unittest.cc +++ b/ash/display/window_tree_host_manager_unittest.cc
@@ -27,7 +27,6 @@ #include "base/run_loop.h" #include "base/strings/stringprintf.h" #include "base/test/metrics/histogram_tester.h" -#include "base/test/scoped_feature_list.h" #include "ui/aura/client/cursor_shape_client.h" #include "ui/aura/client/focus_change_observer.h" #include "ui/aura/client/focus_client.h" @@ -38,7 +37,6 @@ #include "ui/base/cursor/cursor.h" #include "ui/compositor/layer.h" #include "ui/display/display.h" -#include "ui/display/display_features.h" #include "ui/display/display_layout.h" #include "ui/display/display_layout_builder.h" #include "ui/display/display_observer.h" @@ -405,7 +403,6 @@ base::CommandLine::ForCurrentProcess()->AppendSwitchASCII( switches::kHostWindowBounds, "1920x1080~" + ToDisplaySpecRadiiString(kTestRoundedPanelRadii)); - scoped_features_.InitAndEnableFeature(display::features::kRoundedDisplay); AshTestBase::SetUp(); display::Display primary_display = @@ -415,10 +412,6 @@ } protected: - // Currently `display::features::kRoundedDisplay` feature is used during the - // `ash::Shell` shutdown as we call `AshTestBase::TearDown()`, therefore - // `scoped_features_` needs to outlive the call. - base::test::ScopedFeatureList scoped_features_; // ManagedDisplayInfo of the display initialized on the // `AshTestBase::SetUp()`.
diff --git a/ash/keyboard/ui/resources/keyboard_resource_util.cc b/ash/keyboard/ui/resources/keyboard_resource_util.cc index cc92650..74870399 100644 --- a/ash/keyboard/ui/resources/keyboard_resource_util.cc +++ b/ash/keyboard/ui/resources/keyboard_resource_util.cc
@@ -6,6 +6,7 @@ #include "ash/keyboard/ui/grit/keyboard_resources.h" #include "ash/keyboard/ui/grit/keyboard_resources_map.h" +#include "base/containers/span.h" #include "base/files/file_path.h" #include "base/path_service.h" #include "ui/base/resource/resource_bundle.h" @@ -15,11 +16,11 @@ const char kKeyboardURL[] = "chrome://keyboard"; const char kKeyboardHost[] = "keyboard"; -const webui::ResourcePath* GetKeyboardExtensionResources(size_t* size) { +base::span<const webui::ResourcePath> GetKeyboardExtensionResources() { // This looks a lot like the contents of a resource map; however it is // necessary to have a custom path for the extension path, so the resource // map cannot be used directly. - static const webui::ResourcePath kKeyboardResources[] = { + static constexpr webui::ResourcePath kKeyboardResources[] = { {"keyboard/locales/en.js", IDR_KEYBOARD_LOCALES_EN}, {"keyboard/config/emoji.js", IDR_KEYBOARD_CONFIG_EMOJI}, {"keyboard/config/hwt.js", IDR_KEYBOARD_CONFIG_HWT}, @@ -92,7 +93,7 @@ {"keyboard/sounds/keypress-standard.wav", IDR_KEYBOARD_SOUNDS_KEYPRESS_STANDARD}, }; - *size = std::size(kKeyboardResources); + return kKeyboardResources; }
diff --git a/ash/keyboard/ui/resources/keyboard_resource_util.h b/ash/keyboard/ui/resources/keyboard_resource_util.h index cc05810..4a5ac30 100644 --- a/ash/keyboard/ui/resources/keyboard_resource_util.h +++ b/ash/keyboard/ui/resources/keyboard_resource_util.h
@@ -8,6 +8,7 @@ #include <stddef.h> #include "ash/keyboard/ui/keyboard_export.h" +#include "base/containers/span.h" #include "ui/base/webui/resource_path.h" namespace keyboard { @@ -18,10 +19,9 @@ // The host of the keyboard extension URL. KEYBOARD_EXPORT extern const char kKeyboardHost[]; -// Get the list of keyboard resources. |size| is populated with the number of -// resources in the returned array. -KEYBOARD_EXPORT const webui::ResourcePath* GetKeyboardExtensionResources( - size_t* size); +// Get the list of keyboard resources. +KEYBOARD_EXPORT base::span<const webui::ResourcePath> +GetKeyboardExtensionResources(); // Initializes the keyboard module. This includes adding the necessary pak files // for loading resources used in for the virtual keyboard. This becomes a no-op
diff --git a/ash/login/ui/local_authentication_request_controller_impl_pixeltest.cc b/ash/login/ui/local_authentication_request_controller_impl_pixeltest.cc index f697d54..29f6a40a 100644 --- a/ash/login/ui/local_authentication_request_controller_impl_pixeltest.cc +++ b/ash/login/ui/local_authentication_request_controller_impl_pixeltest.cc
@@ -30,9 +30,11 @@ #include "chromeos/ash/components/login/auth/public/cryptohome_key_constants.h" #include "chromeos/ash/components/login/auth/public/key.h" #include "chromeos/ash/components/login/auth/public/user_context.h" +#include "components/prefs/testing_pref_service.h" #include "components/session_manager/session_manager_types.h" #include "components/user_manager/fake_user_manager.h" #include "components/user_manager/scoped_user_manager.h" +#include "google_apis/gaia/gaia_id.h" #include "ui/chromeos/resources/grit/ui_chromeos_resources.h" #include "ui/events/base_event_utils.h" #include "ui/views/controls/button/label_button.h" @@ -45,8 +47,9 @@ using ::cryptohome::KeyLabel; -const char kTestAccount[] = "user@test.com"; -const char kExpectedPassword[] = "qwerty"; +constexpr char kTestAccount[] = "user@test.com"; +constexpr char kFakeGaia[] = "fake_gaia"; +constexpr char kExpectedPassword[] = "qwerty"; class LocalAuthenticationRequestControllerImplPixelTest : public AshTestBase { public: @@ -82,11 +85,16 @@ UserDataAuthClient::InitializeFake(); SystemSaltGetter::Initialize(); - test_account_id_ = AccountId::FromUserEmail(kTestAccount); + test_account_id_ = + AccountId::FromUserEmailGaiaId(kTestAccount, GaiaId(kFakeGaia)); SetExpectedCredentialsWithDbusClient(test_account_id_, kExpectedPassword); - auto fake_user_manager = std::make_unique<user_manager::FakeUserManager>(); - fake_user_manager->AddUser(test_account_id_); + + user_manager::UserManagerImpl::RegisterPrefs(local_state_.registry()); + auto fake_user_manager = + std::make_unique<user_manager::FakeUserManager>(&local_state_); + fake_user_manager->AddGaiaUser(test_account_id_, + user_manager::UserType::kRegular); scoped_user_manager_ = std::make_unique<user_manager::ScopedUserManager>( std::move(fake_user_manager)); } @@ -193,6 +201,7 @@ } base::test::ScopedFeatureList scoped_features_; + TestingPrefServiceSimple local_state_; // Number of times the view was dismissed with close button. int close_action_ = 0;
diff --git a/ash/login/ui/local_authentication_request_controller_impl_unittest.cc b/ash/login/ui/local_authentication_request_controller_impl_unittest.cc index d57e09fd..376e8e66 100644 --- a/ash/login/ui/local_authentication_request_controller_impl_unittest.cc +++ b/ash/login/ui/local_authentication_request_controller_impl_unittest.cc
@@ -37,10 +37,12 @@ #include "chromeos/ash/components/login/auth/public/cryptohome_key_constants.h" #include "chromeos/ash/components/login/auth/public/key.h" #include "chromeos/ash/components/login/auth/public/user_context.h" +#include "components/prefs/testing_pref_service.h" #include "components/session_manager/session_manager_types.h" #include "components/user_manager/fake_user_manager.h" #include "components/user_manager/known_user.h" #include "components/user_manager/scoped_user_manager.h" +#include "google_apis/gaia/gaia_id.h" #include "ui/base/l10n/l10n_util.h" #include "ui/events/base_event_utils.h" #include "ui/views/accessibility/view_accessibility.h" @@ -54,9 +56,10 @@ using ::cryptohome::KeyLabel; -const char kTestAccount[] = "user@test.com"; -const char kExpectedPassword[] = "qwerty"; -const char kExpectedPin[] = "150504"; +constexpr char kTestAccount[] = "user@test.com"; +constexpr char kFakeGaia[] = "fake_gaia"; +constexpr char kExpectedPassword[] = "qwerty"; +constexpr char kExpectedPin[] = "150504"; class LocalAuthenticationRequestControllerImplTest : public LoginTestBase { public: @@ -83,11 +86,16 @@ FakeCryptohomeMiscClient::GetStubSystemSalt()); UserDataAuthClient::InitializeFake(); SystemSaltGetter::Initialize(); - test_account_id_ = AccountId::FromUserEmail(kTestAccount); + test_account_id_ = + AccountId::FromUserEmailGaiaId(kTestAccount, GaiaId(kFakeGaia)); SetExpectedCredentialsWithDbusClient(test_account_id_, kExpectedPassword); - auto fake_user_manager = std::make_unique<user_manager::FakeUserManager>(); - fake_user_manager->AddUser(test_account_id_); + + user_manager::UserManagerImpl::RegisterPrefs(local_state_.registry()); + auto fake_user_manager = + std::make_unique<user_manager::FakeUserManager>(&local_state_); + fake_user_manager->AddGaiaUser(test_account_id_, + user_manager::UserType::kRegular); scoped_user_manager_ = std::make_unique<user_manager::ScopedUserManager>( std::move(fake_user_manager)); } @@ -193,6 +201,9 @@ base::RunLoop().RunUntilIdle(); } + base::test::ScopedFeatureList scoped_features_; + TestingPrefServiceSimple local_state_; + // Number of times the view was dismissed with close button. int close_action_ = 0; @@ -207,8 +218,6 @@ // Container object for the fake user manager for tests. std::unique_ptr<user_manager::ScopedUserManager> scoped_user_manager_; - - base::test::ScopedFeatureList scoped_features_; }; // Tests local authentication dialog showing/hiding and focus behavior for
diff --git a/ash/rounded_display/rounded_display_pixeltest.cc b/ash/rounded_display/rounded_display_pixeltest.cc index 06a3160..e3fb3fe6 100644 --- a/ash/rounded_display/rounded_display_pixeltest.cc +++ b/ash/rounded_display/rounded_display_pixeltest.cc
@@ -8,10 +8,8 @@ #include "ash/test/ash_test_util.h" #include "ash/test/pixel/ash_pixel_differ.h" #include "base/notreached.h" -#include "base/test/scoped_feature_list.h" #include "third_party/skia/include/core/SkColor.h" #include "ui/display/display.h" -#include "ui/display/display_features.h" #include "ui/display/display_switches.h" #include "ui/gfx/geometry/rect.h" @@ -67,7 +65,6 @@ ToDisplaySpecDeviceScaleFactorString(device_scale_factor()) + ToDisplaySpecRotationString(rotation()) + ToDisplaySpecRadiiString(kRoundedDisplayRadii)); - scoped_features_.InitAndEnableFeature(display::features::kRoundedDisplay); AshTestBase::SetUp(); } std::optional<pixel_test::InitParams> CreatePixelTestInitParams() @@ -80,8 +77,6 @@ display::Display::Rotation rotation() const { return std::get<1>(GetParam()); } - - base::test::ScopedFeatureList scoped_features_; }; // Verifies that mask textures are correctly drawn on the display.
diff --git a/ash/system/accessibility/switch_access/DIR_METADATA b/ash/system/accessibility/switch_access/DIR_METADATA index 998cb50..7e0cc2b 100644 --- a/ash/system/accessibility/switch_access/DIR_METADATA +++ b/ash/system/accessibility/switch_access/DIR_METADATA
@@ -1 +1 @@ -mixins: "//chrome/browser/resources/chromeos/accessibility/switch_access/COMMON_METADATA" +mixins: "//chrome/browser/resources/chromeos/accessibility/switch_access/mv2/COMMON_METADATA"
diff --git a/ash/system/cast/media_cast_list_view.cc b/ash/system/cast/media_cast_list_view.cc index 064765ad..33e3e03 100644 --- a/ash/system/cast/media_cast_list_view.cc +++ b/ash/system/cast/media_cast_list_view.cc
@@ -156,10 +156,10 @@ // Set casting icon on left side. auto image_view = base::WrapUnique( TrayPopupUtils::CreateMainImageView(/*use_wide_layout=*/false)); - image_view->SetImage(gfx::CreateVectorIcon( + image_view->SetImage(ui::ImageModel::FromVectorIcon( on_stop_casting_callback_.is_null() ? kQuickSettingsCastIcon : kQuickSettingsCastConnectedIcon, - GetColorProvider()->GetColor(cros_tokens::kCrosSysOnSurface))); + cros_tokens::kCrosSysOnSurface)); image_view->SetBackground(views::CreateSolidBackground(SK_ColorTRANSPARENT)); casting_header->AddView(TriView::Container::START, image_view.release());
diff --git a/ash/system/focus_mode/focus_mode_tray.cc b/ash/system/focus_mode/focus_mode_tray.cc index 403f1af..81d095c4 100644 --- a/ash/system/focus_mode/focus_mode_tray.cc +++ b/ash/system/focus_mode/focus_mode_tray.cc
@@ -546,7 +546,8 @@ SkColor color = GetColorProvider()->GetColor( is_active() ? cros_tokens::kCrosSysSystemOnPrimaryContainer : cros_tokens::kCrosSysOnSurface); - image_view_->SetImage(CreateVectorIcon(kFocusModeLampIcon, color)); + image_view_->SetImage( + ui::ImageModel::FromVectorIcon(kFocusModeLampIcon, color)); } void FocusModeTray::FocusModeIconActivated(const ui::Event& event) {
diff --git a/ash/system/focus_mode/sounds/playlist_image_button.cc b/ash/system/focus_mode/sounds/playlist_image_button.cc index 318a9b58..f82bd27 100644 --- a/ash/system/focus_mode/sounds/playlist_image_button.cc +++ b/ash/system/focus_mode/sounds/playlist_image_button.cc
@@ -151,7 +151,7 @@ } is_default_image_ = false; - image_view_->SetImage(image); + image_view_->SetImage(ui::ImageModel::FromImageSkia(image)); } void PlaylistImageButton::OnSetTooltipText(const std::u16string& tooltip_text) { @@ -184,7 +184,8 @@ canvas.drawColor( SkColorSetA(color_provider->GetColor(cros_tokens::kCrosSysOnSurface), kDefaultImageAlpha)); - image_view_->SetImage(gfx::ImageSkia::CreateFrom1xBitmap(std::move(bitmap))); + image_view_->SetImage(ui::ImageModel::FromImageSkia( + gfx::ImageSkia::CreateFrom1xBitmap(std::move(bitmap)))); } BEGIN_METADATA(PlaylistImageButton)
diff --git a/ash/system/network/network_list_network_item_view.cc b/ash/system/network/network_list_network_item_view.cc index c754d05..4a0aeb7 100644 --- a/ash/system/network/network_list_network_item_view.cc +++ b/ash/system/network/network_list_network_item_view.cc
@@ -324,8 +324,8 @@ void NetworkListNetworkItemView::NetworkIconChanged() { DCHECK(views::IsViewClass<views::ImageView>(left_view())); static_cast<views::ImageView*>(left_view()) - ->SetImage( - GetNetworkImageForNetwork(GetColorProvider(), network_properties_)); + ->SetImage(ui::ImageModel::FromImageSkia( + GetNetworkImageForNetwork(GetColorProvider(), network_properties_))); } void NetworkListNetworkItemView::OnThemeChanged() { @@ -411,7 +411,7 @@ const SkColor icon_color = AshColorProvider::Get()->GetContentLayerColor( AshColorProvider::ContentLayerType::kIconColorPrimary); controlled_icon->SetImage( - gfx::CreateVectorIcon(kSystemMenuBusinessIcon, icon_color)); + ui::ImageModel::FromVectorIcon(kSystemMenuBusinessIcon, icon_color)); AddRightView(controlled_icon.release()); }
diff --git a/ash/system/network/network_list_network_item_view_unittest.cc b/ash/system/network/network_list_network_item_view_unittest.cc index a63e8c29..5ad554a 100644 --- a/ash/system/network/network_list_network_item_view_unittest.cc +++ b/ash/system/network/network_list_network_item_view_unittest.cc
@@ -797,7 +797,7 @@ // Override current icon with an empty icon, check it is updated when // animation starts. static_cast<views::ImageView*>(network_list_network_item_view()->left_view()) - ->SetImage(gfx::ImageSkia()); + ->SetImage(ui::ImageModel()); EXPECT_TRUE(static_cast<views::ImageView*>( network_list_network_item_view()->left_view())
diff --git a/ash/system/network/network_list_view_controller_impl.cc b/ash/system/network/network_list_view_controller_impl.cc index 6807caf..1c63c5f 100644 --- a/ash/system/network/network_list_view_controller_impl.cc +++ b/ash/system/network/network_list_view_controller_impl.cc
@@ -583,7 +583,7 @@ // Set 'info' icon on left side. std::unique_ptr<views::ImageView> image_view = base::WrapUnique( TrayPopupUtils::CreateMainImageView(/*use_wide_layout=*/false)); - image_view->SetImage(gfx::CreateVectorIcon( + image_view->SetImage(ui::ImageModel::FromVectorIcon( use_managed_icon ? kSystemTrayManagedIcon : kSystemMenuInfoIcon, AshColorProvider::Get()->GetContentLayerColor( AshColorProvider::ContentLayerType::kIconColorPrimary)));
diff --git a/ash/system/network/network_tray_view.cc b/ash/system/network/network_tray_view.cc index 6a9bc1c..ae5277f 100644 --- a/ash/system/network/network_tray_view.cc +++ b/ash/system/network/network_tray_view.cc
@@ -85,7 +85,7 @@ void NetworkTrayView::UpdateIcon(bool tray_icon_visible, const gfx::ImageSkia& image) { - image_view()->SetImage(image); + image_view()->SetImage(ui::ImageModel::FromImageSkia(image)); SetVisible(tray_icon_visible); SchedulePaint(); }
diff --git a/ash/system/notification_center/stacked_notification_bar.cc b/ash/system/notification_center/stacked_notification_bar.cc index f47320d..f524fa4 100644 --- a/ash/system/notification_center/stacked_notification_bar.cc +++ b/ash/system/notification_center/stacked_notification_bar.cc
@@ -100,11 +100,11 @@ accent_color); if (masked_small_icon.IsEmpty()) { - SetImage(gfx::CreateVectorIcon(message_center::kProductIcon, - kStackedNotificationIconSize, - accent_color)); + SetImage(ui::ImageModel::FromVectorIcon(message_center::kProductIcon, + accent_color, + kStackedNotificationIconSize)); } else { - SetImage(masked_small_icon.AsImageSkia()); + SetImage(ui::ImageModel::FromImage(masked_small_icon)); } }
diff --git a/ash/system/notification_center/views/notifier_settings_view.cc b/ash/system/notification_center/views/notifier_settings_view.cc index 360106c4..1c04c29 100644 --- a/ash/system/notification_center/views/notifier_settings_view.cc +++ b/ash/system/notification_center/views/notifier_settings_view.cc
@@ -417,9 +417,9 @@ SetLayoutManager(std::move(layout)); views::ImageView* icon = new views::ImageView(); - icon->SetImage(gfx::CreateVectorIcon(kNotificationCenterEmptyIcon, - message_center_style::kEmptyIconSize, - text_color)); + icon->SetImage( + ui::ImageModel::FromVectorIcon(kNotificationCenterEmptyIcon, text_color, + message_center_style::kEmptyIconSize)); icon->SetBorder( views::CreateEmptyBorder(message_center_style::kEmptyIconPadding)); AddChildView(icon); @@ -540,10 +540,11 @@ private: void OnThemeChanged() override { views::ImageView::OnThemeChanged(); - SetImage( - gfx::CreateVectorIcon(kSystemTrayAppBadgingIcon, kMenuIconSize, - AshColorProvider::Get()->GetContentLayerColor( - ContentLayerType::kIconColorPrimary))); + SetImage(ui::ImageModel::FromVectorIcon( + kSystemTrayAppBadgingIcon, + AshColorProvider::Get()->GetContentLayerColor( + ContentLayerType::kIconColorPrimary), + kMenuIconSize)); } }; @@ -630,12 +631,13 @@ void NotifierSettingsView::NotifierButton::UpdateIconImage( const gfx::ImageSkia& icon) { if (icon.isNull()) { - icon_view_->SetImage( - gfx::CreateVectorIcon(message_center::kProductIcon, kEntryIconSize, - AshColorProvider::Get()->GetContentLayerColor( - ContentLayerType::kIconColorPrimary))); + icon_view_->SetImage(ui::ImageModel::FromVectorIcon( + message_center::kProductIcon, + AshColorProvider::Get()->GetContentLayerColor( + ContentLayerType::kIconColorPrimary), + kEntryIconSize)); } else { - icon_view_->SetImage(icon); + icon_view_->SetImage(ui::ImageModel::FromImageSkia(icon)); icon_view_->SetImageSize(gfx::Size(kEntryIconSize, kEntryIconSize)); } GridChanged(); @@ -796,10 +798,11 @@ if (!GetEnabled()) { auto policy_enforced_icon = std::make_unique<views::ImageView>(); - policy_enforced_icon->SetImage( - gfx::CreateVectorIcon(kSystemMenuBusinessIcon, kEntryIconSize, - AshColorProvider::Get()->GetContentLayerColor( - ContentLayerType::kIconColorPrimary))); + policy_enforced_icon->SetImage(ui::ImageModel::FromVectorIcon( + kSystemMenuBusinessIcon, + AshColorProvider::Get()->GetContentLayerColor( + ContentLayerType::kIconColorPrimary), + kEntryIconSize)); layout->AddColumn( views::LayoutAlignment::kCenter, views::LayoutAlignment::kCenter, views::TableLayout::kFixedSize, views::TableLayout::ColumnSize::kFixed, @@ -837,8 +840,8 @@ // Row for the app badging toggle button. auto app_badging_icon = std::make_unique<AdaptiveBadgingIcon>(); - app_badging_icon->SetImage(gfx::CreateVectorIcon(kSystemTrayAppBadgingIcon, - kMenuIconSize, icon_color)); + app_badging_icon->SetImage(ui::ImageModel::FromVectorIcon( + kSystemTrayAppBadgingIcon, icon_color, kMenuIconSize)); auto app_badging_label = std::make_unique<views::Label>(l10n_util::GetStringUTF16( IDS_ASH_MESSAGE_CENTER_APP_BADGING_BUTTON_TOOLTIP)); @@ -958,11 +961,11 @@ const SkColor icon_color = AshColorProvider::Get()->GetContentLayerColor( ContentLayerType::kIconColorPrimary); if (is_quiet_mode) { - quiet_mode_icon_->SetImage(gfx::CreateVectorIcon( - kSystemTrayDoNotDisturbIcon, kMenuIconSize, icon_color)); + quiet_mode_icon_->SetImage(ui::ImageModel::FromVectorIcon( + kSystemTrayDoNotDisturbIcon, icon_color, kMenuIconSize)); } else { - quiet_mode_icon_->SetImage(gfx::CreateVectorIcon( - kDoNotDisturbDisabledIcon, kMenuIconSize, icon_color)); + quiet_mode_icon_->SetImage(ui::ImageModel::FromVectorIcon( + kDoNotDisturbDisabledIcon, icon_color, kMenuIconSize)); } }
diff --git a/ash/system/overview/overview_button_tray.cc b/ash/system/overview/overview_button_tray.cc index ae32856..3a5af702 100644 --- a/ash/system/overview/overview_button_tray.cc +++ b/ash/system/overview/overview_button_tray.cc
@@ -141,7 +141,7 @@ void OverviewButtonTray::ClickedOutsideBubble(const ui::LocatedEvent& event) {} void OverviewButtonTray::UpdateTrayItemColor(bool is_active) { - icon_->SetImage(GetIconImage()); + icon_->SetImage(ui::ImageModel::FromImageSkia(GetIconImage())); } void OverviewButtonTray::HandleLocaleChange() {} @@ -152,7 +152,7 @@ void OverviewButtonTray::OnThemeChanged() { TrayBackgroundView::OnThemeChanged(); - icon_->SetImage(GetIconImage()); + icon_->SetImage(ui::ImageModel::FromImageSkia(GetIconImage())); } void OverviewButtonTray::HideBubble(const TrayBubbleView* bubble_view) {
diff --git a/ash/system/palette/palette_tray.cc b/ash/system/palette/palette_tray.cc index c802a62..8194624 100644 --- a/ash/system/palette/palette_tray.cc +++ b/ash/system/palette/palette_tray.cc
@@ -614,10 +614,10 @@ color = GetColorProvider()->GetColor( is_active() ? cros_tokens::kCrosSysSystemOnPrimaryContainer : cros_tokens::kCrosSysOnSurface); - icon_->SetImage(CreateVectorIcon( + icon_->SetImage(ui::ImageModel::FromVectorIcon( palette_tool_manager_->GetActiveTrayIcon( palette_tool_manager_->GetActiveTool(PaletteGroup::MODE)), - kTrayIconSize, color)); + color, kTrayIconSize)); } void PaletteTray::OnPaletteEnabledPrefChanged() {
diff --git a/ash/system/palette/stylus_battery_view.cc b/ash/system/palette/stylus_battery_view.cc index cbbb59f..fcb1686 100644 --- a/ash/system/palette/stylus_battery_view.cc +++ b/ash/system/palette/stylus_battery_view.cc
@@ -24,7 +24,8 @@ icon_ = AddChildView(std::make_unique<views::ImageView>()); if (stylus_battery_delegate_.IsBatteryStatusStale()) { - icon_->SetImage(stylus_battery_delegate_.GetBatteryStatusUnknownImage()); + icon_->SetImage(ui::ImageModel::FromImageSkia( + stylus_battery_delegate_.GetBatteryStatusUnknownImage())); icon_->SetTooltipText( l10n_util::GetStringUTF16(IDS_ASH_STYLUS_BATTERY_STATUS_STALE_TOOLTIP)); } @@ -52,8 +53,8 @@ SetVisible(stylus_battery_delegate_.ShouldShowBatteryStatus()); } - icon_->SetImage( - stylus_battery_delegate_.GetBatteryImage(icon_->GetColorProvider())); + icon_->SetImage(ui::ImageModel::FromImageSkia( + stylus_battery_delegate_.GetBatteryImage(icon_->GetColorProvider()))); label_->SetVisible(stylus_battery_delegate_.IsBatteryLevelLow() && stylus_battery_delegate_.IsBatteryStatusEligible() && !stylus_battery_delegate_.IsBatteryStatusStale() &&
diff --git a/ash/system/privacy_screen/privacy_screen_toast_view.cc b/ash/system/privacy_screen/privacy_screen_toast_view.cc index d105813..bda5499 100644 --- a/ash/system/privacy_screen/privacy_screen_toast_view.cc +++ b/ash/system/privacy_screen/privacy_screen_toast_view.cc
@@ -66,7 +66,8 @@ const SkColor icon_color = color_provider->GetContentLayerColor( AshColorProvider::ContentLayerType::kTextColorSecondary); - icon->SetImage(gfx::CreateVectorIcon(kSystemTrayManagedIcon, icon_color)); + icon->SetImage( + ui::ImageModel::FromVectorIcon(kSystemTrayManagedIcon, icon_color)); AddChildView(label); AddChildView(icon);
diff --git a/ash/system/tray/hover_highlight_view.cc b/ash/system/tray/hover_highlight_view.cc index c023570..6496e3c8 100644 --- a/ash/system/tray/hover_highlight_view.cc +++ b/ash/system/tray/hover_highlight_view.cc
@@ -135,7 +135,7 @@ std::unique_ptr<views::ImageView> icon(TrayPopupUtils::CreateMainImageView( /*use_wide_layout=*/true)); icon_ = icon.get(); - icon->SetImage(image); + icon->SetImage(ui::ImageModel::FromImageSkia(image)); icon->SetEnabled(GetEnabled()); AddViewAndLabel(std::move(icon), text);
diff --git a/ash/system/tray/tray_item_view_unittest.cc b/ash/system/tray/tray_item_view_unittest.cc index 4747965..beb1a1d8 100644 --- a/ash/system/tray/tray_item_view_unittest.cc +++ b/ash/system/tray/tray_item_view_unittest.cc
@@ -239,8 +239,8 @@ // Set the image to a large image. gfx::Size kLargeImageSize(kLargeSize, kLargeSize); - tray_item()->image_view()->SetImage( - CreateSolidColorTestImage(kLargeImageSize, SK_ColorRED)); + tray_item()->image_view()->SetImage(ui::ImageModel::FromImageSkia( + CreateSolidColorTestImage(kLargeImageSize, SK_ColorRED))); // The preferred size is the size of the larger image (which is not the // default tray icon size, see static_assert above).
diff --git a/ash/system/unified/feature_pod_button.cc b/ash/system/unified/feature_pod_button.cc index 95c3e44..d4e431f 100644 --- a/ash/system/unified/feature_pod_button.cc +++ b/ash/system/unified/feature_pod_button.cc
@@ -205,7 +205,7 @@ const SkColor icon_color = color_provider->GetContentLayerColor(ContentLayerType::kIconColorPrimary); - detailed_view_arrow_->SetImage(gfx::CreateVectorIcon( + detailed_view_arrow_->SetImage(ui::ImageModel::FromVectorIcon( kUnifiedMenuMoreIcon, GetEnabled() ? icon_color : ColorUtil::GetDisabledColor(icon_color))); }
diff --git a/ash/system/unified/notification_counter_view.cc b/ash/system/unified/notification_counter_view.cc index b7dd1df1..4f4dd30 100644 --- a/ash/system/unified/notification_counter_view.cc +++ b/ash/system/unified/notification_counter_view.cc
@@ -165,9 +165,9 @@ int icon_id = std::min(notification_count, kTrayNotificationMaxCount + 1); if (icon_id != count_for_display_) { count_for_display_ = icon_id; - image_view()->SetImage( + image_view()->SetImage(ui::ImageModel::FromImageSkia( gfx::CanvasImageSource::MakeImageSkia<NumberIconImageSource>(this, - icon_id)); + icon_id))); UpdateLabelOrImageViewColor(is_active()); } SetVisible(true); @@ -191,9 +191,9 @@ void NotificationCounterView::UpdateLabelOrImageViewColor(bool active) { TrayItemView::UpdateLabelOrImageViewColor(active); - image_view()->SetImage( + image_view()->SetImage(ui::ImageModel::FromImageSkia( gfx::CanvasImageSource::MakeImageSkia<NumberIconImageSource>( - this, count_for_display_)); + this, count_for_display_))); } BEGIN_METADATA(NotificationCounterView)
diff --git a/ash/system/unified/notification_icons_controller.cc b/ash/system/unified/notification_icons_controller.cc index c1463c0..e7541cd 100644 --- a/ash/system/unified/notification_icons_controller.cc +++ b/ash/system/unified/notification_icons_controller.cc
@@ -118,7 +118,7 @@ void NotificationIconTrayItemView::Reset() { notification_id_ = std::string(); notification_.reset(); - image_view()->SetImage(gfx::ImageSkia()); + image_view()->SetImage(ui::ImageModel()); image_view()->SetTooltipText(std::u16string()); } @@ -175,7 +175,7 @@ color_provider->GetColor(ui::kColorNotificationIconBackground), color_provider->GetColor(ui::kColorNotificationIconForeground)); if (!masked_small_icon.IsEmpty()) { - image_view()->SetImage(masked_small_icon.AsImageSkia()); + image_view()->SetImage(ui::ImageModel::FromImage(masked_small_icon)); } else { image_view()->SetImage(ui::ImageModel::FromVectorIcon( message_center::kProductIcon, color_id, kUnifiedTrayIconSize));
diff --git a/ash/system/unified/quick_settings_header.cc b/ash/system/unified/quick_settings_header.cc index 6ef3359c..5301278 100644 --- a/ash/system/unified/quick_settings_header.cc +++ b/ash/system/unified/quick_settings_header.cc
@@ -142,7 +142,7 @@ const std::pair<SkColor, float> base_color_and_opacity = AshColorProvider::Get()->GetInkDropBaseColorAndOpacity(); views::InkDrop::Get(this)->SetBaseColor(base_color_and_opacity.first); - image_->SetImage(gfx::CreateVectorIcon( + image_->SetImage(ui::ImageModel::FromVectorIcon( *icon_, GetColorProvider()->GetColor(cros_tokens::kCrosSysOnSurfaceVariant))); }
diff --git a/ash/webui/boca_ui/BUILD.gn b/ash/webui/boca_ui/BUILD.gn index 74e7a0ca..e195fd9 100644 --- a/ash/webui/boca_ui/BUILD.gn +++ b/ash/webui/boca_ui/BUILD.gn
@@ -25,6 +25,10 @@ "provider/tab_info_collector.cc", "provider/tab_info_collector.h", "url_constants.h", + "webview_auth_delegate.cc", + "webview_auth_delegate.h", + "webview_auth_handler.cc", + "webview_auth_handler.h", ] deps = [ @@ -47,6 +51,7 @@ "//components/account_id", "//components/app_constants", "//components/app_restore", + "//components/signin/public/base", "//components/signin/public/identity_manager", "//components/user_manager", "//content/public/browser", @@ -74,6 +79,7 @@ "boca_app_page_handler_unittest.cc", "provider/classroom_page_handler_impl_unittest.cc", "provider/network_info_provider_unittest.cc", + "webview_auth_handler_unittest.cc", ] deps = [
diff --git a/ash/webui/boca_ui/boca_app_page_handler.cc b/ash/webui/boca_ui/boca_app_page_handler.cc index b5e4e93..7711686 100644 --- a/ash/webui/boca_ui/boca_app_page_handler.cc +++ b/ash/webui/boca_ui/boca_app_page_handler.cc
@@ -154,11 +154,13 @@ mojo::PendingReceiver<boca::mojom::PageHandler> receiver, mojo::PendingRemote<boca::mojom::Page> remote, content::WebUI* web_ui, + std::unique_ptr<WebviewAuthHandler> auth_handler, std::unique_ptr<ClassroomPageHandlerImpl> classroom_client_impl, SessionClientImpl* session_client_impl, bool is_producer) : is_producer_(is_producer), tab_info_collector_(web_ui, is_producer), + auth_handler_(std::move(auth_handler)), class_room_page_handler_(std::move(classroom_client_impl)), receiver_(this, std::move(receiver)), remote_(std::move(remote)), @@ -185,6 +187,10 @@ /*is_app_opened=*/false); } +void BocaAppHandler::AuthenticateWebview(AuthenticateWebviewCallback callback) { + auth_handler_->AuthenticateWebview(std::move(callback)); +} + void BocaAppHandler::GetWindowsTabsList(GetWindowsTabsListCallback callback) { tab_info_collector_.GetWindowTabInfo(std::move(callback)); }
diff --git a/ash/webui/boca_ui/boca_app_page_handler.h b/ash/webui/boca_ui/boca_app_page_handler.h index 2394dd3..5e99fb63 100644 --- a/ash/webui/boca_ui/boca_app_page_handler.h +++ b/ash/webui/boca_ui/boca_app_page_handler.h
@@ -13,6 +13,7 @@ #include "ash/webui/boca_ui/provider/classroom_page_handler_impl.h" #include "ash/webui/boca_ui/provider/network_info_provider.h" #include "ash/webui/boca_ui/provider/tab_info_collector.h" +#include "ash/webui/boca_ui/webview_auth_handler.h" #include "base/functional/callback_forward.h" #include "chromeos/ash/components/boca/boca_session_manager.h" #include "chromeos/ash/components/boca/proto/roster.pb.h" @@ -38,6 +39,7 @@ mojo::PendingReceiver<mojom::PageHandler> receiver, mojo::PendingRemote<mojom::Page> remote, content::WebUI* webui, + std::unique_ptr<WebviewAuthHandler> auth_handler, std::unique_ptr<ClassroomPageHandlerImpl> classroom_client_impl, SessionClientImpl* session_client_impl, bool is_producer); @@ -52,6 +54,7 @@ SetFloatModeCallback callback); // mojom::PageHandler: + void AuthenticateWebview(AuthenticateWebviewCallback callback) override; void GetWindowsTabsList(GetWindowsTabsListCallback callback) override; void ListCourses(ListCoursesCallback callback) override; void ListStudents(const std::string& course_id, @@ -106,6 +109,9 @@ void SetSessionConfigInterceptorCallbackForTesting( SessionConfigInterceptorCallback callback); void SetSpotlightServiceForTesting(std::unique_ptr<SpotlightService> service); + WebviewAuthHandler* GetWebviewAuthHandlerForTesting() { + return auth_handler_.get(); + } private: void UpdateSessionConfig(); @@ -127,6 +133,7 @@ SEQUENCE_CHECKER(sequence_checker_); const bool is_producer_; TabInfoCollector tab_info_collector_; + std::unique_ptr<WebviewAuthHandler> auth_handler_; std::unique_ptr<ClassroomPageHandlerImpl> class_room_page_handler_; raw_ptr<SpotlightService> spotlight_service_; // Latest config is not always the same as the instance maintained in
diff --git a/ash/webui/boca_ui/boca_app_page_handler_unittest.cc b/ash/webui/boca_ui/boca_app_page_handler_unittest.cc index a42c8ae..e341defb 100644 --- a/ash/webui/boca_ui/boca_app_page_handler_unittest.cc +++ b/ash/webui/boca_ui/boca_app_page_handler_unittest.cc
@@ -12,6 +12,10 @@ #include "ash/webui/boca_ui/mojom/boca.mojom-forward.h" #include "ash/webui/boca_ui/mojom/boca.mojom-shared.h" #include "ash/webui/boca_ui/mojom/boca.mojom.h" +#include "ash/webui/boca_ui/webview_auth_delegate.h" +#include "ash/webui/boca_ui/webview_auth_handler.h" +#include "base/test/bind.h" +#include "base/test/gmock_callback_support.h" #include "base/test/scoped_feature_list.h" #include "base/test/task_environment.h" #include "base/test/test_future.h" @@ -35,6 +39,7 @@ #include "chromeos/ash/components/browser_context_helper/fake_browser_context_helper_delegate.h" #include "chromeos/ash/components/test/ash_test_suite.h" #include "components/account_id/account_id.h" +#include "components/prefs/testing_pref_service.h" #include "components/signin/public/identity_manager/identity_manager.h" #include "components/user_manager/fake_user_manager.h" #include "components/user_manager/scoped_user_manager.h" @@ -66,6 +71,7 @@ namespace { constexpr char kGaiaId[] = "123"; constexpr char kUserEmail[] = "cat@gmail.com"; +constexpr char kWebviewHostName[] = "boca"; mojom::OnTaskConfigPtr GetCommonTestLockOnTaskConfig() { std::vector<mojom::ControlledTabPtr> tabs; @@ -226,6 +232,20 @@ (override)); }; +class MockWebviewAuthHandler : public WebviewAuthHandler { + public: + MockWebviewAuthHandler(content::BrowserContext* context, + const std::string& webview_host_name) + : WebviewAuthHandler(std::make_unique<WebviewAuthDelegate>(), + context, + webview_host_name) {} + MockWebviewAuthHandler(const MockWebviewAuthHandler&) = delete; + MockWebviewAuthHandler& operator=(const WebviewAuthHandler&) = delete; + ~MockWebviewAuthHandler() override {} + + MOCK_METHOD1(AuthenticateWebview, void(AuthenticateWebviewCallback)); +}; + class BocaAppPageHandlerTest : public testing::Test { public: BocaAppPageHandlerTest() = default; @@ -233,9 +253,12 @@ scoped_feature_list_.InitWithFeatures({ash::features::kBoca}, /*disabled_features=*/{}); // Set up UserManager related modules. + user_manager::UserManagerImpl::RegisterPrefs(local_state_.registry()); + fake_user_manager_.Reset( + std::make_unique<user_manager::FakeUserManager>(&local_state_)); + auto account_id = AccountId::FromUserEmailGaiaId(kUserEmail, GaiaId(kGaiaId)); - fake_user_manager_.Reset(std::make_unique<user_manager::FakeUserManager>()); auto browser_context_helper_delegate = std::make_unique<ash::FakeBrowserContextHelperDelegate>(); auto* browser_context_helper_delegate_ptr = @@ -250,7 +273,8 @@ .WillByDefault(Return(nullptr)); // Sign in a test user. - fake_user_manager_->AddUser(account_id); + fake_user_manager_->AddGaiaUser(account_id, + user_manager::UserType::kRegular); fake_user_manager_->UserLoggedIn( account_id, user_manager::FakeUserManager::GetFakeUsernameHash(account_id), @@ -285,6 +309,8 @@ // TODO(b/359929870):Setting nullptr for other dependencies for now. // Adding test case for classroom and tab info. pending_receiver_.InitWithNewPipeAndPassRemote(), web_ui_.get(), + std::make_unique<MockWebviewAuthHandler>(browser_context, + kWebviewHostName), /*classroom_client_impl=*/nullptr, &session_client_impl_, /*is_producer=*/true); boca_app_handler_->SetSpotlightService(&spotlight_service_); @@ -309,10 +335,15 @@ MockSessionManager* session_manager() { return session_manager_.get(); } BocaAppHandler* boca_app_handler() { return boca_app_handler_.get(); } MockSpotlightService* spotlight_service() { return &spotlight_service_; } + MockWebviewAuthHandler* webview_auth_handler() { + return static_cast<MockWebviewAuthHandler*>( + boca_app_handler_.get()->GetWebviewAuthHandlerForTesting()); + } private: - content::BrowserTaskEnvironment task_environment_; base::test::ScopedFeatureList scoped_feature_list_; + content::BrowserTaskEnvironment task_environment_; + TestingPrefServiceSimple local_state_; user_manager::TypedScopedUserManager<user_manager::FakeUserManager> fake_user_manager_; @@ -1343,7 +1374,7 @@ ASSERT_TRUE(result.empty()); } -TEST_F(BocaAppPageHandlerTest, UpdateNonEmptyStudentActivitySucceed) { +TEST_F(BocaAppPageHandlerTest, DISABLED_UpdateNonEmptyStudentActivitySucceed) { std::map<std::string, ::boca::StudentStatus> activities; ::boca::StudentStatus status_1; status_1.set_state(::boca::StudentStatus::ACTIVE); @@ -1650,6 +1681,32 @@ EXPECT_EQ(mojom::ViewStudentScreenError::kHTTPError, future.Get().value()); } +TEST_F(BocaAppPageHandlerTest, AuthenticateWebviewSuccess) { + EXPECT_CALL(*webview_auth_handler(), AuthenticateWebview(testing::_)) + .WillOnce( + testing::Invoke(base::test::RunOnceCallback<0>(/*is_success=*/true))); + base::RunLoop run_loop; + boca_app_handler()->AuthenticateWebview( + base::BindLambdaForTesting([&](bool success) -> void { + EXPECT_TRUE(success); + run_loop.Quit(); + })); + run_loop.Run(); +} + +TEST_F(BocaAppPageHandlerTest, AuthenticateWebviewFailure) { + EXPECT_CALL(*webview_auth_handler(), AuthenticateWebview(testing::_)) + .WillOnce(testing::Invoke( + base::test::RunOnceCallback<0>(/*is_success=*/false))); + base::RunLoop run_loop; + boca_app_handler()->AuthenticateWebview( + base::BindLambdaForTesting([&](bool success) -> void { + EXPECT_FALSE(success); + run_loop.Quit(); + })); + run_loop.Run(); +} + class BocaAppPageHandlerFloatModeTest : public AshTestBase { public: BocaAppPageHandlerFloatModeTest() = default;
diff --git a/ash/webui/boca_ui/boca_ui.cc b/ash/webui/boca_ui/boca_ui.cc index 3e3be73..5a066c5 100644 --- a/ash/webui/boca_ui/boca_ui.cc +++ b/ash/webui/boca_ui/boca_ui.cc
@@ -12,6 +12,8 @@ #include "ash/constants/ash_features.h" #include "ash/webui/boca_ui/boca_app_page_handler.h" #include "ash/webui/boca_ui/url_constants.h" +#include "ash/webui/boca_ui/webview_auth_delegate.h" +#include "ash/webui/boca_ui/webview_auth_handler.h" #include "ash/webui/common/chrome_os_webui_config.h" #include "ash/webui/grit/ash_boca_ui_resources.h" #include "ash/webui/grit/ash_boca_ui_resources_map.h" @@ -124,9 +126,16 @@ void BocaUI::Create( mojo::PendingReceiver<boca::mojom::PageHandler> page_handler, mojo::PendingRemote<boca::mojom::Page> page) { + content::BrowserContext* context = + web_ui()->GetWebContents()->GetBrowserContext(); + CHECK(context); + const std::string host_name = + web_ui()->GetWebContents()->GetVisibleURL().host(); + auto auth_handler = std::make_unique<WebviewAuthHandler>( + std::make_unique<WebviewAuthDelegate>(), context, host_name); page_handler_impl_ = std::make_unique<BocaAppHandler>( std::move(page_handler), std::move(page), web_ui(), - std::make_unique<ClassroomPageHandlerImpl>(), + std::move(auth_handler), std::make_unique<ClassroomPageHandlerImpl>(), BocaAppClient::Get()->GetSessionManager()->session_client_impl(), is_producer_); page_handler_impl_->SetSpotlightService(&spotlight_service_);
diff --git a/ash/webui/boca_ui/mojom/boca.mojom b/ash/webui/boca_ui/mojom/boca.mojom index c51307a..c3afb635 100644 --- a/ash/webui/boca_ui/mojom/boca.mojom +++ b/ash/webui/boca_ui/mojom/boca.mojom
@@ -41,6 +41,8 @@ string id; // Course name. string name; + // Course section. + string section; }; // Represents a browser window. @@ -174,6 +176,8 @@ // Implemented by browser process for page chrome-untrusted://boca-app/ interface PageHandler { + // Performs authentication and sets the credential in the webview. + AuthenticateWebview() => (bool success); // Fetches a list of browser windows and tabs in it. Windows are ordered using // non-increasing order for most recent tab's last access timestamp. GetWindowsTabsList() => (array<Window> window_list);
diff --git a/ash/webui/boca_ui/provider/classroom_page_handler_impl.cc b/ash/webui/boca_ui/provider/classroom_page_handler_impl.cc index 997b9fa6..7b8c12953 100644 --- a/ash/webui/boca_ui/provider/classroom_page_handler_impl.cc +++ b/ash/webui/boca_ui/provider/classroom_page_handler_impl.cc
@@ -103,7 +103,8 @@ } for (const auto& item : result.value()->items()) { - mojom::CoursePtr course = mojom::Course::New(item->id(), item->name()); + mojom::CoursePtr course = + mojom::Course::New(item->id(), item->name(), item->section()); fetched_courses->push_back(std::move(course)); valid_course_ids_.insert(item->id()); }
diff --git a/ash/webui/boca_ui/provider/classroom_page_handler_impl_unittest.cc b/ash/webui/boca_ui/provider/classroom_page_handler_impl_unittest.cc index 40c553f2..434ba73 100644 --- a/ash/webui/boca_ui/provider/classroom_page_handler_impl_unittest.cc +++ b/ash/webui/boca_ui/provider/classroom_page_handler_impl_unittest.cc
@@ -114,6 +114,7 @@ { "id": "course-id-1", "name": "Course 1", + "section": "Period 1", "courseState": "ACTIVE" }, { @@ -141,8 +142,11 @@ ASSERT_EQ(response.size(), 2u); EXPECT_EQ(response.at(0)->id, "course-id-1"); EXPECT_EQ(response.at(0)->name, "Course 1"); + EXPECT_EQ(response.at(0)->section, "Period 1"); EXPECT_EQ(response.at(1)->id, "course-id-2"); EXPECT_EQ(response.at(1)->name, "Course 2"); + // Empty string when section is missing. + EXPECT_EQ(response.at(1)->section, ""); } TEST_F(ClassroomPageHandlerImplTest, ListCoursesOnHttpError) {
diff --git a/ash/webui/boca_ui/resources/app/boca_app.ts b/ash/webui/boca_ui/resources/app/boca_app.ts index 4448304..39f5763 100644 --- a/ash/webui/boca_ui/resources/app/boca_app.ts +++ b/ash/webui/boca_ui/resources/app/boca_app.ts
@@ -174,6 +174,11 @@ */ export declare interface ClientApiDelegate { /** + * Request authentication for the webview. + */ + authenticateWebview(): Promise<boolean>; + + /** * Get a list of Window tabs opened on device. */ getWindowsTabsList(): Promise<DeviceWindow[]>;
diff --git a/ash/webui/boca_ui/resources/app/client_delegate.ts b/ash/webui/boca_ui/resources/app/client_delegate.ts index 9c1de0c..481a7e1 100644 --- a/ash/webui/boca_ui/resources/app/client_delegate.ts +++ b/ash/webui/boca_ui/resources/app/client_delegate.ts
@@ -101,6 +101,9 @@ private clientDelegateImpl: ClientApiDelegate; constructor(pageHandler: PageHandlerRemote) { this.clientDelegateImpl = { + authenticateWebview: async () => { + return (await pageHandler.authenticateWebview()).success; + }, getWindowsTabsList: async () => { const result = await pageHandler.getWindowsTabsList(); return result.windowList.map((window: Window) => { @@ -122,8 +125,7 @@ return { id: course.id, name: course.name, - // TODO(b/356706279): Add section data. - section: '', + section: course.section, }; }); },
diff --git a/ash/webui/boca_ui/webview_auth_delegate.cc b/ash/webui/boca_ui/webview_auth_delegate.cc new file mode 100644 index 0000000..8f2c7cf --- /dev/null +++ b/ash/webui/boca_ui/webview_auth_delegate.cc
@@ -0,0 +1,32 @@ +// 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 "ash/webui/boca_ui/webview_auth_delegate.h" + +#include "base/check.h" +#include "chromeos/ash/components/boca/boca_app_client.h" +#include "components/signin/public/identity_manager/identity_manager.h" +#include "content/public/browser/browser_context.h" +#include "content/public/browser/storage_partition.h" +#include "content/public/browser/storage_partition_config.h" + +namespace ash::boca { + +WebviewAuthDelegate::WebviewAuthDelegate() {} + +WebviewAuthDelegate::~WebviewAuthDelegate() = default; + +signin::IdentityManager* WebviewAuthDelegate::GetIdentityManager() { + return BocaAppClient::Get()->GetIdentityManager(); +} + +content::StoragePartition* WebviewAuthDelegate::GetStoragePartition( + content::BrowserContext* context, + const content::StoragePartitionConfig& storage_partition_config) { + CHECK(context) << "Boca requested identity manager before user session " + "start."; + return context->GetStoragePartition(storage_partition_config); +} + +} // namespace ash::boca
diff --git a/ash/webui/boca_ui/webview_auth_delegate.h b/ash/webui/boca_ui/webview_auth_delegate.h new file mode 100644 index 0000000..f169be4 --- /dev/null +++ b/ash/webui/boca_ui/webview_auth_delegate.h
@@ -0,0 +1,38 @@ +// 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 ASH_WEBUI_BOCA_UI_WEBVIEW_AUTH_DELEGATE_H_ +#define ASH_WEBUI_BOCA_UI_WEBVIEW_AUTH_DELEGATE_H_ + +namespace content { +class BrowserContext; +class StoragePartition; +class StoragePartitionConfig; +} // namespace content + +namespace signin { +class IdentityManager; +} + +namespace ash::boca { + +class WebviewAuthDelegate { + public: + WebviewAuthDelegate(); + WebviewAuthDelegate(const WebviewAuthDelegate&) = delete; + WebviewAuthDelegate& operator=(const WebviewAuthDelegate&) = delete; + virtual ~WebviewAuthDelegate(); + + // Returns the IdentityManager for the active user profile. + virtual signin::IdentityManager* GetIdentityManager(); + + // Returns storage partition for a given `context` and + // `storage_partition_config`. + virtual content::StoragePartition* GetStoragePartition( + content::BrowserContext* context, + const content::StoragePartitionConfig& storage_partition_config); +}; + +} // namespace ash::boca +#endif // ASH_WEBUI_BOCA_UI_WEBVIEW_AUTH_DELEGATE_H_
diff --git a/ash/webui/boca_ui/webview_auth_handler.cc b/ash/webui/boca_ui/webview_auth_handler.cc new file mode 100644 index 0000000..5c9a75a --- /dev/null +++ b/ash/webui/boca_ui/webview_auth_handler.cc
@@ -0,0 +1,92 @@ +// 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 "ash/webui/boca_ui/webview_auth_handler.h" + +#include <memory> +#include <string> +#include <utility> +#include <vector> + +#include "base/check.h" +#include "base/functional/bind.h" +#include "base/logging.h" +#include "components/signin/public/base/consent_level.h" +#include "components/signin/public/base/multilogin_parameters.h" +#include "components/signin/public/identity_manager/identity_manager.h" +#include "components/signin/public/identity_manager/set_accounts_in_cookie_result.h" +#include "content/public/browser/browser_context.h" +#include "content/public/browser/storage_partition.h" +#include "content/public/browser/storage_partition_config.h" +#include "google_apis/gaia/core_account_id.h" +#include "google_apis/gaia/gaia_auth_fetcher.h" +#include "url/gurl.h" + +namespace ash::boca { + +WebviewAuthHandler::WebviewAuthHandler( + std::unique_ptr<WebviewAuthDelegate> delegate, + content::BrowserContext* context, + const std::string& webview_host_name) + : delegate_(std::move(delegate)), context_(context) { + CHECK(delegate_); + CHECK(context_); + storage_partition_config_ = content::StoragePartitionConfig::Create( + context_, webview_host_name, + /*partition_name=*/std::string(), /*in_memory=*/true); +} + +WebviewAuthHandler::~WebviewAuthHandler() = default; + +std::unique_ptr<GaiaAuthFetcher> +WebviewAuthHandler::CreateGaiaAuthFetcherForPartition( + GaiaAuthConsumer* consumer, + const gaia::GaiaSource& source) { + return std::make_unique<GaiaAuthFetcher>( + consumer, source, + GetStoragePartition()->GetURLLoaderFactoryForBrowserProcess()); +} + +network::mojom::CookieManager* +WebviewAuthHandler::GetCookieManagerForPartition() { + return GetStoragePartition()->GetCookieManagerForBrowserProcess(); +} + +void WebviewAuthHandler::AuthenticateWebview( + AuthenticateWebviewCallback callback) { + if (cookie_loader_) { + cookie_loader_.reset(); + } + + signin::IdentityManager* identity_manager = delegate_->GetIdentityManager(); + CHECK(identity_manager); + + // We only need primary account authentication in the webview. + CoreAccountId primary_account_id = + identity_manager->GetPrimaryAccountId(signin::ConsentLevel::kSignin); + + cookie_loader_ = + identity_manager->GetAccountsCookieMutator() + ->SetAccountsInCookieForPartition( + this, + {gaia::MultiloginMode::MULTILOGIN_UPDATE_COOKIE_ACCOUNTS_ORDER, + {primary_account_id}}, + gaia::GaiaSource::kChromeOS, + base::BindOnce(&WebviewAuthHandler::OnAuthFinished, + base::Unretained(this), std::move(callback))); +} + +void WebviewAuthHandler::OnAuthFinished( + AuthenticateWebviewCallback callback, + signin::SetAccountsInCookieResult cookie_result) { + cookie_loader_.reset(); + std::move(callback).Run(cookie_result == + signin::SetAccountsInCookieResult::kSuccess); +} + +content::StoragePartition* WebviewAuthHandler::GetStoragePartition() { + return delegate_->GetStoragePartition(context_, storage_partition_config_); +} + +} // namespace ash::boca
diff --git a/ash/webui/boca_ui/webview_auth_handler.h b/ash/webui/boca_ui/webview_auth_handler.h new file mode 100644 index 0000000..bf43c60 --- /dev/null +++ b/ash/webui/boca_ui/webview_auth_handler.h
@@ -0,0 +1,84 @@ +// 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 ASH_WEBUI_BOCA_UI_WEBVIEW_AUTH_HANDLER_H_ +#define ASH_WEBUI_BOCA_UI_WEBVIEW_AUTH_HANDLER_H_ + +#include <memory> +#include <string> + +#include "ash/webui/boca_ui/mojom/boca.mojom.h" +#include "ash/webui/boca_ui/webview_auth_delegate.h" +#include "base/functional/callback_forward.h" +#include "base/memory/raw_ptr.h" +#include "components/signin/public/identity_manager/accounts_cookie_mutator.h" +#include "content/public/browser/browser_context.h" +#include "content/public/browser/storage_partition.h" +#include "content/public/browser/storage_partition_config.h" + +namespace mojom = ash::boca::mojom; +using AuthenticateWebviewCallback = base::OnceCallback<void(bool)>; + +namespace content { +class BrowserContext; +class StoragePartition; +} // namespace content + +namespace signin { +enum class SetAccountsInCookieResult; +} // namespace signin + +namespace ash::boca { + +// Helper to authenticate the webview identified by the parameters passed at the +// construction time. Initiates the OAuth authentication process, handles the +// result and retries when feasible. +class WebviewAuthHandler + : public signin::AccountsCookieMutator::PartitionDelegate { + public: + // Callback with authentication result. + // Called when webview authentication is finished. + using OnWebviewAuth = base::OnceCallback<void(bool is_success)>; + + // Constructs the `WebviewAuthHandler` for the webview identified by given + // browser `context` and `webview_host_name`. + WebviewAuthHandler(std::unique_ptr<WebviewAuthDelegate> delegate, + content::BrowserContext* context, + const std::string& webview_host_name); + WebviewAuthHandler(const WebviewAuthHandler&) = delete; + WebviewAuthHandler& operator=(const WebviewAuthHandler&) = delete; + virtual ~WebviewAuthHandler(); + + // Starts webview authentication and copies the credentials into the storage + // partition that this class was initialized with. + // Passes the boolean authentication result in the `callback`. + virtual void AuthenticateWebview(AuthenticateWebviewCallback callback); + + private: + // signin::AccountsCookieMutator::PartitionDelegate: + std::unique_ptr<GaiaAuthFetcher> CreateGaiaAuthFetcherForPartition( + GaiaAuthConsumer* consumer, + const gaia::GaiaSource& source) override; + network::mojom::CookieManager* GetCookieManagerForPartition() override; + + // Handles the webview authentication result. + void OnAuthFinished(OnWebviewAuth callback, + signin::SetAccountsInCookieResult cookie_result); + + // Returns storage partition for this authentication request. + content::StoragePartition* GetStoragePartition(); + + // Storage partition configuration for this authentication request. + content::StoragePartitionConfig storage_partition_config_; + + std::unique_ptr<WebviewAuthDelegate> delegate_; + const raw_ptr<content::BrowserContext> context_; + + std::unique_ptr<signin::AccountsCookieMutator::SetAccountsInCookieTask> + cookie_loader_; +}; + +} // namespace ash::boca + +#endif // ASH_WEBUI_BOCA_UI_WEBVIEW_AUTH_HANDLER_H_
diff --git a/ash/webui/boca_ui/webview_auth_handler_unittest.cc b/ash/webui/boca_ui/webview_auth_handler_unittest.cc new file mode 100644 index 0000000..bf4232d --- /dev/null +++ b/ash/webui/boca_ui/webview_auth_handler_unittest.cc
@@ -0,0 +1,183 @@ +// 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 "ash/webui/boca_ui/webview_auth_handler.h" + +#include <string> + +#include "ash/webui/boca_ui/webview_auth_delegate.h" +#include "base/memory/raw_ptr.h" +#include "base/run_loop.h" +#include "base/strings/stringprintf.h" +#include "base/test/bind.h" +#include "components/signin/public/base/consent_level.h" +#include "components/signin/public/base/test_signin_client.h" +#include "components/signin/public/identity_manager/identity_manager.h" +#include "components/signin/public/identity_manager/identity_test_environment.h" +#include "components/signin/public/identity_manager/set_accounts_in_cookie_result.h" +#include "components/sync_preferences/testing_pref_service_syncable.h" +#include "content/public/browser/browser_context.h" +#include "content/public/browser/storage_partition.h" +#include "content/public/browser/storage_partition_config.h" +#include "content/public/test/browser_task_environment.h" +#include "content/public/test/test_browser_context.h" +#include "content/public/test/test_storage_partition.h" +#include "google_apis/gaia/gaia_constants.h" +#include "google_apis/gaia/gaia_urls.h" +#include "services/network/public/mojom/cookie_manager.mojom.h" +#include "services/network/test/test_cookie_manager.h" +#include "services/network/test/test_url_loader_factory.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "url/gurl.h" + +namespace ash::boca { + +namespace { + +constexpr char kTestAccountEmail[] = "user@test.com"; +constexpr char kWebviewHostName[] = "boca"; + +constexpr char kCookieResponseSuccess[] = R"( + { "status": "OK", + "cookies":[ + { + "name":"CookieName", + "value":"CookieValue", + "domain":".google.com", + "path":"/" + } + ] + })"; +constexpr char kCookieResponseRetry[] = R"( + { "status": "RETRY", + "cookies":[] + })"; +constexpr char kCookieResponseError[] = R"( + { "status": "ERROR", + "cookies":[] + })"; + +// Returns HTTP request response that will lead to the given `result`. +std::string GetResponseFromResult(signin::SetAccountsInCookieResult result) { + switch (result) { + case signin::SetAccountsInCookieResult::kSuccess: + return kCookieResponseSuccess; + case signin::SetAccountsInCookieResult::kTransientError: + return kCookieResponseRetry; + case signin::SetAccountsInCookieResult::kPersistentError: + return kCookieResponseError; + }; +} + +} // namespace + +// WebviewAuthDelegate for tests that allows to inject identity manager and +// storage partition. +class TestWebviewAuthDelegate : public WebviewAuthDelegate { + public: + explicit TestWebviewAuthDelegate( + signin::IdentityManager* identity_manager, + network::TestURLLoaderFactory* url_loader_factory) + : test_identity_manager_(identity_manager) { + test_storage_partition_.set_cookie_manager_for_browser_process( + &test_cookie_manager_); + test_storage_partition_.set_url_loader_factory_for_browser_process( + url_loader_factory); + } + + ~TestWebviewAuthDelegate() override = default; + + // WebviewAuthDelegateImpl: + signin::IdentityManager* GetIdentityManager() override { + return test_identity_manager_; + } + + content::StoragePartition* GetStoragePartition( + content::BrowserContext* context, + const content::StoragePartitionConfig& storage_partition_config) + override { + test_storage_partition_.set_config(storage_partition_config); + return &test_storage_partition_; + } + + private: + content::TestStoragePartition test_storage_partition_; + network::TestCookieManager test_cookie_manager_; + + const raw_ptr<signin::IdentityManager> test_identity_manager_; +}; + +class BocaWebviewAuthHandlerTest : public testing::Test { + public: + BocaWebviewAuthHandlerTest() = default; + BocaWebviewAuthHandlerTest(const BocaWebviewAuthHandlerTest&) = delete; + BocaWebviewAuthHandlerTest& operator=(const BocaWebviewAuthHandlerTest&) = + delete; + + ~BocaWebviewAuthHandlerTest() override {} + + protected: + WebviewAuthHandler& auth_handler() { return auth_handler_; } + + void QueueResponseForResult(signin::SetAccountsInCookieResult result) { + test_signin_client_.GetTestURLLoaderFactory()->AddResponse( + GaiaUrls::GetInstance() + ->oauth_multilogin_url() + .Resolve(base::StringPrintf("?source=%s&reuseCookies=0", + GaiaConstants::kChromeOSSource)) + .spec(), + GetResponseFromResult(result)); + } + + void SetUp() override { + testing::Test::SetUp(); + + identity_test_env_.MakePrimaryAccountAvailable( + kTestAccountEmail, signin::ConsentLevel::kSignin); + identity_test_env_.SetAutomaticIssueOfAccessTokens(true); + } + + private: + content::BrowserTaskEnvironment task_environment_; + content::TestBrowserContext test_context_; + + sync_preferences::TestingPrefServiceSyncable prefs_; + TestSigninClient test_signin_client_{&prefs_}; + signin::IdentityTestEnvironment identity_test_env_{ + /*test_url_loader_factory=*/nullptr, &prefs_, &test_signin_client_}; + + WebviewAuthHandler auth_handler_{ + std::make_unique<TestWebviewAuthDelegate>( + identity_test_env_.identity_manager(), + test_signin_client_.GetTestURLLoaderFactory()), + &test_context_, kWebviewHostName}; +}; + +TEST_F(BocaWebviewAuthHandlerTest, AuthSuccess) { + base::RunLoop run_loop; + + QueueResponseForResult(signin::SetAccountsInCookieResult::kSuccess); + + auth_handler().AuthenticateWebview( + base::BindLambdaForTesting([&](bool is_success) -> void { + EXPECT_TRUE(is_success); + run_loop.Quit(); + })); + run_loop.Run(); +} + +TEST_F(BocaWebviewAuthHandlerTest, AuthPersistentFailure) { + base::RunLoop run_loop; + + QueueResponseForResult(signin::SetAccountsInCookieResult::kPersistentError); + + auth_handler().AuthenticateWebview( + base::BindLambdaForTesting([&](bool is_success) -> void { + EXPECT_FALSE(is_success); + run_loop.Quit(); + })); + run_loop.Run(); +} + +} // namespace ash::boca
diff --git a/ash/webui/file_manager/file_manager_ui.cc b/ash/webui/file_manager/file_manager_ui.cc index cc242946..e661a9b 100644 --- a/ash/webui/file_manager/file_manager_ui.cc +++ b/ash/webui/file_manager/file_manager_ui.cc
@@ -9,7 +9,6 @@ #include "ash/webui/file_manager/file_manager_ui.h" -#include "ash/constants/ash_features.h" #include "ash/session/session_controller_impl.h" #include "ash/shell.h" #include "ash/webui/common/trusted_types_util.h" @@ -19,7 +18,6 @@ #include "ash/webui/file_manager/resources/grit/file_manager_swa_resources_map.h" #include "ash/webui/file_manager/url_constants.h" #include "base/check_op.h" -#include "base/feature_list.h" #include "base/logging.h" #include "base/strings/string_util.h" #include "base/values.h" @@ -71,11 +69,9 @@ bool FileManagerUIConfig::IsWebUIEnabled( content::BrowserContext* browser_context) { // Enable file manager WebUI if enable for SWA config or - // for the Kiosk session if SWAs are disabled there. + // for the Kiosk session. return SystemWebAppUIConfig::IsWebUIEnabled(browser_context) || - (!base::FeatureList::IsEnabled( - ash::features::kKioskEnableSystemWebApps) && - IsKioskSession()); + IsKioskSession(); } FileManagerUI::FileManagerUI(content::WebUI* web_ui,
diff --git a/ash/webui/graduation/BUILD.gn b/ash/webui/graduation/BUILD.gn index 7b54ac3..3b86631 100644 --- a/ash/webui/graduation/BUILD.gn +++ b/ash/webui/graduation/BUILD.gn
@@ -67,6 +67,7 @@ "//ash/webui/graduation:graduation", "//base", "//components/account_id", + "//components/prefs:test_support", "//components/signin/public/base", "//components/signin/public/base:base", "//components/signin/public/base:test_support",
diff --git a/ash/webui/graduation/graduation_ui_handler_unittest.cc b/ash/webui/graduation/graduation_ui_handler_unittest.cc index 83abaf8..5670cf07 100644 --- a/ash/webui/graduation/graduation_ui_handler_unittest.cc +++ b/ash/webui/graduation/graduation_ui_handler_unittest.cc
@@ -18,6 +18,7 @@ #include "base/test/metrics/histogram_tester.h" #include "base/values.h" #include "components/account_id/account_id.h" +#include "components/prefs/testing_pref_service.h" #include "components/user_manager/fake_user_manager.h" #include "components/user_manager/scoped_user_manager.h" #include "content/public/browser/browser_context.h" @@ -55,10 +56,14 @@ ~GraduationUiHandlerTest() override = default; void SetUp() override { + user_manager::UserManagerImpl::RegisterPrefs(local_state_.registry()); + fake_user_manager_.Reset( + std::make_unique<user_manager::FakeUserManager>(&local_state_)); + auto account_id = AccountId::FromUserEmailGaiaId(kUserEmail, GaiaId(kUserGaiaId)); - fake_user_manager_.Reset(std::make_unique<user_manager::FakeUserManager>()); - auto* user = fake_user_manager_->AddUser(account_id); + auto* user = fake_user_manager_->AddGaiaUser( + account_id, user_manager::UserType::kRegular); handler_ = std::make_unique<GraduationUiHandler>( handler_remote_.BindNewPipeAndPassReceiver(), @@ -78,6 +83,7 @@ protected: content::BrowserTaskEnvironment task_environment_; + TestingPrefServiceSimple local_state_; content::TestBrowserContext test_context_; mojo::Remote<graduation_ui::mojom::GraduationUiHandler> handler_remote_; user_manager::TypedScopedUserManager<user_manager::FakeUserManager>
diff --git a/base/android/java/src/org/chromium/base/metrics/RecordHistogram.java b/base/android/java/src/org/chromium/base/metrics/RecordHistogram.java index e2fbdc17..189d601 100644 --- a/base/android/java/src/org/chromium/base/metrics/RecordHistogram.java +++ b/base/android/java/src/org/chromium/base/metrics/RecordHistogram.java
@@ -34,10 +34,12 @@ * * @param name name of the histogram * @param sample sample to be recorded, at least 0 and at most {@code max-1} - * @param max upper bound for legal sample values - all sample values have to be strictly - * lower than {@code max} + * @param max upper bound for legal sample values - all sample values have to be + * lower than or equal to {@code max}. This value should be 1000 or less. */ public static void recordEnumeratedHistogram(String name, int sample, int max) { + // While recordExactLinearHistogram’s documentation states that the third argument + // should be 100 or less, a value up to 1000 is actually accepted. recordExactLinearHistogram(name, sample, max); }
diff --git a/base/metrics/histogram_functions.h b/base/metrics/histogram_functions.h index effa04b..59db5cbe 100644 --- a/base/metrics/histogram_functions.h +++ b/base/metrics/histogram_functions.h
@@ -68,6 +68,7 @@ // base::UmaHistogramEnumeration("My.Enumeration", // NewTabPageAction::kClickTitle); // +// `kMaxValue` should be 1000 or less. // Note that there are code that refer implementation details of this function. // Keep them synchronized. // LINT.IfChange(UmaHistogramEnumeration) @@ -81,6 +82,8 @@ "Enumeration's kMaxValue is out of range of INT_MAX!"); DCHECK_LE(static_cast<uintmax_t>(sample), static_cast<uintmax_t>(T::kMaxValue)); + // While UmaHistogramExactLinear’s documentation states that the third + // argument should be 101 or less, a value up to 1001 is actually accepted. return UmaHistogramExactLinear(name, static_cast<int>(sample), static_cast<int>(T::kMaxValue) + 1); } @@ -101,11 +104,14 @@ // kCount); // Note: The value in |sample| must be strictly less than |enum_size|. This is // otherwise functionally equivalent to the above. +// `enum_size` must be less than or equal to 1001. template <typename T> void UmaHistogramEnumeration(std::string_view name, T sample, T enum_size) { static_assert(std::is_enum_v<T>, "T is not an enum."); DCHECK_LE(static_cast<uintmax_t>(enum_size), static_cast<uintmax_t>(INT_MAX)); DCHECK_LT(static_cast<uintmax_t>(sample), static_cast<uintmax_t>(enum_size)); + // While UmaHistogramExactLinear’s documentation states that the third + // argument should be 101 or less, a value up to 1001 is actually accepted. return UmaHistogramExactLinear(name, static_cast<int>(sample), static_cast<int>(enum_size)); }
diff --git a/base/value_iterators.cc b/base/value_iterators.cc index 5b459b3..9fe451f 100644 --- a/base/value_iterators.cc +++ b/base/value_iterators.cc
@@ -25,11 +25,11 @@ dict_iterator::~dict_iterator() = default; -dict_iterator::reference dict_iterator::operator*() { +dict_iterator::reference dict_iterator::operator*() const { return {dict_iter_->first, *dict_iter_->second}; } -dict_iterator::pointer dict_iterator::operator->() { +dict_iterator::pointer dict_iterator::operator->() const { return pointer(operator*()); }
diff --git a/base/value_iterators.h b/base/value_iterators.h index ab5c2cc..49d78085 100644 --- a/base/value_iterators.h +++ b/base/value_iterators.h
@@ -24,14 +24,13 @@ // This iterator closely resembles DictStorage::iterator, with one // important exception. It abstracts the underlying unique_ptr away, meaning its -// value_type is std::pair<const std::string, Value>. It's reference type is a -// std::pair<const std::string&, Value&>, so that callers have read-write -// access without incurring a copy. +// reference type is a std::pair<const std::string&, Value&>, so that callers +// have read-write access without incurring a copy. class BASE_EXPORT dict_iterator { public: using difference_type = DictStorage::iterator::difference_type; - using value_type = std::pair<const std::string, Value>; - using reference = std::pair<const std::string&, Value&>; + using value_type = std::pair<const std::string&, Value&>; + using reference = value_type; using iterator_category = std::bidirectional_iterator_tag; class pointer { @@ -52,8 +51,8 @@ dict_iterator& operator=(const dict_iterator& dict_iter); ~dict_iterator(); - reference operator*(); - pointer operator->(); + reference operator*() const; + pointer operator->() const; dict_iterator& operator++(); dict_iterator operator++(int); @@ -80,14 +79,13 @@ // This iterator closely resembles DictStorage::const_iterator, with one // important exception. It abstracts the underlying unique_ptr away, meaning its -// value_type is std::pair<const std::string, Value>. It's reference type is a -// std::pair<const std::string&, const Value&>, so that callers have read-only -// access without incurring a copy. +// reference type is a std::pair<const std::string&, const Value&>, so that +// callers have read-only access without incurring a copy. class BASE_EXPORT const_dict_iterator { public: using difference_type = DictStorage::const_iterator::difference_type; - using value_type = std::pair<const std::string, Value>; - using reference = std::pair<const std::string&, const Value&>; + using value_type = std::pair<const std::string&, const Value&>; + using reference = value_type; using iterator_category = std::bidirectional_iterator_tag; class pointer {
diff --git a/base/win/hardware_check.cc b/base/win/hardware_check.cc index 06c96b3..ba4bb398 100644 --- a/base/win/hardware_check.cc +++ b/base/win/hardware_check.cc
@@ -90,39 +90,38 @@ } // namespace -bool IsWin11UpgradeEligible() { +bool HardwareEvaluationResult::IsEligible() const { + return this->cpu && this->memory && this->disk && this->firmware && this->tpm; +} + +HardwareEvaluationResult EvaluateWin11UpgradeEligibility() { static constexpr int64_t kMinTotalDiskSpace = 64 * 1024 * 1024; static constexpr uint64_t kMinTotalPhysicalMemory = 4 * 1024 * 1024; - static const bool is_win11_upgrade_eligible = [] { - if (!IsWin11SupportedProcessor( - CPU(), OSInfo::GetInstance()->processor_vendor_name())) { - return false; - } + static const HardwareEvaluationResult evaluate_win11_upgrade_eligibility = + [] { + HardwareEvaluationResult result; - if (SysInfo::AmountOfPhysicalMemory() < kMinTotalPhysicalMemory) { - return false; - } + result.cpu = IsWin11SupportedProcessor( + CPU(), OSInfo::GetInstance()->processor_vendor_name()); - FilePath system_path; - if (PathService::Get(DIR_SYSTEM, &system_path) && - SysInfo::AmountOfTotalDiskSpace( - FilePath(system_path.GetComponents()[0])) < kMinTotalDiskSpace) { - return false; - } + result.memory = + SysInfo::AmountOfPhysicalMemory() >= kMinTotalPhysicalMemory; - if (!IsUEFISecureBootEnabled()) { - return false; - } + FilePath system_path; + result.disk = + PathService::Get(DIR_SYSTEM, &system_path) && + SysInfo::AmountOfTotalDiskSpace( + FilePath(system_path.GetComponents()[0])) >= kMinTotalDiskSpace; - if (!IsTPM20Supported()) { - return false; - } + result.firmware = IsUEFISecureBootEnabled(); - return true; - }(); + result.tpm = IsTPM20Supported(); - return is_win11_upgrade_eligible; + return result; + }(); + + return evaluate_win11_upgrade_eligibility; } } // namespace base::win
diff --git a/base/win/hardware_check.h b/base/win/hardware_check.h index 5b0c85f0..f71b6f09 100644 --- a/base/win/hardware_check.h +++ b/base/win/hardware_check.h
@@ -9,10 +9,20 @@ namespace base::win { -// Returns true if the hardware supports Win11. It is intended to be called -// on OS versions below Win11 and validates against minimum requirements. +struct BASE_EXPORT HardwareEvaluationResult { + bool cpu = false; + bool memory = false; + bool disk = false; + bool firmware = false; + bool tpm = false; + + bool IsEligible() const; +}; + +// Returns result for hardware eligibility for Win11. It is intended to be +// called on OS versions below Win11 and validates against min requirements. // This must be called from a context that allows I/O operations. -BASE_EXPORT bool IsWin11UpgradeEligible(); +BASE_EXPORT HardwareEvaluationResult EvaluateWin11UpgradeEligibility(); } // namespace base::win
diff --git a/base/win/hardware_check_unittest.cc b/base/win/hardware_check_unittest.cc index 5e58ef00..a0714fb 100644 --- a/base/win/hardware_check_unittest.cc +++ b/base/win/hardware_check_unittest.cc
@@ -8,10 +8,19 @@ namespace base::win { -TEST(IsWin11UpgradeEligible, ExpectNoCrash) { +TEST(HardwareEvaluationResult, Eligible) { + HardwareEvaluationResult result{ + .cpu = true, .memory = true, .disk = true, .firmware = true, .tpm = true}; + EXPECT_TRUE(result.IsEligible()); + + result.cpu = false; + EXPECT_FALSE(result.IsEligible()); +} + +TEST(EvaluateWin11UpgradeEligibility, ExpectNoCrash) { // It's not worthwhile to check the validity of the return value // so just check for crashes. - IsWin11UpgradeEligible(); + EvaluateWin11UpgradeEligibility(); } } // namespace base::win
diff --git a/build/config/apple/mobile_config.gni b/build/config/apple/mobile_config.gni index d296b7e..7f556a3 100644 --- a/build/config/apple/mobile_config.gni +++ b/build/config/apple/mobile_config.gni
@@ -29,6 +29,14 @@ # TODO(crbug.com/378918882): Prefix with apple_mobile_ instead of ios_. ios_app_bundle_id_prefix = "org.chromium.ost" + # Suffix for CFBundleIdentifier property of iOS Chrome signed bundles + # (main bundle and extensions). Code signing will fail if no mobile + # provisioning for the selected code signing identify support that suffix. + # For extension, the suffix will be added before the extension identifier. + # The suffix is not added to test applications. + # No dot is added before the suffix, so add one if needed. + apple_mobile_app_bundle_id_suffix = ".dev" + # Paths to the mobileprovision files for the chosen code signing # identity description and app bundle id prefix. # TODO(crbug.com/378918882): Prefix with apple_mobile_ instead of ios_.
diff --git a/build/linux/sysroot_scripts/generated_package_lists/bullseye.amd64 b/build/linux/sysroot_scripts/generated_package_lists/bullseye.amd64 index b428825..2526157 100644 --- a/build/linux/sysroot_scripts/generated_package_lists/bullseye.amd64 +++ b/build/linux/sysroot_scripts/generated_package_lists/bullseye.amd64
@@ -1,21 +1,40 @@ +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/acl/libacl1_2.2.53-10_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/adduser/adduser_3.118_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/adwaita-icon-theme/adwaita-icon-theme_3.38.0-1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/alsa-lib/libasound2-data_1.2.4-1.1_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/alsa-lib/libasound2-dev_1.2.4-1.1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/alsa-lib/libasound2_1.2.4-1.1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/aom/libaom0_1.0.0.errata1-3_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/aom/libaom3_3.6.0-1~bpo11+1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/apparmor/libapparmor1_2.13.6-10_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/argon2/libargon2-1_0~20171227-0.2_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/at-spi2-atk/libatk-bridge2.0-0_2.38.0-4~bpo11+1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/at-spi2-atk/libatk-bridge2.0-dev_2.38.0-4~bpo11+1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/at-spi2-core/gir1.2-atspi-2.0_2.44.1-1~bpo11+1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/at-spi2-core/libatspi2.0-0_2.44.1-1~bpo11+1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/at-spi2-core/libatspi2.0-dev_2.44.1-1~bpo11+1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/atk1.0/gir1.2-atk-1.0_2.38.0-1~bpo11+1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/atk1.0/libatk1.0-0_2.38.0-1~bpo11+1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/atk1.0/libatk1.0-data_2.38.0-1~bpo11+1_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/atk1.0/libatk1.0-dev_2.38.0-1~bpo11+1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/attr/libattr1_2.4.48-6_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/audit/libaudit-common_3.0-2_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/audit/libaudit1_3.0-2_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/avahi/libavahi-client3_0.8-5+deb11u2_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/avahi/libavahi-common-data_0.8-5+deb11u2_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/avahi/libavahi-common3_0.8-5+deb11u2_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/binutils/binutils-common_2.35.2-2_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/binutils/binutils-x86-64-linux-gnu_2.35.2-2_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/binutils/binutils_2.35.2-2_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/binutils/libbinutils_2.35.2-2_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/binutils/libctf-nobfd0_2.35.2-2_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/binutils/libctf0_2.35.2-2_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/bluez/libbluetooth-dev_5.55-3.1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/bluez/libbluetooth3_5.55-3.1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/brotli/libbrotli-dev_1.0.9-2+b2_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/brotli/libbrotli1_1.0.9-2+b2_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/build-essential/build-essential_12.9_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/bzip2/bzip2_1.0.8-4_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/bzip2/libbz2-1.0_1.0.8-4_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cairo/libcairo-gobject2_1.16.0-5_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cairo/libcairo-script-interpreter2_1.16.0-5_amd64.deb @@ -26,6 +45,8 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/codec2/libcodec2-0.9_0.9.2-4_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/codec2/libcodec2-1.0_1.0.5-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/colord/libcolord2_1.4.5-3_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/coreutils/coreutils_8.32-4+b1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cryptsetup/libcryptsetup12_2.3.7-1+deb11u1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cups/libcups2-dev_2.3.3op2-3+deb11u2_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cups/libcups2_2.3.3op2-3+deb11u2_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cups/libcupsimage2-dev_2.3.3op2-3+deb11u2_amd64.deb @@ -33,13 +54,27 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/curl/libcurl3-gnutls_7.88.1-7~bpo11+2_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/curl/libcurl4-gnutls-dev_7.88.1-7~bpo11+2_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cyrus-sasl2/libsasl2-2_2.1.27+dfsg-2.1+deb11u1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cyrus-sasl2/libsasl2-modules-db_2.1.27+dfsg-2.1+deb11u1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/dav1d/libdav1d4_0.7.1-3_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/dav1d/libdav1d6_1.0.0-2_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/db5.3/libdb5.3_5.3.28+dfsg1-0.8_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/dbus-glib/libdbus-glib-1-2_0.110-6_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/dbus/dbus-bin_1.14.6-1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/dbus/dbus-daemon_1.14.6-1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/dbus/dbus-session-bus-common_1.14.6-1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/dbus/dbus-system-bus-common_1.14.6-1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/dbus/dbus-user-session_1.14.6-1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/dbus/dbus_1.14.6-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/dbus/libdbus-1-3_1.12.24-0+deb11u1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/dbus/libdbus-1-dev_1.12.24-0+deb11u1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/dconf/dconf-gsettings-backend_0.38.0-2_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/dconf/dconf-service_0.38.0-2_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/dconf/libdconf1_0.38.0-2_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/debconf/debconf_1.5.77_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/double-conversion/libdouble-conversion3_3.1.5-6.1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/dpkg/dpkg-dev_1.20.12_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/dpkg/dpkg_1.20.12_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/dpkg/libdpkg-perl_1.20.12_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/e/e2fsprogs/comerr-dev_2.1-1.46.6-1~bpo11+1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/e/e2fsprogs/libcom-err2_1.46.6-1~bpo11+1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/e/elfutils/libelf-dev_0.187-1~bpo11+1_amd64.deb @@ -50,6 +85,7 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/ffmpeg/libavcodec58_4.3.5-0+deb11u1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/ffmpeg/libavcodec59_5.1.3-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/ffmpeg/libavformat-dev_4.3.5-0+deb11u1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/ffmpeg/libavformat58_4.3.5-0+deb11u1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/ffmpeg/libavformat59_5.1.3-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/ffmpeg/libavutil-dev_4.3.5-0+deb11u1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/ffmpeg/libavutil56_4.3.5-0+deb11u1_amd64.deb @@ -59,15 +95,25 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/ffmpeg/libswresample4_5.1.3-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/flac/libflac-dev_1.3.3-2+deb11u1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/flac/libflac8_1.3.3-2+deb11u1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/fontconfig/fontconfig-config_2.13.1-4.2_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/fontconfig/fontconfig_2.13.1-4.2_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/fontconfig/libfontconfig-dev_2.13.1-4.2_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/fontconfig/libfontconfig1-dev_2.13.1-4.2_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/fontconfig/libfontconfig1_2.13.1-4.2_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/fonts-dejavu/fonts-dejavu-core_2.37-2_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/freetype/libfreetype-dev_2.10.4+dfsg-1+deb11u1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/freetype/libfreetype6-dev_2.10.4+dfsg-1+deb11u1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/freetype/libfreetype6_2.10.4+dfsg-1+deb11u1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/fribidi/libfribidi-dev_1.0.8-2+deb11u1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/fribidi/libfribidi0_1.0.8-2+deb11u1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/game-music-emu/libgme0_0.6.3-2_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-10/cpp-10_10.2.1-6_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-10/g++-10_10.2.1-6_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-10/gcc-10-base_10.2.1-6_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-10/gcc-10_10.2.1-6_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-10/libasan6_10.2.1-6_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-10/libatomic1_10.2.1-6_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-10/libcc1-0_10.2.1-6_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-10/libgcc-10-dev_10.2.1-6_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-10/libgcc-s1_10.2.1-6_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-10/libgomp1_10.2.1-6_amd64.deb @@ -78,40 +124,85 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-10/libstdc++6_10.2.1-6_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-10/libtsan0_10.2.1-6_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-10/libubsan1_10.2.1-6_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-defaults/cpp_10.2.1-1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-defaults/g++_10.2.1-1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-defaults/gcc_10.2.1-1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gdbm/libgdbm-compat4_1.19-2_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gdbm/libgdbm6_1.19-2_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gdk-pixbuf-xlib/libgdk-pixbuf-xlib-2.0-0_2.40.2-2_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gdk-pixbuf-xlib/libgdk-pixbuf2.0-0_2.40.2-2_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gdk-pixbuf/gir1.2-gdkpixbuf-2.0_2.42.2+dfsg-1+deb11u1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gdk-pixbuf/libgdk-pixbuf-2.0-0_2.42.2+dfsg-1+deb11u1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gdk-pixbuf/libgdk-pixbuf-2.0-dev_2.42.2+dfsg-1+deb11u1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gdk-pixbuf/libgdk-pixbuf2.0-bin_2.42.2+dfsg-1+deb11u1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gdk-pixbuf/libgdk-pixbuf2.0-common_2.42.2+dfsg-1+deb11u1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glib-networking/glib-networking-common_2.66.0-2_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glib-networking/glib-networking-services_2.66.0-2_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glib-networking/glib-networking_2.66.0-2_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glib2.0/libglib2.0-0_2.66.8-1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glib2.0/libglib2.0-bin_2.66.8-1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glib2.0/libglib2.0-data_2.66.8-1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glib2.0/libglib2.0-dev-bin_2.66.8-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glib2.0/libglib2.0-dev_2.66.8-1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glibc/libc-dev-bin_2.31-13+deb11u5_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glibc/libc6-dbg_2.31-13+deb11u5_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glibc/libc6-dev_2.31-13+deb11u5_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glibc/libc6-dev_2.31-13+deb11u6_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glibc/libc6_2.31-13+deb11u5_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gmp/libgmp-dev_6.2.1+dfsg-1+deb11u1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gmp/libgmp10_6.2.1+dfsg-1+deb11u1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gmp/libgmpxx4ldbl_6.2.1+dfsg-1+deb11u1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gnutls28/libgnutls-dane0_3.7.1-5+deb11u3_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gnutls28/libgnutls-openssl27_3.7.1-5+deb11u3_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gnutls28/libgnutls28-dev_3.7.1-5+deb11u3_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gnutls28/libgnutls30_3.7.1-5+deb11u3_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gnutls28/libgnutlsxx28_3.7.1-5+deb11u3_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gobject-introspection/gir1.2-freedesktop_1.66.1-1+b1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gobject-introspection/gir1.2-glib-2.0_1.66.1-1+b1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gobject-introspection/gobject-introspection_1.66.1-1+b1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gobject-introspection/libgirepository-1.0-1_1.66.1-1+b1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gobject-introspection/libgirepository1.0-dev_1.66.1-1+b1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/graphene/gir1.2-graphene-1.0_1.10.4+dfsg1-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/graphene/libgraphene-1.0-0_1.10.4+dfsg1-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/graphene/libgraphene-1.0-dev_1.10.4+dfsg1-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/graphite2/libgraphite2-3_1.3.14-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/graphite2/libgraphite2-dev_1.3.14-1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gsettings-desktop-schemas/gsettings-desktop-schemas_3.38.0-2_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gtk+2.0/gir1.2-gtk-2.0_2.24.33-2_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gtk+2.0/libgtk2.0-0_2.24.33-2_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gtk+2.0/libgtk2.0-common_2.24.33-2_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gtk+2.0/libgtk2.0-dev_2.24.33-2_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gtk+3.0/gir1.2-gtk-3.0_3.24.24-4+deb11u3_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gtk+3.0/gtk-update-icon-cache_3.24.24-4+deb11u3_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gtk+3.0/libgtk-3-0_3.24.24-4+deb11u3_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gtk+3.0/libgtk-3-common_3.24.24-4+deb11u3_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gtk+3.0/libgtk-3-dev_3.24.24-4+deb11u3_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gtk4/gir1.2-gtk-4.0_4.8.3+ds-2_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gtk4/libgtk-4-1_4.8.3+ds-2_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gtk4/libgtk-4-common_4.8.3+ds-2_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gtk4/libgtk-4-dev_4.8.3+ds-2_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/h/harfbuzz/gir1.2-harfbuzz-0.0_2.7.4-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/h/harfbuzz/libharfbuzz-dev_2.7.4-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/h/harfbuzz/libharfbuzz-gobject0_2.7.4-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/h/harfbuzz/libharfbuzz-icu0_2.7.4-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/h/harfbuzz/libharfbuzz0b_2.7.4-1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/h/hicolor-icon-theme/hicolor-icon-theme_0.17-2_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/h/highway/libhwy1_1.0.3-3_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/i/icu-le-hb/libicu-le-hb0_1.0.3+git180724-3+b2_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/i/icu/icu-devtools_67.1-7_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/i/icu/libicu-dev_67.1-7_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/i/icu/libicu67_67.1-7_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/i/intel-mediasdk/libmfx1_21.1.0-1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/i/iptables/libip4tc2_1.8.7-1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/i/isl/libisl23_0.23-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/j/jbigkit/libjbig-dev_2.1-3.1+b2_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/j/jbigkit/libjbig0_2.1-3.1+b2_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/j/jpeg-xl/libjxl0.7_0.7.0-10_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/j/json-c/libjson-c5_0.15-2_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/j/json-glib/libjson-glib-1.0-0_1.6.2-1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/j/json-glib/libjson-glib-1.0-common_1.6.2-1_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/k/keyutils/libkeyutils1_1.6.1-2_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/k/kmod/libkmod2_28-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/k/krb5/krb5-multidev_1.18.3-6+deb11u3_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/k/krb5/libgssapi-krb5-2_1.18.3-6+deb11u3_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/k/krb5/libgssrpc4_1.18.3-6+deb11u3_amd64.deb @@ -126,6 +217,12 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lcms2/liblcms2-2_2.12~rc1-2_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lerc/liblerc4_4.0.0+ds-2_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/linux/linux-libc-dev_6.1.20-2~bpo11+1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/llvm-toolchain-11/libllvm11_11.0.1-2_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lm-sensors/libsensors-config_3.6.0-7_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lm-sensors/libsensors5_3.6.0-7_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lsb/lsb-base_11.1.0_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lvm2/dmsetup_1.02.175-2.1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lvm2/libdevmapper1.02.1_1.02.175-2.1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lz4/liblz4-1_1.9.3-2_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lzo2/liblzo2-2_2.10-2_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/liba/libasyncns/libasyncns0_0.8-6+b2_amd64.deb @@ -138,6 +235,7 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libc/libcloudproviders/libcloudproviders0_0.3.0-3_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdatrie/libdatrie-dev_0.2.13-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdatrie/libdatrie1_0.2.13-1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdbusmenu/gir1.2-dbusmenu-glib-0.4_18.10.20180917~bzr492+repack1-2_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdbusmenu/libdbusmenu-glib-dev_18.10.20180917~bzr492+repack1-2_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdbusmenu/libdbusmenu-glib4_18.10.20180917~bzr492+repack1-2_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdbusmenu/libdbusmenu-gtk3-4_18.10.20180917~bzr492+repack1-2_amd64.deb @@ -145,11 +243,13 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdeflate/libdeflate-dev_1.10-2~bpo11+1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdeflate/libdeflate0_1.10-2~bpo11+1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdrm/libdrm-amdgpu1_2.4.104-1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdrm/libdrm-common_2.4.104-1_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdrm/libdrm-dev_2.4.104-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdrm/libdrm-intel1_2.4.104-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdrm/libdrm-nouveau2_2.4.104-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdrm/libdrm-radeon1_2.4.104-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdrm/libdrm2_2.4.104-1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libe/libedit/libedit2_3.1-20191231-2+b1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libe/libepoxy/libepoxy-dev_1.5.8-1~bpo11+1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libe/libepoxy/libepoxy0_1.5.8-1~bpo11+1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libe/libevdev/libevdev-dev_1.11.0+dfsg-1_amd64.deb @@ -159,6 +259,8 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libf/libffi/libffi7_3.3-6_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libgcrypt20/libgcrypt20-dev_1.8.7-6_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libgcrypt20/libgcrypt20_1.8.7-6_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglu/libglu1-mesa-dev_9.0.1-1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglu/libglu1-mesa_9.0.1-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libegl-dev_1.3.2-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libegl1_1.3.2-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libgl-dev_1.3.2-1_amd64.deb @@ -170,22 +272,30 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libglvnd0_1.3.2-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libglx-dev_1.3.2-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libglx0_1.3.2-1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libopengl-dev_1.3.2-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libopengl0_1.3.2-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libgpg-error/libgpg-error-dev_1.38-2_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libgpg-error/libgpg-error0_1.38-2_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libgsm/libgsm1_1.0.18-2_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libgudev/gir1.2-gudev-1.0_234-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libgudev/libgudev-1.0-0_234-1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libgudev/libgudev-1.0-dev_234-1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libice/libice-dev_1.0.10-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libice/libice6_1.0.10-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libidl/libidl-2-0_0.8.14-4+b12_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libidn/libidn11_1.33-3_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libidn2/libidn2-0_2.3.0-5_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libidn2/libidn2-dev_2.3.0-5_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libinput/libinput-bin_1.16.4-3_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libinput/libinput-dev_1.16.4-3_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libinput/libinput10_1.16.4-3_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libj/libjpeg-turbo/libjpeg-dev_2.0.6-4_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libj/libjpeg-turbo/libjpeg62-turbo-dev_2.0.6-4_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libj/libjpeg-turbo/libjpeg62-turbo_2.0.6-4_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libj/libjsoncpp/libjsoncpp-dev_1.9.4-4_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libj/libjsoncpp/libjsoncpp24_1.9.4-4_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libm/libmd/libmd0_1.0.3-3_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libn/libnsl/libnsl-dev_1.3.0-2_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libn/libnsl/libnsl2_1.3.0-2_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libn/libnss-db/libnss-db_2.2.3pre1-6+b10_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libo/libogg/libogg-dev_1.3.4-0.1_amd64.deb @@ -202,10 +312,15 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libr/librest/librest-0.7-0_0.8.1-1.1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libr/librist/librist4_0.2.7+dfsg-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libr/librsvg/librsvg2-2_2.50.3+dfsg-1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libseccomp/libseccomp2_2.5.1-1+deb11u1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libselinux/libselinux1-dev_3.1-3_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libselinux/libselinux1_3.1-3_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsemanage/libsemanage-common_3.1-1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsemanage/libsemanage1_3.1-1+b2_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsepol/libsepol1-dev_3.1-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsepol/libsepol1_3.1-1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libset-scalar-perl/libset-scalar-perl_1.29-2_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsm/libsm-dev_1.2.3-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsm/libsm6_1.2.3-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsndfile/libsndfile1_1.0.31-2_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsodium/libsodium23_1.0.18-1_amd64.deb @@ -214,10 +329,14 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsoxr/libsoxr0_0.1.3-4_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libssh/libssh-gcrypt-4_0.9.5-1+deb11u1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libssh2/libssh2-1_1.9.0-2_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libt/libtasn1-6/libtasn1-6-dev_4.16.0-2+deb11u1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libt/libtasn1-6/libtasn1-6_4.16.0-2+deb11u1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libt/libthai/libthai-data_0.1.28-3_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libt/libthai/libthai-dev_0.1.28-3_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libt/libthai/libthai0_0.1.28-3_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libt/libtheora/libtheora0_1.1.1+dfsg.1-15_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libt/libtirpc/libtirpc-common_1.3.1-1+deb11u1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libt/libtirpc/libtirpc-dev_1.3.1-1+deb11u1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libt/libtirpc/libtirpc3_1.3.1-1+deb11u1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libt/libtool/libltdl7_2.4.6-15_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libu/libudfread/libudfread0_1.1.1-1_amd64.deb @@ -237,6 +356,8 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libv/libvpx/libvpx-dev_1.9.0-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libv/libvpx/libvpx6_1.9.0-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libv/libvpx/libvpx7_1.12.0-1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libw/libwacom/libwacom-common_1.8-2_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libw/libwacom/libwacom-dev_1.8-2_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libw/libwacom/libwacom2_1.8-2_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libw/libwebp/libwebp-dev_0.6.1-2.1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libw/libwebp/libwebp6_0.6.1-2.1_amd64.deb @@ -244,6 +365,7 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libw/libwebp/libwebpdemux2_0.6.1-2.1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libw/libwebp/libwebpmux3_0.6.1-2.1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libx11/libx11-6_1.7.2-1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libx11/libx11-data_1.7.2-1_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libx11/libx11-dev_1.7.2-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libx11/libx11-xcb-dev_1.7.2-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libx11/libx11-xcb1_1.7.2-1_amd64.deb @@ -296,6 +418,7 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxkbcommon/libxkbcommon-x11-0_1.0.3-2_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxkbcommon/libxkbcommon0_1.0.3-2_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxml2/libxml2-dev_2.9.10+dfsg-6.7+deb11u4_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxml2/libxml2-utils_2.9.10+dfsg-6.7+deb11u4_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxml2/libxml2_2.9.10+dfsg-6.7+deb11u4_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxrandr/libxrandr-dev_1.5.1-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxrandr/libxrandr2_1.5.1-1_amd64.deb @@ -314,27 +437,40 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxxf86vm/libxxf86vm-dev_1.1.4-1+b2_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxxf86vm/libxxf86vm1_1.1.4-1+b2_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libz/libzstd/libzstd1_1.4.8+dfsg-2.1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/make-dfsg/make_4.3-4.1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mako/python3-mako_1.1.3+ds1-2_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/markupsafe/python3-markupsafe_2.0.1-2~bpo11+1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mbedtls/libmbedcrypto7_2.28.3-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/md4c/libmd4c0_0.4.7-2_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/media-types/media-types_4.0.0_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libegl-mesa0_20.3.5-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libegl1-mesa-dev_20.3.5-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libegl1-mesa_20.3.5-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libgbm-dev_20.3.5-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libgbm1_20.3.5-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libgl1-mesa-dev_20.3.5-1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libgl1-mesa-dri_20.3.5-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libgl1-mesa-glx_20.3.5-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libglapi-mesa_20.3.5-1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libglx-mesa0_20.3.5-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libwayland-egl1-mesa_20.3.5-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/mesa-common-dev_20.3.5-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/minizip/libminizip-dev_1.1-8+b1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/minizip/libminizip1_1.1-8+b1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mpclib3/libmpc3_1.2.0-1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mpdecimal/libmpdec3_2.5.1-1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mpfr4/libmpfr6_4.1.0-3_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mpg123/libmpg123-0_1.26.4-1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mtdev/libmtdev-dev_1.1.6-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mtdev/libmtdev1_1.1.6-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/ncurses/libncurses-dev_6.2+20201114-2+deb11u1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/ncurses/libncurses6_6.2+20201114-2+deb11u1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/ncurses/libncursesw6_6.2+20201114-2+deb11u1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/ncurses/libtinfo6_6.2+20201114-2+deb11u1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/ncurses/ncurses-bin_6.2+20201114-2+deb11u1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/nettle/libhogweed6_3.7.3-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/nettle/libnettle8_3.7.3-1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/nettle/nettle-dev_3.7.3-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/nghttp2/libnghttp2-14_1.43.0-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/norm/libnorm1_1.5.9+dfsg-2_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/nspr/libnspr4-dev_4.29-1_amd64.deb @@ -349,15 +485,22 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/o/openssl/libssl1.1_1.1.1n-0+deb11u4_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/o/opus/libopus-dev_1.3.1-0.1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/o/opus/libopus0_1.3.1-0.1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/p11-kit/libp11-kit-dev_0.23.22-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/p11-kit/libp11-kit0_0.23.22-1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pam/libpam-modules_1.4.0-9+deb11u1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pam/libpam-runtime_1.4.0-9+deb11u1_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pam/libpam0g-dev_1.4.0-9+deb11u1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pam/libpam0g_1.4.0-9+deb11u1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pango1.0/gir1.2-pango-1.0_1.46.2-3_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pango1.0/libpango-1.0-0_1.46.2-3_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pango1.0/libpango1.0-dev_1.46.2-3_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pango1.0/libpangocairo-1.0-0_1.46.2-3_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pango1.0/libpangoft2-1.0-0_1.46.2-3_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pango1.0/libpangoxft-1.0-0_1.46.2-3_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pango1.0/pango1.0-tools_1.46.2-3_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pangox-compat/libpangox-1.0-0_0.0.2-5.1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/patch/patch_2.7.6-7_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pci.ids/pci.ids_0.0~2021.02.08-1_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pciutils/libpci-dev_3.7.0-5_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pciutils/libpci3_3.7.0-5_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pcre2/libpcre2-16-0_10.36-2+deb11u1_amd64.deb @@ -370,14 +513,29 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pcre3/libpcre32-3_8.39-13_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pcre3/libpcre3_8.39-13_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pcre3/libpcrecpp0v5_8.39-13_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/perl/libperl5.32_5.32.1-4+deb11u2_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/perl/perl-base_5.32.1-4+deb11u2_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/perl/perl-modules-5.32_5.32.1-4+deb11u2_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/perl/perl_5.32.1-4+deb11u2_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pipewire/libpipewire-0.3-0_0.3.65-2~bpo11+1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pipewire/libpipewire-0.3-dev_0.3.65-2~bpo11+1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pipewire/libspa-0.2-dev_0.3.65-2~bpo11+1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pipewire/libspa-0.2-modules_0.3.65-2~bpo11+1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pixman/libpixman-1-0_0.40.0-1.1~deb11u1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pixman/libpixman-1-dev_0.40.0-1.1~deb11u1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pkg-config/pkg-config_0.29.2-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pulseaudio/libpulse-dev_14.2-2_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pulseaudio/libpulse-mainloop-glib0_14.2-2_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pulseaudio/libpulse0_14.2-2_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/python-markdown/python3-markdown_3.3.4-1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/python3-defaults/libpython3-stdlib_3.9.2-3_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/python3-defaults/python3_3.9.2-3_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/python3-stdlib-extensions/python3-distutils_3.9.2-1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/python3-stdlib-extensions/python3-lib2to3_3.9.2-1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/python3.9/libpython3.9-minimal_3.9.2-1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/python3.9/libpython3.9-stdlib_3.9.2-1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/python3.9/python3.9-minimal_3.9.2-1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/python3.9/python3.9_3.9.2-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/libqt6concurrent6_6.4.2+dfsg-10~bpo11+1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/libqt6core6_6.4.2+dfsg-10~bpo11+1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/libqt6dbus6_6.4.2+dfsg-10~bpo11+1_amd64.deb @@ -390,8 +548,11 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/libqt6test6_6.4.2+dfsg-10~bpo11+1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/libqt6widgets6_6.4.2+dfsg-10~bpo11+1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/libqt6xml6_6.4.2+dfsg-10~bpo11+1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/qmake6-bin_6.4.2+dfsg-10~bpo11+1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/qmake6_6.4.2+dfsg-10~bpo11+1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/qt6-base-dev-tools_6.4.2+dfsg-10~bpo11+1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/qt6-base-dev_6.4.2+dfsg-10~bpo11+1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/qt6-qpa-plugins_6.4.2+dfsg-10~bpo11+1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/libqt5concurrent5_5.15.2+dfsg-9_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/libqt5core5a_5.15.2+dfsg-9_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/libqt5dbus5_5.15.2+dfsg-9_amd64.deb @@ -402,12 +563,21 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/libqt5test5_5.15.2+dfsg-9_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/libqt5widgets5_5.15.2+dfsg-9_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/libqt5xml5_5.15.2+dfsg-9_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/qt5-qmake-bin_5.15.2+dfsg-9_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/qt5-qmake_5.15.2+dfsg-9_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/qtbase5-dev-tools_5.15.2+dfsg-9_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/qtbase5-dev_5.15.2+dfsg-9_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtchooser/qtchooser_66-2_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/r/re2/libre2-9_20210201+dfsg-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/r/re2/libre2-dev_20210201+dfsg-1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/r/readline/libreadline8_8.1-1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/r/readline/readline-common_8.1-1_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/r/rtmpdump/librtmp1_2.4+20151223.gitfa8646d.1-2+b2_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/r/rust-rav1e/librav1e0_0.5.1-6_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/sensible-utils/sensible-utils_0.0.14_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/setuptools/python3-pkg-resources_66.1.1-1~bpo11+1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/shadow/login_4.8.1-1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/shadow/passwd_4.8.1-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/shared-mime-info/shared-mime-info_2.0-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/shine/libshine3_3.1.1-2_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/snappy/libsnappy-dev_1.1.8-1_amd64.deb @@ -416,12 +586,18 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/speech-dispatcher/libspeechd2_0.11.4-2~bpo11+1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/speex/libspeex1_1.2~rc1.2-1.1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/sqlite3/libsqlite3-0_3.34.1-3_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/srt/libsrt1.4-gnutls_1.4.2-1.3_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/srt/libsrt1.5-gnutls_1.5.1-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/svt-av1/libsvtav1enc1_1.4.1+dfsg-1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/systemd/libpam-systemd_252.5-2~bpo11+1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/systemd/libsystemd-dev_252.5-2~bpo11+1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/systemd/libsystemd-shared_252.5-2~bpo11+1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/systemd/libsystemd0_252.5-2~bpo11+1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/systemd/libudev-dev_252.5-2~bpo11+1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/systemd/libudev1_252.5-2~bpo11+1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/systemd/systemd-sysv_252.5-2~bpo11+1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/systemd/systemd_252.5-2~bpo11+1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/t/tar/tar_1.34+dfsg-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/t/tcp-wrappers/libwrap0_7.6.q-31_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/t/tiff/libtiff-dev_4.2.0-1+deb11u4_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/t/tiff/libtiff5_4.2.0-1+deb11u4_amd64.deb @@ -429,12 +605,17 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/t/tiff/libtiffxx5_4.2.0-1+deb11u4_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/t/tslib/libts0_1.22-1+b1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/t/twolame/libtwolame0_0.4.0-2_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/t/tzdata/tzdata_2021a-1+deb11u9_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/ucf/ucf_3.0043_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/unbound/libunbound8_1.17.1-2~bpo11+1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/libblkid-dev_2.36.1-8+deb11u1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/libblkid1_2.36.1-8+deb11u1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/libfdisk1_2.36.1-8+deb11u1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/libmount-dev_2.36.1-8+deb11u1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/libmount1_2.36.1-8+deb11u1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/libuuid1_2.36.1-8+deb11u1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/mount_2.36.1-8+deb11u1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/util-linux_2.36.1-8+deb11u1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/uuid-dev_2.36.1-8+deb11u1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/v/valgrind/valgrind_3.16.1-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/v/vulkan-loader/libvulkan-dev_1.3.224.0-1~bpo11+1_amd64.deb @@ -448,6 +629,7 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/w/wayland/libwayland-egl-backend-dev_1.18.0-2~exp1.1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/w/wayland/libwayland-egl1_1.18.0-2~exp1.1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/w/wayland/libwayland-server0_1.18.0-2~exp1.1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/w/webrtc-audio-processing/libwebrtc-audio-processing1_0.3-1+b1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/x264/libx264-160_0.160.3011+gitcde9a93-2.1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/x264/libx264-164_0.164.3095+gitbaee400-3_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/x265/libx265-192_3.4-2_amd64.deb @@ -462,10 +644,27 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xcb-util/libxcb-util1_0.4.0-1+b1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xft/libxft-dev_2.3.2-2_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xft/libxft2_2.3.2-2_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xkeyboard-config/xkb-data_2.29-2_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xorg-sgml-doctools/xorg-sgml-doctools_1.11-1.1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xorg/x11-common_7.7+22_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xorgproto/x11proto-core-dev_2020.1-1_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xorgproto/x11proto-dev_2020.1-1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xorgproto/x11proto-input-dev_2020.1-1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xorgproto/x11proto-randr-dev_2020.1-1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xorgproto/x11proto-record-dev_2020.1-1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xorgproto/x11proto-render-dev_2020.1-1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xorgproto/x11proto-scrnsaver-dev_2020.1-1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xorgproto/x11proto-xext-dev_2020.1-1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xorgproto/x11proto-xf86vidmode-dev_2020.1-1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xorgproto/x11proto-xinerama-dev_2020.1-1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xtrans/xtrans-dev_1.4.0-1_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xvidcore/libxvidcore4_1.3.7-1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xz-utils/liblzma-dev_5.2.5-2.1~deb11u1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xz-utils/liblzma5_5.2.5-2.1~deb11u1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xz-utils/xz-utils_5.2.5-2.1~deb11u1_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/z/z3/libz3-4_4.8.10-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/z/zeromq3/libzmq5_4.3.4-1_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/z/zlib/zlib1g-dev_1.2.11.dfsg-2+deb11u2_amd64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/z/zlib/zlib1g_1.2.11.dfsg-2+deb11u2_amd64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/z/zvbi/libzvbi-common_0.2.35-18_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/z/zvbi/libzvbi0_0.2.35-18_amd64.deb
diff --git a/build/linux/sysroot_scripts/generated_package_lists/bullseye.arm64 b/build/linux/sysroot_scripts/generated_package_lists/bullseye.arm64 index a9290d4a..73b565d 100644 --- a/build/linux/sysroot_scripts/generated_package_lists/bullseye.arm64 +++ b/build/linux/sysroot_scripts/generated_package_lists/bullseye.arm64
@@ -1,21 +1,40 @@ +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/acl/libacl1_2.2.53-10_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/adduser/adduser_3.118_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/adwaita-icon-theme/adwaita-icon-theme_3.38.0-1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/alsa-lib/libasound2-data_1.2.4-1.1_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/alsa-lib/libasound2-dev_1.2.4-1.1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/alsa-lib/libasound2_1.2.4-1.1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/aom/libaom0_1.0.0.errata1-3_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/aom/libaom3_3.6.0-1~bpo11+1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/apparmor/libapparmor1_2.13.6-10_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/argon2/libargon2-1_0~20171227-0.2_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/at-spi2-atk/libatk-bridge2.0-0_2.38.0-4~bpo11+1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/at-spi2-atk/libatk-bridge2.0-dev_2.38.0-4~bpo11+1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/at-spi2-core/gir1.2-atspi-2.0_2.44.1-1~bpo11+1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/at-spi2-core/libatspi2.0-0_2.44.1-1~bpo11+1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/at-spi2-core/libatspi2.0-dev_2.44.1-1~bpo11+1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/atk1.0/gir1.2-atk-1.0_2.38.0-1~bpo11+1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/atk1.0/libatk1.0-0_2.38.0-1~bpo11+1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/atk1.0/libatk1.0-data_2.38.0-1~bpo11+1_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/atk1.0/libatk1.0-dev_2.38.0-1~bpo11+1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/attr/libattr1_2.4.48-6_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/audit/libaudit-common_3.0-2_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/audit/libaudit1_3.0-2_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/avahi/libavahi-client3_0.8-5+deb11u2_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/avahi/libavahi-common-data_0.8-5+deb11u2_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/avahi/libavahi-common3_0.8-5+deb11u2_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/binutils/binutils-aarch64-linux-gnu_2.35.2-2_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/binutils/binutils-common_2.35.2-2_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/binutils/binutils_2.35.2-2_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/binutils/libbinutils_2.35.2-2_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/binutils/libctf-nobfd0_2.35.2-2_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/binutils/libctf0_2.35.2-2_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/bluez/libbluetooth-dev_5.55-3.1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/bluez/libbluetooth3_5.55-3.1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/brotli/libbrotli-dev_1.0.9-2+b2_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/brotli/libbrotli1_1.0.9-2+b2_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/build-essential/build-essential_12.9_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/bzip2/bzip2_1.0.8-4_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/bzip2/libbz2-1.0_1.0.8-4_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cairo/libcairo-gobject2_1.16.0-5_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cairo/libcairo-script-interpreter2_1.16.0-5_arm64.deb @@ -26,6 +45,8 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/codec2/libcodec2-0.9_0.9.2-4_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/codec2/libcodec2-1.0_1.0.5-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/colord/libcolord2_1.4.5-3_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/coreutils/coreutils_8.32-4_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cryptsetup/libcryptsetup12_2.3.7-1+deb11u1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cups/libcups2-dev_2.3.3op2-3+deb11u2_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cups/libcups2_2.3.3op2-3+deb11u2_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cups/libcupsimage2-dev_2.3.3op2-3+deb11u2_arm64.deb @@ -33,13 +54,27 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/curl/libcurl3-gnutls_7.88.1-7~bpo11+2_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/curl/libcurl4-gnutls-dev_7.88.1-7~bpo11+2_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cyrus-sasl2/libsasl2-2_2.1.27+dfsg-2.1+deb11u1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cyrus-sasl2/libsasl2-modules-db_2.1.27+dfsg-2.1+deb11u1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/dav1d/libdav1d4_0.7.1-3_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/dav1d/libdav1d6_1.0.0-2_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/db5.3/libdb5.3_5.3.28+dfsg1-0.8_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/dbus-glib/libdbus-glib-1-2_0.110-6_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/dbus/dbus-bin_1.14.6-1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/dbus/dbus-daemon_1.14.6-1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/dbus/dbus-session-bus-common_1.14.6-1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/dbus/dbus-system-bus-common_1.14.6-1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/dbus/dbus-user-session_1.14.6-1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/dbus/dbus_1.14.6-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/dbus/libdbus-1-3_1.12.24-0+deb11u1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/dbus/libdbus-1-dev_1.12.24-0+deb11u1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/dconf/dconf-gsettings-backend_0.38.0-2_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/dconf/dconf-service_0.38.0-2_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/dconf/libdconf1_0.38.0-2_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/debconf/debconf_1.5.77_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/double-conversion/libdouble-conversion3_3.1.5-6.1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/dpkg/dpkg-dev_1.20.12_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/dpkg/dpkg_1.20.12_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/dpkg/libdpkg-perl_1.20.12_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/e/e2fsprogs/comerr-dev_2.1-1.46.6-1~bpo11+1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/e/e2fsprogs/libcom-err2_1.46.6-1~bpo11+1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/e/elfutils/libelf-dev_0.187-1~bpo11+1_arm64.deb @@ -50,6 +85,7 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/ffmpeg/libavcodec58_4.3.5-0+deb11u1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/ffmpeg/libavcodec59_5.1.3-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/ffmpeg/libavformat-dev_4.3.5-0+deb11u1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/ffmpeg/libavformat58_4.3.5-0+deb11u1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/ffmpeg/libavformat59_5.1.3-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/ffmpeg/libavutil-dev_4.3.5-0+deb11u1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/ffmpeg/libavutil56_4.3.5-0+deb11u1_arm64.deb @@ -59,15 +95,25 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/ffmpeg/libswresample4_5.1.3-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/flac/libflac-dev_1.3.3-2+deb11u1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/flac/libflac8_1.3.3-2+deb11u1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/fontconfig/fontconfig-config_2.13.1-4.2_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/fontconfig/fontconfig_2.13.1-4.2_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/fontconfig/libfontconfig-dev_2.13.1-4.2_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/fontconfig/libfontconfig1-dev_2.13.1-4.2_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/fontconfig/libfontconfig1_2.13.1-4.2_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/fonts-dejavu/fonts-dejavu-core_2.37-2_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/freetype/libfreetype-dev_2.10.4+dfsg-1+deb11u1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/freetype/libfreetype6-dev_2.10.4+dfsg-1+deb11u1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/freetype/libfreetype6_2.10.4+dfsg-1+deb11u1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/fribidi/libfribidi-dev_1.0.8-2+deb11u1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/fribidi/libfribidi0_1.0.8-2+deb11u1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/game-music-emu/libgme0_0.6.3-2_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-10/cpp-10_10.2.1-6_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-10/g++-10_10.2.1-6_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-10/gcc-10-base_10.2.1-6_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-10/gcc-10_10.2.1-6_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-10/libasan6_10.2.1-6_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-10/libatomic1_10.2.1-6_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-10/libcc1-0_10.2.1-6_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-10/libgcc-10-dev_10.2.1-6_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-10/libgcc-s1_10.2.1-6_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-10/libgomp1_10.2.1-6_arm64.deb @@ -77,39 +123,84 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-10/libstdc++6_10.2.1-6_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-10/libtsan0_10.2.1-6_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-10/libubsan1_10.2.1-6_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-defaults/cpp_10.2.1-1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-defaults/g++_10.2.1-1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-defaults/gcc_10.2.1-1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gdbm/libgdbm-compat4_1.19-2_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gdbm/libgdbm6_1.19-2_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gdk-pixbuf-xlib/libgdk-pixbuf-xlib-2.0-0_2.40.2-2_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gdk-pixbuf-xlib/libgdk-pixbuf2.0-0_2.40.2-2_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gdk-pixbuf/gir1.2-gdkpixbuf-2.0_2.42.2+dfsg-1+deb11u1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gdk-pixbuf/libgdk-pixbuf-2.0-0_2.42.2+dfsg-1+deb11u1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gdk-pixbuf/libgdk-pixbuf-2.0-dev_2.42.2+dfsg-1+deb11u1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gdk-pixbuf/libgdk-pixbuf2.0-bin_2.42.2+dfsg-1+deb11u1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gdk-pixbuf/libgdk-pixbuf2.0-common_2.42.2+dfsg-1+deb11u1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glib-networking/glib-networking-common_2.66.0-2_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glib-networking/glib-networking-services_2.66.0-2_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glib-networking/glib-networking_2.66.0-2_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glib2.0/libglib2.0-0_2.66.8-1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glib2.0/libglib2.0-bin_2.66.8-1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glib2.0/libglib2.0-data_2.66.8-1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glib2.0/libglib2.0-dev-bin_2.66.8-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glib2.0/libglib2.0-dev_2.66.8-1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glibc/libc-dev-bin_2.31-13+deb11u5_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glibc/libc6-dbg_2.31-13+deb11u5_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glibc/libc6-dev_2.31-13+deb11u5_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glibc/libc6-dev_2.31-13+deb11u6_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glibc/libc6_2.31-13+deb11u5_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gmp/libgmp-dev_6.2.1+dfsg-1+deb11u1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gmp/libgmp10_6.2.1+dfsg-1+deb11u1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gmp/libgmpxx4ldbl_6.2.1+dfsg-1+deb11u1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gnutls28/libgnutls-dane0_3.7.1-5+deb11u3_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gnutls28/libgnutls-openssl27_3.7.1-5+deb11u3_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gnutls28/libgnutls28-dev_3.7.1-5+deb11u3_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gnutls28/libgnutls30_3.7.1-5+deb11u3_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gnutls28/libgnutlsxx28_3.7.1-5+deb11u3_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gobject-introspection/gir1.2-freedesktop_1.66.1-1+b1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gobject-introspection/gir1.2-glib-2.0_1.66.1-1+b1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gobject-introspection/gobject-introspection_1.66.1-1+b1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gobject-introspection/libgirepository-1.0-1_1.66.1-1+b1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gobject-introspection/libgirepository1.0-dev_1.66.1-1+b1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/graphene/gir1.2-graphene-1.0_1.10.4+dfsg1-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/graphene/libgraphene-1.0-0_1.10.4+dfsg1-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/graphene/libgraphene-1.0-dev_1.10.4+dfsg1-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/graphite2/libgraphite2-3_1.3.14-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/graphite2/libgraphite2-dev_1.3.14-1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gsettings-desktop-schemas/gsettings-desktop-schemas_3.38.0-2_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gtk+2.0/gir1.2-gtk-2.0_2.24.33-2_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gtk+2.0/libgtk2.0-0_2.24.33-2_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gtk+2.0/libgtk2.0-common_2.24.33-2_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gtk+2.0/libgtk2.0-dev_2.24.33-2_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gtk+3.0/gir1.2-gtk-3.0_3.24.24-4+deb11u3_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gtk+3.0/gtk-update-icon-cache_3.24.24-4+deb11u3_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gtk+3.0/libgtk-3-0_3.24.24-4+deb11u3_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gtk+3.0/libgtk-3-common_3.24.24-4+deb11u3_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gtk+3.0/libgtk-3-dev_3.24.24-4+deb11u3_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gtk4/gir1.2-gtk-4.0_4.8.3+ds-2_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gtk4/libgtk-4-1_4.8.3+ds-2_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gtk4/libgtk-4-common_4.8.3+ds-2_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gtk4/libgtk-4-dev_4.8.3+ds-2_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/h/harfbuzz/gir1.2-harfbuzz-0.0_2.7.4-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/h/harfbuzz/libharfbuzz-dev_2.7.4-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/h/harfbuzz/libharfbuzz-gobject0_2.7.4-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/h/harfbuzz/libharfbuzz-icu0_2.7.4-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/h/harfbuzz/libharfbuzz0b_2.7.4-1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/h/hicolor-icon-theme/hicolor-icon-theme_0.17-2_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/h/highway/libhwy1_1.0.3-3_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/i/icu-le-hb/libicu-le-hb0_1.0.3+git180724-3+b2_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/i/icu/icu-devtools_67.1-7_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/i/icu/libicu-dev_67.1-7_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/i/icu/libicu67_67.1-7_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/i/iptables/libip4tc2_1.8.7-1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/i/isl/libisl23_0.23-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/j/jbigkit/libjbig-dev_2.1-3.1+b2_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/j/jbigkit/libjbig0_2.1-3.1+b2_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/j/jpeg-xl/libjxl0.7_0.7.0-10_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/j/json-c/libjson-c5_0.15-2_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/j/json-glib/libjson-glib-1.0-0_1.6.2-1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/j/json-glib/libjson-glib-1.0-common_1.6.2-1_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/k/keyutils/libkeyutils1_1.6.1-2_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/k/kmod/libkmod2_28-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/k/krb5/krb5-multidev_1.18.3-6+deb11u3_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/k/krb5/libgssapi-krb5-2_1.18.3-6+deb11u3_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/k/krb5/libgssrpc4_1.18.3-6+deb11u3_arm64.deb @@ -124,6 +215,12 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lcms2/liblcms2-2_2.12~rc1-2_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lerc/liblerc4_4.0.0+ds-2_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/linux/linux-libc-dev_6.1.20-2~bpo11+1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/llvm-toolchain-11/libllvm11_11.0.1-2_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lm-sensors/libsensors-config_3.6.0-7_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lm-sensors/libsensors5_3.6.0-7_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lsb/lsb-base_11.1.0_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lvm2/dmsetup_1.02.175-2.1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lvm2/libdevmapper1.02.1_1.02.175-2.1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lz4/liblz4-1_1.9.3-2_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lzo2/liblzo2-2_2.10-2_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/liba/libasyncns/libasyncns0_0.8-6+b2_arm64.deb @@ -136,6 +233,7 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libc/libcloudproviders/libcloudproviders0_0.3.0-3_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdatrie/libdatrie-dev_0.2.13-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdatrie/libdatrie1_0.2.13-1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdbusmenu/gir1.2-dbusmenu-glib-0.4_18.10.20180917~bzr492+repack1-2_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdbusmenu/libdbusmenu-glib-dev_18.10.20180917~bzr492+repack1-2_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdbusmenu/libdbusmenu-glib4_18.10.20180917~bzr492+repack1-2_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdbusmenu/libdbusmenu-gtk3-4_18.10.20180917~bzr492+repack1-2_arm64.deb @@ -143,6 +241,7 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdeflate/libdeflate-dev_1.10-2~bpo11+1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdeflate/libdeflate0_1.10-2~bpo11+1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdrm/libdrm-amdgpu1_2.4.104-1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdrm/libdrm-common_2.4.104-1_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdrm/libdrm-dev_2.4.104-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdrm/libdrm-etnaviv1_2.4.104-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdrm/libdrm-freedreno1_2.4.104-1_arm64.deb @@ -150,6 +249,7 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdrm/libdrm-radeon1_2.4.104-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdrm/libdrm-tegra0_2.4.104-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdrm/libdrm2_2.4.104-1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libe/libedit/libedit2_3.1-20191231-2+b1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libe/libepoxy/libepoxy-dev_1.5.8-1~bpo11+1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libe/libepoxy/libepoxy0_1.5.8-1~bpo11+1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libe/libevdev/libevdev-dev_1.11.0+dfsg-1_arm64.deb @@ -159,6 +259,8 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libf/libffi/libffi7_3.3-6_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libgcrypt20/libgcrypt20-dev_1.8.7-6_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libgcrypt20/libgcrypt20_1.8.7-6_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglu/libglu1-mesa-dev_9.0.1-1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglu/libglu1-mesa_9.0.1-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libegl-dev_1.3.2-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libegl1_1.3.2-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libgl-dev_1.3.2-1_arm64.deb @@ -170,22 +272,30 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libglvnd0_1.3.2-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libglx-dev_1.3.2-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libglx0_1.3.2-1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libopengl-dev_1.3.2-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libopengl0_1.3.2-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libgpg-error/libgpg-error-dev_1.38-2_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libgpg-error/libgpg-error0_1.38-2_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libgsm/libgsm1_1.0.18-2_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libgudev/gir1.2-gudev-1.0_234-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libgudev/libgudev-1.0-0_234-1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libgudev/libgudev-1.0-dev_234-1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libice/libice-dev_1.0.10-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libice/libice6_1.0.10-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libidl/libidl-2-0_0.8.14-4+b12_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libidn/libidn11_1.33-3_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libidn2/libidn2-0_2.3.0-5_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libidn2/libidn2-dev_2.3.0-5_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libinput/libinput-bin_1.16.4-3_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libinput/libinput-dev_1.16.4-3_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libinput/libinput10_1.16.4-3_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libj/libjpeg-turbo/libjpeg-dev_2.0.6-4_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libj/libjpeg-turbo/libjpeg62-turbo-dev_2.0.6-4_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libj/libjpeg-turbo/libjpeg62-turbo_2.0.6-4_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libj/libjsoncpp/libjsoncpp-dev_1.9.4-4_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libj/libjsoncpp/libjsoncpp24_1.9.4-4_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libm/libmd/libmd0_1.0.3-3_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libn/libnsl/libnsl-dev_1.3.0-2_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libn/libnsl/libnsl2_1.3.0-2_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libn/libnss-db/libnss-db_2.2.3pre1-6+b10_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libo/libogg/libogg-dev_1.3.4-0.1_arm64.deb @@ -202,10 +312,15 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libr/librest/librest-0.7-0_0.8.1-1.1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libr/librist/librist4_0.2.7+dfsg-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libr/librsvg/librsvg2-2_2.50.3+dfsg-1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libseccomp/libseccomp2_2.5.1-1+deb11u1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libselinux/libselinux1-dev_3.1-3_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libselinux/libselinux1_3.1-3_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsemanage/libsemanage-common_3.1-1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsemanage/libsemanage1_3.1-1+b2_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsepol/libsepol1-dev_3.1-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsepol/libsepol1_3.1-1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libset-scalar-perl/libset-scalar-perl_1.29-2_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsm/libsm-dev_1.2.3-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsm/libsm6_1.2.3-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsndfile/libsndfile1_1.0.31-2_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsodium/libsodium23_1.0.18-1_arm64.deb @@ -214,10 +329,14 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsoxr/libsoxr0_0.1.3-4_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libssh/libssh-gcrypt-4_0.9.5-1+deb11u1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libssh2/libssh2-1_1.9.0-2_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libt/libtasn1-6/libtasn1-6-dev_4.16.0-2+deb11u1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libt/libtasn1-6/libtasn1-6_4.16.0-2+deb11u1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libt/libthai/libthai-data_0.1.28-3_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libt/libthai/libthai-dev_0.1.28-3_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libt/libthai/libthai0_0.1.28-3_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libt/libtheora/libtheora0_1.1.1+dfsg.1-15_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libt/libtirpc/libtirpc-common_1.3.1-1+deb11u1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libt/libtirpc/libtirpc-dev_1.3.1-1+deb11u1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libt/libtirpc/libtirpc3_1.3.1-1+deb11u1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libt/libtool/libltdl7_2.4.6-15_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libu/libudfread/libudfread0_1.1.1-1_arm64.deb @@ -237,6 +356,8 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libv/libvpx/libvpx-dev_1.9.0-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libv/libvpx/libvpx6_1.9.0-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libv/libvpx/libvpx7_1.12.0-1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libw/libwacom/libwacom-common_1.8-2_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libw/libwacom/libwacom-dev_1.8-2_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libw/libwacom/libwacom2_1.8-2_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libw/libwebp/libwebp-dev_0.6.1-2.1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libw/libwebp/libwebp6_0.6.1-2.1_arm64.deb @@ -244,6 +365,7 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libw/libwebp/libwebpdemux2_0.6.1-2.1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libw/libwebp/libwebpmux3_0.6.1-2.1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libx11/libx11-6_1.7.2-1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libx11/libx11-data_1.7.2-1_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libx11/libx11-dev_1.7.2-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libx11/libx11-xcb-dev_1.7.2-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libx11/libx11-xcb1_1.7.2-1_arm64.deb @@ -296,6 +418,7 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxkbcommon/libxkbcommon-x11-0_1.0.3-2_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxkbcommon/libxkbcommon0_1.0.3-2_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxml2/libxml2-dev_2.9.10+dfsg-6.7+deb11u4_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxml2/libxml2-utils_2.9.10+dfsg-6.7+deb11u4_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxml2/libxml2_2.9.10+dfsg-6.7+deb11u4_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxrandr/libxrandr-dev_1.5.1-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxrandr/libxrandr2_1.5.1-1_arm64.deb @@ -314,27 +437,40 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxxf86vm/libxxf86vm-dev_1.1.4-1+b2_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxxf86vm/libxxf86vm1_1.1.4-1+b2_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libz/libzstd/libzstd1_1.4.8+dfsg-2.1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/make-dfsg/make_4.3-4.1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mako/python3-mako_1.1.3+ds1-2_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/markupsafe/python3-markupsafe_2.0.1-2~bpo11+1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mbedtls/libmbedcrypto7_2.28.3-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/md4c/libmd4c0_0.4.7-2_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/media-types/media-types_4.0.0_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libegl-mesa0_20.3.5-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libegl1-mesa-dev_20.3.5-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libegl1-mesa_20.3.5-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libgbm-dev_20.3.5-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libgbm1_20.3.5-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libgl1-mesa-dev_20.3.5-1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libgl1-mesa-dri_20.3.5-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libgl1-mesa-glx_20.3.5-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libglapi-mesa_20.3.5-1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libglx-mesa0_20.3.5-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libwayland-egl1-mesa_20.3.5-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/mesa-common-dev_20.3.5-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/minizip/libminizip-dev_1.1-8+b1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/minizip/libminizip1_1.1-8+b1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mpclib3/libmpc3_1.2.0-1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mpdecimal/libmpdec3_2.5.1-1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mpfr4/libmpfr6_4.1.0-3_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mpg123/libmpg123-0_1.26.4-1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mtdev/libmtdev-dev_1.1.6-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mtdev/libmtdev1_1.1.6-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/ncurses/libncurses-dev_6.2+20201114-2+deb11u1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/ncurses/libncurses6_6.2+20201114-2+deb11u1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/ncurses/libncursesw6_6.2+20201114-2+deb11u1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/ncurses/libtinfo6_6.2+20201114-2+deb11u1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/ncurses/ncurses-bin_6.2+20201114-2+deb11u1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/nettle/libhogweed6_3.7.3-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/nettle/libnettle8_3.7.3-1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/nettle/nettle-dev_3.7.3-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/nghttp2/libnghttp2-14_1.43.0-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/norm/libnorm1_1.5.9+dfsg-2_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/nspr/libnspr4-dev_4.29-1_arm64.deb @@ -349,15 +485,22 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/o/openssl/libssl1.1_1.1.1n-0+deb11u4_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/o/opus/libopus-dev_1.3.1-0.1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/o/opus/libopus0_1.3.1-0.1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/p11-kit/libp11-kit-dev_0.23.22-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/p11-kit/libp11-kit0_0.23.22-1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pam/libpam-modules_1.4.0-9+deb11u1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pam/libpam-runtime_1.4.0-9+deb11u1_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pam/libpam0g-dev_1.4.0-9+deb11u1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pam/libpam0g_1.4.0-9+deb11u1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pango1.0/gir1.2-pango-1.0_1.46.2-3_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pango1.0/libpango-1.0-0_1.46.2-3_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pango1.0/libpango1.0-dev_1.46.2-3_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pango1.0/libpangocairo-1.0-0_1.46.2-3_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pango1.0/libpangoft2-1.0-0_1.46.2-3_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pango1.0/libpangoxft-1.0-0_1.46.2-3_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pango1.0/pango1.0-tools_1.46.2-3_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pangox-compat/libpangox-1.0-0_0.0.2-5.1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/patch/patch_2.7.6-7_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pci.ids/pci.ids_0.0~2021.02.08-1_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pciutils/libpci-dev_3.7.0-5_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pciutils/libpci3_3.7.0-5_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pcre2/libpcre2-16-0_10.36-2+deb11u1_arm64.deb @@ -370,14 +513,29 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pcre3/libpcre32-3_8.39-13_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pcre3/libpcre3_8.39-13_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pcre3/libpcrecpp0v5_8.39-13_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/perl/libperl5.32_5.32.1-4+deb11u2_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/perl/perl-base_5.32.1-4+deb11u2_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/perl/perl-modules-5.32_5.32.1-4+deb11u2_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/perl/perl_5.32.1-4+deb11u2_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pipewire/libpipewire-0.3-0_0.3.65-2~bpo11+1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pipewire/libpipewire-0.3-dev_0.3.65-2~bpo11+1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pipewire/libspa-0.2-dev_0.3.65-2~bpo11+1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pipewire/libspa-0.2-modules_0.3.65-2~bpo11+1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pixman/libpixman-1-0_0.40.0-1.1~deb11u1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pixman/libpixman-1-dev_0.40.0-1.1~deb11u1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pkg-config/pkg-config_0.29.2-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pulseaudio/libpulse-dev_14.2-2_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pulseaudio/libpulse-mainloop-glib0_14.2-2_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pulseaudio/libpulse0_14.2-2_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/python-markdown/python3-markdown_3.3.4-1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/python3-defaults/libpython3-stdlib_3.9.2-3_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/python3-defaults/python3_3.9.2-3_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/python3-stdlib-extensions/python3-distutils_3.9.2-1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/python3-stdlib-extensions/python3-lib2to3_3.9.2-1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/python3.9/libpython3.9-minimal_3.9.2-1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/python3.9/libpython3.9-stdlib_3.9.2-1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/python3.9/python3.9-minimal_3.9.2-1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/python3.9/python3.9_3.9.2-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/libqt6concurrent6_6.4.2+dfsg-10~bpo11+1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/libqt6core6_6.4.2+dfsg-10~bpo11+1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/libqt6dbus6_6.4.2+dfsg-10~bpo11+1_arm64.deb @@ -390,8 +548,11 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/libqt6test6_6.4.2+dfsg-10~bpo11+1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/libqt6widgets6_6.4.2+dfsg-10~bpo11+1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/libqt6xml6_6.4.2+dfsg-10~bpo11+1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/qmake6-bin_6.4.2+dfsg-10~bpo11+1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/qmake6_6.4.2+dfsg-10~bpo11+1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/qt6-base-dev-tools_6.4.2+dfsg-10~bpo11+1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/qt6-base-dev_6.4.2+dfsg-10~bpo11+1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/qt6-qpa-plugins_6.4.2+dfsg-10~bpo11+1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/libqt5concurrent5_5.15.2+dfsg-9_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/libqt5core5a_5.15.2+dfsg-9_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/libqt5dbus5_5.15.2+dfsg-9_arm64.deb @@ -402,12 +563,21 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/libqt5test5_5.15.2+dfsg-9_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/libqt5widgets5_5.15.2+dfsg-9_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/libqt5xml5_5.15.2+dfsg-9_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/qt5-qmake-bin_5.15.2+dfsg-9_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/qt5-qmake_5.15.2+dfsg-9_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/qtbase5-dev-tools_5.15.2+dfsg-9_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/qtbase5-dev_5.15.2+dfsg-9_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtchooser/qtchooser_66-2_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/r/re2/libre2-9_20210201+dfsg-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/r/re2/libre2-dev_20210201+dfsg-1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/r/readline/libreadline8_8.1-1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/r/readline/readline-common_8.1-1_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/r/rtmpdump/librtmp1_2.4+20151223.gitfa8646d.1-2+b2_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/r/rust-rav1e/librav1e0_0.5.1-6_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/sensible-utils/sensible-utils_0.0.14_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/setuptools/python3-pkg-resources_66.1.1-1~bpo11+1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/shadow/login_4.8.1-1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/shadow/passwd_4.8.1-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/shared-mime-info/shared-mime-info_2.0-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/shine/libshine3_3.1.1-2_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/snappy/libsnappy-dev_1.1.8-1_arm64.deb @@ -416,12 +586,18 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/speech-dispatcher/libspeechd2_0.11.4-2~bpo11+1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/speex/libspeex1_1.2~rc1.2-1.1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/sqlite3/libsqlite3-0_3.34.1-3_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/srt/libsrt1.4-gnutls_1.4.2-1.3_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/srt/libsrt1.5-gnutls_1.5.1-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/svt-av1/libsvtav1enc1_1.4.1+dfsg-1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/systemd/libpam-systemd_252.5-2~bpo11+1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/systemd/libsystemd-dev_252.5-2~bpo11+1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/systemd/libsystemd-shared_252.5-2~bpo11+1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/systemd/libsystemd0_252.5-2~bpo11+1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/systemd/libudev-dev_252.5-2~bpo11+1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/systemd/libudev1_252.5-2~bpo11+1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/systemd/systemd-sysv_252.5-2~bpo11+1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/systemd/systemd_252.5-2~bpo11+1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/t/tar/tar_1.34+dfsg-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/t/tcp-wrappers/libwrap0_7.6.q-31_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/t/tiff/libtiff-dev_4.2.0-1+deb11u4_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/t/tiff/libtiff5_4.2.0-1+deb11u4_arm64.deb @@ -429,12 +605,17 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/t/tiff/libtiffxx5_4.2.0-1+deb11u4_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/t/tslib/libts0_1.22-1+b1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/t/twolame/libtwolame0_0.4.0-2_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/t/tzdata/tzdata_2021a-1+deb11u9_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/ucf/ucf_3.0043_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/unbound/libunbound8_1.17.1-2~bpo11+1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/libblkid-dev_2.36.1-8+deb11u1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/libblkid1_2.36.1-8+deb11u1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/libfdisk1_2.36.1-8+deb11u1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/libmount-dev_2.36.1-8+deb11u1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/libmount1_2.36.1-8+deb11u1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/libuuid1_2.36.1-8+deb11u1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/mount_2.36.1-8+deb11u1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/util-linux_2.36.1-8+deb11u1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/uuid-dev_2.36.1-8+deb11u1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/v/valgrind/valgrind_3.16.1-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/v/vulkan-loader/libvulkan-dev_1.3.224.0-1~bpo11+1_arm64.deb @@ -448,6 +629,7 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/w/wayland/libwayland-egl-backend-dev_1.18.0-2~exp1.1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/w/wayland/libwayland-egl1_1.18.0-2~exp1.1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/w/wayland/libwayland-server0_1.18.0-2~exp1.1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/w/webrtc-audio-processing/libwebrtc-audio-processing1_0.3-1+b1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/x264/libx264-160_0.160.3011+gitcde9a93-2.1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/x264/libx264-164_0.164.3095+gitbaee400-3_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/x265/libx265-192_3.4-2_arm64.deb @@ -462,10 +644,27 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xcb-util/libxcb-util1_0.4.0-1+b1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xft/libxft-dev_2.3.2-2_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xft/libxft2_2.3.2-2_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xkeyboard-config/xkb-data_2.29-2_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xorg-sgml-doctools/xorg-sgml-doctools_1.11-1.1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xorg/x11-common_7.7+22_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xorgproto/x11proto-core-dev_2020.1-1_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xorgproto/x11proto-dev_2020.1-1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xorgproto/x11proto-input-dev_2020.1-1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xorgproto/x11proto-randr-dev_2020.1-1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xorgproto/x11proto-record-dev_2020.1-1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xorgproto/x11proto-render-dev_2020.1-1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xorgproto/x11proto-scrnsaver-dev_2020.1-1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xorgproto/x11proto-xext-dev_2020.1-1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xorgproto/x11proto-xf86vidmode-dev_2020.1-1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xorgproto/x11proto-xinerama-dev_2020.1-1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xtrans/xtrans-dev_1.4.0-1_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xvidcore/libxvidcore4_1.3.7-1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xz-utils/liblzma-dev_5.2.5-2.1~deb11u1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xz-utils/liblzma5_5.2.5-2.1~deb11u1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xz-utils/xz-utils_5.2.5-2.1~deb11u1_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/z/z3/libz3-4_4.8.10-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/z/zeromq3/libzmq5_4.3.4-1_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/z/zlib/zlib1g-dev_1.2.11.dfsg-2+deb11u2_arm64.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/z/zlib/zlib1g_1.2.11.dfsg-2+deb11u2_arm64.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/z/zvbi/libzvbi-common_0.2.35-18_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/z/zvbi/libzvbi0_0.2.35-18_arm64.deb
diff --git a/build/linux/sysroot_scripts/generated_package_lists/bullseye.armhf b/build/linux/sysroot_scripts/generated_package_lists/bullseye.armhf index a6a1010..d479c216 100644 --- a/build/linux/sysroot_scripts/generated_package_lists/bullseye.armhf +++ b/build/linux/sysroot_scripts/generated_package_lists/bullseye.armhf
@@ -1,21 +1,40 @@ +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/acl/libacl1_2.2.53-10_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/adduser/adduser_3.118_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/adwaita-icon-theme/adwaita-icon-theme_3.38.0-1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/alsa-lib/libasound2-data_1.2.4-1.1_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/alsa-lib/libasound2-dev_1.2.4-1.1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/alsa-lib/libasound2_1.2.4-1.1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/aom/libaom0_1.0.0.errata1-3_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/aom/libaom3_3.6.0-1~bpo11+1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/apparmor/libapparmor1_2.13.6-10_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/argon2/libargon2-1_0~20171227-0.2_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/at-spi2-atk/libatk-bridge2.0-0_2.38.0-4~bpo11+1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/at-spi2-atk/libatk-bridge2.0-dev_2.38.0-4~bpo11+1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/at-spi2-core/gir1.2-atspi-2.0_2.44.1-1~bpo11+1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/at-spi2-core/libatspi2.0-0_2.44.1-1~bpo11+1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/at-spi2-core/libatspi2.0-dev_2.44.1-1~bpo11+1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/atk1.0/gir1.2-atk-1.0_2.38.0-1~bpo11+1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/atk1.0/libatk1.0-0_2.38.0-1~bpo11+1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/atk1.0/libatk1.0-data_2.38.0-1~bpo11+1_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/atk1.0/libatk1.0-dev_2.38.0-1~bpo11+1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/attr/libattr1_2.4.48-6_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/audit/libaudit-common_3.0-2_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/audit/libaudit1_3.0-2_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/avahi/libavahi-client3_0.8-5+deb11u2_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/avahi/libavahi-common-data_0.8-5+deb11u2_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/avahi/libavahi-common3_0.8-5+deb11u2_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/binutils/binutils-arm-linux-gnueabihf_2.35.2-2_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/binutils/binutils-common_2.35.2-2_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/binutils/binutils_2.35.2-2_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/binutils/libbinutils_2.35.2-2_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/binutils/libctf-nobfd0_2.35.2-2_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/binutils/libctf0_2.35.2-2_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/bluez/libbluetooth-dev_5.55-3.1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/bluez/libbluetooth3_5.55-3.1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/brotli/libbrotli-dev_1.0.9-2+b2_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/brotli/libbrotli1_1.0.9-2+b2_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/build-essential/build-essential_12.9_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/bzip2/bzip2_1.0.8-4_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/bzip2/libbz2-1.0_1.0.8-4_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cairo/libcairo-gobject2_1.16.0-5_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cairo/libcairo-script-interpreter2_1.16.0-5_armhf.deb @@ -26,6 +45,8 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/codec2/libcodec2-0.9_0.9.2-4_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/codec2/libcodec2-1.0_1.0.5-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/colord/libcolord2_1.4.5-3_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/coreutils/coreutils_8.32-4_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cryptsetup/libcryptsetup12_2.3.7-1+deb11u1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cups/libcups2-dev_2.3.3op2-3+deb11u2_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cups/libcups2_2.3.3op2-3+deb11u2_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cups/libcupsimage2-dev_2.3.3op2-3+deb11u2_armhf.deb @@ -33,13 +54,27 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/curl/libcurl3-gnutls_7.88.1-7~bpo11+2_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/curl/libcurl4-gnutls-dev_7.88.1-7~bpo11+2_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cyrus-sasl2/libsasl2-2_2.1.27+dfsg-2.1+deb11u1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cyrus-sasl2/libsasl2-modules-db_2.1.27+dfsg-2.1+deb11u1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/dav1d/libdav1d4_0.7.1-3_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/dav1d/libdav1d6_1.0.0-2_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/db5.3/libdb5.3_5.3.28+dfsg1-0.8_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/dbus-glib/libdbus-glib-1-2_0.110-6_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/dbus/dbus-bin_1.14.6-1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/dbus/dbus-daemon_1.14.6-1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/dbus/dbus-session-bus-common_1.14.6-1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/dbus/dbus-system-bus-common_1.14.6-1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/dbus/dbus-user-session_1.14.6-1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/dbus/dbus_1.14.6-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/dbus/libdbus-1-3_1.12.24-0+deb11u1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/dbus/libdbus-1-dev_1.12.24-0+deb11u1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/dconf/dconf-gsettings-backend_0.38.0-2_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/dconf/dconf-service_0.38.0-2_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/dconf/libdconf1_0.38.0-2_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/debconf/debconf_1.5.77_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/double-conversion/libdouble-conversion3_3.1.5-6.1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/dpkg/dpkg-dev_1.20.12_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/dpkg/dpkg_1.20.12_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/dpkg/libdpkg-perl_1.20.12_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/e/e2fsprogs/comerr-dev_2.1-1.46.6-1~bpo11+1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/e/e2fsprogs/libcom-err2_1.46.6-1~bpo11+1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/e/elfutils/libelf-dev_0.187-1~bpo11+1_armhf.deb @@ -50,6 +85,7 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/ffmpeg/libavcodec58_4.3.5-0+deb11u1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/ffmpeg/libavcodec59_5.1.3-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/ffmpeg/libavformat-dev_4.3.5-0+deb11u1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/ffmpeg/libavformat58_4.3.5-0+deb11u1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/ffmpeg/libavformat59_5.1.3-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/ffmpeg/libavutil-dev_4.3.5-0+deb11u1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/ffmpeg/libavutil56_4.3.5-0+deb11u1_armhf.deb @@ -59,54 +95,109 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/ffmpeg/libswresample4_5.1.3-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/flac/libflac-dev_1.3.3-2+deb11u1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/flac/libflac8_1.3.3-2+deb11u1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/fontconfig/fontconfig-config_2.13.1-4.2_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/fontconfig/fontconfig_2.13.1-4.2_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/fontconfig/libfontconfig-dev_2.13.1-4.2_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/fontconfig/libfontconfig1-dev_2.13.1-4.2_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/fontconfig/libfontconfig1_2.13.1-4.2_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/fonts-dejavu/fonts-dejavu-core_2.37-2_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/freetype/libfreetype-dev_2.10.4+dfsg-1+deb11u1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/freetype/libfreetype6-dev_2.10.4+dfsg-1+deb11u1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/freetype/libfreetype6_2.10.4+dfsg-1+deb11u1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/fribidi/libfribidi-dev_1.0.8-2+deb11u1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/fribidi/libfribidi0_1.0.8-2+deb11u1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/game-music-emu/libgme0_0.6.3-2_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-10/cpp-10_10.2.1-6_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-10/g++-10_10.2.1-6_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-10/gcc-10-base_10.2.1-6_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-10/gcc-10_10.2.1-6_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-10/libasan6_10.2.1-6_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-10/libatomic1_10.2.1-6_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-10/libcc1-0_10.2.1-6_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-10/libgcc-10-dev_10.2.1-6_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-10/libgcc-s1_10.2.1-6_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-10/libgomp1_10.2.1-6_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-10/libstdc++-10-dev_10.2.1-6_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-10/libstdc++6_10.2.1-6_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-10/libubsan1_10.2.1-6_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-defaults/cpp_10.2.1-1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-defaults/g++_10.2.1-1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-defaults/gcc_10.2.1-1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gdbm/libgdbm-compat4_1.19-2_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gdbm/libgdbm6_1.19-2_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gdk-pixbuf-xlib/libgdk-pixbuf-xlib-2.0-0_2.40.2-2_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gdk-pixbuf-xlib/libgdk-pixbuf2.0-0_2.40.2-2_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gdk-pixbuf/gir1.2-gdkpixbuf-2.0_2.42.2+dfsg-1+deb11u1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gdk-pixbuf/libgdk-pixbuf-2.0-0_2.42.2+dfsg-1+deb11u1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gdk-pixbuf/libgdk-pixbuf-2.0-dev_2.42.2+dfsg-1+deb11u1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gdk-pixbuf/libgdk-pixbuf2.0-bin_2.42.2+dfsg-1+deb11u1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gdk-pixbuf/libgdk-pixbuf2.0-common_2.42.2+dfsg-1+deb11u1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glib-networking/glib-networking-common_2.66.0-2_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glib-networking/glib-networking-services_2.66.0-2_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glib-networking/glib-networking_2.66.0-2_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glib2.0/libglib2.0-0_2.66.8-1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glib2.0/libglib2.0-bin_2.66.8-1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glib2.0/libglib2.0-data_2.66.8-1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glib2.0/libglib2.0-dev-bin_2.66.8-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glib2.0/libglib2.0-dev_2.66.8-1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glibc/libc-dev-bin_2.31-13+deb11u5_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glibc/libc6-dbg_2.31-13+deb11u5_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glibc/libc6-dev_2.31-13+deb11u5_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glibc/libc6-dev_2.31-13+deb11u6_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glibc/libc6_2.31-13+deb11u5_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gmp/libgmp-dev_6.2.1+dfsg-1+deb11u1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gmp/libgmp10_6.2.1+dfsg-1+deb11u1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gmp/libgmpxx4ldbl_6.2.1+dfsg-1+deb11u1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gnutls28/libgnutls-dane0_3.7.1-5+deb11u3_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gnutls28/libgnutls-openssl27_3.7.1-5+deb11u3_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gnutls28/libgnutls28-dev_3.7.1-5+deb11u3_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gnutls28/libgnutls30_3.7.1-5+deb11u3_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gnutls28/libgnutlsxx28_3.7.1-5+deb11u3_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gobject-introspection/gir1.2-freedesktop_1.66.1-1+b1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gobject-introspection/gir1.2-glib-2.0_1.66.1-1+b1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gobject-introspection/gobject-introspection_1.66.1-1+b1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gobject-introspection/libgirepository-1.0-1_1.66.1-1+b1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gobject-introspection/libgirepository1.0-dev_1.66.1-1+b1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/graphene/gir1.2-graphene-1.0_1.10.4+dfsg1-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/graphene/libgraphene-1.0-0_1.10.4+dfsg1-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/graphene/libgraphene-1.0-dev_1.10.4+dfsg1-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/graphite2/libgraphite2-3_1.3.14-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/graphite2/libgraphite2-dev_1.3.14-1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gsettings-desktop-schemas/gsettings-desktop-schemas_3.38.0-2_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gtk+2.0/gir1.2-gtk-2.0_2.24.33-2_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gtk+2.0/libgtk2.0-0_2.24.33-2_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gtk+2.0/libgtk2.0-common_2.24.33-2_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gtk+2.0/libgtk2.0-dev_2.24.33-2_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gtk+3.0/gir1.2-gtk-3.0_3.24.24-4+deb11u3_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gtk+3.0/gtk-update-icon-cache_3.24.24-4+deb11u3_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gtk+3.0/libgtk-3-0_3.24.24-4+deb11u3_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gtk+3.0/libgtk-3-common_3.24.24-4+deb11u3_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gtk+3.0/libgtk-3-dev_3.24.24-4+deb11u3_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gtk4/gir1.2-gtk-4.0_4.8.3+ds-2_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gtk4/libgtk-4-1_4.8.3+ds-2_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gtk4/libgtk-4-common_4.8.3+ds-2_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gtk4/libgtk-4-dev_4.8.3+ds-2_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/h/harfbuzz/gir1.2-harfbuzz-0.0_2.7.4-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/h/harfbuzz/libharfbuzz-dev_2.7.4-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/h/harfbuzz/libharfbuzz-gobject0_2.7.4-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/h/harfbuzz/libharfbuzz-icu0_2.7.4-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/h/harfbuzz/libharfbuzz0b_2.7.4-1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/h/hicolor-icon-theme/hicolor-icon-theme_0.17-2_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/h/highway/libhwy1_1.0.3-3_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/i/icu-le-hb/libicu-le-hb0_1.0.3+git180724-3+b2_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/i/icu/icu-devtools_67.1-7_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/i/icu/libicu-dev_67.1-7_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/i/icu/libicu67_67.1-7_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/i/iptables/libip4tc2_1.8.7-1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/i/isl/libisl23_0.23-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/j/jbigkit/libjbig-dev_2.1-3.1+b2_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/j/jbigkit/libjbig0_2.1-3.1+b2_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/j/jpeg-xl/libjxl0.7_0.7.0-10_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/j/json-c/libjson-c5_0.15-2_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/j/json-glib/libjson-glib-1.0-0_1.6.2-1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/j/json-glib/libjson-glib-1.0-common_1.6.2-1_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/k/keyutils/libkeyutils1_1.6.1-2_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/k/kmod/libkmod2_28-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/k/krb5/krb5-multidev_1.18.3-6+deb11u3_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/k/krb5/libgssapi-krb5-2_1.18.3-6+deb11u3_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/k/krb5/libgssrpc4_1.18.3-6+deb11u3_armhf.deb @@ -121,6 +212,12 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lcms2/liblcms2-2_2.12~rc1-2_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lerc/liblerc4_4.0.0+ds-2_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/linux/linux-libc-dev_6.1.20-2~bpo11+1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/llvm-toolchain-11/libllvm11_11.0.1-2_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lm-sensors/libsensors-config_3.6.0-7_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lm-sensors/libsensors5_3.6.0-7_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lsb/lsb-base_11.1.0_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lvm2/dmsetup_1.02.175-2.1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lvm2/libdevmapper1.02.1_1.02.175-2.1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lz4/liblz4-1_1.9.3-2_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lzo2/liblzo2-2_2.10-2_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/liba/libasyncns/libasyncns0_0.8-6+b2_armhf.deb @@ -133,6 +230,7 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libc/libcloudproviders/libcloudproviders0_0.3.0-3_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdatrie/libdatrie-dev_0.2.13-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdatrie/libdatrie1_0.2.13-1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdbusmenu/gir1.2-dbusmenu-glib-0.4_18.10.20180917~bzr492+repack1-2_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdbusmenu/libdbusmenu-glib-dev_18.10.20180917~bzr492+repack1-2_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdbusmenu/libdbusmenu-glib4_18.10.20180917~bzr492+repack1-2_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdbusmenu/libdbusmenu-gtk3-4_18.10.20180917~bzr492+repack1-2_armhf.deb @@ -140,6 +238,7 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdeflate/libdeflate-dev_1.10-2~bpo11+1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdeflate/libdeflate0_1.10-2~bpo11+1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdrm/libdrm-amdgpu1_2.4.104-1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdrm/libdrm-common_2.4.104-1_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdrm/libdrm-dev_2.4.104-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdrm/libdrm-etnaviv1_2.4.104-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdrm/libdrm-exynos1_2.4.104-1_armhf.deb @@ -149,6 +248,7 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdrm/libdrm-radeon1_2.4.104-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdrm/libdrm-tegra0_2.4.104-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdrm/libdrm2_2.4.104-1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libe/libedit/libedit2_3.1-20191231-2+b1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libe/libepoxy/libepoxy-dev_1.5.8-1~bpo11+1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libe/libepoxy/libepoxy0_1.5.8-1~bpo11+1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libe/libevdev/libevdev-dev_1.11.0+dfsg-1_armhf.deb @@ -169,22 +269,30 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libglvnd0_1.3.2-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libglx-dev_1.3.2-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libglx0_1.3.2-1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libopengl-dev_1.3.2-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libopengl0_1.3.2-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libgpg-error/libgpg-error-dev_1.38-2_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libgpg-error/libgpg-error0_1.38-2_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libgsm/libgsm1_1.0.18-2_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libgudev/gir1.2-gudev-1.0_234-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libgudev/libgudev-1.0-0_234-1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libgudev/libgudev-1.0-dev_234-1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libice/libice-dev_1.0.10-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libice/libice6_1.0.10-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libidl/libidl-2-0_0.8.14-4+b12_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libidn/libidn11_1.33-3_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libidn2/libidn2-0_2.3.0-5_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libidn2/libidn2-dev_2.3.0-5_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libinput/libinput-bin_1.16.4-3_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libinput/libinput-dev_1.16.4-3_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libinput/libinput10_1.16.4-3_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libj/libjpeg-turbo/libjpeg-dev_2.0.6-4_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libj/libjpeg-turbo/libjpeg62-turbo-dev_2.0.6-4_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libj/libjpeg-turbo/libjpeg62-turbo_2.0.6-4_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libj/libjsoncpp/libjsoncpp-dev_1.9.4-4_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libj/libjsoncpp/libjsoncpp24_1.9.4-4_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libm/libmd/libmd0_1.0.3-3_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libn/libnsl/libnsl-dev_1.3.0-2_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libn/libnsl/libnsl2_1.3.0-2_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libn/libnss-db/libnss-db_2.2.3pre1-6+b10_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libo/libogg/libogg-dev_1.3.4-0.1_armhf.deb @@ -201,10 +309,15 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libr/librest/librest-0.7-0_0.8.1-1.1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libr/librist/librist4_0.2.7+dfsg-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libr/librsvg/librsvg2-2_2.50.3+dfsg-1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libseccomp/libseccomp2_2.5.1-1+deb11u1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libselinux/libselinux1-dev_3.1-3_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libselinux/libselinux1_3.1-3_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsemanage/libsemanage-common_3.1-1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsemanage/libsemanage1_3.1-1+b2_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsepol/libsepol1-dev_3.1-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsepol/libsepol1_3.1-1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libset-scalar-perl/libset-scalar-perl_1.29-2_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsm/libsm-dev_1.2.3-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsm/libsm6_1.2.3-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsndfile/libsndfile1_1.0.31-2_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsodium/libsodium23_1.0.18-1_armhf.deb @@ -213,10 +326,14 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsoxr/libsoxr0_0.1.3-4_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libssh/libssh-gcrypt-4_0.9.5-1+deb11u1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libssh2/libssh2-1_1.9.0-2_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libt/libtasn1-6/libtasn1-6-dev_4.16.0-2+deb11u1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libt/libtasn1-6/libtasn1-6_4.16.0-2+deb11u1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libt/libthai/libthai-data_0.1.28-3_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libt/libthai/libthai-dev_0.1.28-3_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libt/libthai/libthai0_0.1.28-3_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libt/libtheora/libtheora0_1.1.1+dfsg.1-15_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libt/libtirpc/libtirpc-common_1.3.1-1+deb11u1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libt/libtirpc/libtirpc-dev_1.3.1-1+deb11u1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libt/libtirpc/libtirpc3_1.3.1-1+deb11u1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libt/libtool/libltdl7_2.4.6-15_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libu/libudfread/libudfread0_1.1.1-1_armhf.deb @@ -236,6 +353,8 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libv/libvpx/libvpx-dev_1.9.0-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libv/libvpx/libvpx6_1.9.0-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libv/libvpx/libvpx7_1.12.0-1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libw/libwacom/libwacom-common_1.8-2_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libw/libwacom/libwacom-dev_1.8-2_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libw/libwacom/libwacom2_1.8-2_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libw/libwebp/libwebp-dev_0.6.1-2.1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libw/libwebp/libwebp6_0.6.1-2.1_armhf.deb @@ -243,6 +362,7 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libw/libwebp/libwebpdemux2_0.6.1-2.1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libw/libwebp/libwebpmux3_0.6.1-2.1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libx11/libx11-6_1.7.2-1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libx11/libx11-data_1.7.2-1_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libx11/libx11-dev_1.7.2-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libx11/libx11-xcb-dev_1.7.2-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libx11/libx11-xcb1_1.7.2-1_armhf.deb @@ -295,6 +415,7 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxkbcommon/libxkbcommon-x11-0_1.0.3-2_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxkbcommon/libxkbcommon0_1.0.3-2_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxml2/libxml2-dev_2.9.10+dfsg-6.7+deb11u4_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxml2/libxml2-utils_2.9.10+dfsg-6.7+deb11u4_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxml2/libxml2_2.9.10+dfsg-6.7+deb11u4_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxrandr/libxrandr-dev_1.5.1-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxrandr/libxrandr2_1.5.1-1_armhf.deb @@ -313,27 +434,40 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxxf86vm/libxxf86vm-dev_1.1.4-1+b2_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxxf86vm/libxxf86vm1_1.1.4-1+b2_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libz/libzstd/libzstd1_1.4.8+dfsg-2.1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/make-dfsg/make_4.3-4.1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mako/python3-mako_1.1.3+ds1-2_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/markupsafe/python3-markupsafe_2.0.1-2~bpo11+1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mbedtls/libmbedcrypto7_2.28.3-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/md4c/libmd4c0_0.4.7-2_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/media-types/media-types_4.0.0_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libegl-mesa0_20.3.5-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libegl1-mesa-dev_20.3.5-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libegl1-mesa_20.3.5-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libgbm-dev_20.3.5-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libgbm1_20.3.5-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libgl1-mesa-dev_20.3.5-1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libgl1-mesa-dri_20.3.5-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libgl1-mesa-glx_20.3.5-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libglapi-mesa_20.3.5-1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libglx-mesa0_20.3.5-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libwayland-egl1-mesa_20.3.5-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/mesa-common-dev_20.3.5-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/minizip/libminizip-dev_1.1-8+b1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/minizip/libminizip1_1.1-8+b1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mpclib3/libmpc3_1.2.0-1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mpdecimal/libmpdec3_2.5.1-1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mpfr4/libmpfr6_4.1.0-3_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mpg123/libmpg123-0_1.26.4-1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mtdev/libmtdev-dev_1.1.6-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mtdev/libmtdev1_1.1.6-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/ncurses/libncurses-dev_6.2+20201114-2+deb11u1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/ncurses/libncurses6_6.2+20201114-2+deb11u1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/ncurses/libncursesw6_6.2+20201114-2+deb11u1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/ncurses/libtinfo6_6.2+20201114-2+deb11u1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/ncurses/ncurses-bin_6.2+20201114-2+deb11u1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/nettle/libhogweed6_3.7.3-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/nettle/libnettle8_3.7.3-1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/nettle/nettle-dev_3.7.3-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/nghttp2/libnghttp2-14_1.43.0-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/norm/libnorm1_1.5.9+dfsg-2_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/nspr/libnspr4-dev_4.29-1_armhf.deb @@ -348,15 +482,22 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/o/openssl/libssl1.1_1.1.1n-0+deb11u4_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/o/opus/libopus-dev_1.3.1-0.1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/o/opus/libopus0_1.3.1-0.1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/p11-kit/libp11-kit-dev_0.23.22-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/p11-kit/libp11-kit0_0.23.22-1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pam/libpam-modules_1.4.0-9+deb11u1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pam/libpam-runtime_1.4.0-9+deb11u1_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pam/libpam0g-dev_1.4.0-9+deb11u1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pam/libpam0g_1.4.0-9+deb11u1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pango1.0/gir1.2-pango-1.0_1.46.2-3_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pango1.0/libpango-1.0-0_1.46.2-3_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pango1.0/libpango1.0-dev_1.46.2-3_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pango1.0/libpangocairo-1.0-0_1.46.2-3_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pango1.0/libpangoft2-1.0-0_1.46.2-3_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pango1.0/libpangoxft-1.0-0_1.46.2-3_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pango1.0/pango1.0-tools_1.46.2-3_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pangox-compat/libpangox-1.0-0_0.0.2-5.1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/patch/patch_2.7.6-7_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pci.ids/pci.ids_0.0~2021.02.08-1_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pciutils/libpci-dev_3.7.0-5_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pciutils/libpci3_3.7.0-5_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pcre2/libpcre2-16-0_10.36-2+deb11u1_armhf.deb @@ -369,14 +510,29 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pcre3/libpcre32-3_8.39-13_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pcre3/libpcre3_8.39-13_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pcre3/libpcrecpp0v5_8.39-13_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/perl/libperl5.32_5.32.1-4+deb11u2_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/perl/perl-base_5.32.1-4+deb11u2_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/perl/perl-modules-5.32_5.32.1-4+deb11u2_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/perl/perl_5.32.1-4+deb11u2_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pipewire/libpipewire-0.3-0_0.3.65-2~bpo11+1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pipewire/libpipewire-0.3-dev_0.3.65-2~bpo11+1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pipewire/libspa-0.2-dev_0.3.65-2~bpo11+1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pipewire/libspa-0.2-modules_0.3.65-2~bpo11+1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pixman/libpixman-1-0_0.40.0-1.1~deb11u1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pixman/libpixman-1-dev_0.40.0-1.1~deb11u1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pkg-config/pkg-config_0.29.2-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pulseaudio/libpulse-dev_14.2-2_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pulseaudio/libpulse-mainloop-glib0_14.2-2_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pulseaudio/libpulse0_14.2-2_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/python-markdown/python3-markdown_3.3.4-1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/python3-defaults/libpython3-stdlib_3.9.2-3_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/python3-defaults/python3_3.9.2-3_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/python3-stdlib-extensions/python3-distutils_3.9.2-1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/python3-stdlib-extensions/python3-lib2to3_3.9.2-1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/python3.9/libpython3.9-minimal_3.9.2-1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/python3.9/libpython3.9-stdlib_3.9.2-1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/python3.9/python3.9-minimal_3.9.2-1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/python3.9/python3.9_3.9.2-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/libqt6concurrent6_6.4.2+dfsg-10~bpo11+1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/libqt6core6_6.4.2+dfsg-10~bpo11+1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/libqt6dbus6_6.4.2+dfsg-10~bpo11+1_armhf.deb @@ -389,8 +545,11 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/libqt6test6_6.4.2+dfsg-10~bpo11+1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/libqt6widgets6_6.4.2+dfsg-10~bpo11+1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/libqt6xml6_6.4.2+dfsg-10~bpo11+1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/qmake6-bin_6.4.2+dfsg-10~bpo11+1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/qmake6_6.4.2+dfsg-10~bpo11+1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/qt6-base-dev-tools_6.4.2+dfsg-10~bpo11+1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/qt6-base-dev_6.4.2+dfsg-10~bpo11+1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/qt6-qpa-plugins_6.4.2+dfsg-10~bpo11+1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/libqt5concurrent5_5.15.2+dfsg-9_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/libqt5core5a_5.15.2+dfsg-9_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/libqt5dbus5_5.15.2+dfsg-9_armhf.deb @@ -401,12 +560,21 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/libqt5test5_5.15.2+dfsg-9_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/libqt5widgets5_5.15.2+dfsg-9_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/libqt5xml5_5.15.2+dfsg-9_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/qt5-qmake-bin_5.15.2+dfsg-9_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/qt5-qmake_5.15.2+dfsg-9_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/qtbase5-dev-tools_5.15.2+dfsg-9_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/qtbase5-dev_5.15.2+dfsg-9_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtchooser/qtchooser_66-2_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/r/re2/libre2-9_20210201+dfsg-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/r/re2/libre2-dev_20210201+dfsg-1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/r/readline/libreadline8_8.1-1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/r/readline/readline-common_8.1-1_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/r/rtmpdump/librtmp1_2.4+20151223.gitfa8646d.1-2+b2_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/r/rust-rav1e/librav1e0_0.5.1-6_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/sensible-utils/sensible-utils_0.0.14_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/setuptools/python3-pkg-resources_66.1.1-1~bpo11+1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/shadow/login_4.8.1-1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/shadow/passwd_4.8.1-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/shared-mime-info/shared-mime-info_2.0-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/shine/libshine3_3.1.1-2_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/snappy/libsnappy-dev_1.1.8-1_armhf.deb @@ -415,12 +583,18 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/speech-dispatcher/libspeechd2_0.11.4-2~bpo11+1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/speex/libspeex1_1.2~rc1.2-1.1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/sqlite3/libsqlite3-0_3.34.1-3_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/srt/libsrt1.4-gnutls_1.4.2-1.3_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/srt/libsrt1.5-gnutls_1.5.1-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/svt-av1/libsvtav1enc1_1.4.1+dfsg-1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/systemd/libpam-systemd_252.5-2~bpo11+1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/systemd/libsystemd-dev_252.5-2~bpo11+1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/systemd/libsystemd-shared_252.5-2~bpo11+1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/systemd/libsystemd0_252.5-2~bpo11+1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/systemd/libudev-dev_252.5-2~bpo11+1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/systemd/libudev1_252.5-2~bpo11+1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/systemd/systemd-sysv_252.5-2~bpo11+1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/systemd/systemd_252.5-2~bpo11+1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/t/tar/tar_1.34+dfsg-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/t/tcp-wrappers/libwrap0_7.6.q-31_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/t/tiff/libtiff-dev_4.2.0-1+deb11u4_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/t/tiff/libtiff5_4.2.0-1+deb11u4_armhf.deb @@ -428,12 +602,17 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/t/tiff/libtiffxx5_4.2.0-1+deb11u4_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/t/tslib/libts0_1.22-1+b1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/t/twolame/libtwolame0_0.4.0-2_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/t/tzdata/tzdata_2021a-1+deb11u9_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/ucf/ucf_3.0043_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/unbound/libunbound8_1.17.1-2~bpo11+1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/libblkid-dev_2.36.1-8+deb11u1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/libblkid1_2.36.1-8+deb11u1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/libfdisk1_2.36.1-8+deb11u1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/libmount-dev_2.36.1-8+deb11u1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/libmount1_2.36.1-8+deb11u1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/libuuid1_2.36.1-8+deb11u1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/mount_2.36.1-8+deb11u1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/util-linux_2.36.1-8+deb11u1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/uuid-dev_2.36.1-8+deb11u1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/v/valgrind/valgrind_3.16.1-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/v/vulkan-loader/libvulkan-dev_1.3.224.0-1~bpo11+1_armhf.deb @@ -447,6 +626,7 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/w/wayland/libwayland-egl-backend-dev_1.18.0-2~exp1.1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/w/wayland/libwayland-egl1_1.18.0-2~exp1.1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/w/wayland/libwayland-server0_1.18.0-2~exp1.1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/w/webrtc-audio-processing/libwebrtc-audio-processing1_0.3-1+b1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/x264/libx264-160_0.160.3011+gitcde9a93-2.1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/x264/libx264-164_0.164.3095+gitbaee400-3_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/x265/libx265-192_3.4-2_armhf.deb @@ -461,10 +641,27 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xcb-util/libxcb-util1_0.4.0-1+b1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xft/libxft-dev_2.3.2-2_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xft/libxft2_2.3.2-2_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xkeyboard-config/xkb-data_2.29-2_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xorg-sgml-doctools/xorg-sgml-doctools_1.11-1.1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xorg/x11-common_7.7+22_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xorgproto/x11proto-core-dev_2020.1-1_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xorgproto/x11proto-dev_2020.1-1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xorgproto/x11proto-input-dev_2020.1-1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xorgproto/x11proto-randr-dev_2020.1-1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xorgproto/x11proto-record-dev_2020.1-1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xorgproto/x11proto-render-dev_2020.1-1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xorgproto/x11proto-scrnsaver-dev_2020.1-1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xorgproto/x11proto-xext-dev_2020.1-1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xorgproto/x11proto-xf86vidmode-dev_2020.1-1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xorgproto/x11proto-xinerama-dev_2020.1-1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xtrans/xtrans-dev_1.4.0-1_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xvidcore/libxvidcore4_1.3.7-1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xz-utils/liblzma-dev_5.2.5-2.1~deb11u1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xz-utils/liblzma5_5.2.5-2.1~deb11u1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xz-utils/xz-utils_5.2.5-2.1~deb11u1_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/z/z3/libz3-4_4.8.10-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/z/zeromq3/libzmq5_4.3.4-1_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/z/zlib/zlib1g-dev_1.2.11.dfsg-2+deb11u2_armhf.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/z/zlib/zlib1g_1.2.11.dfsg-2+deb11u2_armhf.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/z/zvbi/libzvbi-common_0.2.35-18_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/z/zvbi/libzvbi0_0.2.35-18_armhf.deb
diff --git a/build/linux/sysroot_scripts/generated_package_lists/bullseye.i386 b/build/linux/sysroot_scripts/generated_package_lists/bullseye.i386 index 7db34b82..9d3591d 100644 --- a/build/linux/sysroot_scripts/generated_package_lists/bullseye.i386 +++ b/build/linux/sysroot_scripts/generated_package_lists/bullseye.i386
@@ -1,21 +1,40 @@ +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/acl/libacl1_2.2.53-10_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/adduser/adduser_3.118_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/adwaita-icon-theme/adwaita-icon-theme_3.38.0-1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/alsa-lib/libasound2-data_1.2.4-1.1_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/alsa-lib/libasound2-dev_1.2.4-1.1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/alsa-lib/libasound2_1.2.4-1.1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/aom/libaom0_1.0.0.errata1-3_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/aom/libaom3_3.6.0-1~bpo11+1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/apparmor/libapparmor1_2.13.6-10_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/argon2/libargon2-1_0~20171227-0.2_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/at-spi2-atk/libatk-bridge2.0-0_2.38.0-4~bpo11+1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/at-spi2-atk/libatk-bridge2.0-dev_2.38.0-4~bpo11+1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/at-spi2-core/gir1.2-atspi-2.0_2.44.1-1~bpo11+1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/at-spi2-core/libatspi2.0-0_2.44.1-1~bpo11+1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/at-spi2-core/libatspi2.0-dev_2.44.1-1~bpo11+1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/atk1.0/gir1.2-atk-1.0_2.38.0-1~bpo11+1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/atk1.0/libatk1.0-0_2.38.0-1~bpo11+1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/atk1.0/libatk1.0-data_2.38.0-1~bpo11+1_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/atk1.0/libatk1.0-dev_2.38.0-1~bpo11+1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/attr/libattr1_2.4.48-6_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/audit/libaudit-common_3.0-2_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/audit/libaudit1_3.0-2_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/avahi/libavahi-client3_0.8-5+deb11u2_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/avahi/libavahi-common-data_0.8-5+deb11u2_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/avahi/libavahi-common3_0.8-5+deb11u2_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/binutils/binutils-common_2.35.2-2_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/binutils/binutils-i686-linux-gnu_2.35.2-2_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/binutils/binutils_2.35.2-2_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/binutils/libbinutils_2.35.2-2_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/binutils/libctf-nobfd0_2.35.2-2_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/binutils/libctf0_2.35.2-2_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/bluez/libbluetooth-dev_5.55-3.1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/bluez/libbluetooth3_5.55-3.1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/brotli/libbrotli-dev_1.0.9-2+b2_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/brotli/libbrotli1_1.0.9-2+b2_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/build-essential/build-essential_12.9_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/bzip2/bzip2_1.0.8-4_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/bzip2/libbz2-1.0_1.0.8-4_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cairo/libcairo-gobject2_1.16.0-5_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cairo/libcairo-script-interpreter2_1.16.0-5_i386.deb @@ -26,6 +45,8 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/codec2/libcodec2-0.9_0.9.2-4_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/codec2/libcodec2-1.0_1.0.5-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/colord/libcolord2_1.4.5-3_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/coreutils/coreutils_8.32-4_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cryptsetup/libcryptsetup12_2.3.7-1+deb11u1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cups/libcups2-dev_2.3.3op2-3+deb11u2_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cups/libcups2_2.3.3op2-3+deb11u2_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cups/libcupsimage2-dev_2.3.3op2-3+deb11u2_i386.deb @@ -33,13 +54,27 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/curl/libcurl3-gnutls_7.88.1-7~bpo11+2_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/curl/libcurl4-gnutls-dev_7.88.1-7~bpo11+2_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cyrus-sasl2/libsasl2-2_2.1.27+dfsg-2.1+deb11u1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cyrus-sasl2/libsasl2-modules-db_2.1.27+dfsg-2.1+deb11u1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/dav1d/libdav1d4_0.7.1-3_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/dav1d/libdav1d6_1.0.0-2_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/db5.3/libdb5.3_5.3.28+dfsg1-0.8_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/dbus-glib/libdbus-glib-1-2_0.110-6_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/dbus/dbus-bin_1.14.6-1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/dbus/dbus-daemon_1.14.6-1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/dbus/dbus-session-bus-common_1.14.6-1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/dbus/dbus-system-bus-common_1.14.6-1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/dbus/dbus-user-session_1.14.6-1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/dbus/dbus_1.14.6-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/dbus/libdbus-1-3_1.12.24-0+deb11u1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/dbus/libdbus-1-dev_1.12.24-0+deb11u1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/dconf/dconf-gsettings-backend_0.38.0-2_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/dconf/dconf-service_0.38.0-2_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/dconf/libdconf1_0.38.0-2_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/debconf/debconf_1.5.77_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/double-conversion/libdouble-conversion3_3.1.5-6.1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/dpkg/dpkg-dev_1.20.12_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/dpkg/dpkg_1.20.12_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/dpkg/libdpkg-perl_1.20.12_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/e/e2fsprogs/comerr-dev_2.1-1.46.6-1~bpo11+1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/e/e2fsprogs/libcom-err2_1.46.6-1~bpo11+1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/e/elfutils/libelf-dev_0.187-1~bpo11+1_i386.deb @@ -50,6 +85,7 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/ffmpeg/libavcodec58_4.3.5-0+deb11u1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/ffmpeg/libavcodec59_5.1.3-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/ffmpeg/libavformat-dev_4.3.5-0+deb11u1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/ffmpeg/libavformat58_4.3.5-0+deb11u1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/ffmpeg/libavformat59_5.1.3-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/ffmpeg/libavutil-dev_4.3.5-0+deb11u1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/ffmpeg/libavutil56_4.3.5-0+deb11u1_i386.deb @@ -59,15 +95,25 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/ffmpeg/libswresample4_5.1.3-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/flac/libflac-dev_1.3.3-2+deb11u1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/flac/libflac8_1.3.3-2+deb11u1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/fontconfig/fontconfig-config_2.13.1-4.2_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/fontconfig/fontconfig_2.13.1-4.2_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/fontconfig/libfontconfig-dev_2.13.1-4.2_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/fontconfig/libfontconfig1-dev_2.13.1-4.2_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/fontconfig/libfontconfig1_2.13.1-4.2_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/fonts-dejavu/fonts-dejavu-core_2.37-2_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/freetype/libfreetype-dev_2.10.4+dfsg-1+deb11u1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/freetype/libfreetype6-dev_2.10.4+dfsg-1+deb11u1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/freetype/libfreetype6_2.10.4+dfsg-1+deb11u1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/fribidi/libfribidi-dev_1.0.8-2+deb11u1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/fribidi/libfribidi0_1.0.8-2+deb11u1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/game-music-emu/libgme0_0.6.3-2_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-10/cpp-10_10.2.1-6_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-10/g++-10_10.2.1-6_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-10/gcc-10-base_10.2.1-6_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-10/gcc-10_10.2.1-6_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-10/libasan6_10.2.1-6_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-10/libatomic1_10.2.1-6_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-10/libcc1-0_10.2.1-6_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-10/libgcc-10-dev_10.2.1-6_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-10/libgcc-s1_10.2.1-6_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-10/libgomp1_10.2.1-6_i386.deb @@ -76,39 +122,84 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-10/libstdc++-10-dev_10.2.1-6_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-10/libstdc++6_10.2.1-6_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-10/libubsan1_10.2.1-6_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-defaults/cpp_10.2.1-1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-defaults/g++_10.2.1-1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-defaults/gcc_10.2.1-1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gdbm/libgdbm-compat4_1.19-2_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gdbm/libgdbm6_1.19-2_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gdk-pixbuf-xlib/libgdk-pixbuf-xlib-2.0-0_2.40.2-2_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gdk-pixbuf-xlib/libgdk-pixbuf2.0-0_2.40.2-2_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gdk-pixbuf/gir1.2-gdkpixbuf-2.0_2.42.2+dfsg-1+deb11u1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gdk-pixbuf/libgdk-pixbuf-2.0-0_2.42.2+dfsg-1+deb11u1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gdk-pixbuf/libgdk-pixbuf-2.0-dev_2.42.2+dfsg-1+deb11u1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gdk-pixbuf/libgdk-pixbuf2.0-bin_2.42.2+dfsg-1+deb11u1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gdk-pixbuf/libgdk-pixbuf2.0-common_2.42.2+dfsg-1+deb11u1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glib-networking/glib-networking-common_2.66.0-2_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glib-networking/glib-networking-services_2.66.0-2_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glib-networking/glib-networking_2.66.0-2_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glib2.0/libglib2.0-0_2.66.8-1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glib2.0/libglib2.0-bin_2.66.8-1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glib2.0/libglib2.0-data_2.66.8-1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glib2.0/libglib2.0-dev-bin_2.66.8-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glib2.0/libglib2.0-dev_2.66.8-1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glibc/libc-dev-bin_2.31-13+deb11u5_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glibc/libc6-dbg_2.31-13+deb11u5_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glibc/libc6-dev_2.31-13+deb11u5_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glibc/libc6-dev_2.31-13+deb11u6_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glibc/libc6_2.31-13+deb11u5_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gmp/libgmp-dev_6.2.1+dfsg-1+deb11u1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gmp/libgmp10_6.2.1+dfsg-1+deb11u1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gmp/libgmpxx4ldbl_6.2.1+dfsg-1+deb11u1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gnutls28/libgnutls-dane0_3.7.1-5+deb11u3_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gnutls28/libgnutls-openssl27_3.7.1-5+deb11u3_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gnutls28/libgnutls28-dev_3.7.1-5+deb11u3_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gnutls28/libgnutls30_3.7.1-5+deb11u3_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gnutls28/libgnutlsxx28_3.7.1-5+deb11u3_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gobject-introspection/gir1.2-freedesktop_1.66.1-1+b1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gobject-introspection/gir1.2-glib-2.0_1.66.1-1+b1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gobject-introspection/gobject-introspection_1.66.1-1+b1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gobject-introspection/libgirepository-1.0-1_1.66.1-1+b1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gobject-introspection/libgirepository1.0-dev_1.66.1-1+b1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/graphene/gir1.2-graphene-1.0_1.10.4+dfsg1-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/graphene/libgraphene-1.0-0_1.10.4+dfsg1-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/graphene/libgraphene-1.0-dev_1.10.4+dfsg1-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/graphite2/libgraphite2-3_1.3.14-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/graphite2/libgraphite2-dev_1.3.14-1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gsettings-desktop-schemas/gsettings-desktop-schemas_3.38.0-2_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gtk+2.0/gir1.2-gtk-2.0_2.24.33-2_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gtk+2.0/libgtk2.0-0_2.24.33-2_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gtk+2.0/libgtk2.0-common_2.24.33-2_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gtk+2.0/libgtk2.0-dev_2.24.33-2_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gtk+3.0/gir1.2-gtk-3.0_3.24.24-4+deb11u3_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gtk+3.0/gtk-update-icon-cache_3.24.24-4+deb11u3_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gtk+3.0/libgtk-3-0_3.24.24-4+deb11u3_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gtk+3.0/libgtk-3-common_3.24.24-4+deb11u3_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gtk+3.0/libgtk-3-dev_3.24.24-4+deb11u3_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gtk4/gir1.2-gtk-4.0_4.8.3+ds-2_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gtk4/libgtk-4-1_4.8.3+ds-2_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gtk4/libgtk-4-common_4.8.3+ds-2_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gtk4/libgtk-4-dev_4.8.3+ds-2_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/h/harfbuzz/gir1.2-harfbuzz-0.0_2.7.4-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/h/harfbuzz/libharfbuzz-dev_2.7.4-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/h/harfbuzz/libharfbuzz-gobject0_2.7.4-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/h/harfbuzz/libharfbuzz-icu0_2.7.4-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/h/harfbuzz/libharfbuzz0b_2.7.4-1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/h/hicolor-icon-theme/hicolor-icon-theme_0.17-2_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/h/highway/libhwy1_1.0.3-3_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/i/icu-le-hb/libicu-le-hb0_1.0.3+git180724-3+b2_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/i/icu/icu-devtools_67.1-7_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/i/icu/libicu-dev_67.1-7_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/i/icu/libicu67_67.1-7_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/i/iptables/libip4tc2_1.8.7-1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/i/isl/libisl23_0.23-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/j/jbigkit/libjbig-dev_2.1-3.1+b2_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/j/jbigkit/libjbig0_2.1-3.1+b2_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/j/jpeg-xl/libjxl0.7_0.7.0-10_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/j/json-c/libjson-c5_0.15-2_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/j/json-glib/libjson-glib-1.0-0_1.6.2-1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/j/json-glib/libjson-glib-1.0-common_1.6.2-1_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/k/keyutils/libkeyutils1_1.6.1-2_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/k/kmod/libkmod2_28-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/k/krb5/krb5-multidev_1.18.3-6+deb11u3_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/k/krb5/libgssapi-krb5-2_1.18.3-6+deb11u3_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/k/krb5/libgssrpc4_1.18.3-6+deb11u3_i386.deb @@ -123,6 +214,12 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lcms2/liblcms2-2_2.12~rc1-2_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lerc/liblerc4_4.0.0+ds-2_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/linux/linux-libc-dev_6.1.20-2~bpo11+1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/llvm-toolchain-11/libllvm11_11.0.1-2_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lm-sensors/libsensors-config_3.6.0-7_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lm-sensors/libsensors5_3.6.0-7_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lsb/lsb-base_11.1.0_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lvm2/dmsetup_1.02.175-2.1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lvm2/libdevmapper1.02.1_1.02.175-2.1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lz4/liblz4-1_1.9.3-2_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lzo2/liblzo2-2_2.10-2_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/liba/libasyncns/libasyncns0_0.8-6+b2_i386.deb @@ -135,6 +232,7 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libc/libcloudproviders/libcloudproviders0_0.3.0-3_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdatrie/libdatrie-dev_0.2.13-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdatrie/libdatrie1_0.2.13-1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdbusmenu/gir1.2-dbusmenu-glib-0.4_18.10.20180917~bzr492+repack1-2_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdbusmenu/libdbusmenu-glib-dev_18.10.20180917~bzr492+repack1-2_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdbusmenu/libdbusmenu-glib4_18.10.20180917~bzr492+repack1-2_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdbusmenu/libdbusmenu-gtk3-4_18.10.20180917~bzr492+repack1-2_i386.deb @@ -142,11 +240,13 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdeflate/libdeflate-dev_1.10-2~bpo11+1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdeflate/libdeflate0_1.10-2~bpo11+1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdrm/libdrm-amdgpu1_2.4.104-1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdrm/libdrm-common_2.4.104-1_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdrm/libdrm-dev_2.4.104-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdrm/libdrm-intel1_2.4.104-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdrm/libdrm-nouveau2_2.4.104-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdrm/libdrm-radeon1_2.4.104-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdrm/libdrm2_2.4.104-1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libe/libedit/libedit2_3.1-20191231-2+b1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libe/libepoxy/libepoxy-dev_1.5.8-1~bpo11+1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libe/libepoxy/libepoxy0_1.5.8-1~bpo11+1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libe/libevdev/libevdev-dev_1.11.0+dfsg-1_i386.deb @@ -156,6 +256,8 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libf/libffi/libffi7_3.3-6_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libgcrypt20/libgcrypt20-dev_1.8.7-6_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libgcrypt20/libgcrypt20_1.8.7-6_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglu/libglu1-mesa-dev_9.0.1-1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglu/libglu1-mesa_9.0.1-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libegl-dev_1.3.2-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libegl1_1.3.2-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libgl-dev_1.3.2-1_i386.deb @@ -167,22 +269,30 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libglvnd0_1.3.2-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libglx-dev_1.3.2-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libglx0_1.3.2-1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libopengl-dev_1.3.2-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libopengl0_1.3.2-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libgpg-error/libgpg-error-dev_1.38-2_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libgpg-error/libgpg-error0_1.38-2_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libgsm/libgsm1_1.0.18-2_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libgudev/gir1.2-gudev-1.0_234-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libgudev/libgudev-1.0-0_234-1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libgudev/libgudev-1.0-dev_234-1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libice/libice-dev_1.0.10-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libice/libice6_1.0.10-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libidl/libidl-2-0_0.8.14-4+b12_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libidn/libidn11_1.33-3_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libidn2/libidn2-0_2.3.0-5_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libidn2/libidn2-dev_2.3.0-5_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libinput/libinput-bin_1.16.4-3_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libinput/libinput-dev_1.16.4-3_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libinput/libinput10_1.16.4-3_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libj/libjpeg-turbo/libjpeg-dev_2.0.6-4_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libj/libjpeg-turbo/libjpeg62-turbo-dev_2.0.6-4_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libj/libjpeg-turbo/libjpeg62-turbo_2.0.6-4_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libj/libjsoncpp/libjsoncpp-dev_1.9.4-4_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libj/libjsoncpp/libjsoncpp24_1.9.4-4_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libm/libmd/libmd0_1.0.3-3_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libn/libnsl/libnsl-dev_1.3.0-2_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libn/libnsl/libnsl2_1.3.0-2_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libn/libnss-db/libnss-db_2.2.3pre1-6+b10_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libo/libogg/libogg-dev_1.3.4-0.1_i386.deb @@ -199,10 +309,15 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libr/librest/librest-0.7-0_0.8.1-1.1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libr/librist/librist4_0.2.7+dfsg-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libr/librsvg/librsvg2-2_2.50.3+dfsg-1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libseccomp/libseccomp2_2.5.1-1+deb11u1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libselinux/libselinux1-dev_3.1-3_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libselinux/libselinux1_3.1-3_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsemanage/libsemanage-common_3.1-1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsemanage/libsemanage1_3.1-1+b2_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsepol/libsepol1-dev_3.1-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsepol/libsepol1_3.1-1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libset-scalar-perl/libset-scalar-perl_1.29-2_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsm/libsm-dev_1.2.3-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsm/libsm6_1.2.3-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsndfile/libsndfile1_1.0.31-2_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsodium/libsodium23_1.0.18-1_i386.deb @@ -211,10 +326,14 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsoxr/libsoxr0_0.1.3-4_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libssh/libssh-gcrypt-4_0.9.5-1+deb11u1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libssh2/libssh2-1_1.9.0-2_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libt/libtasn1-6/libtasn1-6-dev_4.16.0-2+deb11u1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libt/libtasn1-6/libtasn1-6_4.16.0-2+deb11u1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libt/libthai/libthai-data_0.1.28-3_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libt/libthai/libthai-dev_0.1.28-3_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libt/libthai/libthai0_0.1.28-3_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libt/libtheora/libtheora0_1.1.1+dfsg.1-15_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libt/libtirpc/libtirpc-common_1.3.1-1+deb11u1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libt/libtirpc/libtirpc-dev_1.3.1-1+deb11u1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libt/libtirpc/libtirpc3_1.3.1-1+deb11u1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libt/libtool/libltdl7_2.4.6-15_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libu/libudfread/libudfread0_1.1.1-1_i386.deb @@ -234,6 +353,8 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libv/libvpx/libvpx-dev_1.9.0-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libv/libvpx/libvpx6_1.9.0-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libv/libvpx/libvpx7_1.12.0-1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libw/libwacom/libwacom-common_1.8-2_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libw/libwacom/libwacom-dev_1.8-2_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libw/libwacom/libwacom2_1.8-2_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libw/libwebp/libwebp-dev_0.6.1-2.1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libw/libwebp/libwebp6_0.6.1-2.1_i386.deb @@ -241,6 +362,7 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libw/libwebp/libwebpdemux2_0.6.1-2.1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libw/libwebp/libwebpmux3_0.6.1-2.1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libx11/libx11-6_1.7.2-1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libx11/libx11-data_1.7.2-1_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libx11/libx11-dev_1.7.2-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libx11/libx11-xcb-dev_1.7.2-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libx11/libx11-xcb1_1.7.2-1_i386.deb @@ -293,6 +415,7 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxkbcommon/libxkbcommon-x11-0_1.0.3-2_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxkbcommon/libxkbcommon0_1.0.3-2_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxml2/libxml2-dev_2.9.10+dfsg-6.7+deb11u4_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxml2/libxml2-utils_2.9.10+dfsg-6.7+deb11u4_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxml2/libxml2_2.9.10+dfsg-6.7+deb11u4_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxrandr/libxrandr-dev_1.5.1-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxrandr/libxrandr2_1.5.1-1_i386.deb @@ -311,27 +434,40 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxxf86vm/libxxf86vm-dev_1.1.4-1+b2_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxxf86vm/libxxf86vm1_1.1.4-1+b2_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libz/libzstd/libzstd1_1.4.8+dfsg-2.1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/make-dfsg/make_4.3-4.1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mako/python3-mako_1.1.3+ds1-2_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/markupsafe/python3-markupsafe_2.0.1-2~bpo11+1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mbedtls/libmbedcrypto7_2.28.3-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/md4c/libmd4c0_0.4.7-2_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/media-types/media-types_4.0.0_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libegl-mesa0_20.3.5-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libegl1-mesa-dev_20.3.5-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libegl1-mesa_20.3.5-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libgbm-dev_20.3.5-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libgbm1_20.3.5-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libgl1-mesa-dev_20.3.5-1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libgl1-mesa-dri_20.3.5-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libgl1-mesa-glx_20.3.5-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libglapi-mesa_20.3.5-1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libglx-mesa0_20.3.5-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libwayland-egl1-mesa_20.3.5-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/mesa-common-dev_20.3.5-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/minizip/libminizip-dev_1.1-8+b1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/minizip/libminizip1_1.1-8+b1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mpclib3/libmpc3_1.2.0-1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mpdecimal/libmpdec3_2.5.1-1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mpfr4/libmpfr6_4.1.0-3_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mpg123/libmpg123-0_1.26.4-1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mtdev/libmtdev-dev_1.1.6-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mtdev/libmtdev1_1.1.6-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/ncurses/libncurses-dev_6.2+20201114-2+deb11u1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/ncurses/libncurses6_6.2+20201114-2+deb11u1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/ncurses/libncursesw6_6.2+20201114-2+deb11u1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/ncurses/libtinfo6_6.2+20201114-2+deb11u1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/ncurses/ncurses-bin_6.2+20201114-2+deb11u1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/nettle/libhogweed6_3.7.3-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/nettle/libnettle8_3.7.3-1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/nettle/nettle-dev_3.7.3-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/nghttp2/libnghttp2-14_1.43.0-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/norm/libnorm1_1.5.9+dfsg-2_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/nspr/libnspr4-dev_4.29-1_i386.deb @@ -346,15 +482,22 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/o/openssl/libssl1.1_1.1.1n-0+deb11u4_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/o/opus/libopus-dev_1.3.1-0.1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/o/opus/libopus0_1.3.1-0.1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/p11-kit/libp11-kit-dev_0.23.22-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/p11-kit/libp11-kit0_0.23.22-1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pam/libpam-modules_1.4.0-9+deb11u1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pam/libpam-runtime_1.4.0-9+deb11u1_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pam/libpam0g-dev_1.4.0-9+deb11u1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pam/libpam0g_1.4.0-9+deb11u1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pango1.0/gir1.2-pango-1.0_1.46.2-3_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pango1.0/libpango-1.0-0_1.46.2-3_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pango1.0/libpango1.0-dev_1.46.2-3_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pango1.0/libpangocairo-1.0-0_1.46.2-3_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pango1.0/libpangoft2-1.0-0_1.46.2-3_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pango1.0/libpangoxft-1.0-0_1.46.2-3_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pango1.0/pango1.0-tools_1.46.2-3_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pangox-compat/libpangox-1.0-0_0.0.2-5.1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/patch/patch_2.7.6-7_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pci.ids/pci.ids_0.0~2021.02.08-1_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pciutils/libpci-dev_3.7.0-5_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pciutils/libpci3_3.7.0-5_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pcre2/libpcre2-16-0_10.36-2+deb11u1_i386.deb @@ -367,14 +510,29 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pcre3/libpcre32-3_8.39-13_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pcre3/libpcre3_8.39-13_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pcre3/libpcrecpp0v5_8.39-13_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/perl/libperl5.32_5.32.1-4+deb11u2_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/perl/perl-base_5.32.1-4+deb11u2_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/perl/perl-modules-5.32_5.32.1-4+deb11u2_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/perl/perl_5.32.1-4+deb11u2_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pipewire/libpipewire-0.3-0_0.3.65-2~bpo11+1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pipewire/libpipewire-0.3-dev_0.3.65-2~bpo11+1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pipewire/libspa-0.2-dev_0.3.65-2~bpo11+1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pipewire/libspa-0.2-modules_0.3.65-2~bpo11+1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pixman/libpixman-1-0_0.40.0-1.1~deb11u1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pixman/libpixman-1-dev_0.40.0-1.1~deb11u1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pkg-config/pkg-config_0.29.2-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pulseaudio/libpulse-dev_14.2-2_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pulseaudio/libpulse-mainloop-glib0_14.2-2_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pulseaudio/libpulse0_14.2-2_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/python-markdown/python3-markdown_3.3.4-1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/python3-defaults/libpython3-stdlib_3.9.2-3_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/python3-defaults/python3_3.9.2-3_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/python3-stdlib-extensions/python3-distutils_3.9.2-1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/python3-stdlib-extensions/python3-lib2to3_3.9.2-1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/python3.9/libpython3.9-minimal_3.9.2-1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/python3.9/libpython3.9-stdlib_3.9.2-1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/python3.9/python3.9-minimal_3.9.2-1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/python3.9/python3.9_3.9.2-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/libqt6concurrent6_6.4.2+dfsg-10~bpo11+1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/libqt6core6_6.4.2+dfsg-10~bpo11+1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/libqt6dbus6_6.4.2+dfsg-10~bpo11+1_i386.deb @@ -387,8 +545,11 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/libqt6test6_6.4.2+dfsg-10~bpo11+1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/libqt6widgets6_6.4.2+dfsg-10~bpo11+1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/libqt6xml6_6.4.2+dfsg-10~bpo11+1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/qmake6-bin_6.4.2+dfsg-10~bpo11+1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/qmake6_6.4.2+dfsg-10~bpo11+1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/qt6-base-dev-tools_6.4.2+dfsg-10~bpo11+1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/qt6-base-dev_6.4.2+dfsg-10~bpo11+1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/qt6-qpa-plugins_6.4.2+dfsg-10~bpo11+1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/libqt5concurrent5_5.15.2+dfsg-9_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/libqt5core5a_5.15.2+dfsg-9_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/libqt5dbus5_5.15.2+dfsg-9_i386.deb @@ -399,12 +560,21 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/libqt5test5_5.15.2+dfsg-9_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/libqt5widgets5_5.15.2+dfsg-9_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/libqt5xml5_5.15.2+dfsg-9_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/qt5-qmake-bin_5.15.2+dfsg-9_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/qt5-qmake_5.15.2+dfsg-9_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/qtbase5-dev-tools_5.15.2+dfsg-9_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/qtbase5-dev_5.15.2+dfsg-9_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtchooser/qtchooser_66-2_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/r/re2/libre2-9_20210201+dfsg-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/r/re2/libre2-dev_20210201+dfsg-1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/r/readline/libreadline8_8.1-1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/r/readline/readline-common_8.1-1_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/r/rtmpdump/librtmp1_2.4+20151223.gitfa8646d.1-2+b2_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/r/rust-rav1e/librav1e0_0.5.1-6_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/sensible-utils/sensible-utils_0.0.14_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/setuptools/python3-pkg-resources_66.1.1-1~bpo11+1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/shadow/login_4.8.1-1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/shadow/passwd_4.8.1-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/shared-mime-info/shared-mime-info_2.0-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/shine/libshine3_3.1.1-2_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/snappy/libsnappy-dev_1.1.8-1_i386.deb @@ -413,12 +583,18 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/speech-dispatcher/libspeechd2_0.11.4-2~bpo11+1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/speex/libspeex1_1.2~rc1.2-1.1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/sqlite3/libsqlite3-0_3.34.1-3_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/srt/libsrt1.4-gnutls_1.4.2-1.3_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/srt/libsrt1.5-gnutls_1.5.1-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/svt-av1/libsvtav1enc1_1.4.1+dfsg-1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/systemd/libpam-systemd_252.5-2~bpo11+1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/systemd/libsystemd-dev_252.5-2~bpo11+1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/systemd/libsystemd-shared_252.5-2~bpo11+1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/systemd/libsystemd0_252.5-2~bpo11+1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/systemd/libudev-dev_252.5-2~bpo11+1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/systemd/libudev1_252.5-2~bpo11+1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/systemd/systemd-sysv_252.5-2~bpo11+1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/systemd/systemd_252.5-2~bpo11+1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/t/tar/tar_1.34+dfsg-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/t/tcp-wrappers/libwrap0_7.6.q-31_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/t/tiff/libtiff-dev_4.2.0-1+deb11u4_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/t/tiff/libtiff5_4.2.0-1+deb11u4_i386.deb @@ -426,12 +602,17 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/t/tiff/libtiffxx5_4.2.0-1+deb11u4_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/t/tslib/libts0_1.22-1+b1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/t/twolame/libtwolame0_0.4.0-2_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/t/tzdata/tzdata_2021a-1+deb11u9_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/ucf/ucf_3.0043_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/unbound/libunbound8_1.17.1-2~bpo11+1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/libblkid-dev_2.36.1-8+deb11u1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/libblkid1_2.36.1-8+deb11u1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/libfdisk1_2.36.1-8+deb11u1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/libmount-dev_2.36.1-8+deb11u1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/libmount1_2.36.1-8+deb11u1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/libuuid1_2.36.1-8+deb11u1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/mount_2.36.1-8+deb11u1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/util-linux_2.36.1-8+deb11u1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/uuid-dev_2.36.1-8+deb11u1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/v/valgrind/valgrind_3.16.1-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/v/vulkan-loader/libvulkan-dev_1.3.224.0-1~bpo11+1_i386.deb @@ -445,6 +626,7 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/w/wayland/libwayland-egl-backend-dev_1.18.0-2~exp1.1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/w/wayland/libwayland-egl1_1.18.0-2~exp1.1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/w/wayland/libwayland-server0_1.18.0-2~exp1.1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/w/webrtc-audio-processing/libwebrtc-audio-processing1_0.3-1+b1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/x264/libx264-160_0.160.3011+gitcde9a93-2.1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/x264/libx264-164_0.164.3095+gitbaee400-3_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/x265/libx265-192_3.4-2_i386.deb @@ -459,10 +641,27 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xcb-util/libxcb-util1_0.4.0-1+b1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xft/libxft-dev_2.3.2-2_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xft/libxft2_2.3.2-2_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xkeyboard-config/xkb-data_2.29-2_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xorg-sgml-doctools/xorg-sgml-doctools_1.11-1.1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xorg/x11-common_7.7+22_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xorgproto/x11proto-core-dev_2020.1-1_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xorgproto/x11proto-dev_2020.1-1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xorgproto/x11proto-input-dev_2020.1-1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xorgproto/x11proto-randr-dev_2020.1-1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xorgproto/x11proto-record-dev_2020.1-1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xorgproto/x11proto-render-dev_2020.1-1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xorgproto/x11proto-scrnsaver-dev_2020.1-1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xorgproto/x11proto-xext-dev_2020.1-1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xorgproto/x11proto-xf86vidmode-dev_2020.1-1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xorgproto/x11proto-xinerama-dev_2020.1-1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xtrans/xtrans-dev_1.4.0-1_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xvidcore/libxvidcore4_1.3.7-1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xz-utils/liblzma-dev_5.2.5-2.1~deb11u1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xz-utils/liblzma5_5.2.5-2.1~deb11u1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xz-utils/xz-utils_5.2.5-2.1~deb11u1_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/z/z3/libz3-4_4.8.10-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/z/zeromq3/libzmq5_4.3.4-1_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/z/zlib/zlib1g-dev_1.2.11.dfsg-2+deb11u2_i386.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/z/zlib/zlib1g_1.2.11.dfsg-2+deb11u2_i386.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/z/zvbi/libzvbi-common_0.2.35-18_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/z/zvbi/libzvbi0_0.2.35-18_i386.deb
diff --git a/build/linux/sysroot_scripts/generated_package_lists/bullseye.mips64el b/build/linux/sysroot_scripts/generated_package_lists/bullseye.mips64el index 4ac52cf..db57835 100644 --- a/build/linux/sysroot_scripts/generated_package_lists/bullseye.mips64el +++ b/build/linux/sysroot_scripts/generated_package_lists/bullseye.mips64el
@@ -1,21 +1,40 @@ +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/acl/libacl1_2.2.53-10_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/adduser/adduser_3.118_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/adwaita-icon-theme/adwaita-icon-theme_3.38.0-1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/alsa-lib/libasound2-data_1.2.4-1.1_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/alsa-lib/libasound2-dev_1.2.4-1.1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/alsa-lib/libasound2_1.2.4-1.1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/aom/libaom0_1.0.0.errata1-3_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/aom/libaom3_3.6.0-1~bpo11+1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/apparmor/libapparmor1_2.13.6-10_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/argon2/libargon2-1_0~20171227-0.2_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/at-spi2-atk/libatk-bridge2.0-0_2.38.0-4~bpo11+1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/at-spi2-atk/libatk-bridge2.0-dev_2.38.0-4~bpo11+1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/at-spi2-core/gir1.2-atspi-2.0_2.44.1-1~bpo11+1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/at-spi2-core/libatspi2.0-0_2.44.1-1~bpo11+1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/at-spi2-core/libatspi2.0-dev_2.44.1-1~bpo11+1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/atk1.0/gir1.2-atk-1.0_2.38.0-1~bpo11+1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/atk1.0/libatk1.0-0_2.38.0-1~bpo11+1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/atk1.0/libatk1.0-data_2.38.0-1~bpo11+1_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/atk1.0/libatk1.0-dev_2.38.0-1~bpo11+1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/attr/libattr1_2.4.48-6_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/audit/libaudit-common_3.0-2_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/audit/libaudit1_3.0-2_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/avahi/libavahi-client3_0.8-5+deb11u2_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/avahi/libavahi-common-data_0.8-5+deb11u2_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/avahi/libavahi-common3_0.8-5+deb11u2_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/binutils/binutils-common_2.35.2-2_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/binutils/binutils-mips64el-linux-gnuabi64_2.35.2-2_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/binutils/binutils_2.35.2-2_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/binutils/libbinutils_2.35.2-2_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/binutils/libctf-nobfd0_2.35.2-2_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/binutils/libctf0_2.35.2-2_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/bluez/libbluetooth-dev_5.55-3.1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/bluez/libbluetooth3_5.55-3.1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/brotli/libbrotli-dev_1.0.9-2+b2_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/brotli/libbrotli1_1.0.9-2+b2_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/build-essential/build-essential_12.9_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/bzip2/bzip2_1.0.8-4_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/bzip2/libbz2-1.0_1.0.8-4_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cairo/libcairo-gobject2_1.16.0-5_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cairo/libcairo-script-interpreter2_1.16.0-5_mips64el.deb @@ -26,6 +45,8 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/codec2/libcodec2-0.9_0.9.2-4_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/codec2/libcodec2-1.0_1.0.5-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/colord/libcolord2_1.4.5-3_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/coreutils/coreutils_8.32-4_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cryptsetup/libcryptsetup12_2.3.7-1+deb11u1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cups/libcups2-dev_2.3.3op2-3+deb11u2_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cups/libcups2_2.3.3op2-3+deb11u2_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cups/libcupsimage2-dev_2.3.3op2-3+deb11u2_mips64el.deb @@ -33,13 +54,27 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/curl/libcurl3-gnutls_7.88.1-7~bpo11+2_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/curl/libcurl4-gnutls-dev_7.88.1-7~bpo11+2_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cyrus-sasl2/libsasl2-2_2.1.27+dfsg-2.1+deb11u1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cyrus-sasl2/libsasl2-modules-db_2.1.27+dfsg-2.1+deb11u1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/dav1d/libdav1d4_0.7.1-3_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/dav1d/libdav1d6_1.0.0-2_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/db5.3/libdb5.3_5.3.28+dfsg1-0.8_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/dbus-glib/libdbus-glib-1-2_0.110-6_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/dbus/dbus-bin_1.14.6-1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/dbus/dbus-daemon_1.14.6-1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/dbus/dbus-session-bus-common_1.14.6-1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/dbus/dbus-system-bus-common_1.14.6-1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/dbus/dbus-user-session_1.14.6-1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/dbus/dbus_1.14.6-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/dbus/libdbus-1-3_1.12.24-0+deb11u1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/dbus/libdbus-1-dev_1.12.24-0+deb11u1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/dconf/dconf-gsettings-backend_0.38.0-2_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/dconf/dconf-service_0.38.0-2_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/dconf/libdconf1_0.38.0-2_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/debconf/debconf_1.5.77_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/double-conversion/libdouble-conversion3_3.1.5-6.1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/dpkg/dpkg-dev_1.20.12_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/dpkg/dpkg_1.20.12_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/dpkg/libdpkg-perl_1.20.12_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/e/e2fsprogs/comerr-dev_2.1-1.46.6-1~bpo11+1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/e/e2fsprogs/libcom-err2_1.46.6-1~bpo11+1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/e/elfutils/libelf-dev_0.187-1~bpo11+1_mips64el.deb @@ -50,6 +85,7 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/ffmpeg/libavcodec58_4.3.5-0+deb11u1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/ffmpeg/libavcodec59_5.1.3-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/ffmpeg/libavformat-dev_4.3.5-0+deb11u1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/ffmpeg/libavformat58_4.3.5-0+deb11u1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/ffmpeg/libavformat59_5.1.3-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/ffmpeg/libavutil-dev_4.3.5-0+deb11u1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/ffmpeg/libavutil56_4.3.5-0+deb11u1_mips64el.deb @@ -59,52 +95,107 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/ffmpeg/libswresample4_5.1.3-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/flac/libflac-dev_1.3.3-2+deb11u1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/flac/libflac8_1.3.3-2+deb11u1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/fontconfig/fontconfig-config_2.13.1-4.2_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/fontconfig/fontconfig_2.13.1-4.2_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/fontconfig/libfontconfig-dev_2.13.1-4.2_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/fontconfig/libfontconfig1-dev_2.13.1-4.2_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/fontconfig/libfontconfig1_2.13.1-4.2_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/fonts-dejavu/fonts-dejavu-core_2.37-2_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/freetype/libfreetype-dev_2.10.4+dfsg-1+deb11u1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/freetype/libfreetype6-dev_2.10.4+dfsg-1+deb11u1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/freetype/libfreetype6_2.10.4+dfsg-1+deb11u1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/fribidi/libfribidi-dev_1.0.8-2+deb11u1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/fribidi/libfribidi0_1.0.8-2+deb11u1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/game-music-emu/libgme0_0.6.3-2_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-10/cpp-10_10.2.1-6_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-10/g++-10_10.2.1-6_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-10/gcc-10-base_10.2.1-6_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-10/gcc-10_10.2.1-6_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-10/libatomic1_10.2.1-6_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-10/libcc1-0_10.2.1-6_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-10/libgcc-10-dev_10.2.1-6_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-10/libgcc-s1_10.2.1-6_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-10/libgomp1_10.2.1-6_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-10/libstdc++-10-dev_10.2.1-6_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-10/libstdc++6_10.2.1-6_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-defaults/cpp_10.2.1-1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-defaults/g++_10.2.1-1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-defaults/gcc_10.2.1-1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gdbm/libgdbm-compat4_1.19-2_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gdbm/libgdbm6_1.19-2_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gdk-pixbuf-xlib/libgdk-pixbuf-xlib-2.0-0_2.40.2-2_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gdk-pixbuf-xlib/libgdk-pixbuf2.0-0_2.40.2-2_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gdk-pixbuf/gir1.2-gdkpixbuf-2.0_2.42.2+dfsg-1+deb11u1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gdk-pixbuf/libgdk-pixbuf-2.0-0_2.42.2+dfsg-1+deb11u1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gdk-pixbuf/libgdk-pixbuf-2.0-dev_2.42.2+dfsg-1+deb11u1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gdk-pixbuf/libgdk-pixbuf2.0-bin_2.42.2+dfsg-1+deb11u1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gdk-pixbuf/libgdk-pixbuf2.0-common_2.42.2+dfsg-1+deb11u1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glib-networking/glib-networking-common_2.66.0-2_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glib-networking/glib-networking-services_2.66.0-2_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glib-networking/glib-networking_2.66.0-2_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glib2.0/libglib2.0-0_2.66.8-1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glib2.0/libglib2.0-bin_2.66.8-1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glib2.0/libglib2.0-data_2.66.8-1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glib2.0/libglib2.0-dev-bin_2.66.8-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glib2.0/libglib2.0-dev_2.66.8-1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glibc/libc-dev-bin_2.31-13+deb11u5_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glibc/libc6-dbg_2.31-13+deb11u5_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glibc/libc6-dev_2.31-13+deb11u5_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glibc/libc6-dev_2.31-13+deb11u6_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glibc/libc6_2.31-13+deb11u5_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gmp/libgmp-dev_6.2.1+dfsg-1+deb11u1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gmp/libgmp10_6.2.1+dfsg-1+deb11u1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gmp/libgmpxx4ldbl_6.2.1+dfsg-1+deb11u1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gnutls28/libgnutls-dane0_3.7.1-5+deb11u3_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gnutls28/libgnutls-openssl27_3.7.1-5+deb11u3_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gnutls28/libgnutls28-dev_3.7.1-5+deb11u3_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gnutls28/libgnutls30_3.7.1-5+deb11u3_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gnutls28/libgnutlsxx28_3.7.1-5+deb11u3_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gobject-introspection/gir1.2-freedesktop_1.66.1-1+b1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gobject-introspection/gir1.2-glib-2.0_1.66.1-1+b1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gobject-introspection/gobject-introspection_1.66.1-1+b1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gobject-introspection/libgirepository-1.0-1_1.66.1-1+b1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gobject-introspection/libgirepository1.0-dev_1.66.1-1+b1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/graphene/gir1.2-graphene-1.0_1.10.4+dfsg1-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/graphene/libgraphene-1.0-0_1.10.4+dfsg1-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/graphene/libgraphene-1.0-dev_1.10.4+dfsg1-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/graphite2/libgraphite2-3_1.3.14-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/graphite2/libgraphite2-dev_1.3.14-1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gsettings-desktop-schemas/gsettings-desktop-schemas_3.38.0-2_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gtk+2.0/gir1.2-gtk-2.0_2.24.33-2_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gtk+2.0/libgtk2.0-0_2.24.33-2_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gtk+2.0/libgtk2.0-common_2.24.33-2_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gtk+2.0/libgtk2.0-dev_2.24.33-2_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gtk+3.0/gir1.2-gtk-3.0_3.24.24-4+deb11u3_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gtk+3.0/gtk-update-icon-cache_3.24.24-4+deb11u3_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gtk+3.0/libgtk-3-0_3.24.24-4+deb11u3_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gtk+3.0/libgtk-3-common_3.24.24-4+deb11u3_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gtk+3.0/libgtk-3-dev_3.24.24-4+deb11u3_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gtk4/gir1.2-gtk-4.0_4.8.3+ds-2_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gtk4/libgtk-4-1_4.8.3+ds-2_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gtk4/libgtk-4-common_4.8.3+ds-2_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gtk4/libgtk-4-dev_4.8.3+ds-2_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/h/harfbuzz/gir1.2-harfbuzz-0.0_2.7.4-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/h/harfbuzz/libharfbuzz-dev_2.7.4-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/h/harfbuzz/libharfbuzz-gobject0_2.7.4-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/h/harfbuzz/libharfbuzz-icu0_2.7.4-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/h/harfbuzz/libharfbuzz0b_2.7.4-1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/h/hicolor-icon-theme/hicolor-icon-theme_0.17-2_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/h/highway/libhwy1_1.0.3-3_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/i/icu-le-hb/libicu-le-hb0_1.0.3+git180724-3+b2_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/i/icu/icu-devtools_67.1-7_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/i/icu/libicu-dev_67.1-7_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/i/icu/libicu67_67.1-7_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/i/iptables/libip4tc2_1.8.7-1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/i/isl/libisl23_0.23-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/j/jbigkit/libjbig-dev_2.1-3.1+b2_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/j/jbigkit/libjbig0_2.1-3.1+b2_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/j/jpeg-xl/libjxl0.7_0.7.0-10_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/j/json-c/libjson-c5_0.15-2_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/j/json-glib/libjson-glib-1.0-0_1.6.2-1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/j/json-glib/libjson-glib-1.0-common_1.6.2-1_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/k/keyutils/libkeyutils1_1.6.1-2_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/k/kmod/libkmod2_28-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/k/krb5/krb5-multidev_1.18.3-6+deb11u3_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/k/krb5/libgssapi-krb5-2_1.18.3-6+deb11u3_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/k/krb5/libgssrpc4_1.18.3-6+deb11u3_mips64el.deb @@ -119,6 +210,12 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lcms2/liblcms2-2_2.12~rc1-2_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lerc/liblerc4_4.0.0+ds-2_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/linux/linux-libc-dev_5.19.11-1~bpo11+1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/llvm-toolchain-11/libllvm11_11.0.1-2_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lm-sensors/libsensors-config_3.6.0-7_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lm-sensors/libsensors5_3.6.0-7_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lsb/lsb-base_11.1.0_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lvm2/dmsetup_1.02.175-2.1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lvm2/libdevmapper1.02.1_1.02.175-2.1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lz4/liblz4-1_1.9.3-2_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lzo2/liblzo2-2_2.10-2_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/liba/libasyncns/libasyncns0_0.8-6+b2_mips64el.deb @@ -131,6 +228,7 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libc/libcloudproviders/libcloudproviders0_0.3.0-3_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdatrie/libdatrie-dev_0.2.13-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdatrie/libdatrie1_0.2.13-1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdbusmenu/gir1.2-dbusmenu-glib-0.4_18.10.20180917~bzr492+repack1-2_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdbusmenu/libdbusmenu-glib-dev_18.10.20180917~bzr492+repack1-2_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdbusmenu/libdbusmenu-glib4_18.10.20180917~bzr492+repack1-2_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdbusmenu/libdbusmenu-gtk3-4_18.10.20180917~bzr492+repack1-2_mips64el.deb @@ -138,10 +236,12 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdeflate/libdeflate-dev_1.10-2~bpo11+1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdeflate/libdeflate0_1.10-2~bpo11+1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdrm/libdrm-amdgpu1_2.4.104-1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdrm/libdrm-common_2.4.104-1_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdrm/libdrm-dev_2.4.104-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdrm/libdrm-nouveau2_2.4.104-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdrm/libdrm-radeon1_2.4.104-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdrm/libdrm2_2.4.104-1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libe/libedit/libedit2_3.1-20191231-2+b1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libe/libepoxy/libepoxy-dev_1.5.8-1~bpo11+1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libe/libepoxy/libepoxy0_1.5.8-1~bpo11+1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libe/libevdev/libevdev-dev_1.11.0+dfsg-1_mips64el.deb @@ -151,6 +251,8 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libf/libffi/libffi7_3.3-6_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libgcrypt20/libgcrypt20-dev_1.8.7-6_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libgcrypt20/libgcrypt20_1.8.7-6_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglu/libglu1-mesa-dev_9.0.1-1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglu/libglu1-mesa_9.0.1-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libegl-dev_1.3.2-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libegl1_1.3.2-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libgl-dev_1.3.2-1_mips64el.deb @@ -162,22 +264,30 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libglvnd0_1.3.2-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libglx-dev_1.3.2-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libglx0_1.3.2-1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libopengl-dev_1.3.2-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libopengl0_1.3.2-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libgpg-error/libgpg-error-dev_1.38-2_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libgpg-error/libgpg-error0_1.38-2_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libgsm/libgsm1_1.0.18-2_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libgudev/gir1.2-gudev-1.0_234-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libgudev/libgudev-1.0-0_234-1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libgudev/libgudev-1.0-dev_234-1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libice/libice-dev_1.0.10-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libice/libice6_1.0.10-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libidl/libidl-2-0_0.8.14-4+b12_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libidn/libidn11_1.33-3_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libidn2/libidn2-0_2.3.0-5_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libidn2/libidn2-dev_2.3.0-5_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libinput/libinput-bin_1.16.4-3_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libinput/libinput-dev_1.16.4-3_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libinput/libinput10_1.16.4-3_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libj/libjpeg-turbo/libjpeg-dev_2.0.6-4_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libj/libjpeg-turbo/libjpeg62-turbo-dev_2.0.6-4_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libj/libjpeg-turbo/libjpeg62-turbo_2.0.6-4_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libj/libjsoncpp/libjsoncpp-dev_1.9.4-4_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libj/libjsoncpp/libjsoncpp24_1.9.4-4_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libm/libmd/libmd0_1.0.3-3_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libn/libnsl/libnsl-dev_1.3.0-2_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libn/libnsl/libnsl2_1.3.0-2_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libn/libnss-db/libnss-db_2.2.3pre1-6+b10_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libo/libogg/libogg-dev_1.3.4-0.1_mips64el.deb @@ -194,10 +304,15 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libr/librest/librest-0.7-0_0.8.1-1.1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libr/librist/librist4_0.2.7+dfsg-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libr/librsvg/librsvg2-2_2.50.3+dfsg-1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libseccomp/libseccomp2_2.5.1-1+deb11u1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libselinux/libselinux1-dev_3.1-3_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libselinux/libselinux1_3.1-3_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsemanage/libsemanage-common_3.1-1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsemanage/libsemanage1_3.1-1+b2_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsepol/libsepol1-dev_3.1-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsepol/libsepol1_3.1-1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libset-scalar-perl/libset-scalar-perl_1.29-2_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsm/libsm-dev_1.2.3-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsm/libsm6_1.2.3-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsndfile/libsndfile1_1.0.31-2_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsodium/libsodium23_1.0.18-1_mips64el.deb @@ -206,10 +321,14 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsoxr/libsoxr0_0.1.3-4_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libssh/libssh-gcrypt-4_0.9.5-1+deb11u1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libssh2/libssh2-1_1.9.0-2_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libt/libtasn1-6/libtasn1-6-dev_4.16.0-2+deb11u1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libt/libtasn1-6/libtasn1-6_4.16.0-2+deb11u1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libt/libthai/libthai-data_0.1.28-3_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libt/libthai/libthai-dev_0.1.28-3_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libt/libthai/libthai0_0.1.28-3_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libt/libtheora/libtheora0_1.1.1+dfsg.1-15_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libt/libtirpc/libtirpc-common_1.3.1-1+deb11u1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libt/libtirpc/libtirpc-dev_1.3.1-1+deb11u1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libt/libtirpc/libtirpc3_1.3.1-1+deb11u1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libt/libtool/libltdl7_2.4.6-15_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libu/libudfread/libudfread0_1.1.1-1_mips64el.deb @@ -229,6 +348,8 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libv/libvpx/libvpx-dev_1.9.0-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libv/libvpx/libvpx6_1.9.0-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libv/libvpx/libvpx7_1.12.0-1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libw/libwacom/libwacom-common_1.8-2_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libw/libwacom/libwacom-dev_1.8-2_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libw/libwacom/libwacom2_1.8-2_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libw/libwebp/libwebp-dev_0.6.1-2.1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libw/libwebp/libwebp6_0.6.1-2.1_mips64el.deb @@ -236,6 +357,7 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libw/libwebp/libwebpdemux2_0.6.1-2.1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libw/libwebp/libwebpmux3_0.6.1-2.1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libx11/libx11-6_1.7.2-1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libx11/libx11-data_1.7.2-1_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libx11/libx11-dev_1.7.2-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libx11/libx11-xcb-dev_1.7.2-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libx11/libx11-xcb1_1.7.2-1_mips64el.deb @@ -288,6 +410,7 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxkbcommon/libxkbcommon-x11-0_1.0.3-2_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxkbcommon/libxkbcommon0_1.0.3-2_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxml2/libxml2-dev_2.9.10+dfsg-6.7+deb11u4_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxml2/libxml2-utils_2.9.10+dfsg-6.7+deb11u4_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxml2/libxml2_2.9.10+dfsg-6.7+deb11u4_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxrandr/libxrandr-dev_1.5.1-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxrandr/libxrandr2_1.5.1-1_mips64el.deb @@ -306,27 +429,40 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxxf86vm/libxxf86vm-dev_1.1.4-1+b2_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxxf86vm/libxxf86vm1_1.1.4-1+b2_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libz/libzstd/libzstd1_1.4.8+dfsg-2.1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/make-dfsg/make_4.3-4.1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mako/python3-mako_1.1.3+ds1-2_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/markupsafe/python3-markupsafe_2.0.1-2~bpo11+1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mbedtls/libmbedcrypto7_2.28.3-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/md4c/libmd4c0_0.4.7-2_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/media-types/media-types_4.0.0_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libegl-mesa0_20.3.5-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libegl1-mesa-dev_20.3.5-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libegl1-mesa_20.3.5-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libgbm-dev_20.3.5-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libgbm1_20.3.5-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libgl1-mesa-dev_20.3.5-1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libgl1-mesa-dri_20.3.5-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libgl1-mesa-glx_20.3.5-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libglapi-mesa_20.3.5-1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libglx-mesa0_20.3.5-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libwayland-egl1-mesa_20.3.5-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/mesa-common-dev_20.3.5-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/minizip/libminizip-dev_1.1-8+b1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/minizip/libminizip1_1.1-8+b1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mpclib3/libmpc3_1.2.0-1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mpdecimal/libmpdec3_2.5.1-1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mpfr4/libmpfr6_4.1.0-3_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mpg123/libmpg123-0_1.26.4-1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mtdev/libmtdev-dev_1.1.6-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mtdev/libmtdev1_1.1.6-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/ncurses/libncurses-dev_6.2+20201114-2+deb11u1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/ncurses/libncurses6_6.2+20201114-2+deb11u1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/ncurses/libncursesw6_6.2+20201114-2+deb11u1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/ncurses/libtinfo6_6.2+20201114-2+deb11u1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/ncurses/ncurses-bin_6.2+20201114-2+deb11u1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/nettle/libhogweed6_3.7.3-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/nettle/libnettle8_3.7.3-1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/nettle/nettle-dev_3.7.3-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/nghttp2/libnghttp2-14_1.43.0-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/norm/libnorm1_1.5.9+dfsg-2_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/nspr/libnspr4-dev_4.29-1_mips64el.deb @@ -341,15 +477,22 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/o/openssl/libssl1.1_1.1.1n-0+deb11u4_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/o/opus/libopus-dev_1.3.1-0.1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/o/opus/libopus0_1.3.1-0.1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/p11-kit/libp11-kit-dev_0.23.22-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/p11-kit/libp11-kit0_0.23.22-1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pam/libpam-modules_1.4.0-9+deb11u1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pam/libpam-runtime_1.4.0-9+deb11u1_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pam/libpam0g-dev_1.4.0-9+deb11u1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pam/libpam0g_1.4.0-9+deb11u1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pango1.0/gir1.2-pango-1.0_1.46.2-3_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pango1.0/libpango-1.0-0_1.46.2-3_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pango1.0/libpango1.0-dev_1.46.2-3_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pango1.0/libpangocairo-1.0-0_1.46.2-3_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pango1.0/libpangoft2-1.0-0_1.46.2-3_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pango1.0/libpangoxft-1.0-0_1.46.2-3_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pango1.0/pango1.0-tools_1.46.2-3_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pangox-compat/libpangox-1.0-0_0.0.2-5.1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/patch/patch_2.7.6-7_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pci.ids/pci.ids_0.0~2021.02.08-1_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pciutils/libpci-dev_3.7.0-5_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pciutils/libpci3_3.7.0-5_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pcre2/libpcre2-16-0_10.36-2+deb11u1_mips64el.deb @@ -362,14 +505,29 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pcre3/libpcre32-3_8.39-13_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pcre3/libpcre3_8.39-13_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pcre3/libpcrecpp0v5_8.39-13_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/perl/libperl5.32_5.32.1-4+deb11u2_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/perl/perl-base_5.32.1-4+deb11u2_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/perl/perl-modules-5.32_5.32.1-4+deb11u2_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/perl/perl_5.32.1-4+deb11u2_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pipewire/libpipewire-0.3-0_0.3.65-2~bpo11+1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pipewire/libpipewire-0.3-dev_0.3.65-2~bpo11+1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pipewire/libspa-0.2-dev_0.3.65-2~bpo11+1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pipewire/libspa-0.2-modules_0.3.65-2~bpo11+1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pixman/libpixman-1-0_0.40.0-1.1~deb11u1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pixman/libpixman-1-dev_0.40.0-1.1~deb11u1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pkg-config/pkg-config_0.29.2-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pulseaudio/libpulse-dev_14.2-2_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pulseaudio/libpulse-mainloop-glib0_14.2-2_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pulseaudio/libpulse0_14.2-2_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/python-markdown/python3-markdown_3.3.4-1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/python3-defaults/libpython3-stdlib_3.9.2-3_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/python3-defaults/python3_3.9.2-3_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/python3-stdlib-extensions/python3-distutils_3.9.2-1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/python3-stdlib-extensions/python3-lib2to3_3.9.2-1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/python3.9/libpython3.9-minimal_3.9.2-1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/python3.9/libpython3.9-stdlib_3.9.2-1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/python3.9/python3.9-minimal_3.9.2-1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/python3.9/python3.9_3.9.2-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/libqt6concurrent6_6.4.2+dfsg-10~bpo11+1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/libqt6core6_6.4.2+dfsg-10~bpo11+1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/libqt6dbus6_6.4.2+dfsg-10~bpo11+1_mips64el.deb @@ -382,8 +540,11 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/libqt6test6_6.4.2+dfsg-10~bpo11+1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/libqt6widgets6_6.4.2+dfsg-10~bpo11+1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/libqt6xml6_6.4.2+dfsg-10~bpo11+1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/qmake6-bin_6.4.2+dfsg-10~bpo11+1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/qmake6_6.4.2+dfsg-10~bpo11+1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/qt6-base-dev-tools_6.4.2+dfsg-10~bpo11+1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/qt6-base-dev_6.4.2+dfsg-10~bpo11+1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/qt6-qpa-plugins_6.4.2+dfsg-10~bpo11+1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/libqt5concurrent5_5.15.2+dfsg-9_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/libqt5core5a_5.15.2+dfsg-9_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/libqt5dbus5_5.15.2+dfsg-9_mips64el.deb @@ -394,12 +555,21 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/libqt5test5_5.15.2+dfsg-9_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/libqt5widgets5_5.15.2+dfsg-9_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/libqt5xml5_5.15.2+dfsg-9_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/qt5-qmake-bin_5.15.2+dfsg-9_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/qt5-qmake_5.15.2+dfsg-9_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/qtbase5-dev-tools_5.15.2+dfsg-9_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/qtbase5-dev_5.15.2+dfsg-9_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtchooser/qtchooser_66-2_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/r/re2/libre2-9_20210201+dfsg-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/r/re2/libre2-dev_20210201+dfsg-1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/r/readline/libreadline8_8.1-1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/r/readline/readline-common_8.1-1_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/r/rtmpdump/librtmp1_2.4+20151223.gitfa8646d.1-2+b2_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/r/rust-rav1e/librav1e0_0.5.1-6_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/sensible-utils/sensible-utils_0.0.14_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/setuptools/python3-pkg-resources_66.1.1-1~bpo11+1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/shadow/login_4.8.1-1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/shadow/passwd_4.8.1-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/shared-mime-info/shared-mime-info_2.0-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/shine/libshine3_3.1.1-2_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/snappy/libsnappy-dev_1.1.8-1_mips64el.deb @@ -408,12 +578,18 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/speech-dispatcher/libspeechd2_0.11.4-2~bpo11+1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/speex/libspeex1_1.2~rc1.2-1.1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/sqlite3/libsqlite3-0_3.34.1-3_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/srt/libsrt1.4-gnutls_1.4.2-1.3_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/srt/libsrt1.5-gnutls_1.5.1-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/svt-av1/libsvtav1enc1_1.4.1+dfsg-1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/systemd/libpam-systemd_252.5-2~bpo11+1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/systemd/libsystemd-dev_252.5-2~bpo11+1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/systemd/libsystemd-shared_252.5-2~bpo11+1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/systemd/libsystemd0_252.5-2~bpo11+1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/systemd/libudev-dev_252.5-2~bpo11+1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/systemd/libudev1_252.5-2~bpo11+1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/systemd/systemd-sysv_252.5-2~bpo11+1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/systemd/systemd_252.5-2~bpo11+1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/t/tar/tar_1.34+dfsg-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/t/tcp-wrappers/libwrap0_7.6.q-31_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/t/tiff/libtiff-dev_4.2.0-1+deb11u4_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/t/tiff/libtiff5_4.2.0-1+deb11u4_mips64el.deb @@ -421,12 +597,17 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/t/tiff/libtiffxx5_4.2.0-1+deb11u4_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/t/tslib/libts0_1.22-1+b1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/t/twolame/libtwolame0_0.4.0-2_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/t/tzdata/tzdata_2021a-1+deb11u9_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/ucf/ucf_3.0043_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/unbound/libunbound8_1.17.1-2~bpo11+1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/libblkid-dev_2.36.1-8+deb11u1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/libblkid1_2.36.1-8+deb11u1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/libfdisk1_2.36.1-8+deb11u1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/libmount-dev_2.36.1-8+deb11u1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/libmount1_2.36.1-8+deb11u1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/libuuid1_2.36.1-8+deb11u1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/mount_2.36.1-8+deb11u1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/util-linux_2.36.1-8+deb11u1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/uuid-dev_2.36.1-8+deb11u1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/v/valgrind/valgrind_3.16.1-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/v/vulkan-loader/libvulkan-dev_1.3.224.0-1~bpo11+1_mips64el.deb @@ -440,6 +621,7 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/w/wayland/libwayland-egl-backend-dev_1.18.0-2~exp1.1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/w/wayland/libwayland-egl1_1.18.0-2~exp1.1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/w/wayland/libwayland-server0_1.18.0-2~exp1.1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/w/webrtc-audio-processing/libwebrtc-audio-processing1_0.3-1+b1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/x264/libx264-160_0.160.3011+gitcde9a93-2.1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/x264/libx264-164_0.164.3095+gitbaee400-3_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/x265/libx265-192_3.4-2_mips64el.deb @@ -454,10 +636,27 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xcb-util/libxcb-util1_0.4.0-1+b1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xft/libxft-dev_2.3.2-2_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xft/libxft2_2.3.2-2_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xkeyboard-config/xkb-data_2.29-2_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xorg-sgml-doctools/xorg-sgml-doctools_1.11-1.1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xorg/x11-common_7.7+22_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xorgproto/x11proto-core-dev_2020.1-1_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xorgproto/x11proto-dev_2020.1-1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xorgproto/x11proto-input-dev_2020.1-1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xorgproto/x11proto-randr-dev_2020.1-1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xorgproto/x11proto-record-dev_2020.1-1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xorgproto/x11proto-render-dev_2020.1-1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xorgproto/x11proto-scrnsaver-dev_2020.1-1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xorgproto/x11proto-xext-dev_2020.1-1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xorgproto/x11proto-xf86vidmode-dev_2020.1-1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xorgproto/x11proto-xinerama-dev_2020.1-1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xtrans/xtrans-dev_1.4.0-1_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xvidcore/libxvidcore4_1.3.7-1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xz-utils/liblzma-dev_5.2.5-2.1~deb11u1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xz-utils/liblzma5_5.2.5-2.1~deb11u1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xz-utils/xz-utils_5.2.5-2.1~deb11u1_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/z/z3/libz3-4_4.8.10-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/z/zeromq3/libzmq5_4.3.4-1_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/z/zlib/zlib1g-dev_1.2.11.dfsg-2+deb11u2_mips64el.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/z/zlib/zlib1g_1.2.11.dfsg-2+deb11u2_mips64el.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/z/zvbi/libzvbi-common_0.2.35-18_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/z/zvbi/libzvbi0_0.2.35-18_mips64el.deb
diff --git a/build/linux/sysroot_scripts/generated_package_lists/bullseye.mipsel b/build/linux/sysroot_scripts/generated_package_lists/bullseye.mipsel index 521dd52..6180a771 100644 --- a/build/linux/sysroot_scripts/generated_package_lists/bullseye.mipsel +++ b/build/linux/sysroot_scripts/generated_package_lists/bullseye.mipsel
@@ -1,21 +1,40 @@ +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/acl/libacl1_2.2.53-10_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/adduser/adduser_3.118_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/adwaita-icon-theme/adwaita-icon-theme_3.38.0-1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/alsa-lib/libasound2-data_1.2.4-1.1_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/alsa-lib/libasound2-dev_1.2.4-1.1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/alsa-lib/libasound2_1.2.4-1.1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/aom/libaom0_1.0.0.errata1-3_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/aom/libaom3_3.6.0-1~bpo11+1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/apparmor/libapparmor1_2.13.6-10_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/argon2/libargon2-1_0~20171227-0.2_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/at-spi2-atk/libatk-bridge2.0-0_2.38.0-4~bpo11+1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/at-spi2-atk/libatk-bridge2.0-dev_2.38.0-4~bpo11+1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/at-spi2-core/gir1.2-atspi-2.0_2.44.1-1~bpo11+1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/at-spi2-core/libatspi2.0-0_2.44.1-1~bpo11+1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/at-spi2-core/libatspi2.0-dev_2.44.1-1~bpo11+1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/atk1.0/gir1.2-atk-1.0_2.38.0-1~bpo11+1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/atk1.0/libatk1.0-0_2.38.0-1~bpo11+1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/atk1.0/libatk1.0-data_2.38.0-1~bpo11+1_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/atk1.0/libatk1.0-dev_2.38.0-1~bpo11+1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/attr/libattr1_2.4.48-6_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/audit/libaudit-common_3.0-2_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/audit/libaudit1_3.0-2_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/avahi/libavahi-client3_0.8-5+deb11u2_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/avahi/libavahi-common-data_0.8-5+deb11u2_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/a/avahi/libavahi-common3_0.8-5+deb11u2_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/binutils/binutils-common_2.35.2-2_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/binutils/binutils-mipsel-linux-gnu_2.35.2-2_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/binutils/binutils_2.35.2-2_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/binutils/libbinutils_2.35.2-2_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/binutils/libctf-nobfd0_2.35.2-2_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/binutils/libctf0_2.35.2-2_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/bluez/libbluetooth-dev_5.55-3.1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/bluez/libbluetooth3_5.55-3.1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/brotli/libbrotli-dev_1.0.9-2+b2_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/brotli/libbrotli1_1.0.9-2+b2_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/build-essential/build-essential_12.9_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/bzip2/bzip2_1.0.8-4_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/b/bzip2/libbz2-1.0_1.0.8-4_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cairo/libcairo-gobject2_1.16.0-5_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cairo/libcairo-script-interpreter2_1.16.0-5_mipsel.deb @@ -26,6 +45,8 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/codec2/libcodec2-0.9_0.9.2-4_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/codec2/libcodec2-1.0_1.0.5-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/colord/libcolord2_1.4.5-3_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/coreutils/coreutils_8.32-4_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cryptsetup/libcryptsetup12_2.3.7-1+deb11u1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cups/libcups2-dev_2.3.3op2-3+deb11u2_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cups/libcups2_2.3.3op2-3+deb11u2_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cups/libcupsimage2-dev_2.3.3op2-3+deb11u2_mipsel.deb @@ -33,13 +54,27 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/curl/libcurl3-gnutls_7.88.1-7~bpo11+2_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/curl/libcurl4-gnutls-dev_7.88.1-7~bpo11+2_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cyrus-sasl2/libsasl2-2_2.1.27+dfsg-2.1+deb11u1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/c/cyrus-sasl2/libsasl2-modules-db_2.1.27+dfsg-2.1+deb11u1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/dav1d/libdav1d4_0.7.1-3_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/dav1d/libdav1d6_1.0.0-2_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/db5.3/libdb5.3_5.3.28+dfsg1-0.8_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/dbus-glib/libdbus-glib-1-2_0.110-6_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/dbus/dbus-bin_1.14.6-1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/dbus/dbus-daemon_1.14.6-1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/dbus/dbus-session-bus-common_1.14.6-1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/dbus/dbus-system-bus-common_1.14.6-1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/dbus/dbus-user-session_1.14.6-1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/dbus/dbus_1.14.6-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/dbus/libdbus-1-3_1.12.24-0+deb11u1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/dbus/libdbus-1-dev_1.12.24-0+deb11u1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/dconf/dconf-gsettings-backend_0.38.0-2_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/dconf/dconf-service_0.38.0-2_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/dconf/libdconf1_0.38.0-2_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/debconf/debconf_1.5.77_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/double-conversion/libdouble-conversion3_3.1.5-6.1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/dpkg/dpkg-dev_1.20.12_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/dpkg/dpkg_1.20.12_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/d/dpkg/libdpkg-perl_1.20.12_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/e/e2fsprogs/comerr-dev_2.1-1.46.6-1~bpo11+1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/e/e2fsprogs/libcom-err2_1.46.6-1~bpo11+1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/e/elfutils/libelf-dev_0.187-1~bpo11+1_mipsel.deb @@ -50,6 +85,7 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/ffmpeg/libavcodec58_4.3.5-0+deb11u1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/ffmpeg/libavcodec59_5.1.3-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/ffmpeg/libavformat-dev_4.3.5-0+deb11u1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/ffmpeg/libavformat58_4.3.5-0+deb11u1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/ffmpeg/libavformat59_5.1.3-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/ffmpeg/libavutil-dev_4.3.5-0+deb11u1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/ffmpeg/libavutil56_4.3.5-0+deb11u1_mipsel.deb @@ -59,52 +95,106 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/ffmpeg/libswresample4_5.1.3-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/flac/libflac-dev_1.3.3-2+deb11u1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/flac/libflac8_1.3.3-2+deb11u1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/fontconfig/fontconfig-config_2.13.1-4.2_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/fontconfig/fontconfig_2.13.1-4.2_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/fontconfig/libfontconfig-dev_2.13.1-4.2_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/fontconfig/libfontconfig1-dev_2.13.1-4.2_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/fontconfig/libfontconfig1_2.13.1-4.2_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/fonts-dejavu/fonts-dejavu-core_2.37-2_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/freetype/libfreetype-dev_2.10.4+dfsg-1+deb11u1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/freetype/libfreetype6-dev_2.10.4+dfsg-1+deb11u1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/freetype/libfreetype6_2.10.4+dfsg-1+deb11u1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/fribidi/libfribidi-dev_1.0.8-2+deb11u1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/f/fribidi/libfribidi0_1.0.8-2+deb11u1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/game-music-emu/libgme0_0.6.3-2_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-10/cpp-10_10.2.1-6_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-10/g++-10_10.2.1-6_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-10/gcc-10-base_10.2.1-6_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-10/gcc-10_10.2.1-6_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-10/libatomic1_10.2.1-6_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-10/libcc1-0_10.2.1-6_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-10/libgcc-10-dev_10.2.1-6_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-10/libgcc-s1_10.2.1-6_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-10/libgomp1_10.2.1-6_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-10/libstdc++-10-dev_10.2.1-6_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-10/libstdc++6_10.2.1-6_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-defaults/cpp_10.2.1-1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-defaults/g++_10.2.1-1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gcc-defaults/gcc_10.2.1-1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gdbm/libgdbm-compat4_1.19-2_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gdbm/libgdbm6_1.19-2_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gdk-pixbuf-xlib/libgdk-pixbuf-xlib-2.0-0_2.40.2-2_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gdk-pixbuf-xlib/libgdk-pixbuf2.0-0_2.40.2-2_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gdk-pixbuf/gir1.2-gdkpixbuf-2.0_2.42.2+dfsg-1+deb11u1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gdk-pixbuf/libgdk-pixbuf-2.0-0_2.42.2+dfsg-1+deb11u1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gdk-pixbuf/libgdk-pixbuf-2.0-dev_2.42.2+dfsg-1+deb11u1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gdk-pixbuf/libgdk-pixbuf2.0-bin_2.42.2+dfsg-1+deb11u1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gdk-pixbuf/libgdk-pixbuf2.0-common_2.42.2+dfsg-1+deb11u1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glib-networking/glib-networking-common_2.66.0-2_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glib-networking/glib-networking-services_2.66.0-2_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glib-networking/glib-networking_2.66.0-2_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glib2.0/libglib2.0-0_2.66.8-1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glib2.0/libglib2.0-bin_2.66.8-1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glib2.0/libglib2.0-data_2.66.8-1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glib2.0/libglib2.0-dev-bin_2.66.8-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glib2.0/libglib2.0-dev_2.66.8-1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glibc/libc-dev-bin_2.31-13+deb11u5_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glibc/libc6-dev_2.31-13+deb11u5_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glibc/libc6-dev_2.31-13+deb11u6_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/glibc/libc6_2.31-13+deb11u5_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gmp/libgmp-dev_6.2.1+dfsg-1+deb11u1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gmp/libgmp10_6.2.1+dfsg-1+deb11u1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gmp/libgmpxx4ldbl_6.2.1+dfsg-1+deb11u1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gnutls28/libgnutls-dane0_3.7.1-5+deb11u3_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gnutls28/libgnutls-openssl27_3.7.1-5+deb11u3_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gnutls28/libgnutls28-dev_3.7.1-5+deb11u3_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gnutls28/libgnutls30_3.7.1-5+deb11u3_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gnutls28/libgnutlsxx28_3.7.1-5+deb11u3_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gobject-introspection/gir1.2-freedesktop_1.66.1-1+b1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gobject-introspection/gir1.2-glib-2.0_1.66.1-1+b1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gobject-introspection/gobject-introspection_1.66.1-1+b1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gobject-introspection/libgirepository-1.0-1_1.66.1-1+b1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gobject-introspection/libgirepository1.0-dev_1.66.1-1+b1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/graphene/gir1.2-graphene-1.0_1.10.4+dfsg1-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/graphene/libgraphene-1.0-0_1.10.4+dfsg1-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/graphene/libgraphene-1.0-dev_1.10.4+dfsg1-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/graphite2/libgraphite2-3_1.3.14-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/graphite2/libgraphite2-dev_1.3.14-1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gsettings-desktop-schemas/gsettings-desktop-schemas_3.38.0-2_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gtk+2.0/gir1.2-gtk-2.0_2.24.33-2_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gtk+2.0/libgtk2.0-0_2.24.33-2_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gtk+2.0/libgtk2.0-common_2.24.33-2_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gtk+2.0/libgtk2.0-dev_2.24.33-2_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gtk+3.0/gir1.2-gtk-3.0_3.24.24-4+deb11u3_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gtk+3.0/gtk-update-icon-cache_3.24.24-4+deb11u3_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gtk+3.0/libgtk-3-0_3.24.24-4+deb11u3_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gtk+3.0/libgtk-3-common_3.24.24-4+deb11u3_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gtk+3.0/libgtk-3-dev_3.24.24-4+deb11u3_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gtk4/gir1.2-gtk-4.0_4.8.3+ds-2_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gtk4/libgtk-4-1_4.8.3+ds-2_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gtk4/libgtk-4-common_4.8.3+ds-2_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/g/gtk4/libgtk-4-dev_4.8.3+ds-2_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/h/harfbuzz/gir1.2-harfbuzz-0.0_2.7.4-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/h/harfbuzz/libharfbuzz-dev_2.7.4-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/h/harfbuzz/libharfbuzz-gobject0_2.7.4-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/h/harfbuzz/libharfbuzz-icu0_2.7.4-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/h/harfbuzz/libharfbuzz0b_2.7.4-1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/h/hicolor-icon-theme/hicolor-icon-theme_0.17-2_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/h/highway/libhwy1_1.0.3-3_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/i/icu-le-hb/libicu-le-hb0_1.0.3+git180724-3+b2_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/i/icu/icu-devtools_67.1-7_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/i/icu/libicu-dev_67.1-7_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/i/icu/libicu67_67.1-7_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/i/iptables/libip4tc2_1.8.7-1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/i/isl/libisl23_0.23-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/j/jbigkit/libjbig-dev_2.1-3.1+b2_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/j/jbigkit/libjbig0_2.1-3.1+b2_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/j/jpeg-xl/libjxl0.7_0.7.0-10_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/j/json-c/libjson-c5_0.15-2_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/j/json-glib/libjson-glib-1.0-0_1.6.2-1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/j/json-glib/libjson-glib-1.0-common_1.6.2-1_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/k/keyutils/libkeyutils1_1.6.1-2_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/k/kmod/libkmod2_28-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/k/krb5/krb5-multidev_1.18.3-6+deb11u3_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/k/krb5/libgssapi-krb5-2_1.18.3-6+deb11u3_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/k/krb5/libgssrpc4_1.18.3-6+deb11u3_mipsel.deb @@ -119,6 +209,12 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lcms2/liblcms2-2_2.12~rc1-2_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lerc/liblerc4_4.0.0+ds-2_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/linux/linux-libc-dev_6.1.12-1~bpo11+1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/llvm-toolchain-11/libllvm11_11.0.1-2_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lm-sensors/libsensors-config_3.6.0-7_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lm-sensors/libsensors5_3.6.0-7_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lsb/lsb-base_11.1.0_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lvm2/dmsetup_1.02.175-2.1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lvm2/libdevmapper1.02.1_1.02.175-2.1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lz4/liblz4-1_1.9.3-2_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/l/lzo2/liblzo2-2_2.10-2_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/liba/libasyncns/libasyncns0_0.8-6+b2_mipsel.deb @@ -131,6 +227,7 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libc/libcloudproviders/libcloudproviders0_0.3.0-3_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdatrie/libdatrie-dev_0.2.13-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdatrie/libdatrie1_0.2.13-1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdbusmenu/gir1.2-dbusmenu-glib-0.4_18.10.20180917~bzr492+repack1-2_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdbusmenu/libdbusmenu-glib-dev_18.10.20180917~bzr492+repack1-2_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdbusmenu/libdbusmenu-glib4_18.10.20180917~bzr492+repack1-2_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdbusmenu/libdbusmenu-gtk3-4_18.10.20180917~bzr492+repack1-2_mipsel.deb @@ -138,10 +235,12 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdeflate/libdeflate-dev_1.10-2~bpo11+1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdeflate/libdeflate0_1.10-2~bpo11+1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdrm/libdrm-amdgpu1_2.4.104-1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdrm/libdrm-common_2.4.104-1_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdrm/libdrm-dev_2.4.104-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdrm/libdrm-nouveau2_2.4.104-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdrm/libdrm-radeon1_2.4.104-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libd/libdrm/libdrm2_2.4.104-1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libe/libedit/libedit2_3.1-20191231-2+b1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libe/libepoxy/libepoxy-dev_1.5.8-1~bpo11+1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libe/libepoxy/libepoxy0_1.5.8-1~bpo11+1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libe/libevdev/libevdev-dev_1.11.0+dfsg-1_mipsel.deb @@ -151,6 +250,8 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libf/libffi/libffi7_3.3-6_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libgcrypt20/libgcrypt20-dev_1.8.7-6_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libgcrypt20/libgcrypt20_1.8.7-6_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglu/libglu1-mesa-dev_9.0.1-1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglu/libglu1-mesa_9.0.1-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libegl-dev_1.3.2-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libegl1_1.3.2-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libgl-dev_1.3.2-1_mipsel.deb @@ -162,22 +263,30 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libglvnd0_1.3.2-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libglx-dev_1.3.2-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libglx0_1.3.2-1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libopengl-dev_1.3.2-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libglvnd/libopengl0_1.3.2-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libgpg-error/libgpg-error-dev_1.38-2_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libgpg-error/libgpg-error0_1.38-2_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libgsm/libgsm1_1.0.18-2_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libgudev/gir1.2-gudev-1.0_234-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libgudev/libgudev-1.0-0_234-1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libg/libgudev/libgudev-1.0-dev_234-1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libice/libice-dev_1.0.10-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libice/libice6_1.0.10-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libidl/libidl-2-0_0.8.14-4+b12_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libidn/libidn11_1.33-3_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libidn2/libidn2-0_2.3.0-5_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libidn2/libidn2-dev_2.3.0-5_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libinput/libinput-bin_1.16.4-3_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libinput/libinput-dev_1.16.4-3_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libi/libinput/libinput10_1.16.4-3_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libj/libjpeg-turbo/libjpeg-dev_2.0.6-4_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libj/libjpeg-turbo/libjpeg62-turbo-dev_2.0.6-4_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libj/libjpeg-turbo/libjpeg62-turbo_2.0.6-4_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libj/libjsoncpp/libjsoncpp-dev_1.9.4-4_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libj/libjsoncpp/libjsoncpp24_1.9.4-4_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libm/libmd/libmd0_1.0.3-3_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libn/libnsl/libnsl-dev_1.3.0-2_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libn/libnsl/libnsl2_1.3.0-2_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libn/libnss-db/libnss-db_2.2.3pre1-6+b10_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libo/libogg/libogg-dev_1.3.4-0.1_mipsel.deb @@ -194,10 +303,15 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libr/librest/librest-0.7-0_0.8.1-1.1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libr/librist/librist4_0.2.7+dfsg-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libr/librsvg/librsvg2-2_2.50.3+dfsg-1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libseccomp/libseccomp2_2.5.1-1+deb11u1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libselinux/libselinux1-dev_3.1-3_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libselinux/libselinux1_3.1-3_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsemanage/libsemanage-common_3.1-1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsemanage/libsemanage1_3.1-1+b2_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsepol/libsepol1-dev_3.1-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsepol/libsepol1_3.1-1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libset-scalar-perl/libset-scalar-perl_1.29-2_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsm/libsm-dev_1.2.3-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsm/libsm6_1.2.3-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsndfile/libsndfile1_1.0.31-2_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsodium/libsodium23_1.0.18-1_mipsel.deb @@ -206,10 +320,14 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libsoxr/libsoxr0_0.1.3-4_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libssh/libssh-gcrypt-4_0.9.5-1+deb11u1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libs/libssh2/libssh2-1_1.9.0-2_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libt/libtasn1-6/libtasn1-6-dev_4.16.0-2+deb11u1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libt/libtasn1-6/libtasn1-6_4.16.0-2+deb11u1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libt/libthai/libthai-data_0.1.28-3_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libt/libthai/libthai-dev_0.1.28-3_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libt/libthai/libthai0_0.1.28-3_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libt/libtheora/libtheora0_1.1.1+dfsg.1-15_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libt/libtirpc/libtirpc-common_1.3.1-1+deb11u1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libt/libtirpc/libtirpc-dev_1.3.1-1+deb11u1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libt/libtirpc/libtirpc3_1.3.1-1+deb11u1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libt/libtool/libltdl7_2.4.6-15_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libu/libudfread/libudfread0_1.1.1-1_mipsel.deb @@ -229,6 +347,8 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libv/libvpx/libvpx-dev_1.9.0-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libv/libvpx/libvpx6_1.9.0-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libv/libvpx/libvpx7_1.12.0-1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libw/libwacom/libwacom-common_1.8-2_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libw/libwacom/libwacom-dev_1.8-2_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libw/libwacom/libwacom2_1.8-2_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libw/libwebp/libwebp-dev_0.6.1-2.1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libw/libwebp/libwebp6_0.6.1-2.1_mipsel.deb @@ -236,6 +356,7 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libw/libwebp/libwebpdemux2_0.6.1-2.1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libw/libwebp/libwebpmux3_0.6.1-2.1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libx11/libx11-6_1.7.2-1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libx11/libx11-data_1.7.2-1_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libx11/libx11-dev_1.7.2-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libx11/libx11-xcb-dev_1.7.2-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libx11/libx11-xcb1_1.7.2-1_mipsel.deb @@ -288,6 +409,7 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxkbcommon/libxkbcommon-x11-0_1.0.3-2_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxkbcommon/libxkbcommon0_1.0.3-2_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxml2/libxml2-dev_2.9.10+dfsg-6.7+deb11u4_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxml2/libxml2-utils_2.9.10+dfsg-6.7+deb11u4_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxml2/libxml2_2.9.10+dfsg-6.7+deb11u4_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxrandr/libxrandr-dev_1.5.1-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxrandr/libxrandr2_1.5.1-1_mipsel.deb @@ -306,27 +428,40 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxxf86vm/libxxf86vm-dev_1.1.4-1+b2_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libx/libxxf86vm/libxxf86vm1_1.1.4-1+b2_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/libz/libzstd/libzstd1_1.4.8+dfsg-2.1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/make-dfsg/make_4.3-4.1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mako/python3-mako_1.1.3+ds1-2_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/markupsafe/python3-markupsafe_2.0.1-2~bpo11+1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mbedtls/libmbedcrypto7_2.28.3-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/md4c/libmd4c0_0.4.7-2_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/media-types/media-types_4.0.0_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libegl-mesa0_20.3.5-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libegl1-mesa-dev_20.3.5-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libegl1-mesa_20.3.5-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libgbm-dev_20.3.5-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libgbm1_20.3.5-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libgl1-mesa-dev_20.3.5-1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libgl1-mesa-dri_20.3.5-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libgl1-mesa-glx_20.3.5-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libglapi-mesa_20.3.5-1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libglx-mesa0_20.3.5-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/libwayland-egl1-mesa_20.3.5-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mesa/mesa-common-dev_20.3.5-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/minizip/libminizip-dev_1.1-8+b1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/minizip/libminizip1_1.1-8+b1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mpclib3/libmpc3_1.2.0-1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mpdecimal/libmpdec3_2.5.1-1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mpfr4/libmpfr6_4.1.0-3_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mpg123/libmpg123-0_1.26.4-1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mtdev/libmtdev-dev_1.1.6-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/m/mtdev/libmtdev1_1.1.6-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/ncurses/libncurses-dev_6.2+20201114-2+deb11u1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/ncurses/libncurses6_6.2+20201114-2+deb11u1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/ncurses/libncursesw6_6.2+20201114-2+deb11u1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/ncurses/libtinfo6_6.2+20201114-2+deb11u1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/ncurses/ncurses-bin_6.2+20201114-2+deb11u1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/nettle/libhogweed6_3.7.3-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/nettle/libnettle8_3.7.3-1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/nettle/nettle-dev_3.7.3-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/nghttp2/libnghttp2-14_1.43.0-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/norm/libnorm1_1.5.9+dfsg-2_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/n/nspr/libnspr4-dev_4.29-1_mipsel.deb @@ -341,15 +476,22 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/o/openssl/libssl1.1_1.1.1n-0+deb11u4_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/o/opus/libopus-dev_1.3.1-0.1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/o/opus/libopus0_1.3.1-0.1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/p11-kit/libp11-kit-dev_0.23.22-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/p11-kit/libp11-kit0_0.23.22-1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pam/libpam-modules_1.4.0-9+deb11u1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pam/libpam-runtime_1.4.0-9+deb11u1_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pam/libpam0g-dev_1.4.0-9+deb11u1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pam/libpam0g_1.4.0-9+deb11u1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pango1.0/gir1.2-pango-1.0_1.46.2-3_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pango1.0/libpango-1.0-0_1.46.2-3_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pango1.0/libpango1.0-dev_1.46.2-3_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pango1.0/libpangocairo-1.0-0_1.46.2-3_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pango1.0/libpangoft2-1.0-0_1.46.2-3_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pango1.0/libpangoxft-1.0-0_1.46.2-3_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pango1.0/pango1.0-tools_1.46.2-3_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pangox-compat/libpangox-1.0-0_0.0.2-5.1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/patch/patch_2.7.6-7_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pci.ids/pci.ids_0.0~2021.02.08-1_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pciutils/libpci-dev_3.7.0-5_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pciutils/libpci3_3.7.0-5_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pcre2/libpcre2-16-0_10.36-2+deb11u1_mipsel.deb @@ -362,14 +504,29 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pcre3/libpcre32-3_8.39-13_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pcre3/libpcre3_8.39-13_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pcre3/libpcrecpp0v5_8.39-13_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/perl/libperl5.32_5.32.1-4+deb11u2_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/perl/perl-base_5.32.1-4+deb11u2_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/perl/perl-modules-5.32_5.32.1-4+deb11u2_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/perl/perl_5.32.1-4+deb11u2_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pipewire/libpipewire-0.3-0_0.3.65-2~bpo11+1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pipewire/libpipewire-0.3-dev_0.3.65-2~bpo11+1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pipewire/libspa-0.2-dev_0.3.65-2~bpo11+1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pipewire/libspa-0.2-modules_0.3.65-2~bpo11+1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pixman/libpixman-1-0_0.40.0-1.1~deb11u1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pixman/libpixman-1-dev_0.40.0-1.1~deb11u1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pkg-config/pkg-config_0.29.2-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pulseaudio/libpulse-dev_14.2-2_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pulseaudio/libpulse-mainloop-glib0_14.2-2_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/pulseaudio/libpulse0_14.2-2_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/python-markdown/python3-markdown_3.3.4-1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/python3-defaults/libpython3-stdlib_3.9.2-3_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/python3-defaults/python3_3.9.2-3_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/python3-stdlib-extensions/python3-distutils_3.9.2-1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/python3-stdlib-extensions/python3-lib2to3_3.9.2-1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/python3.9/libpython3.9-minimal_3.9.2-1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/python3.9/libpython3.9-stdlib_3.9.2-1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/python3.9/python3.9-minimal_3.9.2-1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/p/python3.9/python3.9_3.9.2-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/libqt6concurrent6_6.4.2+dfsg-10~bpo11+1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/libqt6core6_6.4.2+dfsg-10~bpo11+1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/libqt6dbus6_6.4.2+dfsg-10~bpo11+1_mipsel.deb @@ -382,8 +539,11 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/libqt6test6_6.4.2+dfsg-10~bpo11+1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/libqt6widgets6_6.4.2+dfsg-10~bpo11+1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/libqt6xml6_6.4.2+dfsg-10~bpo11+1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/qmake6-bin_6.4.2+dfsg-10~bpo11+1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/qmake6_6.4.2+dfsg-10~bpo11+1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/qt6-base-dev-tools_6.4.2+dfsg-10~bpo11+1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/qt6-base-dev_6.4.2+dfsg-10~bpo11+1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qt6-base/qt6-qpa-plugins_6.4.2+dfsg-10~bpo11+1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/libqt5concurrent5_5.15.2+dfsg-9_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/libqt5core5a_5.15.2+dfsg-9_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/libqt5dbus5_5.15.2+dfsg-9_mipsel.deb @@ -394,12 +554,21 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/libqt5test5_5.15.2+dfsg-9_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/libqt5widgets5_5.15.2+dfsg-9_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/libqt5xml5_5.15.2+dfsg-9_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/qt5-qmake-bin_5.15.2+dfsg-9_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/qt5-qmake_5.15.2+dfsg-9_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/qtbase5-dev-tools_5.15.2+dfsg-9_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtbase-opensource-src/qtbase5-dev_5.15.2+dfsg-9_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/q/qtchooser/qtchooser_66-2_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/r/re2/libre2-9_20210201+dfsg-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/r/re2/libre2-dev_20210201+dfsg-1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/r/readline/libreadline8_8.1-1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/r/readline/readline-common_8.1-1_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/r/rtmpdump/librtmp1_2.4+20151223.gitfa8646d.1-2+b2_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/r/rust-rav1e/librav1e0_0.5.1-6_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/sensible-utils/sensible-utils_0.0.14_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/setuptools/python3-pkg-resources_66.1.1-1~bpo11+1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/shadow/login_4.8.1-1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/shadow/passwd_4.8.1-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/shared-mime-info/shared-mime-info_2.0-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/shine/libshine3_3.1.1-2_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/snappy/libsnappy-dev_1.1.8-1_mipsel.deb @@ -408,12 +577,18 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/speech-dispatcher/libspeechd2_0.11.4-2~bpo11+1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/speex/libspeex1_1.2~rc1.2-1.1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/sqlite3/libsqlite3-0_3.34.1-3_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/srt/libsrt1.4-gnutls_1.4.2-1.3_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/srt/libsrt1.5-gnutls_1.5.1-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/svt-av1/libsvtav1enc1_1.4.1+dfsg-1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/systemd/libpam-systemd_252.5-2~bpo11+1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/systemd/libsystemd-dev_252.5-2~bpo11+1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/systemd/libsystemd-shared_252.5-2~bpo11+1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/systemd/libsystemd0_252.5-2~bpo11+1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/systemd/libudev-dev_252.5-2~bpo11+1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/systemd/libudev1_252.5-2~bpo11+1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/systemd/systemd-sysv_252.5-2~bpo11+1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/s/systemd/systemd_252.5-2~bpo11+1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/t/tar/tar_1.34+dfsg-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/t/tcp-wrappers/libwrap0_7.6.q-31_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/t/tiff/libtiff-dev_4.2.0-1+deb11u4_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/t/tiff/libtiff5_4.2.0-1+deb11u4_mipsel.deb @@ -421,12 +596,17 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/t/tiff/libtiffxx5_4.2.0-1+deb11u4_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/t/tslib/libts0_1.22-1+b1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/t/twolame/libtwolame0_0.4.0-2_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/t/tzdata/tzdata_2021a-1+deb11u9_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/ucf/ucf_3.0043_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/unbound/libunbound8_1.17.1-2~bpo11+1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/libblkid-dev_2.36.1-8+deb11u1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/libblkid1_2.36.1-8+deb11u1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/libfdisk1_2.36.1-8+deb11u1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/libmount-dev_2.36.1-8+deb11u1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/libmount1_2.36.1-8+deb11u1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/libuuid1_2.36.1-8+deb11u1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/mount_2.36.1-8+deb11u1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/util-linux_2.36.1-8+deb11u1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/u/util-linux/uuid-dev_2.36.1-8+deb11u1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/v/vulkan-loader/libvulkan-dev_1.3.224.0-1~bpo11+1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/v/vulkan-loader/libvulkan1_1.3.224.0-1~bpo11+1_mipsel.deb @@ -439,6 +619,7 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/w/wayland/libwayland-egl-backend-dev_1.18.0-2~exp1.1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/w/wayland/libwayland-egl1_1.18.0-2~exp1.1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/w/wayland/libwayland-server0_1.18.0-2~exp1.1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/w/webrtc-audio-processing/libwebrtc-audio-processing1_0.3-1+b1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/x264/libx264-160_0.160.3011+gitcde9a93-2.1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/x264/libx264-164_0.164.3095+gitbaee400-3_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/x265/libx265-192_3.4-2_mipsel.deb @@ -453,10 +634,27 @@ https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xcb-util/libxcb-util1_0.4.0-1+b1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xft/libxft-dev_2.3.2-2_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xft/libxft2_2.3.2-2_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xkeyboard-config/xkb-data_2.29-2_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xorg-sgml-doctools/xorg-sgml-doctools_1.11-1.1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xorg/x11-common_7.7+22_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xorgproto/x11proto-core-dev_2020.1-1_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xorgproto/x11proto-dev_2020.1-1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xorgproto/x11proto-input-dev_2020.1-1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xorgproto/x11proto-randr-dev_2020.1-1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xorgproto/x11proto-record-dev_2020.1-1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xorgproto/x11proto-render-dev_2020.1-1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xorgproto/x11proto-scrnsaver-dev_2020.1-1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xorgproto/x11proto-xext-dev_2020.1-1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xorgproto/x11proto-xf86vidmode-dev_2020.1-1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xorgproto/x11proto-xinerama-dev_2020.1-1_all.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xtrans/xtrans-dev_1.4.0-1_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xvidcore/libxvidcore4_1.3.7-1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xz-utils/liblzma-dev_5.2.5-2.1~deb11u1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xz-utils/liblzma5_5.2.5-2.1~deb11u1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/x/xz-utils/xz-utils_5.2.5-2.1~deb11u1_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/z/z3/libz3-4_4.8.10-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/z/zeromq3/libzmq5_4.3.4-1_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/z/zlib/zlib1g-dev_1.2.11.dfsg-2+deb11u2_mipsel.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/z/zlib/zlib1g_1.2.11.dfsg-2+deb11u2_mipsel.deb +https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/z/zvbi/libzvbi-common_0.2.35-18_all.deb https://snapshot.debian.org/archive/debian/20230611T210420Z/pool/main/z/zvbi/libzvbi0_0.2.35-18_mipsel.deb
diff --git a/build/linux/sysroot_scripts/sysroot_creator.py b/build/linux/sysroot_scripts/sysroot_creator.py index b490abbe..0b8b9ae 100755 --- a/build/linux/sysroot_scripts/sysroot_creator.py +++ b/build/linux/sysroot_scripts/sysroot_creator.py
@@ -743,11 +743,35 @@ def generate_package_list(arch: str) -> dict[str, str]: + # Workaround for some misconfigured package dependencies. + BROKEN_DEPS = { + "libgcc1", + "qt6-base-abi", + } + package_meta = {} for dist, repos in APT_SOURCES_LIST: for repo_name in repos: for meta in generate_package_list_dist_repo(arch, dist, repo_name): package_meta[meta["Package"]] = meta + if "Provides" not in meta: + continue + for provides in meta["Provides"].split(", "): + if provides in package_meta: + continue + package_meta[provides] = meta + + def add_package_dependencies(package: str) -> None: + if package in BROKEN_DEPS: + return + meta = package_meta[package] + url = ARCHIVE_URL + meta["Filename"] + if url in package_dict: + return + package_dict[url] = meta["SHA256"] + if "Depends" in meta: + for dep in meta["Depends"].split(", "): + add_package_dependencies(dep.split()[0].split(":")[0]) # Read the input file and create a dictionary mapping package names to URLs # and checksums. @@ -757,8 +781,7 @@ package = meta["Package"] if package in missing: missing.remove(package) - url = ARCHIVE_URL + meta["Filename"] - package_dict[url] = meta["SHA256"] + add_package_dependencies(package) if missing: raise Exception(f"Missing packages: {', '.join(missing)}") @@ -862,15 +885,17 @@ raise Exception( f"{message} {package_path}: {err.decode('utf-8')}") - # Prune /usr/share, leaving only pkgconfig, wayland, and wayland-protocols + # Prune /usr/share, leaving only allowlisted directories. + USR_SHARE_ALLOWLIST = { + "fontconfig", + "pkgconfig", + "wayland", + "wayland-protocols", + } usr_share = os.path.join(install_root, "usr", "share") for item in os.listdir(usr_share): full_path = os.path.join(usr_share, item) - if os.path.isdir(full_path) and item not in [ - "pkgconfig", - "wayland", - "wayland-protocols", - ]: + if os.path.isdir(full_path) and item not in USR_SHARE_ALLOWLIST: shutil.rmtree(full_path) @@ -897,9 +922,21 @@ full_path = os.path.join(root, name) if os.path.islink(full_path): target_path = os.readlink(full_path) + if target_path == "/dev/null": + # Don't relativize this link. + continue - # Check if the symlink is absolute and points inside the - # install_root. + # If the link's target does not exist, remove this broken link. + if os.path.isabs(target_path): + absolute_target = os.path.join(install_root, + target_path.strip("/")) + else: + absolute_target = os.path.join(os.path.dirname(full_path), + target_path) + if not os.path.exists(absolute_target): + os.remove(full_path) + continue + if os.path.isabs(target_path): # Compute the relative path from the symlink to the target. relative_path = os.path.relpath( @@ -916,39 +953,6 @@ os.symlink(relative_path, full_path) -def verify_library_deps(install_root: str) -> None: - """ - Verifies if all required libraries are present in the sysroot environment. - """ - # Get all shared libraries and their dependencies. - shared_libs = set() - needed_libs = set() - for root, _, files in os.walk(install_root): - for file in files: - if ".so" not in file: - continue - path = os.path.join(root, file) - islink = os.path.islink(path) - if islink: - path = os.path.join(root, os.readlink(path)) - cmd_file = ["file", path] - output = subprocess.check_output(cmd_file).decode() - if ": ELF" not in output or "shared object" not in output: - continue - shared_libs.add(file) - if islink: - continue - cmd_readelf = ["readelf", "-d", path] - output = subprocess.check_output(cmd_readelf).decode() - for line in output.split("\n"): - if "NEEDED" in line: - needed_libs.add(line.split("[")[1].split("]")[0]) - - missing_libs = needed_libs - shared_libs - if missing_libs: - raise Exception(f"Missing libraries: {missing_libs}") - - def strip_sections(install_root: str): """ Strips all sections from ELF files except for dynamic linking and @@ -1011,7 +1015,6 @@ install_into_sysroot(BUILD_DIR, install_root, packages) hacks_and_patches(install_root, SCRIPT_DIR, arch) cleanup_jail_symlinks(install_root) - verify_library_deps(install_root) strip_sections(install_root) create_tarball(install_root, arch)
diff --git a/cc/BUILD.gn b/cc/BUILD.gn index 9d6c8405..8a08fed6 100644 --- a/cc/BUILD.gn +++ b/cc/BUILD.gn
@@ -635,6 +635,7 @@ "test/test_client_shared_image_interface.h", "test/test_hooks.cc", "test/test_hooks.h", + "test/test_layer_context.h", "test/test_layer_tree_frame_sink.cc", "test/test_layer_tree_frame_sink.h", "test/test_layer_tree_host_base.cc",
diff --git a/cc/test/test_layer_context.h b/cc/test/test_layer_context.h new file mode 100644 index 0000000..fa3fc7f --- /dev/null +++ b/cc/test/test_layer_context.h
@@ -0,0 +1,34 @@ +// 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 CC_TEST_TEST_LAYER_CONTEXT_H_ +#define CC_TEST_TEST_LAYER_CONTEXT_H_ + +#include "cc/cc_export.h" +#include "cc/trees/layer_context.h" + +namespace cc { + +class CC_EXPORT TestLayerContext : public LayerContext { + public: + TestLayerContext() = default; + ~TestLayerContext() override = default; + + void SetVisible(bool visible) override {} + + void UpdateDisplayTreeFrom( + LayerTreeImpl& tree, + viz::ClientResourceProvider& resource_provider, + viz::RasterContextProvider& context_provider) override {} + + void UpdateDisplayTile( + PictureLayerImpl& layer, + const Tile& tile, + viz::ClientResourceProvider& resource_provider, + viz::RasterContextProvider& context_provider) override {} +}; + +} // namespace cc + +#endif // CC_TEST_TEST_LAYER_CONTEXT_H_
diff --git a/cc/test/test_layer_tree_frame_sink.cc b/cc/test/test_layer_tree_frame_sink.cc index d878c33..12592d60 100644 --- a/cc/test/test_layer_tree_frame_sink.cc +++ b/cc/test/test_layer_tree_frame_sink.cc
@@ -13,6 +13,7 @@ #include "base/functional/bind.h" #include "base/task/single_thread_task_runner.h" #include "cc/test/test_client_shared_image_interface.h" +#include "cc/test/test_layer_context.h" #include "cc/trees/layer_tree_frame_sink_client.h" #include "cc/trees/single_thread_proxy.h" #include "cc/trees/task_runner_provider.h" @@ -215,6 +216,11 @@ test_client_->DisplayReceivedLocalSurfaceId(local_surface_id); } +std::unique_ptr<LayerContext> TestLayerTreeFrameSink::CreateLayerContext( + LayerTreeHostImpl& host_impl) { + return std::make_unique<TestLayerContext>(); +} + void TestLayerTreeFrameSink::SubmitCompositorFrame(viz::CompositorFrame frame, bool hit_test_data_changed) { DebugScopedSetImplThread impl(task_runner_provider_);
diff --git a/cc/test/test_layer_tree_frame_sink.h b/cc/test/test_layer_tree_frame_sink.h index 6cff357..3278439 100644 --- a/cc/test/test_layer_tree_frame_sink.h +++ b/cc/test/test_layer_tree_frame_sink.h
@@ -94,6 +94,8 @@ bool BindToClient(LayerTreeFrameSinkClient* client) override; void DetachFromClient() override; void SetLocalSurfaceId(const viz::LocalSurfaceId& local_surface_id) override; + std::unique_ptr<LayerContext> CreateLayerContext( + LayerTreeHostImpl& host_impl) override; void SubmitCompositorFrame(viz::CompositorFrame frame, bool hit_test_data_changed) override; void DidNotProduceFrame(const viz::BeginFrameAck& ack,
diff --git a/cc/trees/layer_tree_host_impl.cc b/cc/trees/layer_tree_host_impl.cc index 62f939a3..1075cca 100644 --- a/cc/trees/layer_tree_host_impl.cc +++ b/cc/trees/layer_tree_host_impl.cc
@@ -1331,6 +1331,13 @@ DCHECK(CanDraw()); DCHECK(!active_tree_->LayerListIsEmpty()); + if (use_layer_context_for_display_) { + TRACE_EVENT0( + "cc", + "LayerTreeHostImpl::CalculateRenderPasses::SkippedForLayerContext"); + return DrawResult::kSuccess; + } + // For now, we use damage tracking to compute a global scissor. To do this, we // must compute all damage tracking before drawing anything, so that we know // the root damage rect. The root damage rect is then used to scissor each @@ -1645,8 +1652,6 @@ } DrawResult LayerTreeHostImpl::PrepareToDraw(FrameData* frame) { - DCHECK(!use_layer_context_for_display_); - TRACE_EVENT1("cc", "LayerTreeHostImpl::PrepareToDraw", "SourceFrameNumber", active_tree_->source_frame_number()); if (input_delegate_) @@ -2771,9 +2776,12 @@ } std::optional<SubmitInfo> LayerTreeHostImpl::DrawLayers(FrameData* frame) { - DCHECK(!use_layer_context_for_display_); DCHECK(CanDraw()); - DCHECK_EQ(frame->has_no_damage, frame->render_passes.empty()); + if (!use_layer_context_for_display_) { + DCHECK_EQ(frame->has_no_damage, frame->render_passes.empty()); + } else { + DCHECK(frame->render_passes.empty()); + } ResetRequiresHighResToDraw(); if (frame->has_no_damage) { @@ -2849,7 +2857,8 @@ compositor_frame.render_pass_list); base::TimeTicks submit_time = base::TimeTicks::Now(); - { + + if (!use_layer_context_for_display_) { TRACE_EVENT( "viz,benchmark,graphics.pipeline", "Graphics.Pipeline", perfetto::Flow::Global(CurrentBeginFrameArgs().trace_id),
diff --git a/cc/trees/layer_tree_host_impl_unittest.cc b/cc/trees/layer_tree_host_impl_unittest.cc index 09bf835..21f806d 100644 --- a/cc/trees/layer_tree_host_impl_unittest.cc +++ b/cc/trees/layer_tree_host_impl_unittest.cc
@@ -237,7 +237,9 @@ void SetNeedsOneBeginImplFrameOnImplThread() override { did_request_next_frame_ = true; } - void SetNeedsUpdateDisplayTreeOnImplThread() override {} + void SetNeedsUpdateDisplayTreeOnImplThread() override { + did_request_redraw_ = true; + } void SetNeedsPrepareTilesOnImplThread() override { did_request_prepare_tiles_ = true; }
diff --git a/cc/trees/property_tree.cc b/cc/trees/property_tree.cc index 9d2bbf19..aee8ccd6 100644 --- a/cc/trees/property_tree.cc +++ b/cc/trees/property_tree.cc
@@ -527,7 +527,8 @@ ancestor_sticky_box_offset + ancestor_containing_block_offset + sticky_offset; - // return + sticky_offset += constraint.pixel_snap_offset; + return gfx::ToRoundedVector2d(sticky_offset); }
diff --git a/cc/trees/sticky_position_constraint.h b/cc/trees/sticky_position_constraint.h index 706a7f1..1104720 100644 --- a/cc/trees/sticky_position_constraint.h +++ b/cc/trees/sticky_position_constraint.h
@@ -46,6 +46,11 @@ // block boundary. gfx::RectF scroll_container_relative_containing_block_rect; + // Extra offset to account for pixel snapping of the sticky layout object. + // The above rects are sufficient to compute the un-snapped sticky offset + // but need to be adjusted by this for pixel snapping. + gfx::Vector2dF pixel_snap_offset; + // The nearest ancestor sticky element ids that affect the sticky box // constraint rect and the containing block constraint rect respectively. // They are used to generate nearest_node_shifting_sticky_box and
diff --git a/chrome/VERSION b/chrome/VERSION index f6c382d..0f47069 100644 --- a/chrome/VERSION +++ b/chrome/VERSION
@@ -1,4 +1,4 @@ MAJOR=134 MINOR=0 -BUILD=6949 +BUILD=6950 PATCH=0
diff --git a/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/AutofillKeyboardAccessoryViewBridge.java b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/AutofillKeyboardAccessoryViewBridge.java index bc26329..27eb74e 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/AutofillKeyboardAccessoryViewBridge.java +++ b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/AutofillKeyboardAccessoryViewBridge.java
@@ -163,6 +163,7 @@ * @param isDeletable Whether the item can be deleted by the user. * @param featureForIph The In-Product-Help feature used for displaying the bubble for the * suggestion. + * @param iphDescriptionText If set, it will be used as the help text for the IPH bubble. * @param customIconUrl The url used to fetch the custom icon to be displayed in the autofill * suggestion chip. * @return an AutofillSuggestion containing the above information.
diff --git a/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryIphUtils.java b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryIphUtils.java index 00fd67e..5f1ae95 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryIphUtils.java +++ b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryIphUtils.java
@@ -41,6 +41,10 @@ case FeatureConstants.KEYBOARD_ACCESSORY_PASSWORD_FILLING_FEATURE: tracker.notifyEvent(EventConstants.KEYBOARD_ACCESSORY_PASSWORD_AUTOFILLED); return; + case FeatureConstants.KEYBOARD_ACCESSORY_PAYMENT_CARD_INFO_RETRIEVAL_FEATURE: + tracker.notifyEvent( + EventConstants.KEYBOARD_ACCESSORY_PAYMENT_CARD_INFO_RETRIEVAL_AUTOFILLED); + return; case FeatureConstants.KEYBOARD_ACCESSORY_PAYMENT_FILLING_FEATURE: case FeatureConstants.KEYBOARD_ACCESSORY_PAYMENT_OFFER_FEATURE: case FeatureConstants.KEYBOARD_ACCESSORY_PAYMENT_VIRTUAL_CARD_DISABLED_FEATURE:
diff --git a/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryViewBinder.java b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryViewBinder.java index e8c16e6..672ff8a 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryViewBinder.java +++ b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryViewBinder.java
@@ -148,9 +148,13 @@ item.getSuggestion().getItemTag()); } } else if (item.getFeatureForIph() - .equals( - FeatureConstants - .KEYBOARD_ACCESSORY_PLUS_ADDRESS_CREATE_SUGGESTION)) { + .equals( + FeatureConstants + .KEYBOARD_ACCESSORY_PLUS_ADDRESS_CREATE_SUGGESTION) + || item.getFeatureForIph() + .equals( + FeatureConstants + .KEYBOARD_ACCESSORY_PAYMENT_CARD_INFO_RETRIEVAL_FEATURE)) { isIphShown = showHelpBubble( mKeyboardAccessory.getFeatureEngagementTracker(),
diff --git a/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryViewTest.java b/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryViewTest.java index 53474e2b..acfede85 100644 --- a/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryViewTest.java +++ b/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryViewTest.java
@@ -482,6 +482,47 @@ @Test @MediumTest + public void testDismissesCardInfoRetrievalBubbleOnFilling() throws InterruptedException { + String descriptionText = + "You can autofill this card because your PayPay account is linked to Google"; + AutofillBarItem itemWithIph = + new AutofillBarItem( + new AutofillSuggestion.Builder() + .setLabel("Card Info Retrieval") + .setSubLabel("") + .setItemTag("") + .setSuggestionType(SuggestionType.CREDIT_CARD_ENTRY) + .setIphDescriptionText(descriptionText) + .setApplyDeactivatedStyle(false) + .build(), + new Action(AUTOFILL_SUGGESTION, unused -> {})); + itemWithIph.setFeatureForIph( + FeatureConstants.KEYBOARD_ACCESSORY_PAYMENT_CARD_INFO_RETRIEVAL_FEATURE); + + TestTracker tracker = new TestTracker(); + TrackerFactory.setTrackerForTests(tracker); + + ThreadUtils.runOnUiThreadBlocking( + () -> { + mModel.set(VISIBLE, true); + mModel.get(BAR_ITEMS).set(new BarItem[] {itemWithIph, createSheetOpener()}); + }); + + onViewWaiting(withText("Card Info Retrieval")); + waitForHelpBubble(withText(descriptionText)); + assertThat(mKeyboardAccessoryView.take().areClicksAllowedWhenObscured(), is(true)); + onView(withChild(withText("Card Info Retrieval"))).check(matches(isSelected())); + onView(withText("Card Info Retrieval")).perform(click()); + + assertThat(tracker.wasDismissed(), is(true)); + assertThat( + tracker.getLastEmittedEvent(), + is(EventConstants.KEYBOARD_ACCESSORY_PAYMENT_CARD_INFO_RETRIEVAL_AUTOFILLED)); + onView(withChild(withText("Card Info Retrieval"))).check(matches(not(isSelected()))); + } + + @Test + @MediumTest public void testDismissesPasswordEducationBubbleOnFilling() throws InterruptedException { AutofillBarItem itemWithIph = new AutofillBarItem(
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/SharedGroupObserver.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/SharedGroupObserver.java index 70fd044..b013a35 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/SharedGroupObserver.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/SharedGroupObserver.java
@@ -4,6 +4,8 @@ package org.chromium.chrome.browser.tasks.tab_management; +import android.text.TextUtils; + import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -18,13 +20,15 @@ import org.chromium.components.tab_group_sync.LocalTabGroupId; import org.chromium.components.tab_group_sync.SavedTabGroup; import org.chromium.components.tab_group_sync.TabGroupSyncService; +import org.chromium.components.tab_group_sync.TabGroupSyncService.Observer; +import org.chromium.components.tab_group_sync.TriggerSource; import java.util.List; import java.util.Objects; /** Provides a simple interface to watch shared state for a single tab group. */ public class SharedGroupObserver implements Destroyable { - private final DataSharingService.Observer mObserver = + private final DataSharingService.Observer mShareObserver = new DataSharingService.Observer() { @Override public void onGroupChanged(GroupData groupData) { @@ -42,6 +46,14 @@ } }; + private final TabGroupSyncService.Observer mSyncObserver = + new Observer() { + @Override + public void onTabGroupUpdated(SavedTabGroup group, @TriggerSource int source) { + updateForSyncChange(group); + } + }; + private final ObservableSupplierImpl<Integer> mGroupSharedStateSupplier = new ObservableSupplierImpl<>(); private final ObservableSupplierImpl<List<GroupMember>> mGroupMembersSupplier = @@ -53,6 +65,7 @@ private final LocalTabGroupId mLocalTabGroupId; private final TabGroupSyncService mTabGroupSyncService; private final DataSharingService mDataSharingService; + private final CollaborationService mCollaborationService; /** * @param tabGroupId The id of the tab group. @@ -67,6 +80,7 @@ @NonNull CollaborationService collaborationService) { mTabGroupSyncService = tabGroupSyncService; mDataSharingService = dataSharingService; + mCollaborationService = collaborationService; mLocalTabGroupId = new LocalTabGroupId(tabGroupId); @Nullable SavedTabGroup group = mTabGroupSyncService.getGroup(mLocalTabGroupId); @@ -80,12 +94,14 @@ updateOurGroupData(groupData); } - dataSharingService.addObserver(mObserver); + tabGroupSyncService.addObserver(mSyncObserver); + dataSharingService.addObserver(mShareObserver); } @Override public void destroy() { - mDataSharingService.removeObserver(mObserver); + mTabGroupSyncService.removeObserver(mSyncObserver); + mDataSharingService.removeObserver(mShareObserver); } /** @@ -154,4 +170,15 @@ return matches; } } + + private void updateForSyncChange(SavedTabGroup group) { + if (!Objects.equals(mLocalTabGroupId, group.localId) + || TextUtils.equals(group.collaborationId, mCurrentCollaborationIdSupplier.get())) { + return; + } + String newCollaborationId = group.collaborationId; + GroupData groupData = mCollaborationService.getGroupData(newCollaborationId); + mCurrentCollaborationIdSupplier.set(newCollaborationId); + updateOurGroupData(groupData); + } }
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/SharedGroupObserverUnitTest.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/SharedGroupObserverUnitTest.java index b8460d64..76e32d3 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/SharedGroupObserverUnitTest.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/SharedGroupObserverUnitTest.java
@@ -29,13 +29,16 @@ import org.chromium.base.Callback; import org.chromium.base.Token; +import org.chromium.base.supplier.ObservableSupplier; import org.chromium.base.test.BaseRobolectricTestRunner; import org.chromium.components.collaboration.CollaborationService; import org.chromium.components.data_sharing.DataSharingService; +import org.chromium.components.data_sharing.GroupData; import org.chromium.components.data_sharing.SharedGroupTestHelper; import org.chromium.components.tab_group_sync.LocalTabGroupId; import org.chromium.components.tab_group_sync.SavedTabGroup; import org.chromium.components.tab_group_sync.TabGroupSyncService; +import org.chromium.components.tab_group_sync.TriggerSource; import java.util.List; @@ -51,10 +54,9 @@ @Mock private CollaborationService mCollaborationService; @Mock private Callback<Integer> mOnSharedGroupStateChanged; + @Captor private ArgumentCaptor<TabGroupSyncService.Observer> mSyncObserverCaptor; @Captor private ArgumentCaptor<DataSharingService.Observer> mSharingObserverCaptor; - private SharedGroupTestHelper mSharedGroupTestHelper; - @Test public void testDestroy() { SharedGroupObserver observer = @@ -182,7 +184,7 @@ } @Test - public void testOnChanged() { + public void testOnShareChanged() { SavedTabGroup savedTabGroup = new SavedTabGroup(); savedTabGroup.collaborationId = null; when(mTabGroupSyncService.getGroup(any(LocalTabGroupId.class))).thenReturn(savedTabGroup); @@ -227,4 +229,34 @@ collaborationId = observer.getCollaborationIdSupplier().get(); assertNull(collaborationId); } + + @Test + public void testOnSyncChanged() { + SavedTabGroup syncGroup = new SavedTabGroup(); + syncGroup.localId = new LocalTabGroupId(TAB_GROUP_ID); + syncGroup.collaborationId = null; + when(mTabGroupSyncService.getGroup(any(LocalTabGroupId.class))).thenReturn(syncGroup); + + SharedGroupObserver observer = + new SharedGroupObserver( + TAB_GROUP_ID, + mTabGroupSyncService, + mDataSharingService, + mCollaborationService); + verify(mDataSharingService).addObserver(mSharingObserverCaptor.capture()); + verify(mTabGroupSyncService).addObserver(mSyncObserverCaptor.capture()); + ObservableSupplier<Integer> sharedStateSupplier = observer.getGroupSharedStateSupplier(); + assertEquals(GroupSharedState.NOT_SHARED, sharedStateSupplier.get().intValue()); + + // savedTabGroup.collaborationId is still null, cannot match up the groups yet. + GroupData shareGroup = + SharedGroupTestHelper.newGroupData(COLLABORATION_ID1, GROUP_MEMBER1, GROUP_MEMBER2); + when(mCollaborationService.getGroupData(COLLABORATION_ID1)).thenReturn(shareGroup); + mSharingObserverCaptor.getValue().onGroupAdded(shareGroup); + assertEquals(GroupSharedState.NOT_SHARED, sharedStateSupplier.get().intValue()); + + syncGroup.collaborationId = COLLABORATION_ID1; + mSyncObserverCaptor.getValue().onTabGroupUpdated(syncGroup, TriggerSource.LOCAL); + assertEquals(GroupSharedState.HAS_OTHER_USERS, sharedStateSupplier.get().intValue()); + } }
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupColorViewProviderUnitTest.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupColorViewProviderUnitTest.java index 0d0a35a..e554169 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupColorViewProviderUnitTest.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupColorViewProviderUnitTest.java
@@ -69,7 +69,6 @@ @Captor private ArgumentCaptor<DataSharingService.Observer> mSharingObserverCaptor; - private SharedGroupTestHelper mSharedGroupTestHelper; private Context mContext; private TabGroupColorViewProvider mRegularColorViewProvider; private TabGroupColorViewProvider mIncognitoColorViewProvider; @@ -80,8 +79,6 @@ when(mCollaborationService.getServiceStatus()).thenReturn(mServiceStatus); when(mDataSharingService.getUiDelegate()).thenReturn(mDataSharingUiDelegate); - mSharedGroupTestHelper = new SharedGroupTestHelper(mDataSharingService); - mActivityScenarioRule.getScenario().onActivity(this::onActivityCreated); }
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherPane.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherPane.java index 98f7ecf..c5580341 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherPane.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherPane.java
@@ -372,8 +372,18 @@ @Nullable SavedTabGroup savedTabGroup = mTabGroupSyncService.getGroup(new LocalTabGroupId(tabGroupId)); - if (savedTabGroup == null) return; - if (!mTabGroupSyncService.isRemoteDevice(savedTabGroup.creatorCacheGuid)) return; + // Don't try to show the IPH if the group is: + // 1) Not in TabGroupSyncService for some reason. + // 2) A shared tab group. + // 3) Created locally. + // 4) The tab grid dialog is visible. + if (savedTabGroup == null + || TabShareUtils.isCollaborationIdValid(savedTabGroup.collaborationId) + || !mTabGroupSyncService.isRemoteDevice(savedTabGroup.creatorCacheGuid) + || Boolean.TRUE.equals( + coordinator.getTabGridDialogVisibilitySupplier().get())) { + return; + } @Nullable View anchorView = coordinator.getViewByIndex(viewIndex); if (anchorView == null) continue;
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherPaneCoordinator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherPaneCoordinator.java index 0d9a3e15..58d50098 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherPaneCoordinator.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherPaneCoordinator.java
@@ -474,7 +474,7 @@ } /** Returns a {@link Supplier} that provides dialog visibility information. */ - public @Nullable Supplier<Boolean> getTabGridDialogVisibilitySupplier() { + public @NonNull Supplier<Boolean> getTabGridDialogVisibilitySupplier() { return mTabGridDialogVisibilitySupplier; }
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherPaneCoordinatorFactory.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherPaneCoordinatorFactory.java index 55ca9b14..59af965c1 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherPaneCoordinatorFactory.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherPaneCoordinatorFactory.java
@@ -35,7 +35,6 @@ import org.chromium.components.browser_ui.bottomsheet.BottomSheetController; import org.chromium.components.browser_ui.desktop_windowing.DesktopWindowStateManager; import org.chromium.components.browser_ui.widget.scrim.ScrimCoordinator; -import org.chromium.components.browser_ui.widget.scrim.ScrimCoordinator.SystemUiScrimDelegate; import org.chromium.ui.base.DeviceFormFactor; import org.chromium.ui.modaldialog.ModalDialogManager; import org.chromium.ui.util.TokenHolder; @@ -192,20 +191,11 @@ static ScrimCoordinator createScrimCoordinatorForTablet(Activity activity) { ViewGroup coordinator = activity.findViewById(R.id.coordinator); // TODO(crbug.com/40067282): Because the show/hide animation already uses the - // RootUiCoordinator's - // ScrimCoordinator, a separate instance is needed. However, the way this is implemented the - // status bar color is not updated. This should be fixed. - SystemUiScrimDelegate delegate = - new SystemUiScrimDelegate() { - @Override - public void setStatusBarScrimFraction(float scrimFraction) {} - - @Override - public void setNavigationBarScrimFraction(float scrimFraction) {} - }; + // RootUiCoordinator's ScrimCoordinator, a separate instance is needed. However, the way + // this is implemented the status bar color is not updated. This should be fixed. return new ScrimCoordinator( activity, - delegate, + /* systemUiScrimDelegate= */ null, coordinator, activity.getColor(R.color.omnibox_focused_fading_background_color)); }
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherPaneUnitTest.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherPaneUnitTest.java index 133125cd..a2d882c 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherPaneUnitTest.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherPaneUnitTest.java
@@ -1116,6 +1116,43 @@ } @Test + public void testRemoteGroupIph_collaboration() { + mTabSwitcherPane.setPaneHubController(mPaneHubController); + when(mTabSwitcherPaneCoordinator.getVisibleRange()).thenReturn(new Pair<>(0, 0)); + when(mTabGroupModelFilter.getTabAt(anyInt())).thenReturn(mTab); + when(mTabGroupModelFilter.isTabInTabGroup(mTab)).thenReturn(true); + when(mTab.getTabGroupId()).thenReturn(mToken); + when(mTabGroupSyncService.getGroup(any(LocalTabGroupId.class))).thenReturn(mSavedTabGroup); + when(mTabGroupSyncService.isRemoteDevice(any())).thenReturn(true); + when(mTabSwitcherPaneCoordinator.getViewByIndex(anyInt())).thenReturn(mAnchorView); + mSavedTabGroup.collaborationId = "Collab ID"; + + mTabSwitcherPane.notifyLoadHint(LoadHint.HOT); + ShadowLooper.runUiThreadTasksIncludingDelayedTasks(); + + verify(mUserEducationHelper, never()).requestShowIph(any()); + } + + @Test + public void testRemoteGroupIph_tabGridDialogVisible() { + mTabSwitcherPane.setPaneHubController(mPaneHubController); + when(mTabSwitcherPaneCoordinator.getVisibleRange()).thenReturn(new Pair<>(0, 0)); + when(mTabGroupModelFilter.getTabAt(anyInt())).thenReturn(mTab); + when(mTabGroupModelFilter.isTabInTabGroup(mTab)).thenReturn(true); + when(mTab.getTabGroupId()).thenReturn(mToken); + when(mTabGroupSyncService.getGroup(any(LocalTabGroupId.class))).thenReturn(mSavedTabGroup); + when(mTabGroupSyncService.isRemoteDevice(any())).thenReturn(true); + when(mTabSwitcherPaneCoordinator.getViewByIndex(anyInt())).thenReturn(mAnchorView); + when(mTabSwitcherPaneCoordinator.getTabGridDialogVisibilitySupplier()) + .thenReturn(() -> true); + + mTabSwitcherPane.notifyLoadHint(LoadHint.HOT); + ShadowLooper.runUiThreadTasksIncludingDelayedTasks(); + + verify(mUserEducationHelper, never()).requestShowIph(any()); + } + + @Test public void testRemoteGroupIph_nullView() { mTabSwitcherPane.setPaneHubController(mPaneHubController); when(mTabSwitcherPaneCoordinator.getVisibleRange()).thenReturn(new Pair<>(0, 0));
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TransitiveSharedGroupObserverUnitTest.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TransitiveSharedGroupObserverUnitTest.java index a6b1388f..d8c2191 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TransitiveSharedGroupObserverUnitTest.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TransitiveSharedGroupObserverUnitTest.java
@@ -50,8 +50,6 @@ @Mock private Callback<String> mOnSharedGroupCollaborationIdChanged; @Mock private Callback<List<GroupMember>> mOnGroupMembersChanged; - private SharedGroupTestHelper mSharedGroupTestHelper; - @Test public void testDestroy_NoTabGroupId() { TransitiveSharedGroupObserver observer =
diff --git a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupUiMediatorUnitTest.java b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupUiMediatorUnitTest.java index 1d65dca..99fd322 100644 --- a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupUiMediatorUnitTest.java +++ b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupUiMediatorUnitTest.java
@@ -184,7 +184,6 @@ private OneshotSupplierImpl<LayoutStateProvider> mLayoutStateProviderSupplier = new OneshotSupplierImpl<>(); private LazyOneshotSupplier<TabGridDialogMediator.DialogController> mDialogControllerSupplier; - private SharedGroupTestHelper mSharedGroupTestHelper; private Tab prepareTab(int tabId, int rootId) { Tab tab = TabUiUnitTestUtils.prepareTab(tabId, rootId); @@ -296,7 +295,6 @@ DataSharingServiceFactory.setForTesting(mDataSharingService); CollaborationServiceFactory.setForTesting(mCollaborationService); when(mDataSharingService.getUiDelegate()).thenReturn(mDataSharingUiDelegate); - mSharedGroupTestHelper = new SharedGroupTestHelper(mDataSharingService); // Set up Tabs mTab1 = prepareTab(TAB1_ID, TAB1_ROOT_ID);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeApplicationImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeApplicationImpl.java index 4115fd4..b0cb0fc 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeApplicationImpl.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeApplicationImpl.java
@@ -64,7 +64,8 @@ // Only load the native library early for bundle builds since some tests use the // "--disable-native-initialization" switch, and the CommandLine is not initialized at // this point to check. - if (BundleUtils.isBundle()) { + if (BundleUtils.isBundle() + && !ChromeFeatureList.sSkipIsolatedSplitPreload.isEnabled()) { // Kick off library loading in a separate thread so it's ready when we need it. new Thread(() -> LibraryLoader.getInstance().ensureInitialized()).start(); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/vcn/AutofillVcnEnrollBottomSheetLifecycle.java b/chrome/android/java/src/org/chromium/chrome/browser/autofill/vcn/AutofillVcnEnrollBottomSheetLifecycle.java index 44023877..382b6e8 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/vcn/AutofillVcnEnrollBottomSheetLifecycle.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/autofill/vcn/AutofillVcnEnrollBottomSheetLifecycle.java
@@ -4,6 +4,8 @@ package org.chromium.chrome.browser.autofill.vcn; +import androidx.annotation.Nullable; + import org.chromium.base.Callback; import org.chromium.base.supplier.ObservableSupplier; import org.chromium.chrome.browser.layouts.LayoutStateProvider; @@ -11,10 +13,10 @@ import org.chromium.chrome.browser.layouts.LayoutType; import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tab.TabSelectionType; +import org.chromium.chrome.browser.tabmodel.TabList; import org.chromium.chrome.browser.tabmodel.TabModel; import org.chromium.chrome.browser.tabmodel.TabModelObserver; import org.chromium.chrome.browser.tabmodel.TabModelSelector; -import org.chromium.chrome.browser.tabmodel.TabModelSelectorObserver; /** * The lifecycle for the virtual card number (VCN) enrollment bottom sheet. Notifies the caller when @@ -22,10 +24,8 @@ * dismissed. Ignores page navigations. */ /*package*/ class AutofillVcnEnrollBottomSheetLifecycle - implements Callback<TabModelSelector>, - TabModelSelectorObserver, - TabModelObserver, - LayoutStateObserver { + implements Callback<TabModelSelector>, TabModelObserver, LayoutStateObserver { + private final Callback<TabModel> mCurrentTabModelObserver = this::onTabModelSelected; private final LayoutStateProvider mLayoutStateProvider; private final ObservableSupplier<TabModelSelector> mTabModelSelectorSupplier; private Runnable mOnEndOfLifecycle; @@ -81,7 +81,8 @@ mLayoutStateProvider.removeObserver(this); mTabModelSelectorSupplier.removeObserver(this); - if (mTabModelSelector != null) mTabModelSelector.removeObserver(this); + if (mTabModelSelector != null) + mTabModelSelector.getCurrentTabModelSupplier().removeObserver(mCurrentTabModelObserver); if (mTabModel != null) mTabModel.removeObserver(this); mHasBegun = false; @@ -92,6 +93,20 @@ mOnEndOfLifecycle.run(); } + private void onTabModelSelected(@Nullable TabModel newModel) { + if (newModel == mTabModel) return; + + if (mTabModel != null) { + endLifecycleAndNotifyCaller(); + return; + } + + if (newModel != null) { + mTabModel = newModel; + mTabModel.addObserver(this); + } + } + // Implements LayoutStateObserver for LayoutStateProvider. @Override public void onStartedShowing(int layoutType) { @@ -104,29 +119,15 @@ mTabModelSelectorSupplier.removeObserver(this); mTabModelSelector = tabModelSelector; - mTabModelSelector.addObserver(this); + tabModelSelector.getCurrentTabModelSupplier().addObserver(mCurrentTabModelObserver); TabModel currentTabModel = mTabModelSelector.getCurrentModel(); - if (currentTabModel.index() >= 0) { + if (currentTabModel.index() != TabList.INVALID_TAB_INDEX) { mTabModel = currentTabModel; mTabModel.addObserver(this); } } - // Implements TabModelSelectorObserver for TabModelSelector. - @Override - public void onTabModelSelected(TabModel newModel, TabModel oldModel) { - if (mTabModel != null) { - endLifecycleAndNotifyCaller(); - return; - } - - if (newModel != null) { - mTabModel = newModel; - mTabModel.addObserver(this); - } - } - // Implements TabModelObserver for TabModel. @Override public void didSelectTab(Tab tab, @TabSelectionType int type, int lastId) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/base/SplitChromeApplication.java b/chrome/android/java/src/org/chromium/chrome/browser/base/SplitChromeApplication.java index 2e5aa583..40c2fa3 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/base/SplitChromeApplication.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/base/SplitChromeApplication.java
@@ -7,6 +7,7 @@ import android.annotation.SuppressLint; import android.content.Context; import android.content.pm.PackageManager; +import android.content.res.Configuration; import android.content.res.Resources; import android.os.Build; import android.os.Handler; @@ -23,6 +24,7 @@ import org.chromium.base.TraceEvent; import org.chromium.base.metrics.RecordHistogram; import org.chromium.build.annotations.IdentifierNameString; +import org.chromium.chrome.browser.language.GlobalAppLocaleController; /** * Application class for Chrome that knows how to deal with isolated splits. This class will perform @@ -120,16 +122,8 @@ } @Override - protected void performBrowserProcessPreloading(Context context) { - // The chrome split has a large amount of code, which can slow down startup. Loading - // this in the background allows us to do this in parallel with startup tasks which do - // not depend on code in the chrome split. - sSplitPreloader = new SplitPreloader(context); - // If the chrome module is not enabled or isolated splits are not supported (e.g. in Android - // N), the onComplete function will run immediately so it must handle the case where the - // base context of the application has not been set yet. - sSplitPreloader.preload( - CHROME_SPLIT_NAME, + protected void performBrowserProcessPreloading(Context context, boolean blockingLoad) { + SplitPreloader.PreloadHooks hooks = new SplitPreloader.PreloadHooks() { @Override public void runImmediatelyInBackgroundThread(Context chromeContext) { @@ -173,6 +167,13 @@ BundleUtils.replaceClassLoader( SplitChromeApplication.this, chromeContext.getClassLoader()); JNIUtils.setClassLoader(chromeContext.getClassLoader()); + + if (GlobalAppLocaleController.getInstance().isOverridden()) { + Configuration config = + GlobalAppLocaleController.getInstance() + .getOverrideConfig(chromeContext); + chromeContext = chromeContext.createConfigurationContext(config); + } // Resources holds a reference to a ClassLoader. Make our Application's // getResources() return a reference to the Chrome split's resources // since there are a spots where ContextUtils.getApplicationContext() @@ -185,7 +186,26 @@ public Context createIsolatedSplitContext(String name) { return createContextForSplitNoWait(name); } - }); + }; + + if (blockingLoad) { + Context chromeContext = hooks.createIsolatedSplitContext(CHROME_SPLIT_NAME); + hooks.runInUiThread(chromeContext); + } else { + // The chrome split has a large amount of code, which can slow down startup. Loading + // this in the background allows us to do this in parallel with startup tasks which do + // not depend on code in the chrome split. + sSplitPreloader = new SplitPreloader(context); + // If the chrome module is not enabled or isolated splits are not supported (e.g. in + // Android N), the onComplete function will run immediately so it must handle the case + // where the base context of the application has not been set yet. + sSplitPreloader.preload(CHROME_SPLIT_NAME, hooks); + } + } + + @Override + protected void performBrowserProcessPreloading(Context context) { + performBrowserProcessPreloading(context, false); } @Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/base/SplitCompatApplication.java b/chrome/android/java/src/org/chromium/chrome/browser/base/SplitCompatApplication.java index 635c6243..4d64036b 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/base/SplitCompatApplication.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/base/SplitCompatApplication.java
@@ -192,7 +192,7 @@ maybeInitProcessType(); - if (isBrowserProcess) { + if (isBrowserProcess && !ChromeFeatureList.sSkipIsolatedSplitPreload.isEnabled()) { performBrowserProcessPreloading(context); } @@ -266,6 +266,14 @@ CustomAssertionHandler.installPreNativeHandler(factory); } + // Skipping tests since some use "--disable-native-initialization", and some tests manually + // test loading the native library themselves. + if (isBrowserProcess + && ChromeFeatureList.sSkipIsolatedSplitPreload.isEnabled() + && !BuildConfig.IS_FOR_TEST) { + new Thread(() -> LibraryLoader.getInstance().loadNow()).start(); + performBrowserProcessPreloading(context, true); + } TraceEvent.end(ATTACH_BASE_CONTEXT_EVENT); } @@ -321,6 +329,8 @@ */ protected void performBrowserProcessPreloading(Context context) {} + protected void performBrowserProcessPreloading(Context context, boolean blockingLoad) {} + public boolean isWebViewProcess() { return false; }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/base/SplitPreloader.java b/chrome/android/java/src/org/chromium/chrome/browser/base/SplitPreloader.java index 0c88b15..7f8e0d16 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/base/SplitPreloader.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/base/SplitPreloader.java
@@ -5,7 +5,6 @@ package org.chromium.chrome.browser.base; import android.content.Context; -import android.content.res.Configuration; import android.os.SystemClock; import androidx.annotation.Nullable; @@ -16,12 +15,11 @@ import org.chromium.base.metrics.RecordHistogram; import org.chromium.base.task.AsyncTask; import org.chromium.base.task.TaskTraits; -import org.chromium.chrome.browser.language.GlobalAppLocaleController; /** - * Handles preloading split Contexts on a background thread. Loading a new isolated split - * Context can be expensive since the ClassLoader may need to be created. See crbug.com/1150600 for - * more info. + * Handles preloading split Contexts on a background thread. Loading a new isolated split Context + * can be expensive since the ClassLoader may need to be created. See crbug.com/1150600 for more + * info. */ public class SplitPreloader { private final SimpleArrayMap<String, PreloadTask> mPreloadTasks = new SimpleArrayMap<>(); @@ -103,11 +101,6 @@ } else { context = BundleUtils.createIsolatedSplitContext(mName); } - if (GlobalAppLocaleController.getInstance().isOverridden()) { - Configuration config = - GlobalAppLocaleController.getInstance().getOverrideConfig(context); - context = context.createConfigurationContext(config); - } return context; } return mContext;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorViewHolder.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorViewHolder.java index 23c9f25..05c61cf 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorViewHolder.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorViewHolder.java
@@ -43,7 +43,6 @@ import org.chromium.base.TraceEvent; import org.chromium.base.supplier.ObservableSupplier; import org.chromium.base.supplier.ObservableSupplierImpl; -import org.chromium.base.supplier.Supplier; import org.chromium.chrome.R; import org.chromium.chrome.browser.browser_controls.BrowserControlsStateProvider; import org.chromium.chrome.browser.browser_controls.BrowserControlsUtils; @@ -1373,7 +1372,7 @@ public void onFinishNativeInitialization( TabModelSelector tabModelSelector, TabCreatorManager tabCreatorManager, - Supplier<Integer> bottomControlsOffsetSupplier) { + ObservableSupplier<Integer> bottomControlsOffsetSupplier) { assert mLayoutManager != null; mLayoutManager.init( tabModelSelector,
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerChrome.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerChrome.java index 2475c84..c5e0741 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerChrome.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerChrome.java
@@ -162,7 +162,7 @@ ControlContainer controlContainer, DynamicResourceLoader dynamicResourceLoader, TopUiThemeColorProvider topUiColorProvider, - Supplier<Integer> bottomControlsOffsetSupplier) { + ObservableSupplier<Integer> bottomControlsOffsetSupplier) { Context context = mHost.getContext(); LayoutRenderHost renderHost = mHost.getLayoutRenderHost(); BrowserControlsStateProvider browserControlsStateProvider =
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerChromePhone.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerChromePhone.java index 20f3d50..72b8ab5 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerChromePhone.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerChromePhone.java
@@ -76,7 +76,7 @@ ControlContainer controlContainer, DynamicResourceLoader dynamicResourceLoader, TopUiThemeColorProvider topUiColorProvider, - Supplier<Integer> bottomControlsOffsetSupplier) { + ObservableSupplier<Integer> bottomControlsOffsetSupplier) { Context context = mHost.getContext(); LayoutRenderHost renderHost = mHost.getLayoutRenderHost();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerChromeTablet.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerChromeTablet.java index fc6b757..dd91a73 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerChromeTablet.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerChromeTablet.java
@@ -171,7 +171,7 @@ ControlContainer controlContainer, DynamicResourceLoader dynamicResourceLoader, TopUiThemeColorProvider topUiColorProvider, - Supplier<Integer> bottomControlsOffsetSupplier) { + ObservableSupplier<Integer> bottomControlsOffsetSupplier) { super.init( selector, creator,
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerImpl.java index 50e9f91..5155c39f 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerImpl.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerImpl.java
@@ -597,7 +597,7 @@ @Nullable ControlContainer controlContainer, DynamicResourceLoader dynamicResourceLoader, TopUiThemeColorProvider topUiColorProvider, - Supplier<Integer> bottomControlsOffsetSupplier) { + ObservableSupplier<Integer> bottomControlsOffsetSupplier) { LayoutRenderHost renderHost = mHost.getLayoutRenderHost(); mBrowserControlsStateProvider = mHost.getBrowserControlsManager();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/ToolbarSwipeLayout.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/ToolbarSwipeLayout.java index abb4fe1a..f444d6f 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/ToolbarSwipeLayout.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/ToolbarSwipeLayout.java
@@ -17,8 +17,8 @@ import org.chromium.base.MathUtils; import org.chromium.base.metrics.RecordHistogram; import org.chromium.base.metrics.RecordUserAction; +import org.chromium.base.supplier.ObservableSupplier; import org.chromium.base.supplier.ObservableSupplierImpl; -import org.chromium.base.supplier.Supplier; import org.chromium.chrome.R; import org.chromium.chrome.browser.browser_controls.BrowserControlsStateProvider; import org.chromium.chrome.browser.compositor.layouts.components.LayoutTab; @@ -122,7 +122,7 @@ BrowserControlsStateProvider browserControlsStateProvider, LayoutManager layoutManager, TopUiThemeColorProvider topUiColorProvider, - Supplier<Integer> bottomControlsOffsetSupplier, + ObservableSupplier<Integer> bottomControlsOffsetSupplier, ViewGroup contentContainer) { super(context, updateHost, renderHost); mBlackHoleEventFilter = new BlackHoleEventFilter(context); @@ -282,8 +282,9 @@ } /** - * Prepare the tabs sliding animations. This method need to be called before - * {@link #doTabSwitchAnimation(int, float, float, long)}. + * Prepare the tabs sliding animations. This method need to be called before {@link + * #doTabSwitchAnimation(int, float, float, long)}. + * * @param direction The direction of the slide. * @param fromIndex The index of the tab which will be switched from. * @param toIndex The index of the tab which will be switched to. @@ -604,6 +605,7 @@ /** * Perform the tabs sliding animations. If the new tab's index is smaller than the old one, new * tab slide in from left, and old one slide out to right, and vice versa. + * * @param toTabId The id of the next tab which will be switched to. * @param fromTabId The id of the previous tab which will be switched out. */
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/ReorderDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/ReorderDelegate.java index c6701b56..c98b8cb 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/ReorderDelegate.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/ReorderDelegate.java
@@ -154,10 +154,6 @@ return getInReorderMode() && mActiveStrategy == mExternalViewDragDropReorderStrategy; } - float getLastReorderX() { - return mLastReorderX; - } - StripLayoutTab getInteractingTab() { return (StripLayoutTab) mActiveStrategy.getInteractingView(); } @@ -281,7 +277,7 @@ // Return if accumulated delta is too small. This isn't the accumulated delta since the // beginning of the drag. It accumulates the delta X until a threshold is crossed and then // the event gets processed. - float accumulatedDeltaX = endX - getLastReorderX(); + float accumulatedDeltaX = endX - mLastReorderX; if (reorderType == ReorderType.DRAG_WITHIN_STRIP) { if (Math.abs(accumulatedDeltaX) < 1.f) { return; @@ -330,7 +326,7 @@ stripViews, groupTitles, stripTabs, - getLastReorderX(), + mLastReorderX, deltaX, ReorderType.DRAG_WITHIN_STRIP); } @@ -367,7 +363,7 @@ // than the interacting view's drawX. final float x = getReorderingForTabDrop() - ? adjustXForTabDrop(getLastReorderX()) + ? adjustXForTabDrop(mLastReorderX) : mActiveStrategy.getInteractingView().getDrawX(); // 2. Calculate the gutters for accelerating the scroll speed. @@ -1174,7 +1170,24 @@ @Override public void stopReorderMode( StripLayoutGroupTitle[] groupTitles, StripLayoutTab[] stripTabs) { - // TODO(crbug.com/381285152): Implement. + // If the dragged view was re-parented, it will no longer be present in model. + // If this is not the case, attempt to restore view to its original position. + StripLayoutTab draggedTab = (StripLayoutTab) mViewBeingDragged; + if (draggedTab != null + && mModel.getTabById(draggedTab.getTabId()) != null + && draggedTab.isDraggedOffStrip()) { + // If tab was ungrouped during drag, restore group indicator. + if (StripLayoutUtils.isLastTabInGroup(mTabGroupModelFilter, draggedTab.getTabId()) + && mActionConfirmationManager.willSkipUngroupTabAttempt()) { + mGroupIdToHideSupplier.set(Tab.INVALID_TAB_ID); + } + mAnimationHost.finishAnimationsAndPushTabUpdates(); + draggedTab.setIsDraggedOffStrip(false); + // Animate the tab translating back up onto the tab strip. + draggedTab.setWidth(0.f); + mStripUpdateDelegate.resizeTabStrip( + /* animate= */ true, draggedTab, /* animateTabAdded= */ true); + } if (mTabStrategyInProgress) { mTabStrategy.stopReorderMode(groupTitles, stripTabs); } @@ -1504,6 +1517,10 @@ return mSourceViewDragDropReorderStrategy.mLastOffsetX; } + float getLastReorderXForTesting() { + return mLastReorderX; + } + void setDragLastOffsetXForTesting(float offsetX) { if (mSourceViewDragDropReorderStrategy == null) return; mSourceViewDragDropReorderStrategy.mLastOffsetX = offsetX;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelper.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelper.java index f7182ac..40ead13 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelper.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelper.java
@@ -4202,7 +4202,7 @@ } protected float getLastReorderXForTesting() { - return mReorderDelegate.getLastReorderX(); + return mReorderDelegate.getLastReorderXForTesting(); } protected void setInReorderModeForTesting(boolean inReorderMode) { @@ -4267,30 +4267,6 @@ stripTab.setAccessibilityDescription(builder.toString(), title, resId); } - protected void clearTabDragState() { - // If the dragged tab was re-parented, it will have triggered a #rebuildStripTabs call and - // will no longer be present in the list of tabs. If this is not the case, attempt to return - // the dragged tab to its original position. - StripLayoutTab selectedTab = getSelectedStripTab(); - if (selectedTab != null - && findTabById(selectedTab.getTabId()) != null - && selectedTab.isDraggedOffStrip()) { - - // Rebuild tab groups to unhide the interacting tab group as tab is restored back on tab - // strip. - if (StripLayoutUtils.isLastTabInGroup(mTabGroupModelFilter, selectedTab.getTabId()) - && mActionConfirmationManager.willSkipUngroupTabAttempt()) { - mGroupIdToHideSupplier.set(Tab.INVALID_TAB_ID); - } - dragActiveClickedTabOntoStrip(); - } - stopReorderMode(); - } - - StripLayoutTab getActiveClickedTabForTesting() { - return (StripLayoutTab) mReorderDelegate.getViewBeingDragged(); - } - void setLastOffsetXForTesting(float lastOffsetX) { mReorderDelegate.setDragLastOffsetXForTesting(lastOffsetX); // IN-TEST } @@ -4351,18 +4327,6 @@ } } - private void dragActiveClickedTabOntoStrip() { - StripLayoutTab draggedTab = (StripLayoutTab) mReorderDelegate.getViewBeingDragged(); - assert draggedTab != null; - - finishAnimationsAndPushTabUpdates(); - draggedTab.setIsDraggedOffStrip(false); - - // Animate the tab translating back up onto the tab strip. - draggedTab.setWidth(0.f); - resizeTabStrip(/* animate= */ true, draggedTab, /* tabAddedAnimation= */ true); - } - void sendMoveWindowBroadcast(View view, float startXInView, float startYInView) { if (!TabUiFeatureUtilities.isTabDragAsWindowEnabled()) return; if (mWindowAndroid.getActivity().get() == null) return;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/TabDragSource.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/TabDragSource.java index edcedfc5..3f5a4c5d 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/TabDragSource.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/TabDragSource.java
@@ -466,7 +466,7 @@ int sourceInstanceId = DragDropGlobalState.getState(sDragTrackerToken).getDragSourceInstance(); - mStripLayoutHelperSupplier.get().clearTabDragState(); + mStripLayoutHelperSupplier.get().stopReorderMode(); mHandler.removeCallbacks(mOnDragExitRunnable); if (mShadowView != null) { mShadowView.clear();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/findinpage/FindToolbar.java b/chrome/android/java/src/org/chromium/chrome/browser/findinpage/FindToolbar.java index 816cd83..aa5454d 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/findinpage/FindToolbar.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/findinpage/FindToolbar.java
@@ -33,6 +33,7 @@ import androidx.core.view.accessibility.AccessibilityEventCompat; import androidx.core.view.inputmethod.EditorInfoCompat; +import org.chromium.base.Callback; import org.chromium.base.ThreadUtils; import org.chromium.base.supplier.ObservableSupplier; import org.chromium.base.supplier.ObservableSupplierImpl; @@ -44,7 +45,6 @@ import org.chromium.chrome.browser.tabmodel.TabModel; import org.chromium.chrome.browser.tabmodel.TabModelObserver; import org.chromium.chrome.browser.tabmodel.TabModelSelector; -import org.chromium.chrome.browser.tabmodel.TabModelSelectorObserver; import org.chromium.components.browser_ui.styles.SemanticColorUtils; import org.chromium.components.browser_ui.widget.gesture.BackPressHandler; import org.chromium.components.browser_ui.widget.text.VerticallyFixedEditText; @@ -75,6 +75,12 @@ int HIDING = 3; } + private final ObservableSupplierImpl<Boolean> mBackPressStateSupplier = + new ObservableSupplierImpl<>(); + private final Callback<TabModel> mCurrentTabModelObserver = this::onTabModelSelected; + private final TabModelObserver mTabModelObserver; + private final TabObserver mTabObserver; + // Toolbar UI private TextView mFindStatus; protected FindQuery mFindQuery; @@ -86,10 +92,8 @@ private FindResultBar mResultBar; private TabModelSelector mTabModelSelector; - private final TabModelSelectorObserver mTabModelSelectorObserver; - private final TabModelObserver mTabModelObserver; private Tab mCurrentTab; - private final TabObserver mTabObserver; + private TabModel mCurrentTabModel; private WindowAndroid mWindowAndroid; private FindInPageBridge mFindInPageBridge; private FindToolbarObserver mObserver; @@ -107,8 +111,6 @@ private @FindLocationBarState int mDesiredState = FindLocationBarState.HIDDEN; private Handler mHandler = new Handler(); - private final ObservableSupplierImpl<Boolean> mBackPressStateSupplier = - new ObservableSupplierImpl<>(); /** Subclasses EditText in order to intercept BACK key presses. */ @SuppressLint("Instantiatable") @@ -220,15 +222,6 @@ } }; - mTabModelSelectorObserver = - new TabModelSelectorObserver() { - @Override - public void onTabModelSelected(TabModel newModel, TabModel oldModel) { - deactivate(); - updateVisualsForTabModel(isIncognito()); - } - }; - mTabModelObserver = new TabModelObserver() { @Override @@ -576,7 +569,8 @@ /** Logic for handling the activation of the find toolbar. */ protected void handleActivate() { - mTabModelSelector.addObserver(mTabModelSelectorObserver); + mTabModelSelector.getCurrentTabModelSupplier().addObserver(mCurrentTabModelObserver); + mCurrentTabModel = mTabModelSelector.getCurrentModel(); for (TabModel model : mTabModelSelector.getModels()) { model.addObserver(mTabModelObserver); } @@ -618,7 +612,7 @@ protected void handleDeactivation(boolean clearSelection) { setResultsBarVisibility(false); - mTabModelSelector.removeObserver(mTabModelSelectorObserver); + mTabModelSelector.getCurrentTabModelSupplier().removeObserver(mCurrentTabModelObserver); for (TabModel model : mTabModelSelector.getModels()) { model.removeObserver(mTabModelObserver); } @@ -634,6 +628,7 @@ mFindInPageBridge.destroy(); mFindInPageBridge = null; mCurrentTab = null; + mCurrentTabModel = null; setCurrentState(FindLocationBarState.HIDDEN); } @@ -792,6 +787,13 @@ mWindowAndroid.getKeyboardDelegate().showKeyboard(mFindQuery); } + private void onTabModelSelected(@Nullable TabModel newModel) { + if (mCurrentTabModel == newModel) return; + + deactivate(); + updateVisualsForTabModel(isIncognito()); + } + protected boolean isIncognito() { return mTabModelSelector != null && mTabModelSelector.isIncognitoSelected(); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/history/HistoryActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/history/HistoryActivity.java index 269940a..b955a5d 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/history/HistoryActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/history/HistoryActivity.java
@@ -74,13 +74,7 @@ ScrimCoordinator scrim = new ScrimCoordinator( this, - new ScrimCoordinator.SystemUiScrimDelegate() { - @Override - public void setStatusBarScrimFraction(float scrimFraction) {} - - @Override - public void setNavigationBarScrimFraction(float scrimFraction) {} - }, + /* systemUiScrimDelegate= */ null, contentView, getColor(R.color.default_scrim_color)); mBottomSheetController =
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/payments/ui/PaymentUiService.java b/chrome/android/java/src/org/chromium/chrome/browser/payments/ui/PaymentUiService.java index d903132..45d4b73 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/payments/ui/PaymentUiService.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/payments/ui/PaymentUiService.java
@@ -41,7 +41,6 @@ import org.chromium.chrome.browser.tabmodel.TabModel; import org.chromium.chrome.browser.tabmodel.TabModelObserver; import org.chromium.chrome.browser.tabmodel.TabModelSelector; -import org.chromium.chrome.browser.tabmodel.TabModelSelectorObserver; import org.chromium.chrome.browser.ui.favicon.FaviconHelper; import org.chromium.components.autofill.AddressNormalizer.NormalizedAddressRequestDelegate; import org.chromium.components.autofill.AutofillProfile; @@ -123,7 +122,7 @@ private final boolean mIsOffTheRecord; private final Handler mHandler = new Handler(); private final Queue<Runnable> mRetryQueue = new LinkedList<>(); - private final TabModelSelectorObserver mSelectorObserver; + private final Callback<TabModel> mCurrentTabModelObserver = this::onTabModelSelected; private final TabModelObserver mTabModelObserver; private ContactEditor mContactEditor; private PaymentHandlerCoordinator mPaymentHandlerUi; @@ -320,13 +319,6 @@ mCurrencyFormatterMap = new HashMap<>(); mIsOffTheRecord = isOffTheRecord; mPaymentAppComparator = new PaymentAppComparator(/* params= */ mParams); - mSelectorObserver = - new TabModelSelectorObserver() { - @Override - public void onTabModelSelected(TabModel newModel, TabModel oldModel) { - mDelegate.onLeavingCurrentTab(ErrorStrings.TAB_SWITCH); - } - }; mTabModelObserver = new TabModelObserver() { @Override @@ -1155,10 +1147,14 @@ // Catch any time the user switches tabs. Because the dialog is modal, a user shouldn't be // allowed to switch tabs, which can happen if the user receives an external Intent. if (mObservedTabModelSelector != null) { - mObservedTabModelSelector.removeObserver(mSelectorObserver); + mObservedTabModelSelector + .getCurrentTabModelSupplier() + .removeObserver(mCurrentTabModelObserver); } mObservedTabModelSelector = tabModelSelector; - mObservedTabModelSelector.addObserver(mSelectorObserver); + mObservedTabModelSelector + .getCurrentTabModelSupplier() + .addObserver(mCurrentTabModelObserver); if (mObservedTabModel != null) { mObservedTabModel.removeObserver(mTabModelObserver); } @@ -1434,7 +1430,9 @@ /** Removes all of the observers that observe users leaving the tab. */ private void removeLeavingTabObservers() { if (mObservedTabModelSelector != null) { - mObservedTabModelSelector.removeObserver(mSelectorObserver); + mObservedTabModelSelector + .getCurrentTabModelSupplier() + .removeObserver(mCurrentTabModelObserver); mObservedTabModelSelector = null; } @@ -1621,4 +1619,10 @@ removeLeavingTabObservers(); destroyCurrencyFormatters(); } + + private void onTabModelSelected(@Nullable TabModel newTabModel) { + if (mObservedTabModel == newTabModel) return; + + mDelegate.onLeavingCurrentTab(ErrorStrings.TAB_SWITCH); + } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/privacy_sandbox/PrivacySandboxSurveyController.java b/chrome/android/java/src/org/chromium/chrome/browser/privacy_sandbox/PrivacySandboxSurveyController.java index 5fc80620..cd94b3d 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/privacy_sandbox/PrivacySandboxSurveyController.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/privacy_sandbox/PrivacySandboxSurveyController.java
@@ -382,6 +382,10 @@ } private static boolean shouldInitializeForActiveStudy() { + // Ads CCT notice survey. + if (ChromeFeatureList.isEnabled(ChromeFeatureList.PRIVACY_SANDBOX_CCT_ADS_NOTICE_SURVEY)) { + return true; + } // Sentiment survey should be checked last as it should always be on. if (!ChromeFeatureList.isEnabled(ChromeFeatureList.PRIVACY_SANDBOX_SENTIMENT_SURVEY)) { recordSentimentSurveyStatus(PrivacySandboxSentimentSurveyStatus.FEATURE_DISABLED);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/settings/SettingsActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/SettingsActivity.java index 5d041931..259b33a 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/settings/SettingsActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/SettingsActivity.java
@@ -235,22 +235,11 @@ /** Set up the bottom sheet for this activity. */ private void initBottomSheet() { ViewGroup sheetContainer = findViewById(R.id.sheet_container); + // TODO: Implement scrim delegate if status bar needs to change color with the scrim. mScrim = new ScrimCoordinator( this, - new ScrimCoordinator.SystemUiScrimDelegate() { - @Override - public void setStatusBarScrimFraction(float scrimFraction) { - // TODO: Implement if status bar needs to change color with the - // scrim. - } - - @Override - public void setNavigationBarScrimFraction(float scrimFraction) { - // TODO: Implement if navigation bar needs to change color with the - // scrim. - } - }, + /* systemUiScrimDelegate= */ null, (ViewGroup) sheetContainer.getParent(), getColor(R.color.default_scrim_color));
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninManagerImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninManagerImpl.java index 9cc205ed..a13921be 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninManagerImpl.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninManagerImpl.java
@@ -937,7 +937,7 @@ void fetchAndApplyCloudPolicy( long nativeSigninManagerAndroid, - CoreAccountInfo account, + @JniType("CoreAccountInfo") CoreAccountInfo account, @JniType("base::RepeatingClosure") Runnable callback); void stopApplyingCloudPolicy(long nativeSigninManagerAndroid);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/sync/TrustedVaultClient.java b/chrome/android/java/src/org/chromium/chrome/browser/sync/TrustedVaultClient.java index 87869e6..cb5a68f 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/sync/TrustedVaultClient.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/sync/TrustedVaultClient.java
@@ -273,7 +273,9 @@ */ @CalledByNative private static void fetchKeys( - long nativeTrustedVaultClientAndroid, int requestId, CoreAccountInfo accountInfo) { + long nativeTrustedVaultClientAndroid, + int requestId, + @JniType("CoreAccountInfo") CoreAccountInfo accountInfo) { assert isNativeRegistered(nativeTrustedVaultClientAndroid); Consumer<List<byte[]>> responseCb = @@ -300,7 +302,9 @@ */ @CalledByNative private static void markLocalKeysAsStale( - long nativeTrustedVaultClientAndroid, int requestId, CoreAccountInfo accountInfo) { + long nativeTrustedVaultClientAndroid, + int requestId, + @JniType("CoreAccountInfo") CoreAccountInfo accountInfo) { assert isNativeRegistered(nativeTrustedVaultClientAndroid); Consumer<Boolean> responseCallback = @@ -326,7 +330,9 @@ */ @CalledByNative private static void getIsRecoverabilityDegraded( - long nativeTrustedVaultClientAndroid, int requestId, CoreAccountInfo accountInfo) { + long nativeTrustedVaultClientAndroid, + int requestId, + @JniType("CoreAccountInfo") CoreAccountInfo accountInfo) { assert isNativeRegistered(nativeTrustedVaultClientAndroid); Consumer<Boolean> responseCallback = @@ -355,7 +361,7 @@ private static void addTrustedRecoveryMethod( long nativeTrustedVaultClientAndroid, int requestId, - CoreAccountInfo accountInfo, + @JniType("CoreAccountInfo") CoreAccountInfo accountInfo, byte[] publicKey, int methodTypeHint) { assert isNativeRegistered(nativeTrustedVaultClientAndroid);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/DEPS b/chrome/android/java/src/org/chromium/chrome/browser/tab/DEPS index 0c6c201..bf67e11 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tab/DEPS +++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/DEPS
@@ -73,6 +73,7 @@ "+chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelSelector.java", "+chrome/browser/tab_group/java/src/org/chromium/chrome/browser/tasks/tab_groups/TabGroupColorUtils.java", "+chrome/browser/tab_group/java/src/org/chromium/chrome/browser/tasks/tab_groups/TabGroupTitleUtils.java", + "+chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/TabGroupSyncServiceFactory.java", ], 'HistoricalTabSaver\.java': [ "+chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabModel.java",
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/tab_restore/HistoricalTabModelObserver.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/tab_restore/HistoricalTabModelObserver.java index 3a61733..7320c77 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tab/tab_restore/HistoricalTabModelObserver.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/tab_restore/HistoricalTabModelObserver.java
@@ -4,17 +4,24 @@ package org.chromium.chrome.browser.tab.tab_restore; +import android.text.TextUtils; + import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; import org.chromium.base.Token; import org.chromium.base.supplier.LazyOneshotSupplier; import org.chromium.base.supplier.Supplier; +import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.tab.Tab; +import org.chromium.chrome.browser.tab_group_sync.TabGroupSyncServiceFactory; import org.chromium.chrome.browser.tabmodel.TabGroupModelFilter; import org.chromium.chrome.browser.tabmodel.TabList; import org.chromium.chrome.browser.tabmodel.TabModel; import org.chromium.chrome.browser.tabmodel.TabModelObserver; +import org.chromium.components.tab_group_sync.LocalTabGroupId; +import org.chromium.components.tab_group_sync.SavedTabGroup; +import org.chromium.components.tab_group_sync.TabGroupSyncService; import org.chromium.components.tab_groups.TabGroupColorId; import java.util.ArrayList; @@ -84,15 +91,28 @@ HashMap<Integer, HistoricalEntry> idToGroup = new HashMap<>(); List<HistoricalEntry> entries = new ArrayList<>(); + Profile profile = mTabGroupModelFilter.getTabModel().getProfile(); + @Nullable + TabGroupSyncService tabGroupSyncService = TabGroupSyncServiceFactory.getForProfile(profile); + LazyOneshotSupplier<Set<Token>> tabGroupIdsInComprehensiveModel = mTabGroupModelFilter.getLazyAllTabGroupIdsInComprehensiveModel(tabs); for (Tab tab : tabs) { - // Ignore complete tab groups that are being hidden. They will be accessible from the - // tab group pane instead. Still process closures for events that don't finish hiding - // the group. @Nullable Token tabGroupId = tab.getTabGroupId(); if (tabGroupId != null) { - if (mTabGroupModelFilter.isTabGroupHiding(tabGroupId) + // If an entire tab group is closing we do not want to save them if: + // + // 1) They are being hidden so they remain in the TabGroupSyncService. As they can + // be recalled from the tab groups pane. + // 2) They are for a collaboration that is fully deleted. I.e. the user left the + // group or deleted it as the owner. + // + // A tab group is fully closing if the comprehensive model no longer contains the + // tab group ID. If the entry is still present in the comprehensive model, the tab + // group is not fully closing and we can proceed with the process of saving an + // event to recent tabs. + if ((mTabGroupModelFilter.isTabGroupHiding(tabGroupId) + || isCollaborationTabGroup(tabGroupSyncService, tabGroupId)) && !tabGroupIdsInComprehensiveModel.get().contains(tabGroupId)) { continue; } @@ -179,4 +199,14 @@ && mTabGroupModelFilter.getRelatedTabCountForRootId(rootId) == 1; } } + + private boolean isCollaborationTabGroup( + @Nullable TabGroupSyncService tabGroupSyncService, Token tabGroupId) { + if (tabGroupSyncService == null) return false; + + SavedTabGroup savedTabGroup = tabGroupSyncService.getGroup(new LocalTabGroupId(tabGroupId)); + if (savedTabGroup == null) return false; + + return !TextUtils.isEmpty(savedTabGroup.collaborationId); + } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator.java index f89c723..84654b3bf 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator.java
@@ -1329,6 +1329,11 @@ } @Override + public void openUrlInChromeCustomTab(Context context, GURL gurl) { + CustomTabActivity.showInfoPage(context, gurl.getSpec()); + } + + @Override public void getPreviewBitmap( String collaborationId, int size, Callback<Bitmap> callback) { // TODO(https://crbug.com/386833405): implement this.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelImpl.java index a903c67..d1f0f8f 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelImpl.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelImpl.java
@@ -120,7 +120,7 @@ // Reset the index first so the event is raised properly as a index change and not // re-using the current index. mIndex = INVALID_TAB_INDEX; - TabModelUtils.setIndex(TabModelImpl.this, insertIndex, TabSelectionType.FROM_UNDO); + setIndex(insertIndex, TabSelectionType.FROM_UNDO); } else if (wasInvalidIndex && !isActiveModel()) { mCurrentTabSupplier.set(TabModelUtils.getCurrentTab(TabModelImpl.this)); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelSelectorBase.java b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelSelectorBase.java index c5bee35..5b60925 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelSelectorBase.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelSelectorBase.java
@@ -168,10 +168,6 @@ previousModel.setActive(false); newModel.setActive(true); mTabModelSupplier.set(newModel); - - for (TabModelSelectorObserver listener : mObservers) { - listener.onTabModelSelected(newModel, previousModel); - } } @Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java index 2d62f776..feb5206 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java
@@ -2262,7 +2262,7 @@ } /** See {@link mBottomToolbarControlsOffsetSupplier} */ - public Supplier<Integer> getBottomToolbarOffsetSupplier() { + public ObservableSupplier<Integer> getBottomToolbarOffsetSupplier() { return mBottomToolbarControlsOffsetSupplier; }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ui/RootUiCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/ui/RootUiCoordinator.java index 37442e2..69a77d0 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ui/RootUiCoordinator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ui/RootUiCoordinator.java
@@ -1705,9 +1705,6 @@ public void setStatusBarScrimFraction(float scrimFraction) { RootUiCoordinator.this.setStatusBarScrimFraction(scrimFraction); } - - @Override - public void setNavigationBarScrimFraction(float scrimFraction) {} }; return new ScrimCoordinator( mActivity,
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/app/edge_to_edge/EdgeToEdgePTTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/app/edge_to_edge/EdgeToEdgePTTest.java index fb15535..029e1ab 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/app/edge_to_edge/EdgeToEdgePTTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/app/edge_to_edge/EdgeToEdgePTTest.java
@@ -22,7 +22,7 @@ import org.chromium.base.test.transit.TransitAsserts; import org.chromium.base.test.util.Batch; import org.chromium.base.test.util.CommandLineFlags; -import org.chromium.base.test.util.DisabledTest; +import org.chromium.base.test.util.Features.DisableFeatures; import org.chromium.base.test.util.Features.EnableFeatures; import org.chromium.base.test.util.MinAndroidSdkLevel; import org.chromium.base.test.util.Restriction; @@ -37,6 +37,7 @@ import org.chromium.chrome.test.transit.edge_to_edge.ViewportFitCoverPageStation; import org.chromium.chrome.test.transit.page.WebPageStation; import org.chromium.chrome.test.transit.testhtmls.TopBottomLinksPageStation; +import org.chromium.components.omnibox.OmniboxFeatureList; import org.chromium.ui.base.DeviceFormFactor; import org.chromium.ui.test.util.DeviceRestriction; @@ -125,7 +126,7 @@ @Test @MediumTest @EnableFeatures({ChromeFeatureList.DRAW_KEY_NATIVE_EDGE_TO_EDGE}) - @DisabledTest(message = "crbug.com/388863303") + @DisableFeatures(OmniboxFeatureList.ANDROID_HUB_SEARCH) public void fromNtpToTabSwitcher() { // Start the page on NTP, chin is not visible. var newTabPage = mInitialStateRule.startOnNtp();
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/save_card/AutofillSaveCardBottomSheetRenderTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/save_card/AutofillSaveCardBottomSheetRenderTest.java index 8741c54..503cadf 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/save_card/AutofillSaveCardBottomSheetRenderTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/save_card/AutofillSaveCardBottomSheetRenderTest.java
@@ -81,15 +81,7 @@ ScrimCoordinator scrimCoordinator = new ScrimCoordinator( mActivity, - new ScrimCoordinator.SystemUiScrimDelegate() { - @Override - public void setStatusBarScrimFraction( - float scrimFraction) {} - - @Override - public void setNavigationBarScrimFraction( - float scrimFraction) {} - }, + /* systemUiScrimDelegate= */ null, activityContentView, Color.WHITE); mBottomSheetController =
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerTest.java index 7cb0138..e7229ec 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerTest.java
@@ -218,7 +218,13 @@ tabContentManagerSupplier.set(tabContentManager); mManager = mManagerPhone; CompositorAnimationHandler.setTestingMode(true); - mManager.init(mTabModelSelector, null, null, null, mTopUiThemeColorProvider, () -> 0); + mManager.init( + mTabModelSelector, + null, + null, + null, + mTopUiThemeColorProvider, + new ObservableSupplierImpl<>(0)); initializeMotionEvent(); }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/sensitive_content/SensitiveContentTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/sensitive_content/SensitiveContentTest.java index 34a1f5b..b10fd24 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/sensitive_content/SensitiveContentTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/sensitive_content/SensitiveContentTest.java
@@ -732,7 +732,12 @@ tabContentManagerSupplier.set(tabContentManager); CompositorAnimationHandler.setTestingMode(true); mLayoutManagerChromePhone.init( - mTabModelSelector, null, null, null, mTopUiThemeColorProvider, () -> 0); + mTabModelSelector, + null, + null, + null, + mTopUiThemeColorProvider, + new ObservableSupplierImpl<>(0)); } /**
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/autofill/vcn/AutofillVcnEnrollBottomSheetLifecycleTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/autofill/vcn/AutofillVcnEnrollBottomSheetLifecycleTest.java index ff0c24e..8207c2b 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/autofill/vcn/AutofillVcnEnrollBottomSheetLifecycleTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/autofill/vcn/AutofillVcnEnrollBottomSheetLifecycleTest.java
@@ -17,10 +17,12 @@ import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.junit.MockitoJUnit; import org.mockito.junit.MockitoRule; +import org.chromium.base.Callback; import org.chromium.base.CallbackUtils; import org.chromium.base.supplier.ObservableSupplier; import org.chromium.base.test.BaseRobolectricTestRunner; @@ -40,6 +42,7 @@ @Mock private LayoutStateProvider mLayoutStateProvider; @Mock private ObservableSupplier<TabModelSelector> mTabModelSelectorSupplier; + @Mock private ObservableSupplier<TabModel> mCurrentTabModelSupplier; @Mock private TabModelSelector mTabModelSelector; @Mock private TabModel mTabModel; @Mock private TabModel mNewTabModel; @@ -110,10 +113,17 @@ mLifecycle.begin(this::notifyObserverAboutLifecycleEnd); when(mTabModelSelector.getCurrentModel()).thenReturn(mTabModel); when(mTabModel.index()).thenReturn(0); + when(mTabModelSelector.getCurrentTabModelSupplier()).thenReturn(mCurrentTabModelSupplier); mLifecycle.onResult(mTabModelSelector); - mLifecycle.onTabModelSelected(/* newModel= */ mNewTabModel, /* oldModel= */ mTabModel); + ArgumentCaptor<Callback<TabModel>> currentTabModelObserverCaptor = + ArgumentCaptor.forClass(Callback.class); + verify(mCurrentTabModelSupplier).addObserver(currentTabModelObserverCaptor.capture()); + currentTabModelObserverCaptor.getValue().onResult(mTabModel); + assertFalse(mObserverWasNotifiedAboutLifecycleEnd); + + currentTabModelObserverCaptor.getValue().onResult(mNewTabModel); assertTrue(mObserverWasNotifiedAboutLifecycleEnd); verifyNoInteractions(mNewTabModel); } @@ -123,12 +133,19 @@ mLifecycle.begin(this::notifyObserverAboutLifecycleEnd); when(mTabModelSelector.getCurrentModel()).thenReturn(mTabModel); when(mTabModel.index()).thenReturn(-1); + when(mTabModelSelector.getCurrentTabModelSupplier()).thenReturn(mCurrentTabModelSupplier); mLifecycle.onResult(mTabModelSelector); - mLifecycle.onTabModelSelected(/* newModel= */ mNewTabModel, /* oldModel= */ mTabModel); + ArgumentCaptor<Callback<TabModel>> currentTabModelObserverCaptor = + ArgumentCaptor.forClass(Callback.class); + verify(mCurrentTabModelSupplier).addObserver(currentTabModelObserverCaptor.capture()); + currentTabModelObserverCaptor.getValue().onResult(mTabModel); assertFalse(mObserverWasNotifiedAboutLifecycleEnd); - verify(mNewTabModel).addObserver(eq(mLifecycle)); + + currentTabModelObserverCaptor.getValue().onResult(mNewTabModel); + assertTrue(mObserverWasNotifiedAboutLifecycleEnd); + verifyNoInteractions(mNewTabModel); } @Test
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/compositor/CompositorViewHolderUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/compositor/CompositorViewHolderUnitTest.java index 7d3834f8..e24084bd 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/compositor/CompositorViewHolderUnitTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/compositor/CompositorViewHolderUnitTest.java
@@ -219,7 +219,8 @@ mCompositorViewHolder.setCompositorViewForTesting(mCompositorView); mCompositorViewHolder.setBrowserControlsManager(mBrowserControlsManager); mCompositorViewHolder.setApplicationViewportInsetSupplier(mViewportInsets); - mCompositorViewHolder.onFinishNativeInitialization(mTabModelSelector, null, () -> 0); + mCompositorViewHolder.onFinishNativeInitialization( + mTabModelSelector, null, new ObservableSupplierImpl<>(0)); when(mCompositorViewHolder.getCurrentTab()).thenReturn(mTab); when(mCompositorViewHolder.getRootWindowInsets()) .thenReturn(VISIBLE_SYSTEM_BARS_WINDOW_INSETS.toWindowInsets());
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelperTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelperTest.java index 736258c2..6aa77b6 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelperTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelperTest.java
@@ -1868,7 +1868,7 @@ }) public void testOnLongPress_OnTab() { onLongPress_OnTab(); - // Verify we directly enter reorder mode.SS + // Verify we directly enter reorder mode. assertTrue( "Should be in reorder mode after long press on tab.", mStripLayoutHelper.getInReorderModeForTesting()); @@ -3007,7 +3007,7 @@ // Assume the drop is unsuccessful; the tab and the tab group will be restored to its // original position. - mStripLayoutHelper.clearTabDragState(); + mStripLayoutHelper.stopReorderMode(); } @Test @@ -3028,7 +3028,7 @@ // Assume the drop is unsuccessful; the tab and the tab group will be restored to its // original position. - mStripLayoutHelper.clearTabDragState(); + mStripLayoutHelper.stopReorderMode(); } @Test @@ -4359,26 +4359,29 @@ StripLayoutTab theClickedTab = tabs[5]; // Clean active tab environment and ensure. - mStripLayoutHelper.clearTabDragState(); - assertTrue( - "Dragged Tab should be empty before drag action.", - mStripLayoutHelper.getActiveClickedTabForTesting() == null); + mStripLayoutHelper.stopReorderMode(); + assertFalse( + "Reorder should not be in progress.", + mStripLayoutHelper.getInReorderModeForTesting()); // Act and verify. mStripLayoutHelper.startDragAndDropTabForTesting(theClickedTab, DRAG_START_POINT); verify(mTabDragSource, times(1)) .startTabDragAction(any(), any(), any(), anyFloat(), anyFloat()); - assertTrue( - "Tab being dragged should exist during drag action.", - mStripLayoutHelper.getActiveClickedTabForTesting() != null); + // TODO(crbug.com/381285152): Reenable check once SourceViewDragDropReorderStrategy + // implementation is complete. + // assertTrue( + // "Drag action should initiate reorder.", + // mStripLayoutHelper.getInReorderModeForTesting()); assertTrue( "Dragged Tab should match selected tab during drag action.", - mStripLayoutHelper.getActiveClickedTabForTesting() == theClickedTab); - mStripLayoutHelper.clearTabDragState(); - assertTrue( - "Dragged Tab should be cleared at the end of drag action.", - mStripLayoutHelper.getActiveClickedTabForTesting() == null); + mStripLayoutHelper.getReorderDelegateForTesting().getInteractingTab() + == theClickedTab); + mStripLayoutHelper.stopReorderMode(); + assertFalse( + "Reorder should not be in progress.", + mStripLayoutHelper.getInReorderModeForTesting()); } @Test @@ -4401,7 +4404,7 @@ assertNull("Should not be animating.", mStripLayoutHelper.getRunningAnimatorForTesting()); // Act and verify. - mStripLayoutHelper.clearTabDragState(); + mStripLayoutHelper.stopReorderMode(); assertNotNull("Should be animating.", mStripLayoutHelper.getRunningAnimatorForTesting()); }
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/compositor/overlays/strip/TabDragSourceTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/compositor/overlays/strip/TabDragSourceTest.java index 4321af21..6c203f4 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/compositor/overlays/strip/TabDragSourceTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/compositor/overlays/strip/TabDragSourceTest.java
@@ -541,13 +541,11 @@ // Strip prepares for drop on drag enter. verify(mSourceStripLayoutHelper, times(1)) .prepareForTabDrop(anyFloat(), anyFloat(), anyBoolean(), anyBoolean()); - // Stop reorder on drop. - verify(mSourceStripLayoutHelper, times(1)).stopReorderMode(); + // Stop reorder on drop and drag end. + verify(mSourceStripLayoutHelper, times(2)).stopReorderMode(); // Verify tab is not moved. verify(mSourceMultiInstanceManager, times(0)).moveTabToNewWindow(mTabBeingDragged); verify(mSourceMultiInstanceManager, times(0)).moveTabToWindow(any(), any(), anyInt()); - // Verify clear. - verify(mSourceStripLayoutHelper, times(1)).clearTabDragState(); // Verify destination strip not invoked. verifyNoInteractions(mDestStripLayoutHelper); histogramExpectation.assertExpected(); @@ -585,7 +583,7 @@ verify(mSourceMultiInstanceManager, times(0)).moveTabToNewWindow(mTabBeingDragged); verify(mSourceMultiInstanceManager, times(0)).moveTabToWindow(any(), any(), anyInt()); // Verify tab cleared. - verify(mSourceStripLayoutHelper, times(1)).clearTabDragState(); + verify(mSourceStripLayoutHelper, times(1)).stopReorderMode(); // Verify destination strip not invoked. verifyNoInteractions(mDestStripLayoutHelper); histogramExpectation.assertExpected(); @@ -615,7 +613,7 @@ verify(mSourceMultiInstanceManager, times(0)).moveTabToNewWindow(mTabBeingDragged); verify(mSourceMultiInstanceManager, times(0)).moveTabToWindow(any(), any(), anyInt()); // Verify tab cleared. - verify(mSourceStripLayoutHelper, times(1)).clearTabDragState(); + verify(mSourceStripLayoutHelper, times(1)).stopReorderMode(); // Verify destination strip not invoked. verifyNoInteractions(mDestStripLayoutHelper); histogramExpectation.assertExpected(); @@ -665,7 +663,7 @@ // Chrome Window. verify(mSourceMultiInstanceManager, times(1)).moveTabToNewWindow(mTabBeingDragged); // Verify tab cleared. - verify(mSourceStripLayoutHelper, times(1)).clearTabDragState(); + verify(mSourceStripLayoutHelper, times(1)).stopReorderMode(); // Verify destination strip not invoked. verifyNoInteractions(mDestStripLayoutHelper); } @@ -809,7 +807,7 @@ verify(mDestMultiInstanceManager, times(1)) .moveTabToWindow(any(), eq(mTabBeingDragged), eq(TAB_INDEX)); // Verify tab cleared. - verify(mSourceStripLayoutHelper, times(1)).clearTabDragState(); + verify(mSourceStripLayoutHelper, times(1)).stopReorderMode(); // Verify destination strip calls. verify(mDestStripLayoutHelper) .prepareForTabDrop(anyFloat(), anyFloat(), anyBoolean(), anyBoolean()); @@ -910,7 +908,7 @@ verify(mSourceMultiInstanceManager, times(0)).moveTabToNewWindow(mTabBeingDragged); verify(mSourceMultiInstanceManager, times(0)).moveTabToWindow(any(), any(), anyInt()); // Verify tab cleared. - verify(mSourceStripLayoutHelper, times(1)).clearTabDragState(); + verify(mSourceStripLayoutHelper, times(1)).stopReorderMode(); histogramExpectation.assertExpected(); } @@ -939,13 +937,11 @@ // Strip prepares for drop on drag enter. Entered twice. verify(mSourceStripLayoutHelper, times(2)) .prepareForTabDrop(anyFloat(), anyFloat(), anyBoolean(), anyBoolean()); - // Stop reorder on drop. - verify(mSourceStripLayoutHelper, times(1)).stopReorderMode(); + // Stop reorder on drop and drag end. + verify(mSourceStripLayoutHelper, times(2)).stopReorderMode(); // Verify tab is not moved. verify(mSourceMultiInstanceManager, times(0)).moveTabToNewWindow(mTabBeingDragged); verify(mSourceMultiInstanceManager, times(0)).moveTabToWindow(any(), any(), anyInt()); - // Verify clear. - verify(mSourceStripLayoutHelper, times(1)).clearTabDragState(); // Verify destination strip not invoked. verifyNoInteractions(mDestStripLayoutHelper); histogramExpectation.assertExpected();
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/privacy_sandbox/PrivacySandboxSurveyControllerTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/privacy_sandbox/PrivacySandboxSurveyControllerTest.java index efe90fec..73dd0e4d 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/privacy_sandbox/PrivacySandboxSurveyControllerTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/privacy_sandbox/PrivacySandboxSurveyControllerTest.java
@@ -62,6 +62,7 @@ manifest = Config.NONE, shadows = {ShadowPostTask.class}) @Features.EnableFeatures(ChromeFeatureList.PRIVACY_SANDBOX_SENTIMENT_SURVEY) +@Features.DisableFeatures(ChromeFeatureList.PRIVACY_SANDBOX_CCT_ADS_NOTICE_SURVEY) public class PrivacySandboxSurveyControllerTest { @Rule public MockitoRule mMockitoRule = MockitoJUnit.rule(); @@ -134,6 +135,23 @@ } @Test + @Features.EnableFeatures(ChromeFeatureList.PRIVACY_SANDBOX_CCT_ADS_NOTICE_SURVEY) + @Features.DisableFeatures(ChromeFeatureList.PRIVACY_SANDBOX_SENTIMENT_SURVEY) + public void surveyControllerInitalizedWhenAdsCctNoticeFeatureEnabled() { + setSurveyConfigForceUsingTestingConfig(true); + PrivacySandboxSurveyController controller = + PrivacySandboxSurveyController.initialize( + mTabModelSelector, + mActivityLifecycleDispatcher, + mActivity, + mMessageDispatcher, + mActivityTabProvider, + mProfile); + Assert.assertNotNull(controller); + controller.destroy(); + } + + @Test public void surveyControllerDoesNotInitializesForOtrProfiles() { when(mProfile.isOffTheRecord()).thenReturn(true); PrivacySandboxSurveyController controller =
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/tab/tab_restore/HistoricalTabModelObserverUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/tab/tab_restore/HistoricalTabModelObserverUnitTest.java index 3b90650..bdac47b 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/tab/tab_restore/HistoricalTabModelObserverUnitTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/tab/tab_restore/HistoricalTabModelObserverUnitTest.java
@@ -10,6 +10,7 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; @@ -36,8 +37,12 @@ import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.tab.MockTab; import org.chromium.chrome.browser.tab.Tab; +import org.chromium.chrome.browser.tab_group_sync.TabGroupSyncServiceFactory; import org.chromium.chrome.browser.tabmodel.TabGroupModelFilter; import org.chromium.chrome.browser.tabmodel.TabModel; +import org.chromium.components.tab_group_sync.LocalTabGroupId; +import org.chromium.components.tab_group_sync.SavedTabGroup; +import org.chromium.components.tab_group_sync.TabGroupSyncService; import org.chromium.components.tab_groups.TabGroupColorId; import java.util.ArrayList; @@ -50,29 +55,39 @@ /** Unit tests for {@link HistoricalTabModelObserver}. */ @RunWith(BaseRobolectricTestRunner.class) public class HistoricalTabModelObserverUnitTest { + private static final String COLLABORATION_ID = "collab_id"; + @Rule public MockitoRule mMockitoRule = MockitoJUnit.rule(); - private Context mContext; @Mock private TabGroupModelFilter mTabGroupModelFilter; @Mock private TabModel mTabModel; @Mock private Profile mProfile; @Mock private HistoricalTabSaver mHistoricalTabSaver; + @Mock private TabGroupSyncService mTabGroupSyncService; + private Context mContext; private HistoricalTabModelObserver mObserver; + private SavedTabGroup mSavedTabGroup; @Before public void setUp() { + TabGroupSyncServiceFactory.setForTesting(mTabGroupSyncService); + when(mTabGroupModelFilter.isTabGroupHiding(any())).thenReturn(false); when(mTabGroupModelFilter.isTabInTabGroup(any())).thenReturn(false); when(mTabGroupModelFilter.getRelatedTabCountForRootId(anyInt())).thenReturn(-1); when(mTabGroupModelFilter.getTabModel()).thenReturn(mTabModel); when(mTabModel.getComprehensiveModel()).thenReturn(mTabModel); + when(mTabModel.getProfile()).thenReturn(mProfile); mObserver = new HistoricalTabModelObserver(mTabGroupModelFilter, mHistoricalTabSaver); verify(mTabGroupModelFilter).addObserver(mObserver); mContext = spy(ContextUtils.getApplicationContext()); ContextUtils.initApplicationContextForTests(mContext); + + mSavedTabGroup = new SavedTabGroup(); + when(mTabGroupSyncService.getGroup(any(LocalTabGroupId.class))).thenReturn(mSavedTabGroup); } @After @@ -247,6 +262,103 @@ } @Test + public void testSkipsCollaboration_WholeGroup() { + MockTab mockTab0 = createMockTab(0); + MockTab mockTab1 = createMockTab(1); + + final String title = "foo"; + @TabGroupColorId int color = TabGroupColorId.GREY; + Token tabGroupId = new Token(3L, 4L); + createGroup(tabGroupId, title, color, new MockTab[] {mockTab0, mockTab1}); + when(mTabGroupModelFilter.getLazyAllTabGroupIdsInComprehensiveModel(any())) + .thenReturn(LazyOneshotSupplier.fromValue(new HashSet<>())); + + mSavedTabGroup.collaborationId = COLLABORATION_ID; + + MockTab[] tabList = new MockTab[] {mockTab0, mockTab1}; + mObserver.onFinishingMultipleTabClosure(Arrays.asList(tabList), /* canRestore= */ true); + + ArgumentCaptor<List<HistoricalEntry>> arg = ArgumentCaptor.forClass((Class) List.class); + verify(mHistoricalTabSaver).createHistoricalBulkClosure(arg.capture()); + List<HistoricalEntry> entries = arg.getValue(); + assertEquals(0, entries.size()); + } + + @Test + public void testDoesNotSkipCollaborationTabs_PartialGroup() { + MockTab mockTab0 = createMockTab(0); + MockTab mockTab1 = createMockTab(1); + MockTab mockTab2 = createMockTab(2); + + final String title = "foo"; + @TabGroupColorId int color = TabGroupColorId.GREY; + Token tabGroupId = new Token(3L, 4L); + createGroup(tabGroupId, title, color, new MockTab[] {mockTab0, mockTab1, mockTab2}); + when(mTabGroupModelFilter.getLazyAllTabGroupIdsInComprehensiveModel(any())) + .thenReturn(LazyOneshotSupplier.fromValue(Set.of(tabGroupId))); + + mSavedTabGroup.collaborationId = COLLABORATION_ID; + + MockTab[] tabList = new MockTab[] {mockTab0, mockTab1}; + mObserver.onFinishingMultipleTabClosure(Arrays.asList(tabList), /* canRestore= */ true); + + ArgumentCaptor<List<HistoricalEntry>> arg = ArgumentCaptor.forClass((Class) List.class); + verify(mHistoricalTabSaver).createHistoricalBulkClosure(arg.capture()); + List<HistoricalEntry> entries = arg.getValue(); + assertEquals(2, entries.size()); + HistoricalEntry entryTab1 = entries.get(0); + HistoricalEntry entryTab2 = entries.get(1); + assertTrue(entryTab1.isSingleTab()); + assertTrue(entryTab2.isSingleTab()); + assertEquals(mockTab0, entryTab1.getTabs().get(0)); + assertEquals(mockTab1, entryTab2.getTabs().get(0)); + } + + @Test + public void testDoesNotSkipCollaborationTabs_SingleTabFromGroup() { + MockTab mockTab0 = createMockTab(0); + MockTab mockTab1 = createMockTab(1); + + final String title = "foo"; + @TabGroupColorId int color = TabGroupColorId.GREY; + Token tabGroupId = new Token(3L, 4L); + createGroup(tabGroupId, title, color, new MockTab[] {mockTab0, mockTab1}); + when(mTabGroupModelFilter.getLazyAllTabGroupIdsInComprehensiveModel(any())) + .thenReturn(LazyOneshotSupplier.fromValue(Set.of(tabGroupId))); + + mSavedTabGroup.collaborationId = COLLABORATION_ID; + + MockTab[] tabList = new MockTab[] {mockTab0}; + mObserver.onFinishingMultipleTabClosure(Arrays.asList(tabList), /* canRestore= */ true); + + verify(mHistoricalTabSaver).createHistoricalTab(mockTab0); + verify(mHistoricalTabSaver, never()).createHistoricalBulkClosure(any()); + } + + @Test + public void testSkipsCollaborationTabs_EntireSingleTabGroup() { + MockTab mockTab0 = createMockTab(0); + + final String title = "foo"; + @TabGroupColorId int color = TabGroupColorId.GREY; + Token tabGroupId = new Token(3L, 4L); + createGroup(tabGroupId, title, color, new MockTab[] {mockTab0}); + when(mTabGroupModelFilter.getLazyAllTabGroupIdsInComprehensiveModel(any())) + .thenReturn(LazyOneshotSupplier.fromValue(new HashSet<Token>())); + + mSavedTabGroup.collaborationId = COLLABORATION_ID; + + MockTab[] tabList = new MockTab[] {mockTab0}; + mObserver.onFinishingMultipleTabClosure(Arrays.asList(tabList), /* canRestore= */ true); + + verify(mHistoricalTabSaver, never()).createHistoricalTab(any()); + ArgumentCaptor<List<HistoricalEntry>> arg = ArgumentCaptor.forClass((Class) List.class); + verify(mHistoricalTabSaver).createHistoricalBulkClosure(arg.capture()); + List<HistoricalEntry> entries = arg.getValue(); + assertEquals(0, entries.size()); + } + + @Test public void testSingleTabInGroup() { MockTab mockTab0 = createMockTab(0); MockTab mockTab1 = createMockTab(1);
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/tabmodel/TabModelSelectorImplTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/tabmodel/TabModelSelectorImplTest.java index c1d900cf..55a819d 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/tabmodel/TabModelSelectorImplTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/tabmodel/TabModelSelectorImplTest.java
@@ -349,13 +349,12 @@ * A test method to verify that {@link * IncognitoReauthDialogDelegate#OnBeforeIncognitoTabModelSelected} gets called before any other * {@link TabModelSelectorObserver} listening to {@link - * TabModelSelectorObserver#onTabModelSelected}. + * TabModelSelectorObserver#getCurrentTabModelSupplier}. */ @Test public void testIncognitoReauthDialogDelegate_OnBeforeIncognitoTabModelSelected_called_Before() { doNothing().when(mIncognitoReauthDialogDelegateMock).onBeforeIncognitoTabModelSelected(); - doNothing().when(mTabModelSelectorObserverMock).onTabModelSelected(any(), any()); doNothing().when(mTabModelSupplierObserverMock).onResult(any()); mTabModelSelector.setIncognitoReauthDialogDelegate(mIncognitoReauthDialogDelegateMock); mTabModelSelector.addObserver(mTabModelSelectorObserverMock); @@ -372,7 +371,6 @@ order.verify(mIncognitoReauthDialogDelegateMock).onBeforeIncognitoTabModelSelected(); order.verify(mTabModelSupplierObserverMock).onResult(any()); - order.verify(mTabModelSelectorObserverMock).onTabModelSelected(any(), any()); mTabModelSelector .getCurrentTabModelSupplier() @@ -402,12 +400,11 @@ verify(mTabModelSupplierObserverMock).onResult(any()); doNothing().when(mIncognitoReauthDialogDelegateMock).onAfterRegularTabModelChanged(); - doNothing().when(mTabModelSelectorObserverMock).onTabModelSelected(any(), any()); doNothing().when(mTabModelSelectorObserverMock).onChange(); InOrder order = inOrder(mTabModelSelectorObserverMock, mIncognitoReauthDialogDelegateMock); + verify(mTabModelSupplierObserverMock).onResult(any()); mTabModelSelector.selectModel(/* incognito= */ false); - verify(mTabModelSelectorObserverMock).onTabModelSelected(any(), any()); verify(mTabModelSupplierObserverMock, times(2)).onResult(any()); // The onChange method below is posted as a task to the main looper, and therefore we need
diff --git a/chrome/app/chromeos_strings.grdp b/chrome/app/chromeos_strings.grdp index e1dfa41..64436fc3 100644 --- a/chrome/app/chromeos_strings.grdp +++ b/chrome/app/chromeos_strings.grdp
@@ -3319,6 +3319,9 @@ <message name="IDS_ENTERPRISE_ENROLLMENT_INVALID_PACKAGED_DEVICE_FOR_KIOSK" desc="Error message to show when the user tries to enroll an enterprise license packaged device into KIOSK."> This is a bundled device and can not be enrolled with Kiosk & Signage Upgrade. </message> + <message name="IDS_ENTERPRISE_ENROLLMENT_ORG_UNIT_ENROLLMENT_LIMIT_EXCEEDED" desc="Error message to show when the user tries to enroll a device but the initial enrollment limit for the organization unit has been reached."> + This device can't be enrolled right now because your organization unit has reached its initial enrollment limit. Contact your administrator for assistance. + </message> <message name="IDS_ENTERPRISE_ENROLLMENT_ATTRIBUTE_ERROR" desc="Error message shown when successfully enrolled, but the device attribute update has failed."> Your <ph name="DEVICE_TYPE">$1<ex>Chromebook</ex></ph> has successfully been enrolled for enterprise management, but failed to send its asset and location information. Please manually enter this information from your Admin console for this device. </message>
diff --git a/chrome/app/chromeos_strings_grdp/IDS_ENTERPRISE_ENROLLMENT_ORG_UNIT_ENROLLMENT_LIMIT_EXCEEDED.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_ENTERPRISE_ENROLLMENT_ORG_UNIT_ENROLLMENT_LIMIT_EXCEEDED.png.sha1 new file mode 100644 index 0000000..e867d83 --- /dev/null +++ b/chrome/app/chromeos_strings_grdp/IDS_ENTERPRISE_ENROLLMENT_ORG_UNIT_ENROLLMENT_LIMIT_EXCEEDED.png.sha1
@@ -0,0 +1 @@ +69598262035ee9fa0e0e2e6cfed1fcda9553886d \ No newline at end of file
diff --git a/chrome/app/shared_settings_strings.grdp b/chrome/app/shared_settings_strings.grdp index 419f16b..d139e827d 100644 --- a/chrome/app/shared_settings_strings.grdp +++ b/chrome/app/shared_settings_strings.grdp
@@ -435,6 +435,9 @@ <message name="IDS_SETTINGS_SYNC_SETUP_CANCEL_DIALOG_BODY" desc="The body text of the dialog to confirm the sync cancellation."> You can turn on sync anytime in settings </message> + <message name="IDS_SYNC_UNAVAILABLE_FOR_NON_GOOGLE_ACCOUNT" desc="Text explaining that Sync service is unavailable for Dasherless profile."> + This account isn't associated with Google so features such as Chrome sync are unavailable + </message> <if expr="is_chromeos"> <message name="IDS_BROWSER_SETTINGS_SYNC_FEATURE_LABEL" desc="Label describing the browser sync feature.">
diff --git a/chrome/app/shared_settings_strings_grdp/IDS_SYNC_UNAVAILABLE_FOR_NON_GOOGLE_ACCOUNT.png.sha1 b/chrome/app/shared_settings_strings_grdp/IDS_SYNC_UNAVAILABLE_FOR_NON_GOOGLE_ACCOUNT.png.sha1 new file mode 100644 index 0000000..f33961c6 --- /dev/null +++ b/chrome/app/shared_settings_strings_grdp/IDS_SYNC_UNAVAILABLE_FOR_NON_GOOGLE_ACCOUNT.png.sha1
@@ -0,0 +1 @@ +9d9ae6f6d65f46723aacaeee4f7df667d72f6b0b \ No newline at end of file
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc index 1acd68a..01608d7 100644 --- a/chrome/browser/about_flags.cc +++ b/chrome/browser/about_flags.cc
@@ -2065,28 +2065,15 @@ std::size(kContextualSearchSuppressShortViewWith600Dp), nullptr}, }; -const FeatureEntry::FeatureParam kRichAutocompletionFullUrlThreeMinChar[] = { - {"rich_autocomplete_full_url", "true"}, - {"rich_autocomplete_minimum_characters", "3"}}; -const FeatureEntry::FeatureParam kRichAutocompletionNoFullUrlThreeMinChar[] = { - {"rich_autocomplete_full_url", "false"}, - {"rich_autocomplete_minimum_characters", "3"}}; -const FeatureEntry::FeatureParam kRichAutocompletionFullUrlFourMinChar[] = { - {"rich_autocomplete_full_url", "true"}, - {"rich_autocomplete_minimum_characters", "4"}}; -const FeatureEntry::FeatureParam kRichAutocompletionNoFullUrlFourMinChar[] = { - {"rich_autocomplete_full_url", "false"}, - {"rich_autocomplete_minimum_characters", "4"}}; +const FeatureEntry::FeatureParam kRichAutocompletionFullUrl[] = { + {"rich_autocomplete_full_url", "true"}}; +const FeatureEntry::FeatureParam kRichAutocompletionNoFullUrl[] = { + {"rich_autocomplete_full_url", "false"}}; const FeatureEntry::FeatureVariation kRichAutocompletionAndroidVariations[] = { - {"(full url, 3 chars at least)", kRichAutocompletionFullUrlThreeMinChar, - std::size(kRichAutocompletionFullUrlThreeMinChar), nullptr}, - {"(no full url, 3 chars at least)", - kRichAutocompletionNoFullUrlThreeMinChar, - std::size(kRichAutocompletionNoFullUrlThreeMinChar), nullptr}, - {"(full url, 4 chars at least)", kRichAutocompletionFullUrlFourMinChar, - std::size(kRichAutocompletionFullUrlFourMinChar), nullptr}, - {"(no full url, 4 chars at least)", kRichAutocompletionNoFullUrlFourMinChar, - std::size(kRichAutocompletionNoFullUrlFourMinChar), nullptr}, + {"(full url)", kRichAutocompletionFullUrl, + std::size(kRichAutocompletionFullUrl), nullptr}, + {"(no full url)", kRichAutocompletionNoFullUrl, + std::size(kRichAutocompletionNoFullUrl), nullptr}, }; const FeatureEntry::FeatureParam kJumpStartOmnibox1Minute[] = { @@ -4583,9 +4570,6 @@ flag_descriptions::kAshEnableUnifiedDesktopName, flag_descriptions::kAshEnableUnifiedDesktopDescription, kOsCrOS, SINGLE_VALUE_TYPE(switches::kEnableUnifiedDesktop)}, - {"rounded-display", flag_descriptions::kRoundedDisplay, - flag_descriptions::kRoundedDisplayDescription, kOsCrOS, - FEATURE_VALUE_TYPE(display::features::kRoundedDisplay)}, {"rounded-windows", flag_descriptions::kRoundedWindows, flag_descriptions::kRoundedWindowsDescription, kOsCrOS, FEATURE_WITH_PARAMS_VALUE_TYPE(chromeos::features::kRoundedWindows, @@ -6741,13 +6725,6 @@ commerce::flag_descriptions::kProductSpecificationsDescription, kOsDesktop, FEATURE_VALUE_TYPE(commerce::kProductSpecifications)}, - {"product-specifications-multi-specifics", - commerce::flag_descriptions::kProductSpecificationsMultiSpecificsName, - commerce::flag_descriptions:: - kProductSpecificationsMultiSpecificsDescription, - kOsDesktop, - FEATURE_VALUE_TYPE(commerce::kProductSpecificationsMultiSpecifics)}, - {"compare-confirmation-toast", commerce::flag_descriptions::kCompareConfirmationToastName, commerce::flag_descriptions::kCompareConfirmationToastDescription,
diff --git a/chrome/browser/ai/ai_create_on_device_session_task.cc b/chrome/browser/ai/ai_create_on_device_session_task.cc index f46ef145..8ff63228 100644 --- a/chrome/browser/ai/ai_create_on_device_session_task.cc +++ b/chrome/browser/ai/ai_create_on_device_session_task.cc
@@ -5,6 +5,7 @@ #include "chrome/browser/ai/ai_create_on_device_session_task.h" #include "base/containers/fixed_flat_set.h" +#include "base/strings/to_string.h" #include "chrome/browser/ai/ai_context_bound_object.h" #include "chrome/browser/ai/ai_manager.h" #include "chrome/browser/ai/built_in_ai_logger.h" @@ -90,7 +91,7 @@ bool waitable = kWaitableReasons.contains(reason); BUILT_IN_AI_LOGGER() << "Feature '" << feature << "' " << "availability changed due to '" << reason << "'. " - << "Waitable: " << (waitable ? "true" : "false"); + << "Waitable: " << base::ToString(waitable); CHECK(state_ == State::kPending); if (waitable) { return;
diff --git a/chrome/browser/android/customtabs/branding/java/src/org/chromium/chrome/browser/customtabs/features/branding/MismatchNotificationChecker.java b/chrome/browser/android/customtabs/branding/java/src/org/chromium/chrome/browser/customtabs/features/branding/MismatchNotificationChecker.java index 2be8685e..90edf55 100644 --- a/chrome/browser/android/customtabs/branding/java/src/org/chromium/chrome/browser/customtabs/features/branding/MismatchNotificationChecker.java +++ b/chrome/browser/android/customtabs/branding/java/src/org/chromium/chrome/browser/customtabs/features/branding/MismatchNotificationChecker.java
@@ -15,6 +15,7 @@ import org.chromium.chrome.browser.util.HashUtil; import org.chromium.components.feature_engagement.Tracker; import org.chromium.components.signin.base.CoreAccountInfo; +import org.chromium.components.signin.base.GaiaId; import org.chromium.components.signin.identitymanager.ConsentLevel; import org.chromium.components.signin.identitymanager.IdentityManager; @@ -119,9 +120,9 @@ @VisibleForTesting String getAccountId() { CoreAccountInfo account = mIdentityManager.getPrimaryAccountInfo(ConsentLevel.SIGNIN); + GaiaId gaiaId = CoreAccountInfo.getGaiaIdFrom(account); var hash = - HashUtil.getMd5Hash( - new HashUtil.Params(CoreAccountInfo.getGaiaIdFrom(account).toString())); + HashUtil.getMd5Hash(new HashUtil.Params(gaiaId != null ? gaiaId.toString() : null)); return hash.substring(0, 16); }
diff --git a/chrome/browser/android/customtabs/branding/java/src/org/chromium/chrome/browser/customtabs/features/branding/MismatchNotificationCheckerUnitTest.java b/chrome/browser/android/customtabs/branding/java/src/org/chromium/chrome/browser/customtabs/features/branding/MismatchNotificationCheckerUnitTest.java index 72a84e7..009c4b4 100644 --- a/chrome/browser/android/customtabs/branding/java/src/org/chromium/chrome/browser/customtabs/features/branding/MismatchNotificationCheckerUnitTest.java +++ b/chrome/browser/android/customtabs/branding/java/src/org/chromium/chrome/browser/customtabs/features/branding/MismatchNotificationCheckerUnitTest.java
@@ -96,6 +96,15 @@ .assertOtherPromptsSuppressed(false); } + @Test + public void maybeShowWhileSignedOut() { + new MismatchNotificationCheckerTester() + .newChecker() + .signOut() + .callMaybeShowUi(/* shown= */ true, new MismatchNotificationData()) + .assertIphLocked(true); + } + private static class MismatchNotificationCheckerTester { // Mocks private MismatchNotificationChecker.Delegate mDelegate; @@ -147,6 +156,11 @@ return this; } + public MismatchNotificationCheckerTester signOut() { + when(mIdentityManager.getPrimaryAccountInfo(anyInt())).thenReturn(null); + return this; + } + public MismatchNotificationCheckerTester assertOtherPromptsSuppressed(boolean suppressed) { assertEquals(mChecker.shouldSuppressPromptUis(), suppressed); return this;
diff --git a/chrome/browser/ash/accessibility/switch_access_test_utils.cc b/chrome/browser/ash/accessibility/switch_access_test_utils.cc index 9c9baaf..9f7731bfa 100644 --- a/chrome/browser/ash/accessibility/switch_access_test_utils.cc +++ b/chrome/browser/ash/accessibility/switch_access_test_utils.cc
@@ -17,7 +17,7 @@ namespace { constexpr char kTestSupportPath[] = - "chrome/browser/resources/chromeos/accessibility/switch_access/" + "chrome/browser/resources/chromeos/accessibility/switch_access/mv2/" "test_support.js"; } // namespace
diff --git a/chrome/browser/ash/app_list/app_list_client_impl_browsertest.cc b/chrome/browser/ash/app_list/app_list_client_impl_browsertest.cc index fa4b2a1..abe43fe 100644 --- a/chrome/browser/ash/app_list/app_list_client_impl_browsertest.cc +++ b/chrome/browser/ash/app_list/app_list_client_impl_browsertest.cc
@@ -31,6 +31,7 @@ #include "base/path_service.h" #include "base/run_loop.h" #include "base/strings/strcat.h" +#include "base/strings/to_string.h" #include "base/strings/utf_string_conversions.h" #include "base/test/bind.h" #include "base/test/metrics/histogram_tester.h" @@ -1569,7 +1570,7 @@ app_list_features::kAppsCollections, {{"is-counterfactual", "false"}, {"is-modified-order", - IsModifiedOrderExperimentalArm() ? "true" : "false"}}); + base::ToString(IsModifiedOrderExperimentalArm())}}); } ~AppListModifiedDefaultAppOrderTest() override = default;
diff --git a/chrome/browser/ash/app_list/app_list_syncable_service.cc b/chrome/browser/ash/app_list/app_list_syncable_service.cc index 04ad4f36..5247a69 100644 --- a/chrome/browser/ash/app_list/app_list_syncable_service.cc +++ b/chrome/browser/ash/app_list/app_list_syncable_service.cc
@@ -23,6 +23,7 @@ #include "base/one_shot_event.h" #include "base/ranges/algorithm.h" #include "base/strings/string_number_conversions.h" +#include "base/strings/to_string.h" #include "base/task/sequenced_task_runner.h" #include "base/values.h" #include "build/build_config.h" @@ -1822,10 +1823,10 @@ if (!parent_id.empty()) { res += " <" + parent_id.substr(0, 8) + ">"; } - res += " [" + item_pin_ordinal.ToDebugString() + "(up=" + - (is_user_pinned.has_value() ? (*is_user_pinned ? "true" : "false") - : "?") + - ")]"; + res += + " [" + item_pin_ordinal.ToDebugString() + "(up=" + + (is_user_pinned.has_value() ? base::ToString(*is_user_pinned) : "?") + + ")]"; } if (item_color.IsValid()) {
diff --git a/chrome/browser/ash/app_list/launcher_continue_section_browsertest.cc b/chrome/browser/ash/app_list/launcher_continue_section_browsertest.cc index 8cdc33e..32fa7501 100644 --- a/chrome/browser/ash/app_list/launcher_continue_section_browsertest.cc +++ b/chrome/browser/ash/app_list/launcher_continue_section_browsertest.cc
@@ -13,6 +13,7 @@ #include "ash/public/cpp/test/app_list_test_api.h" #include "ash/public/cpp/test/shell_test_api.h" #include "base/files/file_path.h" +#include "base/strings/to_string.h" #include "base/task/single_thread_task_runner.h" #include "base/test/bind.h" #include "base/test/scoped_feature_list.h" @@ -120,8 +121,7 @@ LauncherContinueSectionTest() { scoped_feature_list_.InitWithFeaturesAndParameters( {{ash::features::kLauncherContinueSectionWithRecentsRollout, - {{"mix_local_and_drive", - MixLocalAndDriveFiles() ? "true" : "false"}}}, + {{"mix_local_and_drive", base::ToString(MixLocalAndDriveFiles())}}}, {ash::features::kShowSharingUserInLauncherContinueSection, {}}}, {}); }
diff --git a/chrome/browser/ash/app_mode/BUILD.gn b/chrome/browser/ash/app_mode/BUILD.gn index 6c12ef2..8186ca2 100644 --- a/chrome/browser/ash/app_mode/BUILD.gn +++ b/chrome/browser/ash/app_mode/BUILD.gn
@@ -258,7 +258,6 @@ "kiosk_crash_restore_browsertest.cc", "kiosk_guest_view_browsertest.cc", "kiosk_network_state_observer_browsertest.cc", - "kiosk_system_web_app_browsertest.cc", "kiosk_troubleshooting_tools_browsertest.cc", ] deps = [
diff --git a/chrome/browser/ash/app_mode/kiosk_system_web_app_browsertest.cc b/chrome/browser/ash/app_mode/kiosk_system_web_app_browsertest.cc deleted file mode 100644 index b4d2b31..0000000 --- a/chrome/browser/ash/app_mode/kiosk_system_web_app_browsertest.cc +++ /dev/null
@@ -1,68 +0,0 @@ -// Copyright 2023 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "ash/constants/ash_features.h" -#include "chrome/browser/ash/login/app_mode/test/web_kiosk_base_test.h" -#include "chrome/browser/ash/system_web_apps/system_web_app_manager.h" -#include "chrome/browser/ash/system_web_apps/test_support/test_system_web_app_installation.h" -#include "chrome/browser/ui/ash/system_web_apps/system_web_app_ui_utils.h" -#include "chrome/browser/ui/browser_list.h" -#include "content/public/test/browser_test.h" -#include "content/public/test/test_navigation_observer.h" - -namespace ash { - -class KioskSystemWebAppTestDisabled : public WebKioskBaseTest { - public: - KioskSystemWebAppTestDisabled() { SetUpSystemWebApps(); } - KioskSystemWebAppTestDisabled(const KioskSystemWebAppTestDisabled&) = delete; - KioskSystemWebAppTestDisabled& operator=( - const KioskSystemWebAppTestDisabled&) = delete; - - protected: - void SetUpSystemWebApps() { - installation_ = - TestSystemWebAppInstallation::SetUpStandaloneSingleWindowApp(); - } - std::unique_ptr<TestSystemWebAppInstallation> installation_; -}; - -class KioskSystemWebAppTestEnabled : public KioskSystemWebAppTestDisabled { - public: - KioskSystemWebAppTestEnabled() { - feature_list_.InitAndEnableFeature( - ash::features::kKioskEnableSystemWebApps); - SetUpSystemWebApps(); - } - - KioskSystemWebAppTestEnabled(const KioskSystemWebAppTestEnabled&) = delete; - KioskSystemWebAppTestEnabled& operator=(const KioskSystemWebAppTestEnabled&) = - delete; - - protected: - base::test::ScopedFeatureList feature_list_; -}; - -IN_PROC_BROWSER_TEST_F(KioskSystemWebAppTestDisabled, - ShouldNotLaunchSystemWebApp) { - InitializeRegularOnlineKiosk(); - EXPECT_EQ(SystemWebAppManager::Get(profile()), nullptr); -} - -IN_PROC_BROWSER_TEST_F(KioskSystemWebAppTestEnabled, LaunchSystemWebApp) { - InitializeRegularOnlineKiosk(); - ASSERT_TRUE(SystemWebAppManager::Get(profile())); - installation_->WaitForAppInstall(); - - content::TestNavigationObserver navigation_observer( - installation_->GetAppUrl()); - navigation_observer.StartWatchingNewWebContents(); - LaunchSystemWebAppAsync(profile(), installation_->GetType()); - navigation_observer.Wait(); - Browser* swa_browser = - FindSystemWebAppBrowser(profile(), installation_->GetType()); - EXPECT_NE(swa_browser, nullptr); -} - -} // namespace ash
diff --git a/chrome/browser/ash/app_mode/web_app/web_kiosk_browser_controller_ash.cc b/chrome/browser/ash/app_mode/web_app/web_kiosk_browser_controller_ash.cc index a616d839..19f36b6 100644 --- a/chrome/browser/ash/app_mode/web_app/web_kiosk_browser_controller_ash.cc +++ b/chrome/browser/ash/app_mode/web_app/web_kiosk_browser_controller_ash.cc
@@ -9,16 +9,9 @@ WebKioskBrowserControllerAsh::WebKioskBrowserControllerAsh( web_app::WebAppProvider& provider, Browser* browser, - webapps::AppId app_id, - const ash::SystemWebAppDelegate* system_app) - : WebKioskBrowserControllerBase(provider, browser, app_id), - system_app_(system_app) {} + webapps::AppId app_id) + : WebKioskBrowserControllerBase(provider, browser, app_id) {} WebKioskBrowserControllerAsh::~WebKioskBrowserControllerAsh() = default; -const ash::SystemWebAppDelegate* WebKioskBrowserControllerAsh::system_app() - const { - return system_app_; -} - } // namespace ash
diff --git a/chrome/browser/ash/app_mode/web_app/web_kiosk_browser_controller_ash.h b/chrome/browser/ash/app_mode/web_app/web_kiosk_browser_controller_ash.h index c965418..ff6e71b 100644 --- a/chrome/browser/ash/app_mode/web_app/web_kiosk_browser_controller_ash.h +++ b/chrome/browser/ash/app_mode/web_app/web_kiosk_browser_controller_ash.h
@@ -11,26 +11,19 @@ namespace ash { -class SystemWebAppDelegate; - // Applies web Kiosk restrictions to the browser in Ash. class WebKioskBrowserControllerAsh : public chromeos::WebKioskBrowserControllerBase { public: WebKioskBrowserControllerAsh(web_app::WebAppProvider& provider, Browser* browser, - webapps::AppId app_id, - const ash::SystemWebAppDelegate* system_app); + webapps::AppId app_id); + WebKioskBrowserControllerAsh(const WebKioskBrowserControllerAsh&) = delete; WebKioskBrowserControllerAsh& operator=(const WebKioskBrowserControllerAsh&) = delete; ~WebKioskBrowserControllerAsh() override; - const ash::SystemWebAppDelegate* system_app() const override; - - private: - // The system app (if any) associated with the WebContents we're in. - raw_ptr<const ash::SystemWebAppDelegate> system_app_ = nullptr; }; } // namespace ash
diff --git a/chrome/browser/ash/arc/extensions/fake_arc_support.cc b/chrome/browser/ash/arc/extensions/fake_arc_support.cc index 96b57659..2d5a926 100644 --- a/chrome/browser/ash/arc/extensions/fake_arc_support.cc +++ b/chrome/browser/ash/arc/extensions/fake_arc_support.cc
@@ -12,6 +12,7 @@ #include "base/json/json_reader.h" #include "base/json/json_writer.h" #include "base/notreached.h" +#include "base/strings/to_string.h" #include "base/values.h" #include "chrome/browser/ash/arc/extensions/arc_support_message_host.h" #include "chrome/browser/profiles/profile.h" @@ -112,7 +113,7 @@ DCHECK(native_message_host_); native_message_host_->OnMessage( base::StrCat({"{\"event\": \"onTosLoadResult\", \"success\": ", - success ? "true" : "false", "}"})); + base::ToString(success), "}"})); } void FakeArcSupport::AddObserver(Observer* observer) {
diff --git a/chrome/browser/ash/borealis/borealis_task.cc b/chrome/browser/ash/borealis/borealis_task.cc index dd8de2f5..14d68d9 100644 --- a/chrome/browser/ash/borealis/borealis_task.cc +++ b/chrome/browser/ash/borealis/borealis_task.cc
@@ -18,6 +18,7 @@ #include "base/metrics/field_trial_params.h" #include "base/process/launch.h" #include "base/strings/string_number_conversions.h" +#include "base/strings/to_string.h" #include "base/task/sequenced_task_runner.h" #include "base/task/task_traits.h" #include "base/task/thread_pool.h" @@ -352,7 +353,7 @@ std::vector<std::string>& out_command) { out_command.emplace_back( std::string(feature.name) + "=" + - (base::FeatureList::IsEnabled(feature) ? "true" : "false")); + base::ToString(base::FeatureList::IsEnabled(feature))); } // Helper for converting |feature| and |param| of enum type into
diff --git a/chrome/browser/ash/file_manager/cloud_upload_prompt_prefs_handler.cc b/chrome/browser/ash/file_manager/cloud_upload_prompt_prefs_handler.cc index c155010..02afe77 100644 --- a/chrome/browser/ash/file_manager/cloud_upload_prompt_prefs_handler.cc +++ b/chrome/browser/ash/file_manager/cloud_upload_prompt_prefs_handler.cc
@@ -6,12 +6,14 @@ #include <memory> +#include "base/containers/flat_map.h" #include "base/functional/bind.h" #include "base/memory/ptr_util.h" #include "chrome/browser/chromeos/upload_office_to_cloud/upload_office_to_cloud.h" #include "chrome/browser/policy/profile_policy_connector.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/sync/sync_service_factory.h" +#include "chrome/browser/ui/webui/ash/cloud_upload/cloud_upload_util.h" #include "chrome/common/pref_names.h" #include "chromeos/constants/chromeos_features.h" #include "components/pref_registry/pref_registry_syncable.h" @@ -26,6 +28,31 @@ namespace { +// Maps the names of local "move confirmation shown" prefs to the corresponding +// syncable prefs. +const base::flat_map<const char*, + std::pair<const char*, ash::cloud_upload::CloudProvider>> + kMoveConfirmationShownPrefMap = { + {prefs::kOfficeMoveConfirmationShownForDrive, + {prefs::kOfficeMoveConfirmationShownForDriveSyncable, + ash::cloud_upload::CloudProvider::kGoogleDrive}}, + {prefs::kOfficeMoveConfirmationShownForLocalToDrive, + {prefs::kOfficeMoveConfirmationShownForLocalToDriveSyncable, + ash::cloud_upload::CloudProvider::kGoogleDrive}}, + {prefs::kOfficeMoveConfirmationShownForCloudToDrive, + {prefs::kOfficeMoveConfirmationShownForCloudToDriveSyncable, + ash::cloud_upload::CloudProvider::kGoogleDrive}}, + {prefs::kOfficeMoveConfirmationShownForOneDrive, + {prefs::kOfficeMoveConfirmationShownForOneDriveSyncable, + ash::cloud_upload::CloudProvider::kOneDrive}}, + {prefs::kOfficeMoveConfirmationShownForLocalToOneDrive, + {prefs::kOfficeMoveConfirmationShownForLocalToOneDriveSyncable, + ash::cloud_upload::CloudProvider::kOneDrive}}, + {prefs::kOfficeMoveConfirmationShownForCloudToOneDrive, + {prefs::kOfficeMoveConfirmationShownForCloudToOneDriveSyncable, + ash::cloud_upload::CloudProvider::kOneDrive}}, +}; + bool IsProfileEnterpriseManaged(Profile* profile) { return profile->GetProfilePolicyConnector()->IsManaged() && !profile->IsChild(); @@ -68,6 +95,8 @@ void OnOfficeFilesAlwaysMoveToDriveSyncableChanged(); void OnOfficeFilesAlwaysMoveToOneDriveChanged(); void OnOfficeFilesAlwaysMoveToOneDriveSyncableChanged(); + void OnOfficeMoveConfirmationShownChanged(); + void OnOfficeMoveConfirmationShownSyncableChanged(); void OnCloudUploadPrefChanged(); raw_ptr<Profile> profile_ = nullptr; @@ -92,6 +121,24 @@ registry->RegisterBooleanPref( prefs::kOfficeFilesAlwaysMoveToOneDriveSyncable, false, user_prefs::PrefRegistrySyncable::SYNCABLE_OS_PREF); + registry->RegisterBooleanPref( + prefs::kOfficeMoveConfirmationShownForDriveSyncable, false, + user_prefs::PrefRegistrySyncable::SYNCABLE_OS_PREF); + registry->RegisterBooleanPref( + prefs::kOfficeMoveConfirmationShownForOneDriveSyncable, false, + user_prefs::PrefRegistrySyncable::SYNCABLE_OS_PREF); + registry->RegisterBooleanPref( + prefs::kOfficeMoveConfirmationShownForLocalToDriveSyncable, false, + user_prefs::PrefRegistrySyncable::SYNCABLE_OS_PREF); + registry->RegisterBooleanPref( + prefs::kOfficeMoveConfirmationShownForLocalToOneDriveSyncable, false, + user_prefs::PrefRegistrySyncable::SYNCABLE_OS_PREF); + registry->RegisterBooleanPref( + prefs::kOfficeMoveConfirmationShownForCloudToDriveSyncable, false, + user_prefs::PrefRegistrySyncable::SYNCABLE_OS_PREF); + registry->RegisterBooleanPref( + prefs::kOfficeMoveConfirmationShownForCloudToOneDriveSyncable, false, + user_prefs::PrefRegistrySyncable::SYNCABLE_OS_PREF); } // KeyedService: @@ -124,6 +171,20 @@ base::BindRepeating(&CloudUploadPromptPrefsHandler:: OnOfficeFilesAlwaysMoveToOneDriveSyncableChanged, base::Unretained(this))); + + for (const auto& [local_pref, syncable_pref] : + kMoveConfirmationShownPrefMap) { + pref_change_registrar_->Add( + local_pref, + base::BindRepeating(&CloudUploadPromptPrefsHandler:: + OnOfficeMoveConfirmationShownChanged, + base::Unretained(this))); + pref_change_registrar_->Add( + syncable_pref.first, + base::BindRepeating(&CloudUploadPromptPrefsHandler:: + OnOfficeMoveConfirmationShownSyncableChanged, + base::Unretained(this))); + } // TODO(387268733): Initial sync to syncable prefs if needed. pref_change_registrar_->Add( @@ -190,6 +251,43 @@ always_move_syncable); } +void CloudUploadPromptPrefsHandler::OnOfficeMoveConfirmationShownChanged() { + if (!IsProfileEnterpriseManaged(profile_)) { + return; + } + + for (const auto& [local_pref, syncable_pref] : + kMoveConfirmationShownPrefMap) { + bool move_confirmation_shown = profile_->GetPrefs()->GetBoolean(local_pref); + profile_->GetPrefs()->SetBoolean(syncable_pref.first, + move_confirmation_shown); + } +} + +void CloudUploadPromptPrefsHandler:: + OnOfficeMoveConfirmationShownSyncableChanged() { + if (!IsProfileEnterpriseManaged(profile_)) { + return; + } + + for (const auto& [local_pref, syncable_pref] : + kMoveConfirmationShownPrefMap) { + if (syncable_pref.second == + ash::cloud_upload::CloudProvider::kGoogleDrive && + !cloud_upload::IsGoogleWorkspaceCloudUploadAutomated(profile_)) { + continue; + } + if (syncable_pref.second == ash::cloud_upload::CloudProvider::kOneDrive && + !cloud_upload::IsMicrosoftOfficeCloudUploadAutomated(profile_)) { + continue; + } + bool move_confirmation_shown_syncable = + profile_->GetPrefs()->GetBoolean(syncable_pref.first); + profile_->GetPrefs()->SetBoolean(local_pref, + move_confirmation_shown_syncable); + } +} + void CloudUploadPromptPrefsHandler::OnCloudUploadPrefChanged() { DCHECK(IsProfileEnterpriseManaged(profile_)); @@ -209,8 +307,10 @@ if (google_workspace_automated) { OnOfficeFilesAlwaysMoveToDriveSyncableChanged(); + OnOfficeMoveConfirmationShownSyncableChanged(); } else if (microsoft_office_automated) { OnOfficeFilesAlwaysMoveToOneDriveSyncableChanged(); + OnOfficeMoveConfirmationShownSyncableChanged(); } }
diff --git a/chrome/browser/ash/file_manager/file_manager_browsertest_base.cc b/chrome/browser/ash/file_manager/file_manager_browsertest_base.cc index a37545e..ab4f2c9 100644 --- a/chrome/browser/ash/file_manager/file_manager_browsertest_base.cc +++ b/chrome/browser/ash/file_manager/file_manager_browsertest_base.cc
@@ -71,6 +71,7 @@ #include "base/strings/string_split.h" #include "base/strings/string_util.h" #include "base/strings/stringprintf.h" +#include "base/strings/to_string.h" #include "base/synchronization/lock.h" #include "base/task/sequenced_task_runner.h" #include "base/task/single_thread_task_runner.h" @@ -3100,7 +3101,7 @@ if (name == "isDevtoolsCoverageActive") { bool devtools_coverage_active = !devtools_code_coverage_dir_.empty(); LOG(INFO) << "isDevtoolsCoverageActive: " << devtools_coverage_active; - *output = devtools_coverage_active ? "true" : "false"; + *output = base::ToString(devtools_coverage_active); return; } @@ -3780,22 +3781,22 @@ } if (name == "isConflictDialogEnabled") { - *output = options.enable_conflict_dialog ? "true" : "false"; + *output = base::ToString(options.enable_conflict_dialog); return; } if (name == "isSmbEnabled") { - *output = options.native_smb ? "true" : "false"; + *output = base::ToString(options.native_smb); return; } if (name == "isBannersFrameworkEnabled") { - *output = options.enable_banners_framework ? "true" : "false"; + *output = base::ToString(options.enable_banners_framework); return; } if (name == "isMirrorSyncEnabled") { - *output = options.enable_mirrorsync ? "true" : "false"; + *output = base::ToString(options.enable_mirrorsync); return; } @@ -4007,7 +4008,7 @@ } if (name == "isCrosComponents") { - *output = options.enable_cros_components ? "true" : "false"; + *output = base::ToString(options.enable_cros_components); return; }
diff --git a/chrome/browser/ash/file_manager/file_manager_policy_browsertest.cc b/chrome/browser/ash/file_manager/file_manager_policy_browsertest.cc index d13655fd..bb4e79f 100644 --- a/chrome/browser/ash/file_manager/file_manager_policy_browsertest.cc +++ b/chrome/browser/ash/file_manager/file_manager_policy_browsertest.cc
@@ -4,6 +4,7 @@ #include "base/memory/raw_ptr.h" #include "base/path_service.h" +#include "base/strings/to_string.h" #include "base/test/bind.h" #include "base/test/gmock_callback_support.h" #include "base/test/mock_callback.h" @@ -579,12 +580,11 @@ return true; } if (name == "isReportOnlyFileTransferConnector") { - *output = options.file_transfer_connector_report_only ? "true" : "false"; + *output = base::ToString(options.file_transfer_connector_report_only); return true; } if (name == "usesNewFileTransferConnectorUI") { - *output = - options.enable_file_transfer_connector_new_ux ? "true" : "false"; + *output = base::ToString(options.enable_file_transfer_connector_new_ux); return true; } if (name == "getExpectedNumberOfBlockedFilesByConnectors") { @@ -596,7 +596,7 @@ return true; } if (name == "doesBypassRequireJustification") { - *output = options.bypass_requires_justification ? "true" : "false"; + *output = base::ToString(options.bypass_requires_justification); return true; } if (name == "setupScanningRunLoop") {
diff --git a/chrome/browser/ash/file_manager/file_manager_test_util.cc b/chrome/browser/ash/file_manager/file_manager_test_util.cc index b5aeb266..84880aa6 100644 --- a/chrome/browser/ash/file_manager/file_manager_test_util.cc +++ b/chrome/browser/ash/file_manager/file_manager_test_util.cc
@@ -9,6 +9,7 @@ #include "base/memory/raw_ptr.h" #include "base/path_service.h" #include "base/ranges/algorithm.h" +#include "base/strings/to_string.h" #include "base/test/bind.h" #include "chrome/browser/apps/app_service/app_service_proxy_ash.h" #include "chrome/browser/ash/file_manager/file_tasks.h" @@ -398,7 +399,7 @@ actions.push_back( {ash::cloud_upload::kUserEmailActionId, kSampleUserEmail1}); actions.push_back({ash::cloud_upload::kReauthenticationRequiredId, - reauthentication_required_ ? "true" : "false"}); + base::ToString(reauthentication_required_)}); actions.push_back( {ash::cloud_upload::kAccountStateId, reauthentication_required_ ? "REAUTHENTICATION_REQUIRED" : "NORMAL"});
diff --git a/chrome/browser/ash/floating_sso/cookie_sync_conversions.cc b/chrome/browser/ash/floating_sso/cookie_sync_conversions.cc index e3de89e3..158a6968c 100644 --- a/chrome/browser/ash/floating_sso/cookie_sync_conversions.cc +++ b/chrome/browser/ash/floating_sso/cookie_sync_conversions.cc
@@ -12,6 +12,7 @@ #include "base/strings/strcat.h" #include "base/strings/string_number_conversions.h" +#include "base/strings/to_string.h" #include "base/time/time.h" #include "base/types/expected.h" #include "components/sync/protocol/cookie_specifics.pb.h" @@ -190,7 +191,7 @@ // We just concatenate all involved strings. std::string serialized_key = base::StrCat( {serialized_partition_key->TopLevelSite(), - (serialized_partition_key->has_cross_site_ancestor() ? "true" : "false"), + base::ToString(serialized_partition_key->has_cross_site_ancestor()), name, domain, path, base::NumberToString(static_cast<int>(source_scheme)), base::NumberToString(source_port)});
diff --git a/chrome/browser/ash/guest_os/guest_os_registry_service.cc b/chrome/browser/ash/guest_os/guest_os_registry_service.cc index 3bc2ce6..07291c5 100644 --- a/chrome/browser/ash/guest_os/guest_os_registry_service.cc +++ b/chrome/browser/ash/guest_os/guest_os_registry_service.cc
@@ -16,6 +16,7 @@ #include "base/metrics/histogram_macros.h" #include "base/strings/string_number_conversions.h" #include "base/strings/string_util.h" +#include "base/strings/to_string.h" #include "base/strings/utf_string_conversions.h" #include "base/task/thread_pool.h" #include "base/time/clock.h" @@ -253,7 +254,7 @@ static std::string Join(const List& list); static std::string ToString(bool b) { - return b ? "true" : "false"; + return base::ToString(b); } static std::string ToString(int i) {
diff --git a/chrome/browser/ash/input_method/component_extension_ime_manager_delegate_impl.cc b/chrome/browser/ash/input_method/component_extension_ime_manager_delegate_impl.cc index fe48ae7..ed1d398 100644 --- a/chrome/browser/ash/input_method/component_extension_ime_manager_delegate_impl.cc +++ b/chrome/browser/ash/input_method/component_extension_ime_manager_delegate_impl.cc
@@ -18,6 +18,7 @@ #include "base/path_service.h" #include "base/strings/strcat.h" #include "base/strings/string_util.h" +#include "base/strings/to_string.h" #include "base/system/sys_info.h" #include "base/task/thread_pool.h" #include "base/trace_event/trace_event.h" @@ -322,7 +323,7 @@ url = net::AppendOrReplaceQueryParameter(url, "jelly", "true"); url = net::AppendOrReplaceQueryParameter( url, "globalemojipreferences", - is_global_emoji_preferences_enabled ? "true" : "false"); + base::ToString(is_global_emoji_preferences_enabled)); // Information is managed on VK extension side so just use a default value // here. url = net::AppendOrReplaceRef(url, "id=default");
diff --git a/chrome/browser/ash/kerberos/kerberos_files_handler.cc b/chrome/browser/ash/kerberos/kerberos_files_handler.cc index abc161d..84e5810 100644 --- a/chrome/browser/ash/kerberos/kerberos_files_handler.cc +++ b/chrome/browser/ash/kerberos/kerberos_files_handler.cc
@@ -15,6 +15,7 @@ #include "base/logging.h" #include "base/path_service.h" #include "base/strings/stringprintf.h" +#include "base/strings/to_string.h" #include "base/task/thread_pool.h" #include "chrome/browser/browser_process.h" #include "chrome/common/pref_names.h" @@ -79,7 +80,7 @@ "\tdns_canonicalize_hostname = %s\n" "\trdns = false\n"; std::string adjusted_config = base::StringPrintf( - kKrb5CnameSettings, is_dns_cname_enabled ? "true" : "false"); + kKrb5CnameSettings, base::ToString(is_dns_cname_enabled)); adjusted_config.append(config.value()); return adjusted_config; }
diff --git a/chrome/browser/ash/language_packs/language_pack_font_service_unittest.cc b/chrome/browser/ash/language_packs/language_pack_font_service_unittest.cc index 49f20208..ef395ad 100644 --- a/chrome/browser/ash/language_packs/language_pack_font_service_unittest.cc +++ b/chrome/browser/ash/language_packs/language_pack_font_service_unittest.cc
@@ -16,6 +16,7 @@ #include "base/functional/bind.h" #include "base/run_loop.h" #include "base/strings/strcat.h" +#include "base/strings/to_string.h" #include "base/test/scoped_feature_list.h" #include "base/test/test_future.h" #include "chrome/browser/ash/language_packs/language_pack_font_service_factory.h" @@ -70,7 +71,7 @@ scoped_feature_list_.InitAndEnableFeatureWithParameters( features::kLanguagePacksFonts, {{features::kLanguagePacksFontsLoadAfterDownloadDuringLogin.name, - load_after_download_during_login ? "true" : "false"}}); + base::ToString(load_after_download_during_login)}}); } void InitProfileWithServices() {
diff --git a/chrome/browser/ash/login/demo_mode/demo_setup_controller.cc b/chrome/browser/ash/login/demo_mode/demo_setup_controller.cc index a06a163..e6c39f4 100644 --- a/chrome/browser/ash/login/demo_mode/demo_setup_controller.cc +++ b/chrome/browser/ash/login/demo_mode/demo_setup_controller.cc
@@ -109,6 +109,7 @@ case policy::DM_STATUS_SERVICE_ENTERPRISE_TOS_HAS_NOT_BEEN_ACCEPTED: case policy::DM_STATUS_SERVICE_ILLEGAL_ACCOUNT_FOR_PACKAGED_EDU_LICENSE: case policy::DM_STATUS_SERVICE_INVALID_PACKAGED_DEVICE_FOR_KIOSK: + case policy::DM_STATUS_SERVICE_ORG_UNIT_ENROLLMENT_LIMIT_EXCEEEDED: return DemoSetupController::DemoSetupError(ErrorCode::kDemoAccountError, RecoveryMethod::kUnknown, debug_message);
diff --git a/chrome/browser/ash/login/enrollment/enrollment_embedded_policy_server_browsertest.cc b/chrome/browser/ash/login/enrollment/enrollment_embedded_policy_server_browsertest.cc index f40ed826..9c90d084 100644 --- a/chrome/browser/ash/login/enrollment/enrollment_embedded_policy_server_browsertest.cc +++ b/chrome/browser/ash/login/enrollment/enrollment_embedded_policy_server_browsertest.cc
@@ -784,6 +784,23 @@ EXPECT_FALSE(InstallAttributes::Get()->IsEnterpriseManaged()); } +// Error during enrollment : Error 419: ORG_UNIT_ENROLLMENT_LIMIT_EXCEEDED. +IN_PROC_BROWSER_TEST_F(EnrollmentEmbeddedPolicyServerBase, + EnrollmentErrorOrgUnitEnrollmentLimitExceeded) { + policy_server_.SetDeviceEnrollmentError( + policy::DeviceManagementService::kOrgUnitEnrollmentLimitExceeded); + + TriggerEnrollmentAndSignInSuccessfully(); + + enrollment_ui_.WaitForStep(test::ui::kEnrollmentStepError); + enrollment_ui_.ExpectErrorMessage( + IDS_ENTERPRISE_ENROLLMENT_ORG_UNIT_ENROLLMENT_LIMIT_EXCEEDED, + /*can_retry=*/true); + enrollment_ui_.RetryAndWaitForSigninStep(); + EXPECT_FALSE(StartupUtils::IsDeviceRegistered()); + EXPECT_FALSE(InstallAttributes::Get()->IsEnterpriseManaged()); +} + // Error during enrollment : Error fetching policy : 902 - policy not found. IN_PROC_BROWSER_TEST_F(EnrollmentEmbeddedPolicyServerBase, EnrollmentErrorFetchingPolicyNotFound) {
diff --git a/chrome/browser/ash/login/enrollment/enrollment_launcher.cc b/chrome/browser/ash/login/enrollment/enrollment_launcher.cc index 86e3816..2df4ea8 100644 --- a/chrome/browser/ash/login/enrollment/enrollment_launcher.cc +++ b/chrome/browser/ash/login/enrollment/enrollment_launcher.cc
@@ -561,6 +561,9 @@ case policy::DM_STATUS_SERVICE_INVALID_PACKAGED_DEVICE_FOR_KIOSK: UMA(policy::kMetricEnrollmentInvalidPackagedDeviceForKIOSK); break; + case policy::DM_STATUS_SERVICE_ORG_UNIT_ENROLLMENT_LIMIT_EXCEEEDED: + UMA(policy::kMetricEnrollmentOrgUnitEnrollmentLimitExceeded); + break; } break; case policy::EnrollmentStatus::Code::kRegistrationBadMode:
diff --git a/chrome/browser/ash/login/oobe_interactive_ui_test.cc b/chrome/browser/ash/login/oobe_interactive_ui_test.cc index d8ec63b..f46b28e 100644 --- a/chrome/browser/ash/login/oobe_interactive_ui_test.cc +++ b/chrome/browser/ash/login/oobe_interactive_ui_test.cc
@@ -19,6 +19,7 @@ #include "base/functional/bind.h" #include "base/memory/raw_ptr.h" #include "base/strings/stringprintf.h" +#include "base/strings/to_string.h" #include "base/task/single_thread_task_runner.h" #include "base/test/metrics/histogram_tester.h" #include "base/test/scoped_feature_list.h" @@ -583,11 +584,11 @@ ArcState arc_state; std::string ToString() const { - return std::string("{is_tablet: ") + (is_tablet ? "true" : "false") + + return std::string("{is_tablet: ") + base::ToString(is_tablet) + ", is_quick_unlock_enabled: " + - (is_quick_unlock_enabled ? "true" : "false") + + base::ToString(is_quick_unlock_enabled) + ", hide_shelf_controls_in_tablet_mode: " + - (hide_shelf_controls_in_tablet_mode ? "true" : "false") + + base::ToString(hide_shelf_controls_in_tablet_mode) + ", arc_state: " + ArcStateToString(arc_state) + "}"; } };
diff --git a/chrome/browser/ash/login/signin/oauth2_browsertest.cc b/chrome/browser/ash/login/signin/oauth2_browsertest.cc index ff4ddb7..57ea441 100644 --- a/chrome/browser/ash/login/signin/oauth2_browsertest.cc +++ b/chrome/browser/ash/login/signin/oauth2_browsertest.cc
@@ -15,6 +15,7 @@ #include "base/memory/ref_counted.h" #include "base/path_service.h" #include "base/strings/stringprintf.h" +#include "base/strings/to_string.h" #include "base/synchronization/waitable_event.h" #include "base/task/single_thread_task_runner.h" #include "base/test/test_future.h" @@ -119,10 +120,6 @@ ->PickAccountIdForAccount(gaia_id, email); } -const char* BoolToString(bool value) { - return value ? "true" : "false"; -} - class OAuth2LoginManagerStateWaiter : public OAuth2LoginManager::Observer { public: explicit OAuth2LoginManagerStateWaiter(Profile* profile) @@ -988,7 +985,7 @@ ext->id(), base::StringPrintf("startThrottledTests('%s', '%s', %s)", fake_google_page_url_.spec().c_str(), non_google_page_url_.spec().c_str(), - BoolToString(do_async_xhr()))); + base::ToString(do_async_xhr()))); ExtensionTestMessageListener listener("Both XHR's Opened"); ASSERT_TRUE(listener.WaitUntilSatisfied()); @@ -1056,7 +1053,7 @@ ext->id(), base::StringPrintf("startThrottledTests('%s', '%s', %s)", fake_google_page_url_.spec().c_str(), non_google_page_url_.spec().c_str(), - BoolToString(do_async_xhr()))); + base::ToString(do_async_xhr()))); if (do_async_xhr()) { // Verify that we've sent XHR request from the extension side... @@ -1138,7 +1135,7 @@ ext->id(), base::StringPrintf("startThrottledTests('%s', '%s', %s)", fake_google_page_url_.spec().c_str(), non_google_page_url_.spec().c_str(), - BoolToString(do_async_xhr()))); + base::ToString(do_async_xhr()))); if (do_async_xhr()) { // Verify that we've sent XHR requests from the extension side...
diff --git a/chrome/browser/ash/policy/core/user_cloud_policy_manager_ash.cc b/chrome/browser/ash/policy/core/user_cloud_policy_manager_ash.cc index ddd4916b..e172dff 100644 --- a/chrome/browser/ash/policy/core/user_cloud_policy_manager_ash.cc +++ b/chrome/browser/ash/policy/core/user_cloud_policy_manager_ash.cc
@@ -18,6 +18,7 @@ #include "base/metrics/histogram_functions.h" #include "base/metrics/histogram_macros.h" #include "base/strings/string_number_conversions.h" +#include "base/strings/to_string.h" #include "base/syslog_logging.h" #include "base/task/sequenced_task_runner.h" #include "base/time/default_clock.h" @@ -550,7 +551,7 @@ base::CommandLine command_line = base::CommandLine(base::CommandLine::NO_PROGRAM); command_line.AppendSwitchASCII(ash::switches::kProfileRequiresPolicy, - policy_required ? "true" : "false"); + base::ToString(policy_required)); base::CommandLine::StringVector flags; flags.assign(command_line.argv().begin() + 1, command_line.argv().end()); DCHECK_EQ(1u, flags.size());
diff --git a/chrome/browser/ash/policy/display/display_resolution_handler_browsertest.cc b/chrome/browser/ash/policy/display/display_resolution_handler_browsertest.cc index 3e2f6c7..663c7a5 100644 --- a/chrome/browser/ash/policy/display/display_resolution_handler_browsertest.cc +++ b/chrome/browser/ash/policy/display/display_resolution_handler_browsertest.cc
@@ -12,6 +12,7 @@ #include "base/location.h" #include "base/run_loop.h" #include "base/strings/string_number_conversions.h" +#include "base/strings/to_string.h" #include "base/task/single_thread_task_runner.h" #include "chrome/browser/ash/login/test/device_state_mixin.h" #include "chrome/browser/ash/policy/core/device_policy_builder.h" @@ -121,7 +122,7 @@ } json_entries.push_back(std::string("\"recommended\": ") + - (recommended ? "true" : "false")); + base::ToString(recommended)); proto->mutable_device_display_resolution()->set_device_display_resolution( "{" + base::JoinString(json_entries, ",") + "}"); }
diff --git a/chrome/browser/ash/system_logs/reven_log_source.cc b/chrome/browser/ash/system_logs/reven_log_source.cc index 8ee59534..66fac14 100644 --- a/chrome/browser/ash/system_logs/reven_log_source.cc +++ b/chrome/browser/ash/system_logs/reven_log_source.cc
@@ -11,6 +11,7 @@ #include "base/strings/string_number_conversions.h" #include "base/strings/string_util.h" #include "base/strings/stringprintf.h" +#include "base/strings/to_string.h" #include "base/task/thread_pool.h" #include "chromeos/ash/services/cros_healthd/public/cpp/service_connection.h" #include "chromeos/ash/services/cros_healthd/public/mojom/cros_healthd_probe.mojom-shared.h" @@ -90,10 +91,6 @@ } } -std::string FormatBool(bool value) { - return value ? "true" : "false"; -} - void PopulateCpuInfo(SystemLogsResponse& psd, const TelemetryInfoPtr& info) { if (info->cpu_result.is_null() || info->cpu_result->is_error()) { DVLOG(1) << "CpuResult not found in croshealthd response"; @@ -148,13 +145,13 @@ healthd::OsInfoPtr& os_info = info->system_result->get_system_info()->os_info; if (!os_info.is_null()) { - psd.emplace( - kRevenSecurebootKey, - FormatBool(os_info->boot_mode == healthd::BootMode::kCrosEfiSecure)); - psd.emplace( - kRevenUefiKey, - FormatBool(os_info->boot_mode == healthd::BootMode::kCrosEfi || - os_info->boot_mode == healthd::BootMode::kCrosEfiSecure)); + psd.emplace(kRevenSecurebootKey, + base::ToString(os_info->boot_mode == + healthd::BootMode::kCrosEfiSecure)); + psd.emplace(kRevenUefiKey, + base::ToString( + os_info->boot_mode == healthd::BootMode::kCrosEfi || + os_info->boot_mode == healthd::BootMode::kCrosEfiSecure)); } } @@ -267,8 +264,8 @@ psd.emplace(kRevenTpmDidVidKey, tpm_info->did_vid.value_or(kNotAvailable)); psd.emplace(kRevenTpmAllowListedKey, - FormatBool(tpm_info->supported_features->is_allowed)); - psd.emplace(kRevenTpmOwnedKey, FormatBool(tpm_info->status->owned)); + base::ToString(tpm_info->supported_features->is_allowed)); + psd.emplace(kRevenTpmOwnedKey, base::ToString(tpm_info->status->owned)); const healthd::TpmVersionPtr& version = tpm_info->version; if (version.is_null()) {
diff --git a/chrome/browser/ash/system_web_apps/apps/BUILD.gn b/chrome/browser/ash/system_web_apps/apps/BUILD.gn index 6bdc33a..82ba949 100644 --- a/chrome/browser/ash/system_web_apps/apps/BUILD.gn +++ b/chrome/browser/ash/system_web_apps/apps/BUILD.gn
@@ -271,6 +271,7 @@ "//ui/base:types", "//ui/display", "//ui/display:display_manager_test_api", + "//ui/events:test_support", "//ui/gfx/geometry", "//ui/views", "//url",
diff --git a/chrome/browser/ash/system_web_apps/apps/help_app/BUILD.gn b/chrome/browser/ash/system_web_apps/apps/help_app/BUILD.gn index 081c712..718cc0f8 100644 --- a/chrome/browser/ash/system_web_apps/apps/help_app/BUILD.gn +++ b/chrome/browser/ash/system_web_apps/apps/help_app/BUILD.gn
@@ -137,6 +137,7 @@ "//ui/display", "//ui/display/types", "//ui/events:events_base", + "//ui/events:test_support", "//ui/gfx:color_utils", "//ui/gfx/geometry", "//ui/views",
diff --git a/chrome/browser/ash/system_web_apps/apps/help_app/help_app_integration_browsertest.cc b/chrome/browser/ash/system_web_apps/apps/help_app/help_app_integration_browsertest.cc index 8ab0cb69..571ffcb1 100644 --- a/chrome/browser/ash/system_web_apps/apps/help_app/help_app_integration_browsertest.cc +++ b/chrome/browser/ash/system_web_apps/apps/help_app/help_app_integration_browsertest.cc
@@ -8,6 +8,7 @@ #include "ash/constants/ash_features.h" #include "ash/constants/ash_switches.h" +#include "ash/shell.h" #include "ash/webui/help_app_ui/buildflags.h" #include "ash/webui/help_app_ui/help_app_manager.h" #include "ash/webui/help_app_ui/help_app_manager_factory.h" @@ -83,6 +84,7 @@ #include "ui/display/screen.h" #include "ui/display/types/display_constants.h" #include "ui/events/keycodes/keyboard_codes.h" +#include "ui/events/test/event_generator.h" #include "ui/gfx/color_palette.h" #include "ui/gfx/geometry/rect.h" #include "ui/gfx/geometry/size.h" @@ -1280,9 +1282,8 @@ #endif content::TestNavigationObserver navigation_observer(expected_url); navigation_observer.StartWatchingNewWebContents(); - ASSERT_TRUE(ui_test_utils::SendKeyPressSync( - browser(), ui::VKEY_OEM_2, /*control=*/true, - /*shift=*/false, /*alt=*/false, /*command=*/false)); + ui::test::EventGenerator generator(ash::Shell::GetPrimaryRootWindow()); + generator.PressKeyAndModifierKeys(ui::VKEY_OEM_2, ui::EF_CONTROL_DOWN); navigation_observer.Wait(); #if BUILDFLAG(ENABLE_CROS_HELP_APP)
diff --git a/chrome/browser/ash/system_web_apps/apps/os_feedback_app_integration_browsertest.cc b/chrome/browser/ash/system_web_apps/apps/os_feedback_app_integration_browsertest.cc index 2f296ad..f79a12e 100644 --- a/chrome/browser/ash/system_web_apps/apps/os_feedback_app_integration_browsertest.cc +++ b/chrome/browser/ash/system_web_apps/apps/os_feedback_app_integration_browsertest.cc
@@ -19,7 +19,6 @@ #include "chrome/browser/ui/browser_window.h" #include "chrome/browser/ui/web_applications/test/web_app_browsertest_util.h" #include "chrome/common/pref_names.h" -#include "chrome/test/base/interactive_test_utils.h" #include "chrome/test/base/ui_test_utils.h" #include "components/webapps/browser/install_result_code.h" #include "content/public/test/browser_test.h" @@ -27,6 +26,8 @@ #include "testing/gtest/include/gtest/gtest.h" #include "ui/display/screen.h" #include "ui/display/test/display_manager_test_api.h" +#include "ui/events/event_constants.h" +#include "ui/events/test/event_generator.h" #include "ui/gfx/geometry/rect.h" #include "url/gurl.h" @@ -89,10 +90,10 @@ EXPECT_EQ(nullptr, FindFeedbackAppBrowser()); } - void SendKeyPressAltShiftI(Browser* browser) { - ASSERT_TRUE(ui_test_utils::SendKeyPressSync( - browser, ui::VKEY_I, /* control= */ false, /* shift= */ true, - /* alt= */ true, /* command= */ false)); + void SendKeyPressAltShiftI() { + ui::test::EventGenerator generator(ash::Shell::GetPrimaryRootWindow()); + generator.PressKeyAndModifierKeys(ui::VKEY_I, + ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN); } GURL feedback_url_; @@ -122,7 +123,7 @@ content::TestNavigationObserver navigation_observer(feedback_url_); navigation_observer.StartWatchingNewWebContents(); // Try to press keyboard shortcut to open Feedback app. - SendKeyPressAltShiftI(browser()); + SendKeyPressAltShiftI(); navigation_observer.Wait(); ExpectFeedbackAppLaunched(old_url); @@ -145,7 +146,7 @@ ExpectNoFeedbackAppLaunched(old_url); // Try to press keyboard shortcut to open Feedback app. - SendKeyPressAltShiftI(browser()); + SendKeyPressAltShiftI(); ExpectNoFeedbackAppLaunched(old_url); }
diff --git a/chrome/browser/ash/system_web_apps/system_web_app_manager_factory.cc b/chrome/browser/ash/system_web_apps/system_web_app_manager_factory.cc index e8c3566..9ee9fc5d 100644 --- a/chrome/browser/ash/system_web_apps/system_web_app_manager_factory.cc +++ b/chrome/browser/ash/system_web_apps/system_web_app_manager_factory.cc
@@ -4,7 +4,6 @@ #include "chrome/browser/ash/system_web_apps/system_web_app_manager_factory.h" -#include "ash/constants/ash_features.h" #include "ash/constants/ash_pref_names.h" #include "build/chromeos_buildflags.h" #include "chrome/browser/ash/profiles/profile_helper.h" @@ -68,9 +67,7 @@ content::BrowserContext* SystemWebAppManagerFactory::GetBrowserContextToUse( content::BrowserContext* context) const { - // SWAM is guarded by the feature flag in kiosk mode, disabled by default. - if (!base::FeatureList::IsEnabled(ash::features::kKioskEnableSystemWebApps) && - chromeos::IsKioskSession()) { + if (chromeos::IsKioskSession()) { return nullptr; }
diff --git a/chrome/browser/ash/system_web_apps/system_web_app_manager_unittest.cc b/chrome/browser/ash/system_web_apps/system_web_app_manager_unittest.cc index 963b686..939ed0d 100644 --- a/chrome/browser/ash/system_web_apps/system_web_app_manager_unittest.cc +++ b/chrome/browser/ash/system_web_apps/system_web_app_manager_unittest.cc
@@ -1557,12 +1557,4 @@ EXPECT_FALSE(SystemWebAppManager::Get(profile())); } -// Checks that SWA manager is created in Kiosk sessions if the feature is -// enabled. -TEST_F(SystemWebAppManagerInKioskTest, ShouldCreateManagerIfEnabled) { - base::test::ScopedFeatureList scoped_feature_list( - ash::features::kKioskEnableSystemWebApps); - EXPECT_TRUE(SystemWebAppManager::Get(profile())); -} - } // namespace ash
diff --git a/chrome/browser/auxiliary_search/BUILD.gn b/chrome/browser/auxiliary_search/BUILD.gn index 1d637c1..ece4857f 100644 --- a/chrome/browser/auxiliary_search/BUILD.gn +++ b/chrome/browser/auxiliary_search/BUILD.gn
@@ -31,6 +31,7 @@ deps = [ ":java_resources", + "//base:base_java", "//base:base_shared_preferences_java", "//base:callback_java", "//base:log_java",
diff --git a/chrome/browser/auxiliary_search/java/src/org/chromium/chrome/browser/auxiliary_search/AuxiliarySearchBackgroundTask.java b/chrome/browser/auxiliary_search/java/src/org/chromium/chrome/browser/auxiliary_search/AuxiliarySearchBackgroundTask.java index dc807f3..605a9ae 100644 --- a/chrome/browser/auxiliary_search/java/src/org/chromium/chrome/browser/auxiliary_search/AuxiliarySearchBackgroundTask.java +++ b/chrome/browser/auxiliary_search/java/src/org/chromium/chrome/browser/auxiliary_search/AuxiliarySearchBackgroundTask.java
@@ -77,6 +77,10 @@ mTaskFinishedCount = 0; Profile profile = ProfileManager.getLastUsedRegularProfile(); + // The AuxiliarySearchControllerFactory#setIsTablet() must be called before creating the + // controller which checks AuxiliarySearchControllerFactory#isEnabled(). This task won't be + // scheduled if the device isn't a tablet. + AuxiliarySearchControllerFactory.getInstance().setIsTablet(true); mAuxiliarySearchController = AuxiliarySearchControllerFactory.getInstance() .createAuxiliarySearchController(
diff --git a/chrome/browser/auxiliary_search/java/src/org/chromium/chrome/browser/auxiliary_search/AuxiliarySearchControllerImpl.java b/chrome/browser/auxiliary_search/java/src/org/chromium/chrome/browser/auxiliary_search/AuxiliarySearchControllerImpl.java index ae5baaf..a52af97 100644 --- a/chrome/browser/auxiliary_search/java/src/org/chromium/chrome/browser/auxiliary_search/AuxiliarySearchControllerImpl.java +++ b/chrome/browser/auxiliary_search/java/src/org/chromium/chrome/browser/auxiliary_search/AuxiliarySearchControllerImpl.java
@@ -15,6 +15,7 @@ import androidx.annotation.VisibleForTesting; import org.chromium.base.Callback; +import org.chromium.base.CallbackController; import org.chromium.base.TimeUtils; import org.chromium.chrome.browser.auxiliary_search.AuxiliarySearchGroupProto.AuxiliarySearchEntry; import org.chromium.chrome.browser.auxiliary_search.AuxiliarySearchMetrics.RequestStatus; @@ -46,6 +47,7 @@ private @NonNull ActivityLifecycleDispatcher mActivityLifecycleDispatcher; private boolean mHasDeletingTask; private int mTaskFinishedCount; + private CallbackController mCallbackController = new CallbackController(); @VisibleForTesting public AuxiliarySearchControllerImpl( @@ -106,6 +108,10 @@ @Override public void destroy() { + if (mCallbackController == null) return; + + mCallbackController.destroy(); + mCallbackController = null; AuxiliarySearchConfigManager.getInstance().removeListener(this); if (mActivityLifecycleDispatcher != null) { @@ -146,7 +152,8 @@ long startTime = TimeUtils.uptimeMillis(); mAuxiliarySearchProvider.getTabsSearchableDataProtoAsync( - (tabs) -> onNonSensitiveTabsAvailable(tabs, startTime)); + mCallbackController.makeCancelable( + (tabs) -> onNonSensitiveTabsAvailable(tabs, startTime))); } /**
diff --git a/chrome/browser/auxiliary_search/junit/src/org/chromium/chrome/browser/auxiliary_search/AuxiliarySearchControllerFactoryUnitTest.java b/chrome/browser/auxiliary_search/junit/src/org/chromium/chrome/browser/auxiliary_search/AuxiliarySearchControllerFactoryUnitTest.java index 73258bb1..bf3f07e 100644 --- a/chrome/browser/auxiliary_search/junit/src/org/chromium/chrome/browser/auxiliary_search/AuxiliarySearchControllerFactoryUnitTest.java +++ b/chrome/browser/auxiliary_search/junit/src/org/chromium/chrome/browser/auxiliary_search/AuxiliarySearchControllerFactoryUnitTest.java
@@ -140,6 +140,7 @@ @Test @SmallTest public void testSetIsTablet() { + mFactory.resetIsTabletForTesting(); mFactory.setIsTablet(false); assertFalse(mFactory.isTablet());
diff --git a/chrome/browser/auxiliary_search/junit/src/org/chromium/chrome/browser/auxiliary_search/AuxiliarySearchControllerImplUnitTest.java b/chrome/browser/auxiliary_search/junit/src/org/chromium/chrome/browser/auxiliary_search/AuxiliarySearchControllerImplUnitTest.java index 751dc6c..d47b15b 100644 --- a/chrome/browser/auxiliary_search/junit/src/org/chromium/chrome/browser/auxiliary_search/AuxiliarySearchControllerImplUnitTest.java +++ b/chrome/browser/auxiliary_search/junit/src/org/chromium/chrome/browser/auxiliary_search/AuxiliarySearchControllerImplUnitTest.java
@@ -310,6 +310,38 @@ } @Test + @EnableFeatures(ChromeFeatureList.ANDROID_APP_INTEGRATION_WITH_FAVICON) + public void testOnNonSensitiveTabsAvailable_AfterDestroy() { + long now = TimeUtils.uptimeMillis(); + int timeDelta = 50; + + when(mTab1.getId()).thenReturn(TAB_ID_1); + when(mTab1.getUrl()).thenReturn(JUnitTestGURLs.URL_1); + when(mTab1.getTitle()).thenReturn("Title1"); + when(mTab1.getTimestampMillis()).thenReturn(now - 2); + + when(mTab2.getId()).thenReturn(TAB_ID_2); + when(mTab2.getUrl()).thenReturn(JUnitTestGURLs.URL_2); + when(mTab2.getTitle()).thenReturn("Title2"); + when(mTab2.getTimestampMillis()).thenReturn(now - 1); + + List<Tab> tabs = new ArrayList<>(); + tabs.add(mTab1); + tabs.add(mTab2); + + when(mAuxiliarySearchDonor.canDonate()).thenReturn(true); + mAuxiliarySearchControllerImpl.onPauseWithNative(); + + verify(mAuxiliarySearchProvider).getTabsSearchableDataProtoAsync(mCallbackCaptor.capture()); + + mAuxiliarySearchControllerImpl.destroy(); + mFakeTime.advanceMillis(timeDelta); + mCallbackCaptor.getAllValues().get(0).onResult(tabs); + + verify(mAuxiliarySearchDonor, never()).donateTabs(any(List.class), any(Callback.class)); + } + + @Test public void testOnConfigChanged() { mAuxiliarySearchControllerImpl.onConfigChanged(false); verify(mAuxiliarySearchDonor).onConfigChanged(eq(false), any(Callback.class));
diff --git a/chrome/browser/bookmarks/bookmark_merged_surface_service.cc b/chrome/browser/bookmarks/bookmark_merged_surface_service.cc index c0427ec..fe52d697 100644 --- a/chrome/browser/bookmarks/bookmark_merged_surface_service.cc +++ b/chrome/browser/bookmarks/bookmark_merged_surface_service.cc
@@ -9,6 +9,7 @@ #include "base/notreached.h" #include "base/uuid.h" +#include "chrome/browser/bookmarks/bookmark_parent_folder_children.h" #include "chrome/browser/bookmarks/permanent_folder_ordering_tracker.h" #include "components/bookmarks/browser/bookmark_model.h" #include "components/bookmarks/browser/bookmark_node.h" @@ -66,6 +67,10 @@ return permanent_folder_to_tracker; } +bool IsPermanentManagedFolder(const BookmarkParentFolder& folder) { + return folder.as_permanent_folder() == PermanentFolderType::kManagedNode; +} + } // namespace // static @@ -163,7 +168,8 @@ bookmarks::ManagedBookmarkService* managed_bookmark_service) : model_(model), managed_bookmark_service_(managed_bookmark_service), - permanent_folder_to_tracker_(CreatePermanentFolderToTrackerMap(model)) { + permanent_folder_to_tracker_(CreatePermanentFolderToTrackerMap(model)), + dummy_empty_node_(/*id=*/0, base::Uuid::GenerateRandomV4(), GURL()) { CHECK(model_); } @@ -202,12 +208,8 @@ const bookmarks::BookmarkNode* BookmarkMergedSurfaceService::GetNodeAtIndex( const BookmarkParentFolder& folder, size_t index) const { - const BookmarkNode* node = - folder.HoldsNonPermanentFolder() - ? folder.as_non_permanent_folder() - : PermanentFolderToNode(*folder.as_permanent_folder()); - CHECK_LT(index, node->children().size()); - return node->children()[index].get(); + CHECK_LT(index, GetChildrenCount(folder)); + return GetChildren(folder)[index]; } bool BookmarkMergedSurfaceService::loaded() const { @@ -216,25 +218,24 @@ size_t BookmarkMergedSurfaceService::GetChildrenCount( const BookmarkParentFolder& folder) const { - if (folder.as_permanent_folder()) { - const BookmarkNode* node = - PermanentFolderToNode(*folder.as_permanent_folder()); - // `PermanentFolderType::kManagedNode` can return null if the managed node - // is null. - return node ? node->children().size() : 0; - } - return folder.as_non_permanent_folder()->children().size(); + return GetChildren(folder).size(); } -const std::vector<std::unique_ptr<BookmarkNode>>& -BookmarkMergedSurfaceService::GetChildren( +BookmarkParentFolderChildren BookmarkMergedSurfaceService::GetChildren( const BookmarkParentFolder& folder) const { if (folder.HoldsNonPermanentFolder()) { - return folder.as_non_permanent_folder()->children(); + return BookmarkParentFolderChildren(folder.as_non_permanent_folder()); } - CHECK(!IsParentFolderManaged(folder) || managed_permanent_node()); - return PermanentFolderToNode(*folder.as_permanent_folder())->children(); + if (IsPermanentManagedFolder(folder)) { + const BookmarkNode* node = managed_permanent_node() + ? managed_permanent_node() + : &dummy_empty_node_; + return BookmarkParentFolderChildren(node); + } + + return BookmarkParentFolderChildren( + &GetPermanentFolderOrderingTracker(*folder.as_permanent_folder())); } void BookmarkMergedSurfaceService::Move(const bookmarks::BookmarkNode* node, @@ -274,7 +275,7 @@ return IsNodeManaged(folder.as_non_permanent_folder()); } - if (folder.as_permanent_folder() == PermanentFolderType::kManagedNode) { + if (IsPermanentManagedFolder(folder)) { CHECK(managed_permanent_node()); return true; }
diff --git a/chrome/browser/bookmarks/bookmark_merged_surface_service.h b/chrome/browser/bookmarks/bookmark_merged_surface_service.h index e081a14..d46017be 100644 --- a/chrome/browser/bookmarks/bookmark_merged_surface_service.h +++ b/chrome/browser/bookmarks/bookmark_merged_surface_service.h
@@ -11,6 +11,8 @@ #include "base/containers/flat_map.h" #include "base/memory/raw_ptr.h" #include "base/observer_list.h" +#include "chrome/browser/bookmarks/bookmark_parent_folder_children.h" +#include "components/bookmarks/browser/bookmark_node.h" #include "components/bookmarks/browser/bookmark_node_data.h" #include "components/keyed_service/core/keyed_service.h" @@ -18,7 +20,6 @@ namespace bookmarks { class BookmarkModel; -class BookmarkNode; class ManagedBookmarkService; } // namespace bookmarks @@ -105,26 +106,25 @@ std::vector<const bookmarks::BookmarkNode*> GetUnderlyingNodes( const BookmarkParentFolder& folder) const; - // Returns the index of node with respect to its parent. + // Returns the index of node with respect to its parent folder. // `node` must not be null. - // TODO(crbug.com/364594278): When account nodes are supported within this - // class, `this` will return the index within `BookmarkParentFolder`. size_t GetIndexOf(const bookmarks::BookmarkNode* node) const; + // `index` must be less than the folder's children count. const bookmarks::BookmarkNode* GetNodeAtIndex( const BookmarkParentFolder& folder, size_t index) const; bool loaded() const; + // Note: In case of managed folder, if `managed_permanent_node()` is null, + // this will return `0`. size_t GetChildrenCount(const BookmarkParentFolder& folder) const; - // TODO(crbug.com/364594278): This function will need to return a wrapper that - // provides access to children as in some cases, child nodes will be a - // combination of the two bookmark nodes's children that would be tracked in a - // vector of non-owning pointers to child bookmark nodes. The wrapper would - // hide the type difference vector of unique/raw pointers. - const std::vector<std::unique_ptr<bookmarks::BookmarkNode>>& GetChildren( + // `this` must outlive `BookmarkParentFolderChildren`. + // Note: In case of managed folder, if `managed_permanent_node()` is null, + // this will return empty children. + BookmarkParentFolderChildren GetChildren( const BookmarkParentFolder& folder) const; // Moves `node` to `new_parent` at position `index`. @@ -166,6 +166,9 @@ const base::flat_map<BookmarkParentFolder::PermanentFolderType, std::unique_ptr<PermanentFolderOrderingTracker>> permanent_folder_to_tracker_; + + // Used in `GetChildren()` to return empty when managed node is null. + const bookmarks::BookmarkNode dummy_empty_node_; }; #endif // CHROME_BROWSER_BOOKMARKS_BOOKMARK_MERGED_SURFACE_SERVICE_H_
diff --git a/chrome/browser/bookmarks/bookmark_merged_surface_service_unittest.cc b/chrome/browser/bookmarks/bookmark_merged_surface_service_unittest.cc index 3328476..2f662b8 100644 --- a/chrome/browser/bookmarks/bookmark_merged_surface_service_unittest.cc +++ b/chrome/browser/bookmarks/bookmark_merged_surface_service_unittest.cc
@@ -11,6 +11,7 @@ #include "base/test/scoped_feature_list.h" #include "base/values.h" #include "chrome/browser/bookmarks/bookmark_model_factory.h" +#include "chrome/browser/bookmarks/bookmark_parent_folder_children.h" #include "components/bookmarks/browser/bookmark_model.h" #include "components/bookmarks/browser/bookmark_node.h" #include "components/bookmarks/common/bookmark_pref_names.h" @@ -120,6 +121,8 @@ []() -> std::string { return "managedDomain.com"; })); } + base::test::ScopedFeatureList features_{ + syncer::kSyncEnableBookmarksInTransportMode}; sync_preferences::TestingPrefServiceSyncable prefs_; std::unique_ptr<bookmarks::ManagedBookmarkService> managed_bookmark_service_; std::unique_ptr<bookmarks::BookmarkModel> model_; @@ -163,6 +166,59 @@ 3u); } +TEST_F(BookmarkMergedSurfaceServiceTest, GetChildrenWithAccountNodes) { + LoadBookmarkModel(); + model().CreateAccountPermanentFolders(); + const BookmarkNode* local_bb_node = model().bookmark_bar_node(); + const BookmarkNode* account_bb_node = model().account_bookmark_bar_node(); + ASSERT_TRUE(account_bb_node); + + AddNodesFromModelString(&model(), local_bb_node, "1 2 3 f1:[ 4 5 f2:[ 6 ] ]"); + AddNodesFromModelString(&model(), account_bb_node, + "7 8 9 f3:[ 10 11 f4:[ 12 ] ]"); + ASSERT_FALSE(local_bb_node->children().empty()); + ASSERT_FALSE(account_bb_node->children().empty()); + + BookmarkParentFolder bb_folder(BookmarkParentFolder::BookmarkBarFolder()); + size_t expected_children_size = + local_bb_node->children().size() + account_bb_node->children().size(); + EXPECT_EQ(service().GetChildrenCount(bb_folder), expected_children_size); + + BookmarkParentFolderChildren children = service().GetChildren(bb_folder); + ASSERT_EQ(children.size(), expected_children_size); + + size_t index = 0; + size_t account_bb_node_children_size = account_bb_node->children().size(); + while (index < expected_children_size) { + const BookmarkNode* expected_bookmark_node = + index < account_bb_node_children_size + ? account_bb_node->children()[index].get() + : local_bb_node->children()[index - account_bb_node_children_size] + .get(); + EXPECT_EQ(children[index++], expected_bookmark_node); + } + + // Tests `GetNodeAtIndex()`. + EXPECT_EQ(service().GetNodeAtIndex(bb_folder, 0u), + account_bb_node->children()[0].get()); + EXPECT_EQ( + service().GetNodeAtIndex(bb_folder, account_bb_node_children_size - 1u), + account_bb_node->children().back().get()); + EXPECT_EQ(service().GetNodeAtIndex(bb_folder, account_bb_node_children_size), + local_bb_node->children()[0].get()); + EXPECT_EQ(service().GetNodeAtIndex(bb_folder, expected_children_size - 1u), + local_bb_node->children().back().get()); + + // Tests `GetIndexOf()`. + index = 0; + for (const auto& node : account_bb_node->children()) { + EXPECT_EQ(service().GetIndexOf(node.get()), index++); + } + for (const auto& node : local_bb_node->children()) { + EXPECT_EQ(service().GetIndexOf(node.get()), index++); + } +} + TEST_F(BookmarkMergedSurfaceServiceTest, ManagedNodeNull) { LoadBookmarkModel(); EXPECT_EQ(service().GetChildrenCount(BookmarkParentFolder::ManagedFolder()),
diff --git a/chrome/browser/bookmarks/bookmark_parent_folder_children.cc b/chrome/browser/bookmarks/bookmark_parent_folder_children.cc index 01311029..f70c0bc 100644 --- a/chrome/browser/bookmarks/bookmark_parent_folder_children.cc +++ b/chrome/browser/bookmarks/bookmark_parent_folder_children.cc
@@ -77,6 +77,13 @@ return *this; } +BookmarkParentFolderChildren::Iterator +BookmarkParentFolderChildren::Iterator::operator+(int offset) const { + Iterator result = *this; + result.index_ += offset; + return result; +} + const BookmarkNode* BookmarkParentFolderChildren::Iterator::operator*() const { return (*parent_)[index_]; }
diff --git a/chrome/browser/bookmarks/bookmark_parent_folder_children.h b/chrome/browser/bookmarks/bookmark_parent_folder_children.h index 1cc0049..4a951afa 100644 --- a/chrome/browser/bookmarks/bookmark_parent_folder_children.h +++ b/chrome/browser/bookmarks/bookmark_parent_folder_children.h
@@ -15,12 +15,15 @@ class BookmarkNode; } // namespace bookmarks +// Provides access (not a copy) to the child nodes of a `BookmarkParentFolder`. class BookmarkParentFolderChildren { public: class Iterator { public: Iterator(const BookmarkParentFolderChildren* parent, size_t index); Iterator& operator++(); + Iterator operator+(int offset) const; + friend bool operator==(const Iterator&, const Iterator&) = default; friend auto operator<=>(const Iterator&, const Iterator&) = default; const bookmarks::BookmarkNode* operator*() const;
diff --git a/chrome/browser/browser_process_impl.cc b/chrome/browser/browser_process_impl.cc index 7c6f0b1..375bf3c9 100644 --- a/chrome/browser/browser_process_impl.cc +++ b/chrome/browser/browser_process_impl.cc
@@ -471,6 +471,9 @@ tearing_down_ = true; DCHECK(IsShuttingDown()); + features_->Shutdown(); + +// TODO(https://crbug.com/388906971): fix dead code below. #if BUILDFLAG(IS_ANDROID) accessibility_prefs_controller_.reset(); #endif @@ -480,7 +483,7 @@ safe_browsing_service()->ShutDown(); network_time_tracker_.reset(); -#if !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_CHROMEOS) +#if !BUILDFLAG(IS_CHROMEOS) // Initial cleanup for ChromeBrowserCloudManagement, shutdown components that // depend on profile and notification system. For example, ProfileManager // observer and KeyServices observer need to be removed before profiles. @@ -488,15 +491,13 @@ browser_policy_connector_->chrome_browser_cloud_management_controller(); if (cloud_management_controller) cloud_management_controller->ShutDown(); -#endif +#endif // !BUILDFLAG(IS_CHROMEOS) -#if !BUILDFLAG(IS_ANDROID) // |hid_system_tray_icon_| and |usb_system_tray_icon_| must be destroyed // before |system_notification_helper_| for ChromeOS and |status_tray_| for // non-ChromeOS. hid_system_tray_icon_.reset(); usb_system_tray_icon_.reset(); -#endif system_notification_helper_.reset(); @@ -505,7 +506,7 @@ // before the profiles, since if there are any still showing we will access // those things during teardown. notification_ui_manager_.reset(); -#endif +#endif // BUILDFLAG(ENABLE_CHROME_NOTIFICATIONS) // Debugger must be cleaned up before ProfileManager. remote_debugging_server_.reset(); @@ -517,7 +518,7 @@ // The Extensions Browser Client needs to teardown some members while the // profile manager is still alive. extensions_browser_client_->StartTearDown(); -#endif +#endif // BUILDFLAG(ENABLE_EXTENSIONS_CORE) // Need to clear profiles (download managers) before the IO thread. { @@ -535,12 +536,10 @@ profile_manager_.reset(); } -#if !BUILDFLAG(IS_ANDROID) if (media_router::DualMediaSinkService::HasInstance()) { media_router::DualMediaSinkService::GetInstance() ->StopObservingPrefChanges(); } -#endif #if BUILDFLAG(ENABLE_EXTENSIONS) // The `media_file_system_registry_` cannot be reset until the @@ -551,12 +550,12 @@ // Valgrind would report a leak on almost every single browser_test. // TODO(gbillock): Make this unnecessary. storage_monitor::StorageMonitor::Destroy(); -#endif +#endif // BUILDFLAG(ENABLE_EXTENSIONS) #if BUILDFLAG(ENABLE_CHROME_NOTIFICATIONS) if (message_center::MessageCenter::Get()) message_center::MessageCenter::Shutdown(); -#endif +#endif // BUILDFLAG(ENABLE_CHROME_NOTIFICATIONS) // The policy providers managed by |browser_policy_connector_| need to shut // down while the IO and FILE threads are still alive. The monitoring @@ -590,7 +589,9 @@ // down. application_breadcrumbs_logger_.reset(); } +#endif // !BUILDFLAG(IS_ANDROID) +#if !BUILDFLAG(IS_ANDROID) void BrowserProcessImpl::PostDestroyThreads() { // With the file_thread_ flushed, we can release any icon resources. icon_manager_.reset();
diff --git a/chrome/browser/chromeos/app_mode/kiosk_browser_session_unittest.cc b/chrome/browser/chromeos/app_mode/kiosk_browser_session_unittest.cc index 42600328..c058851c 100644 --- a/chrome/browser/chromeos/app_mode/kiosk_browser_session_unittest.cc +++ b/chrome/browser/chromeos/app_mode/kiosk_browser_session_unittest.cc
@@ -50,7 +50,6 @@ #if BUILDFLAG(IS_CHROMEOS_ASH) #include "ash/accelerators/accelerator_controller_impl.h" -#include "ash/constants/ash_features.h" #include "ash/constants/ash_switches.h" #include "ash/public/cpp/session/session_types.h" #include "ash/public/cpp/test/test_new_window_delegate.h" @@ -273,21 +272,6 @@ base::RunLoop run_loop_; }; -std::unique_ptr<web_app::WebAppInstallInfo> GetWebAppInstallInfo( - const GURL& url) { - std::unique_ptr<web_app::WebAppInstallInfo> info = - web_app::WebAppInstallInfo::CreateWithStartUrlForTesting(url); - info->scope = url.GetWithoutFilename(); - info->title = u"Web App"; - return info; -} - -web_app::WebAppInstallInfoFactory GetAppWebAppInfoFactory() { - static auto factory = base::BindRepeating( - &GetWebAppInstallInfo, GURL(content::GetWebUIURL("system-app"))); - return factory; -} - #endif // BUILDFLAG(IS_CHROMEOS_ASH) enum class KioskType { kChromeApp = 0, kWebApp = 1, kIwa = 2 }; @@ -1334,91 +1318,6 @@ KioskType::kWebApp, KioskType::kIwa)); -// Kiosk type agnostic test class. Runs all tests for web and chrome app kiosks. -// Test only the case when system web apps are enabled in the Kiosk session. -// If system web apps are disabled in the Kiosk session, the system web app -// browser cannot be created. -class KioskBrowserSessionSwaTest : public KioskBrowserSessionBaseTest<bool> { - public: - void SetUp() override { - scoped_feature_list_.InitAndEnableFeature( - ash::features::kKioskEnableSystemWebApps); - KioskBrowserSessionBaseTest<bool>::SetUp(); - web_app::test::AwaitStartWebAppProviderAndSubsystems(profile()); - } - void SetUpKioskSession() { - if (is_web_kiosk()) { - StartWebKioskSession(); - } else { - StartChromeAppKioskSession(); - } - } - - void StartAndWaitForAppsToSynchronize() { - system_web_app_manager()->ResetForTesting(); - SystemWebAppWaiter waiter(system_web_app_manager()); - system_web_app_manager()->Start(); - waiter.Wait(); - } - - std::unique_ptr<FakeBrowser> CreateSwaTestWindow() { - auto app_id = system_web_app_manager()->GetAppIdForSystemApp( - ash::SystemWebAppType::SETTINGS); - CHECK(app_id.has_value()); - - auto params = Browser::CreateParams::CreateForApp( - web_app::GenerateApplicationNameFromAppId(app_id.value()), - /*trusted_source=*/true, - /*window_bounds=*/gfx::Rect(), profile(), - /*user_gesture=*/true); - - auto test_window = std::make_unique<TestBrowserWindow>(); - params.window = test_window.get(); - // Self deleting. - new TestBrowserWindowOwner(std::move(test_window)); - - return std::make_unique<FakeBrowser>(params); - } - - ash::TestSystemWebAppManager* system_web_app_manager() { - return ash::TestSystemWebAppManager::Get(profile()); - ; - } - - private: - bool is_web_kiosk() const { return GetParam(); } - - base::test::ScopedFeatureList scoped_feature_list_; -}; - -TEST_P(KioskBrowserSessionSwaTest, OpenSystemWebApp) { - SetUpKioskSession(); - - ash::SystemWebAppDelegateMap system_apps; - system_apps.emplace( - ash::SystemWebAppType::SETTINGS, - std::make_unique<ash::UnittestingSystemAppDelegate>( - ash::SystemWebAppType::SETTINGS, "OSSettings", - GURL(content::GetWebUIURL("system-app")), GetAppWebAppInfoFactory())); - CHECK(system_web_app_manager()); - system_web_app_manager()->SetSystemAppsForTesting(std::move(system_apps)); - StartAndWaitForAppsToSynchronize(); - - EXPECT_FALSE(DidSessionCloseNewWindow(CreateSwaTestWindow())); - - histogram()->ExpectBucketCount(kKioskNewBrowserWindowHistogram, - KioskBrowserWindowType::kOpenedSystemWebApp, - 1); - histogram()->ExpectTotalCount(kKioskNewBrowserWindowHistogram, 1); -} - -// Test only the case when system web apps are enabled in the Kiosk session. -// If system web apps are disabled in the Kiosk session, the system web app -// browser cannot be created. -INSTANTIATE_TEST_SUITE_P(KioskBrowserSessionSwa, - KioskBrowserSessionSwaTest, - ::testing::Bool()); - #endif // BUILDFLAG(IS_CHROMEOS_ASH) #if BUILDFLAG(ENABLE_PLUGINS)
diff --git a/chrome/browser/chromeos/app_mode/kiosk_browser_window_handler.cc b/chrome/browser/chromeos/app_mode/kiosk_browser_window_handler.cc index 11b3f60..fbc6e4b7 100644 --- a/chrome/browser/chromeos/app_mode/kiosk_browser_window_handler.cc +++ b/chrome/browser/chromeos/app_mode/kiosk_browser_window_handler.cc
@@ -27,7 +27,6 @@ #include "ui/views/widget/widget_delegate.h" #if BUILDFLAG(IS_CHROMEOS_ASH) -#include "ash/constants/ash_features.h" #include "chrome/browser/ui/ash/system_web_apps/system_web_app_ui_utils.h" #include "kiosk_troubleshooting_controller_ash.h" #endif // BUILDFLAG(IS_CHROMEOS_ASH) @@ -115,16 +114,6 @@ return; } -#if BUILDFLAG(IS_CHROMEOS_ASH) - if (ash::IsSystemWebApp(browser) && - base::FeatureList::IsEnabled(ash::features::kKioskEnableSystemWebApps)) { - base::UmaHistogramEnumeration(kKioskNewBrowserWindowHistogram, - KioskBrowserWindowType::kOpenedSystemWebApp); - on_browser_window_added_callback_.Run(/*is_closing=*/false); - return; - } -#endif - if (IsNewBrowserWindowAllowed(browser)) { base::UmaHistogramEnumeration( kKioskNewBrowserWindowHistogram,
diff --git a/chrome/browser/component_updater/cros_component_installer_chromeos.cc b/chrome/browser/component_updater/cros_component_installer_chromeos.cc index 7afe10b..ce423fe 100644 --- a/chrome/browser/component_updater/cros_component_installer_chromeos.cc +++ b/chrome/browser/component_updater/cros_component_installer_chromeos.cc
@@ -15,6 +15,7 @@ #include "base/path_service.h" #include "base/ranges/algorithm.h" #include "base/strings/string_number_conversions.h" +#include "base/strings/to_string.h" #include "base/task/thread_pool.h" #include "chrome/browser/ash/crosapi/browser_util.h" #include "chrome/browser/ash/login/demo_mode/demo_mode_dimensions.h" @@ -237,9 +238,9 @@ demo_app_installer_attributes["store_id"] = ash::demo_mode::StoreNumber(); demo_app_installer_attributes["demo_country"] = ash::demo_mode::Country(); demo_app_installer_attributes["is_cloud_gaming_device"] = - ash::demo_mode::IsCloudGamingDevice() ? "true" : "false"; + base::ToString(ash::demo_mode::IsCloudGamingDevice()); demo_app_installer_attributes["is_feature_aware_device"] = - ash::demo_mode::IsFeatureAwareDevice() ? "true" : "false"; + base::ToString(ash::demo_mode::IsFeatureAwareDevice()); auto* const cmdline = base::CommandLine::ForCurrentProcess(); if (cmdline->HasSwitch(switches::kDemoModeTestTag)) {
diff --git a/chrome/browser/component_updater/privacy_sandbox_attestations_component_installer_test_util.cc b/chrome/browser/component_updater/privacy_sandbox_attestations_component_installer_test_util.cc index 81f8553..bab1b2ff 100644 --- a/chrome/browser/component_updater/privacy_sandbox_attestations_component_installer_test_util.cc +++ b/chrome/browser/component_updater/privacy_sandbox_attestations_component_installer_test_util.cc
@@ -12,6 +12,7 @@ #include "base/files/file_util.h" #include "base/path_service.h" #include "base/strings/string_util.h" +#include "base/strings/to_string.h" #include "base/threading/thread_restrictions.h" #include "base/version.h" #include "components/component_updater/component_updater_paths.h" @@ -70,7 +71,7 @@ "pre_installed": $2 })", /*subst=*/ - {version.GetString(), is_pre_installed ? "true" : "false"}, + {version.GetString(), base::ToString(is_pre_installed)}, /*offsets=*/nullptr)); }
diff --git a/chrome/browser/content_settings/one_time_permission_provider_unittest.cc b/chrome/browser/content_settings/one_time_permission_provider_unittest.cc index af9064b..5596a01 100644 --- a/chrome/browser/content_settings/one_time_permission_provider_unittest.cc +++ b/chrome/browser/content_settings/one_time_permission_provider_unittest.cc
@@ -3,7 +3,9 @@ // found in the LICENSE file. #include "chrome/browser/content_settings/one_time_permission_provider.h" + #include <memory> + #include "base/test/metrics/histogram_tester.h" #include "base/test/scoped_feature_list.h" #include "base/time/time.h" @@ -100,7 +102,7 @@ histograms.ExpectUniqueSample( permissions::PermissionUmaUtil::GetOneTimePermissionEventHistogram( ContentSettingsType::GEOLOCATION), - static_cast<base::HistogramBase::Sample>( + static_cast<base::HistogramBase::Sample32>( permissions::OneTimePermissionEvent::GRANTED_ONE_TIME), 1); } @@ -180,7 +182,7 @@ histograms.ExpectBucketCount( permissions::PermissionUmaUtil::GetOneTimePermissionEventHistogram( ContentSettingsType::GEOLOCATION), - static_cast<base::HistogramBase::Sample>( + static_cast<base::HistogramBase::Sample32>( permissions::OneTimePermissionEvent::GRANTED_ONE_TIME), 2); @@ -188,7 +190,7 @@ histograms.ExpectBucketCount( permissions::PermissionUmaUtil::GetOneTimePermissionEventHistogram( ContentSettingsType::GEOLOCATION), - static_cast<base::HistogramBase::Sample>( + static_cast<base::HistogramBase::Sample32>( permissions::OneTimePermissionEvent::EXPIRED_IN_BACKGROUND), 1); } @@ -233,25 +235,25 @@ histograms.ExpectBucketCount( permissions::PermissionUmaUtil::GetOneTimePermissionEventHistogram( ContentSettingsType::MEDIASTREAM_CAMERA), - static_cast<base::HistogramBase::Sample>( + static_cast<base::HistogramBase::Sample32>( permissions::OneTimePermissionEvent::GRANTED_ONE_TIME), 1); histograms.ExpectBucketCount( permissions::PermissionUmaUtil::GetOneTimePermissionEventHistogram( ContentSettingsType::MEDIASTREAM_CAMERA), - static_cast<base::HistogramBase::Sample>( + static_cast<base::HistogramBase::Sample32>( permissions::OneTimePermissionEvent::EXPIRED_IN_BACKGROUND), 1); histograms.ExpectBucketCount( permissions::PermissionUmaUtil::GetOneTimePermissionEventHistogram( ContentSettingsType::MEDIASTREAM_MIC), - static_cast<base::HistogramBase::Sample>( + static_cast<base::HistogramBase::Sample32>( permissions::OneTimePermissionEvent::GRANTED_ONE_TIME), 1); histograms.ExpectBucketCount( permissions::PermissionUmaUtil::GetOneTimePermissionEventHistogram( ContentSettingsType::MEDIASTREAM_MIC), - static_cast<base::HistogramBase::Sample>( + static_cast<base::HistogramBase::Sample32>( permissions::OneTimePermissionEvent::EXPIRED_IN_BACKGROUND), 1); } @@ -319,14 +321,14 @@ histograms.ExpectBucketCount( permissions::PermissionUmaUtil::GetOneTimePermissionEventHistogram( ContentSettingsType::GEOLOCATION), - static_cast<base::HistogramBase::Sample>( + static_cast<base::HistogramBase::Sample32>( permissions::OneTimePermissionEvent::GRANTED_ONE_TIME), 1); histograms.ExpectBucketCount( permissions::PermissionUmaUtil::GetOneTimePermissionEventHistogram( ContentSettingsType::GEOLOCATION), - static_cast<base::HistogramBase::Sample>( + static_cast<base::HistogramBase::Sample32>( permissions::OneTimePermissionEvent::REVOKED_MANUALLY), 1); } @@ -405,25 +407,25 @@ histograms.ExpectBucketCount( permissions::PermissionUmaUtil::GetOneTimePermissionEventHistogram( ContentSettingsType::MEDIASTREAM_CAMERA), - static_cast<base::HistogramBase::Sample>( + static_cast<base::HistogramBase::Sample32>( permissions::OneTimePermissionEvent::GRANTED_ONE_TIME), 1); histograms.ExpectBucketCount( permissions::PermissionUmaUtil::GetOneTimePermissionEventHistogram( ContentSettingsType::MEDIASTREAM_CAMERA), - static_cast<base::HistogramBase::Sample>( + static_cast<base::HistogramBase::Sample32>( permissions::OneTimePermissionEvent::EXPIRED_ON_SUSPEND), 1); histograms.ExpectBucketCount( permissions::PermissionUmaUtil::GetOneTimePermissionEventHistogram( ContentSettingsType::MEDIASTREAM_MIC), - static_cast<base::HistogramBase::Sample>( + static_cast<base::HistogramBase::Sample32>( permissions::OneTimePermissionEvent::GRANTED_ONE_TIME), 1); histograms.ExpectBucketCount( permissions::PermissionUmaUtil::GetOneTimePermissionEventHistogram( ContentSettingsType::MEDIASTREAM_MIC), - static_cast<base::HistogramBase::Sample>( + static_cast<base::HistogramBase::Sample32>( permissions::OneTimePermissionEvent::EXPIRED_ON_SUSPEND), 1); }
diff --git a/chrome/browser/creator/android/java/src/org/chromium/chrome/browser/creator/CreatorCoordinator.java b/chrome/browser/creator/android/java/src/org/chromium/chrome/browser/creator/CreatorCoordinator.java index a59db17..5e4b7cb 100644 --- a/chrome/browser/creator/android/java/src/org/chromium/chrome/browser/creator/CreatorCoordinator.java +++ b/chrome/browser/creator/android/java/src/org/chromium/chrome/browser/creator/CreatorCoordinator.java
@@ -397,13 +397,7 @@ mScrim = new ScrimCoordinator( mActivity, - new ScrimCoordinator.SystemUiScrimDelegate() { - @Override - public void setStatusBarScrimFraction(float scrimFraction) {} - - @Override - public void setNavigationBarScrimFraction(float scrimFraction) {} - }, + /* systemUiScrimDelegate= */ null, mCreatorViewGroup, mActivity.getColor(R.color.default_scrim_color));
diff --git a/chrome/browser/data_sharing/android/java/res/layout/recent_activity_log_item.xml b/chrome/browser/data_sharing/android/java/res/layout/recent_activity_log_item.xml index 01688c0..a91554d5 100644 --- a/chrome/browser/data_sharing/android/java/res/layout/recent_activity_log_item.xml +++ b/chrome/browser/data_sharing/android/java/res/layout/recent_activity_log_item.xml
@@ -7,19 +7,27 @@ <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/content" style="@style/ListItemContainer"> - <org.chromium.ui.widget.ChromeImageView - android:id="@+id/avatar" + <FrameLayout android:layout_width="@dimen/recent_activity_avatar_container_size" android:layout_height="@dimen/recent_activity_avatar_container_size" - android:layout_marginEnd="@dimen/recent_activity_avatar_margin_end" - android:paddingTop="@dimen/recent_activity_padding_top_bottom" - android:paddingBottom="@dimen/recent_activity_padding_top_bottom" - android:scaleType="center" - android:contentDescription="@null" - android:importantForAccessibility="no" /> + android:layout_marginEnd="@dimen/recent_activity_avatar_margin_end" > + + <org.chromium.components.browser_ui.widget.RoundedCornerImageView + android:id="@+id/avatar" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center" + app:cornerRadiusTopStart="@dimen/recent_activity_avatar_radius" + app:cornerRadiusTopEnd="@dimen/recent_activity_avatar_radius" + app:cornerRadiusBottomStart="@dimen/recent_activity_avatar_radius" + app:cornerRadiusBottomEnd="@dimen/recent_activity_avatar_radius" + android:contentDescription="@null" + android:importantForAccessibility="no" /> + </FrameLayout> <LinearLayout android:layout_width="0dp"
diff --git a/chrome/browser/data_sharing/android/java/res/values/dimens.xml b/chrome/browser/data_sharing/android/java/res/values/dimens.xml index 4dcb822..6c3d33a 100644 --- a/chrome/browser/data_sharing/android/java/res/values/dimens.xml +++ b/chrome/browser/data_sharing/android/java/res/values/dimens.xml
@@ -25,10 +25,10 @@ <dimen name="data_sharing_invitation_button_margin">8dp</dimen> <!-- Dimens for recent activity screen --> - <dimen name="recent_activity_avatar_container_size">44dp</dimen> + <dimen name="recent_activity_avatar_container_size">40dp</dimen> <dimen name="recent_activity_avatar_size">40dp</dimen> - <dimen name="recent_activity_padding_top_bottom">2dp</dimen> - <dimen name="recent_activity_avatar_margin_end">12dp</dimen> + <dimen name="recent_activity_avatar_radius">20dp</dimen> + <dimen name="recent_activity_avatar_margin_end">16dp</dimen> <dimen name="recent_activity_title_top_margin">14dp</dimen> <dimen name="recent_activity_recycler_view_top_margin">7dp</dimen>
diff --git a/chrome/browser/data_sharing/android/java/src/org/chromium/chrome/browser/data_sharing/DataSharingAvatarProvider.java b/chrome/browser/data_sharing/android/java/src/org/chromium/chrome/browser/data_sharing/DataSharingAvatarProvider.java index e129cbf..bd78498 100644 --- a/chrome/browser/data_sharing/android/java/src/org/chromium/chrome/browser/data_sharing/DataSharingAvatarProvider.java +++ b/chrome/browser/data_sharing/android/java/src/org/chromium/chrome/browser/data_sharing/DataSharingAvatarProvider.java
@@ -5,7 +5,6 @@ package org.chromium.chrome.browser.data_sharing; import android.content.Context; -import android.graphics.Bitmap; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; @@ -39,12 +38,8 @@ public void getAvatarBitmap(GroupMember member, Callback<Drawable> avatarDrawableCallback) { DataSharingAvatarCallback dataSharingAvatarCallback = bitmap -> { - Drawable drawable = - new BitmapDrawable( - mContext.getResources(), - Bitmap.createScaledBitmap( - bitmap, mAvatarSizePx, mAvatarSizePx, true)); - avatarDrawableCallback.onResult(drawable); + avatarDrawableCallback.onResult( + new BitmapDrawable(mContext.getResources(), bitmap)); }; DataSharingAvatarBitmapConfig config = new DataSharingAvatarBitmapConfig.Builder()
diff --git a/chrome/browser/data_sharing/android/java/src/org/chromium/chrome/browser/data_sharing/DataSharingTabGroupsDelegate.java b/chrome/browser/data_sharing/android/java/src/org/chromium/chrome/browser/data_sharing/DataSharingTabGroupsDelegate.java index 3079b7d..ed611cc 100644 --- a/chrome/browser/data_sharing/android/java/src/org/chromium/chrome/browser/data_sharing/DataSharingTabGroupsDelegate.java +++ b/chrome/browser/data_sharing/android/java/src/org/chromium/chrome/browser/data_sharing/DataSharingTabGroupsDelegate.java
@@ -28,6 +28,14 @@ public void openLearnMoreSharedTabGroupsPage(Context context, GURL gurl); /** + * Open url in the Chrome Custom Tab. + * + * @param context The context of the current activity. + * @param gurl The GURL of the page to be opened in CCT. + */ + public void openUrlInChromeCustomTab(Context context, GURL gurl); + + /** * Create a preview image for the tab group to show in share sheet. * * @param collaborationId The collaboration ID of the tab group.
diff --git a/chrome/browser/data_sharing/android/java/src/org/chromium/chrome/browser/data_sharing/DataSharingTabManager.java b/chrome/browser/data_sharing/android/java/src/org/chromium/chrome/browser/data_sharing/DataSharingTabManager.java index e94e6a9..ba630a6 100644 --- a/chrome/browser/data_sharing/android/java/src/org/chromium/chrome/browser/data_sharing/DataSharingTabManager.java +++ b/chrome/browser/data_sharing/android/java/src/org/chromium/chrome/browser/data_sharing/DataSharingTabManager.java
@@ -83,6 +83,8 @@ private static final String TAG = "DataSharing"; private static final String LEARN_MORE_SHARED_TAB_GROUP_PAGE_URL = "https://support.google.com/chrome/?p=chrome_collaboration"; + private static final String LEARN_ABOUT_BLOCKED_ACCOUNTS_URL = + "https://support.google.com/chrome/?p=chrome_collaboration"; private final ObservableSupplier<TabModelSelector> mTabModelSelectorSupplier; private final DataSharingTabGroupsDelegate mDataSharingTabGroupsDelegate; @@ -285,6 +287,10 @@ return new GURL(LEARN_MORE_SHARED_TAB_GROUP_PAGE_URL); } + private GURL getLearnAboutBlockedAccountsUrl() { + return new GURL(LEARN_ABOUT_BLOCKED_ACCOUNTS_URL); + } + private void initiateJoinFlowWithProfile(Activity activity, GURL dataSharingUrl) { DataSharingMetrics.recordJoinActionFlowState( DataSharingMetrics.JoinActionStateAndroid.PROFILE_AVAILABLE); @@ -768,6 +774,24 @@ .setResourceId( DataSharingStringConfig.StringKey.LEARN_ABOUT_SHARED_TAB_GROUPS, R.string.collaboration_learn_about_shared_groups) + .setResourceId( + DataSharingStringConfig.StringKey.BLOCK_MESSAGE, + R.string.collaboration_owner_block_dialog_body) + .setResourceId( + DataSharingStringConfig.StringKey.BLOCK_AND_LEAVE_GROUP_MESSAGE, + R.string.collaboration_block_leave_dialog_body) + .setResourceId( + DataSharingStringConfig.StringKey.LEARN_ABOUT_BLOCKED_ACCOUNTS, + R.string.collaboration_block_leave_learn_more) + .setResourceId( + DataSharingStringConfig.StringKey.REMOVE_MESSAGE, + R.string.collaboration_owner_remove_member_dialog_body) + .setResourceId( + DataSharingStringConfig.StringKey.LEAVE_GROUP_MESSAGE, + R.string.collaboration_leave_dialog_body) + .setResourceId( + DataSharingStringConfig.StringKey.STOP_SHARING_MESSAGE, + R.string.collaboration_owner_stop_sharing_dialog_body) .build(); DataSharingManageUiConfig.ManageCallback manageCallback = @@ -811,7 +835,8 @@ new DataSharingManageUiConfig.Builder() .setGroupToken(new GroupToken(collaborationId, null)) .setManageCallback(manageCallback) - .setCommonConfig(getCommonConfig(activity, null, stringConfig)) + .setLearnAboutBlockedAccounts(getLearnAboutBlockedAccountsUrl()) + .setCommonConfig(getCommonConfig(activity, tabGroupName, stringConfig)) .build(); uiDelegate.showManageFlow(manageConfig); } @@ -825,6 +850,11 @@ mDataSharingTabGroupsDelegate.openLearnMoreSharedTabGroupsPage( context, url); } + + @Override + public void onClickOpenChromeCustomTab(Context context, GURL url) { + mDataSharingTabGroupsDelegate.openUrlInChromeCustomTab(context, url); + } }; DataSharingUiConfig.Builder commonConfig = new DataSharingUiConfig.Builder()
diff --git a/chrome/browser/enterprise/connectors/analysis/content_analysis_dialog.cc b/chrome/browser/enterprise/connectors/analysis/content_analysis_dialog.cc index 00b0aff..003dc79f 100644 --- a/chrome/browser/enterprise/connectors/analysis/content_analysis_dialog.cc +++ b/chrome/browser/enterprise/connectors/analysis/content_analysis_dialog.cc
@@ -18,7 +18,6 @@ #include "components/constrained_window/constrained_window_views.h" #include "components/strings/grit/components_strings.h" #include "components/vector_icons/vector_icons.h" -#include "components/web_modal/web_contents_modal_dialog_manager.h" #include "content/public/browser/browser_task_traits.h" #include "content/public/browser/browser_thread.h" #include "content/public/browser/web_contents.h" @@ -285,20 +284,6 @@ return; } - auto* manager = - web_modal::WebContentsModalDialogManager::FromWebContents(web_contents()); - if (!manager) { - // `manager` being null indicates that `web_contents()` doesn't correspond - // to a browser tab (ex: an extension background page reading the - // clipboard). In such a case, we don't show a dialog and instead simply - // accept/cancel the result immediately. See crbug.com/374120523 and - // crbug.com/388049470 for more context. - if (!is_pending()) { - CancelButtonCallback(); - } - return; - } - // If the web contents is still valid when the delay timer goes off and the // dialog has not yet been shown, show it now. if (web_contents() && !contents_view_) {
diff --git a/chrome/browser/enterprise/connectors/analysis/content_analysis_dialog_browsertest.cc b/chrome/browser/enterprise/connectors/analysis/content_analysis_dialog_browsertest.cc index 190fce9..cf23f05d6 100644 --- a/chrome/browser/enterprise/connectors/analysis/content_analysis_dialog_browsertest.cc +++ b/chrome/browser/enterprise/connectors/analysis/content_analysis_dialog_browsertest.cc
@@ -22,15 +22,12 @@ #include "chrome/browser/enterprise/connectors/test/fake_content_analysis_delegate.h" #include "chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_utils.h" #include "chrome/browser/ui/browser.h" -#include "chrome/browser/ui/browser_window.h" #include "chrome/browser/ui/test/test_browser_dialog.h" -#include "chrome/browser/ui/webui/chrome_web_contents_handler.h" #include "chrome/grit/generated_resources.h" #include "chrome/grit/theme_resources.h" #include "components/download/public/common/mock_download_item.h" #include "components/enterprise/common/proto/connectors.pb.h" #include "components/prefs/scoped_user_pref_update.h" -#include "components/web_modal/web_contents_modal_dialog_manager.h" #include "content/public/browser/web_contents_observer.h" #include "content/public/test/browser_test.h" #include "content/public/test/browser_test_utils.h" @@ -42,10 +39,8 @@ #include "ui/views/controls/image_view.h" #include "ui/views/controls/textarea/textarea.h" #include "ui/views/controls/throbber.h" -#include "ui/views/controls/webview/web_dialog_view.h" #include "ui/views/test/ax_event_counter.h" #include "ui/views/test/views_test_utils.h" -#include "ui/web_dialogs/test/test_web_dialog_delegate.h" namespace enterprise_connectors { @@ -280,34 +275,7 @@ base::TimeDelta response_delay() const { return std::get<2>(GetParam()); } - void SetUpOnMainThread() override { - ui::test::TestWebDialogDelegate* delegate = - new ui::test::TestWebDialogDelegate(GURL(url::kAboutBlankURL)); - - auto view = std::make_unique<views::WebDialogView>( - browser()->profile(), delegate, - std::make_unique<ChromeWebContentsHandler>()); - view->SetOwnedByWidget(true); - gfx::NativeView parent_view = - browser()->tab_strip_model()->GetActiveWebContents()->GetNativeView(); - view_ = view.get(); - view_tracker_.SetView(view_); - - auto* widget = - views::Widget::CreateWindowWithParent(std::move(view), parent_view); - widget->Show(); - - EXPECT_TRUE(content::WaitForLoadStop(view_->web_contents())); - } - - content::WebContents* GetWebViewDialogContents() { - return view_->web_contents(); - } - private: - views::ViewTracker view_tracker_; - raw_ptr<views::WebDialogView, DisableDanglingPtrDetection> view_ = nullptr; - raw_ptr<ContentAnalysisDialog, DanglingUntriaged> dialog_; base::TimeTicks ctor_called_timestamp_; @@ -621,43 +589,6 @@ EXPECT_TRUE(called); } -IN_PROC_BROWSER_TEST_P(ContentAnalysisDialogBehaviorBrowserTest, - NoWebContentsModalDialogManager) { - base::ScopedAllowBlockingForTesting allow_blocking; - - // Setup policies to enable deep scanning, its UI and the responses to be - // simulated. - enterprise_connectors::test::SetAnalysisConnector( - browser()->profile()->GetPrefs(), FILE_ATTACHED, - kBlockingScansForDlpAndMalware); - SetStatusCallbackResponse( - safe_browsing::SimpleContentAnalysisResponseForTesting( - dlp_success(), malware_success(), /*has_custom_rule_message=*/false)); - - // Set up delegate test values. - test::FakeContentAnalysisDelegate::SetResponseDelay(response_delay()); - SetUpDelegate(); - - base::RunLoop run_loop; - ContentAnalysisDelegate::Data data; - CreateFilesForTest({"foo.doc"}, {"content"}, &data); - ASSERT_TRUE(ContentAnalysisDelegate::IsEnabled( - browser()->profile(), GURL(kTestUrl), &data, - enterprise_connectors::AnalysisConnector::FILE_ATTACHED)); - - ContentAnalysisDelegate::CreateForWebContents( - GetWebViewDialogContents(), std::move(data), - base::BindOnce( - [](base::OnceClosure quit_closure, - const ContentAnalysisDelegate::Data& data, - ContentAnalysisDelegate::Result& result) { - std::move(quit_closure).Run(); - }, - run_loop.QuitClosure()), - safe_browsing::DeepScanAccessPoint::UPLOAD); - run_loop.Run(); -} - // The scan type controls if DLP, malware or both are enabled via policies. The // dialog currently behaves identically in all 3 cases, so this parameter // ensures this assumption is not broken by new code.
diff --git a/chrome/browser/extensions/api/automation/automation_apitest.cc b/chrome/browser/extensions/api/automation/automation_apitest.cc index 18924bc..2d95074 100644 --- a/chrome/browser/extensions/api/automation/automation_apitest.cc +++ b/chrome/browser/extensions/api/automation/automation_apitest.cc
@@ -507,7 +507,13 @@ << message_; } -IN_PROC_BROWSER_TEST_P(AutomationApiTestWithContextType, TreeChange) { +// TODO(crbug.com/389060012): Flaky on Win. +#if BUILDFLAG(IS_WIN) +#define MAYBE_TreeChange DISABLED_TreeChange +#else +#define MAYBE_TreeChange TreeChange +#endif +IN_PROC_BROWSER_TEST_P(AutomationApiTestWithContextType, MAYBE_TreeChange) { StartEmbeddedTestServer(); ASSERT_TRUE(CreateExtensionAndRunTest("tabs/tree_change.js")) << message_; }
diff --git a/chrome/browser/extensions/api/bluetooth_low_energy/bluetooth_low_energy_apitest.cc b/chrome/browser/extensions/api/bluetooth_low_energy/bluetooth_low_energy_apitest.cc index 0f1b000e..6d8747a 100644 --- a/chrome/browser/extensions/api/bluetooth_low_energy/bluetooth_low_energy_apitest.cc +++ b/chrome/browser/extensions/api/bluetooth_low_energy/bluetooth_low_energy_apitest.cc
@@ -2,11 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifdef UNSAFE_BUFFERS_BUILD -// TODO(crbug.com/40285824): Remove this and convert code to safer constructs. -#pragma allow_unsafe_buffers -#endif - #include <stdint.h> #include <memory> @@ -163,9 +158,7 @@ BluetoothUUID(kTestCharacteristicUuid0), kTestCharacteristicProperties0, BluetoothRemoteGattCharacteristic::PERMISSION_NONE); - default_value.assign(kTestCharacteristicDefaultValue0, - (kTestCharacteristicDefaultValue0 + - sizeof(kTestCharacteristicDefaultValue0))); + default_value = base::ToVector(kTestCharacteristicDefaultValue0); ON_CALL(*chrc0_, GetValue()).WillByDefault(ReturnRefOfCopy(default_value)); chrc1_ = @@ -174,9 +167,7 @@ BluetoothUUID(kTestCharacteristicUuid1), kTestCharacteristicProperties1, BluetoothRemoteGattCharacteristic::PERMISSION_NONE); - default_value.assign(kTestCharacteristicDefaultValue1, - (kTestCharacteristicDefaultValue1 + - sizeof(kTestCharacteristicDefaultValue1))); + default_value = base::ToVector(kTestCharacteristicDefaultValue1); ON_CALL(*chrc1_, GetValue()).WillByDefault(ReturnRefOfCopy(default_value)); chrc2_ = @@ -189,17 +180,13 @@ desc0_ = std::make_unique<testing::NiceMock<MockBluetoothGattDescriptor>>( chrc0_.get(), kTestDescriptorId0, BluetoothUUID(kTestDescriptorUuid0), BluetoothRemoteGattCharacteristic::PERMISSION_NONE); - default_value.assign( - kTestDescriptorDefaultValue0, - (kTestDescriptorDefaultValue0 + sizeof(kTestDescriptorDefaultValue0))); + default_value = base::ToVector(kTestDescriptorDefaultValue0); ON_CALL(*desc0_, GetValue()).WillByDefault(ReturnRefOfCopy(default_value)); desc1_ = std::make_unique<testing::NiceMock<MockBluetoothGattDescriptor>>( chrc0_.get(), kTestDescriptorId1, BluetoothUUID(kTestDescriptorUuid1), BluetoothRemoteGattCharacteristic::PERMISSION_NONE); - default_value.assign( - kTestDescriptorDefaultValue1, - (kTestDescriptorDefaultValue1 + sizeof(kTestDescriptorDefaultValue1))); + default_value = base::ToVector(kTestDescriptorDefaultValue1); ON_CALL(*desc1_, GetValue()).WillByDefault(ReturnRefOfCopy(default_value)); }
diff --git a/chrome/browser/extensions/api/braille_display_private/brlapi_connection.cc b/chrome/browser/extensions/api/braille_display_private/brlapi_connection.cc index db3614c..a3522ca5 100644 --- a/chrome/browser/extensions/api/braille_display_private/brlapi_connection.cc +++ b/chrome/browser/extensions/api/braille_display_private/brlapi_connection.cc
@@ -2,15 +2,11 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifdef UNSAFE_BUFFERS_BUILD -// TODO(crbug.com/40285824): Remove this and convert code to safer constructs. -#pragma allow_unsafe_buffers -#endif - #include "chrome/browser/extensions/api/braille_display_private/brlapi_connection.h" #include <errno.h> +#include <array> #include <string> #include "base/files/file_descriptor_watcher_posix.h" @@ -83,7 +79,7 @@ VLOG(1) << "Error connecting to brlapi: " << BrlapiStrError(); return ConnectResultForError(); } - int path[2] = {0, 0}; + std::array path = {0, 0}; int pathElements = 0; #if BUILDFLAG(IS_CHROMEOS) if (base::SysInfo::IsRunningOnChromeOS()) @@ -92,7 +88,7 @@ if (pathElements == 0 && getenv("WINDOWPATH") == nullptr) path[pathElements++] = kDefaultTtyLinux; if (libbrlapi_loader_->brlapi__enterTtyModeWithPath( - handle_.get(), path, pathElements, nullptr) < 0) { + handle_.get(), &path[0], pathElements, nullptr) < 0) { LOG(ERROR) << "brlapi: couldn't enter tty mode: " << BrlapiStrError(); Disconnect(); return CONNECT_ERROR_RETRY;
diff --git a/chrome/browser/extensions/api/downloads/downloads_api_browsertest.cc b/chrome/browser/extensions/api/downloads/downloads_api_browsertest.cc index 27e2d66..2017856 100644 --- a/chrome/browser/extensions/api/downloads/downloads_api_browsertest.cc +++ b/chrome/browser/extensions/api/downloads/downloads_api_browsertest.cc
@@ -2,11 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifdef UNSAFE_BUFFERS_BUILD -// TODO(crbug.com/40285824): Remove this and convert code to safer constructs. -#pragma allow_unsafe_buffers -#endif - #include "chrome/browser/extensions/api/downloads/downloads_api.h" #include <stddef.h> @@ -19,6 +14,7 @@ #include <string_view> #include "base/containers/circular_deque.h" +#include "base/containers/span.h" #include "base/files/file_util.h" #include "base/functional/bind.h" #include "base/functional/callback_helpers.h" @@ -509,9 +505,9 @@ // array. |count| is the number of elements in |history_info|. On success, // |items| will contain |count| DownloadItems in the order that they were // specified in |history_info|. Returns true on success and false otherwise. - bool CreateHistoryDownloads(const HistoryDownloadInfo* history_info, - size_t count, - DownloadManager::DownloadVector* items) { + bool CreateHistoryDownloads( + base::span<const HistoryDownloadInfo> history_info, + DownloadManager::DownloadVector* items) { DownloadIdComparator download_id_comparator; base::Time current = base::Time::Now(); items->clear(); @@ -519,7 +515,7 @@ CHECK(items->empty()); std::vector<GURL> url_chain; url_chain.push_back(GURL()); - for (size_t i = 0; i < count; ++i) { + for (size_t i = 0; i < history_info.size(); ++i) { DownloadItem* item = GetOnRecordManager()->CreateDownloadItem( base::Uuid::GenerateRandomV4().AsLowercaseString(), download::DownloadItem::kInvalidId + 1 + i, @@ -538,9 +534,9 @@ std::string(), // hash history_info[i].state, // state history_info[i].danger_type, - (history_info[i].state != download::DownloadItem::CANCELLED - ? download::DOWNLOAD_INTERRUPT_REASON_NONE - : download::DOWNLOAD_INTERRUPT_REASON_USER_CANCELED), + history_info[i].state != download::DownloadItem::CANCELLED + ? download::DOWNLOAD_INTERRUPT_REASON_NONE + : download::DOWNLOAD_INTERRUPT_REASON_USER_CANCELED, false, // opened current, // last_access_time false, std::vector<DownloadItem::ReceivedSlice>()); @@ -1117,8 +1113,7 @@ {FILE_PATH_LITERAL("file.txt"), DownloadItem::COMPLETE, download::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS}}; DownloadManager::DownloadVector all_downloads; - ASSERT_TRUE(CreateHistoryDownloads(kHistoryInfo, std::size(kHistoryInfo), - &all_downloads)); + ASSERT_TRUE(CreateHistoryDownloads(kHistoryInfo, &all_downloads)); DownloadItem* download_item = all_downloads[0]; ASSERT_TRUE(download_item); EXPECT_FALSE(download_item->GetFileExternallyRemoved()); @@ -1255,8 +1250,7 @@ {FILE_PATH_LITERAL("fake.txt"), DownloadItem::COMPLETE, download::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS}}; DownloadManager::DownloadVector all_downloads; - ASSERT_TRUE(CreateHistoryDownloads(kHistoryInfo, std::size(kHistoryInfo), - &all_downloads)); + ASSERT_TRUE(CreateHistoryDownloads(kHistoryInfo, &all_downloads)); base::FilePath real_path = all_downloads[0]->GetTargetFilePath(); base::FilePath fake_path = all_downloads[1]->GetTargetFilePath(); @@ -1351,8 +1345,7 @@ {FILE_PATH_LITERAL("baz"), DownloadItem::COMPLETE, download::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS}}; DownloadManager::DownloadVector all_downloads; - ASSERT_TRUE(CreateHistoryDownloads(kHistoryInfo, std::size(kHistoryInfo), - &all_downloads)); + ASSERT_TRUE(CreateHistoryDownloads(kHistoryInfo, &all_downloads)); std::optional<base::Value> result = RunFunctionAndReturnResult( base::MakeRefCounted<DownloadsSearchFunction>(), @@ -1412,8 +1405,7 @@ {FILE_PATH_LITERAL("baz"), DownloadItem::COMPLETE, download::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS}}; DownloadManager::DownloadVector items; - ASSERT_TRUE( - CreateHistoryDownloads(kHistoryInfo, std::size(kHistoryInfo), &items)); + ASSERT_TRUE(CreateHistoryDownloads(kHistoryInfo, &items)); std::optional<base::Value> result = RunFunctionAndReturnResult( base::MakeRefCounted<DownloadsSearchFunction>(), @@ -1443,8 +1435,7 @@ {FILE_PATH_LITERAL("baz"), DownloadItem::COMPLETE, download::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS}}; DownloadManager::DownloadVector items; - ASSERT_TRUE( - CreateHistoryDownloads(kHistoryInfo, std::size(kHistoryInfo), &items)); + ASSERT_TRUE(CreateHistoryDownloads(kHistoryInfo, &items)); std::optional<base::Value> result = RunFunctionAndReturnResult( base::MakeRefCounted<DownloadsSearchFunction>(), "[{\"orderBy\": []}]"); @@ -1477,8 +1468,7 @@ {FILE_PATH_LITERAL("baz"), DownloadItem::COMPLETE, download::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS}}; DownloadManager::DownloadVector items; - ASSERT_TRUE( - CreateHistoryDownloads(kHistoryInfo, std::size(kHistoryInfo), &items)); + ASSERT_TRUE(CreateHistoryDownloads(kHistoryInfo, &items)); std::optional<base::Value> result = RunFunctionAndReturnResult( base::MakeRefCounted<DownloadsSearchFunction>(), @@ -1550,8 +1540,7 @@ download::DOWNLOAD_DANGER_TYPE_DANGEROUS_CONTENT}, }; DownloadManager::DownloadVector items; - ASSERT_TRUE( - CreateHistoryDownloads(kHistoryInfo, std::size(kHistoryInfo), &items)); + ASSERT_TRUE(CreateHistoryDownloads(kHistoryInfo, &items)); std::optional<base::Value> result = RunFunctionAndReturnResult( base::MakeRefCounted<DownloadsSearchFunction>(),
diff --git a/chrome/browser/extensions/api/image_writer_private/operation.cc b/chrome/browser/extensions/api/image_writer_private/operation.cc index 11d4e16..9e0be495 100644 --- a/chrome/browser/extensions/api/image_writer_private/operation.cc +++ b/chrome/browser/extensions/api/image_writer_private/operation.cc
@@ -2,17 +2,13 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifdef UNSAFE_BUFFERS_BUILD -// TODO(crbug.com/40285824): Remove this and convert code to safer constructs. -#pragma allow_unsafe_buffers -#endif - #include "chrome/browser/extensions/api/image_writer_private/operation.h" #include <string_view> #include <utility> #include "base/containers/heap_array.h" +#include "base/containers/span.h" #include "base/files/file_util.h" #include "base/functional/bind.h" #include "base/task/thread_pool.h" @@ -307,7 +303,6 @@ CHECK_LE(bytes_processed, bytes_total); - auto buffer = base::HeapArray<char>::Uninit(kMD5BufferSize); int read_size = std::min(bytes_total - bytes_processed, static_cast<int64_t>(kMD5BufferSize)); @@ -317,7 +312,10 @@ base::MD5Final(&digest, &md5_context_); std::move(callback).Run(base::MD5DigestToBase16(digest)); } else { - int len = file.Read(bytes_processed, buffer.data(), read_size); + auto buffer = base::HeapArray<char>::Uninit(kMD5BufferSize); + int len = + file.Read(bytes_processed, base::as_writable_bytes(buffer.as_span())) + .value_or(0); if (len == read_size) { // Process data.
diff --git a/chrome/browser/extensions/api/image_writer_private/tar_extractor.cc b/chrome/browser/extensions/api/image_writer_private/tar_extractor.cc index a8870783..6b72ac5 100644 --- a/chrome/browser/extensions/api/image_writer_private/tar_extractor.cc +++ b/chrome/browser/extensions/api/image_writer_private/tar_extractor.cc
@@ -2,13 +2,9 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifdef UNSAFE_BUFFERS_BUILD -// TODO(crbug.com/40285824): Remove this and convert code to safer constructs. -#pragma allow_unsafe_buffers -#endif - #include "chrome/browser/extensions/api/image_writer_private/tar_extractor.h" +#include <array> #include <utility> #include "base/files/file.h" @@ -27,7 +23,7 @@ FILE_PATH_LITERAL("extracted.bin"); // https://www.gnu.org/software/tar/manual/html_node/Standard.html -constexpr char kExpectedMagic[5] = {'u', 's', 't', 'a', 'r'}; +constexpr unsigned char kExpectedMagic[5] = {'u', 's', 't', 'a', 'r'}; constexpr int kMagicOffset = 257; } // namespace @@ -43,13 +39,13 @@ // Tar header record is always 512 bytes, so if the file is shorter than that, // it's not tar. - char header[512] = {}; - if (src_file.ReadAtCurrentPos(header, sizeof(header)) != sizeof(header)) { + std::array<unsigned char, 512> header = {}; + if (src_file.ReadAtCurrentPos(header).value_or(0) != std::size(header)) { return false; } - return std::equal(kExpectedMagic, kExpectedMagic + sizeof(kExpectedMagic), - header + kMagicOffset); + return std::equal(std::begin(kExpectedMagic), std::end(kExpectedMagic), + &header[kMagicOffset]); } // static
diff --git a/chrome/browser/extensions/api/image_writer_private/write_from_url_operation_unittest.cc b/chrome/browser/extensions/api/image_writer_private/write_from_url_operation_unittest.cc index b4e3e64..ab317fe 100644 --- a/chrome/browser/extensions/api/image_writer_private/write_from_url_operation_unittest.cc +++ b/chrome/browser/extensions/api/image_writer_private/write_from_url_operation_unittest.cc
@@ -2,11 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifdef UNSAFE_BUFFERS_BUILD -// TODO(crbug.com/40285824): Remove this and convert code to safer constructs. -#pragma allow_unsafe_buffers -#endif - #include "chrome/browser/extensions/api/image_writer_private/write_from_url_operation.h" #include <utility>
diff --git a/chrome/browser/extensions/api/image_writer_private/zip_extractor.cc b/chrome/browser/extensions/api/image_writer_private/zip_extractor.cc index b62a5ba..3e624ada 100644 --- a/chrome/browser/extensions/api/image_writer_private/zip_extractor.cc +++ b/chrome/browser/extensions/api/image_writer_private/zip_extractor.cc
@@ -2,11 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifdef UNSAFE_BUFFERS_BUILD -// TODO(crbug.com/40285824): Remove this and convert code to safer constructs. -#pragma allow_unsafe_buffers -#endif - #include "chrome/browser/extensions/api/image_writer_private/zip_extractor.h" #include <algorithm> @@ -24,7 +19,7 @@ namespace { // https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT -constexpr char kExpectedMagic[4] = {'P', 'K', 0x03, 0x04}; +constexpr unsigned char kExpectedMagic[4] = {'P', 'K', 0x03, 0x04}; } // namespace @@ -37,12 +32,13 @@ return false; constexpr size_t kExpectedSize = sizeof(kExpectedMagic); - char actual_magic[kExpectedSize] = {}; - if (infile.ReadAtCurrentPos(actual_magic, kExpectedSize) != kExpectedSize) + std::array<unsigned char, kExpectedSize> actual_magic = {}; + if (infile.ReadAtCurrentPos(actual_magic).value_or(0) != kExpectedSize) { return false; + } - return std::equal(kExpectedMagic, kExpectedMagic + kExpectedSize, - actual_magic); + return std::equal(std::begin(kExpectedMagic), std::end(kExpectedMagic), + actual_magic.begin()); } // static
diff --git a/chrome/browser/extensions/api/messaging/native_messaging_test_echo_host.cc b/chrome/browser/extensions/api/messaging/native_messaging_test_echo_host.cc index 502cb06..4702bb3 100644 --- a/chrome/browser/extensions/api/messaging/native_messaging_test_echo_host.cc +++ b/chrome/browser/extensions/api/messaging/native_messaging_test_echo_host.cc
@@ -2,15 +2,11 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifdef UNSAFE_BUFFERS_BUILD -// TODO(crbug.com/40285824): Remove this and convert code to safer constructs. -#pragma allow_unsafe_buffers -#endif - // This is a simple Native Message Host application. It echoes any messages // it receives. #include <windows.h> +#include <stdint.h> #include <string.h> #include "base/containers/span.h" @@ -25,8 +21,9 @@ // Read and echo messages in a loop. while (true) { // Read the message's length prefix. - size_t bytes_read = read_stream.ReadAtCurrentPos( - reinterpret_cast<char*>(&message_len), sizeof(message_len)); + size_t bytes_read = + read_stream.ReadAtCurrentPos(base::byte_span_from_ref(message_len)) + .value_or(0); // If stdin was closed, the host should exit. if (bytes_read != sizeof(message_len)) { @@ -34,9 +31,8 @@ } // Read the message body. - std::string message_body(message_len, '\0'); - bytes_read = - read_stream.ReadAtCurrentPos(std::data(message_body), message_len); + std::vector<uint8_t> message_body(message_len, '\0'); + bytes_read = read_stream.ReadAtCurrentPos(message_body).value_or(0); // Bail if we failed to read the entire message. if (bytes_read != message_len) { @@ -45,6 +41,6 @@ // Reply by echoing the message length and body. write_stream.WriteAtCurrentPos(base::byte_span_from_ref(message_len)); - write_stream.WriteAtCurrentPos(base::as_byte_span(message_body)); + write_stream.WriteAtCurrentPos(message_body); } }
diff --git a/chrome/browser/extensions/api/metrics_private/metrics_apitest.cc b/chrome/browser/extensions/api/metrics_private/metrics_apitest.cc index 37aef71..e92dd508 100644 --- a/chrome/browser/extensions/api/metrics_private/metrics_apitest.cc +++ b/chrome/browser/extensions/api/metrics_private/metrics_apitest.cc
@@ -2,15 +2,12 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifdef UNSAFE_BUFFERS_BUILD -// TODO(crbug.com/40285824): Remove this and convert code to safer constructs. -#pragma allow_unsafe_buffers -#endif - #include <stddef.h> +#include <array> #include <map> +#include "base/containers/span.h" #include "base/metrics/field_trial.h" #include "base/metrics/field_trial_params.h" #include "base/metrics/histogram_macros.h" @@ -26,18 +23,18 @@ // The tests that are run by this extension are expected to record the following // user actions, with the specified counts. If the tests in test.js are // modified, this array may need to be updated. -struct RecordedUserAction { +constexpr struct RecordedUserAction { const char* name; int count; // number of times the metric was recorded. } g_user_actions[] = { - {"test.ua.1", 1}, - {"test.ua.2", 2}, + {"test.ua.1", 1}, + {"test.ua.2", 2}, }; // The tests that are run by this extension are expected to record the following // histograms. If the tests in test.js are modified, this array may need to be // updated. -struct RecordedHistogram { +constexpr struct RecordedHistogram { const char* name; base::HistogramType type; int min; @@ -45,20 +42,21 @@ size_t buckets; int count; } g_histograms[] = { - {"test.h.1", base::HISTOGRAM, 1, 100, 50, 1}, // custom - {"test.h.2", base::LINEAR_HISTOGRAM, 1, 200, 50, 1}, // custom - {"test.h.3", base::LINEAR_HISTOGRAM, 1, 101, 102, 2}, // percentage - {"test.sparse.1", base::SPARSE_HISTOGRAM, 0, 0, 0, 1}, - {"test.sparse.2", base::SPARSE_HISTOGRAM, 0, 0, 0, 2}, - {"test.sparse.3", base::SPARSE_HISTOGRAM, 0, 0, 0, 6}, - {"test.time", base::HISTOGRAM, 1, 10000, 50, 1}, - {"test.medium.time", base::HISTOGRAM, 1, 180000, 50, 1}, - {"test.long.time", base::HISTOGRAM, 1, 3600000, 50, 1}, - {"test.count", base::HISTOGRAM, 1, 1000000, 50, 1}, - {"test.medium.count", base::HISTOGRAM, 1, 10000, 50, 1}, - {"test.small.count", base::HISTOGRAM, 1, 100, 50, 1}, - {"test.bucketchange.linear", base::LINEAR_HISTOGRAM, 1, 100, 10, 2}, - {"test.bucketchange.log", base::HISTOGRAM, 1, 100, 10, 2}, }; + {"test.h.1", base::HISTOGRAM, 1, 100, 50, 1}, // custom + {"test.h.2", base::LINEAR_HISTOGRAM, 1, 200, 50, 1}, // custom + {"test.h.3", base::LINEAR_HISTOGRAM, 1, 101, 102, 2}, // percentage + {"test.sparse.1", base::SPARSE_HISTOGRAM, 0, 0, 0, 1}, + {"test.sparse.2", base::SPARSE_HISTOGRAM, 0, 0, 0, 2}, + {"test.sparse.3", base::SPARSE_HISTOGRAM, 0, 0, 0, 6}, + {"test.time", base::HISTOGRAM, 1, 10000, 50, 1}, + {"test.medium.time", base::HISTOGRAM, 1, 180000, 50, 1}, + {"test.long.time", base::HISTOGRAM, 1, 3600000, 50, 1}, + {"test.count", base::HISTOGRAM, 1, 1000000, 50, 1}, + {"test.medium.count", base::HISTOGRAM, 1, 10000, 50, 1}, + {"test.small.count", base::HISTOGRAM, 1, 100, 50, 1}, + {"test.bucketchange.linear", base::LINEAR_HISTOGRAM, 1, 100, 10, 2}, + {"test.bucketchange.log", base::HISTOGRAM, 1, 100, 10, 2}, +}; // Represents a bucket in a sparse histogram. struct Bucket { @@ -67,20 +65,17 @@ }; // We expect the following sparse histograms. -struct SparseHistogram { +constexpr struct SparseHistogram { const char* name; int bucket_count; - Bucket buckets[10]; -} g_sparse_histograms[] = { - {"test.sparse.1", 1, {{42, 1}}}, - {"test.sparse.2", 1, {{24, 2}}}, - {"test.sparse.3", 3, {{1, 1}, {2, 2}, {3, 3}}}}; + std::array<Bucket, 3> buckets; +} g_sparse_histograms[] = {{"test.sparse.1", 1, {{{42, 1}}}}, + {"test.sparse.2", 1, {{{24, 2}}}}, + {"test.sparse.3", 3, {{{1, 1}, {2, 2}, {3, 3}}}}}; void ValidateUserActions(const base::UserActionTester& user_action_tester, - const RecordedUserAction* recorded, - int count) { - for (int i = 0; i < count; ++i) { - const RecordedUserAction& ua = recorded[i]; + base::span<const RecordedUserAction> recorded) { + for (const auto& ua : recorded) { EXPECT_EQ(ua.count, user_action_tester.GetActionCount(ua.name)); } } @@ -98,8 +93,7 @@ } } -void ValidateHistograms(const RecordedHistogram* recorded, - int count) { +void ValidateHistograms(base::span<const RecordedHistogram> recorded) { const base::StatisticsRecorder::Histograms histograms = base::StatisticsRecorder::GetHistograms(); @@ -107,8 +101,7 @@ // we will ignore those. This function validates that all the histogram we // expect to see are present in the list, and that their basic info is // correct. - for (int i = 0; i < count; ++i) { - const RecordedHistogram& r = recorded[i]; + for (const auto& r : recorded) { size_t j = 0; for (j = 0; j < histograms.size(); ++j) { base::HistogramBase* histogram(histograms[j]); @@ -165,9 +158,8 @@ ASSERT_TRUE(RunExtensionTest("metrics", {}, {.load_as_component = true})) << message_; - ValidateUserActions(user_action_tester, g_user_actions, - std::size(g_user_actions)); - ValidateHistograms(g_histograms, std::size(g_histograms)); + ValidateUserActions(user_action_tester, g_user_actions); + ValidateHistograms(g_histograms); } } // namespace extensions
diff --git a/chrome/browser/extensions/api/preference/preference_api_prefs_unittest.cc b/chrome/browser/extensions/api/preference/preference_api_prefs_unittest.cc index 11c249f..a70cde41 100644 --- a/chrome/browser/extensions/api/preference/preference_api_prefs_unittest.cc +++ b/chrome/browser/extensions/api/preference/preference_api_prefs_unittest.cc
@@ -2,11 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifdef UNSAFE_BUFFERS_BUILD -// TODO(crbug.com/40285824): Remove this and convert code to safer constructs. -#pragma allow_unsafe_buffers -#endif - #include <stddef.h> #include <array>
diff --git a/chrome/browser/extensions/api/sessions/sessions_apitest.cc b/chrome/browser/extensions/api/sessions/sessions_apitest.cc index ffb4176..cd76c0d 100644 --- a/chrome/browser/extensions/api/sessions/sessions_apitest.cc +++ b/chrome/browser/extensions/api/sessions/sessions_apitest.cc
@@ -2,17 +2,14 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifdef UNSAFE_BUFFERS_BUILD -// TODO(crbug.com/40285824): Remove this and convert code to safer constructs. -#pragma allow_unsafe_buffers -#endif - #include <stddef.h> +#include <array> #include <memory> #include <utility> #include "base/command_line.h" +#include "base/containers/to_vector.h" #include "base/functional/bind.h" #include "base/functional/callback_helpers.h" #include "base/memory/ptr_util.h" @@ -65,10 +62,10 @@ const char kTestCacheGuid[] = "TestCacheGuid"; // Fake session tabs (used to construct arbitrary device info) and tab IDs // (used to construct arbitrary tab info) to use in all tests. -const char* const kSessionTags[] = {"tag0", "tag1", "tag2", "tag3", "tag4"}; -const SessionID::id_type kTabIDs[] = {5, 10, 13, 17}; -const int kActiveTabIndex = 2; -const int kActiveTabId = kTabIDs[kActiveTabIndex]; +constexpr std::array kSessionTags = {"tag0", "tag1", "tag2", "tag3", "tag4"}; +constexpr auto kTabIDs = std::to_array<SessionID::id_type>({5, 10, 13, 17}); +constexpr int kActiveTabIndex = 2; +constexpr int kActiveTabId = kTabIDs[kActiveTabIndex]; void BuildSessionSpecifics(const std::string& tag, sync_pb::SessionSpecifics* meta) { meta->set_session_tag(tag); @@ -221,8 +218,7 @@ // Fill an instance of session specifics with a foreign session's data. sync_pb::EntitySpecifics header_entity; BuildSessionSpecifics(kSessionTags[index], header_entity.mutable_session()); - std::vector<SessionID::id_type> tab_list(kTabIDs, - kTabIDs + std::size(kTabIDs)); + std::vector<SessionID::id_type> tab_list = base::ToVector(kTabIDs); BuildWindowSpecifics(index, tab_list, header_entity.mutable_session()); std::vector<sync_pb::SessionSpecifics> tabs(tab_list.size()); for (size_t i = 0; i < tab_list.size(); ++i) {
diff --git a/chrome/browser/extensions/api/settings_overrides/settings_overrides_browsertest.cc b/chrome/browser/extensions/api/settings_overrides/settings_overrides_browsertest.cc index 29278c0..45a8b2b 100644 --- a/chrome/browser/extensions/api/settings_overrides/settings_overrides_browsertest.cc +++ b/chrome/browser/extensions/api/settings_overrides/settings_overrides_browsertest.cc
@@ -2,14 +2,10 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifdef UNSAFE_BUFFERS_BUILD -// TODO(crbug.com/40285824): Remove this and convert code to safer constructs. -#pragma allow_unsafe_buffers -#endif - #include <memory> #include "base/command_line.h" +#include "base/containers/to_vector.h" #include "base/run_loop.h" #include "base/strings/utf_string_conversions.h" #include "build/build_config.h" @@ -126,7 +122,7 @@ ASSERT_TRUE(prefs); const GURL urls[] = {GURL("http://foo"), GURL("http://bar")}; SessionStartupPref startup_pref(SessionStartupPref::LAST); - startup_pref.urls.assign(urls, urls + std::size(urls)); + startup_pref.urls = base::ToVector(urls); SessionStartupPref::SetStartupPref(prefs, startup_pref); const extensions::Extension* extension = LoadExtension( @@ -139,7 +135,7 @@ UnloadExtension(extension->id()); startup_pref = SessionStartupPref::GetStartupPref(prefs); EXPECT_EQ(SessionStartupPref::LAST, startup_pref.type); - EXPECT_EQ(std::vector<GURL>(urls, urls + std::size(urls)), startup_pref.urls); + EXPECT_EQ(base::ToVector(urls), startup_pref.urls); } IN_PROC_BROWSER_TEST_F(ExtensionBrowserTest, OverrideDSE) {
diff --git a/chrome/browser/extensions/api/terminal/startup_status.cc b/chrome/browser/extensions/api/terminal/startup_status.cc index 64e3e309..9e61f574 100644 --- a/chrome/browser/extensions/api/terminal/startup_status.cc +++ b/chrome/browser/extensions/api/terminal/startup_status.cc
@@ -2,15 +2,12 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifdef UNSAFE_BUFFERS_BUILD -// TODO(crbug.com/40285824): Remove this and convert code to safer constructs. -#pragma allow_unsafe_buffers -#endif - #include "chrome/browser/extensions/api/terminal/startup_status.h" + #include <unistd.h> #include <algorithm> +#include <array> #include <memory> #include <vector> @@ -35,7 +32,7 @@ const char kColor3Yellow[] = "\x1b[33m"; const char kColor5Purple[] = "\x1b[35m"; const char kEraseInLine[] = "\x1b[K"; -const char kSpinnerCharacters[] = "|/-\\"; +constexpr std::array kSpinnerCharacters = {'|', '/', '-', '\\'}; std::string MoveForward(int i) { return base::StringPrintf("\x1b[%dC", i);
diff --git a/chrome/browser/extensions/api/terminal/terminal_private_api.cc b/chrome/browser/extensions/api/terminal/terminal_private_api.cc index e9e521e..8c7735e8 100644 --- a/chrome/browser/extensions/api/terminal/terminal_private_api.cc +++ b/chrome/browser/extensions/api/terminal/terminal_private_api.cc
@@ -2,11 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifdef UNSAFE_BUFFERS_BUILD -// TODO(crbug.com/40285824): Remove this and convert code to safer constructs. -#pragma allow_unsafe_buffers -#endif - #include "chrome/browser/extensions/api/terminal/terminal_private_api.h" #include <cstdlib>
diff --git a/chrome/browser/extensions/api/vpn_provider/vpn_provider_apitest.cc b/chrome/browser/extensions/api/vpn_provider/vpn_provider_apitest.cc index 6b8b534..cc1e340 100644 --- a/chrome/browser/extensions/api/vpn_provider/vpn_provider_apitest.cc +++ b/chrome/browser/extensions/api/vpn_provider/vpn_provider_apitest.cc
@@ -2,15 +2,16 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifdef UNSAFE_BUFFERS_BUILD -// TODO(crbug.com/40285824): Remove this and convert code to safer constructs. -#pragma allow_unsafe_buffers -#endif - #include <stddef.h> #include <stdint.h> +#include <array> +#include <iterator> +#include <memory> #include <optional> +#include <string> +#include <utility> +#include <vector> #include "base/containers/contains.h" #include "base/functional/bind.h" @@ -55,22 +56,23 @@ const char kPacket[] = "feebdaed"; const char kNetworkProfilePath[] = "/network/test"; -const char* kParameterValues[] = {"10.10.10.10", - "24", - "63.145.213.129/32 63.145.212.0/24", - "0.0.0.0/0 63.145.212.128/25", - "8.8.8.8", - "1600", - "10.10.10.255", - "foo:bar"}; -const char* kParameterKeys[] = {shill::kAddressParameterThirdPartyVpn, - shill::kSubnetPrefixParameterThirdPartyVpn, - shill::kExclusionListParameterThirdPartyVpn, - shill::kInclusionListParameterThirdPartyVpn, - shill::kDnsServersParameterThirdPartyVpn, - shill::kMtuParameterThirdPartyVpn, - shill::kBroadcastAddressParameterThirdPartyVpn, - shill::kDomainSearchParameterThirdPartyVpn}; +constexpr std::array kParameterValues = {"10.10.10.10", + "24", + "63.145.213.129/32 63.145.212.0/24", + "0.0.0.0/0 63.145.212.128/25", + "8.8.8.8", + "1600", + "10.10.10.255", + "foo:bar"}; +constexpr std::array kParameterKeys = { + shill::kAddressParameterThirdPartyVpn, + shill::kSubnetPrefixParameterThirdPartyVpn, + shill::kExclusionListParameterThirdPartyVpn, + shill::kInclusionListParameterThirdPartyVpn, + shill::kDnsServersParameterThirdPartyVpn, + shill::kMtuParameterThirdPartyVpn, + shill::kBroadcastAddressParameterThirdPartyVpn, + shill::kDomainSearchParameterThirdPartyVpn}; void DoNothingFailureCallback(const std::string& error_name) { FAIL();
diff --git a/chrome/browser/extensions/cache_wasm_extension_browsertest.cc b/chrome/browser/extensions/cache_wasm_extension_browsertest.cc index bdc50c9..1173128 100644 --- a/chrome/browser/extensions/cache_wasm_extension_browsertest.cc +++ b/chrome/browser/extensions/cache_wasm_extension_browsertest.cc
@@ -2,11 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifdef UNSAFE_BUFFERS_BUILD -// TODO(crbug.com/40285824): Remove this and convert code to safer constructs. -#pragma allow_unsafe_buffers -#endif - +#include <array> #include <string_view> #include "base/base_paths.h" @@ -42,7 +38,7 @@ kMaxValue = kNoCacheHandler }; - static constexpr std::string_view kWasmCodeCachingBucketNames[] = { + static constexpr std::array kWasmCodeCachingBucketNames = { "kMiss", "kHit", "kInvalidCacheEntry", "kNoCacheHandler"}; const base::FilePath& GetExtensionDir() {
diff --git a/chrome/browser/extensions/chrome_app_sorting.cc b/chrome/browser/extensions/chrome_app_sorting.cc index 24e23fd..6e17547 100644 --- a/chrome/browser/extensions/chrome_app_sorting.cc +++ b/chrome/browser/extensions/chrome_app_sorting.cc
@@ -2,14 +2,10 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifdef UNSAFE_BUFFERS_BUILD -// TODO(crbug.com/40285824): Remove this and convert code to safer constructs. -#pragma allow_unsafe_buffers -#endif - #include "chrome/browser/extensions/chrome_app_sorting.h" #include <algorithm> +#include <array> #include <memory> #include <optional> #include <utility> @@ -723,12 +719,10 @@ std::vector<std::string> app_ids; chromeos::default_app_order::Get(&app_ids); #else - const char* const kDefaultAppOrder[] = { + static constexpr std::array app_ids = { app_constants::kChromeAppId, kWebStoreAppId, }; - const std::vector<const char*> app_ids( - kDefaultAppOrder, kDefaultAppOrder + std::size(kDefaultAppOrder)); #endif syncer::StringOrdinal page_ordinal = CreateFirstAppPageOrdinal();
diff --git a/chrome/browser/extensions/chrome_component_extension_resource_manager.cc b/chrome/browser/extensions/chrome_component_extension_resource_manager.cc index c863c64..be9641db 100644 --- a/chrome/browser/extensions/chrome_component_extension_resource_manager.cc +++ b/chrome/browser/extensions/chrome_component_extension_resource_manager.cc
@@ -2,11 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifdef UNSAFE_BUFFERS_BUILD -// TODO(crbug.com/40285824): Remove this and convert code to safer constructs. -#pragma allow_unsafe_buffers -#endif - #include "chrome/browser/extensions/chrome_component_extension_resource_manager.h" #include <map> @@ -14,6 +9,7 @@ #include "base/check.h" #include "base/containers/contains.h" +#include "base/containers/span.h" #include "base/files/file_path.h" #include "base/path_service.h" #include "base/values.h" @@ -76,8 +72,8 @@ } private: - void AddComponentResourceEntries(const webui::ResourcePath* entries, - size_t size); + void AddComponentResourceEntries( + base::span<const webui::ResourcePath> entries); // A map from a resource path to the resource ID. Used by // ChromeComponentExtensionResourceManager::IsComponentExtensionResource(). @@ -111,28 +107,24 @@ #endif // BUILDFLAG(IS_CHROMEOS) }; - AddComponentResourceEntries(kComponentExtensionResources, - kComponentExtensionResourcesSize); - AddComponentResourceEntries(kExtraComponentExtensionResources, - std::size(kExtraComponentExtensionResources)); + AddComponentResourceEntries(kComponentExtensionResources); + AddComponentResourceEntries(kExtraComponentExtensionResources); #if BUILDFLAG(IS_CHROMEOS) // Add Files app JS modules resources. - AddComponentResourceEntries(kFileManagerResources, kFileManagerResourcesSize); - AddComponentResourceEntries(kFileManagerGenResources, - kFileManagerGenResourcesSize); + AddComponentResourceEntries(kFileManagerResources); + AddComponentResourceEntries(kFileManagerGenResources); // Add Files app resources to display untrusted content in <webview> frames. // Files app extension's resource paths need to be prefixed by // "file_manager/". - for (size_t i = 0; i < kFileManagerUntrustedResourcesSize; ++i) { + for (const auto& resource : kFileManagerUntrustedResources) { base::FilePath resource_path = - base::FilePath("file_manager") - .AppendASCII(kFileManagerUntrustedResources[i].path); + base::FilePath("file_manager").AppendASCII(resource.path); resource_path = resource_path.NormalizePathSeparators(); DCHECK(!base::Contains(path_to_resource_id_, resource_path)); - path_to_resource_id_[resource_path] = kFileManagerUntrustedResources[i].id; + path_to_resource_id_[resource_path] = resource.id; } // ResourceBundle and g_browser_process are not always initialized in unit @@ -145,14 +137,11 @@ std::move(file_manager_replacements); } - size_t keyboard_resource_size; - const webui::ResourcePath* keyboard_resources = - keyboard::GetKeyboardExtensionResources(&keyboard_resource_size); - AddComponentResourceEntries(keyboard_resources, keyboard_resource_size); + AddComponentResourceEntries(keyboard::GetKeyboardExtensionResources()); #endif #if BUILDFLAG(ENABLE_PDF) - AddComponentResourceEntries(kPdfResources, kPdfResourcesSize); + AddComponentResourceEntries(kPdfResources); // ResourceBundle is not always initialized in unit tests. if (ui::ResourceBundle::HasSharedInstance()) { @@ -168,20 +157,18 @@ #endif #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) - AddComponentResourceEntries(kTtsEngineResources, kTtsEngineResourcesSize); + AddComponentResourceEntries(kTtsEngineResources); #endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) } void ChromeComponentExtensionResourceManager::Data::AddComponentResourceEntries( - const webui::ResourcePath* entries, - size_t size) { - for (size_t i = 0; i < size; ++i) { - base::FilePath resource_path = - base::FilePath().AppendASCII(entries[i].path); + base::span<const webui::ResourcePath> entries) { + for (const auto& entry : entries) { + base::FilePath resource_path = base::FilePath().AppendASCII(entry.path); resource_path = resource_path.NormalizePathSeparators(); DCHECK(!base::Contains(path_to_resource_id_, resource_path)); - path_to_resource_id_[resource_path] = entries[i].id; + path_to_resource_id_[resource_path] = entry.id; } }
diff --git a/chrome/browser/extensions/chrome_content_verifier_delegate.cc b/chrome/browser/extensions/chrome_content_verifier_delegate.cc index 144378d..b2c052b 100644 --- a/chrome/browser/extensions/chrome_content_verifier_delegate.cc +++ b/chrome/browser/extensions/chrome_content_verifier_delegate.cc
@@ -2,11 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifdef UNSAFE_BUFFERS_BUILD -// TODO(crbug.com/40285824): Remove this and convert code to safer constructs. -#pragma allow_unsafe_buffers -#endif - #include "chrome/browser/extensions/chrome_content_verifier_delegate.h" #include <algorithm>
diff --git a/chrome/browser/extensions/extension_prefs_unittest.cc b/chrome/browser/extensions/extension_prefs_unittest.cc index 6da229a..3d38cde 100644 --- a/chrome/browser/extensions/extension_prefs_unittest.cc +++ b/chrome/browser/extensions/extension_prefs_unittest.cc
@@ -2,11 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifdef UNSAFE_BUFFERS_BUILD -// TODO(crbug.com/40285824): Remove this and convert code to safer constructs. -#pragma allow_unsafe_buffers -#endif - #include "chrome/browser/extensions/extension_prefs_unittest.h" #include <memory> @@ -902,9 +897,6 @@ internal_extension_ = Extension::Create( prefs_.temp_dir().AppendASCII("internal extension"), ManifestLocation::kInternal, simple_dict, Extension::NO_FLAGS, &error); - - for (size_t i = 0; i < kNumInstalledExtensions; ++i) - installed_[i] = false; } PrefsPrepopulatedTestBase::~PrefsPrepopulatedTestBase() = default;
diff --git a/chrome/browser/extensions/extension_prefs_unittest.h b/chrome/browser/extensions/extension_prefs_unittest.h index 6e355659..4a24f4b 100644 --- a/chrome/browser/extensions/extension_prefs_unittest.h +++ b/chrome/browser/extensions/extension_prefs_unittest.h
@@ -7,6 +7,8 @@ #include <stddef.h> +#include <array> + #include "chrome/browser/extensions/test_extension_prefs.h" #include "content/public/test/browser_task_environment.h" #include "testing/gtest/include/gtest/gtest.h" @@ -73,7 +75,7 @@ Extension* internal_extension() { return internal_extension_.get(); } protected: - bool installed_[kNumInstalledExtensions]; + std::array<bool, kNumInstalledExtensions> installed_ = {}; // The following extensions all have mojom::ManifestLocation set to // mojom::ManifestLocation::kExternalPref.
diff --git a/chrome/browser/extensions/preinstalled_apps.cc b/chrome/browser/extensions/preinstalled_apps.cc index c77a2c5f..c9205a6 100644 --- a/chrome/browser/extensions/preinstalled_apps.cc +++ b/chrome/browser/extensions/preinstalled_apps.cc
@@ -41,10 +41,9 @@ // an API. See http://crbug.com/101357 std::string locale = extensions::ExtensionsBrowserClient::Get()->GetApplicationLocale(); - constexpr static const auto unsupported_locales = - std::to_array<const char*>({"CN", "TR", "IR"}); - for (size_t i = 0; i < std::size(unsupported_locales); ++i) { - if (base::EndsWith(locale, unsupported_locales[i], + static constexpr const char* unsupported_locales[] = {"CN", "TR", "IR"}; + for (const char* unsupported : unsupported_locales) { + if (base::EndsWith(locale, unsupported, base::CompareCase::INSENSITIVE_ASCII)) { return false; }
diff --git a/chrome/browser/feedback/show_feedback_page.cc b/chrome/browser/feedback/show_feedback_page.cc index ee8690f..24373ce 100644 --- a/chrome/browser/feedback/show_feedback_page.cc +++ b/chrome/browser/feedback/show_feedback_page.cc
@@ -25,7 +25,6 @@ #include "extensions/browser/api/feedback_private/feedback_private_api.h" #if BUILDFLAG(IS_CHROMEOS_ASH) -#include "ash/constants/ash_features.h" #include "ash/webui/os_feedback_ui/url_constants.h" #include "ash/webui/system_apps/public/system_web_app_type.h" #include "base/functional/bind.h" @@ -208,10 +207,8 @@ include_bluetooth_logs = IsFromUserInteraction(source); show_questionnaire = IsFromUserInteraction(source); } - // Disable the new feedback tool for kiosk, when SWAs are disabled there. - if (!chromeos::IsKioskSession() || - base::FeatureList::IsEnabled( - ash::features::kKioskEnableSystemWebApps)) { + + if (!chromeos::IsKioskSession()) { // TODO(crbug.com/40253237): Include autofill metadata into CrOS new // feedback tool. ash::SystemAppLaunchParams params;
diff --git a/chrome/browser/feedback/system_logs/log_sources/performance_log_source.cc b/chrome/browser/feedback/system_logs/log_sources/performance_log_source.cc index 043875a..d8c75358 100644 --- a/chrome/browser/feedback/system_logs/log_sources/performance_log_source.cc +++ b/chrome/browser/feedback/system_logs/log_sources/performance_log_source.cc
@@ -9,6 +9,7 @@ #include "base/strings/string_number_conversions.h" #include "base/strings/string_util.h" +#include "base/strings/to_string.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/performance_manager/public/user_tuning/user_performance_tuning_manager.h" #include "components/feedback/feedback_report.h" @@ -24,7 +25,7 @@ namespace { std::string BoolToString(bool value) { - return value ? "true" : "false"; + return base::ToString(value); } #if !BUILDFLAG(IS_CHROMEOS_ASH)
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json index d037af0b..1cfdb9e2 100644 --- a/chrome/browser/flag-metadata.json +++ b/chrome/browser/flag-metadata.json
@@ -93,7 +93,7 @@ "hsuregan@google.com", "cros-device-enablement@google.com" ], - "expiry_milestone": 134 + "expiry_milestone": 138 }, { "name": "allow-cross-device-feature-suite", @@ -252,12 +252,12 @@ { "name": "apn-policies", "owners": [ "nikhilcn@google.com", "hsuregan@google.com", "cros-device-enablement@google.com" ], - "expiry_milestone": 134 + "expiry_milestone": 138 }, { "name": "apn-revamp", "owners": [ "nikhilcn@google.com", "cros-device-enablement@google.com" ], - "expiry_milestone": 134 + "expiry_milestone": 138 }, { "name": "app-background-refresh-ios", @@ -1123,14 +1123,6 @@ "expiry_milestone": 130 }, { - "name": "calendar-jelly", - "owners": [ - "newcomer@chromium.org", - "cros-status-area-eng@google.com" - ], - "expiry_milestone": 119 - }, - { "name": "camera-angle-backend", "owners": [ "rjodin@chromium.org", @@ -7532,14 +7524,6 @@ "expiry_milestone": 150 }, { - "name": "rounded-display", - "owners": [ - "zoraiznaeem@chromium.org", - "chromeos-foundations@google.com" - ], - "expiry_milestone": 132 - }, - { "name": "rounded-windows", "owners": [ "zoraiznaeem@chromium.org",
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc index ca6e75a3..5c952a3e 100644 --- a/chrome/browser/flag_descriptions.cc +++ b/chrome/browser/flag_descriptions.cc
@@ -3293,10 +3293,6 @@ "exhibit a change in behavior."; #endif // BUILDFLAG(IS_ANDROID) -const char kRoundedDisplay[] = "Rounded display"; -const char kRoundedDisplayDescription[] = - "Enables rounded corners for the display"; - const char kRoundedWindows[] = "Use rounded windows"; const char kRoundedWindowsDescription[] = "Specifies the radius of rounded windows in DIPs (Device Independent "
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h index a352cda..af1be358 100644 --- a/chrome/browser/flag_descriptions.h +++ b/chrome/browser/flag_descriptions.h
@@ -1890,9 +1890,6 @@ extern const char kRetainOmniboxOnFocusDescription[]; #endif // BUILDFLAG(IS_ANDROID) -extern const char kRoundedDisplay[]; -extern const char kRoundedDisplayDescription[]; - extern const char kRoundedWindows[]; extern const char kRoundedWindowsDescription[];
diff --git a/chrome/browser/flags/android/chrome_feature_list.cc b/chrome/browser/flags/android/chrome_feature_list.cc index eb5bf8a..56787de1 100644 --- a/chrome/browser/flags/android/chrome_feature_list.cc +++ b/chrome/browser/flags/android/chrome_feature_list.cc
@@ -319,6 +319,7 @@ &kSearchResumptionModuleAndroid, &kSettingsSingleActivity, &kShareCustomActionsInCCT, + &kSkipIsolatedSplitPreload, &kSmallerTabStripTitleLimit, &kSuppressToolbarCaptures, &kSuppressToolbarCapturesAtGestureEnd, @@ -999,6 +1000,10 @@ "ShareCustomActionsInCCT", base::FEATURE_DISABLED_BY_DEFAULT); +BASE_FEATURE(kSkipIsolatedSplitPreload, + "SkipIsolatedSplitPreload", + base::FEATURE_DISABLED_BY_DEFAULT); + BASE_FEATURE(kSmallerTabStripTitleLimit, "SmallerTabStripTitleLimit", base::FEATURE_ENABLED_BY_DEFAULT);
diff --git a/chrome/browser/flags/android/chrome_feature_list.h b/chrome/browser/flags/android/chrome_feature_list.h index 589d34d..c9b6072 100644 --- a/chrome/browser/flags/android/chrome_feature_list.h +++ b/chrome/browser/flags/android/chrome_feature_list.h
@@ -167,6 +167,7 @@ BASE_DECLARE_FEATURE(kSettingsSingleActivity); BASE_DECLARE_FEATURE(kShareCustomActionsInCCT); BASE_DECLARE_FEATURE(kSharingHubLinkToggle); +BASE_DECLARE_FEATURE(kSkipIsolatedSplitPreload); BASE_DECLARE_FEATURE(kSmallerTabStripTitleLimit); BASE_DECLARE_FEATURE(kScrollToTLDOptimization); BASE_DECLARE_FEATURE(kSuppressToolbarCaptures);
diff --git a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java index f7f9f0fd..b4a0a4ef 100644 --- a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java +++ b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java
@@ -508,6 +508,7 @@ "SensitiveContentWhileSwitchingTabs"; public static final String SHOW_WARNINGS_FOR_SUSPICIOUS_NOTIFICATIONS = "ShowWarningsForSuspiciousNotifications"; + public static final String SKIP_ISOLATED_SPLIT_PRELOAD = "SkipIsolatedSplitPreload"; public static final String SMALLER_TAB_STRIP_TITLE_LIMIT = "SmallerTabStripTitleLimit"; public static final String SMART_SUGGESTION_FOR_LARGE_DOWNLOADS = "SmartSuggestionForLargeDownloads"; @@ -752,6 +753,11 @@ newCachedFlag(SEARCH_IN_CCT_ALTERNATE_TAP_HANDLING, false); public static final CachedFlag sSettingsSingleActivity = newCachedFlag(SETTINGS_SINGLE_ACTIVITY, false); + public static final CachedFlag sSkipIsolatedSplitPreload = + newCachedFlag( + SKIP_ISOLATED_SPLIT_PRELOAD, + /* defaultValue= */ false, + /* defaultValueInTests= */ true); public static final CachedFlag sSmallerTabStripTitleLimit = newCachedFlag(SMALLER_TAB_STRIP_TITLE_LIMIT, true); public static final CachedFlag sStartSurfaceReturnTime = @@ -882,6 +888,7 @@ sSearchInCCT, sSearchInCCTAlternateTapHandling, sSettingsSingleActivity, + sSkipIsolatedSplitPreload, sSmallerTabStripTitleLimit, sStartSurfaceReturnTime, sTabDragDropAsWindowAndroid,
diff --git a/chrome/browser/glic/BUILD.gn b/chrome/browser/glic/BUILD.gn index 9a6cef65..babf5ff8 100644 --- a/chrome/browser/glic/BUILD.gn +++ b/chrome/browser/glic/BUILD.gn
@@ -57,6 +57,7 @@ ":glic", "//chrome/browser:browser_process", "//chrome/browser:global_features", + "//chrome/browser/glic/launcher", "//chrome/browser/media/webrtc", "//chrome/browser/ui:browser_element_identifiers", "//chrome/browser/ui:browser_list", @@ -79,7 +80,11 @@ "glic_enabling.cc", "glic_enabling.h", ] - deps = [ "//chrome/browser/profiles:profile" ] + deps = [ + ":glic", + "//chrome/browser/profiles:profile", + "//components/prefs", + ] public_deps = [ "//base", "//chrome/common:chrome_features", @@ -111,13 +116,17 @@ sources = [ "border_view_browsertest.cc", "glic_browsertest.cc", + "glic_policy_browsertest.cc", "guest_util_browsertest.cc", ] deps = [ ":glic", "//chrome/browser", "//chrome/browser:browser_process", + "//chrome/browser:global_features", "//chrome/browser/extensions:extensions", + "//chrome/browser/glic/launcher", + "//chrome/browser/policy:test_support", "//chrome/browser/ui", "//chrome/common:constants", "//chrome/test:test_support",
diff --git a/chrome/browser/glic/glic_enabling.cc b/chrome/browser/glic/glic_enabling.cc index 12d7f6d..c78bbc7e 100644 --- a/chrome/browser/glic/glic_enabling.cc +++ b/chrome/browser/glic/glic_enabling.cc
@@ -4,8 +4,10 @@ #include "chrome/browser/glic/glic_enabling.h" +#include "chrome/browser/glic/glic_pref_names.h" #include "chrome/browser/profiles/profile.h" #include "chrome/common/chrome_features.h" +#include "components/prefs/pref_service.h" bool GlicEnabling::IsEnabledByFlags() { return CheckEnabling() == glic::GlicEnabledStatus::kEnabled; @@ -18,14 +20,13 @@ return false; } - // Glic is not supported from incognito or guest mode. - if (profile->IsOffTheRecord()) { + // Glic is supported only in regular profiles, i.e. disable in incognito, + // guest, system profile, etc. + if (!profile->IsRegularProfile()) { return false; } - // TODO(crbug.com/382722218): Enterprise policy may disable Glic for certain - // user profiles. - return true; + return profile->GetPrefs()->GetBoolean(glic::prefs::kGlicEnabledByPolicy); } glic::GlicEnabledStatus GlicEnabling::CheckEnabling() {
diff --git a/chrome/browser/glic/glic_keyed_service.cc b/chrome/browser/glic/glic_keyed_service.cc index dde5b2a..86cbb26 100644 --- a/chrome/browser/glic/glic_keyed_service.cc +++ b/chrome/browser/glic/glic_keyed_service.cc
@@ -25,6 +25,7 @@ signin::IdentityManager* identity_manager, GlicProfileManager* profile_manager) : browser_context_(browser_context), + configuration_(Profile::FromBrowserContext(browser_context)), window_controller_(Profile::FromBrowserContext(browser_context)), focused_tab_manager_(Profile::FromBrowserContext(browser_context), window_controller_),
diff --git a/chrome/browser/glic/glic_policy_browsertest.cc b/chrome/browser/glic/glic_policy_browsertest.cc new file mode 100644 index 0000000..1829135 --- /dev/null +++ b/chrome/browser/glic/glic_policy_browsertest.cc
@@ -0,0 +1,231 @@ +// 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/browser_process.h" +#include "chrome/browser/glic/glic_pref_names.h" +#include "chrome/browser/glic/launcher/glic_background_mode_manager.h" +#include "chrome/browser/global_features.h" +#include "chrome/browser/policy/policy_test_utils.h" +#include "chrome/browser/policy/profile_policy_connector.h" +#include "chrome/browser/policy/profile_policy_connector_builder.h" +#include "chrome/browser/profiles/profile.h" +#include "chrome/browser/profiles/profile_manager.h" +#include "chrome/browser/profiles/profile_test_util.h" +#include "chrome/browser/ui/browser.h" +#include "chrome/browser/ui/views/frame/browser_view.h" +#include "chrome/browser/ui/views/frame/tab_strip_region_view.h" +#include "chrome/browser/ui/views/tabs/tab_strip_action_container.h" +#include "chrome/common/chrome_features.h" +#include "chrome/common/chrome_switches.h" +#include "chrome/test/base/ui_test_utils.h" +#include "components/policy/core/common/policy_types.h" +#include "components/policy/policy_constants.h" +#include "components/prefs/pref_service.h" +#include "content/public/test/browser_test.h" + +using glic::prefs::kGlicEnabledByPolicy; + +namespace glic { +class GlicButton; +} + +namespace policy { + +class GlicPolicyTest : public PolicyTest { + public: + GlicPolicyTest() { + scoped_feature_list_.InitWithFeatures( + /*enabled_features=*/{features::kGlic, features::kTabstripComboButton}, + /*disabled_features=*/{}); + } + GlicPolicyTest(const GlicPolicyTest&) = delete; + GlicPolicyTest& operator=(const GlicPolicyTest&) = delete; + + ~GlicPolicyTest() override = default; + + void SetUpCommandLine(base::CommandLine* command_line) override { + PolicyTest::SetUpCommandLine(command_line); + + // Load blank page in glic guest view + command_line->AppendSwitchASCII(::switches::kGlicGuestURL, "about:blank"); + } + + void SetUpOnMainThread() override { + PolicyTest::SetUpOnMainThread(); + + g_browser_process->local_state()->SetBoolean( + glic::prefs::kGlicLauncherEnabled, true); + + profile_1_ = browser()->profile(); + + { + policy_for_profile_2_.SetDefaultReturns( + /*is_initialization_complete_return=*/true, + /*is_first_policy_load_complete_return=*/true); + policy::PushProfilePolicyConnectorProviderForTesting( + &policy_for_profile_2_); + + ProfileManager* profile_manager = g_browser_process->profile_manager(); + base::FilePath new_path = + profile_manager->GenerateNextProfileDirectoryPath(); + profile_2_ = + &profiles::testing::CreateProfileSync(profile_manager, new_path); + } + } + + void TearDownOnMainThread() override { + if (glic::GlicBackgroundModeManager* background_mode_manager = + g_browser_process->GetFeatures()->glic_background_mode_manager()) { + background_mode_manager->TerminateForTesting(); + } + profile_1_ = nullptr; + profile_2_ = nullptr; + } + + glic::GlicButton* GetGlicButtonForBrowser(Browser* browser) { + TabStripActionContainer* container = + BrowserView::GetBrowserViewForBrowser(browser) + ->tab_strip_region_view() + ->GetTabStripActionContainer(); + CHECK(container); + return container->GetGlicButton(); + } + + protected: + // The first profile. + raw_ptr<Profile> profile_1_; + // The second profile. + raw_ptr<Profile> profile_2_; + + testing::NiceMock<policy::MockConfigurationPolicyProvider> + policy_for_profile_2_; + + private: + base::test::ScopedFeatureList scoped_feature_list_; +}; + +IN_PROC_BROWSER_TEST_F(GlicPolicyTest, PrefDisabledByPolicy) { + // By default the pref should start off unmanaged and defaulted to enabled. + PrefService* prefs = browser()->profile()->GetPrefs(); + EXPECT_FALSE(prefs->IsManagedPreference(kGlicEnabledByPolicy)); + EXPECT_TRUE(prefs->GetBoolean(kGlicEnabledByPolicy)); + + // Verify that policy can force-disable Glic. + PolicyMap policies; + policies.Set(key::kGlicEnabled, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, + POLICY_SOURCE_ENTERPRISE_DEFAULT, base::Value(false), nullptr); + UpdateProviderPolicy(policies); + EXPECT_TRUE(prefs->IsManagedPreference(kGlicEnabledByPolicy)); + EXPECT_FALSE(prefs->GetBoolean(kGlicEnabledByPolicy)); + + // Verify the policy value cannot be overridden. + prefs->SetBoolean(kGlicEnabledByPolicy, true); + EXPECT_FALSE(prefs->GetBoolean(kGlicEnabledByPolicy)); +} + +// Ensure that when policy disables Glic, a browser window doesn't show the Glic +// button. +IN_PROC_BROWSER_TEST_F(GlicPolicyTest, PolicyDisablesGlicButton) { + ASSERT_EQ(browser()->profile(), profile_1_); + ASSERT_NE(profile_1_, profile_2_); + + // The pref defaults to enabled. Ensure the button was created. + PrefService* prefs = browser()->profile()->GetPrefs(); + ASSERT_TRUE(prefs->GetBoolean(kGlicEnabledByPolicy)); + EXPECT_TRUE(GetGlicButtonForBrowser(browser())); + + // Disable the policy in the default profile. + PolicyMap policies; + policies.Set(key::kGlicEnabled, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, + POLICY_SOURCE_ENTERPRISE_DEFAULT, base::Value(false), nullptr); + UpdateProviderPolicy(policies); + ASSERT_FALSE(prefs->GetBoolean(kGlicEnabledByPolicy)); + + { + // A new window in profile 1 shouldn't have the Glic button. + Browser* new_window_profile_1 = CreateBrowser(profile_1_); + EXPECT_FALSE(GetGlicButtonForBrowser(new_window_profile_1)); + + // A new window in profile 2 should continue to have the Glic button since + // only profile 1 disabled Glic. + Browser* new_window_profile_2 = CreateBrowser(profile_2_); + EXPECT_TRUE(GetGlicButtonForBrowser(new_window_profile_2)); + } + + // TODO(crbug.com/382722218): The button should be removed from and added to + // existing windows but this isn't implemented yet. + + // Re-enable the policy. Ensure a new window gets the button again. + policies.Set(key::kGlicEnabled, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, + POLICY_SOURCE_ENTERPRISE_DEFAULT, base::Value(true), nullptr); + UpdateProviderPolicy(policies); + ASSERT_TRUE(prefs->GetBoolean(kGlicEnabledByPolicy)); + + { + // A new window in profile 1 should again get the Glic button now that the + // policy is re-enabled. + Browser* new_window_profile_1 = CreateBrowser(profile_1_); + EXPECT_TRUE(GetGlicButtonForBrowser(new_window_profile_1)); + } +} + +// Ensure that background mode is entered if and only if a profile with the +// policy enabled is loaded. +IN_PROC_BROWSER_TEST_F(GlicPolicyTest, PolicyDisablesBackgroundMode) { + ASSERT_EQ(browser()->profile(), profile_1_); + ASSERT_NE(profile_1_, profile_2_); + + Browser* new_window_profile_2 = CreateBrowser(profile_2_); + ASSERT_TRUE(new_window_profile_2); + + // The pref defaults to enabled. + ASSERT_TRUE(profile_1_->GetPrefs()->GetBoolean(kGlicEnabledByPolicy)); + ASSERT_TRUE(profile_2_->GetPrefs()->GetBoolean(kGlicEnabledByPolicy)); + + glic::GlicBackgroundModeManager* background_mode_manager = + g_browser_process->GetFeatures()->glic_background_mode_manager(); + EXPECT_TRUE(background_mode_manager->IsInBackgroundModeForTesting()); + + // Disable the policy in the default profile. + { + PolicyMap policies; + policies.Set(key::kGlicEnabled, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, + POLICY_SOURCE_ENTERPRISE_DEFAULT, base::Value(false), nullptr); + UpdateProviderPolicy(policies); + ASSERT_FALSE(profile_1_->GetPrefs()->GetBoolean(kGlicEnabledByPolicy)); + ASSERT_TRUE(profile_2_->GetPrefs()->GetBoolean(kGlicEnabledByPolicy)); + } + + // Background mode should remain active since profile_2_ still has it enabled. + EXPECT_TRUE(background_mode_manager->IsInBackgroundModeForTesting()); + + // Disable the policy in the second profile. + { + PolicyMap policies; + policies.Set(key::kGlicEnabled, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, + POLICY_SOURCE_ENTERPRISE_DEFAULT, base::Value(false), nullptr); + policy_for_profile_2_.UpdateChromePolicy(policies); + ASSERT_FALSE(profile_1_->GetPrefs()->GetBoolean(kGlicEnabledByPolicy)); + ASSERT_FALSE(profile_2_->GetPrefs()->GetBoolean(kGlicEnabledByPolicy)); + } + + // Background mode should be exited since none of the loaded profiles enable + // Glic. + EXPECT_FALSE(background_mode_manager->IsInBackgroundModeForTesting()); + + // Enable the policy in the default profile again. + { + PolicyMap policies; + policies.Set(key::kGlicEnabled, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, + POLICY_SOURCE_ENTERPRISE_DEFAULT, base::Value(true), nullptr); + UpdateProviderPolicy(policies); + ASSERT_TRUE(profile_1_->GetPrefs()->GetBoolean(kGlicEnabledByPolicy)); + ASSERT_FALSE(profile_2_->GetPrefs()->GetBoolean(kGlicEnabledByPolicy)); + } + + // Background mode should be reentered since the first profile is enabled. + EXPECT_TRUE(background_mode_manager->IsInBackgroundModeForTesting()); +} + +} // namespace policy
diff --git a/chrome/browser/glic/glic_pref_names.h b/chrome/browser/glic/glic_pref_names.h index dd09b03..1fe836d 100644 --- a/chrome/browser/glic/glic_pref_names.h +++ b/chrome/browser/glic/glic_pref_names.h
@@ -20,6 +20,10 @@ // ************* PROFILE PREFS *************** // Prefs below are tied to a user profile +// Boolean pref that determines whether Glic is enabled for this user profile. +// This is controlled from enterprise policy. +inline constexpr char kGlicEnabledByPolicy[] = "glic.enabled_by_policy"; + // Boolean pref that enables or disables geolocation access for Glic. inline constexpr char kGlicGeolocationEnabled[] = "glic.geolocation_enabled"; // Boolean pref that enables or disables microphone access for Glic.
diff --git a/chrome/browser/glic/glic_profile_configuration.cc b/chrome/browser/glic/glic_profile_configuration.cc index 656fa1f..22338839 100644 --- a/chrome/browser/glic/glic_profile_configuration.cc +++ b/chrome/browser/glic/glic_profile_configuration.cc
@@ -7,6 +7,7 @@ #include "base/values.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/glic/glic_pref_names.h" +#include "chrome/browser/glic/launcher/glic_background_mode_manager.h" #include "chrome/browser/profiles/profile.h" #include "components/prefs/pref_registry_simple.h" #include "components/prefs/pref_service.h" @@ -16,14 +17,34 @@ namespace glic { +GlicProfileConfiguration::GlicProfileConfiguration(Profile* profile) + : profile_(*profile) { + pref_registrar_.Init(profile_->GetPrefs()); + pref_registrar_.Add( + prefs::kGlicEnabledByPolicy, + base::BindRepeating(&GlicProfileConfiguration::OnEnabledByPolicyChanged, + base::Unretained(this))); +} + GlicProfileConfiguration::~GlicProfileConfiguration() = default; // static void GlicProfileConfiguration::RegisterProfilePrefs( PrefRegistrySimple* registry) { + registry->RegisterBooleanPref(prefs::kGlicEnabledByPolicy, true); registry->RegisterBooleanPref(prefs::kGlicMicrophoneEnabled, false); registry->RegisterBooleanPref(prefs::kGlicGeolocationEnabled, false); registry->RegisterBooleanPref(prefs::kGlicTabContextEnabled, false); } +bool GlicProfileConfiguration::IsEnabledByPolicy() const { + return profile_->GetPrefs()->GetBoolean(prefs::kGlicEnabledByPolicy); +} + +void GlicProfileConfiguration::OnEnabledByPolicyChanged() { + // TODO(crbug.com/382722218): Update UI in each window to remove/add Glic + // button. + GlicBackgroundModeManager::GetInstance()->OnPolicyChanged(); +} + } // namespace glic
diff --git a/chrome/browser/glic/glic_profile_configuration.h b/chrome/browser/glic/glic_profile_configuration.h index 9caf149..2780502 100644 --- a/chrome/browser/glic/glic_profile_configuration.h +++ b/chrome/browser/glic/glic_profile_configuration.h
@@ -5,12 +5,14 @@ #ifndef CHROME_BROWSER_GLIC_GLIC_PROFILE_CONFIGURATION_H_ #define CHROME_BROWSER_GLIC_GLIC_PROFILE_CONFIGURATION_H_ +#include "base/memory/raw_ref.h" #include "base/observer_list.h" #include "base/observer_list_types.h" #include "components/prefs/pref_change_registrar.h" #include "ui/base/accelerators/accelerator.h" class PrefRegistrySimple; +class Profile; namespace glic { @@ -19,10 +21,21 @@ // GlicLauncherConfiguration. class GlicProfileConfiguration { public: - GlicProfileConfiguration() = default; + explicit GlicProfileConfiguration(Profile* profile); ~GlicProfileConfiguration(); static void RegisterProfilePrefs(PrefRegistrySimple* registry); + + bool IsEnabledByPolicy() const; + + private: + void OnEnabledByPolicyChanged(); + + // raw_ref since this class is owned by a keyed service tied to the Profile it + // will be outlived by it. + const raw_ref<Profile> profile_; + + PrefChangeRegistrar pref_registrar_; }; } // namespace glic
diff --git a/chrome/browser/glic/glic_profile_manager.cc b/chrome/browser/glic/glic_profile_manager.cc index 4c5b36aa..c016d0e 100644 --- a/chrome/browser/glic/glic_profile_manager.cc +++ b/chrome/browser/glic/glic_profile_manager.cc
@@ -40,6 +40,8 @@ Profile* GlicProfileManager::GetProfileForLaunch() { // TODO(https://crbug.com/379165457): Implement profile choice logic. + // TODO(crbug.com/382722218): This needs to avoid using a profile that's been + // disabled via enterprise policy. return ProfileManager::GetLastUsedProfileAllowedByPolicy(); }
diff --git a/chrome/browser/glic/glic_window_controller.cc b/chrome/browser/glic/glic_window_controller.cc index 0f2057b..62394cc 100644 --- a/chrome/browser/glic/glic_window_controller.cc +++ b/chrome/browser/glic/glic_window_controller.cc
@@ -133,9 +133,7 @@ views::Widget* glic_button_widget = glic_button_view->GetWidget(); Browser* browser = chrome::FindBrowserWithWindow(glic_button_widget->GetNativeWindow()); - // TODO(cuianthony): we should be using the browser's native view as the - // target to attach to. - AttachToBrowser(browser, glic_button_widget); + AttachToBrowser(browser); } else { MaybeCreateHolderWindowAndReparent(); } @@ -178,18 +176,53 @@ Close(); } -void GlicWindowController::AttachToBrowser(Browser* browser, - views::Widget* target_widget) { +void GlicWindowController::Attach() { + // TODO (crbug.com/388917542) Determine which browser to attach to. Currently + // attaches to the last focused glic-compatible browser. + for (Browser* browser : BrowserList::GetInstance()->OrderedByActivation()) { + if (!IsBrowserGlicCompatible(browser)) { + continue; + } + AttachToBrowser(browser); + return; + } +} + +void GlicWindowController::Detach() { + MaybeCreateHolderWindowAndReparent(); + // TODO (crbug.com/388922182) Determine where to move the window to. Currently + // moves to the top right of the display. + gfx::Size screen_size = + display::Screen::GetScreen()->GetPrimaryDisplay().GetSizeInPixel(); + gfx::Rect bounds = glic_window_widget_->GetWindowBoundsInScreen(); + bounds.set_origin(gfx::Point(screen_size.width() - bounds.width(), 0)); + GetGlicView()->AnimateFrameBounds(bounds); +} + +void GlicWindowController::AttachToBrowser(Browser* browser) { + MovePositionToBrowserGlicButton(browser, true); + // Close holder window if existing. + if (holder_widget_) { + holder_widget_->CloseWithReason(views::Widget::ClosedReason::kLostFocus); + holder_widget_.reset(); + } + views::Widget* browser_widget = + browser->window()->AsBrowserView()->GetWidget(); // Makes the glic widget a child view of the given widget's browser. - if (target_widget && glic_window_widget_ && browser) { + if (browser_widget && glic_window_widget_ && browser) { // Add observer to new parent. - attached_target_widget_observer_.SetAttachedTargetWidget(target_widget); + attached_target_widget_observer_.SetAttachedTargetWidget(browser_widget); attached_browser_ = browser->AsWeakPtr(); views::Widget::ReparentNativeView(glic_window_widget_->GetNativeView(), - target_widget->GetNativeView()); + browser_widget->GetNativeView()); NotifyIfPanelStateChanged(); + // When attached to a browser window, the glic widget mustn't float and when + // interacted with must behave like any other widget. glic_window_widget_->SetZOrderLevel(ui::ZOrderLevel::kNormal); +#if BUILDFLAG(IS_MAC) + glic_window_widget_->SetActivationIndependence(false); +#endif browser_close_subscription_ = browser->RegisterBrowserDidClose( base::BindRepeating(&GlicWindowController::AttachedBrowserDidClose, base::Unretained(this))); @@ -265,7 +298,8 @@ mouse_offset, move_loop_source, views::Widget::MoveLoopEscapeBehavior::kDontHide); in_move_loop_ = false; - // Check whether `widget_` is in a position to attach to a browser window. + // Check whether `glic_window_widget_` is in a position to attach to a + // browser window. HandleAttachmentToBrowserWindows(glic_window_widget_.get()); } } @@ -277,24 +311,11 @@ for (Browser* browser : BrowserList::GetInstance()->OrderedByActivation()) { views::Widget* window_widget = browser->window()->AsBrowserView()->GetWidget(); - // Skips if: - // - incognito - // - not visible - // - is a glic-owned widget - // - is a different profile (uses browser context to check) - if (browser->profile()->IsOffTheRecord() || - !browser->window()->IsVisible() || - window_widget == glic_window_widget_.get() || - window_widget == holder_widget_.get() || - browser->GetWebView()->GetBrowserContext() != - GetGlicView()->web_view()->GetBrowserContext()) { + if (!IsBrowserGlicCompatible(browser)) { continue; } auto* tab_strip_region_view = browser->window()->AsBrowserView()->tab_strip_region_view(); - if (!tab_strip_region_view || !tab_strip_region_view->GetGlicButton()) { - continue; - } gfx::Rect glic_button_rect = tab_strip_region_view->GetGlicButton()->GetBoundsInScreen(); @@ -306,15 +327,7 @@ // from the browser window. if (!in_move_loop_) { if (corner_distance < kAttachmentDistanceThreshold) { - MovePositionToBrowserGlicButton(browser, true); - // Close any existing holder widget in anticipation of reparenting under - // the browser. - if (holder_widget_) { - holder_widget_->CloseWithReason( - views::Widget::ClosedReason::kLostFocus); - holder_widget_.reset(); - } - AttachToBrowser(browser, window_widget); + AttachToBrowser(browser); } else if (glic_window_widget_->parent() == window_widget) { // If farther than the attachment threshold from the current parent // widget, reparent under an empty holder widget. @@ -375,9 +388,35 @@ holder_widget_->GetNativeView()); NotifyIfPanelStateChanged(); - // When the glic window is in a detached state, elevate it's z-order to be - // always on top. + // When the glic window is in a detached state, elevate its z-order to be + // always on top. On the Mac, mark it as "activation independent" so that + // interacting with it does not activate Chrome. glic_window_widget_->SetZOrderLevel(ui::ZOrderLevel::kFloatingWindow); +#if BUILDFLAG(IS_MAC) + glic_window_widget_->SetActivationIndependence(true); +#endif +} + +bool GlicWindowController::IsBrowserGlicCompatible(Browser* browser) { + views::Widget* window_widget = + browser->window()->AsBrowserView()->GetWidget(); + auto* tab_strip_region_view = + browser->window()->AsBrowserView()->tab_strip_region_view(); + // A browser is not compatible if it: + // - is incognito + // - is not visible + // - is a glic-owned widget + // - uses a different BrowserContext from glic + // - does not have a Glic Button + if (browser->profile()->IsOffTheRecord() || !browser->window()->IsVisible() || + window_widget == glic_window_widget_.get() || + window_widget == holder_widget_.get() || + browser->GetWebView()->GetBrowserContext() != + GetGlicView()->web_view()->GetBrowserContext() || + !tab_strip_region_view || !tab_strip_region_view->GetGlicButton()) { + return false; + } + return true; } void GlicWindowController::AddStateObserver(StateObserver* observer) { @@ -411,8 +450,8 @@ void GlicWindowController::OnWidgetVisibilityChanged(views::Widget* widget, bool visible) { - // Store visibility locally because calling widget_->IsVisible() at this point - // returns the old value. + // Store visibility locally because calling glic_window_widget_->IsVisible() + // at this point returns the old value. glic_window_widget_visible_ = visible; NotifyIfPanelStateChanged(); }
diff --git a/chrome/browser/glic/glic_window_controller.h b/chrome/browser/glic/glic_window_controller.h index 9648ddfe..fd5d0774 100644 --- a/chrome/browser/glic/glic_window_controller.h +++ b/chrome/browser/glic/glic_window_controller.h
@@ -48,6 +48,13 @@ // Shows the glic window. void Show(views::View* glic_button_view); + // Attaches glic to the last focused Chrome window. + void Attach(); + + // Detaches glic if attached and moves it to the top right of the current + // display. + void Detach(); + // Sets the size of the glic window to the specified dimensions. Returns true // if the operation succeeded. bool Resize(const gfx::Size& size); @@ -106,8 +113,8 @@ // detached state. gfx::Point GetTopRightPositionForDetachedGlicWindow(); - // Reparents the glic widget under `target_widget`. - void AttachToBrowser(Browser* browser, views::Widget* target_widget); + // Reparents the glic widget under 'browser'. + void AttachToBrowser(Browser* browser); // Observes changes in the widget that the glic window is currently attached // to in order to update its position. @@ -159,6 +166,9 @@ // `browser`'s window. This position change is animated if `animate` is true. void MovePositionToBrowserGlicButton(Browser* browser, bool animate); + // Checks if 'browser' is compatible with glic. + bool IsBrowserGlicCompatible(Browser* browser); + void NotifyIfPanelStateChanged(); mojom::PanelState ComputePanelState() const;
diff --git a/chrome/browser/glic/launcher/BUILD.gn b/chrome/browser/glic/launcher/BUILD.gn index f4afc1c..77b3ee4 100644 --- a/chrome/browser/glic/launcher/BUILD.gn +++ b/chrome/browser/glic/launcher/BUILD.gn
@@ -11,6 +11,7 @@ deps = [ "//base", + "//chrome/browser/profiles:profile", "//components/prefs", "//ui/base", "//ui/base/accelerators/global_accelerator_listener", @@ -34,7 +35,10 @@ "//chrome/app:generated_resources", "//chrome/app/vector_icons", "//chrome/browser:browser_process", + "//chrome/browser:global_features", "//chrome/browser/glic", + "//chrome/browser/glic:enabling", + "//chrome/browser/profiles:profile", "//chrome/browser/ui", "//chrome/browser/ui:browser_element_identifiers", "//components/keep_alive_registry",
diff --git a/chrome/browser/glic/launcher/glic_background_mode_manager.cc b/chrome/browser/glic/launcher/glic_background_mode_manager.cc index b3f8a08..254247e9 100644 --- a/chrome/browser/glic/launcher/glic_background_mode_manager.cc +++ b/chrome/browser/glic/launcher/glic_background_mode_manager.cc
@@ -8,35 +8,51 @@ #include "base/check.h" #include "chrome/browser/browser_process.h" +#include "chrome/browser/glic/glic_enabling.h" #include "chrome/browser/glic/launcher/glic_controller.h" #include "chrome/browser/glic/launcher/glic_launcher_configuration.h" #include "chrome/browser/glic/launcher/glic_status_icon.h" +#include "chrome/browser/global_features.h" +#include "chrome/browser/profiles/profile_manager.h" #include "components/keep_alive_registry/keep_alive_types.h" #include "components/keep_alive_registry/scoped_keep_alive.h" #include "ui/base/accelerators/accelerator.h" #include "ui/base/accelerators/global_accelerator_listener/global_accelerator_listener.h" +namespace { +bool IsEnabledInAnyLoadedProfile() { + return base::ranges::any_of( + g_browser_process->profile_manager()->GetLoadedProfiles(), + GlicEnabling::IsEnabledForProfile); +} +} // namespace + namespace glic { GlicBackgroundModeManager::GlicBackgroundModeManager(StatusTray* status_tray) : configuration_(std::make_unique<GlicLauncherConfiguration>(this)), controller_(std::make_unique<GlicController>()), status_tray_(status_tray), - enabled_(configuration_->IsEnabled()), + enabled_pref_(configuration_->IsEnabled()), expected_registered_hotkey_(configuration_->GetGlobalHotkey()) { UpdateState(); + g_browser_process->profile_manager()->AddObserver(this); } GlicBackgroundModeManager::~GlicBackgroundModeManager() = default; +GlicBackgroundModeManager* GlicBackgroundModeManager::GetInstance() { + return g_browser_process->GetFeatures()->glic_background_mode_manager(); +} + void GlicBackgroundModeManager::OnEnabledChanged(bool enabled) { - if (enabled_ == enabled) { + if (enabled_pref_ == enabled) { return; } - enabled_ = enabled; + enabled_pref_ = enabled; UpdateState(); - EnableLaunchOnStartup(enabled_); + EnableLaunchOnStartup(enabled_pref_); } void GlicBackgroundModeManager::OnGlobalHotkeyChanged(ui::Accelerator hotkey) { @@ -61,6 +77,26 @@ // TODO(crbug.com/385194502): Handle Linux. } +void GlicBackgroundModeManager::OnProfileAdded(Profile* profile) { + // If a profile is added when not in background mode, check if it can now be + // entered. + if (!status_icon_) { + CHECK(!keep_alive_); + UpdateState(); + } +} + +void GlicBackgroundModeManager::OnPolicyChanged() { + // Recompute whether the background launcher should change state based on the + // updated policy. + UpdateState(); +} + +void GlicBackgroundModeManager::Shutdown() { + CHECK(g_browser_process->profile_manager()); + g_browser_process->profile_manager()->RemoveObserver(this); +} + void GlicBackgroundModeManager::EnterBackgroundMode() { if (!keep_alive_) { keep_alive_ = std::make_unique<ScopedKeepAlive>( @@ -104,7 +140,9 @@ void GlicBackgroundModeManager::UpdateState() { UnregisterHotkey(); - if (enabled_) { + + bool background_mode_enabled = enabled_pref_ && IsEnabledInAnyLoadedProfile(); + if (background_mode_enabled) { EnterBackgroundMode(); if (!expected_registered_hotkey_.IsEmpty()) { RegisterHotkey(expected_registered_hotkey_);
diff --git a/chrome/browser/glic/launcher/glic_background_mode_manager.h b/chrome/browser/glic/launcher/glic_background_mode_manager.h index 65fee5c..4e1c581f 100644 --- a/chrome/browser/glic/launcher/glic_background_mode_manager.h +++ b/chrome/browser/glic/launcher/glic_background_mode_manager.h
@@ -9,6 +9,7 @@ #include "base/memory/raw_ptr.h" #include "chrome/browser/glic/launcher/glic_launcher_configuration.h" +#include "chrome/browser/profiles/profile_manager_observer.h" #include "ui/base/accelerators/global_accelerator_listener/global_accelerator_listener.h" class GlicController; @@ -28,11 +29,14 @@ // listen to a global hotkey, and provide a status icon for triggering the UI. class GlicBackgroundModeManager : public GlicLauncherConfiguration::Observer, - public ui::GlobalAcceleratorListener::Observer { + public ui::GlobalAcceleratorListener::Observer, + public ProfileManagerObserver { public: explicit GlicBackgroundModeManager(StatusTray* status_tray); ~GlicBackgroundModeManager() override; + static GlicBackgroundModeManager* GetInstance(); + // GlicConfiguration::Observer void OnEnabledChanged(bool enabled) override; void OnGlobalHotkeyChanged(ui::Accelerator hotkey) override; @@ -42,10 +46,27 @@ void ExecuteCommand(const std::string& accelerator_group_id, const std::string& command_id) override; + // ProfileManagerObserver: + void OnProfileAdded(Profile* profile) override; + + // Called when the enterprise policy-linked pref has changed for any profile. + void OnPolicyChanged(); + + void Shutdown(); + ui::Accelerator RegisteredHotkeyForTesting() { return actual_registered_hotkey_; } + bool IsInBackgroundModeForTesting() { + CHECK_EQ(static_cast<bool>(keep_alive_), static_cast<bool>(status_icon_)); + return keep_alive_ != nullptr; + } + + // Tests need a way to manually exit background mode so that the test can + // complete. + void TerminateForTesting() { ExitBackgroundMode(); } + private: void EnterBackgroundMode(); void ExitBackgroundMode(); @@ -69,7 +90,12 @@ // mode is enabled. std::unique_ptr<GlicStatusIcon> status_icon_; - bool enabled_ = false; + // The current state of the launcher_enabled pref. Note that the pref is a + // local state and is thus per-installation. Each profile also has an + // "enabled_by_policy". Background mode is entered only if `enabled_pref` is + // true AND at least one loaded profile is enabled by policy. + bool enabled_pref_ = false; + // The actual registered hotkey may be different from the expected hotkey // because the Glic launcher may be disabled or registration fails which // results in no hotkey being registered and is represented with an empty
diff --git a/chrome/browser/global_features.cc b/chrome/browser/global_features.cc index a2c7e61..da4e1b3e 100644 --- a/chrome/browser/global_features.cc +++ b/chrome/browser/global_features.cc
@@ -74,6 +74,14 @@ #endif } +void GlobalFeatures::Shutdown() { +#if BUILDFLAG(ENABLE_GLIC) + if (glic_background_mode_manager_) { + glic_background_mode_manager_->Shutdown(); + } +#endif +} + std::unique_ptr<system_permission_settings::PlatformHandle> GlobalFeatures::CreateSystemPermissionsPlatformHandle() { return system_permission_settings::PlatformHandle::Create();
diff --git a/chrome/browser/global_features.h b/chrome/browser/global_features.h index 7a7ee16..068eb0a 100644 --- a/chrome/browser/global_features.h +++ b/chrome/browser/global_features.h
@@ -45,6 +45,9 @@ // Called exactly once to initialize features. void Init(); + // Called exactly once when the browser starts to shutdown. + void Shutdown(); + // Public accessors for features, e.g. // FooFeature* foo_feature() { return foo_feature_.get(); }
diff --git a/chrome/browser/history/java/src/org/chromium/chrome/browser/history/AppFilterCoordinatorTest.java b/chrome/browser/history/java/src/org/chromium/chrome/browser/history/AppFilterCoordinatorTest.java index e560609a..d3a6a3b5 100644 --- a/chrome/browser/history/java/src/org/chromium/chrome/browser/history/AppFilterCoordinatorTest.java +++ b/chrome/browser/history/java/src/org/chromium/chrome/browser/history/AppFilterCoordinatorTest.java
@@ -99,13 +99,7 @@ ScrimCoordinator scrimCoordinator = new ScrimCoordinator( getActivity(), - new ScrimCoordinator.SystemUiScrimDelegate() { - @Override - public void setStatusBarScrimFraction(float scrimFraction) {} - - @Override - public void setNavigationBarScrimFraction(float scrimFraction) {} - }, + /* systemUiScrimDelegate= */ null, activityContentView, Color.WHITE); return BottomSheetControllerFactory.createBottomSheetController(
diff --git a/chrome/browser/ip_protection/ip_protection_core_host_browsertest.cc b/chrome/browser/ip_protection/ip_protection_core_host_browsertest.cc index 30f2ba5a..47613815 100644 --- a/chrome/browser/ip_protection/ip_protection_core_host_browsertest.cc +++ b/chrome/browser/ip_protection/ip_protection_core_host_browsertest.cc
@@ -8,6 +8,7 @@ #include <vector> #include "base/callback_list.h" +#include "base/strings/to_string.h" #include "base/test/bind.h" #include "base/test/scoped_feature_list.h" #include "base/test/test_future.h" @@ -65,7 +66,7 @@ features_and_params.push_back( {net::features::kEnableIpProtectionProxy, {{net::features::kIpPrivacyOnlyInIncognito.name, - incognito_mode ? "true" : "false"}}}); + base::ToString(incognito_mode)}}}); features_and_params.push_back({network::features::kMaskedDomainList, {}}); #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) // Use of IpProtectionCoreHostFactory::GetInstance() in the test
diff --git a/chrome/browser/media/router/discovery/dial/dial_app_discovery_service.cc b/chrome/browser/media/router/discovery/dial/dial_app_discovery_service.cc index 83d9f7d..3c30441 100644 --- a/chrome/browser/media/router/discovery/dial/dial_app_discovery_service.cc +++ b/chrome/browser/media/router/discovery/dial/dial_app_discovery_service.cc
@@ -10,6 +10,7 @@ #include "base/metrics/histogram_macros.h" #include "base/strings/string_util.h" #include "base/strings/stringprintf.h" +#include "base/strings/to_string.h" #include "base/time/default_clock.h" #include "chrome/browser/media/router/data_decoder_util.h" #include "net/http/http_status_code.h" @@ -154,7 +155,7 @@ LoggerImpl::Severity::kInfo, mojom::LogCategory::kDiscovery, kLoggerComponent, base::StringPrintf("DIAL sink supports disconnect: %s", - parsed_app_info->allow_stop ? "true" : "false"), + base::ToString(parsed_app_info->allow_stop)), sink_id_, "", ""); RecordDialFetchAppInfo(DialAppInfoResultCode::kOk);
diff --git a/chrome/browser/media/webrtc/capture_handle_browsertest.cc b/chrome/browser/media/webrtc/capture_handle_browsertest.cc index ca5d3d8..3b75912 100644 --- a/chrome/browser/media/webrtc/capture_handle_browsertest.cc +++ b/chrome/browser/media/webrtc/capture_handle_browsertest.cc
@@ -12,6 +12,7 @@ #include "base/path_service.h" #include "base/strings/strcat.h" #include "base/strings/stringprintf.h" +#include "base/strings/to_string.h" #include "build/build_config.h" #include "build/buildflag.h" #include "build/chromeos_buildflags.h" @@ -114,7 +115,7 @@ web_contents->GetPrimaryMainFrame(), base::StringPrintf( "callSetCaptureHandleConfig(%s, \"%s\", %s);", - expose_origin ? "true" : "false", handle.c_str(), + base::ToString(expose_origin), handle.c_str(), StringifyPermittedOrigins(permitted_origins).c_str())), "capture-handle-set");
diff --git a/chrome/browser/media/webrtc/conditional_focus_browsertest.cc b/chrome/browser/media/webrtc/conditional_focus_browsertest.cc index c51ea0f..f5b1047 100644 --- a/chrome/browser/media/webrtc/conditional_focus_browsertest.cc +++ b/chrome/browser/media/webrtc/conditional_focus_browsertest.cc
@@ -7,6 +7,7 @@ #include "base/command_line.h" #include "base/memory/raw_ptr.h" #include "base/strings/stringprintf.h" +#include "base/strings/to_string.h" #include "build/build_config.h" #include "build/chromeos_buildflags.h" #include "chrome/browser/media/webrtc/webrtc_browsertest_base.h" @@ -133,7 +134,7 @@ capturing_tab_->GetPrimaryMainFrame(), base::StringPrintf("captureOtherTab(%d, '%s', %s);", busy_wait_ms, ToString(focus_enum_value), - on_correct_microtask ? "true" : "false")), + base::ToString(on_correct_microtask))), expected_result); }
diff --git a/chrome/browser/media/webrtc/webrtc_browsertest_base.cc b/chrome/browser/media/webrtc/webrtc_browsertest_base.cc index eebe77d..c0d5b23 100644 --- a/chrome/browser/media/webrtc/webrtc_browsertest_base.cc +++ b/chrome/browser/media/webrtc/webrtc_browsertest_base.cc
@@ -17,6 +17,7 @@ #include "base/strings/string_split.h" #include "base/strings/string_util.h" #include "base/strings/stringprintf.h" +#include "base/strings/to_string.h" #include "base/values.h" #include "build/build_config.h" #include "chrome/browser/extensions/chrome_test_extension_loader.h" @@ -538,7 +539,7 @@ EXPECT_EQ("ok", ExecuteJavascript( "setDefaultVideoCodec('" + video_codec + "'," + - (prefer_hw_codec ? "true" : "false") + "," + + base::ToString(prefer_hw_codec) + "," + (codec_profile.empty() ? "null" : "'" + codec_profile + "'") + ")",
diff --git a/chrome/browser/media/webrtc/webrtc_getdisplaymedia_browsertest.cc b/chrome/browser/media/webrtc/webrtc_getdisplaymedia_browsertest.cc index dfde22ffd..da485bf 100644 --- a/chrome/browser/media/webrtc/webrtc_getdisplaymedia_browsertest.cc +++ b/chrome/browser/media/webrtc/webrtc_getdisplaymedia_browsertest.cc
@@ -15,6 +15,7 @@ #include "base/strings/strcat.h" #include "base/strings/string_util.h" #include "base/strings/stringprintf.h" +#include "base/strings/to_string.h" #include "base/strings/utf_string_conversions.h" #include "build/build_config.h" #include "build/chromeos_buildflags.h" @@ -259,9 +260,8 @@ std::string GetConstraints(bool video, bool audio) const { return base::StringPrintf("{video: %s, audio: %s, preferCurrentTab: %s}", - video ? "true" : "false", - audio ? "true" : "false", - PreferCurrentTab() ? "true" : "false"); + base::ToString(video), base::ToString(audio), + base::ToString(PreferCurrentTab())); } }; @@ -497,7 +497,7 @@ "should_prefer_current_tab: " "%s}", kMaxWidth, kMaxFrameRate, - test_config_.should_prefer_current_tab ? "true" : "false"); + base::ToString(test_config_.should_prefer_current_tab)); RunGetDisplayMedia(tab, constraints, /*is_fake_ui=*/true, /*expect_success=*/true, /*is_tab_capture=*/PreferCurrentTab()); @@ -570,7 +570,7 @@ // using just one tab. It is orthogonal to the test's purpose. const std::string constraints = base::StringPrintf( "{video: true, selfBrowserSurface: 'include', preferCurrentTab: %s}", - PreferCurrentTab() ? "true" : "false"); + base::ToString(PreferCurrentTab())); EXPECT_EQ( content::EvalJs(
diff --git a/chrome/browser/media_effects/media_effects_service_factory.cc b/chrome/browser/media_effects/media_effects_service_factory.cc index d86521e..1e5a197 100644 --- a/chrome/browser/media_effects/media_effects_service_factory.cc +++ b/chrome/browser/media_effects/media_effects_service_factory.cc
@@ -97,15 +97,13 @@ optimization_guide::proto::OptimizationTarget:: OPTIMIZATION_TARGET_CAMERA_BACKGROUND_SEGMENTATION); - if (!model_info.has_value()) { - return; - } - - background_segmentation_model_path_ = model_info->GetModelFilePath(); + background_segmentation_model_path_ = + model_info.has_value() ? std::optional(model_info->GetModelFilePath()) + : std::nullopt; for (auto& observer : observers_) { observer.OnBackgroundSegmentationModelUpdated( - *background_segmentation_model_path_); + background_segmentation_model_path_); } }
diff --git a/chrome/browser/metrics/chrome_browser_main_extra_parts_metrics.cc b/chrome/browser/metrics/chrome_browser_main_extra_parts_metrics.cc index 4bee729..9e5f2135 100644 --- a/chrome/browser/metrics/chrome_browser_main_extra_parts_metrics.cc +++ b/chrome/browser/metrics/chrome_browser_main_extra_parts_metrics.cc
@@ -819,6 +819,22 @@ base::UmaHistogramBoolean("Windows.AcLayersLoaded", !!mod); } +void RecordWin11UpgradeEligibilityMetrics( + const base::win::HardwareEvaluationResult& result) { + base::UmaHistogramBoolean("Windows.Win11UpgradeEligible", + result.IsEligible()); + base::UmaHistogramBoolean("Windows.Win11HardwareRequirements.CPUCheck", + result.cpu); + base::UmaHistogramBoolean("Windows.Win11HardwareRequirements.MemoryCheck", + result.memory); + base::UmaHistogramBoolean("Windows.Win11HardwareRequirements.DiskCheck", + result.disk); + base::UmaHistogramBoolean("Windows.Win11HardwareRequirements.FirmwareCheck", + result.firmware); + base::UmaHistogramBoolean("Windows.Win11HardwareRequirements.TPMCheck", + result.tpm); +} + #endif // BUILDFLAG(IS_WIN) void RecordDisplayHDRStatus(const display::Display& display) { @@ -863,8 +879,9 @@ RecordAppCompatMetrics(); if (base::win::OSInfo::Kernel32Version() < base::win::Version::WIN11) { - base::UmaHistogramBoolean("Windows.Win11UpgradeEligible", - base::win::IsWin11UpgradeEligible()); + base::win::HardwareEvaluationResult result = + base::win::EvaluateWin11UpgradeEligibility(); + RecordWin11UpgradeEligibilityMetrics(result); } key_credential_manager_support::ReportKeyCredentialManagerSupport(); #endif // BUILDFLAG(IS_WIN)
diff --git a/chrome/browser/optimization_guide/optimization_guide_keyed_service.cc b/chrome/browser/optimization_guide/optimization_guide_keyed_service.cc index a10714c..9ff4ab8 100644 --- a/chrome/browser/optimization_guide/optimization_guide_keyed_service.cc +++ b/chrome/browser/optimization_guide/optimization_guide_keyed_service.cc
@@ -4,7 +4,6 @@ #include "chrome/browser/optimization_guide/optimization_guide_keyed_service.h" -#include <memory> #include <optional> #include "base/files/file_path.h" @@ -49,7 +48,6 @@ #include "components/optimization_guide/core/model_execution/model_execution_features.h" #include "components/optimization_guide/core/model_execution/model_execution_features_controller.h" #include "components/optimization_guide/core/model_execution/model_execution_manager.h" -#include "components/optimization_guide/core/model_execution/on_device_asset_manager.h" #include "components/optimization_guide/core/model_execution/on_device_model_component.h" #include "components/optimization_guide/core/model_execution/on_device_model_service_controller.h" #include "components/optimization_guide/core/model_execution/performance_class.h" @@ -96,6 +94,7 @@ using ::optimization_guide::OnDeviceModelPerformanceClass; using ::optimization_guide::OnDeviceModelServiceController; + // Returns the profile to use for when setting up the keyed service when the // profile is Off-The-Record. For guest profiles, returns a loaded profile if // one exists, otherwise just the original profile of the OTR profile. Note: @@ -435,16 +434,15 @@ optimization_guide::features::kOptimizationGuideOnDeviceModel)) { service_controller = GetOnDeviceModelServiceController( on_device_component_manager_->GetWeakPtr()); - on_device_asset_manager_ = - std::make_unique<optimization_guide::OnDeviceAssetManager>( - g_browser_process->local_state(), service_controller->GetWeakPtr(), - on_device_component_manager_->GetWeakPtr(), this); } model_execution_manager_ = std::make_unique<optimization_guide::ModelExecutionManager>( - url_loader_factory, IdentityManagerFactory::GetForProfile(profile), - std::move(service_controller), optimization_guide_logger_.get(), + url_loader_factory, g_browser_process->local_state(), + IdentityManagerFactory::GetForProfile(profile), + std::move(service_controller), this, + on_device_component_manager_->GetWeakPtr(), + optimization_guide_logger_.get(), model_quality_logs_uploader_service_ ? model_quality_logs_uploader_service_->GetWeakPtr() : nullptr);
diff --git a/chrome/browser/optimization_guide/optimization_guide_keyed_service.h b/chrome/browser/optimization_guide/optimization_guide_keyed_service.h index 50cabcb..2c6ae3e 100644 --- a/chrome/browser/optimization_guide/optimization_guide_keyed_service.h +++ b/chrome/browser/optimization_guide/optimization_guide_keyed_service.h
@@ -47,7 +47,6 @@ class ModelInfo; class ModelQualityLogsUploaderService; class ModelValidatorKeyedService; -class OnDeviceAssetManager; class OnDeviceModelAvailabilityObserver; class OnDeviceModelComponentStateManager; class OptimizationGuideStore; @@ -359,9 +358,6 @@ // prediction models. std::unique_ptr<optimization_guide::PredictionManager> prediction_manager_; - std::unique_ptr<optimization_guide::OnDeviceAssetManager> - on_device_asset_manager_; - // Manages the model execution. Not created for off the record profiles. std::unique_ptr<optimization_guide::ModelExecutionManager> model_execution_manager_;
diff --git a/chrome/browser/passage_embeddings/chrome_passage_embeddings_service_controller.cc b/chrome/browser/passage_embeddings/chrome_passage_embeddings_service_controller.cc index b866362..b1c95c4 100644 --- a/chrome/browser/passage_embeddings/chrome_passage_embeddings_service_controller.cc +++ b/chrome/browser/passage_embeddings/chrome_passage_embeddings_service_controller.cc
@@ -33,20 +33,22 @@ ChromePassageEmbeddingsServiceController:: ~ChromePassageEmbeddingsServiceController() = default; -void ChromePassageEmbeddingsServiceController::LaunchService() { +void ChromePassageEmbeddingsServiceController::MaybeLaunchService() { // No-op if already launched. if (service_remote_) { return; } auto receiver = service_remote_.BindNewPipeAndPassReceiver(); - service_remote_.reset_on_disconnect(); // Unretained is safe because `this` owns `service_remote_`, which - // synchronously calls the idle handler. + // synchronously calls the disconnect and idle handlers. + service_remote_.set_disconnect_handler(base::BindOnce( + &ChromePassageEmbeddingsServiceController::ResetServiceRemote, + base::Unretained(this))); service_remote_.set_idle_handler( kEmbeddingsServiceTimeout.Get(), base::BindRepeating( - &ChromePassageEmbeddingsServiceController::ResetRemotes, + &ChromePassageEmbeddingsServiceController::ResetServiceRemote, base::Unretained(this))); content::ServiceProcessHost::Launch<mojom::PassageEmbeddingsService>( std::move(receiver), @@ -58,8 +60,9 @@ .Pass()); } -void ChromePassageEmbeddingsServiceController::ResetRemotes() { - PassageEmbeddingsServiceController::ResetRemotes(); +void ChromePassageEmbeddingsServiceController::ResetServiceRemote() { + ResetEmbedderRemote(); + service_remote_.reset(); cpu_logger_.StopLoggingAfterNextUpdate(); }
diff --git a/chrome/browser/passage_embeddings/chrome_passage_embeddings_service_controller.h b/chrome/browser/passage_embeddings/chrome_passage_embeddings_service_controller.h index e0d870ba0..87b125e4 100644 --- a/chrome/browser/passage_embeddings/chrome_passage_embeddings_service_controller.h +++ b/chrome/browser/passage_embeddings/chrome_passage_embeddings_service_controller.h
@@ -11,9 +11,7 @@ #include "components/passage_embeddings/passage_embeddings_service_controller.h" namespace base { - class Process; - } // namespace base namespace passage_embeddings { @@ -33,11 +31,9 @@ ChromePassageEmbeddingsServiceController(); ~ChromePassageEmbeddingsServiceController() override; - static ChromePassageEmbeddingsServiceController** GetInstanceStorage(); - // PassageEmbeddingsServiceController implementation: - void LaunchService() override; - void ResetRemotes() override; + void MaybeLaunchService() override; + void ResetServiceRemote() override; // Initializes `cpu_logger_`; can only be called when the service process is // launched and connected.
diff --git a/chrome/browser/password_manager/chrome_password_manager_client.cc b/chrome/browser/password_manager/chrome_password_manager_client.cc index fb1ca2a..02629e99 100644 --- a/chrome/browser/password_manager/chrome_password_manager_client.cc +++ b/chrome/browser/password_manager/chrome_password_manager_client.cc
@@ -531,7 +531,12 @@ password_manager::PasswordStoreBackendErrorType:: kGMSCoreOutdatedSavingPossible; bool noPlayStore = !password_manager_android_util::IsPlayStoreAppPresent(); - if ((oldGMSSavingDisabled || oldGMSSavingPossible) && noPlayStore) { + bool login_db_deprecation_enabled = base::FeatureList::IsEnabled( + password_manager::features::kLoginDbDeprecationAndroid); + if ((oldGMSSavingDisabled || oldGMSSavingPossible) && + (noPlayStore || login_db_deprecation_enabled)) { + // Warning messages about old GMS Core versions should not be shown if there + // is no store or if the login DB deprecation has begun. return; } if (!password_manager_error_message_delegate_) { @@ -1471,25 +1476,10 @@ return; } - // With `kPasswordGenerationSoftNudge` enabled generated password is previewed - // when the popup is visible and any character typed by the user is treated as - // rejection. - if (base::FeatureList::IsEnabled( - password_manager::features::kPasswordGenerationSoftNudge)) { - // TODO(crbug.com/366198626): Rewrite the AutomaticGenerationAvailable - // triggering instead of checking a boolean when the feature is launched. - if (ui_data.input_field_empty) { - ShowPasswordGenerationPopup(PasswordGenerationType::kAutomatic, driver, - ui_data); - } else if (popup_controller_) { - popup_controller_->GeneratedPasswordRejected(); - } - - return; + if (!ui_data.generation_rejected) { + ShowPasswordGenerationPopup(PasswordGenerationType::kAutomatic, driver, + ui_data); } - - ShowPasswordGenerationPopup(PasswordGenerationType::kAutomatic, driver, - ui_data); #endif // BUILDFLAG(IS_ANDROID) }
diff --git a/chrome/browser/password_manager/password_change_browsertest.cc b/chrome/browser/password_manager/password_change_browsertest.cc index 10df847..a7dae02 100644 --- a/chrome/browser/password_manager/password_change_browsertest.cc +++ b/chrome/browser/password_manager/password_change_browsertest.cc
@@ -271,8 +271,13 @@ // Verify generated password is pre-saved. WaitForPasswordStore(); + auto generated_password = password_change_service() + ->GetPasswordChangeDelegate(WebContents()) + ->GetGeneratedPassword(); + EXPECT_EQ(base::UTF16ToUTF8(generated_password), + GetElementValue(/*iframe_id=*/"null", "new_password_1")); CheckThatCredentialsStored( - /*username=*/"", GetElementValue(/*iframe_id=*/"null", "new_password_1")); + /*username=*/"", base::UTF16ToUTF8(generated_password)); } // Verify that after password change is stopped, password change delegate is not @@ -316,8 +321,13 @@ EXPECT_TRUE(password_change_page_observer.Wait()); WaitForElementValue("password", "pa$$word"); - std::string new_password = - GetElementValue(/*iframe_id=*/"null", "new_password_1"); + + PasswordChangeDelegate* delegate = + password_change_service()->GetPasswordChangeDelegate( + browser()->tab_strip_model()->GetWebContentsAt(0)); + auto generated_password = base::UTF16ToUTF8(delegate->GetGeneratedPassword()); + EXPECT_EQ(generated_password, + GetElementValue(/*iframe_id=*/"null", "new_password_1")); // Emulate a navigation as an indication of successful submission. PasswordsNavigationObserver new_page_observer(WebContents()); @@ -328,11 +338,8 @@ // Verify generated password is saved. WaitForPasswordStore(); - CheckThatCredentialsStored("test", new_password); + CheckThatCredentialsStored("test", generated_password); // Verify the success state. - PasswordChangeDelegate* delegate = - password_change_service()->GetPasswordChangeDelegate( - browser()->tab_strip_model()->GetWebContentsAt(0)); ASSERT_EQ(delegate->GetCurrentState(), PasswordChangeDelegate::State::kPasswordSuccessfullyChanged); } @@ -396,8 +403,8 @@ WebContents()); // Verify the delegate is created and it's currently waiting for change // password form. - auto* delegate = password_change_service()->GetPasswordChangeDelegate( - browser()->tab_strip_model()->GetWebContentsAt(0)); + auto* delegate = + password_change_service()->GetPasswordChangeDelegate(WebContents()); ASSERT_TRUE(delegate); PasswordBubbleViewBase::ShowBubble( @@ -407,8 +414,8 @@ ASSERT_EQ( bubble_controller->GetTitle(), l10n_util::GetStringUTF16(IDS_PASSWORD_MANAGER_UI_SIGN_IN_CHECK_TITLE)); - ASSERT_EQ(bubble_controller->GetDisplayOrigin(), - url_formatter::FormatUrlForSecurityDisplay(change_password_url)); + ASSERT_EQ(url_formatter::FormatUrlForSecurityDisplay(change_password_url), + bubble_controller->GetDisplayOrigin()); // Wait until the state is changed from `kWaitingForChangePasswordForm` to any // other state. The bubble should disappear then.
diff --git a/chrome/browser/password_manager/password_change_delegate.h b/chrome/browser/password_manager/password_change_delegate.h index a8b2273..94ddf1b 100644 --- a/chrome/browser/password_manager/password_change_delegate.h +++ b/chrome/browser/password_manager/password_change_delegate.h
@@ -65,14 +65,17 @@ virtual void SuccessfulSubmissionDetected( content::WebContents* web_contents) = 0; + virtual void OnPrivacyNoticeAccepted() = 0; + // Adds/removes an observer. virtual void AddObserver(Observer* observer) = 0; virtual void RemoveObserver(Observer* observer) = 0; - // Returns the change password url. - virtual const GURL& GetChangePasswordUrl() const = 0; - - virtual void OnPrivacyNoticeAccepted() = 0; + // Getters for current domain where password change is ongoing, username and a + // newly generated password. Password exists only after it was generated. + virtual std::u16string GetDisplayOrigin() const = 0; + virtual const std::u16string& GetUsername() const = 0; + virtual const std::u16string& GetGeneratedPassword() const = 0; virtual base::WeakPtr<PasswordChangeDelegate> AsWeakPtr() = 0; };
diff --git a/chrome/browser/password_manager/password_change_delegate_impl.cc b/chrome/browser/password_manager/password_change_delegate_impl.cc index 1ad4ff5..ced6713 100644 --- a/chrome/browser/password_manager/password_change_delegate_impl.cc +++ b/chrome/browser/password_manager/password_change_delegate_impl.cc
@@ -12,6 +12,7 @@ #include "components/password_manager/core/browser/password_manager_client.h" #include "components/password_manager/core/common/password_manager_pref_names.h" #include "components/prefs/pref_service.h" +#include "components/url_formatter/elide_url.h" #include "content/public/browser/browser_context.h" #include "content/public/browser/web_contents.h" #include "content/public/common/referrer.h" @@ -164,8 +165,18 @@ observers_.RemoveObserver(observer); } -const GURL& PasswordChangeDelegateImpl::GetChangePasswordUrl() const { - return change_password_url_; +std::u16string PasswordChangeDelegateImpl::GetDisplayOrigin() const { + GURL url = form_manager_ ? form_manager_->GetURL() : change_password_url_; + return url_formatter::FormatUrlForSecurityDisplay( + url, url_formatter::SchemeDisplay::OMIT_CRYPTOGRAPHIC); +} + +const std::u16string& PasswordChangeDelegateImpl::GetUsername() const { + return username_; +} + +const std::u16string& PasswordChangeDelegateImpl::GetGeneratedPassword() const { + return generated_password_; } void PasswordChangeDelegateImpl::OnPrivacyNoticeAccepted() {
diff --git a/chrome/browser/password_manager/password_change_delegate_impl.h b/chrome/browser/password_manager/password_change_delegate_impl.h index a0137ea8..00d60ad0 100644 --- a/chrome/browser/password_manager/password_change_delegate_impl.h +++ b/chrome/browser/password_manager/password_change_delegate_impl.h
@@ -55,10 +55,12 @@ void Stop() override; void SuccessfulSubmissionDetected( content::WebContents* web_contents) override; + void OnPrivacyNoticeAccepted() override; void AddObserver(Observer* observer) override; void RemoveObserver(Observer* observer) override; - const GURL& GetChangePasswordUrl() const override; - void OnPrivacyNoticeAccepted() override; + std::u16string GetDisplayOrigin() const override; + const std::u16string& GetUsername() const override; + const std::u16string& GetGeneratedPassword() const override; // content::WebContentsObserver Impl void WebContentsDestroyed() override;
diff --git a/chrome/browser/password_manager/password_change_delegate_mock.h b/chrome/browser/password_manager/password_change_delegate_mock.h index cfced2b8..75a83f7 100644 --- a/chrome/browser/password_manager/password_change_delegate_mock.h +++ b/chrome/browser/password_manager/password_change_delegate_mock.h
@@ -33,10 +33,15 @@ SuccessfulSubmissionDetected, (content::WebContents*), (override)); + MOCK_METHOD(void, OnPrivacyNoticeAccepted, (), (override)); MOCK_METHOD(void, AddObserver, (Observer*), (override)); MOCK_METHOD(void, RemoveObserver, (Observer*), (override)); - MOCK_METHOD(const GURL&, GetChangePasswordUrl, (), (const override)); - MOCK_METHOD(void, OnPrivacyNoticeAccepted, (), (override)); + MOCK_METHOD(std::u16string, GetDisplayOrigin, (), (const override)); + MOCK_METHOD(const std::u16string&, GetUsername, (), (const override)); + MOCK_METHOD(const std::u16string&, + GetGeneratedPassword, + (), + (const override)); base::WeakPtr<PasswordChangeDelegate> AsWeakPtr() override;
diff --git a/chrome/browser/password_manager/password_generation_interactive_uitest.cc b/chrome/browser/password_manager/password_generation_interactive_uitest.cc index 60f53a0..4ebdcd57 100644 --- a/chrome/browser/password_manager/password_generation_interactive_uitest.cc +++ b/chrome/browser/password_manager/password_generation_interactive_uitest.cc
@@ -7,7 +7,6 @@ #include "base/strings/stringprintf.h" #include "base/strings/utf_string_conversions.h" #include "base/test/metrics/histogram_tester.h" -#include "base/test/scoped_feature_list.h" #include "build/build_config.h" #include "chrome/browser/password_manager/chrome_password_manager_client.h" #include "chrome/browser/password_manager/password_manager_interactive_test_base.h" @@ -171,12 +170,10 @@ } void NavigateToAndAcceptSuggestedPassword() { + // Cancel button is the first focusable element, hence two down button + // presses to reach the accept button. SendKeyToPopup(ui::VKEY_DOWN); - if (base::FeatureList::IsEnabled( - password_manager::features::kPasswordGenerationSoftNudge)) { - // With the feature enabled, cancel button is the first focusable element. - SendKeyToPopup(ui::VKEY_DOWN); - } + SendKeyToPopup(ui::VKEY_DOWN); SendKeyToPopup(ui::VKEY_RETURN); } @@ -220,17 +217,6 @@ // tabs to allow waiting for an Autofill popup to open. class PasswordGenerationAutofillPopupInteractiveTest : public PasswordGenerationInteractiveTest { - public: - PasswordGenerationAutofillPopupInteractiveTest() { - // TODO(crbug.com/41492898): This class contains one test - // (HidesGenerationPopupWhenShowingPasswordSuggestionsWithGeneration) - // checking that the autofill popup with suggestions should be displayed - // (and generation popup hidden) on field focus. Make sure it works with the - // nudge popup as well. - scoped_feature_list_.InitAndDisableFeature( - password_manager::features::kPasswordGenerationSoftNudge); - } - protected: ObservingAutofillClient& autofill_client() { return *autofill_client_injector_[WebContents()]; @@ -239,7 +225,6 @@ private: autofill::TestAutofillClientInjector<ObservingAutofillClient> autofill_client_injector_; - base::test::ScopedFeatureList scoped_feature_list_; }; IN_PROC_BROWSER_TEST_F(PasswordGenerationInteractiveTest, @@ -327,11 +312,11 @@ EXPECT_FALSE(GenerationPopupShowing()); } -// Verify that password generation popup is hidden when popup -// with generation and password suggestions is visible. -IN_PROC_BROWSER_TEST_F( - PasswordGenerationAutofillPopupInteractiveTest, - HidesGenerationPopupWhenShowingPasswordSuggestionsWithGeneration) { +// Verify that tapping the password field does not trigger the suggestion popup +// when user triggered the generation popup first (either by choosing it from +// suggestions popup with generation or context menu). +IN_PROC_BROWSER_TEST_F(PasswordGenerationInteractiveTest, + SuggestionsPopupIsNotShownWhenGenerationPopupVisible) { // Save the credentials since the autofill popup with generation and // password suggestion would not appear without stored passwords. password_manager::PasswordStoreInterface* password_store = @@ -355,13 +340,44 @@ WaitForGenerationPopupShowing(); EXPECT_TRUE(GenerationPopupShowing()); - // Click on the password field to display the autofill popup. + // Click on the password field and check that generation popup is still shown. content::SimulateMouseClickOrTapElementWithId(WebContents(), "password_field"); - // Make sure that the autofill popup is showing. - autofill_client().WaitForAutofillPopup(); - // Make sure the generation popup is dismissed. + EXPECT_TRUE(GenerationPopupShowing()); +} + +// Verify that password suggestions popup is still showing up even after +// user rejected password generation. +IN_PROC_BROWSER_TEST_F( + PasswordGenerationAutofillPopupInteractiveTest, + PopupWithSuggestionsShowingUpAfterUserRejectedGeneration) { + // Save a credential since the autofill popup with generation and + // password suggestion would not appear otherwise. + password_manager::PasswordStoreInterface* password_store = + ProfilePasswordStoreFactory::GetForProfile( + browser()->profile(), ServiceAccessType::IMPLICIT_ACCESS) + .get(); + password_manager::PasswordForm signin_form; + signin_form.signon_realm = embedded_test_server()->base_url().spec(); + signin_form.username_value = u"temp"; + signin_form.password_value = u"random123"; + password_store->AddLogin(signin_form); + WaitForPasswordStore(); + + NavigateToFile("/password/signup_form_new_password.html"); + + // Trigger password generation and reject by navigating to "Cancel" button. + password_manager_util::UserTriggeredManualGenerationFromContextMenu( + ChromePasswordManagerClient::FromWebContents(WebContents()), + autofill::ContentAutofillClient::FromWebContents(WebContents())); + SendKeyToPopup(ui::VKEY_DOWN); + SendKeyToPopup(ui::VKEY_RETURN); WaitForStatus(TestGenerationPopupObserver::GenerationPopup::kHidden); + + // Check that the suggestions popup still shows up on password field tap. + content::SimulateMouseClickOrTapElementWithId(WebContents(), + "password_field"); + autofill_client().WaitForAutofillPopup(); } IN_PROC_BROWSER_TEST_F(PasswordGenerationInteractiveTest, @@ -508,6 +524,19 @@ EXPECT_FALSE(GenerationPopupShowing()); } +IN_PROC_BROWSER_TEST_F(PasswordGenerationInteractiveTest, + GenerationPopupNotShownAfterUserRejected) { + FocusPasswordField(); + WaitForGenerationPopupShowing(); + + // Reject generation by navigating to "Cancel" button. + SendKeyToPopup(ui::VKEY_DOWN); + SendKeyToPopup(ui::VKEY_RETURN); + + FocusPasswordField(); + EXPECT_FALSE(GenerationPopupShowing()); +} + class PasswordGenerationPopupViewPrerenderingTest : public PasswordGenerationInteractiveTest { public:
diff --git a/chrome/browser/performance_manager/policies/background_tab_loading_policy_unittest.cc b/chrome/browser/performance_manager/policies/background_tab_loading_policy_unittest.cc index 029fb3a..0a1110e 100644 --- a/chrome/browser/performance_manager/policies/background_tab_loading_policy_unittest.cc +++ b/chrome/browser/performance_manager/policies/background_tab_loading_policy_unittest.cc
@@ -14,6 +14,7 @@ #include "base/memory/raw_ptr.h" #include "base/strings/strcat.h" #include "base/strings/string_number_conversions.h" +#include "base/strings/to_string.h" #include "base/test/scoped_feature_list.h" #include "chrome/browser/performance_manager/mechanisms/page_loader.h" #include "components/performance_manager/graph/graph_impl.h" @@ -675,7 +676,7 @@ { {"min_site_engagement", base::NumberToString(kMinSiteEngagement)}, {"restore_main_frame_state", - restore_main_frame_state_ ? "true" : "false"}, + base::ToString(restore_main_frame_state_)}, }); }
diff --git a/chrome/browser/picture_in_picture/document_picture_in_picture_window_controller_browsertest.cc b/chrome/browser/picture_in_picture/document_picture_in_picture_window_controller_browsertest.cc index c7fb0791d..d5852fa 100644 --- a/chrome/browser/picture_in_picture/document_picture_in_picture_window_controller_browsertest.cc +++ b/chrome/browser/picture_in_picture/document_picture_in_picture_window_controller_browsertest.cc
@@ -12,6 +12,7 @@ #include "base/path_service.h" #include "base/scoped_observation.h" #include "base/strings/strcat.h" +#include "base/strings/to_string.h" #include "base/test/scoped_feature_list.h" #include "base/test/test_timeouts.h" #include "build/build_config.h" @@ -215,7 +216,7 @@ base::NumberToString(window_size.width()), ",height:", base::NumberToString(window_size.height()), ",preferInitialWindowPlacement:", - prefer_initial_window_placement ? "true" : "false"}); + base::ToString(prefer_initial_window_placement)}); script = base::StrCat({script, "})"}); ASSERT_EQ(true, EvalJs(active_web_contents, script)); ASSERT_TRUE(window_controller() != nullptr);
diff --git a/chrome/browser/policy/configuration_policy_handler_list_factory.cc b/chrome/browser/policy/configuration_policy_handler_list_factory.cc index f1fea103e..70a60fa 100644 --- a/chrome/browser/policy/configuration_policy_handler_list_factory.cc +++ b/chrome/browser/policy/configuration_policy_handler_list_factory.cc
@@ -259,6 +259,10 @@ #include "components/device_signals/core/browser/pref_names.h" // nogncheck due to crbug.com/1125897 #endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) +#if BUILDFLAG(ENABLE_GLIC) +#include "chrome/browser/glic/glic_pref_names.h" +#endif // BUILDFLAG(ENABLE_GLIC) + #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \ BUILDFLAG(IS_ANDROID) #include "components/enterprise/idle/idle_timeout_policy_handler.h" @@ -2338,6 +2342,12 @@ { key::kWebAudioOutputBufferingEnabled, prefs::kWebAudioOutputBufferingEnabled, base::Value::Type::BOOLEAN }, + +#if BUILDFLAG(ENABLE_GLIC) + { key::kGlicEnabled, + glic::prefs::kGlicEnabledByPolicy, + base::Value::Type::BOOLEAN }, +#endif // BUILDFLAG(ENABLE_GLIC) }; // clang-format on
diff --git a/chrome/browser/predictors/predictors_features.cc b/chrome/browser/predictors/predictors_features.cc index 3aca9b4..914abba 100644 --- a/chrome/browser/predictors/predictors_features.cc +++ b/chrome/browser/predictors/predictors_features.cc
@@ -45,15 +45,11 @@ "LoadingPredictorDisregardAlwaysAccessesNetwork", base::FEATURE_DISABLED_BY_DEFAULT); -constexpr base::FeatureState - kLoadingPredictorUseOptimizationGuideDefaultFeatureState = - kFeatureEnabledOnlyOnAndroid; - // Modifies loading predictor so that it can also use predictions coming from // the optimization guide. BASE_FEATURE(kLoadingPredictorUseOptimizationGuide, "LoadingPredictorUseOptimizationGuide", - kLoadingPredictorUseOptimizationGuideDefaultFeatureState); + base::FEATURE_ENABLED_BY_DEFAULT); constexpr base::FeatureState kLoadingPredictorPrefetchDefaultFeatureState = kFeatureEnabledOnlyOnAndroid;
diff --git a/chrome/browser/prefs/browser_prefs.cc b/chrome/browser/prefs/browser_prefs.cc index 0a9c6a3..d09c3bf 100644 --- a/chrome/browser/prefs/browser_prefs.cc +++ b/chrome/browser/prefs/browser_prefs.cc
@@ -557,66 +557,6 @@ // Please keep the list of deprecated prefs in chronological order. i.e. Add to // the bottom of the list, not here at the top. -// Deprecated 01/2024. -const char kPrivacySandboxPageViewed[] = "privacy_sandbox.page_viewed"; - -// Deprecated 01/2024. -const char kPrivacySandboxApisEnabledV2[] = "privacy_sandbox.apis_enabled_v2"; -const char kPrivacySandboxManuallyControlledV2[] = - "privacy_sandbox.manually_controlled_v2"; - -// Deprecated 01/2024. -#if BUILDFLAG(ENABLE_COMPOSE) -constexpr char kPrefHasAcceptedComposeConsent[] = - "compose_has_accepted_consent"; -constexpr char kAutofillAssistanceEnabled[] = "autofill_assistance.enabled"; -#endif - -// Deprecated 01/2024. -const char kSyncedLastTimePasswordCheckCompleted[] = - "profile.credentials_last_password_checkup_time"; - -// Deprecated 01/2024. -const char kDownloadBubbleIphSuppression[] = "suppress_download_bubble_iph"; - -#if BUILDFLAG(IS_CHROMEOS_ASH) -// Deprecated 01/2024. -const char kPersistedSystemExtensions[] = "system_extensions.persisted"; -#endif // BUILDFLAG(IS_CHROMEOS_ASH) - -// Deprecated 01/2024. -const char kPPAPISharedImagesForVideoDecoderAllowed[] = - "policy.ppapi_shared_images_for_video_decoder_allowed"; - -#if BUILDFLAG(IS_CHROMEOS_ASH) -// Deprecated 01/2024. -const char kBorealisVmTokenHash[] = "borealis.vm_token_hash"; -#endif // BUILDFLAG(IS_CHROMEOS_ASH) - -// Deprecated 01/2024. -#if BUILDFLAG(IS_CHROMEOS_ASH) -constexpr char kExtendedFkeysModifier[] = - "ash.settings.extended_fkeys_modifier"; -#endif // BUILDFLAG(IS_CHROMEOS_ASH) - -// Deprecated 01/2024. -constexpr char kNtpShownPage[] = "ntp.shown_page"; -constexpr char kNtpAppPageNames[] = "ntp.app_page_names"; - -// Deprecated 01/2024. -#if BUILDFLAG(IS_WIN) -const char kSearchResultsPagePrimaryFontsPref[] = - "cached_fonts.search_results_page.primary"; -const char kSearchResultsPageFallbackFontsPref[] = - "cached_fonts.search_results_page.fallback"; -#endif // BUILDFLAG(IS_WIN) - -// Deprecated 01/2024. -#if BUILDFLAG(IS_CHROMEOS_ASH) -constexpr char kUpdateNotificationLastShownMilestone[] = - "update_notification_last_shown_milestone"; -#endif // BUILDFLAG(IS_CHROMEOS_ASH) - // Deprecated 02/2024. #if BUILDFLAG(IS_ANDROID) constexpr char kSavePasswordsSuspendedByError[] = @@ -1184,17 +1124,15 @@ // Deprecated 01/2025. inline constexpr char kCompactModeEnabled[] = "compact_mode"; +// Deprecated 01/2025. +inline constexpr char kSafeBrowsingAutomaticDeepScanningIPHSeen[] = + "safebrowsing.automatic_deep_scanning_iph_seen"; +inline constexpr char kSafeBrowsingAutomaticDeepScanPerformed[] = + "safe_browsing.automatic_deep_scan_performed"; + // Register local state used only for migration (clearing or moving to a new // key). void RegisterLocalStatePrefsForMigration(PrefRegistrySimple* registry) { - // Deprecated 01/2024. - registry->RegisterBooleanPref(kPPAPISharedImagesForVideoDecoderAllowed, true); - - // Deprecated 01/2024. -#if BUILDFLAG(IS_CHROMEOS_ASH) - registry->RegisterIntegerPref(kExtendedFkeysModifier, 0); -#endif - // Deprecated 02/2024 #if BUILDFLAG(IS_MAC) registry->RegisterBooleanPref(kScreenTimeEnabled, true); @@ -1306,47 +1244,6 @@ user_prefs::PrefRegistrySyncable* registry) { chrome_browser_net::secure_dns::RegisterProbesSettingBackupPref(registry); - // Deprecated 01/2024. - registry->RegisterBooleanPref(kPrivacySandboxPageViewed, false); - - // Deprecated 01/2024. - registry->RegisterBooleanPref(kPrivacySandboxApisEnabledV2, false); - registry->RegisterBooleanPref(kPrivacySandboxManuallyControlledV2, false); - -// Deprecated 01/2024. -#if BUILDFLAG(ENABLE_COMPOSE) - registry->RegisterBooleanPref(kPrefHasAcceptedComposeConsent, false); - registry->RegisterBooleanPref(kAutofillAssistanceEnabled, false); -#endif - - // Deprecated 01/2024. - registry->RegisterTimePref(kSyncedLastTimePasswordCheckCompleted, - base::Time()); - - // Deprecated 01/2024. - registry->RegisterBooleanPref(kDownloadBubbleIphSuppression, false); - -// Deprecated 01/2024. -#if BUILDFLAG(IS_CHROMEOS_ASH) - registry->RegisterDictionaryPref(kPersistedSystemExtensions); - registry->RegisterStringPref(kBorealisVmTokenHash, ""); -#endif // BUILDFLAG(IS_CHROMEOS_ASH) - - // Deprecated 01/2024. - registry->RegisterIntegerPref(kNtpShownPage, 0); - registry->RegisterListPref(kNtpAppPageNames); - - // Deprecated 01/2024. -#if BUILDFLAG(IS_WIN) - registry->RegisterListPref(kSearchResultsPagePrimaryFontsPref); - registry->RegisterListPref(kSearchResultsPageFallbackFontsPref); -#endif - - // Deprecated 01/2024. -#if BUILDFLAG(IS_CHROMEOS_ASH) - registry->RegisterIntegerPref(kUpdateNotificationLastShownMilestone, -10); -#endif - // Deprecated 02/2024. #if BUILDFLAG(IS_ANDROID) registry->RegisterBooleanPref(kSavePasswordsSuspendedByError, false); @@ -1689,6 +1586,11 @@ // Deprecated 01/2025. registry->RegisterBooleanPref(kCompactModeEnabled, false); + + // Deprecated 01/2025. + registry->RegisterBooleanPref(kSafeBrowsingAutomaticDeepScanningIPHSeen, + false); + registry->RegisterBooleanPref(kSafeBrowsingAutomaticDeepScanPerformed, false); } } // namespace @@ -2500,14 +2402,6 @@ // BEGIN_MIGRATE_OBSOLETE_LOCAL_STATE_PREFS // Please don't delete the preceding line. It is used by PRESUBMIT.py. - // Added 01/2024. - local_state->ClearPref(kPPAPISharedImagesForVideoDecoderAllowed); - -// Added 01/2024. -#if BUILDFLAG(IS_CHROMEOS_ASH) - local_state->ClearPref(kExtendedFkeysModifier); -#endif - // Added 02/2024 #if BUILDFLAG(IS_MAC) local_state->ClearPref(kScreenTimeEnabled); @@ -2665,51 +2559,6 @@ profile_path); #endif - // Added 01/2024. - profile_prefs->ClearPref(kPrivacySandboxPageViewed); - - // Added 01/2024. - profile_prefs->ClearPref(kPrivacySandboxApisEnabledV2); - profile_prefs->ClearPref(kPrivacySandboxManuallyControlledV2); - - // Added 01/2024. -#if BUILDFLAG(ENABLE_COMPOSE) - profile_prefs->ClearPref(kPrefHasAcceptedComposeConsent); - profile_prefs->ClearPref(kAutofillAssistanceEnabled); -#endif - - // Added 01/2024. - profile_prefs->ClearPref(kSyncedLastTimePasswordCheckCompleted); - - // Added 01/2024. - profile_prefs->ClearPref(kDownloadBubbleIphSuppression); - - // Added 01/2024. -#if BUILDFLAG(IS_CHROMEOS_ASH) - profile_prefs->ClearPref(kPersistedSystemExtensions); - profile_prefs->ClearPref(kBorealisVmTokenHash); -#endif // BUILDFLAG(IS_CHROMEOS_ASH) - - // Added 01/2024. - profile_prefs->ClearPref(kNtpShownPage); - profile_prefs->ClearPref(kNtpAppPageNames); - - // Added 01/2024. -#if BUILDFLAG(IS_WIN) - profile_prefs->ClearPref(kSearchResultsPagePrimaryFontsPref); - profile_prefs->ClearPref(kSearchResultsPageFallbackFontsPref); -#endif - - // Added 01/2024. -#if BUILDFLAG(IS_CHROMEOS_ASH) - profile_prefs->ClearPref(kUpdateNotificationLastShownMilestone); -#endif - - // Added 01/2024. -#if BUILDFLAG(IS_ANDROID) - profile_prefs->ClearPref(kSavePasswordsSuspendedByError); -#endif - // Added 02/2024 profile_prefs->ClearPref(kSafeBrowsingDeepScanPromptSeen); profile_prefs->ClearPref(kSafeBrowsingEsbEnabledTimestamp); @@ -3032,6 +2881,10 @@ // Added 01/2025. profile_prefs->ClearPref(kCompactModeEnabled); + // Added 01/2025. + profile_prefs->ClearPref(kSafeBrowsingAutomaticDeepScanPerformed); + profile_prefs->ClearPref(kSafeBrowsingAutomaticDeepScanningIPHSeen); + // Please don't delete the following line. It is used by PRESUBMIT.py. // END_MIGRATE_OBSOLETE_PROFILE_PREFS
diff --git a/chrome/browser/printing/system_access_process_print_browsertest.cc b/chrome/browser/printing/system_access_process_print_browsertest.cc index 0e2fe50..ecc4336 100644 --- a/chrome/browser/printing/system_access_process_print_browsertest.cc +++ b/chrome/browser/printing/system_access_process_print_browsertest.cc
@@ -12,6 +12,7 @@ #include "base/functional/bind.h" #include "base/logging.h" #include "base/memory/raw_ptr.h" +#include "base/strings/to_string.h" #include "base/test/bind.h" #include "base/test/scoped_feature_list.h" #include "build/build_config.h" @@ -646,10 +647,10 @@ enabled_features.push_back( {features::kEnableOopPrintDrivers, {{features::kEnableOopPrintDriversEarlyStart.name, - EarlyStartService() ? "true" : "false"}, + base::ToString(EarlyStartService())}, {features::kEnableOopPrintDriversJobPrint.name, "true"}, {features::kEnableOopPrintDriversSandbox.name, - SandboxService() ? "true" : "false"}}}); + base::ToString(SandboxService())}}}); #if BUILDFLAG(IS_WIN) if (UseXps()) { enabled_features.push_back({features::kUseXpsForPrinting, {}});
diff --git a/chrome/browser/privacy_guide/android/java/src/org/chromium/chrome/browser/privacy_guide/HistorySyncFragment.java b/chrome/browser/privacy_guide/android/java/src/org/chromium/chrome/browser/privacy_guide/HistorySyncFragment.java index c438a5e..42ea7cc 100644 --- a/chrome/browser/privacy_guide/android/java/src/org/chromium/chrome/browser/privacy_guide/HistorySyncFragment.java +++ b/chrome/browser/privacy_guide/android/java/src/org/chromium/chrome/browser/privacy_guide/HistorySyncFragment.java
@@ -4,6 +4,8 @@ package org.chromium.chrome.browser.privacy_guide; +import static org.chromium.chrome.browser.privacy_guide.PrivacyGuideUtils.canUpdateHistorySyncValue; + import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; @@ -55,11 +57,19 @@ } private void setHistorySyncSwitchState() { - mHistorySyncSwitch.setChecked(PrivacyGuideUtils.isHistorySyncEnabled(getProfile())); + boolean newState = PrivacyGuideUtils.isHistorySyncEnabled(getProfile()); + boolean currentState = mHistorySyncSwitch.isChecked(); + if (newState != currentState) { + mHistorySyncSwitch.setChecked(newState); + } } @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { + if (!canUpdateHistorySyncValue(getProfile())) { + return; + } + PrivacyGuideMetricsDelegate.recordMetricsOnHistorySyncChange(isChecked); mSyncService.setSelectedType(UserSelectableType.HISTORY, isChecked);
diff --git a/chrome/browser/privacy_guide/android/java/src/org/chromium/chrome/browser/privacy_guide/PrivacyGuideUtils.java b/chrome/browser/privacy_guide/android/java/src/org/chromium/chrome/browser/privacy_guide/PrivacyGuideUtils.java index 62b3c941..5baa2a6 100644 --- a/chrome/browser/privacy_guide/android/java/src/org/chromium/chrome/browser/privacy_guide/PrivacyGuideUtils.java +++ b/chrome/browser/privacy_guide/android/java/src/org/chromium/chrome/browser/privacy_guide/PrivacyGuideUtils.java
@@ -15,6 +15,7 @@ import org.chromium.components.content_settings.PrefNames; import org.chromium.components.signin.identitymanager.ConsentLevel; import org.chromium.components.signin.identitymanager.IdentityManager; +import org.chromium.components.sync.SyncService; import org.chromium.components.sync.UserSelectableType; import org.chromium.components.user_prefs.UserPrefs; @@ -58,4 +59,27 @@ static @CookieControlsMode int getCookieControlsMode(Profile profile) { return UserPrefs.get(profile).getInteger(PrefNames.COOKIE_CONTROLS_MODE); } + + static boolean canUpdateHistorySyncValue(Profile profile) { + SyncService syncService = SyncServiceFactory.getForProfile(profile); + if (syncService == null) { + return false; + } + + if (!isUserSignedIn(profile)) { + return false; + } + if (syncService.isSyncDisabledByEnterprisePolicy()) { + return false; + } + if (syncService.isTypeManagedByPolicy(UserSelectableType.HISTORY) + && syncService.isTypeManagedByPolicy(UserSelectableType.TABS)) { + return false; + } + if (syncService.isTypeManagedByCustodian(UserSelectableType.HISTORY) + && syncService.isTypeManagedByCustodian(UserSelectableType.TABS)) { + return false; + } + return true; + } }
diff --git a/chrome/browser/privacy_guide/android/java/src/org/chromium/chrome/browser/privacy_guide/StepDisplayHandlerImpl.java b/chrome/browser/privacy_guide/android/java/src/org/chromium/chrome/browser/privacy_guide/StepDisplayHandlerImpl.java index 7c65881f..6a6d8d95 100644 --- a/chrome/browser/privacy_guide/android/java/src/org/chromium/chrome/browser/privacy_guide/StepDisplayHandlerImpl.java +++ b/chrome/browser/privacy_guide/android/java/src/org/chromium/chrome/browser/privacy_guide/StepDisplayHandlerImpl.java
@@ -4,18 +4,15 @@ package org.chromium.chrome.browser.privacy_guide; +import static org.chromium.chrome.browser.privacy_guide.PrivacyGuideUtils.canUpdateHistorySyncValue; + import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.privacy_sandbox.PrivacySandboxBridge; import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.safe_browsing.SafeBrowsingState; -import org.chromium.chrome.browser.signin.services.IdentityServicesProvider; -import org.chromium.chrome.browser.sync.SyncServiceFactory; import org.chromium.components.browser_ui.site_settings.WebsitePreferenceBridge; import org.chromium.components.content_settings.ContentSettingsType; import org.chromium.components.content_settings.CookieControlsMode; -import org.chromium.components.signin.identitymanager.ConsentLevel; -import org.chromium.components.sync.SyncService; -import org.chromium.components.sync.UserSelectableType; /** Computes for each privacy guide step whether it should be displayed or not. */ class StepDisplayHandlerImpl implements StepDisplayHandler { @@ -29,28 +26,7 @@ @Override public boolean shouldDisplayHistorySync() { - SyncService syncService = SyncServiceFactory.getForProfile(mProfile); - if (syncService == null) { - return false; - } - - if (!IdentityServicesProvider.get() - .getIdentityManager(mProfile) - .hasPrimaryAccount(ConsentLevel.SIGNIN)) { - return false; - } - if (syncService.isSyncDisabledByEnterprisePolicy()) { - return false; - } - if (syncService.isTypeManagedByPolicy(UserSelectableType.HISTORY) - && syncService.isTypeManagedByPolicy(UserSelectableType.TABS)) { - return false; - } - if (syncService.isTypeManagedByCustodian(UserSelectableType.HISTORY) - && syncService.isTypeManagedByCustodian(UserSelectableType.TABS)) { - return false; - } - return true; + return canUpdateHistorySyncValue(mProfile); } @Override
diff --git a/chrome/browser/privacy_guide/android/junit/src/org/chromium/chrome/browser/privacy_guide/HistorySyncFragmentTest.java b/chrome/browser/privacy_guide/android/junit/src/org/chromium/chrome/browser/privacy_guide/HistorySyncFragmentTest.java index acec82d..dc73e0c 100644 --- a/chrome/browser/privacy_guide/android/junit/src/org/chromium/chrome/browser/privacy_guide/HistorySyncFragmentTest.java +++ b/chrome/browser/privacy_guide/android/junit/src/org/chromium/chrome/browser/privacy_guide/HistorySyncFragmentTest.java
@@ -15,8 +15,11 @@ import android.os.Bundle; import android.widget.TextView; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentFactory; import androidx.fragment.app.testing.FragmentScenario; +import org.jspecify.annotations.NonNull; import org.junit.After; import org.junit.Before; import org.junit.Rule; @@ -28,8 +31,12 @@ import org.chromium.base.test.BaseRobolectricTestRunner; import org.chromium.base.test.util.UserActionTester; +import org.chromium.chrome.browser.profiles.Profile; +import org.chromium.chrome.browser.signin.services.IdentityServicesProvider; import org.chromium.chrome.browser.sync.SyncServiceFactory; import org.chromium.components.browser_ui.widget.MaterialSwitchWithText; +import org.chromium.components.signin.identitymanager.ConsentLevel; +import org.chromium.components.signin.identitymanager.IdentityManager; import org.chromium.components.sync.SyncService; import org.chromium.components.sync.UserSelectableType; @@ -47,6 +54,9 @@ @Rule public MockitoRule mMockitoRule = MockitoJUnit.rule(); @Mock private SyncService mSyncService; + @Mock private Profile mProfile; + @Mock private IdentityServicesProvider mIdentityServicesProvider; + @Mock private IdentityManager mIdentityManager; private FragmentScenario mScenario; private MaterialSwitchWithText mHistorySyncButton; @@ -55,6 +65,8 @@ @Before public void setUp() { SyncServiceFactory.setInstanceForTesting(mSyncService); + IdentityServicesProvider.setInstanceForTests(mIdentityServicesProvider); + when(mIdentityServicesProvider.getIdentityManager(mProfile)).thenReturn(mIdentityManager); } @After @@ -67,15 +79,34 @@ private void initFragmentWithSyncState(boolean historySync) { initSyncState(historySync); + setSigninState(true); mScenario = FragmentScenario.launchInContainer( - HistorySyncFragment.class, Bundle.EMPTY, R.style.Theme_MaterialComponents); + HistorySyncFragment.class, + Bundle.EMPTY, + R.style.Theme_MaterialComponents, + new FragmentFactory() { + @NonNull + @Override + public Fragment instantiate( + @NonNull ClassLoader classLoader, @NonNull String className) { + Fragment fragment = super.instantiate(classLoader, className); + if (fragment instanceof HistorySyncFragment) { + ((HistorySyncFragment) fragment).setProfile(mProfile); + } + return fragment; + } + }); mScenario.onFragment( fragment -> mHistorySyncButton = fragment.getView().findViewById(R.id.history_sync_switch)); } + private void setSigninState(boolean isSignedIn) { + when(mIdentityManager.hasPrimaryAccount(ConsentLevel.SIGNIN)).thenReturn(isSignedIn); + } + private void initSyncState(boolean historySync) { Set<Integer> syncTypes = new HashSet<>(); if (historySync) { @@ -201,4 +232,58 @@ assertTrue(mHistorySyncButton.isChecked()); }); } + + @Test + public void testSignOut() { + initFragmentWithSyncState(true); + assertTrue(mHistorySyncButton.isChecked()); + + setSigninState(false); + mHistorySyncButton.performClick(); + + assertFalse(mHistorySyncButton.isChecked()); + verify(mSyncService, times(0)).setSelectedType(eq(UserSelectableType.HISTORY), eq(false)); + verify(mSyncService, times(0)).setSelectedType(eq(UserSelectableType.TABS), eq(false)); + } + + @Test + public void testSyncDisabledByPolicy() { + initFragmentWithSyncState(true); + assertTrue(mHistorySyncButton.isChecked()); + + when(mSyncService.isSyncDisabledByEnterprisePolicy()).thenReturn(true); + mHistorySyncButton.performClick(); + + assertFalse(mHistorySyncButton.isChecked()); + verify(mSyncService, times(0)).setSelectedType(eq(UserSelectableType.HISTORY), eq(false)); + verify(mSyncService, times(0)).setSelectedType(eq(UserSelectableType.TABS), eq(false)); + } + + @Test + public void testHistoryAndTabSyncManagedByPolicy() { + initFragmentWithSyncState(true); + assertTrue(mHistorySyncButton.isChecked()); + + when(mSyncService.isTypeManagedByPolicy(UserSelectableType.HISTORY)).thenReturn(true); + when(mSyncService.isTypeManagedByPolicy(UserSelectableType.TABS)).thenReturn(true); + mHistorySyncButton.performClick(); + + assertFalse(mHistorySyncButton.isChecked()); + verify(mSyncService, times(0)).setSelectedType(eq(UserSelectableType.HISTORY), eq(false)); + verify(mSyncService, times(0)).setSelectedType(eq(UserSelectableType.TABS), eq(false)); + } + + @Test + public void testHistoryAndTabSyncManagedByCustodian() { + initFragmentWithSyncState(true); + assertTrue(mHistorySyncButton.isChecked()); + + when(mSyncService.isTypeManagedByCustodian(UserSelectableType.HISTORY)).thenReturn(true); + when(mSyncService.isTypeManagedByCustodian(UserSelectableType.TABS)).thenReturn(true); + mHistorySyncButton.performClick(); + + assertFalse(mHistorySyncButton.isChecked()); + verify(mSyncService, times(0)).setSelectedType(eq(UserSelectableType.HISTORY), eq(false)); + verify(mSyncService, times(0)).setSelectedType(eq(UserSelectableType.TABS), eq(false)); + } }
diff --git a/chrome/browser/privacy_sandbox/privacy_sandbox_settings_delegate_unittest.cc b/chrome/browser/privacy_sandbox/privacy_sandbox_settings_delegate_unittest.cc index 35327fae..a612371 100644 --- a/chrome/browser/privacy_sandbox/privacy_sandbox_settings_delegate_unittest.cc +++ b/chrome/browser/privacy_sandbox/privacy_sandbox_settings_delegate_unittest.cc
@@ -11,6 +11,7 @@ #include <string> #include <vector> +#include "base/strings/to_string.h" #include "base/test/scoped_feature_list.h" #include "base/time/time.h" #include "build/build_config.h" @@ -529,20 +530,20 @@ feature_list()->InitAndEnableFeatureWithParameters( features::kCookieDeprecationFacilitatedTesting, {{"use_profile_filtering", "true"}, - {"force_eligible", test_case.force_eligible ? "true" : "false"}, + {"force_eligible", base::ToString(test_case.force_eligible)}, {tpcd::experiment::kExclude3PCBlockedName, - test_case.exclude_3pc_blocked ? "true" : "false"}, + base::ToString(test_case.exclude_3pc_blocked)}, {tpcd::experiment::kExcludeNotSeenAdsAPIsNoticeName, - test_case.exclude_not_seen_notice ? "true" : "false"}, + base::ToString(test_case.exclude_not_seen_notice)}, {tpcd::experiment::kExcludeDasherAccountName, - test_case.exclude_dasher_account ? "true" : "false"}, + base::ToString(test_case.exclude_dasher_account)}, {tpcd::experiment::kExcludeNewUserName, - test_case.exclude_new_user ? "true" : "false"}, + base::ToString(test_case.exclude_new_user)}, {tpcd::experiment::kInstallTimeForNewUserName, test_case.install_time_new_user}, #if BUILDFLAG(IS_ANDROID) {tpcd::experiment::kExcludePwaOrTwaInstalledName, - test_case.exclude_pwa_twa_installed ? "true" : "false"} + base::ToString(test_case.exclude_pwa_twa_installed)} #endif }); @@ -608,8 +609,8 @@ const bool use_profile_filtering = GetParam(); - const char* use_profile_filtering_param = - use_profile_filtering ? "true" : "false"; + const std::string use_profile_filtering_param = + base::ToString(use_profile_filtering); { feature_list()->InitAndEnableFeatureWithParameters( @@ -668,8 +669,7 @@ TEST_P(CookieDeprecationLabelAllowedTest, IsClientEligibleChecked) { feature_list()->InitAndEnableFeatureWithParameters( features::kCookieDeprecationFacilitatedTesting, - {{tpcd::experiment::kDisable3PCookiesName, - GetParam() ? "true" : "false"}}); + {{tpcd::experiment::kDisable3PCookiesName, base::ToString(GetParam())}}); const bool disable_3pcs = GetParam(); if (disable_3pcs) { @@ -734,9 +734,9 @@ feature_list()->InitAndEnableFeatureWithParameters( features::kCookieDeprecationFacilitatedTesting, {{tpcd::experiment::kDisable3PCookiesName, - disable_3pcs ? "true" : "false"}, + base::ToString(disable_3pcs)}, {tpcd::experiment::kNeedOnboardingForLabelName, - test_case.need_onboarding ? "true" : "false"}, + base::ToString(test_case.need_onboarding)}, {tpcd::experiment::kEnableSilentOnboardingName, "true"}}); if (disable_3pcs) {
diff --git a/chrome/browser/profiles/keep_alive/profile_keep_alive_types.cc b/chrome/browser/profiles/keep_alive/profile_keep_alive_types.cc index e1967161..ab5862b2 100644 --- a/chrome/browser/profiles/keep_alive/profile_keep_alive_types.cc +++ b/chrome/browser/profiles/keep_alive/profile_keep_alive_types.cc
@@ -81,6 +81,8 @@ return out << "kHeadlessCommand"; case ProfileKeepAliveOrigin::kGlicView: return out << "kGlicView"; + case ProfileKeepAliveOrigin::kWaitingForGlicView: + return out << "kWaitingForGlicView"; } NOTREACHED(); }
diff --git a/chrome/browser/profiles/keep_alive/profile_keep_alive_types.h b/chrome/browser/profiles/keep_alive/profile_keep_alive_types.h index 2d9d415..698c058 100644 --- a/chrome/browser/profiles/keep_alive/profile_keep_alive_types.h +++ b/chrome/browser/profiles/keep_alive/profile_keep_alive_types.h
@@ -168,7 +168,12 @@ // not destroyed while visible. kGlicView = 40, - kMaxValue = kGlicView, + // Used by the `ProfilePickerGlicFlowController` to ensure the loaded profile + // is not destroyed before opening the `GlicView` instead of relying on + // `kWaitingForFirstBrowserWindow`. + kWaitingForGlicView = 41, + + kMaxValue = kWaitingForGlicView, }; // LINT.ThenChange(/tools/metrics/histograms/metadata/profile/enums.xml)
diff --git a/chrome/browser/profiles/profile_manager.cc b/chrome/browser/profiles/profile_manager.cc index e9c1657..6ff5682 100644 --- a/chrome/browser/profiles/profile_manager.cc +++ b/chrome/browser/profiles/profile_manager.cc
@@ -1272,6 +1272,7 @@ if (origin == ProfileKeepAliveOrigin::kBrowserWindow || origin == ProfileKeepAliveOrigin::kProfileCreationFlow || origin == ProfileKeepAliveOrigin::kProfileStatistics || + origin == ProfileKeepAliveOrigin::kWaitingForGlicView || (origin == ProfileKeepAliveOrigin::kProfilePickerView && base::FeatureList::IsEnabled(features::kDestroySystemProfiles))) { ClearFirstBrowserWindowKeepAlive(profile);
diff --git a/chrome/browser/profiles/profile_manager.h b/chrome/browser/profiles/profile_manager.h index 76429fe..627a640 100644 --- a/chrome/browser/profiles/profile_manager.h +++ b/chrome/browser/profiles/profile_manager.h
@@ -377,7 +377,7 @@ friend class TestingProfileManager; FRIEND_TEST_ALL_PREFIXES(ProfileManagerBrowserTest, DeleteAllProfiles); FRIEND_TEST_ALL_PREFIXES(ProfileManagerBrowserTest, SwitchToProfile); - FRIEND_TEST_ALL_PREFIXES(ProfileManagerTest, ScopedProfileKeepAlive); + FRIEND_TEST_ALL_PREFIXES(ProfileManagerTestWithParam, ScopedProfileKeepAlive); // For AddKeepAlive() and RemoveKeepAlive(). friend class ScopedProfileKeepAlive;
diff --git a/chrome/browser/profiles/profile_manager_unittest.cc b/chrome/browser/profiles/profile_manager_unittest.cc index 04963ef..735dcd5e 100644 --- a/chrome/browser/profiles/profile_manager_unittest.cc +++ b/chrome/browser/profiles/profile_manager_unittest.cc
@@ -6,6 +6,7 @@ #include <stddef.h> +#include <sstream> #include <string> #include <utility> @@ -2332,10 +2333,108 @@ content::RunAllTasksUntilIdle(); } -TEST_F(ProfileManagerTest, ScopedProfileKeepAlive) { - base::test::ScopedFeatureList features; - features.InitAndEnableFeature(features::kDestroyProfileOnBrowserClose); +struct ProfileKeepAliveParam { + ProfileKeepAliveOrigin origin; + bool should_clear_waiting_for_first_browser_window = false; +}; +constexpr ProfileKeepAliveParam params[] = { + // Origins that clears + // `ProfileKeepAliveOrigin::kWaitingForFirstBrowserWindow`. + {.origin = ProfileKeepAliveOrigin::kBrowserWindow, + .should_clear_waiting_for_first_browser_window = true}, + {.origin = ProfileKeepAliveOrigin::kProfileCreationFlow, + .should_clear_waiting_for_first_browser_window = true}, + {.origin = ProfileKeepAliveOrigin::kProfileStatistics, + .should_clear_waiting_for_first_browser_window = true}, + {.origin = ProfileKeepAliveOrigin::kProfilePickerView, + .should_clear_waiting_for_first_browser_window = true}, + {.origin = ProfileKeepAliveOrigin::kWaitingForGlicView, + .should_clear_waiting_for_first_browser_window = true}, + + // Origins that do NOT clear + // `ProfileKeepAliveOrigin::kWaitingForFirstBrowserWindow`. + {.origin = ProfileKeepAliveOrigin::kBackgroundMode, + .should_clear_waiting_for_first_browser_window = false}, + {.origin = ProfileKeepAliveOrigin::kOffTheRecordProfile, + .should_clear_waiting_for_first_browser_window = false}, + {.origin = ProfileKeepAliveOrigin::kDownloadInProgress, + .should_clear_waiting_for_first_browser_window = false}, + {.origin = ProfileKeepAliveOrigin::kClearingBrowsingData, + .should_clear_waiting_for_first_browser_window = false}, + {.origin = ProfileKeepAliveOrigin::kAppWindow, + .should_clear_waiting_for_first_browser_window = false}, + {.origin = ProfileKeepAliveOrigin::kBackgroundSync, + .should_clear_waiting_for_first_browser_window = false}, + {.origin = ProfileKeepAliveOrigin::kNotification, + .should_clear_waiting_for_first_browser_window = false}, + {.origin = ProfileKeepAliveOrigin::kPendingNotificationClickEvent, + .should_clear_waiting_for_first_browser_window = false}, + {.origin = ProfileKeepAliveOrigin::kInFlightPushMessage, + .should_clear_waiting_for_first_browser_window = false}, + {.origin = ProfileKeepAliveOrigin::kSessionRestore, + .should_clear_waiting_for_first_browser_window = false}, + {.origin = ProfileKeepAliveOrigin::kChromeViewsDelegate, + .should_clear_waiting_for_first_browser_window = false}, + {.origin = ProfileKeepAliveOrigin::kDevToolsWindow, + .should_clear_waiting_for_first_browser_window = false}, + {.origin = ProfileKeepAliveOrigin::kWebAppPermissionDialogWindow, + .should_clear_waiting_for_first_browser_window = false}, + {.origin = ProfileKeepAliveOrigin::kExtensionUpdater, + .should_clear_waiting_for_first_browser_window = false}, + {.origin = ProfileKeepAliveOrigin::kPendingNotificationCloseEvent, + .should_clear_waiting_for_first_browser_window = false}, + {.origin = ProfileKeepAliveOrigin::kFeedbackDialog, + .should_clear_waiting_for_first_browser_window = false}, + {.origin = ProfileKeepAliveOrigin::kWebAppUpdate, + .should_clear_waiting_for_first_browser_window = false}, + {.origin = ProfileKeepAliveOrigin::kGettingWebAppInfo, + .should_clear_waiting_for_first_browser_window = false}, + {.origin = ProfileKeepAliveOrigin::kCrxInstaller, + .should_clear_waiting_for_first_browser_window = false}, + {.origin = ProfileKeepAliveOrigin::kHistoryMenuBridge, + .should_clear_waiting_for_first_browser_window = false}, + {.origin = ProfileKeepAliveOrigin::kProfileCreationSamlFlow, + .should_clear_waiting_for_first_browser_window = false}, + {.origin = ProfileKeepAliveOrigin::kProfileDeletionProcess, + .should_clear_waiting_for_first_browser_window = false}, + {.origin = ProfileKeepAliveOrigin::kIsolatedWebAppInstall, + .should_clear_waiting_for_first_browser_window = false}, + {.origin = ProfileKeepAliveOrigin::kIsolatedWebAppUpdate, + .should_clear_waiting_for_first_browser_window = false}, + {.origin = ProfileKeepAliveOrigin::kWebAppUninstall, + .should_clear_waiting_for_first_browser_window = false}, + {.origin = ProfileKeepAliveOrigin::kOsIntegrationForceUnregistration, + .should_clear_waiting_for_first_browser_window = false}, + {.origin = ProfileKeepAliveOrigin::kRemoteDebugging, + .should_clear_waiting_for_first_browser_window = false}, + {.origin = ProfileKeepAliveOrigin::kHeadlessCommand, + .should_clear_waiting_for_first_browser_window = false}, +}; + +std::string ParamsToTestSuffix( + const ::testing::TestParamInfo<ProfileKeepAliveParam>& info) { + std::stringstream stream; + stream << info.param.origin; + return stream.str(); +} + +class ProfileManagerTestWithParam + : public ProfileManagerTest, + public testing::WithParamInterface<ProfileKeepAliveParam> { + public: + ProfileManagerTestWithParam() { + scoped_feature_list_.InitWithFeatures( + {features::kDestroySystemProfiles, + features::kDestroyProfileOnBrowserClose}, + {}); + } + + private: + base::test::ScopedFeatureList scoped_feature_list_; +}; + +TEST_P(ProfileManagerTestWithParam, ScopedProfileKeepAlive) { ProfileManager* profile_manager = g_browser_process->profile_manager(); base::FilePath dest_path = temp_dir_.GetPath().AppendASCII("New Profile"); @@ -2347,29 +2446,42 @@ ProfileKeepAliveOrigin::kWaitingForFirstBrowserWindow, 1))); { - // Set |profile| refcount to 1. This will cause the profile to get deleted - // at the end of this block. - ScopedProfileKeepAlive keep_alive(profile, - ProfileKeepAliveOrigin::kBrowserWindow); + // Set |profile| refcount to 1. If this added keep alive has an origin that + // should remove the `kWaitingForFirstBrowserWindow` keep alive, it will + // cause the profile to get deleted at the end of this block. + ScopedProfileKeepAlive keep_alive(profile, GetParam().origin); - // We added the first browser window. There should be no more - // kWaitingForFirstBrowserWindow ref. + // We added a keep alive that should be part of the list of keep alives. + // Whether `kWaitingForFirstBrowserWindow` ref is removed depends on + // `GetParam().should_clear_waiting_for_first_browser_window`. EXPECT_THAT( profile_manager->GetProfileInfoByPath(dest_path)->keep_alives, ::testing::UnorderedElementsAre( std::pair<ProfileKeepAliveOrigin, int>( - ProfileKeepAliveOrigin::kWaitingForFirstBrowserWindow, 0), - std::pair<ProfileKeepAliveOrigin, int>( - ProfileKeepAliveOrigin::kBrowserWindow, 1))); + ProfileKeepAliveOrigin::kWaitingForFirstBrowserWindow, + GetParam().should_clear_waiting_for_first_browser_window ? 0 + : 1), + std::pair<ProfileKeepAliveOrigin, int>(GetParam().origin, 1))); } base::RunLoop().RunUntilIdle(); + if (GetParam().should_clear_waiting_for_first_browser_window) { #if !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_CHROMEOS) - // Profile* should've been destroyed by now. - EXPECT_EQ(nullptr, profile_manager->GetProfileByPath(dest_path)); + // Profile* should've been destroyed by now. + EXPECT_EQ(nullptr, profile_manager->GetProfileByPath(dest_path)); #endif // !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_CHROMEOS) + } else { + // `profile` is still valid since `kWaitingForFirstBrowserWindow` was not + // cleared. + EXPECT_EQ(profile, profile_manager->GetProfileByPath(dest_path)); + } } +INSTANTIATE_TEST_SUITE_P(, + ProfileManagerTestWithParam, + testing::ValuesIn(params), + &ParamsToTestSuffix); + TEST_F(ProfileManagerTest, ProfileCountRecordedAtProfileInit) { using base::Bucket; using base::BucketsAre;
diff --git a/chrome/browser/resources/ash/settings/lazy_load.ts b/chrome/browser/resources/ash/settings/lazy_load.ts index 324253f..ed6a517 100644 --- a/chrome/browser/resources/ash/settings/lazy_load.ts +++ b/chrome/browser/resources/ash/settings/lazy_load.ts
@@ -49,9 +49,6 @@ import './os_a11y_page/cursor_and_touchpad_page.js'; import './os_a11y_page/display_and_magnification_subpage.js'; import './os_a11y_page/facegaze_subpage.js'; -import './os_a11y_page/facegaze_actions_add_dialog.js'; -import './os_a11y_page/facegaze_actions_card.js'; -import './os_a11y_page/facegaze_cursor_card.js'; import './os_a11y_page/keyboard_and_text_input_page.js'; import './os_a11y_page/live_caption_section.js'; import './os_a11y_page/live_translate_section.js';
diff --git a/chrome/browser/resources/ash/settings/os_a11y_page/facegaze_actions_card.ts b/chrome/browser/resources/ash/settings/os_a11y_page/facegaze_actions_card.ts index eae6891..3be998a 100644 --- a/chrome/browser/resources/ash/settings/os_a11y_page/facegaze_actions_card.ts +++ b/chrome/browser/resources/ash/settings/os_a11y_page/facegaze_actions_card.ts
@@ -8,11 +8,12 @@ * action settings. */ +import 'chrome://resources/cros_components/chip/chip.js'; import '../controls/settings_dropdown_menu.js'; import '../os_settings_page/settings_card.js'; import '../settings_shared.css.js'; import '../os_settings_page/os_settings_animated_pages.js'; -import 'chrome://resources/cros_components/chip/chip.js'; +import './facegaze_actions_add_dialog.js'; import './facegaze_icons.html.js'; import {PrefsMixin} from '/shared/settings/prefs/prefs_mixin.js';
diff --git a/chrome/browser/resources/chromeos/accessibility/BUILD.gn b/chrome/browser/resources/chromeos/accessibility/BUILD.gn index 1bf3c54..c657135 100644 --- a/chrome/browser/resources/chromeos/accessibility/BUILD.gn +++ b/chrome/browser/resources/chromeos/accessibility/BUILD.gn
@@ -32,7 +32,7 @@ "accessibility_common:build", "enhanced_network_tts:build", "select_to_speak:build", - "switch_access:build", + "switch_access/mv2:build", ] } } @@ -96,7 +96,7 @@ "common:browser_tests", "enhanced_network_tts:browser_tests", "select_to_speak:browser_tests", - "switch_access:browser_tests", + "switch_access/mv2:browser_tests", ] } }
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/BUILD.gn b/chrome/browser/resources/chromeos/accessibility/switch_access/mv2/BUILD.gn similarity index 87% rename from chrome/browser/resources/chromeos/accessibility/switch_access/BUILD.gn rename to chrome/browser/resources/chromeos/accessibility/switch_access/mv2/BUILD.gn index aea9778..63df3ec6c5 100644 --- a/chrome/browser/resources/chromeos/accessibility/switch_access/BUILD.gn +++ b/chrome/browser/resources/chromeos/accessibility/switch_access/mv2/BUILD.gn
@@ -69,7 +69,7 @@ composite = true - deps = [ "../common:ts_build" ] + deps = [ "../../common:ts_build" ] extra_deps = [ ":stage_ts_build" ] @@ -77,23 +77,23 @@ [ "/common/*|" + rebase_path("$common_tsc_dir/*", target_gen_dir) ] definitions = [ - "../definitions/accessibility_private_mv2.d.ts", - "../definitions/automation.d.ts", - "../definitions/clipboard_mv2.d.ts", - "../definitions/command_line_private.d.ts", - "../definitions/extension_types.d.ts", - "../definitions/extensions.d.ts", - "../definitions/runtime.d.ts", - "../definitions/settings_private_mv2.d.ts", - "../definitions/tabs.d.ts", - "../definitions/windows.d.ts", + "../../definitions/accessibility_private_mv2.d.ts", + "../../definitions/automation.d.ts", + "../../definitions/clipboard_mv2.d.ts", + "../../definitions/command_line_private.d.ts", + "../../definitions/extension_types.d.ts", + "../../definitions/extensions.d.ts", + "../../definitions/runtime.d.ts", + "../../definitions/settings_private_mv2.d.ts", + "../../definitions/tabs.d.ts", + "../../definitions/windows.d.ts", "//tools/typescript/definitions/chrome_event.d.ts", "//tools/typescript/definitions/metrics_private.d.ts", ] in_files = ts_modules - tsconfig_base = "../tsconfig.base.json" + tsconfig_base = "../../tsconfig.base.json" } # Instead of setting up one copy target for each subdirectory, use a script @@ -104,7 +104,7 @@ clear_dest_dirs = [ "." ] deps = [ ":ts_build", - "../common:copied_files", + "../../common:copied_files", ] sources = [ "background.html", @@ -169,10 +169,10 @@ } test_includes = [ - "../common/testing/accessibility_test_base.js", - "../common/testing/assert_additions.js", - "../common/testing/callback_helper.js", - "../common/testing/e2e_test_base.js", + "../../common/testing/accessibility_test_base.js", + "../../common/testing/assert_additions.js", + "../../common/testing/callback_helper.js", + "../../common/testing/e2e_test_base.js", "switch_access_e2e_test_base.js", "test_utility.js", ]
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/COMMON_METADATA b/chrome/browser/resources/chromeos/accessibility/switch_access/mv2/COMMON_METADATA similarity index 100% rename from chrome/browser/resources/chromeos/accessibility/switch_access/COMMON_METADATA rename to chrome/browser/resources/chromeos/accessibility/switch_access/mv2/COMMON_METADATA
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/DIR_METADATA b/chrome/browser/resources/chromeos/accessibility/switch_access/mv2/DIR_METADATA similarity index 68% rename from chrome/browser/resources/chromeos/accessibility/switch_access/DIR_METADATA rename to chrome/browser/resources/chromeos/accessibility/switch_access/mv2/DIR_METADATA index 998cb50..7e0cc2b 100644 --- a/chrome/browser/resources/chromeos/accessibility/switch_access/DIR_METADATA +++ b/chrome/browser/resources/chromeos/accessibility/switch_access/mv2/DIR_METADATA
@@ -1 +1 @@ -mixins: "//chrome/browser/resources/chromeos/accessibility/switch_access/COMMON_METADATA" +mixins: "//chrome/browser/resources/chromeos/accessibility/switch_access/mv2/COMMON_METADATA"
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/action_manager.ts b/chrome/browser/resources/chromeos/accessibility/switch_access/mv2/action_manager.ts similarity index 98% rename from chrome/browser/resources/chromeos/accessibility/switch_access/action_manager.ts rename to chrome/browser/resources/chromeos/accessibility/switch_access/mv2/action_manager.ts index aa2c7ab..53024c0 100644 --- a/chrome/browser/resources/chromeos/accessibility/switch_access/action_manager.ts +++ b/chrome/browser/resources/chromeos/accessibility/switch_access/mv2/action_manager.ts
@@ -24,7 +24,7 @@ * The node on which actions are currently being performed. * Null if the menu is closed. */ - private actionNode_?: SAChildNode | null; + private actionNode_?: SAChildNode|null; private menuManager_: MenuManager; private menuStack_: MenuType[] = []; @@ -236,7 +236,7 @@ return actions; } - private getLocationForCurrentMenuAndNode_(): Rect | undefined { + private getLocationForCurrentMenuAndNode_(): Rect|undefined { if (this.currentMenuType_ === MenuType.POINT_SCAN_MENU) { return { left: Math.floor(Navigator.byPoint.currentPoint.x),
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/auto_scan_manager.ts b/chrome/browser/resources/chromeos/accessibility/switch_access/mv2/auto_scan_manager.ts similarity index 100% rename from chrome/browser/resources/chromeos/accessibility/switch_access/auto_scan_manager.ts rename to chrome/browser/resources/chromeos/accessibility/switch_access/mv2/auto_scan_manager.ts
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/auto_scan_manager_test.js b/chrome/browser/resources/chromeos/accessibility/switch_access/mv2/auto_scan_manager_test.js similarity index 100% rename from chrome/browser/resources/chromeos/accessibility/switch_access/auto_scan_manager_test.js rename to chrome/browser/resources/chromeos/accessibility/switch_access/mv2/auto_scan_manager_test.js
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/background.html b/chrome/browser/resources/chromeos/accessibility/switch_access/mv2/background.html similarity index 100% rename from chrome/browser/resources/chromeos/accessibility/switch_access/background.html rename to chrome/browser/resources/chromeos/accessibility/switch_access/mv2/background.html
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/cache.ts b/chrome/browser/resources/chromeos/accessibility/switch_access/mv2/cache.ts similarity index 100% rename from chrome/browser/resources/chromeos/accessibility/switch_access/cache.ts rename to chrome/browser/resources/chromeos/accessibility/switch_access/mv2/cache.ts
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/commands.ts b/chrome/browser/resources/chromeos/accessibility/switch_access/mv2/commands.ts similarity index 100% rename from chrome/browser/resources/chromeos/accessibility/switch_access/commands.ts rename to chrome/browser/resources/chromeos/accessibility/switch_access/mv2/commands.ts
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/focus_ring_manager.ts b/chrome/browser/resources/chromeos/accessibility/switch_access/mv2/focus_ring_manager.ts similarity index 96% rename from chrome/browser/resources/chromeos/accessibility/switch_access/focus_ring_manager.ts rename to chrome/browser/resources/chromeos/accessibility/switch_access/mv2/focus_ring_manager.ts index 3a38a9c..5d62a6b 100644 --- a/chrome/browser/resources/chromeos/accessibility/switch_access/focus_ring_manager.ts +++ b/chrome/browser/resources/chromeos/accessibility/switch_access/mv2/focus_ring_manager.ts
@@ -14,14 +14,14 @@ import FocusType = chrome.accessibilityPrivate.FocusType; import ScreenRect = chrome.accessibilityPrivate.ScreenRect; -type Observer = (primary: SANode | null, preview: SANode | null) => void; +type Observer = (primary: SANode|null, preview: SANode|null) => void; /** Class to handle focus rings. */ export class FocusRingManager { private observer_?: Observer; /** A map of all the focus rings. */ private rings_: Record<RingId, FocusRingInfo>; - private ringNodesForTesting_: Record<RingId, SANode | null> = { + private ringNodesForTesting_: Record<RingId, SANode|null> = { [RingId.PRIMARY]: null, [RingId.PREVIEW]: null, }; @@ -149,8 +149,8 @@ * Sets the primary focus ring to |node|, and the preview focus ring to * |firstChild|. */ - private setFocusedNodeGroup_( - group: SAChildNode, firstChild: SAChildNode): void { + private setFocusedNodeGroup_(group: SAChildNode, firstChild: SAChildNode): + void { // Clear the dashed ring between transitions, as the animation is // distracting. this.rings_[RingId.PREVIEW].rects = []; @@ -220,8 +220,8 @@ } /** Saves the primary/preview focus for testing. */ - private updateNodesForTesting_( - primary: SANode | null, preview: SANode | null): void { + private updateNodesForTesting_(primary: SANode|null, preview: SANode|null): + void { // Keep track of the nodes associated with each focus ring for testing // purposes, since focus ring locations are not guaranteed to exactly match // node locations.
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/focus_ring_manager_test.js b/chrome/browser/resources/chromeos/accessibility/switch_access/mv2/focus_ring_manager_test.js similarity index 100% rename from chrome/browser/resources/chromeos/accessibility/switch_access/focus_ring_manager_test.js rename to chrome/browser/resources/chromeos/accessibility/switch_access/mv2/focus_ring_manager_test.js
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/history.ts b/chrome/browser/resources/chromeos/accessibility/switch_access/mv2/history.ts similarity index 96% rename from chrome/browser/resources/chromeos/accessibility/switch_access/history.ts rename to chrome/browser/resources/chromeos/accessibility/switch_access/mv2/history.ts index 97de013e..b06c88b4 100644 --- a/chrome/browser/resources/chromeos/accessibility/switch_access/history.ts +++ b/chrome/browser/resources/chromeos/accessibility/switch_access/mv2/history.ts
@@ -91,8 +91,8 @@ return true; } - containsDataMatchingPredicate( - predicate: (data: FocusData) => boolean): boolean { + containsDataMatchingPredicate(predicate: (data: FocusData) => boolean): + boolean { for (const data of this.dataStack) { if (predicate(data)) { return true; @@ -105,7 +105,7 @@ * Returns the most proximal restore data, but does not remove it from the * history. */ - peek(): FocusData | null { + peek(): FocusData|null { return this.dataStack[this.dataStack.length - 1] || null; }
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/icons/back.svg b/chrome/browser/resources/chromeos/accessibility/switch_access/mv2/icons/back.svg similarity index 100% rename from chrome/browser/resources/chromeos/accessibility/switch_access/icons/back.svg rename to chrome/browser/resources/chromeos/accessibility/switch_access/mv2/icons/back.svg
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/icons/copy.svg b/chrome/browser/resources/chromeos/accessibility/switch_access/mv2/icons/copy.svg similarity index 100% rename from chrome/browser/resources/chromeos/accessibility/switch_access/icons/copy.svg rename to chrome/browser/resources/chromeos/accessibility/switch_access/mv2/icons/copy.svg
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/icons/cut.svg b/chrome/browser/resources/chromeos/accessibility/switch_access/mv2/icons/cut.svg similarity index 100% rename from chrome/browser/resources/chromeos/accessibility/switch_access/icons/cut.svg rename to chrome/browser/resources/chromeos/accessibility/switch_access/mv2/icons/cut.svg
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/icons/decrement.svg b/chrome/browser/resources/chromeos/accessibility/switch_access/mv2/icons/decrement.svg similarity index 100% rename from chrome/browser/resources/chromeos/accessibility/switch_access/icons/decrement.svg rename to chrome/browser/resources/chromeos/accessibility/switch_access/mv2/icons/decrement.svg
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/icons/dictation.svg b/chrome/browser/resources/chromeos/accessibility/switch_access/mv2/icons/dictation.svg similarity index 100% rename from chrome/browser/resources/chromeos/accessibility/switch_access/icons/dictation.svg rename to chrome/browser/resources/chromeos/accessibility/switch_access/mv2/icons/dictation.svg
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/icons/increment.svg b/chrome/browser/resources/chromeos/accessibility/switch_access/mv2/icons/increment.svg similarity index 100% rename from chrome/browser/resources/chromeos/accessibility/switch_access/icons/increment.svg rename to chrome/browser/resources/chromeos/accessibility/switch_access/mv2/icons/increment.svg
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/icons/jumpToBeginningOfText.svg b/chrome/browser/resources/chromeos/accessibility/switch_access/mv2/icons/jumpToBeginningOfText.svg similarity index 100% rename from chrome/browser/resources/chromeos/accessibility/switch_access/icons/jumpToBeginningOfText.svg rename to chrome/browser/resources/chromeos/accessibility/switch_access/mv2/icons/jumpToBeginningOfText.svg
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/icons/jumpToEndOfText.svg b/chrome/browser/resources/chromeos/accessibility/switch_access/mv2/icons/jumpToEndOfText.svg similarity index 100% rename from chrome/browser/resources/chromeos/accessibility/switch_access/icons/jumpToEndOfText.svg rename to chrome/browser/resources/chromeos/accessibility/switch_access/mv2/icons/jumpToEndOfText.svg
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/icons/keyboard.svg b/chrome/browser/resources/chromeos/accessibility/switch_access/mv2/icons/keyboard.svg similarity index 100% rename from chrome/browser/resources/chromeos/accessibility/switch_access/icons/keyboard.svg rename to chrome/browser/resources/chromeos/accessibility/switch_access/mv2/icons/keyboard.svg
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/icons/moveBackwardOneCharOfText.svg b/chrome/browser/resources/chromeos/accessibility/switch_access/mv2/icons/moveBackwardOneCharOfText.svg similarity index 100% rename from chrome/browser/resources/chromeos/accessibility/switch_access/icons/moveBackwardOneCharOfText.svg rename to chrome/browser/resources/chromeos/accessibility/switch_access/mv2/icons/moveBackwardOneCharOfText.svg
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/icons/moveBackwardOneWordOfText.svg b/chrome/browser/resources/chromeos/accessibility/switch_access/mv2/icons/moveBackwardOneWordOfText.svg similarity index 100% rename from chrome/browser/resources/chromeos/accessibility/switch_access/icons/moveBackwardOneWordOfText.svg rename to chrome/browser/resources/chromeos/accessibility/switch_access/mv2/icons/moveBackwardOneWordOfText.svg
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/icons/moveCursor.svg b/chrome/browser/resources/chromeos/accessibility/switch_access/mv2/icons/moveCursor.svg similarity index 100% rename from chrome/browser/resources/chromeos/accessibility/switch_access/icons/moveCursor.svg rename to chrome/browser/resources/chromeos/accessibility/switch_access/mv2/icons/moveCursor.svg
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/icons/moveDownOneLineOfText.svg b/chrome/browser/resources/chromeos/accessibility/switch_access/mv2/icons/moveDownOneLineOfText.svg similarity index 100% rename from chrome/browser/resources/chromeos/accessibility/switch_access/icons/moveDownOneLineOfText.svg rename to chrome/browser/resources/chromeos/accessibility/switch_access/mv2/icons/moveDownOneLineOfText.svg
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/icons/moveForwardOneCharOfText.svg b/chrome/browser/resources/chromeos/accessibility/switch_access/mv2/icons/moveForwardOneCharOfText.svg similarity index 100% rename from chrome/browser/resources/chromeos/accessibility/switch_access/icons/moveForwardOneCharOfText.svg rename to chrome/browser/resources/chromeos/accessibility/switch_access/mv2/icons/moveForwardOneCharOfText.svg
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/icons/moveForwardOneWordOfText.svg b/chrome/browser/resources/chromeos/accessibility/switch_access/mv2/icons/moveForwardOneWordOfText.svg similarity index 100% rename from chrome/browser/resources/chromeos/accessibility/switch_access/icons/moveForwardOneWordOfText.svg rename to chrome/browser/resources/chromeos/accessibility/switch_access/mv2/icons/moveForwardOneWordOfText.svg
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/icons/moveUpOneLineOfText.svg b/chrome/browser/resources/chromeos/accessibility/switch_access/mv2/icons/moveUpOneLineOfText.svg similarity index 100% rename from chrome/browser/resources/chromeos/accessibility/switch_access/icons/moveUpOneLineOfText.svg rename to chrome/browser/resources/chromeos/accessibility/switch_access/mv2/icons/moveUpOneLineOfText.svg
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/icons/paste.svg b/chrome/browser/resources/chromeos/accessibility/switch_access/mv2/icons/paste.svg similarity index 100% rename from chrome/browser/resources/chromeos/accessibility/switch_access/icons/paste.svg rename to chrome/browser/resources/chromeos/accessibility/switch_access/mv2/icons/paste.svg
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/icons/scrollDownOrForward.svg b/chrome/browser/resources/chromeos/accessibility/switch_access/mv2/icons/scrollDownOrForward.svg similarity index 100% rename from chrome/browser/resources/chromeos/accessibility/switch_access/icons/scrollDownOrForward.svg rename to chrome/browser/resources/chromeos/accessibility/switch_access/mv2/icons/scrollDownOrForward.svg
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/icons/scrollLeft.svg b/chrome/browser/resources/chromeos/accessibility/switch_access/mv2/icons/scrollLeft.svg similarity index 100% rename from chrome/browser/resources/chromeos/accessibility/switch_access/icons/scrollLeft.svg rename to chrome/browser/resources/chromeos/accessibility/switch_access/mv2/icons/scrollLeft.svg
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/icons/scrollRight.svg b/chrome/browser/resources/chromeos/accessibility/switch_access/mv2/icons/scrollRight.svg similarity index 100% rename from chrome/browser/resources/chromeos/accessibility/switch_access/icons/scrollRight.svg rename to chrome/browser/resources/chromeos/accessibility/switch_access/mv2/icons/scrollRight.svg
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/icons/scrollUpOrBackward.svg b/chrome/browser/resources/chromeos/accessibility/switch_access/mv2/icons/scrollUpOrBackward.svg similarity index 100% rename from chrome/browser/resources/chromeos/accessibility/switch_access/icons/scrollUpOrBackward.svg rename to chrome/browser/resources/chromeos/accessibility/switch_access/mv2/icons/scrollUpOrBackward.svg
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/icons/select.svg b/chrome/browser/resources/chromeos/accessibility/switch_access/mv2/icons/select.svg similarity index 100% rename from chrome/browser/resources/chromeos/accessibility/switch_access/icons/select.svg rename to chrome/browser/resources/chromeos/accessibility/switch_access/mv2/icons/select.svg
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/icons/settings.svg b/chrome/browser/resources/chromeos/accessibility/switch_access/mv2/icons/settings.svg similarity index 100% rename from chrome/browser/resources/chromeos/accessibility/switch_access/icons/settings.svg rename to chrome/browser/resources/chromeos/accessibility/switch_access/mv2/icons/settings.svg
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/icons/showContextMenu.svg b/chrome/browser/resources/chromeos/accessibility/switch_access/mv2/icons/showContextMenu.svg similarity index 100% rename from chrome/browser/resources/chromeos/accessibility/switch_access/icons/showContextMenu.svg rename to chrome/browser/resources/chromeos/accessibility/switch_access/mv2/icons/showContextMenu.svg
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/icons/textSelectionEnd.svg b/chrome/browser/resources/chromeos/accessibility/switch_access/mv2/icons/textSelectionEnd.svg similarity index 100% rename from chrome/browser/resources/chromeos/accessibility/switch_access/icons/textSelectionEnd.svg rename to chrome/browser/resources/chromeos/accessibility/switch_access/mv2/icons/textSelectionEnd.svg
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/icons/textSelectionStart.svg b/chrome/browser/resources/chromeos/accessibility/switch_access/mv2/icons/textSelectionStart.svg similarity index 100% rename from chrome/browser/resources/chromeos/accessibility/switch_access/icons/textSelectionStart.svg rename to chrome/browser/resources/chromeos/accessibility/switch_access/mv2/icons/textSelectionStart.svg
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/item_scan_manager.ts b/chrome/browser/resources/chromeos/accessibility/switch_access/mv2/item_scan_manager.ts similarity index 96% rename from chrome/browser/resources/chromeos/accessibility/switch_access/item_scan_manager.ts rename to chrome/browser/resources/chromeos/accessibility/switch_access/mv2/item_scan_manager.ts index 5cf1132..021d056 100644 --- a/chrome/browser/resources/chromeos/accessibility/switch_access/item_scan_manager.ts +++ b/chrome/browser/resources/chromeos/accessibility/switch_access/mv2/item_scan_manager.ts
@@ -2,6 +2,10 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import './nodes/editable_text_node.js'; +import './nodes/slider_node.js'; +import './nodes/tab_node.js'; + import {AsyncUtil} from '/common/async_util.js'; import {AutomationUtil} from '/common/automation_util.js'; import {EventHandler} from '/common/event_handler.js'; @@ -20,12 +24,9 @@ import {BackButtonNode} from './nodes/back_button_node.js'; import {BasicNode, BasicRootNode} from './nodes/basic_node.js'; import {DesktopNode} from './nodes/desktop_node.js'; -import './nodes/editable_text_node.js'; import {KeyboardRootNode} from './nodes/keyboard_node.js'; import {ModalDialogRootNode} from './nodes/modal_dialog_node.js'; -import './nodes/slider_node.js'; import {SAChildNode, SANode, SARootNode} from './nodes/switch_access_node.js'; -import './nodes/tab_node.js'; import {SwitchAccess} from './switch_access.js'; import {Mode} from './switch_access_constants.js'; import {SwitchAccessPredicate} from './switch_access_predicate.js'; @@ -44,7 +45,7 @@ private group_: SARootNode; private node_: SAChildNode; private history_: FocusHistory; - private suspendedGroup_: FocusData | null = null; + private suspendedGroup_: FocusData|null = null; private ignoreFocusInKeyboard_ = false; constructor(desktop: AutomationNode) { @@ -91,7 +92,7 @@ this.exitGroup_(); } - override exitIfInGroup(node: SANode | AutomationNode | null): void { + override exitIfInGroup(node: SANode|AutomationNode|null): void { if (this.group_.isEquivalentTo(node)) { this.exitGroup_(); } @@ -99,8 +100,8 @@ override async exitKeyboard(): Promise<void> { this.ignoreFocusInKeyboard_ = false; - const isKeyboard = - (data: FocusData): boolean => data.group instanceof KeyboardRootNode; + const isKeyboard = (data: FocusData): boolean => + data.group instanceof KeyboardRootNode; // If we are not in the keyboard, do nothing. if (!(this.group_ instanceof KeyboardRootNode) && !this.history_.containsDataMatchingPredicate(isKeyboard)) { @@ -170,8 +171,7 @@ } override async tryMoving( - node: SAChildNode, - getNext: (node: SAChildNode) => SAChildNode, + node: SAChildNode, getNext: (node: SAChildNode) => SAChildNode, startingNode: SAChildNode): Promise<void> { if (node === startingNode) { // This should only happen if the desktop contains exactly one interesting @@ -345,8 +345,7 @@ if (treeChange.type === TreeChangeType.NODE_REMOVED) { this.group_.refresh(); this.moveToValidNode(); - } else if ( - treeChange.type === TreeChangeType.SUBTREE_UPDATE_END) { + } else if (treeChange.type === TreeChangeType.SUBTREE_UPDATE_END) { this.group_.refresh(); } } @@ -442,7 +441,7 @@ // |data.group| updates when retrieving the history record. So |data.focus| // should not be used as the preferred focus node. Instead, we should find // the equivalent node in the group's children. - let focusTarget: SAChildNode | null = null; + let focusTarget: SAChildNode|null = null; for (const child of data.group.children) { if (child.isEquivalentTo(data.focus)) { focusTarget = child; @@ -494,9 +493,10 @@ // The current focus and new node do not have one another in their // ancestry; try to focus an ancestor window of the new node. In // particular, the parenting aura::Window of the views::Widget. - let widget: AutomationNode | undefined = newAutomationNode; - while (widget && (widget.role !== RoleType.WINDOW || - widget.className !== 'Widget')) { + let widget: AutomationNode|undefined = newAutomationNode; + while ( + widget && + (widget.role !== RoleType.WINDOW || widget.className !== 'Widget')) { widget = widget.parent; }
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/item_scan_manager_test.js b/chrome/browser/resources/chromeos/accessibility/switch_access/mv2/item_scan_manager_test.js similarity index 99% rename from chrome/browser/resources/chromeos/accessibility/switch_access/item_scan_manager_test.js rename to chrome/browser/resources/chromeos/accessibility/switch_access/mv2/item_scan_manager_test.js index 70a2804..a549a20 100644 --- a/chrome/browser/resources/chromeos/accessibility/switch_access/item_scan_manager_test.js +++ b/chrome/browser/resources/chromeos/accessibility/switch_access/mv2/item_scan_manager_test.js
@@ -327,7 +327,7 @@ // TODO(crbug.com/336827654): Investigate failures. AX_TEST_F( - 'SwitchAccessItemScanManagerTest', 'DISABLED_ScanAndTypeVirtualKeyboard', + 'SwitchAccessItemScanManagerTest', 'DISABLED_ScanAndTypeVirtualKeyboard', async function() { const website = `<input type="text" id="testinput"></input>`; const rootWebArea = await this.runWithLoadedTree(website);
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/menu_manager.ts b/chrome/browser/resources/chromeos/accessibility/switch_access/mv2/menu_manager.ts similarity index 90% rename from chrome/browser/resources/chromeos/accessibility/switch_access/menu_manager.ts rename to chrome/browser/resources/chromeos/accessibility/switch_access/mv2/menu_manager.ts index bd41bd5..052f0f7 100644 --- a/chrome/browser/resources/chromeos/accessibility/switch_access/menu_manager.ts +++ b/chrome/browser/resources/chromeos/accessibility/switch_access/mv2/menu_manager.ts
@@ -19,10 +19,10 @@ import SwitchAccessBubble = chrome.accessibilityPrivate.SwitchAccessBubble; interface EventHandlerOptions { - capture: boolean | undefined; - exactMatch: boolean | undefined; - listenOnce: boolean | undefined; - predicate: ((arg: any) => boolean) | undefined; + capture: boolean|undefined; + exactMatch: boolean|undefined; + listenOnce: boolean|undefined; + predicate: ((arg: any) => boolean)|undefined; } /** @@ -31,10 +31,10 @@ * displayed. */ export class MenuManager { - private displayedActions_: MenuAction[] | null = null; + private displayedActions_: MenuAction[]|null = null; private displayedLocation_?: ScreenRect; private isMenuOpen_ = false; - private menuAutomationNode_?: AutomationNode | null; + private menuAutomationNode_?: AutomationNode|null; private clickHandler_: EventHandler; static instance?: MenuManager; @@ -60,7 +60,7 @@ return Boolean(MenuManager.instance) && MenuManager.instance!.isMenuOpen_; } - static get menuAutomationNode(): AutomationNode | null | undefined { + static get menuAutomationNode(): AutomationNode|null|undefined { if (MenuManager.instance) { return MenuManager.instance.menuAutomationNode_; } @@ -82,7 +82,7 @@ } if (ArrayUtil.contentsAreEqual( - actions, this.displayedActions_ ?? undefined)) { + actions, this.displayedActions_ ?? undefined)) { return; } this.displayMenuWithActions_(actions); @@ -104,7 +104,7 @@ // ================= Private Methods ================== - private asAction_(actionString: string | undefined): MenuAction | null { + private asAction_(actionString: string|undefined): MenuAction|null { if (Object.values(MenuAction).includes(actionString as MenuAction)) { return actionString as MenuAction; } @@ -145,8 +145,8 @@ private hasMenuNode_(): boolean { // TODO(b/314203187): Not null asserted, check that this is correct. - return Boolean(this.menuAutomationNode_ && - this.menuAutomationNode_.role && + return Boolean( + this.menuAutomationNode_ && this.menuAutomationNode_.role && !this.menuAutomationNode_.state![StateType.OFFSCREEN]); }
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/metrics.ts b/chrome/browser/resources/chromeos/accessibility/switch_access/mv2/metrics.ts similarity index 100% rename from chrome/browser/resources/chromeos/accessibility/switch_access/metrics.ts rename to chrome/browser/resources/chromeos/accessibility/switch_access/mv2/metrics.ts
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/navigator.ts b/chrome/browser/resources/chromeos/accessibility/switch_access/mv2/navigator.ts similarity index 100% rename from chrome/browser/resources/chromeos/accessibility/switch_access/navigator.ts rename to chrome/browser/resources/chromeos/accessibility/switch_access/mv2/navigator.ts
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/navigator_interfaces.ts b/chrome/browser/resources/chromeos/accessibility/switch_access/mv2/navigator_interfaces.ts similarity index 99% rename from chrome/browser/resources/chromeos/accessibility/switch_access/navigator_interfaces.ts rename to chrome/browser/resources/chromeos/accessibility/switch_access/mv2/navigator_interfaces.ts index 87f7f599..1784037 100644 --- a/chrome/browser/resources/chromeos/accessibility/switch_access/navigator_interfaces.ts +++ b/chrome/browser/resources/chromeos/accessibility/switch_access/mv2/navigator_interfaces.ts
@@ -90,7 +90,7 @@ * Called when everything has been initialized to add the listeners and find * the initial focus. */ - abstract start(): void; + abstract start(): void; // =============== Getter Methods ==============
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/nodes/back_button_node.ts b/chrome/browser/resources/chromeos/accessibility/switch_access/mv2/nodes/back_button_node.ts similarity index 92% rename from chrome/browser/resources/chromeos/accessibility/switch_access/nodes/back_button_node.ts rename to chrome/browser/resources/chromeos/accessibility/switch_access/mv2/nodes/back_button_node.ts index e36e94d..e6af383 100644 --- a/chrome/browser/resources/chromeos/accessibility/switch_access/nodes/back_button_node.ts +++ b/chrome/browser/resources/chromeos/accessibility/switch_access/mv2/nodes/back_button_node.ts
@@ -52,7 +52,7 @@ return this.group_; } - override get location(): Rect | undefined { + override get location(): Rect|undefined { if (BackButtonNode.locationForTesting) { return BackButtonNode.locationForTesting; } @@ -68,7 +68,7 @@ // ================= General methods ================= - override asRootNode(): SARootNode | undefined { + override asRootNode(): SARootNode|undefined { return undefined; } @@ -76,9 +76,8 @@ return other instanceof BackButtonNode; } - override isEquivalentTo( - node: SAChildNode | SARootNode | AutomationNode | null | undefined) - : boolean { + override isEquivalentTo(node: SAChildNode|SARootNode|AutomationNode|null| + undefined): boolean { return node instanceof BackButtonNode || this.automationNode === node; } @@ -129,8 +128,8 @@ // ================= Debug methods ================= - override debugString( - wholeTree: boolean, prefix = '', currentNode = null): string { + override debugString(wholeTree: boolean, prefix = '', currentNode = null): + string { if (!this.automationNode) { return 'BackButtonNode'; } @@ -172,8 +171,7 @@ BackButtonNode.clickHandler_.setNodes(automationNode); } else { BackButtonNode.clickHandler_ = new EventHandler( - automationNode, EventType.CLICKED, - BackButtonNode.onClick_); + automationNode, EventType.CLICKED, BackButtonNode.onClick_); } } }
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/nodes/basic_node.ts b/chrome/browser/resources/chromeos/accessibility/switch_access/mv2/nodes/basic_node.ts similarity index 90% rename from chrome/browser/resources/chromeos/accessibility/switch_access/nodes/basic_node.ts rename to chrome/browser/resources/chromeos/accessibility/switch_access/mv2/nodes/basic_node.ts index 1eda3c89..c3d6d4e 100644 --- a/chrome/browser/resources/chromeos/accessibility/switch_access/nodes/basic_node.ts +++ b/chrome/browser/resources/chromeos/accessibility/switch_access/mv2/nodes/basic_node.ts
@@ -27,7 +27,7 @@ interface Creator { predicate: AutomationPredicate.Unary; - creator: (node: AutomationNode, parent: SARootNode | null) => BasicNode; + creator: (node: AutomationNode, parent: SARootNode|null) => BasicNode; } interface RootBuilder { @@ -41,12 +41,12 @@ */ export class BasicNode extends SAChildNode { private baseNode_: AutomationNode; - private parent_: SARootNode | null; + private parent_: SARootNode|null; private locationChangedHandler_?: RepeatedEventHandler; private isActionable_: boolean; private static creators_: Creator[] = []; - protected constructor(baseNode: AutomationNode, parent: SARootNode | null) { + protected constructor(baseNode: AutomationNode, parent: SARootNode|null) { super(); this.baseNode_ = baseNode; this.parent_ = parent; @@ -83,8 +83,8 @@ } // Coerce enums to string arrays for comparison. const menuActions: string[] = Object.values(MenuAction); - const standardActions: string[] = this.baseNode_.standardActions! - .filter((action: string) => menuActions.includes(action)); + const standardActions: string[] = this.baseNode_.standardActions!.filter( + (action: string) => menuActions.includes(action)); return actions.concat(standardActions as MenuAction[]); } @@ -92,7 +92,7 @@ return this.baseNode_; } - override get location(): Rect | undefined { + override get location(): Rect|undefined { return this.baseNode_.location; } @@ -103,14 +103,14 @@ // ================= General methods ================= - override asRootNode(): SARootNode | undefined { + override asRootNode(): SARootNode|undefined { if (!this.isGroup()) { return undefined; } return BasicRootNode.buildTree(this.baseNode_); } - override equals(rhs: SAChildNode | null | undefined): boolean { + override equals(rhs: SAChildNode|null|undefined): boolean { if (!rhs || !(rhs instanceof BasicNode)) { return false; } @@ -119,8 +119,8 @@ return other.baseNode_ === this.baseNode_; } - override isEquivalentTo( - node: AutomationNode | SAChildNode | SARootNode | null): boolean { + override isEquivalentTo(node: AutomationNode|SAChildNode|SARootNode| + null): boolean { if (node instanceof BasicNode) { return this.baseNode_ === node.baseNode_; } @@ -227,11 +227,9 @@ // ================= Static methods ================= - static create( - baseNode: AutomationNode, parent: SARootNode | null): BasicNode { - const item = - BasicNode.creators.find( - (creator: Creator) => creator.predicate(baseNode)); + static create(baseNode: AutomationNode, parent: SARootNode|null): BasicNode { + const item = BasicNode.creators.find( + (creator: Creator) => creator.predicate(baseNode)); if (item) { return item.creator(baseNode, parent); } @@ -269,15 +267,15 @@ // ================= General methods ================= - override equals(other: SARootNode | null | undefined): boolean { + override equals(other: SARootNode|null|undefined): boolean { if (!(other instanceof BasicRootNode)) { return false; } return super.equals(other) && this.automationNode === other.automationNode; } - override isEquivalentTo( - node: AutomationNode | SAChildNode | SARootNode | null): boolean { + override isEquivalentTo(node: AutomationNode|SAChildNode|SARootNode| + null): boolean { if (node instanceof BasicRootNode || node instanceof BasicNode) { return this.automationNode === node.automationNode; } @@ -301,8 +299,7 @@ override onFocus(): void { super.onFocus(); this.childrenChangedHandler_ = new RepeatedEventHandler( - this.automationNode, EventType.CHILDREN_CHANGED, - event => { + this.automationNode, EventType.CHILDREN_CHANGED, event => { const cache = new SACache(); if (SwitchAccessPredicate.isInterestingSubtree(event.target, cache)) { this.refresh(); @@ -318,8 +315,8 @@ } override refreshChildren(): void { - const childConstructor = - (node: AutomationNode): BasicNode => BasicNode.create(node, this); + const childConstructor = (node: AutomationNode): BasicNode => + BasicNode.create(node, this); try { BasicRootNode.findAndSetChildren(this, childConstructor); } catch (e) { @@ -329,7 +326,7 @@ override refresh(): void { // Find the currently focused child. - let focusedChild: SAChildNode | null = null; + let focusedChild: SAChildNode|null = null; for (const child of this.children) { if (child.isFocused()) { focusedChild = child; @@ -369,8 +366,8 @@ } const root = new BasicRootNode(rootNode); - const childConstructor = - (node: AutomationNode): BasicNode => BasicNode.create(node, root); + const childConstructor = (node: AutomationNode): BasicNode => + BasicNode.create(node, root); BasicRootNode.findAndSetChildren(root, childConstructor); return root; @@ -398,8 +395,8 @@ root.children = children; } - static getInterestingChildren( - root: BasicRootNode | AutomationNode): AutomationNode[] { + static getInterestingChildren(root: BasicRootNode| + AutomationNode): AutomationNode[] { if (root instanceof BasicRootNode) { root = root.automationNode; }
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/nodes/basic_node_test.js b/chrome/browser/resources/chromeos/accessibility/switch_access/mv2/nodes/basic_node_test.js similarity index 100% rename from chrome/browser/resources/chromeos/accessibility/switch_access/nodes/basic_node_test.js rename to chrome/browser/resources/chromeos/accessibility/switch_access/mv2/nodes/basic_node_test.js
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/nodes/combo_box_node.ts b/chrome/browser/resources/chromeos/accessibility/switch_access/mv2/nodes/combo_box_node.ts similarity index 90% rename from chrome/browser/resources/chromeos/accessibility/switch_access/nodes/combo_box_node.ts rename to chrome/browser/resources/chromeos/accessibility/switch_access/mv2/nodes/combo_box_node.ts index 799d33f..55463d0 100644 --- a/chrome/browser/resources/chromeos/accessibility/switch_access/nodes/combo_box_node.ts +++ b/chrome/browser/resources/chromeos/accessibility/switch_access/mv2/nodes/combo_box_node.ts
@@ -22,9 +22,9 @@ * TODO(anastasi): Add a test for this class. */ class ComboBoxNode extends BasicNode { - private expandedChangedHandler_?: RepeatedEventHandler | null; + private expandedChangedHandler_?: RepeatedEventHandler|null; - constructor(baseNode: AutomationNode, parent: SARootNode | null) { + constructor(baseNode: AutomationNode, parent: SARootNode|null) { super(baseNode, parent); } @@ -41,8 +41,8 @@ super.onFocus(); this.expandedChangedHandler_ = new RepeatedEventHandler( - this.automationNode, EventType.EXPANDED, - () => this.onExpandedChanged(), {exactMatch: true}); + this.automationNode, EventType.EXPANDED, () => this.onExpandedChanged(), + {exactMatch: true}); } override onUnfocus(): void {
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/nodes/desktop_node.ts b/chrome/browser/resources/chromeos/accessibility/switch_access/mv2/nodes/desktop_node.ts similarity index 98% rename from chrome/browser/resources/chromeos/accessibility/switch_access/nodes/desktop_node.ts rename to chrome/browser/resources/chromeos/accessibility/switch_access/mv2/nodes/desktop_node.ts index ff8d74a4..1e1f0dc 100644 --- a/chrome/browser/resources/chromeos/accessibility/switch_access/nodes/desktop_node.ts +++ b/chrome/browser/resources/chromeos/accessibility/switch_access/mv2/nodes/desktop_node.ts
@@ -31,7 +31,7 @@ override refresh(): void { // Find the currently focused child. - let focusedChild: SAChildNode | null = null; + let focusedChild: SAChildNode|null = null; for (const child of this.children) { if (child.isFocused()) { focusedChild = child;
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/nodes/desktop_node_test.js b/chrome/browser/resources/chromeos/accessibility/switch_access/mv2/nodes/desktop_node_test.js similarity index 100% rename from chrome/browser/resources/chromeos/accessibility/switch_access/nodes/desktop_node_test.js rename to chrome/browser/resources/chromeos/accessibility/switch_access/mv2/nodes/desktop_node_test.js
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/nodes/editable_text_node.ts b/chrome/browser/resources/chromeos/accessibility/switch_access/mv2/nodes/editable_text_node.ts similarity index 100% rename from chrome/browser/resources/chromeos/accessibility/switch_access/nodes/editable_text_node.ts rename to chrome/browser/resources/chromeos/accessibility/switch_access/mv2/nodes/editable_text_node.ts
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/nodes/group_node.ts b/chrome/browser/resources/chromeos/accessibility/switch_access/mv2/nodes/group_node.ts similarity index 97% rename from chrome/browser/resources/chromeos/accessibility/switch_access/nodes/group_node.ts rename to chrome/browser/resources/chromeos/accessibility/switch_access/mv2/nodes/group_node.ts index 34c658f..ca9e9d9 100644 --- a/chrome/browser/resources/chromeos/accessibility/switch_access/nodes/group_node.ts +++ b/chrome/browser/resources/chromeos/accessibility/switch_access/mv2/nodes/group_node.ts
@@ -86,8 +86,8 @@ return true; } - override isEquivalentTo(node: AutomationNode | SAChildNode | SARootNode): - boolean { + override isEquivalentTo(node: AutomationNode|SAChildNode| + SARootNode): boolean { if (node instanceof GroupNode) { return this.equals(node); }
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/nodes/group_node_test.js b/chrome/browser/resources/chromeos/accessibility/switch_access/mv2/nodes/group_node_test.js similarity index 100% rename from chrome/browser/resources/chromeos/accessibility/switch_access/nodes/group_node_test.js rename to chrome/browser/resources/chromeos/accessibility/switch_access/mv2/nodes/group_node_test.js
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/nodes/keyboard_node.ts b/chrome/browser/resources/chromeos/accessibility/switch_access/mv2/nodes/keyboard_node.ts similarity index 96% rename from chrome/browser/resources/chromeos/accessibility/switch_access/nodes/keyboard_node.ts rename to chrome/browser/resources/chromeos/accessibility/switch_access/mv2/nodes/keyboard_node.ts index 4ffb3d48..4d213ce 100644 --- a/chrome/browser/resources/chromeos/accessibility/switch_access/nodes/keyboard_node.ts +++ b/chrome/browser/resources/chromeos/accessibility/switch_access/mv2/nodes/keyboard_node.ts
@@ -43,7 +43,7 @@ // ================= General methods ================= - override asRootNode(): SARootNode | undefined { + override asRootNode(): SARootNode|undefined { return undefined; } @@ -204,8 +204,8 @@ /** Helper function to connect tree elements, given the root node. */ private static findAndSetChildren_(root: KeyboardRootNode): void { - const childConstructor = - (node: AutomationNode): KeyboardNode => new KeyboardNode(node, root); + const childConstructor = (node: AutomationNode): KeyboardNode => + new KeyboardNode(node, root); const interestingChildren = root.automationNode.findAll({role: RoleType.BUTTON}); const children: SAChildNode[] = GroupNode.separateByRow( @@ -217,8 +217,8 @@ private static getKeyboardObject(): AutomationNode { if (!this.object_ || !this.object_.role) { - this.object_ = Navigator.byItem.desktopNode.find( - {role: RoleType.KEYBOARD}); + this.object_ = + Navigator.byItem.desktopNode.find({role: RoleType.KEYBOARD}); } return this.object_; }
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/nodes/modal_dialog_node.ts b/chrome/browser/resources/chromeos/accessibility/switch_access/mv2/nodes/modal_dialog_node.ts similarity index 100% rename from chrome/browser/resources/chromeos/accessibility/switch_access/nodes/modal_dialog_node.ts rename to chrome/browser/resources/chromeos/accessibility/switch_access/mv2/nodes/modal_dialog_node.ts
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/nodes/slider_node.ts b/chrome/browser/resources/chromeos/accessibility/switch_access/mv2/nodes/slider_node.ts similarity index 100% rename from chrome/browser/resources/chromeos/accessibility/switch_access/nodes/slider_node.ts rename to chrome/browser/resources/chromeos/accessibility/switch_access/mv2/nodes/slider_node.ts
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/nodes/switch_access_node.ts b/chrome/browser/resources/chromeos/accessibility/switch_access/mv2/nodes/switch_access_node.ts similarity index 93% rename from chrome/browser/resources/chromeos/accessibility/switch_access/nodes/switch_access_node.ts rename to chrome/browser/resources/chromeos/accessibility/switch_access/mv2/nodes/switch_access_node.ts index 69db3a6..da86dd7 100644 --- a/chrome/browser/resources/chromeos/accessibility/switch_access/nodes/switch_access_node.ts +++ b/chrome/browser/resources/chromeos/accessibility/switch_access/mv2/nodes/switch_access_node.ts
@@ -25,8 +25,8 @@ */ export abstract class SAChildNode { private isFocused_ = false; - private next_: SAChildNode | null = null; - private previous_: SAChildNode | null = null; + private next_: SAChildNode|null = null; + private previous_: SAChildNode|null = null; private valid_ = true; // Abstract methods. @@ -34,23 +34,23 @@ /** Returns a list of all the actions available for this node. */ abstract get actions(): MenuAction[]; /** If this node is a group, returns the analogous SARootNode. */ - abstract asRootNode(): SARootNode | undefined; + abstract asRootNode(): SARootNode|undefined; /** The automation node that most closely contains this node. */ abstract get automationNode(): AutomationNode; - abstract equals(other: SAChildNode | null | undefined): boolean; - abstract isEquivalentTo( - node: AutomationNode | SAChildNode | SARootNode | null): boolean; + abstract equals(other: SAChildNode|null|undefined): boolean; + abstract isEquivalentTo(node: AutomationNode|SAChildNode|SARootNode| + null): boolean; /** Returns whether this node should be displayed as a group. */ abstract isGroup(): boolean; - abstract get location(): ScreenRect | undefined; + abstract get location(): ScreenRect|undefined; /** Performs the specified action on the node, if it is available. */ abstract performAction(action: MenuAction): ActionResponse; - abstract get role(): RoleType | undefined; + abstract get role(): RoleType|undefined; // ================= Getters and setters ================= - get group(): SARootNode | null { + get group(): SARootNode|null { return null; } @@ -60,7 +60,7 @@ /** Returns the next node in pre-order traversal. */ get next(): SAChildNode { - let next: SAChildNode | null = this; + let next: SAChildNode|null = this; while (true) { // TODO(b/314203187): Not null asserted, check that this is correct. next = next!.next_; @@ -84,7 +84,7 @@ /** Returns the previous node in pre-order traversal. */ get previous(): SAChildNode { - let previous: SAChildNode | null = this; + let previous: SAChildNode|null = this; while (true) { // TODO(b/314203187): Not null asserted, check that this is correct. previous = previous!.previous_; @@ -152,7 +152,7 @@ /** String-ifies the node (for debugging purposes). */ debugString( wholeTree: boolean, prefix: string = '', - currentNode: SAChildNode | null = null): string { + currentNode: SAChildNode|null = null): string { if (this.isGroup() && wholeTree) { // TODO(b/314203187): Not null asserted, check that this is correct. return this.asRootNode()!.debugString( @@ -278,8 +278,7 @@ * Looks for and returns the specified node within this node's children. * If no equivalent node is found, returns null. */ - findChild( - node: AutomationNode | SAChildNode | SARootNode): SAChildNode | null { + findChild(node: AutomationNode|SAChildNode|SARootNode): SAChildNode|null { for (const child of this.children_) { if (child.isEquivalentTo(node)) { return child; @@ -308,7 +307,7 @@ .length >= 1; } - firstValidChild(): SAChildNode | null { + firstValidChild(): SAChildNode|null { const children = this.children_.filter(child => child.isValidAndVisible()); return children.length > 0 ? children[0] : null; } @@ -340,7 +339,7 @@ */ debugString( wholeTree: boolean = false, prefix: string = '', - currentNode: SAChildNode | null = null): string { + currentNode: SAChildNode|null = null): string { let str = 'Root: ' + this.constructor.name + ' ' + this.automationNode.role + ' '; if (this.automationNode.name) {
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/nodes/tab_node.ts b/chrome/browser/resources/chromeos/accessibility/switch_access/mv2/nodes/tab_node.ts similarity index 100% rename from chrome/browser/resources/chromeos/accessibility/switch_access/nodes/tab_node.ts rename to chrome/browser/resources/chromeos/accessibility/switch_access/mv2/nodes/tab_node.ts
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/nodes/tab_node_test.js b/chrome/browser/resources/chromeos/accessibility/switch_access/mv2/nodes/tab_node_test.js similarity index 97% rename from chrome/browser/resources/chromeos/accessibility/switch_access/nodes/tab_node_test.js rename to chrome/browser/resources/chromeos/accessibility/switch_access/mv2/nodes/tab_node_test.js index 7d9d225c..132dbd7 100644 --- a/chrome/browser/resources/chromeos/accessibility/switch_access/nodes/tab_node_test.js +++ b/chrome/browser/resources/chromeos/accessibility/switch_access/mv2/nodes/tab_node_test.js
@@ -39,7 +39,8 @@ chrome.automation.RoleType.TAB, tab.role, 'Tab node is not a tab'); assertTrue(tab.isGroup(), 'Tab node should be a group'); assertEquals( - 1, tab.actions.length, 'Tab as a group should have 1 action (drill down)'); + 1, tab.actions.length, + 'Tab as a group should have 1 action (drill down)'); assertEquals( MenuAction.DRILL_DOWN, tab.actions[0], 'Tab as a group should have the action DRILL_DOWN');
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/nodes/window_node.ts b/chrome/browser/resources/chromeos/accessibility/switch_access/mv2/nodes/window_node.ts similarity index 92% rename from chrome/browser/resources/chromeos/accessibility/switch_access/nodes/window_node.ts rename to chrome/browser/resources/chromeos/accessibility/switch_access/mv2/nodes/window_node.ts index 87644df0..f2ed65a 100644 --- a/chrome/browser/resources/chromeos/accessibility/switch_access/nodes/window_node.ts +++ b/chrome/browser/resources/chromeos/accessibility/switch_access/mv2/nodes/window_node.ts
@@ -26,8 +26,8 @@ /** Creates the tree structure for a window node. */ static override buildTree(windowNode: AutomationNode): WindowRootNode { const root = new WindowRootNode(windowNode); - const childConstructor = - (node: AutomationNode): BasicNode => BasicNode.create(node, root); + const childConstructor = (node: AutomationNode): BasicNode => + BasicNode.create(node, root); BasicRootNode.findAndSetChildren(root, childConstructor); return root;
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/point_scan_manager.ts b/chrome/browser/resources/chromeos/accessibility/switch_access/mv2/point_scan_manager.ts similarity index 100% rename from chrome/browser/resources/chromeos/accessibility/switch_access/point_scan_manager.ts rename to chrome/browser/resources/chromeos/accessibility/switch_access/mv2/point_scan_manager.ts
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/point_scan_manager_test.js b/chrome/browser/resources/chromeos/accessibility/switch_access/mv2/point_scan_manager_test.js similarity index 100% rename from chrome/browser/resources/chromeos/accessibility/switch_access/point_scan_manager_test.js rename to chrome/browser/resources/chromeos/accessibility/switch_access/mv2/point_scan_manager_test.js
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/settings_manager.ts b/chrome/browser/resources/chromeos/accessibility/switch_access/mv2/settings_manager.ts similarity index 88% rename from chrome/browser/resources/chromeos/accessibility/switch_access/settings_manager.ts rename to chrome/browser/resources/chromeos/accessibility/switch_access/mv2/settings_manager.ts index 1dcb406..67b7c6d 100644 --- a/chrome/browser/resources/chromeos/accessibility/switch_access/settings_manager.ts +++ b/chrome/browser/resources/chromeos/accessibility/switch_access/mv2/settings_manager.ts
@@ -14,16 +14,16 @@ await Settings.init(Object.values(Preference)); Settings.addListener( Preference.AUTO_SCAN_ENABLED, - (value: boolean|number) => AutoScanManager.setEnabled( - value as boolean)); + (value: boolean|number) => + AutoScanManager.setEnabled(value as boolean)); Settings.addListener( Preference.AUTO_SCAN_TIME, - (value: boolean|number) => AutoScanManager.setPrimaryScanTime( - value as number)); + (value: boolean|number) => + AutoScanManager.setPrimaryScanTime(value as number)); Settings.addListener( Preference.AUTO_SCAN_KEYBOARD_TIME, - (value: boolean|number) => AutoScanManager.setKeyboardScanTime( - value as number)); + (value: boolean|number) => + AutoScanManager.setKeyboardScanTime(value as number)); if (!SettingsManager.settingsAreConfigured_()) { chrome.accessibilityPrivate.openSettingsSubpage(
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/switch_access.ts b/chrome/browser/resources/chromeos/accessibility/switch_access/mv2/switch_access.ts similarity index 95% rename from chrome/browser/resources/chromeos/accessibility/switch_access/switch_access.ts rename to chrome/browser/resources/chromeos/accessibility/switch_access/mv2/switch_access.ts index 1bad31ce..233cf6c 100644 --- a/chrome/browser/resources/chromeos/accessibility/switch_access/switch_access.ts +++ b/chrome/browser/resources/chromeos/accessibility/switch_access/mv2/switch_access.ts
@@ -102,8 +102,7 @@ /** Creates and records the specified error. */ static error( - errorType: ErrorType, errorString: string, - shouldRecover = false): Error { + errorType: ErrorType, errorString: string, shouldRecover = false): Error { if (shouldRecover) { setTimeout(Navigator.byItem.moveToValidNode.bind(Navigator.byItem), 0); } @@ -116,7 +115,7 @@ private async waitForFocus_( desktop: AutomationNode, - currentFocus: AutomationNode | undefined): Promise<void> { + currentFocus: AutomationNode|undefined): Promise<void> { return new Promise(resolve => { // Focus is available. Finish init without waiting for further events. // Disallow web view nodes, which indicate a root web area is still @@ -130,7 +129,7 @@ // guaranteed. Otherwise, also set a timed callback to ensure we do // eventually init. let callbackId = 0; - const listener = (maybeEvent: AutomationEvent | undefined): void => { + const listener = (maybeEvent: AutomationEvent|undefined): void => { if (maybeEvent && maybeEvent.target.role === RoleType.WEB_VIEW) { return; }
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/switch_access_constants.ts b/chrome/browser/resources/chromeos/accessibility/switch_access/mv2/switch_access_constants.ts similarity index 100% rename from chrome/browser/resources/chromeos/accessibility/switch_access/switch_access_constants.ts rename to chrome/browser/resources/chromeos/accessibility/switch_access/mv2/switch_access_constants.ts
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/switch_access_e2e_test_base.js b/chrome/browser/resources/chromeos/accessibility/switch_access/mv2/switch_access_e2e_test_base.js similarity index 97% rename from chrome/browser/resources/chromeos/accessibility/switch_access/switch_access_e2e_test_base.js rename to chrome/browser/resources/chromeos/accessibility/switch_access/mv2/switch_access_e2e_test_base.js index 7f5319d..786b1f1 100644 --- a/chrome/browser/resources/chromeos/accessibility/switch_access/switch_access_e2e_test_base.js +++ b/chrome/browser/resources/chromeos/accessibility/switch_access/mv2/switch_access_e2e_test_base.js
@@ -3,8 +3,8 @@ // found in the LICENSE file. GEN_INCLUDE([ - '../common/testing/assert_additions.js', - '../common/testing/e2e_test_base.js', + '../../common/testing/assert_additions.js', + '../../common/testing/e2e_test_base.js', ]); /** Base class for browser tests for Switch Access. */
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/switch_access_loader.ts b/chrome/browser/resources/chromeos/accessibility/switch_access/mv2/switch_access_loader.ts similarity index 100% rename from chrome/browser/resources/chromeos/accessibility/switch_access/switch_access_loader.ts rename to chrome/browser/resources/chromeos/accessibility/switch_access/mv2/switch_access_loader.ts
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/switch_access_predicate.ts b/chrome/browser/resources/chromeos/accessibility/switch_access/mv2/switch_access_predicate.ts similarity index 88% rename from chrome/browser/resources/chromeos/accessibility/switch_access/switch_access_predicate.ts rename to chrome/browser/resources/chromeos/accessibility/switch_access/mv2/switch_access_predicate.ts index 5d8eff0..0e121dd 100644 --- a/chrome/browser/resources/chromeos/accessibility/switch_access/switch_access_predicate.ts +++ b/chrome/browser/resources/chromeos/accessibility/switch_access/mv2/switch_access_predicate.ts
@@ -36,8 +36,8 @@ * Returns true if |node| is actionable, meaning that a user can interact with * it in some way. */ - export function isActionable( - node: AutomationNode | undefined, cache: SACache): boolean { + export function isActionable(node: AutomationNode|undefined, cache: SACache): + boolean { // TODO(b/314203187): Not null asserted, check that this is correct. if (cache.isActionable.has(node!)) { return cache.isActionable.get(node!)!; @@ -118,9 +118,8 @@ * Additionally, for |node| to be a group, it cannot have the same bounding * box as its scope. */ - export function isGroup ( - node: AutomationNode | undefined, - scope: AutomationNode | SARootNode | null, + export function isGroup( + node: AutomationNode|undefined, scope: AutomationNode|SARootNode|null, cache: SACache): boolean { // If node is invalid (undefined or an undefined role), return false. if (!node || !node.role) { @@ -173,7 +172,7 @@ * is either actionable or a group. */ export function isInteresting( - node: AutomationNode | undefined, scope: AutomationNode | SARootNode, + node: AutomationNode|undefined, scope: AutomationNode|SARootNode, cache?: SACache): boolean { cache = cache || new SACache(); return SwitchAccessPredicate.isActionable(node, cache) || @@ -184,9 +183,9 @@ export function isVisible(node: AutomationNode): boolean { // TODO(b/314203187): Not null asserted, check that this is correct. return Boolean( - !node.state![StateType.OFFSCREEN] && node.location && - node.location.top >= 0 && node.location.left >= 0 && - !node.state![StateType.INVISIBLE]); + !node.state![StateType.OFFSCREEN] && node.location && + node.location.top >= 0 && node.location.left >= 0 && + !node.state![StateType.INVISIBLE]); } /** @@ -197,8 +196,8 @@ * cause a loop (isInteresting calls isGroup, and isGroup calls * isInterestingSubtree). */ - export function isInterestingSubtree( - node: AutomationNode, cache?: SACache): boolean { + export function isInterestingSubtree(node: AutomationNode, cache?: SACache): + boolean { cache = cache || new SACache(); if (cache.isInterestingSubtree.has(node)) { // TODO(b/314203187): Not null asserted, check that this is correct. @@ -220,17 +219,17 @@ /** Returns true if |node| should be considered a window. */ export function isWindow(node?: AutomationNode): boolean { return Boolean( - node && - (node.role === RoleType.WINDOW || - (node.role === RoleType.CLIENT && node.parent && - node.parent.role === RoleType.WINDOW))); + node && + (node.role === RoleType.WINDOW || + (node.role === RoleType.CLIENT && node.parent && + node.parent.role === RoleType.WINDOW))); } /** * Returns a Restrictions object ready to be passed to AutomationTreeWalker. */ - export function restrictions( - scope: AutomationNode): AutomationTreeWalkerRestriction { + export function restrictions(scope: AutomationNode): + AutomationTreeWalkerRestriction { const cache = new SACache(); return { leaf: SwitchAccessPredicate.leaf(scope, cache), @@ -243,10 +242,10 @@ * Creates a function that confirms if |node| is a terminal leaf node of a * SwitchAccess scope tree when |scope| is the root. */ - export function leaf( - scope: AutomationNode, cache: SACache): AutomationPredicate.Unary { + export function leaf(scope: AutomationNode, cache: SACache): + AutomationPredicate.Unary { return (node: AutomationNode) => - !SwitchAccessPredicate.isInterestingSubtree(node, cache) || + !SwitchAccessPredicate.isInterestingSubtree(node, cache) || (scope !== node && SwitchAccessPredicate.isInteresting(node, scope, cache)); } @@ -263,12 +262,12 @@ * Creates a function that determines whether |node| is to be visited in the * SwitchAccess scope tree with |scope| as the root. */ - export function visit( - scope: AutomationNode, cache: SACache): AutomationPredicate.Unary { + export function visit(scope: AutomationNode, cache: SACache): + AutomationPredicate.Unary { return (node: AutomationNode) => node.role !== RoleType.DESKTOP && SwitchAccessPredicate.isInteresting(node, scope, cache); } } TestImportManager.exportForTesting( - ['SwitchAccessPredicate', SwitchAccessPredicate]); + ['SwitchAccessPredicate', SwitchAccessPredicate]);
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/switch_access_predicate_test.js b/chrome/browser/resources/chromeos/accessibility/switch_access/mv2/switch_access_predicate_test.js similarity index 100% rename from chrome/browser/resources/chromeos/accessibility/switch_access/switch_access_predicate_test.js rename to chrome/browser/resources/chromeos/accessibility/switch_access/mv2/switch_access_predicate_test.js
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/switch_access_test.js b/chrome/browser/resources/chromeos/accessibility/switch_access/mv2/switch_access_test.js similarity index 100% rename from chrome/browser/resources/chromeos/accessibility/switch_access/switch_access_test.js rename to chrome/browser/resources/chromeos/accessibility/switch_access/mv2/switch_access_test.js
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/test_support.js b/chrome/browser/resources/chromeos/accessibility/switch_access/mv2/test_support.js similarity index 100% rename from chrome/browser/resources/chromeos/accessibility/switch_access/test_support.js rename to chrome/browser/resources/chromeos/accessibility/switch_access/mv2/test_support.js
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/test_utility.js b/chrome/browser/resources/chromeos/accessibility/switch_access/mv2/test_utility.js similarity index 100% rename from chrome/browser/resources/chromeos/accessibility/switch_access/test_utility.js rename to chrome/browser/resources/chromeos/accessibility/switch_access/mv2/test_utility.js
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/text_navigation_manager.ts b/chrome/browser/resources/chromeos/accessibility/switch_access/mv2/text_navigation_manager.ts similarity index 98% rename from chrome/browser/resources/chromeos/accessibility/switch_access/text_navigation_manager.ts rename to chrome/browser/resources/chromeos/accessibility/switch_access/mv2/text_navigation_manager.ts index a14f88b..204bc87 100644 --- a/chrome/browser/resources/chromeos/accessibility/switch_access/text_navigation_manager.ts +++ b/chrome/browser/resources/chromeos/accessibility/switch_access/mv2/text_navigation_manager.ts
@@ -220,7 +220,7 @@ */ static saveSelectStart(): void { const manager = TextNavigationManager.instance; - chrome.automation.getFocus((focusedNode: AutomationNode | undefined) => { + chrome.automation.getFocus((focusedNode: AutomationNode|undefined) => { manager.selectionStartObject_ = focusedNode; manager.selectionStartIndex_ = manager.getSelectionIndexFromNode_( // TODO(b/314203187): Not null asserted, check that this is correct. @@ -238,8 +238,8 @@ * @return selection start if getStart is true otherwise selection * end */ - private getSelectionIndexFromNode_( - node: AutomationNode, getStart: boolean): number { + private getSelectionIndexFromNode_(node: AutomationNode, getStart: boolean): + number { let indexFromNode = TextNavigationManager.NO_SELECT_INDEX; // TODO(b/314203187): Not null asserted, check that this is correct. if (getStart) {
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/text_navigation_manager_test.js b/chrome/browser/resources/chromeos/accessibility/switch_access/mv2/text_navigation_manager_test.js similarity index 100% rename from chrome/browser/resources/chromeos/accessibility/switch_access/text_navigation_manager_test.js rename to chrome/browser/resources/chromeos/accessibility/switch_access/mv2/text_navigation_manager_test.js
diff --git a/chrome/browser/resources/commerce/product_specifications/BUILD.gn b/chrome/browser/resources/commerce/product_specifications/BUILD.gn index 84a658c9..dd12ff6 100644 --- a/chrome/browser/resources/commerce/product_specifications/BUILD.gn +++ b/chrome/browser/resources/commerce/product_specifications/BUILD.gn
@@ -17,7 +17,6 @@ # Files holding a Polymer element definition and have an equivalent .html file. web_component_files = [ "app.ts", - "header.ts", "new_column_selector.ts", "product_selection_menu.ts", "product_selector.ts", @@ -31,6 +30,7 @@ "description_citation.css", "description_section.css", "disclosure/app.css", + "header.css", "header_menu.css", "horizontal_carousel.css", "loading_state.css", @@ -59,6 +59,8 @@ "disclosure/app.html.ts", "disclosure/app.ts", "drag_and_drop_manager.ts", + "header.html.ts", + "header.ts", "header_menu.html.ts", "header_menu.ts", "horizontal_carousel.html.ts",
diff --git a/chrome/browser/resources/commerce/product_specifications/app.html b/chrome/browser/resources/commerce/product_specifications/app.html index becc30d..be3d476 100644 --- a/chrome/browser/resources/commerce/product_specifications/app.html +++ b/chrome/browser/resources/commerce/product_specifications/app.html
@@ -231,6 +231,9 @@ <comparison-table-list id="comparisonTableList" tables="[[comparisonTableDetails_]]" + on-item-click="onComparisonTableListItemClick_" + on-rename-table="onComparisonTableListItemRename_" + on-delete-table="onComparisonTableListItemDelete_" hidden$="[[!showComparisonTableList_]]"> </comparison-table-list> </div>
diff --git a/chrome/browser/resources/commerce/product_specifications/app.ts b/chrome/browser/resources/commerce/product_specifications/app.ts index 9ed9d93e..02e2971 100644 --- a/chrome/browser/resources/commerce/product_specifications/app.ts +++ b/chrome/browser/resources/commerce/product_specifications/app.ts
@@ -37,7 +37,7 @@ import {getTemplate} from './app.html.js'; import type {BuyingOptions} from './buying_options_section.js'; import type {ComparisonTableDetails, ComparisonTableListElement} from './comparison_table_list.js'; -import type {ComparisonTableListItemClickEvent} from './comparison_table_list_item.js'; +import type {ComparisonTableListItemClickEvent, ComparisonTableListItemDeleteEvent, ComparisonTableListItemRenameEvent} from './comparison_table_list_item.js'; import type {ProductDescription} from './description_section.js'; import type {HeaderElement} from './header.js'; import type {NewColumnSelectorElement} from './new_column_selector.js'; @@ -291,10 +291,6 @@ this.callbackRouter_.onProductSpecificationsSetUpdated.addListener( (set: ProductSpecificationsSet) => this.onSetUpdated_(set))); - this.addEventListener( - 'comparison-table-list-item-click', - this.onComparisonTableListItemClickEvent_); - // TODO: b/358131415 - use listeners to update. Temporary workaround uses // window focus to update the feature state, to check signin. window.addEventListener('focus', async () => { @@ -622,14 +618,14 @@ return aggregatedDatas; } - private deleteSet_() { + private deleteSet_(uuid: Uuid|null = this.id_) { if (this.isOffline_) { this.showOfflineToast_(); return; } - if (this.id_) { - this.shoppingApi_.deleteProductSpecificationsSet(this.id_); + if (uuid) { + this.shoppingApi_.deleteProductSpecificationsSet(uuid); } } @@ -1003,13 +999,24 @@ } } - private onComparisonTableListItemClickEvent_( + private onComparisonTableListItemClick_( event: ComparisonTableListItemClickEvent) { window.history.replaceState( undefined, '', `?id=${event.detail.uuid.value}`); this.loadSet_(event.detail.uuid); } + private onComparisonTableListItemRename_( + event: ComparisonTableListItemRenameEvent) { + this.shoppingApi_.setNameForProductSpecificationsSet( + event.detail.uuid, event.detail.name); + } + + private onComparisonTableListItemDelete_( + event: ComparisonTableListItemDeleteEvent) { + this.deleteSet_(event.detail.uuid); + } + private async loadSet_(uuid: Uuid): Promise<boolean> { const {set} = await this.shoppingApi_.getProductSpecificationsSetByUuid(uuid); @@ -1036,12 +1043,6 @@ } declare global { - interface HTMLElementEventMap { - 'comparison-table-list-item-click': ComparisonTableListItemClickEvent; - } -} - -declare global { interface HTMLElementTagNameMap { 'product-specifications-app': ProductSpecificationsElement; }
diff --git a/chrome/browser/resources/commerce/product_specifications/comparison_table_list_item.css b/chrome/browser/resources/commerce/product_specifications/comparison_table_list_item.css index d3a0023f..01b42ae 100644 --- a/chrome/browser/resources/commerce/product_specifications/comparison_table_list_item.css +++ b/chrome/browser/resources/commerce/product_specifications/comparison_table_list_item.css
@@ -11,10 +11,25 @@ --cr-url-list-item-padding: 12px; } +cr-input { + --cr-input-background-color: transparent; + --cr-input-error-display: none; + width: 100%; +} + +cr-input.stroked:hover { + --cr-input-hover-background-color: transparent; +} + cr-url-list-item { padding: 4px 0; } +hr { + border: none; + border-top: var(--cr-hairline); +} + #itemContainer { background-color: var(--color-product-specifications-summary-background); border-radius: 8px;
diff --git a/chrome/browser/resources/commerce/product_specifications/comparison_table_list_item.html.ts b/chrome/browser/resources/commerce/product_specifications/comparison_table_list_item.html.ts index a699b99..12126b5 100644 --- a/chrome/browser/resources/commerce/product_specifications/comparison_table_list_item.html.ts +++ b/chrome/browser/resources/commerce/product_specifications/comparison_table_list_item.html.ts
@@ -8,7 +8,7 @@ export function getHtml(this: ComparisonTableListItemElement) { // clang-format off - return html` + return html`<!--_html_template_start_--> <div id="itemContainer"> <cr-url-list-item id="item" @@ -17,11 +17,42 @@ url="${this.tableUrl_.url}" description="${this.tableUrl_.url}" .imageUrls="${this.imageUrl ? [this.imageUrl?.url] : []}" - @click="${() => this.fire('comparison-table-list-item-click', { - uuid: this.uuid, - })}"> - <div id="numItems" slot="badges">${this.numItemsString_}</div> + .forceHover="${this.isMenuOpen_}" + @click="${this.onClick_}" + @contextmenu="${this.onContextMenu_}" + always-show-suffix> + + ${this.isRenaming_ ? html` + <cr-input slot="content" id="renameInput" value="${this.name}" + class="stroked" @blur="${this.onRenameInputBlur_}" + @keydown="${this.onRenameInputKeyDown_}"> + </cr-input>` + : html` + <div id="numItems" slot="badges">${this.numItemsString_}</div> + <cr-icon-button id="trailingIconButton" slot="suffix" + iron-icon="cr:more-vert" @click="${this.onShowContextMenuClick_}"> + </cr-icon-button>`} </cr-url-list-item> - </div>`; + </div> + + <cr-lazy-render-lit id="menu" + .template="${() => html` + <cr-action-menu> + <button id="openInNewTab" class="dropdown-item" role="menuitem" + @click="${this.onOpenInNewTabClick_}"> + $i18n{menuOpenInNewTab} + </button> + <hr> + <button id="rename" class="dropdown-item" role="menuitem" + @click="${this.onRenameClick_}"> + $i18n{menuRename} + </button> + <button id="delete" class="dropdown-item" role="menuitem" + @click="${this.onDeleteClick_}"> + $i18n{menuDelete} + </button> + </cr-action-menu>`}"> + </cr-lazy-render-lit> + <!--_html_template_end_-->`; // clang-format on }
diff --git a/chrome/browser/resources/commerce/product_specifications/comparison_table_list_item.ts b/chrome/browser/resources/commerce/product_specifications/comparison_table_list_item.ts index 70751af..5bb1065 100644 --- a/chrome/browser/resources/commerce/product_specifications/comparison_table_list_item.ts +++ b/chrome/browser/resources/commerce/product_specifications/comparison_table_list_item.ts
@@ -4,23 +4,43 @@ import '/strings.m.js'; import 'chrome://resources/cr_elements/cr_url_list_item/cr_url_list_item.js'; +import 'chrome://resources/cr_elements/cr_icon_button/cr_icon_button.js'; +import 'chrome://resources/cr_elements/cr_action_menu/cr_action_menu.js'; +import 'chrome://resources/cr_elements/cr_lazy_render/cr_lazy_render_lit.js'; +import 'chrome://resources/cr_elements/icons.html.js'; +import 'chrome://resources/cr_elements/cr_input/cr_input.js'; +import type {CrActionMenuElement} from '//resources/cr_elements/cr_action_menu/cr_action_menu.js'; +import type {CrIconButtonElement} from '//resources/cr_elements/cr_icon_button/cr_icon_button.js'; +import type {CrLazyRenderLitElement} from '//resources/cr_elements/cr_lazy_render/cr_lazy_render_lit.js'; import type {CrUrlListItemElement} from '//resources/cr_elements/cr_url_list_item/cr_url_list_item.js'; -import {type PluralStringProxy, PluralStringProxyImpl} from '//resources/js/plural_string_proxy.js'; +import {assert} from '//resources/js/assert.js'; +import type {PluralStringProxy} from '//resources/js/plural_string_proxy.js'; +import {PluralStringProxyImpl} from '//resources/js/plural_string_proxy.js'; import type {Uuid} from '//resources/mojo/mojo/public/mojom/base/uuid.mojom-webui.js'; -import {type ProductSpecificationsBrowserProxy, ProductSpecificationsBrowserProxyImpl} from 'chrome://resources/cr_components/commerce/product_specifications_browser_proxy.js'; +import type {ProductSpecificationsBrowserProxy} from 'chrome://resources/cr_components/commerce/product_specifications_browser_proxy.js'; +import {ProductSpecificationsBrowserProxyImpl} from 'chrome://resources/cr_components/commerce/product_specifications_browser_proxy.js'; +import type {CrInputElement} from 'chrome://resources/cr_elements/cr_input/cr_input.js'; import {loadTimeData} from 'chrome://resources/js/load_time_data.js'; -import {CrLitElement, type PropertyValues} from 'chrome://resources/lit/v3_0/lit.rollup.js'; +import type {PropertyValues} from 'chrome://resources/lit/v3_0/lit.rollup.js'; +import {CrLitElement} from 'chrome://resources/lit/v3_0/lit.rollup.js'; import type {Url} from 'chrome://resources/mojo/url/mojom/url.mojom-webui.js'; import {getCss} from './comparison_table_list_item.css.js'; import {getHtml} from './comparison_table_list_item.html.js'; +import {$$} from './utils.js'; export type ComparisonTableListItemClickEvent = CustomEvent<{uuid: Uuid}>; +export type ComparisonTableListItemRenameEvent = CustomEvent<{ + uuid: Uuid, + name: string, +}>; +export type ComparisonTableListItemDeleteEvent = CustomEvent<{uuid: Uuid}>; export interface ComparisonTableListItemElement { $: { item: CrUrlListItemElement, + menu: CrLazyRenderLitElement<CrActionMenuElement>, numItems: HTMLDivElement, }; } @@ -46,6 +66,8 @@ imageUrl: {type: Object}, tableUrl_: {type: Object}, numItemsString_: {type: String}, + isMenuOpen_: {type: Boolean}, + isRenaming_: {type: Boolean}, }; } @@ -56,6 +78,8 @@ protected tableUrl_: Url = {url: ''}; protected numItemsString_: string = ''; + protected isMenuOpen_: boolean = false; + protected isRenaming_: boolean = false; private productSpecificationsProxy_: ProductSpecificationsBrowserProxy = ProductSpecificationsBrowserProxyImpl.getInstance(); private pluralStringProxy_: PluralStringProxy = @@ -64,6 +88,10 @@ override async connectedCallback() { super.connectedCallback(); + this.addEventListener('close', () => { + this.isMenuOpen_ = false; + }); + const {url} = await this.productSpecificationsProxy_.getComparisonTableUrlForUuid( this.uuid); @@ -88,6 +116,86 @@ this.numItemsString_ = await this.pluralStringProxy_.getPluralString('numItems', this.numUrls); } + + protected onClick_() { + if (!this.isRenaming_) { + this.fire('item-click', { + uuid: this.uuid, + }); + } + } + + protected onContextMenu_(event: MouseEvent) { + event.preventDefault(); + event.stopPropagation(); + + this.isMenuOpen_ = true; + this.$.menu.get().showAtPosition({ + top: event.clientY, + left: event.clientX, + }); + } + + protected onShowContextMenuClick_(event: MouseEvent) { + event.preventDefault(); + event.stopPropagation(); + + this.isMenuOpen_ = true; + this.$.menu.get().showAt(this.trailingIconButton_); + } + + protected onOpenInNewTabClick_() { + this.$.menu.get().close(); + this.productSpecificationsProxy_.showProductSpecificationsSetForUuid( + this.uuid, true); + } + + protected async onRenameClick_() { + this.$.menu.get().close(); + this.isRenaming_ = true; + + // Focus the input once it is rendered. + await this.updateComplete; + this.input_.focus(); + } + + protected onDeleteClick_() { + this.$.menu.get().close(); + this.fire('delete-table', { + uuid: this.uuid, + }); + } + + protected onRenameInputBlur_() { + if (this.input_.value.length !== 0) { + this.fire('rename-table', { + uuid: this.uuid, + name: this.input_.value, + }); + } + + this.isRenaming_ = false; + } + + protected onRenameInputKeyDown_(event: KeyboardEvent) { + if (event.key === 'Enter') { + event.stopPropagation(); + this.input_.blur(); + } + } + + private get trailingIconButton_() { + const trailingIconButton = + $$<CrIconButtonElement>(this, '#trailingIconButton'); + assert(trailingIconButton); + return trailingIconButton; + } + + private get input_() { + const input = $$<CrInputElement>(this, '#renameInput'); + assert(input); + return input; + } } declare global {
diff --git a/chrome/browser/resources/commerce/product_specifications/header.css b/chrome/browser/resources/commerce/product_specifications/header.css new file mode 100644 index 0000000..68034eb --- /dev/null +++ b/chrome/browser/resources/commerce/product_specifications/header.css
@@ -0,0 +1,78 @@ +/* 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. */ + +/* #css_wrapper_metadata_start + * #type=style-lit + * #import=chrome://resources/cr_elements/cr_shared_style_lit.css.js + * #import=chrome://resources/cr_elements/cr_shared_vars.css.js + * #include=cr-shared-style-lit + * #scheme=relative + * #css_wrapper_metadata_end */ + +:host { + display: flex; + align-items: center; + gap: 12px; +} + +cr-input { + --cr-input-background-color: transparent; + --cr-input-error-display: none; + margin: 12px 20px; +} + +cr-input.stroked:hover { + --cr-input-hover-background-color: transparent; +} + +:host([showing-menu_]) #menuButton { + background-color: var(--cr-hover-background-color); +} + +#logo { + margin-inline-end: 4px; +} + +.title-text { + font-size: 24px; + font-style: normal; + font-weight: 500; +} + +#input { + --cr-input-font-size: 24px; + font-weight: 500; + margin: 0; +} + +.spacer { + flex: 1; +} + +#title { + color: var(--cr-primary-text-color); +} + +#divider { + background: var(--color-product-specifications-divider); + border-radius: 1px; + display: inline; + height: 2em; + margin: 4px 2px; + width: 2px; +} + +#subtitle { + color: var(--cr-secondary-text-color); + flex: 1; +} + +#subtitle:hover { + border-bottom: 1px solid var(--color-product-specifications-divider); + margin-bottom: -1px; /* Don't move on hover */ +} + +#menuButton { + --cr-icon-button-size: 30px; +}
diff --git a/chrome/browser/resources/commerce/product_specifications/header.html b/chrome/browser/resources/commerce/product_specifications/header.html deleted file mode 100644 index 03b55993..0000000 --- a/chrome/browser/resources/commerce/product_specifications/header.html +++ /dev/null
@@ -1,96 +0,0 @@ -<style include="cr-shared-style"> - :host { - display: flex; - align-items: center; - gap: 12px; - } - - cr-input { - --cr-input-background-color: transparent; - --cr-input-error-display: none; - margin: 12px 20px; - } - - cr-input.stroked:hover { - --cr-input-hover-background-color: transparent; - } - - :host([showing-menu_]) #menuButton { - background-color: var(--cr-hover-background-color); - } - - #logo { - margin-inline-end: 4px; - } - - .title-text { - font-size: 24px; - font-style: normal; - font-weight: 500; - } - - #input { - --cr-input-font-size: 24px; - font-weight: 500; - margin: 0; - } - - .spacer { - flex: 1; - } - - #title { - color: var(--cr-primary-text-color); - } - - #divider { - background: var(--color-product-specifications-divider); - border-radius: 1px; - display: inline; - height: 2em; - margin: 4px 2px; - width: 2px; - } - - #subtitle { - color: var(--cr-secondary-text-color); - flex: 1; - } - - #subtitle:hover { - border-bottom: 1px solid var(--color-product-specifications-divider); - margin-bottom: -1px; /* Don't move on hover */ - } - - #menuButton { - --cr-icon-button-size: 30px; - } -</style> -<img id="logo" srcset="chrome://theme/current-channel-logo@4x 4x" - role="presentation"> -<div class="title-text" id="title">$i18n{pageTitle}</div> -<div id="divider" hidden="[[!subtitle]]"></div> -<template is="dom-if" if="[[showingInput_]]"> - <cr-input id="input" class="stroked" value="[[subtitle]]" - on-keydown="onInputKeyDown_" - on-blur="onInputBlur_" - maxlength="{{maxNameLength_}}" - aria-label="$i18n{tableNameInputA11yLabel}"> - </cr-input> - <div class="spacer"></div> -</template> -<template is="dom-if" if="[[!showingInput_]]"> - <div class="title-text" id="subtitle" hidden="[[!subtitle]]" - on-click="onRenaming_" on-keydown="onSubtitleKeyDown_" role="textbox" - tabindex="0"> - [[subtitle]] - </div> -</template> -<cr-icon-button id="menuButton" class="icon-more-vert" on-click="showMenu_" - disabled="[[menuButtonDisabled]]" - hidden="[[!subtitle]]" - aria-label="$i18n{tableMenuA11yLabel}"> -</cr-icon-button> - -<header-menu id="menu" on-close="onCloseMenu_" on-rename-click="onRenaming_"> -</header-menu>
diff --git a/chrome/browser/resources/commerce/product_specifications/header.html.ts b/chrome/browser/resources/commerce/product_specifications/header.html.ts new file mode 100644 index 0000000..19d265d --- /dev/null +++ b/chrome/browser/resources/commerce/product_specifications/header.html.ts
@@ -0,0 +1,47 @@ +// 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 {html} from '//resources/lit/v3_0/lit.rollup.js'; + +import type {HeaderElement} from './header.js'; + +// clang-format off +export function getHtml(this: HeaderElement) { + return html`<!--_html_template_start_--> + <img id="logo" srcset="chrome://theme/current-channel-logo@4x 4x" + role="presentation"> + <div class="title-text" id="title">$i18n{pageTitle}</div> + <div id="divider" ?hidden="${!this.subtitle}"></div> + ${this.showingInput_ ? html` + <cr-input id="input" class="stroked" value="${this.subtitle}" + @keydown="${this.onInputKeyDown_}" + @blur="${this.onInputBlur_}" + maxlength="${this.maxNameLength_}" + aria-label="$i18n{tableNameInputA11yLabel}"> + </cr-input> + <div class="spacer"></div> + ` : html` + <div class="title-text" id="subtitle" + ?hidden="${!this.subtitle}" + @click="${this.onRenaming_}" + @keydown="${this.onSubtitleKeyDown_}" + role="textbox" + tabindex="0"> + ${this.subtitle} + </div> + `} + + <cr-icon-button id="menuButton" class="icon-more-vert" + @click="${this.showMenu_}" + ?disabled="${this.menuButtonDisabled}" + ?hidden="${!this.subtitle}" + aria-label="$i18n{tableMenuA11yLabel}"> + </cr-icon-button> + + <header-menu id="menu" @close="${this.onCloseMenu_}" + @rename-click="${this.onRenaming_}"> + </header-menu> + <!--_html_template_end_-->`; +} +// clang-format on
diff --git a/chrome/browser/resources/commerce/product_specifications/header.ts b/chrome/browser/resources/commerce/product_specifications/header.ts index 1661608..d20b6ea1 100644 --- a/chrome/browser/resources/commerce/product_specifications/header.ts +++ b/chrome/browser/resources/commerce/product_specifications/header.ts
@@ -11,11 +11,11 @@ import type {CrIconButtonElement} from 'chrome://resources/cr_elements/cr_icon_button/cr_icon_button.js'; import type {CrInputElement} from 'chrome://resources/cr_elements/cr_input/cr_input.js'; -import {assert} from 'chrome://resources/js/assert.js'; import {loadTimeData} from 'chrome://resources/js/load_time_data.js'; -import {afterNextRender, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; +import {CrLitElement} from 'chrome://resources/lit/v3_0/lit.rollup.js'; -import {getTemplate} from './header.html.js'; +import {getCss} from './header.css.js'; +import {getHtml} from './header.html.js'; import type {HeaderMenuElement} from './header_menu.js'; export interface HeaderElement { @@ -26,16 +26,16 @@ }; } -export class HeaderElement extends PolymerElement { +export class HeaderElement extends CrLitElement { static get is() { return 'product-specifications-header'; } - static get template() { - return getTemplate(); + static override get styles() { + return getCss(); } - static get properties() { + static override get properties() { return { menuButtonDisabled: { type: Boolean, @@ -44,13 +44,13 @@ subtitle: { type: String, - reflectToAttribute: true, + reflect: true, }, showingMenu_: { type: Boolean, value: false, - reflectToAttribute: true, + reflect: true, }, showingInput_: { @@ -63,39 +63,47 @@ menuButtonDisabled: boolean; subtitle: string|null = null; - private showingMenu_: boolean; - private showingInput_: boolean; - private pageName_: string; - private maxNameLength_: number = loadTimeData.getInteger('maxNameLength'); + protected showingMenu_: boolean; + protected showingInput_: boolean; + protected pageName_: string; + protected maxNameLength_: number = loadTimeData.getInteger('maxNameLength'); - private showMenu_() { + override render() { + return getHtml.bind(this)(); + } + + protected showMenu_() { this.$.menu.showAt(this.$.menuButton); this.showingMenu_ = true; } - private onCloseMenu_() { + protected onCloseMenu_() { this.showingMenu_ = false; } - private get input_(): CrInputElement { + private get input_(): CrInputElement|null { const input = this.shadowRoot!.querySelector('cr-input'); - assert(!!input); return input; } - private onRenaming_() { + protected async onRenaming_() { this.showingInput_ = true; - afterNextRender(this, () => this.input_.focus()); + await this.updateComplete; + this.input_?.focus(); } - private onInputKeyDown_(event: KeyboardEvent) { + protected onInputKeyDown_(event: KeyboardEvent) { if (event.key === 'Enter') { event.stopPropagation(); - this.input_.blur(); + this.input_?.blur(); } } - private onInputBlur_() { + protected onInputBlur_() { + if (!this.input_) { + return; + } + const inputValue = this.input_.value; this.showingInput_ = false; if (!inputValue) { @@ -119,7 +127,7 @@ } } - private onSubtitleKeyDown_(event: KeyboardEvent) { + protected onSubtitleKeyDown_(event: KeyboardEvent) { if (event.key === 'Enter') { event.stopPropagation(); this.onRenaming_();
diff --git a/chrome/browser/resources/glic/glic_api/glic_api.ts b/chrome/browser/resources/glic/glic_api/glic_api.ts index 7b7223d1..a1df2b11 100644 --- a/chrome/browser/resources/glic/glic_api/glic_api.ts +++ b/chrome/browser/resources/glic/glic_api/glic_api.ts
@@ -107,6 +107,11 @@ // Requests the closing of the panel containing the web client. closePanel?(): Promise<void>; + // Triggers the change profile flow, which allows the user to switch which + // profile is used. If a new profile is chosen, this web client will be + // closed in favor of a new one. + showProfilePicker?(): void; + // Returns the state of the panel. getPanelState?(): Observable<PanelState>;
diff --git a/chrome/browser/resources/lens/overlay/lens_overlay_app.ts b/chrome/browser/resources/lens/overlay/lens_overlay_app.ts index ebc2e2d..9e7282f 100644 --- a/chrome/browser/resources/lens/overlay/lens_overlay_app.ts +++ b/chrome/browser/resources/lens/overlay/lens_overlay_app.ts
@@ -142,8 +142,7 @@ }, showGhostLoader: { type: Boolean, - computed: - `computeShowGhostLoader(autocompleteRequestStarted, showErrorState, + computed: `computeShowGhostLoader(isSearchboxFocused, suppressGhostLoader)`, reflectToAttribute: true, }, @@ -165,8 +164,6 @@ suppressGhostLoader: boolean; // Whether the ghost loader should show its error state. showErrorState: boolean; - // Whether this is an in flight request to autocomplete. - private autocompleteRequestStarted: boolean = false; // Whether the translate button is enabled. private isTranslateButtonEnabled: boolean; // Whether the image has finished rendering. @@ -281,9 +278,6 @@ } }); this.eventTracker_.add( - document, 'query-autocomplete', - this.handleQueryAutocomplete.bind(this)); - this.eventTracker_.add( document, 'pointermove', this.updateCursorPosition.bind(this)); this.eventTracker_.add(this.$.searchbox, 'mousedown', () => { this.suppressGhostLoader = false; @@ -345,11 +339,6 @@ this.searchboxBoundingClientRectObserver.observe(this.$.selectionOverlay); } - // Called when the searchbox requests autocomplete suggestions. - private handleQueryAutocomplete() { - this.autocompleteRequestStarted = true; - } - private focusShimmerOnSearchbox() { const suggestionsContainer = this.$.searchbox.getSuggestionsElement(); const areSuggestionsShowing = @@ -386,7 +375,6 @@ private handleSearchboxBlurred() { this.isSearchboxFocused = false; - this.autocompleteRequestStarted = false; this.showErrorState = false; this.$.translateButtonContainer.classList.add('searchbox-unfocused'); @@ -444,13 +432,7 @@ } private computeShowGhostLoader(): boolean { - if (this.suppressGhostLoader) { - return false; - } - // Show the ghost loader if there is focus on the searchbox, and there is - // autcomplete is loading or if autocomplete failed. - return this.isSearchboxFocused && - (this.autocompleteRequestStarted || this.showErrorState); + return this.isSearchboxFocused && !this.suppressGhostLoader; } private suppressGhostLoader_() {
diff --git a/chrome/browser/resources/lens/overlay/side_panel/side_panel_app.ts b/chrome/browser/resources/lens/overlay/side_panel/side_panel_app.ts index 14b0ab2..939b5836 100644 --- a/chrome/browser/resources/lens/overlay/side_panel/side_panel_app.ts +++ b/chrome/browser/resources/lens/overlay/side_panel/side_panel_app.ts
@@ -99,8 +99,7 @@ }, showGhostLoader: { type: Boolean, - computed: - `computeShowGhostLoader(autocompleteRequestStarted, showErrorState, + computed: `computeShowGhostLoader(isSearchboxFocused, suppressGhostLoader, isContextualSearchbox)`, reflectToAttribute: true, }, @@ -129,8 +128,6 @@ suppressGhostLoader: boolean; // Whether the ghost loader should show its error state. showErrorState: boolean; - // Whether this is an in flight request to autocomplete. - private autocompleteRequestStarted: boolean = false; private isErrorPageVisible: boolean; // Whether the results iframe is currently loading. This needs to be done via // browser because the iframe is cross-origin. Default true since the side @@ -200,9 +197,6 @@ onSearchboxKeydown(this, this.$.searchbox); } }); - this.eventTracker_.add( - document, 'query-autocomplete', - this.handleQueryAutocomplete.bind(this)); } override disconnectedCallback() { @@ -253,11 +247,6 @@ this.wasBackArrowAvailable = visible; } - // Called when the searchbox requests autocomplete suggestions. - private handleQueryAutocomplete() { - this.autocompleteRequestStarted = true; - } - private setShowErrorPage(shouldShowErrorPage: boolean) { this.isErrorPageVisible = shouldShowErrorPage && loadTimeData.getBoolean('enableErrorPage'); @@ -275,18 +264,12 @@ private onSearchboxFocusOut_() { this.isBackArrowVisible = this.wasBackArrowAvailable; this.isSearchboxFocused = false; - this.autocompleteRequestStarted = false; this.showErrorState = false; } private computeShowGhostLoader(): boolean { - if (!this.isContextualSearchbox || this.suppressGhostLoader) { - return false; - } - // Show the ghost loader if there is focus on the searchbox, and there is - // autcomplete is loading or if autocomplete failed. - return this.isSearchboxFocused && - (this.autocompleteRequestStarted || this.showErrorState); + return this.isSearchboxFocused && !this.suppressGhostLoader && + this.isContextualSearchbox; } private computePlaceholderText(): string { @@ -310,7 +293,6 @@ this.isContextualSearchbox = true; this.suppressGhostLoader = false; this.isSearchboxFocused = true; - this.autocompleteRequestStarted = true; } }
diff --git a/chrome/browser/resources/settings/people_page/people_page.html b/chrome/browser/resources/settings/people_page/people_page.html index 4d187ff..72f101f 100644 --- a/chrome/browser/resources/settings/people_page/people_page.html +++ b/chrome/browser/resources/settings/people_page/people_page.html
@@ -16,6 +16,15 @@ --cr-secondary-text-color: var(--settings-error-color); } + #sync-not-allowed { + border-top: var(--cr-separator-line); + background: var(--google-grey-100); + } + + #sync-not-allowed-text { + margin-left: 8px; + } + cr-link-row { --cr-link-row-icon-width: 40px; border-top: var(--cr-separator-line); @@ -49,6 +58,12 @@ font-size: 1.1rem; line-height: 1.625rem; } + + @media (prefers-color-scheme: dark) { + #sync-not-allowed { + background: var(--google-grey-800); + } + } </style> <settings-animated-pages id="pages" section="people" focus-config="[[focusConfig_]]"> @@ -133,6 +148,17 @@ 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> + <div id="sync-not-allowed-text" class="flex cr-padded-text"> + $i18n{syncUnavailableForNonGoogleAccount} + </div> + </div> + </template> +</if> + </div> <template is="dom-if" route-path="/syncSetup"> <settings-subpage
diff --git a/chrome/browser/resources/settings/people_page/people_page.ts b/chrome/browser/resources/settings/people_page/people_page.ts index f49caf5..b34dc88 100644 --- a/chrome/browser/resources/settings/people_page/people_page.ts +++ b/chrome/browser/resources/settings/people_page/people_page.ts
@@ -105,6 +105,19 @@ }, }, + /** + * This property stores whether the profile is a Dasherless profiles, + * which is associated with a non-Dasher account. Some UIs related to + * sign in and sync service will be different because they are not + * available for these profiles. + */ + isDasherlessProfile_: { + type: Boolean, + value() { + return loadTimeData.getBoolean('isDasherlessProfile'); + }, + }, + // <if expr="not chromeos_ash"> /** * Stored accounts to the system, supplied by SyncBrowserProxy. @@ -211,6 +224,7 @@ prefs: any; private signinAllowed_: boolean; + private isDasherlessProfile_: boolean; syncStatus: SyncStatus|null; pageVisibility: PageVisibility; private authToken_: string;
diff --git a/chrome/browser/resources/settings/privacy_page/security_page.ts b/chrome/browser/resources/settings/privacy_page/security_page.ts index 552f3b5..625814a 100644 --- a/chrome/browser/resources/settings/privacy_page/security_page.ts +++ b/chrome/browser/resources/settings/privacy_page/security_page.ts
@@ -286,7 +286,6 @@ private focusConfigChanged_(_newConfig: FocusConfig, oldConfig: FocusConfig) { assert(!oldConfig); - // TODO(crbug.com/40928765): fix this for new cert management UI. // <if expr="use_nss_certs"> if (routes.CERTIFICATES) { this.focusConfig.set(routes.CERTIFICATES.path, () => {
diff --git a/chrome/browser/resources/tts_engine/BUILD.gn b/chrome/browser/resources/tts_engine/BUILD.gn index be35ba5..92819c7 100644 --- a/chrome/browser/resources/tts_engine/BUILD.gn +++ b/chrome/browser/resources/tts_engine/BUILD.gn
@@ -10,6 +10,7 @@ generate_grd("build_bindings_grdp") { grd_prefix = "tts_engine" + resource_path_prefix = "tts_engine" out_grd = "$target_gen_dir/bindings_resources.grdp" input_files_base_dir = rebase_path("//third_party/wasm_tts_engine/src", "//") input_files = [ "bindings_main.js" ] @@ -17,6 +18,7 @@ build_webui("build") { grd_prefix = "tts_engine" + grd_resource_path_prefix = "tts_engine" non_web_component_files = [ "background.ts" ] ts_out_dir = "$out_dir" extra_grdp_files = [ "$target_gen_dir/bindings_resources.grdp" ]
diff --git a/chrome/browser/safe_browsing/chrome_client_side_detection_service_delegate.cc b/chrome/browser/safe_browsing/chrome_client_side_detection_service_delegate.cc index 3aa151a..2eab342 100644 --- a/chrome/browser/safe_browsing/chrome_client_side_detection_service_delegate.cc +++ b/chrome/browser/safe_browsing/chrome_client_side_detection_service_delegate.cc
@@ -138,9 +138,8 @@ } if (reason == optimization_guide::OnDeviceModelEligibilityReason::kSuccess) { - base::UmaHistogramMediumTimes( - "SBClientPhishing.OnDeviceModelFetchTime", - base::TimeTicks::Now() - on_device_fetch_time_); + base::UmaHistogramLongTimes("SBClientPhishing.OnDeviceModelFetchTime", + base::TimeTicks::Now() - on_device_fetch_time_); NotifyServiceOnDeviceModelAvailable(); } else { LogOnDeviceModelDownloadSuccess(false);
diff --git a/chrome/browser/safe_browsing/download_protection/download_protection_service.cc b/chrome/browser/safe_browsing/download_protection/download_protection_service.cc index 27d7b4d2..c979373 100644 --- a/chrome/browser/safe_browsing/download_protection/download_protection_service.cc +++ b/chrome/browser/safe_browsing/download_protection/download_protection_service.cc
@@ -651,12 +651,6 @@ safe_browsing::SafeBrowsingMetricsCollector::EventType:: DOWNLOAD_DEEP_SCAN); } - - if (trigger == - DownloadItemWarningData::DeepScanTrigger::TRIGGER_IMMEDIATE_DEEP_SCAN) { - profile->GetPrefs()->SetBoolean( - prefs::kSafeBrowsingAutomaticDeepScanPerformed, true); - } } // static
diff --git a/chrome/browser/safe_browsing/download_protection/download_protection_service_unittest.cc b/chrome/browser/safe_browsing/download_protection/download_protection_service_unittest.cc index 14550190..f9b0f2e 100644 --- a/chrome/browser/safe_browsing/download_protection/download_protection_service_unittest.cc +++ b/chrome/browser/safe_browsing/download_protection/download_protection_service_unittest.cc
@@ -5355,30 +5355,4 @@ EXPECT_TRUE(IsResult(DownloadCheckResult::PROMPT_FOR_SCANNING)); } -TEST_F(DownloadProtectionServiceTest, ImmediateDeepScansSetPref) { - base::FilePath test_zip; - EXPECT_TRUE(base::PathService::Get(chrome::DIR_TEST_DATA, &test_zip)); - test_zip = test_zip.AppendASCII("safe_browsing") - .AppendASCII("download_protection") - .AppendASCII("encrypted.zip"); - - NiceMockDownloadItem item; - PrepareBasicDownloadItemWithFullPaths( - &item, {"http://www.evil.com/encrypted.zip"}, // url_chain - "http://www.google.com/", // referrer - test_zip, // tmp_path - temp_dir_.GetPath().Append( - FILE_PATH_LITERAL("encrypted.zip"))); // final_path - content::DownloadItemUtils::AttachInfoForTesting(&item, profile(), nullptr); - - EXPECT_FALSE(profile()->GetPrefs()->GetBoolean( - prefs::kSafeBrowsingAutomaticDeepScanPerformed)); - safe_browsing::DownloadProtectionService::UploadForConsumerDeepScanning( - &item, - DownloadItemWarningData::DeepScanTrigger::TRIGGER_IMMEDIATE_DEEP_SCAN, - /*password=*/std::nullopt); - EXPECT_TRUE(profile()->GetPrefs()->GetBoolean( - prefs::kSafeBrowsingAutomaticDeepScanPerformed)); -} - } // namespace safe_browsing
diff --git a/chrome/browser/signin/android/signin_manager_android.cc b/chrome/browser/signin/android/signin_manager_android.cc index b52dc390..17323363 100644 --- a/chrome/browser/signin/android/signin_manager_android.cc +++ b/chrome/browser/signin/android/signin_manager_android.cc
@@ -253,9 +253,8 @@ void SigninManagerAndroid::FetchAndApplyCloudPolicy( JNIEnv* env, - const base::android::JavaParamRef<jobject>& j_account_info, + const CoreAccountInfo& account, const base::RepeatingClosure& callback) { - CoreAccountInfo account = ConvertFromJavaCoreAccountInfo(env, j_account_info); RegisterPolicyWithAccount( account, base::BindOnce(&SigninManagerAndroid::OnPolicyRegisterDone,
diff --git a/chrome/browser/signin/android/signin_manager_android.h b/chrome/browser/signin/android/signin_manager_android.h index b53a329..e4af4ca 100644 --- a/chrome/browser/signin/android/signin_manager_android.h +++ b/chrome/browser/signin/android/signin_manager_android.h
@@ -58,10 +58,9 @@ // Registers a CloudPolicyClient for fetching policy for a user and fetches // the policy if necessary. - void FetchAndApplyCloudPolicy( - JNIEnv* env, - const base::android::JavaParamRef<jobject>& j_account_info, - const base::RepeatingClosure& j_callback); + void FetchAndApplyCloudPolicy(JNIEnv* env, + const CoreAccountInfo& account, + const base::RepeatingClosure& callback); void StopApplyingCloudPolicy(JNIEnv* env);
diff --git a/chrome/browser/signin/android/web_signin_bridge.cc b/chrome/browser/signin/android/web_signin_bridge.cc index c7de4e87..81714d1 100644 --- a/chrome/browser/signin/android/web_signin_bridge.cc +++ b/chrome/browser/signin/android/web_signin_bridge.cc
@@ -9,6 +9,7 @@ #include "chrome/browser/profiles/profile.h" #include "chrome/browser/signin/account_reconcilor_factory.h" #include "chrome/browser/signin/identity_manager_factory.h" +#include "components/signin/public/identity_manager/account_info.h" #include "components/signin/public/identity_manager/accounts_in_cookie_jar_info.h" // Must come after all headers that specialize FromJniType() / ToJniType(). @@ -91,7 +92,7 @@ static jlong JNI_WebSigninBridge_Create( JNIEnv* env, Profile* profile, - const JavaParamRef<jobject>& j_account, + CoreAccountInfo& account, const JavaParamRef<jobject>& j_listener) { DCHECK(j_listener) << "Listener should be non-null"; @@ -99,14 +100,12 @@ IdentityManagerFactory::GetForProfile(profile); AccountReconcilor* account_reconcilor = AccountReconcilorFactory::GetForProfile(profile); - CoreAccountInfo signin_account = - ConvertFromJavaCoreAccountInfo(env, j_account); base::RepeatingCallback<void(const GoogleServiceAuthError&)> on_signin_completed = base::BindRepeating( &ForwardOnSigninCompletedToJava, base::android::ScopedJavaGlobalRef<jobject>(j_listener)); return reinterpret_cast<intptr_t>( - new WebSigninBridge(identity_manager, account_reconcilor, signin_account, + new WebSigninBridge(identity_manager, account_reconcilor, account, std::move(on_signin_completed))); }
diff --git a/chrome/browser/signin/services/android/java/src/org/chromium/chrome/browser/signin/services/WebSigninBridge.java b/chrome/browser/signin/services/android/java/src/org/chromium/chrome/browser/signin/services/WebSigninBridge.java index 06f3af52..045baf7 100644 --- a/chrome/browser/signin/services/android/java/src/org/chromium/chrome/browser/signin/services/WebSigninBridge.java +++ b/chrome/browser/signin/services/android/java/src/org/chromium/chrome/browser/signin/services/WebSigninBridge.java
@@ -89,7 +89,9 @@ @NativeMethods interface Natives { long create( - @JniType("Profile*") Profile profile, CoreAccountInfo account, Listener listener); + @JniType("Profile*") Profile profile, + @JniType("CoreAccountInfo") CoreAccountInfo account, + Listener listener); void destroy(long webSigninBridgePtr); }
diff --git a/chrome/browser/sync/prefs/chrome_syncable_prefs_database.cc b/chrome/browser/sync/prefs/chrome_syncable_prefs_database.cc index 0a8f596..74592cf5 100644 --- a/chrome/browser/sync/prefs/chrome_syncable_prefs_database.cc +++ b/chrome/browser/sync/prefs/chrome_syncable_prefs_database.cc
@@ -375,6 +375,12 @@ kAccessibilityFaceGazePrecisionClickSpeedFactor = 100314, kOfficeFilesAlwaysMoveToDriveSyncable = 100315, kOfficeFilesAlwaysMoveToOneDriveSyncable = 100316, + kOfficeMoveConfirmationShownForDriveSyncable = 100317, + kOfficeMoveConfirmationShownForOneDriveSyncable = 100318, + kOfficeMoveConfirmationShownForLocalToDriveSyncable = 100319, + kOfficeMoveConfirmationShownForLocalToOneDriveSyncable = 100320, + kOfficeMoveConfirmationShownForCloudToDriveSyncable = 100321, + kOfficeMoveConfirmationShownForCloudToOneDriveSyncable = 100322, // See components/sync_preferences/README.md about adding new entries here. // vvvvv IMPORTANT! vvvvv // Note to the reviewer: IT IS YOUR RESPONSIBILITY to ensure that new syncable @@ -832,6 +838,32 @@ {syncable_prefs_ids::kOfficeFilesAlwaysMoveToOneDriveSyncable, syncer::OS_PREFERENCES, sync_preferences::PrefSensitivity::kNone, sync_preferences::MergeBehavior::kNone}}, + {prefs::kOfficeMoveConfirmationShownForDriveSyncable, + {syncable_prefs_ids::kOfficeMoveConfirmationShownForDriveSyncable, + syncer::OS_PREFERENCES, sync_preferences::PrefSensitivity::kNone, + sync_preferences::MergeBehavior::kNone}}, + {prefs::kOfficeMoveConfirmationShownForOneDriveSyncable, + {syncable_prefs_ids::kOfficeMoveConfirmationShownForOneDriveSyncable, + syncer::OS_PREFERENCES, sync_preferences::PrefSensitivity::kNone, + sync_preferences::MergeBehavior::kNone}}, + {prefs::kOfficeMoveConfirmationShownForLocalToDriveSyncable, + {syncable_prefs_ids::kOfficeMoveConfirmationShownForLocalToDriveSyncable, + syncer::OS_PREFERENCES, sync_preferences::PrefSensitivity::kNone, + sync_preferences::MergeBehavior::kNone}}, + {prefs::kOfficeMoveConfirmationShownForLocalToOneDriveSyncable, + {syncable_prefs_ids:: + kOfficeMoveConfirmationShownForLocalToOneDriveSyncable, + syncer::OS_PREFERENCES, sync_preferences::PrefSensitivity::kNone, + sync_preferences::MergeBehavior::kNone}}, + {prefs::kOfficeMoveConfirmationShownForCloudToDriveSyncable, + {syncable_prefs_ids::kOfficeMoveConfirmationShownForCloudToDriveSyncable, + syncer::OS_PREFERENCES, sync_preferences::PrefSensitivity::kNone, + sync_preferences::MergeBehavior::kNone}}, + {prefs::kOfficeMoveConfirmationShownForCloudToOneDriveSyncable, + {syncable_prefs_ids:: + kOfficeMoveConfirmationShownForCloudToOneDriveSyncable, + syncer::OS_PREFERENCES, sync_preferences::PrefSensitivity::kNone, + sync_preferences::MergeBehavior::kNone}}, {ash::prefs::kOobeMarketingOptInChoice, {syncable_prefs_ids::kOobeMarketingOptInChoice, syncer::OS_PREFERENCES, sync_preferences::PrefSensitivity::kNone,
diff --git a/chrome/browser/sync/test/integration/single_client_product_specifications_sync_test.cc b/chrome/browser/sync/test/integration/single_client_product_specifications_sync_test.cc index 93f024a..b712cf3 100644 --- a/chrome/browser/sync/test/integration/single_client_product_specifications_sync_test.cc +++ b/chrome/browser/sync/test/integration/single_client_product_specifications_sync_test.cc
@@ -111,10 +111,7 @@ class SingleClientProductSpecificationsSyncTest : public SyncTest { public: SingleClientProductSpecificationsSyncTest() : SyncTest(SINGLE_CLIENT) { - features_override_.InitWithFeatures( - {commerce::kProductSpecifications, - commerce::kProductSpecificationsMultiSpecifics}, - {}); + features_override_.InitWithFeatures({commerce::kProductSpecifications}, {}); } SingleClientProductSpecificationsSyncTest(
diff --git a/chrome/browser/tab_contents/navigation_metrics_recorder_browsertest.cc b/chrome/browser/tab_contents/navigation_metrics_recorder_browsertest.cc index 59ebba32..5d8faa40 100644 --- a/chrome/browser/tab_contents/navigation_metrics_recorder_browsertest.cc +++ b/chrome/browser/tab_contents/navigation_metrics_recorder_browsertest.cc
@@ -4,6 +4,7 @@ #include "chrome/browser/tab_contents/navigation_metrics_recorder.h" +#include "base/strings/to_string.h" #include "base/test/metrics/histogram_tester.h" #include "base/test/scoped_feature_list.h" #include "chrome/browser/profiles/profile.h" @@ -200,7 +201,7 @@ tpcd_experiment_feature_list_.InitAndEnableFeatureWithParameters( features::kCookieDeprecationFacilitatedTesting, {{tpcd::experiment::kDisable3PCookiesName, - test_case_.is_experiment_cookies_disabled ? "true" : "false"}}); + base::ToString(test_case_.is_experiment_cookies_disabled)}}); // When features are disabled, IsForceThirdPartyCookieBlockingEnabled will // return false, cookies are allowed.
diff --git a/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/LocalTabGroupMutationHelper.java b/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/LocalTabGroupMutationHelper.java index 8d19e864..53c14394 100644 --- a/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/LocalTabGroupMutationHelper.java +++ b/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/LocalTabGroupMutationHelper.java
@@ -4,6 +4,8 @@ package org.chromium.chrome.browser.tab_group_sync; +import android.text.TextUtils; + import org.chromium.base.metrics.RecordUserAction; import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tab_group_sync.TabGroupSyncControllerImpl.TabCreationDelegate; @@ -221,17 +223,25 @@ * the group has been closed and drop the mapping. * * @param tabGroupId The local ID of the tab group. + * @param closingSource The source of the tab closure. */ public void closeTabGroup(LocalTabGroupId tabGroupId, @ClosingSource int closingSource) { LogUtils.log(TAG, "closeTabGroup " + tabGroupId); int rootId = TabGroupSyncUtils.getRootId(mTabGroupModelFilter, tabGroupId); assert rootId != Tab.INVALID_TAB_ID; + SavedTabGroup group = mTabGroupSyncService.getGroup(tabGroupId); + boolean isCollaboration = group != null && !TextUtils.isEmpty(group.collaborationId); + // Close the tabs. List<Tab> tabs = mTabGroupModelFilter.getRelatedTabListForRootId(rootId); getTabModel() .getTabRemover() - .forceCloseTabs(TabClosureParams.closeTabs(tabs).allowUndo(false).build()); + .forceCloseTabs( + TabClosureParams.closeTabs(tabs) + .allowUndo(false) + .saveToTabRestoreService(!isCollaboration) + .build()); // Remove mapping from service. Collect metrics before that. mTabGroupSyncService.removeLocalTabGroupMapping(tabGroupId, closingSource);
diff --git a/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/LocalTabGroupMutationHelperUnitTest.java b/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/LocalTabGroupMutationHelperUnitTest.java index 6c1cd9bb..4e6ea27 100644 --- a/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/LocalTabGroupMutationHelperUnitTest.java +++ b/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/LocalTabGroupMutationHelperUnitTest.java
@@ -72,20 +72,22 @@ private static final GURL TAB_URL_1 = new GURL("https://url1.com"); private static final GURL TAB_URL_2 = new GURL("https://url2.com"); private static final GURL UNSYNCABLE_URL_1 = new GURL("chrome://flags"); + private static final String COLLABORATION_ID = "collab_id"; @Rule public MockitoRule mMockitoRule = MockitoJUnit.rule(); @Mock private Profile mProfile; - private MockTabModel mTabModel; @Mock private TabRemover mTabRemover; @Mock private TabGroupModelFilter mTabGroupModelFilter; @Mock private TabGroupSyncService mTabGroupSyncService; @Mock private TabGroupSyncUtilsJni mTabGroupSyncUtilsJni; + + @Captor private ArgumentCaptor<EventDetails> mEventDetailsCaptor; + + private MockTabModel mTabModel; private LocalTabGroupMutationHelper mLocalMutationHelper; private TestTabCreationDelegate mTabCreationDelegate; - private Tab mTab1; private Tab mTab2; - private @Captor ArgumentCaptor<EventDetails> mEventDetailsCaptor; @Before public void setUp() { @@ -196,7 +198,11 @@ createOneSavedTabGroup(LOCAL_TAB_GROUP_ID_1, new Integer[] {null, null}); mLocalMutationHelper.updateTabGroup(savedTabGroup); - verify(mTabRemover).forceCloseTabs(argThat(params -> params.tabs.size() == 1)); + verify(mTabRemover) + .forceCloseTabs( + argThat( + params -> + params.tabs.size() == 1 && params.saveToTabRestoreService)); } @Test @@ -355,7 +361,21 @@ public void testCloseTabGroup() { mTabModel.addTab(TAB_ID_1); mLocalMutationHelper.closeTabGroup(LOCAL_TAB_GROUP_ID_1, ClosingSource.CLOSED_BY_USER); - verify(mTabRemover).forceCloseTabs(any()); + verify(mTabRemover).forceCloseTabs(argThat(params -> params.saveToTabRestoreService)); + verify(mTabGroupSyncService) + .removeLocalTabGroupMapping( + eq(LOCAL_TAB_GROUP_ID_1), eq(ClosingSource.CLOSED_BY_USER)); + } + + @Test + public void testCloseTabGroup_Collaboration() { + mTabModel.addTab(TAB_ID_1); + SavedTabGroup savedTabGroup = + createOneSavedTabGroup(LOCAL_TAB_GROUP_ID_1, new Integer[] {TAB_ID_1}); + savedTabGroup.collaborationId = COLLABORATION_ID; + when(mTabGroupSyncService.getGroup(LOCAL_TAB_GROUP_ID_1)).thenReturn(savedTabGroup); + mLocalMutationHelper.closeTabGroup(LOCAL_TAB_GROUP_ID_1, ClosingSource.CLOSED_BY_USER); + verify(mTabRemover).forceCloseTabs(argThat(params -> !params.saveToTabRestoreService)); verify(mTabGroupSyncService) .removeLocalTabGroupMapping( eq(LOCAL_TAB_GROUP_ID_1), eq(ClosingSource.CLOSED_BY_USER));
diff --git a/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelSelectorObserver.java b/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelSelectorObserver.java index 4c61624..1fa6387 100644 --- a/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelSelectorObserver.java +++ b/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelSelectorObserver.java
@@ -21,23 +21,12 @@ /** * Called when a tab is hidden to switch to another tab. + * * @param tab The tab that was hidden. */ default void onTabHidden(Tab tab) {} /** - * Called when a different tab model has been selected. - * - * @param newModel The newly selected tab model. - * @param oldModel The previously selected tab model. - * @deprecated prefer observing {@link TabModelSelector#getCurrentTabModelSupplier()}. - * Especially, if the only method on this observer that is required is to observe changes in - * {@link TabModel}. - */ - @Deprecated - default void onTabModelSelected(TabModel newModel, TabModel oldModel) {} - - /** * Called when the tab state has been initialized and the current tab count and tab model states * are reliable. */
diff --git a/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelUtils.java b/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelUtils.java index 9d27dcc..f06c6b4f 100644 --- a/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelUtils.java +++ b/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelUtils.java
@@ -134,41 +134,27 @@ * @param index The index of the {@link Tab} to select. */ public static void setIndex(TabModel model, int index) { - setIndex(model, index, TabSelectionType.FROM_USER); - } - - /** - * A helper method that allows specifying a {@link TabSelectionType} type to {@link - * TabModel#setIndex(int, TabSelectionType)}. - * - * @param model The {@link TabModel} to act on. - * @param index The index of the {@link Tab} to select. - * @param type {@link TabSelectionType} how the tab selection was initiated. - */ - public static void setIndex(TabModel model, int index, @TabSelectionType int type) { - model.setIndex(index, type); + model.setIndex(index, TabSelectionType.FROM_USER); } /** * Returns the most recently visited Tab in the specified TabList that is not {@code tabId}. * * @param model The {@link TabModel} to act on. - * @param tabId The ID of the {@link Tab} to skip or {@link Tab.INVALID_TAB_ID}. + * @param tabIdToSkip The ID of the {@link Tab} to skip or {@link Tab.INVALID_TAB_ID}. * @return the most recently visited Tab or null if none can be found. */ - public static Tab getMostRecentTab(TabList model, int tabId) { - Tab mostRecentTab = null; + public static Tab getMostRecentTab(TabList model, int tabIdToSkip) { + @Nullable Tab mostRecentTab = null; long mostRecentTabTime = 0; for (int i = 0; i < model.getCount(); i++) { - final Tab currentTab = model.getTabAt(i); - if (currentTab.getId() == tabId || currentTab.isClosing()) continue; + final Tab tab = model.getTabAt(i); + if (tab.getId() == tabIdToSkip || tab.isClosing()) continue; - final long currentTime = currentTab.getTimestampMillis(); - // TODO(b/301642179) Consider using Optional on Tab interface for getTimestampMillis() - // to signal that the timestamp is unknown. - if (currentTime != Tab.INVALID_TIMESTAMP && mostRecentTabTime < currentTime) { - mostRecentTabTime = currentTime; - mostRecentTab = currentTab; + final long timestamp = tab.getTimestampMillis(); + if (timestamp != Tab.INVALID_TIMESTAMP && mostRecentTabTime < timestamp) { + mostRecentTabTime = timestamp; + mostRecentTab = tab; } } return mostRecentTab; @@ -244,7 +230,7 @@ /** * @param tab The {@link Tab} to find the {@link TabGroupModelFilter} for. - * @return the associated {@link TabGroupModelFilter} if found. + * @return the associated {@link TabGroupModelFilter} if found or null. */ public static TabGroupModelFilter getTabGroupModelFilterByTab(@NonNull Tab tab) { final WindowAndroid windowAndroid = tab.getWindowAndroid(); @@ -281,17 +267,6 @@ return list; } - /** Converts a {@link TabList} to a {@link List<Integer>} tab ids. */ - public static @NonNull List<Integer> convertTabListToListOfTabIds(@Nullable TabList tabList) { - ArrayList<Integer> list = new ArrayList<>(); - if (tabList == null) return list; - - for (int i = 0; i < tabList.getCount(); i++) { - list.add(tabList.getTabAt(i).getId()); - } - return list; - } - /** Returns the list of Tabs for the given Tab IDs. */ public static List<Tab> getTabsById( Collection<Integer> tabIds, TabModel tabModel, boolean allowClosing) {
diff --git a/chrome/browser/touch_to_fill/password_manager/no_passkeys/internal/android/java/src/org/chromium/chrome/browser/touch_to_fill/no_passkeys/NoPasskeysBottomSheetRenderTest.java b/chrome/browser/touch_to_fill/password_manager/no_passkeys/internal/android/java/src/org/chromium/chrome/browser/touch_to_fill/no_passkeys/NoPasskeysBottomSheetRenderTest.java index 3c4b7f0f..3f820d9 100644 --- a/chrome/browser/touch_to_fill/password_manager/no_passkeys/internal/android/java/src/org/chromium/chrome/browser/touch_to_fill/no_passkeys/NoPasskeysBottomSheetRenderTest.java +++ b/chrome/browser/touch_to_fill/password_manager/no_passkeys/internal/android/java/src/org/chromium/chrome/browser/touch_to_fill/no_passkeys/NoPasskeysBottomSheetRenderTest.java
@@ -138,13 +138,7 @@ ScrimCoordinator scrimCoordinator = new ScrimCoordinator( getActivity(), - new ScrimCoordinator.SystemUiScrimDelegate() { - @Override - public void setStatusBarScrimFraction(float scrimFraction) {} - - @Override - public void setNavigationBarScrimFraction(float scrimFraction) {} - }, + /* systemUiScrimDelegate= */ null, activityContentView, Color.WHITE); return BottomSheetControllerFactory.createFullWidthBottomSheetController(
diff --git a/chrome/browser/tpcd/experiment/eligibility_service_browsertest.cc b/chrome/browser/tpcd/experiment/eligibility_service_browsertest.cc index 209e836..1dc926a 100644 --- a/chrome/browser/tpcd/experiment/eligibility_service_browsertest.cc +++ b/chrome/browser/tpcd/experiment/eligibility_service_browsertest.cc
@@ -11,6 +11,7 @@ #include "base/containers/contains.h" #include "base/metrics/histogram_base.h" #include "base/strings/strcat.h" +#include "base/strings/to_string.h" #include "base/test/metrics/histogram_tester.h" #include "base/test/scoped_feature_list.h" #include "chrome/browser/privacy_sandbox/privacy_sandbox_settings_factory.h" @@ -57,9 +58,9 @@ features::kCookieDeprecationFacilitatedTesting, {{"label", "label_test"}, {"force_eligible", "true"}, - {kDisable3PCookiesName, disable_3p_cookies ? "true" : "false"}, + {kDisable3PCookiesName, base::ToString(disable_3p_cookies)}, {kEnableSilentOnboardingName, - enable_silent_onboarding ? "true" : "false"}}); + base::ToString(enable_silent_onboarding)}}); } void SetUpOnMainThread() override {
diff --git a/chrome/browser/tpcd/experiment/eligibility_service_unittest.cc b/chrome/browser/tpcd/experiment/eligibility_service_unittest.cc index 521a93a..b372b5a 100644 --- a/chrome/browser/tpcd/experiment/eligibility_service_unittest.cc +++ b/chrome/browser/tpcd/experiment/eligibility_service_unittest.cc
@@ -10,6 +10,7 @@ #include "base/functional/bind.h" #include "base/memory/raw_ptr.h" +#include "base/strings/to_string.h" #include "base/test/gmock_callback_support.h" #include "base/test/metrics/histogram_tester.h" #include "base/test/scoped_feature_list.h" @@ -184,7 +185,7 @@ EligibilityServiceOTRProfileTest() { feature_list_.InitAndEnableFeatureWithParameters( features::kCookieDeprecationFacilitatedTesting, - {{"enable_otr_profiles", GetParam() ? "true" : "false"}}); + {{"enable_otr_profiles", base::ToString(GetParam())}}); } private:
diff --git a/chrome/browser/tpcd/experiment/experiment_manager_impl_browsertest.cc b/chrome/browser/tpcd/experiment/experiment_manager_impl_browsertest.cc index b7923bf..447dafc 100644 --- a/chrome/browser/tpcd/experiment/experiment_manager_impl_browsertest.cc +++ b/chrome/browser/tpcd/experiment/experiment_manager_impl_browsertest.cc
@@ -10,6 +10,7 @@ #include "base/location.h" #include "base/run_loop.h" +#include "base/strings/to_string.h" #include "base/task/single_thread_task_runner.h" #include "base/task/task_runner.h" #include "base/test/scoped_feature_list.h" @@ -63,11 +64,11 @@ features::kCookieDeprecationFacilitatedTesting, {{"label", kEligibleGroupName}, {"synthetic_trial_group_override", group_name_override}, - {kDisable3PCookiesName, disable_3pcs ? "true" : "false"}, + {kDisable3PCookiesName, base::ToString(disable_3pcs)}, {kNeedOnboardingForSyntheticTrialName, - need_onboarding ? "true" : "false"}, + base::ToString(need_onboarding)}, {kEnableSilentOnboardingName, - enable_silent_onboarding ? "true" : "false"}}); + base::ToString(enable_silent_onboarding)}}); } void Wait() {
diff --git a/chrome/browser/tpcd/experiment/experiment_manager_impl_unittest.cc b/chrome/browser/tpcd/experiment/experiment_manager_impl_unittest.cc index e6f282b..815ac6111 100644 --- a/chrome/browser/tpcd/experiment/experiment_manager_impl_unittest.cc +++ b/chrome/browser/tpcd/experiment/experiment_manager_impl_unittest.cc
@@ -4,6 +4,7 @@ #include "chrome/browser/tpcd/experiment/experiment_manager_impl.h" +#include "base/strings/to_string.h" #include "base/test/bind.h" #include "base/test/mock_callback.h" #include "base/test/scoped_feature_list.h" @@ -342,7 +343,7 @@ base::test::ScopedFeatureList feature_list; feature_list.InitAndEnableFeatureWithParameters( features::kCookieDeprecationFacilitatedTesting, - {{kDisable3PCookiesName, disable_3p_cookies ? "true" : "false"}, + {{kDisable3PCookiesName, base::ToString(disable_3p_cookies)}, {kNeedOnboardingForSyntheticTrialName, "true"}, {kEnableSilentOnboardingName, "true"}}); @@ -402,11 +403,11 @@ base::test::ScopedFeatureList scope_feature_list; scope_feature_list.InitAndEnableFeatureWithParameters( features::kCookieDeprecationFacilitatedTesting, - {{kDisable3PCookiesName, disable_3p_cookies ? "true" : "false"}, + {{kDisable3PCookiesName, base::ToString(disable_3p_cookies)}, {kNeedOnboardingForSyntheticTrialName, - test_case.need_onboarding ? "true" : "false"}, + base::ToString(test_case.need_onboarding)}, {kEnableSilentOnboardingName, - test_case.enable_silent_onboarding ? "true" : "false"}}); + base::ToString(test_case.enable_silent_onboarding)}}); prefs().SetInteger(prefs::kTPCDExperimentClientState, static_cast<int>(test_case.experiment_state));
diff --git a/chrome/browser/trusted_vault/trusted_vault_client_android.cc b/chrome/browser/trusted_vault/trusted_vault_client_android.cc index 133f8c04..9ff758d4 100644 --- a/chrome/browser/trusted_vault/trusted_vault_client_android.cc +++ b/chrome/browser/trusted_vault/trusted_vault_client_android.cc
@@ -158,14 +158,11 @@ const RequestId request_id = RegisterNewOngoingRequest(OngoingFetchKeys(account_info, std::move(cb))); - JNIEnv* const env = base::android::AttachCurrentThread(); - const base::android::ScopedJavaLocalRef<jobject> java_account_info = - ConvertToJavaCoreAccountInfo(env, account_info); - // Trigger the fetching keys from the implementation in Java, which will // eventually call FetchKeysCompleted(). - Java_TrustedVaultClient_fetchKeys(env, reinterpret_cast<intptr_t>(this), - request_id, java_account_info); + Java_TrustedVaultClient_fetchKeys(base::android::AttachCurrentThread(), + reinterpret_cast<intptr_t>(this), + request_id, account_info); } void TrustedVaultClientAndroid::StoreKeys( @@ -187,14 +184,11 @@ const RequestId request_id = RegisterNewOngoingRequest(OngoingMarkLocalKeysAsStale(std::move(cb))); - JNIEnv* const env = base::android::AttachCurrentThread(); - const base::android::ScopedJavaLocalRef<jobject> java_account_info = - ConvertToJavaCoreAccountInfo(env, account_info); - // The Java implementation will eventually call // MarkLocalKeysAsStaleCompleted(). Java_TrustedVaultClient_markLocalKeysAsStale( - env, reinterpret_cast<intptr_t>(this), request_id, java_account_info); + base::android::AttachCurrentThread(), reinterpret_cast<intptr_t>(this), + request_id, account_info); } void TrustedVaultClientAndroid::GetIsRecoverabilityDegraded( @@ -208,14 +202,11 @@ const RequestId request_id = RegisterNewOngoingRequest( OngoingGetIsRecoverabilityDegraded(std::move(cb))); - JNIEnv* const env = base::android::AttachCurrentThread(); - const base::android::ScopedJavaLocalRef<jobject> java_account_info = - ConvertToJavaCoreAccountInfo(env, account_info); - // The Java implementation will eventually call // MarkLocalKeysAsStaleCompleted(). Java_TrustedVaultClient_getIsRecoverabilityDegraded( - env, reinterpret_cast<intptr_t>(this), request_id, java_account_info); + base::android::AttachCurrentThread(), reinterpret_cast<intptr_t>(this), + request_id, account_info); } void TrustedVaultClientAndroid::AddTrustedRecoveryMethod( @@ -244,16 +235,13 @@ RegisterNewOngoingRequest(OngoingAddTrustedRecoveryMethod(std::move(cb))); JNIEnv* const env = base::android::AttachCurrentThread(); - const base::android::ScopedJavaLocalRef<jobject> java_account_info = - ConvertToJavaCoreAccountInfo(env, account_info); - const base::android::ScopedJavaLocalRef<jbyteArray> java_public_key = base::android::ToJavaByteArray(env, public_key); // The Java implementation will eventually call // AddTrustedRecoveryMethodCompleted(). Java_TrustedVaultClient_addTrustedRecoveryMethod( - env, reinterpret_cast<intptr_t>(this), request_id, java_account_info, + env, reinterpret_cast<intptr_t>(this), request_id, account_info, java_public_key, method_type_hint); }
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn index a6d93fe8b..04a41ce 100644 --- a/chrome/browser/ui/BUILD.gn +++ b/chrome/browser/ui/BUILD.gn
@@ -3201,6 +3201,8 @@ "views/profiles/profile_picker_dice_sign_in_provider.h", "views/profiles/profile_picker_dice_sign_in_toolbar.cc", "views/profiles/profile_picker_dice_sign_in_toolbar.h", + "views/profiles/profile_picker_glic_flow_controller.cc", + "views/profiles/profile_picker_glic_flow_controller.h", "views/promos/autofill_bubble_signin_promo_view.cc", "views/promos/autofill_bubble_signin_promo_view.h", "webui/signin/batch_upload_handler.cc",
diff --git a/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/SigninAccountPickerCoordinator.java b/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/SigninAccountPickerCoordinator.java index 81ef433d..2ca3e24 100644 --- a/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/SigninAccountPickerCoordinator.java +++ b/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/SigninAccountPickerCoordinator.java
@@ -142,9 +142,6 @@ public void setScrimColor(@ColorInt int scrimColor) { mDelegate.setScrimColor(scrimColor); } - - @Override - public void setNavigationBarScrimFraction(float scrimFraction) {} }, (ViewGroup) sheetContainer.getParent(), scrimColor);
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarCoordinator.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarCoordinator.java index 2eaeb81d..586be8f 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarCoordinator.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarCoordinator.java
@@ -266,7 +266,7 @@ ObservableSupplier<Tab> tabSupplier, BrowserControlsVisibilityManager browserControlsVisibilityManager, TopUiThemeColorProvider topUiThemeColorProvider, - Supplier<Integer> bottomToolbarControlsOffsetSupplier) { + ObservableSupplier<Integer> bottomToolbarControlsOffsetSupplier) { assert mTabModelSelectorSupplier.get() != null; mTrackerSupplier.set(TrackerFactory.getTrackerForProfile(profile)); mToolbarLayout.setTabCountSupplier(
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarOverlayCoordinator.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarOverlayCoordinator.java index 8d4b325..a9b53fe 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarOverlayCoordinator.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarOverlayCoordinator.java
@@ -51,7 +51,7 @@ BrowserControlsStateProvider browserControlsStateProvider, Supplier<ResourceManager> resourceManagerSupplier, TopUiThemeColorProvider topUiThemeColorProvider, - Supplier<Integer> bottomToolbarControlsOffsetSupplier, + ObservableSupplier<Integer> bottomToolbarControlsOffsetSupplier, int layoutsToShowOn, boolean isVisibilityManuallyControlled) { // If BCIV is enabled, we always show the hairline on the composited
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarOverlayMediator.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarOverlayMediator.java index 16d5432..fdeb732 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarOverlayMediator.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarOverlayMediator.java
@@ -12,7 +12,6 @@ import org.chromium.base.Callback; import org.chromium.base.ResettersForTesting; import org.chromium.base.supplier.ObservableSupplier; -import org.chromium.base.supplier.Supplier; import org.chromium.cc.input.BrowserControlsOffsetTagsInfo; import org.chromium.cc.input.BrowserControlsState; import org.chromium.chrome.browser.browser_controls.BrowserControlsStateProvider; @@ -65,7 +64,7 @@ /** The view state for this overlay. */ private final PropertyModel mModel; - private final Supplier<Integer> mBottomToolbarControlsOffsetSupplier; + private final ObservableSupplier<Integer> mBottomToolbarControlsOffsetSupplier; /** Whether visibility is controlled internally or manually by the feature. */ private boolean mIsVisibilityManuallyControlled; @@ -93,7 +92,7 @@ ObservableSupplier<Tab> tabSupplier, BrowserControlsStateProvider browserControlsStateProvider, TopUiThemeColorProvider topUiThemeColorProvider, - Supplier<Integer> bottomToolbarControlsOffsetSupplier, + ObservableSupplier<Integer> bottomToolbarControlsOffsetSupplier, int layoutsToShowOn, boolean manualVisibilityControl) { mContext = context; @@ -103,6 +102,7 @@ mTopUiThemeColorProvider = topUiThemeColorProvider; mModel = model; mBottomToolbarControlsOffsetSupplier = bottomToolbarControlsOffsetSupplier; + mBottomToolbarControlsOffsetSupplier.addObserver((unused) -> updateContentOffset(false)); mIsVisibilityManuallyControlled = manualVisibilityControl; mIsOnValidLayout = (mLayoutStateProvider.getActiveLayoutType() & layoutsToShowOn) > 0; mTabSupplier = tabSupplier;
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarOverlayMediatorTest.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarOverlayMediatorTest.java index 18b7208..cc821a9 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarOverlayMediatorTest.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarOverlayMediatorTest.java
@@ -24,6 +24,7 @@ import org.chromium.base.Callback; import org.chromium.base.MathUtils; import org.chromium.base.supplier.ObservableSupplier; +import org.chromium.base.supplier.ObservableSupplierImpl; import org.chromium.base.test.BaseRobolectricTestRunner; import org.chromium.base.test.util.Features.DisableFeatures; import org.chromium.base.test.util.Features.EnableFeatures; @@ -65,7 +66,8 @@ @Mock private ObservableSupplier<Tab> mTabSupplier; @Captor private ArgumentCaptor<Callback<Tab>> mActivityTabObserverCaptor; - private int mBottomControlsOffset; + private ObservableSupplierImpl<Integer> mBottomControlsOffsetSupplier = + new ObservableSupplierImpl<>(0); @Before public void beforeTest() { @@ -98,7 +100,7 @@ mTabSupplier, mBrowserControlsProvider, mTopUiThemeColorProvider, - () -> mBottomControlsOffset, + mBottomControlsOffsetSupplier, LayoutType.BROWSING, false); @@ -183,7 +185,7 @@ mTabSupplier, mBrowserControlsProvider, mTopUiThemeColorProvider, - () -> mBottomControlsOffset, + mBottomControlsOffsetSupplier, LayoutType.BROWSING, false); mMediator.setIsAndroidViewVisible(true); @@ -285,7 +287,7 @@ public void testBottomToolbarOffset() { float height = 700.0f; mMediator.setViewportHeight(height); - mBottomControlsOffset = -40; + mBottomControlsOffsetSupplier.set(-40); doReturn(ControlsPosition.TOP).when(mBrowserControlsProvider).getControlsPosition(); mBrowserControlsObserverCaptor @@ -300,7 +302,7 @@ .onControlsOffsetChanged(0, 0, false, 30, 0, false, false, false); Assert.assertEquals( - height + mBottomControlsOffset, + height + mBottomControlsOffsetSupplier.get(), mModel.get(TopToolbarOverlayProperties.CONTENT_OFFSET), MathUtils.EPSILON); @@ -308,7 +310,13 @@ mMediator.setViewportHeight(newHeight); Assert.assertEquals( - newHeight + mBottomControlsOffset, + newHeight + mBottomControlsOffsetSupplier.get(), + mModel.get(TopToolbarOverlayProperties.CONTENT_OFFSET), + MathUtils.EPSILON); + + mBottomControlsOffsetSupplier.set(-80); + Assert.assertEquals( + newHeight + mBottomControlsOffsetSupplier.get(), mModel.get(TopToolbarOverlayProperties.CONTENT_OFFSET), MathUtils.EPSILON); }
diff --git a/chrome/browser/ui/bookmarks/bookmark_ui_operations_helper.cc b/chrome/browser/ui/bookmarks/bookmark_ui_operations_helper.cc index dd02391..89ed42a7 100644 --- a/chrome/browser/ui/bookmarks/bookmark_ui_operations_helper.cc +++ b/chrome/browser/ui/bookmarks/bookmark_ui_operations_helper.cc
@@ -46,40 +46,6 @@ return GURL(url_text); } -// Updates `title` such that `url` and `title` pair are unique among the -// children of `parent`. -void MakeTitleUnique( - const BookmarkModel* model, - const std::vector<std::unique_ptr<bookmarks::BookmarkNode>>& - target_parent_children, - const GURL& url, - std::u16string* title) { - std::unordered_set<std::u16string> titles; - std::u16string original_title_lower = base::i18n::ToLower(*title); - for (const auto& node : target_parent_children) { - if (node->is_url() && (url == node->url()) && - base::StartsWith(base::i18n::ToLower(node->GetTitle()), - original_title_lower, base::CompareCase::SENSITIVE)) { - titles.insert(node->GetTitle()); - } - } - - if (titles.find(*title) == titles.end()) { - return; - } - - for (size_t i = 0; i < titles.size(); i++) { - const std::u16string new_title(*title + - base::ASCIIToUTF16(base::StringPrintf( - " (%lu)", (unsigned long)(i + 1)))); - if (titles.find(new_title) == titles.end()) { - *title = new_title; - return; - } - } - NOTREACHED(); -} - // This traces node up to root, determines if it is a descendant of one of // selected nodes. bool HasAncestorInSelectedNodes( @@ -241,17 +207,48 @@ node.SetTitle(base::ASCIIToUTF16(url.spec())); bookmark_data = BookmarkNodeData(&node); } - CHECK_LE(index, target_parent()->children().size()); + CHECK_LE(index, target_parent()->GetChildrenCount()); if (bookmark_data.size() == 1 && model()->IsBookmarked(bookmark_data.elements[0].url)) { - MakeTitleUnique(model(), target_parent()->children(), - bookmark_data.elements[0].url, + MakeTitleUnique(bookmark_data.elements[0].url, &bookmark_data.elements[0].title); } CopyBookmarkNodeData(bookmark_data, index); } +void BookmarkUIOperationsHelper::MakeTitleUnique(const GURL& url, + std::u16string* title) const { + const TargetParent* parent = target_parent(); + CHECK(parent); + std::unordered_set<std::u16string> titles; + std::u16string original_title_lower = base::i18n::ToLower(*title); + const size_t children_size = parent->GetChildrenCount(); + for (size_t i = 0; i < children_size; i++) { + const BookmarkNode* node = parent->GetNodeAtIndex(i); + if (node->is_url() && (url == node->url()) && + base::StartsWith(base::i18n::ToLower(node->GetTitle()), + original_title_lower, base::CompareCase::SENSITIVE)) { + titles.insert(node->GetTitle()); + } + } + + if (titles.find(*title) == titles.end()) { + return; + } + + for (size_t i = 0; i < titles.size(); i++) { + const std::u16string new_title(*title + + base::ASCIIToUTF16(base::StringPrintf( + " (%lu)", (unsigned long)(i + 1)))); + if (titles.find(new_title) == titles.end()) { + *title = new_title; + return; + } + } + NOTREACHED(); +} + } // namespace internal // BookmarkUIOperationsHelperNonMergedSurfaces::TargetParent: @@ -303,9 +300,17 @@ return parent_->type(); } -const std::vector<std::unique_ptr<bookmarks::BookmarkNode>>& -BookmarkUIOperationsHelperNonMergedSurfaces::TargetParent::children() const { - return parent_->children(); +const bookmarks::BookmarkNode* +BookmarkUIOperationsHelperNonMergedSurfaces::TargetParent::GetNodeAtIndex( + size_t index) const { + CHECK_LE(index, GetChildrenCount()); + return parent_->children()[index].get(); +} + +size_t +BookmarkUIOperationsHelperNonMergedSurfaces::TargetParent::GetChildrenCount() + const { + return parent_->children().size(); } // BookmarkUIOperationsHelperNonMergedSurfaces: @@ -430,9 +435,19 @@ NOTREACHED(); } -const std::vector<std::unique_ptr<bookmarks::BookmarkNode>>& -BookmarkUIOperationsHelperMergedSurfaces::TargetParent::children() const { - return merged_surface_service_->GetChildren(*parent_); +const bookmarks::BookmarkNode* +BookmarkUIOperationsHelperMergedSurfaces::TargetParent::GetNodeAtIndex( + size_t index) const { + CHECK(parent_); + CHECK_LE(index, GetChildrenCount()); + return merged_surface_service_->GetNodeAtIndex(*parent_, index); +} + +size_t +BookmarkUIOperationsHelperMergedSurfaces::TargetParent::GetChildrenCount() + const { + CHECK(parent_); + return merged_surface_service_->GetChildrenCount(*parent_); } // BookmarkUIOperationsHelperMergedSurfaces:
diff --git a/chrome/browser/ui/bookmarks/bookmark_ui_operations_helper.h b/chrome/browser/ui/bookmarks/bookmark_ui_operations_helper.h index 7efab5d..c02bf41b 100644 --- a/chrome/browser/ui/bookmarks/bookmark_ui_operations_helper.h +++ b/chrome/browser/ui/bookmarks/bookmark_ui_operations_helper.h
@@ -86,8 +86,9 @@ virtual bool IsPermanentNode() const = 0; virtual bool IsDirectChild(const bookmarks::BookmarkNode* node) const = 0; virtual bookmarks::BookmarkNode::Type GetType() const = 0; - virtual const std::vector<std::unique_ptr<bookmarks::BookmarkNode>>& - children() const = 0; + virtual const bookmarks::BookmarkNode* GetNodeAtIndex( + size_t index) const = 0; + virtual size_t GetChildrenCount() const = 0; }; virtual bookmarks::BookmarkModel* model() = 0; @@ -106,6 +107,10 @@ bool remove_nodes, bookmarks::metrics::BookmarkEditSource source, bool is_off_the_record); + + // Updates `title` such that `url` and `title` pair are unique among the + // children of `target_parent()`. + void MakeTitleUnique(const GURL& url, std::u16string* title) const; }; } // namespace internal @@ -159,8 +164,8 @@ bool IsPermanentNode() const override; bool IsDirectChild(const bookmarks::BookmarkNode* node) const override; bookmarks::BookmarkNode::Type GetType() const override; - const std::vector<std::unique_ptr<bookmarks::BookmarkNode>>& children() - const override; + const bookmarks::BookmarkNode* GetNodeAtIndex(size_t index) const override; + size_t GetChildrenCount() const override; private: const raw_ptr<const bookmarks::BookmarkNode> parent_; @@ -226,8 +231,8 @@ bool IsPermanentNode() const override; bool IsDirectChild(const bookmarks::BookmarkNode* node) const override; bookmarks::BookmarkNode::Type GetType() const override; - const std::vector<std::unique_ptr<bookmarks::BookmarkNode>>& children() - const override; + const bookmarks::BookmarkNode* GetNodeAtIndex(size_t index) const override; + size_t GetChildrenCount() const override; private: const raw_ptr<BookmarkMergedSurfaceService> merged_surface_service_;
diff --git a/chrome/browser/ui/color/chrome_color_id.h b/chrome/browser/ui/color/chrome_color_id.h index 7c375cf..32e44cda 100644 --- a/chrome/browser/ui/color/chrome_color_id.h +++ b/chrome/browser/ui/color/chrome_color_id.h
@@ -218,7 +218,6 @@ E_CPONLY(kColorNewTabButtonInkDropFrameActive) \ E_CPONLY(kColorNewTabButtonInkDropFrameInactive) \ E_CPONLY(kColorTabStripComboButtonSeparator) \ - E_CPONLY(kColorTabStripComboButtonSeparatorOnHeader) \ E_CPONLY(kColorTabStripControlButtonInkDrop) \ E_CPONLY(kColorTabStripControlButtonInkDropRipple) \ /* New tab button colors for ChromeRefresh.*/ \
diff --git a/chrome/browser/ui/color/material_tab_strip_color_mixer.cc b/chrome/browser/ui/color/material_tab_strip_color_mixer.cc index 24dca72..7c89201 100644 --- a/chrome/browser/ui/color/material_tab_strip_color_mixer.cc +++ b/chrome/browser/ui/color/material_tab_strip_color_mixer.cc
@@ -38,8 +38,6 @@ mixer[kColorTabBackgroundInactiveHoverFrameActive] = { ui::kColorSysStateHeaderHover}; mixer[kColorTabStripComboButtonSeparator] = {ui::kColorSysDivider}; - mixer[kColorTabStripComboButtonSeparatorOnHeader] = { - ui::kColorSysOnHeaderDivider}; mixer[kColorTabStripControlButtonInkDrop] = {ui::kColorSysStateHeaderHover}; mixer[kColorTabStripControlButtonInkDropRipple] = { ui::kColorSysStateRippleNeutralOnSubtle};
diff --git a/chrome/browser/ui/color/new_tab_page_color_mixer.cc b/chrome/browser/ui/color/new_tab_page_color_mixer.cc index 0cb1a4b..95922b2 100644 --- a/chrome/browser/ui/color/new_tab_page_color_mixer.cc +++ b/chrome/browser/ui/color/new_tab_page_color_mixer.cc
@@ -5,6 +5,7 @@ #include "chrome/browser/ui/color/new_tab_page_color_mixer.h" #include "base/logging.h" +#include "base/strings/to_string.h" #include "chrome/browser/ui/color/chrome_color_id.h" #include "chrome/browser/ui/color/chrome_color_provider_utils.h" #include "chrome/common/themes/autogenerated_theme_util.h" @@ -81,8 +82,8 @@ DVLOG(2) << "ColorTransform SelectBasedOnNtpBackground:" << " Input Color: " << ui::SkColorName(input_color) << " Input Transform: " << ui::SkColorName(color) - << " IsWhite: " << (color == SK_ColorWHITE ? "true" : "false") - << " IsBlack: " << (color == SK_ColorBLACK ? "true" : "false") + << " IsWhite: " << base::ToString(color == SK_ColorWHITE) + << " IsBlack: " << base::ToString(color == SK_ColorBLACK) << " Result Color: " << ui::SkColorName(result_color); return result_color; }; @@ -109,7 +110,7 @@ DVLOG(2) << "ColorTransform SelectBasedOnWhiteInput:" << " Input Color: " << ui::SkColorName(input_color) << " Input Transform: " << ui::SkColorName(color) - << " IsWhite: " << (color == SK_ColorWHITE ? "true" : "false") + << " IsWhite: " << base::ToString(color == SK_ColorWHITE) << " Result Color: " << ui::SkColorName(result_color); return result_color; };
diff --git a/chrome/browser/ui/color/tab_strip_color_mixer.cc b/chrome/browser/ui/color/tab_strip_color_mixer.cc index 6acfba9..ee5c3e7 100644 --- a/chrome/browser/ui/color/tab_strip_color_mixer.cc +++ b/chrome/browser/ui/color/tab_strip_color_mixer.cc
@@ -203,7 +203,6 @@ mixer[kColorTabSearchButtonCRForegroundFrameInactive] = { kColorToolbarButtonIconInactive}; mixer[kColorTabStripComboButtonSeparator] = {ui::kColorSeparator}; - mixer[kColorTabStripComboButtonSeparatorOnHeader] = {ui::kColorSeparator}; mixer[kColorTabStripControlButtonInkDrop] = ui::SetAlpha( kColorNewTabButtonInkDropFrameActive, std::ceil(0.16f * 255.0f)); mixer[kColorTabStripControlButtonInkDropRipple] = ui::SetAlpha(
diff --git a/chrome/browser/ui/fullscreen_keyboard_browsertest_base.cc b/chrome/browser/ui/fullscreen_keyboard_browsertest_base.cc index 3a1fb9f..3237d0d0 100644 --- a/chrome/browser/ui/fullscreen_keyboard_browsertest_base.cc +++ b/chrome/browser/ui/fullscreen_keyboard_browsertest_base.cc
@@ -8,6 +8,7 @@ #include <string> #include "base/strings/string_util.h" +#include "base/strings/to_string.h" #include "build/build_config.h" #include "build/chromeos_buildflags.h" #include "chrome/app/chrome_command_ids.h" @@ -172,12 +173,12 @@ expected_result_ += ui::KeycodeConverter::DomCodeToCodeString( ui::UsLayoutKeyboardCodeToDomCode(key)); expected_result_ += " ctrl:"; - expected_result_ += control_modifier ? "true" : "false"; + expected_result_ += base::ToString(control_modifier); expected_result_ += " shift:"; - expected_result_ += shift ? "true" : "false"; + expected_result_ += base::ToString(shift); expected_result_ += " alt:false"; expected_result_ += " meta:"; - expected_result_ += command_modifier ? "true" : "false"; + expected_result_ += base::ToString(command_modifier); expected_result_ += '\n'; }
diff --git a/chrome/browser/ui/passwords/bubble_controllers/password_change/password_change_info_bubble_controller.cc b/chrome/browser/ui/passwords/bubble_controllers/password_change/password_change_info_bubble_controller.cc index f150945..143199c 100644 --- a/chrome/browser/ui/passwords/bubble_controllers/password_change/password_change_info_bubble_controller.cc +++ b/chrome/browser/ui/passwords/bubble_controllers/password_change/password_change_info_bubble_controller.cc
@@ -14,7 +14,6 @@ #include "chrome/browser/ui/passwords/ui_utils.h" #include "chrome/browser/ui/views/passwords/password_bubble_view_base.h" #include "chrome/grit/generated_resources.h" -#include "components/url_formatter/elide_url.h" #include "ui/base/l10n/l10n_util.h" PasswordChangeInfoBubbleController::PasswordChangeInfoBubbleController( @@ -79,9 +78,7 @@ } std::u16string PasswordChangeInfoBubbleController::GetDisplayOrigin() { - return url_formatter::FormatUrlForSecurityDisplay( - password_change_delegate_->GetChangePasswordUrl(), - url_formatter::SchemeDisplay::OMIT_CRYPTOGRAPHIC); + return password_change_delegate_->GetDisplayOrigin(); } void PasswordChangeInfoBubbleController::OnGooglePasswordManagerLinkClicked() {
diff --git a/chrome/browser/ui/passwords/bubble_controllers/password_change/successful_password_change_bubble_controller.cc b/chrome/browser/ui/passwords/bubble_controllers/password_change/successful_password_change_bubble_controller.cc index d696452..a7181e1 100644 --- a/chrome/browser/ui/passwords/bubble_controllers/password_change/successful_password_change_bubble_controller.cc +++ b/chrome/browser/ui/passwords/bubble_controllers/password_change/successful_password_change_bubble_controller.cc
@@ -65,19 +65,16 @@ std::u16string SuccessfulPasswordChangeBubbleController::GetDisplayOrigin() const { - // TODO(crbug.com/381054978): Return correct domain. - return u"demo.com"; + return password_change_delegate_->GetDisplayOrigin(); } std::u16string SuccessfulPasswordChangeBubbleController::GetUsername() const { - // TODO(crbug.com/381054978): Return correct username. - return u"elisa.buckett@gmail.com"; + return password_change_delegate_->GetUsername(); } std::u16string SuccessfulPasswordChangeBubbleController::GetNewPassword() const { - // TODO(crbug.com/381054978): Return correct password. - return u"cE1L45Vgxyzlu8"; + return password_change_delegate_->GetGeneratedPassword(); } base::WeakPtr<SuccessfulPasswordChangeBubbleController>
diff --git a/chrome/browser/ui/profiles/profile_picker.h b/chrome/browser/ui/profiles/profile_picker.h index 49283c15..7bf11d7 100644 --- a/chrome/browser/ui/profiles/profile_picker.h +++ b/chrome/browser/ui/profiles/profile_picker.h
@@ -219,14 +219,22 @@ // without signing in. // `profile_color` is the profile's color. It is undefined for the default // theme. - // `profile_picked_time_on_startup` is the time when the user picked a - // profile to open, to measure browser startup performance. It is only set - // when the picker is shown on startup. static void SwitchToSignedOutPostIdentityFlow( std::optional<SkColor> profile_color, - base::TimeTicks profile_picked_time_on_startup, base::OnceCallback<void(bool)> switch_finished_callback); + struct ProfilePickingArgs { + // Opens the settings page of the profile once it is first picked. + bool open_settings = false; + // Whether we are recording timing metrics about loading the profile and + // opening the first web content. + bool should_record_startup_metrics = false; + }; + + // Picks the profile with `profile_path`. + static void PickProfile(const base::FilePath& profile_path, + ProfilePickingArgs args); + // Cancel the signed-in flow and returns back to the main picker screen (if // the original EntryPoint was to open the picker). Must only be called from // within the signed-in flow. This will delete the profile previously created @@ -236,10 +244,6 @@ // Returns the path of the default profile used for rendering the picker. static base::FilePath GetPickerProfilePath(); - // Getter of the target page url. If not empty and is valid, it opens on - // profile selection instead of the new tab page. - static GURL GetOnSelectProfileTargetUrl(); - // Getter of the path of profile which is displayed on the profile switch // screen. static base::FilePath GetSwitchProfilePath();
diff --git a/chrome/browser/ui/settings_window_manager_chromeos.cc b/chrome/browser/ui/settings_window_manager_chromeos.cc index e76a0785..48e1da81 100644 --- a/chrome/browser/ui/settings_window_manager_chromeos.cc +++ b/chrome/browser/ui/settings_window_manager_chromeos.cc
@@ -4,7 +4,6 @@ #include "chrome/browser/ui/settings_window_manager_chromeos.h" -#include "ash/constants/ash_features.h" #include "ash/public/cpp/resources/grit/ash_public_unscaled_resources.h" #include "ash/webui/system_apps/public/system_web_app_type.h" #include "ash/wm/window_properties.h" @@ -66,8 +65,7 @@ } // Use deprecated settings window in Kiosk session only if SWA is disabled. - if (IsRunningInForcedAppMode() && - !base::FeatureList::IsEnabled(ash::features::kKioskEnableSystemWebApps)) { + if (IsRunningInForcedAppMode()) { return true; }
diff --git a/chrome/browser/ui/views/autofill/popup/popup_view_views_browsertest.cc b/chrome/browser/ui/views/autofill/popup/popup_view_views_browsertest.cc index 379070d..2868d9ba 100644 --- a/chrome/browser/ui/views/autofill/popup/popup_view_views_browsertest.cc +++ b/chrome/browser/ui/views/autofill/popup/popup_view_views_browsertest.cc
@@ -532,8 +532,8 @@ FormData form = autofill::test::CreateTestSignupFormData(); return generator.GetSuggestions( affiliated_plus_addresses, - /*is_creation_enabled=*/true, form, /*form_field_type_groups=*/{}, - PasswordFormClassification(), form.fields()[0].global_id(), + /*is_creation_enabled=*/true, form, form.fields()[0], + /*form_field_type_groups=*/{}, PasswordFormClassification(), AutofillSuggestionTriggerSource::kFormControlElementClicked); }
diff --git a/chrome/browser/ui/views/bookmarks/bookmark_menu_delegate.cc b/chrome/browser/ui/views/bookmarks/bookmark_menu_delegate.cc index 2091fa8f..1fa7c01 100644 --- a/chrome/browser/ui/views/bookmarks/bookmark_menu_delegate.cc +++ b/chrome/browser/ui/views/bookmarks/bookmark_menu_delegate.cc
@@ -19,6 +19,7 @@ #include "chrome/browser/bookmarks/bookmark_merged_surface_service.h" #include "chrome/browser/bookmarks/bookmark_merged_surface_service_factory.h" #include "chrome/browser/bookmarks/bookmark_model_factory.h" +#include "chrome/browser/bookmarks/bookmark_parent_folder_children.h" #include "chrome/browser/bookmarks/managed_bookmark_service_factory.h" #include "chrome/browser/favicon/favicon_utils.h" #include "chrome/browser/profiles/profile.h" @@ -332,9 +333,9 @@ MenuItemView* parent_menu = node_to_menu->second; // Remove obsolete bookmark menus if the start index increased. - const auto& children = service->GetChildren(folder); + BookmarkParentFolderChildren children = service->GetChildren(folder); for (size_t idx = prev_start_idx; idx < start_index; ++idx) { - const BookmarkNode* child_node = children[idx].get(); + const BookmarkNode* child_node = children[idx]; if (auto child_node_to_menu = node_to_menu_map_.find(BookmarkFolderOrURL(child_node)); child_node_to_menu != node_to_menu_map_.end()) { @@ -344,7 +345,7 @@ // Add missing bookmark menus if the start index decreased. for (size_t idx = start_index; idx < prev_start_idx; ++idx) { - const BookmarkNode* child_node = children[idx].get(); + const BookmarkNode* child_node = children[idx]; AddBookmarkNode(child_node, parent_menu, idx); } @@ -1053,10 +1054,11 @@ } const ui::ImageModel folder_icon = chrome::GetBookmarkFolderIcon( chrome::BookmarkFolderIconType::kNormal, ui::kColorMenuIcon); - const auto& children = GetBookmarkMergedSurfaceService()->GetChildren(folder); - for (auto i = children.cbegin() + start_child_index; i != children.cend(); + BookmarkParentFolderChildren children = + GetBookmarkMergedSurfaceService()->GetChildren(folder); + for (auto i = children.begin() + start_child_index; i != children.end(); ++i) { - BuildNodeMenuItem(i->get(), menu); + BuildNodeMenuItem(*i, menu); } AddMenuToMaps(menu, BookmarkFolderOrURL(folder)); built_nodes_.insert(folder);
diff --git a/chrome/browser/ui/views/download/bubble/download_bubble_row_view.cc b/chrome/browser/ui/views/download/bubble/download_bubble_row_view.cc index 045c2185..8446a7a 100644 --- a/chrome/browser/ui/views/download/bubble/download_bubble_row_view.cc +++ b/chrome/browser/ui/views/download/bubble/download_bubble_row_view.cc
@@ -345,14 +345,7 @@ fixed_width_(fixed_width) { CHECK(info_->model()); info_->AddObserver(this); - gfx::Insets insets = GetLayoutInsets(DOWNLOAD_ROW); - // The DeepScanNotice has a background that extends into the insets on the - // left and right. To support this, we include vertical insets here, and the - // left and right inset are manually handled as columns in the table - // layout. This is temporary until the DeepScanNotice is removed. (Targeting - // 2024-10) - SetBorder(views::CreateEmptyBorder( - gfx::Insets::TLBR(insets.top(), 0, insets.bottom(), 0))); + SetBorder(views::CreateEmptyBorder(GetLayoutInsets(DOWNLOAD_ROW))); views::InkDrop::Install(this, std::make_unique<views::InkDropHost>(this)); views::InstallRectHighlightPathGenerator(this); @@ -367,15 +360,11 @@ views::DISTANCE_RELATED_LABEL_HORIZONTAL); SetLayoutManager(std::make_unique<views::TableLayout>()) - // Left inset - ->AddColumn( - views::LayoutAlignment::kStart, views::LayoutAlignment::kStart, - views::TableLayout::kFixedSize, - views::TableLayout::ColumnSize::kFixed, insets.left(), insets.left()) // Download Icon - .AddColumn(views::LayoutAlignment::kCenter, - views::LayoutAlignment::kStart, views::TableLayout::kFixedSize, - views::TableLayout::ColumnSize::kUsePreferred, 0, 0) + ->AddColumn(views::LayoutAlignment::kCenter, + views::LayoutAlignment::kStart, + views::TableLayout::kFixedSize, + views::TableLayout::ColumnSize::kUsePreferred, 0, 0) // Download name label (primary_label_) .AddPaddingColumn(views::TableLayout::kFixedSize, icon_label_spacing) .AddColumn(views::LayoutAlignment::kStart, @@ -390,11 +379,6 @@ .AddColumn(views::LayoutAlignment::kCenter, views::LayoutAlignment::kStart, views::TableLayout::kFixedSize, views::TableLayout::ColumnSize::kUsePreferred, 0, 0) - // Right inset - .AddColumn(views::LayoutAlignment::kStart, views::LayoutAlignment::kStart, - views::TableLayout::kFixedSize, - views::TableLayout::ColumnSize::kFixed, insets.right(), - insets.right()) // Three rows, one for name, one for status, one for the progress bar. .AddRows(3, 1.0f); @@ -409,9 +393,6 @@ transparent_button_->SetTriggerableEventFlags(ui::EF_LEFT_MOUSE_BUTTON); transparent_button_->SetProperty(views::kViewIgnoredByLayoutKey, true); - // Left inset, first row. - AddChildView(std::make_unique<views::View>()); - icon_ = AddChildView(std::make_unique<views::ImageView>()); icon_->SetCanProcessEventsWithinSubtree(false); icon_->SetBorder(views::CreateEmptyBorder(GetLayoutInsets(DOWNLOAD_ICON))); @@ -482,12 +463,6 @@ kChevronRightChromeRefreshIcon, ui::kColorIcon, GetLayoutConstant(DOWNLOAD_ICON_SIZE))); - // Right inset, first row. - AddChildView(std::make_unique<views::View>()); - - // Left inset, second row. - AddChildView(std::make_unique<views::View>()); - // The content of the label will be populated in the `UpdateRow` function. secondary_label_ = AddChildView(std::make_unique<views::Label>( u"", views::style::CONTEXT_LABEL, views::style::STYLE_SECONDARY)); @@ -500,12 +475,6 @@ secondary_label_->SetAllowCharacterBreak(true); secondary_label_->SetTextStyle(views::style::STYLE_BODY_5); - // Right inset, second row. - AddChildView(std::make_unique<views::View>()); - - // Left inset, third row. - AddChildView(std::make_unique<views::View>()); - // TODO(crbug.com/40875578): Remove the progress bar holder view here. // Currently the animation does not show up on deep scanning without // the holder. @@ -531,9 +500,6 @@ // Expect to start not visible, will be updated later. progress_bar_->SetVisible(false); - // Right inset, third row. - AddChildView(std::make_unique<views::View>()); - SetNotifyEnterExitOnChild(true); // Set up initial state.
diff --git a/chrome/browser/ui/views/download/bubble/download_toolbar_ui_controller.cc b/chrome/browser/ui/views/download/bubble/download_toolbar_ui_controller.cc index 3ae0abd6f..a140213 100644 --- a/chrome/browser/ui/views/download/bubble/download_toolbar_ui_controller.cc +++ b/chrome/browser/ui/views/download/bubble/download_toolbar_ui_controller.cc
@@ -30,16 +30,24 @@ #include "chrome/browser/ui/color/chrome_color_id.h" #include "chrome/browser/ui/ui_features.h" #include "chrome/browser/ui/view_ids.h" +#include "chrome/browser/ui/views/chrome_layout_provider.h" +#include "chrome/browser/ui/views/download/bubble/download_bubble_contents_view.h" #include "chrome/browser/ui/views/frame/browser_view.h" #include "chrome/browser/ui/views/toolbar/pinned_action_toolbar_button.h" #include "chrome/browser/ui/views/toolbar/pinned_toolbar_actions_container.h" #include "chrome/browser/ui/views/toolbar/toolbar_view.h" #include "chrome/grit/generated_resources.h" #include "components/autofill/content/browser/content_autofill_client.h" +#include "components/feature_engagement/public/feature_constants.h" +#include "components/safe_browsing/core/common/features.h" +#include "components/safe_browsing/core/common/safe_browsing_policy_handler.h" +#include "components/safe_browsing/core/common/safe_browsing_prefs.h" +#include "content/public/browser/browser_thread.h" #include "ui/base/l10n/l10n_util.h" #include "ui/base/metadata/metadata_impl_macros.h" #include "ui/color/color_id.h" #include "ui/color/color_provider.h" +#include "ui/compositor/compositor.h" #include "ui/gfx/geometry/skia_conversions.h" #include "ui/gfx/image/image_skia.h" #include "ui/gfx/paint_vector_icon.h" @@ -48,6 +56,7 @@ #include "ui/views/accessibility/view_accessibility.h" #include "ui/views/controls/button/button.h" #include "ui/views/controls/image_view.h" +#include "ui/views/event_monitor.h" #include "ui/views/view_class_properties.h" #include "ui/views/widget/widget.h" @@ -61,6 +70,10 @@ namespace { +// Close the partial bubble after 5 seconds if the user doesn't interact with +// it. +constexpr base::TimeDelta kAutoClosePartialViewDelay = base::Seconds(5); + PinnedToolbarActionsContainer* GetPinnedToolbarActionsContainer( BrowserView* browser_view) { return browser_view->toolbar()->pinned_toolbar_actions_container(); @@ -81,11 +94,29 @@ return color_provider->GetColor(color_id); } +gfx::Insets GetPrimaryViewMargin() { + return gfx::Insets::VH(ChromeLayoutProvider::Get()->GetDistanceMetric( + views::DISTANCE_RELATED_CONTROL_VERTICAL), + 0); +} + +gfx::Insets GetSecurityViewMargin() { + return gfx::Insets::VH(ChromeLayoutProvider::Get()->GetDistanceMetric( + views::DISTANCE_RELATED_CONTROL_VERTICAL), + 0); +} + } // namespace DownloadToolbarUIController::DownloadToolbarUIController( BrowserView* browser_view) - : browser_view_(browser_view) { + : browser_view_(browser_view), + auto_close_bubble_timer_( + FROM_HERE, + kAutoClosePartialViewDelay, + base::BindRepeating( + &DownloadToolbarUIController::AutoClosePartialView, + base::Unretained(this))) { action_item_ = actions::ActionManager::Get() .FindAction( @@ -206,24 +237,32 @@ void DownloadToolbarUIController::OpenSecuritySubpage( const offline_items_collection::ContentId& id) { - // TODO(crbug.com/323962334): Add implementation once this class becomes a - // DownloadBubbleNavigationHandler. + OpenSecurityDialog(id); } +// This function shows the partial view. If the main view is already showing, +// we do not show the partial view. If the partial view is already showing, +// there is nothing to do here, the controller should update the partial view. void DownloadToolbarUIController::ShowDetails() { - // TODO(crbug.com/323962334): Add implementation once this class becomes a - // DownloadBubbleNavigationHandler. + if (bubble_delegate_) { + return; + } + is_primary_partial_view_ = true; + if (use_auto_close_bubble_timer_) { + auto_close_bubble_timer_.Reset(); + } + CreateBubbleDialogDelegate(); } void DownloadToolbarUIController::HideDetails() { - // TODO(crbug.com/323962334): Add implementation once this class becomes a - // DownloadBubbleNavigationHandler. + if (IsShowingDetails()) { + CloseDialog(views::Widget::ClosedReason::kUnspecified); + } } bool DownloadToolbarUIController::IsShowingDetails() const { - // TODO(crbug.com/323962334): Add implementation once this class becomes a - // DownloadBubbleNavigationHandler. - return false; + return bubble_delegate_ != nullptr && + bubble_delegate_->GetWidget()->IsVisible(); } void DownloadToolbarUIController::UpdateIcon() { @@ -256,6 +295,64 @@ action_item_->SetImage(ui::ImageModel::FromVectorIcon(*new_icon, icon_color)); } +void DownloadToolbarUIController::OpenPrimaryDialog() { + if (!bubble_delegate_) { + return; + } + bubble_contents_->ShowPrimaryPage(std::nullopt); + bubble_delegate_->SetButtons( + static_cast<int>(ui::mojom::DialogButton::kNone)); + bubble_delegate_->SetDefaultButton( + static_cast<int>(ui::mojom::DialogButton::kNone)); + bubble_delegate_->set_margins(GetPrimaryViewMargin()); +} + +void DownloadToolbarUIController::OpenSecurityDialog( + const ContentId& content_id) { + if (!bubble_delegate_) { + is_primary_partial_view_ = false; + CreateBubbleDialogDelegate(); + } + bubble_contents_->ShowSecurityPage(content_id); + bubble_delegate_->set_margins(GetSecurityViewMargin()); +} + +void DownloadToolbarUIController::CloseDialog( + views::Widget::ClosedReason reason) { + if (bubble_delegate_) { + bubble_delegate_->GetWidget()->CloseWithReason(reason); + } +} + +void DownloadToolbarUIController::OnSecurityDialogButtonPress( + const DownloadUIModel& model, + DownloadCommands::Command command) { + if (model.GetDangerType() == + download::DOWNLOAD_DANGER_TYPE_UNCOMMON_CONTENT && + command == DownloadCommands::DISCARD) { + content::GetUIThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce(&DownloadToolbarUIController::ShowIphPromo, + weak_factory_.GetWeakPtr())); + } +} + +void DownloadToolbarUIController::OnDialogInteracted() { + DeactivateAutoClose(); +} + +std::unique_ptr<DownloadBubbleNavigationHandler::CloseOnDeactivatePin> +DownloadToolbarUIController::PreventDialogCloseOnDeactivate() { + if (!bubble_delegate_) { + return nullptr; + } + return bubble_delegate_->PreventCloseOnDeactivate(); +} + +base::WeakPtr<DownloadBubbleNavigationHandler> +DownloadToolbarUIController::GetWeakPtr() { + return weak_factory_.GetWeakPtr(); +} + void DownloadToolbarUIController::OnBrowserSetLastActive(Browser* browser) { UpdateIconDormant(); } @@ -264,14 +361,230 @@ UpdateIconDormant(); } +void DownloadToolbarUIController::DeactivateAutoClose() { + auto_close_bubble_timer_.Stop(); +} + void DownloadToolbarUIController::InvokeUI() { - // TODO(crbug.com/323962334): Add implementation opening downloads bubble if - // there are recent downloads once this class becomes a - // DownloadBubbleNavigationHandler. - chrome::ShowDownloads(browser_view_->browser()); + if (!bubble_delegate_ && !bubble_controller_->GetMainView().empty()) { + is_primary_partial_view_ = false; + button_click_time_ = base::TimeTicks::Now(); + CreateBubbleDialogDelegate(); + } else { + chrome::ShowDownloads(browser_view_->browser()); + } controller_->OnButtonPressed(); } +DownloadToolbarUIController::BubbleCloser::BubbleCloser( + views::Button* toolbar_button, + base::OnceClosure press_callback) + : toolbar_button_(toolbar_button), callback_(std::move(press_callback)) { + CHECK(toolbar_button_); + if (toolbar_button->GetWidget() && + toolbar_button->GetWidget()->GetNativeWindow()) { + event_monitor_ = views::EventMonitor::CreateWindowMonitor( + this, toolbar_button->GetWidget()->GetNativeWindow(), + {ui::EventType::kMousePressed, ui::EventType::kKeyPressed, + ui::EventType::kTouchPressed}); + } +} + +DownloadToolbarUIController::BubbleCloser::~BubbleCloser() = default; + +void DownloadToolbarUIController::BubbleCloser::OnEvent( + const ui::Event& event) { + CHECK(event_monitor_); + if (event.IsKeyEvent() && event.AsKeyEvent()->key_code() != ui::VKEY_ESCAPE) { + return; + } + + std::move(callback_).Run(); + // `this` will be deleted. +} + +void DownloadToolbarUIController::CreateBubbleDialogDelegate() { + std::vector<DownloadUIModel::DownloadUIModelPtr> primary_view_models = + GetPrimaryViewModels(); + if (primary_view_models.empty()) { + return; + } + + // If we are in immersive fullscreen, reveal the toolbar to show the bubble. + if (browser_view_ && browser_view_->immersive_mode_controller()) { + immersive_revealed_lock_ = + browser_view_->immersive_mode_controller()->GetRevealedLock( + ImmersiveModeController::ANIMATE_REVEAL_YES); + } + + auto* button = GetDownloadsButton(browser_view_); + auto bubble_delegate = std::make_unique<views::BubbleDialogDelegate>( + button, views::BubbleBorder::TOP_RIGHT, + views::BubbleBorder::DIALOG_SHADOW, + /*autosize=*/true); + bubble_delegate->SetTitle( + l10n_util::GetStringUTF16(IDS_DOWNLOAD_BUBBLE_HEADER_LABEL)); + bubble_delegate->SetShowTitle(false); + bubble_delegate->SetShowCloseButton(false); + bubble_delegate->SetButtons(static_cast<int>(ui::mojom::DialogButton::kNone)); + bubble_delegate->SetDefaultButton( + static_cast<int>(ui::mojom::DialogButton::kNone)); + bubble_delegate->RegisterWindowClosingCallback( + base::BindOnce(&DownloadToolbarUIController::OnBubbleClosing, + weak_factory_.GetWeakPtr())); + auto bubble_contents = std::make_unique<DownloadBubbleContentsView>( + browser_view_->browser()->AsWeakPtr(), bubble_controller_->GetWeakPtr(), + GetWeakPtr(), is_primary_partial_view_, + std::make_unique<DownloadBubbleContentsViewInfo>( + std::move(primary_view_models)), + bubble_delegate.get()); + bubble_contents_ = bubble_contents.get(); + bubble_delegate->SetContentsView(std::move(bubble_contents)); + // The contents view displays the primary view by default. + bubble_delegate->set_margins(GetPrimaryViewMargin()); + bubble_delegate->SetEnableArrowKeyTraversal(true); + bubble_delegate_ = bubble_delegate.get(); + views::BubbleDialogDelegate::CreateBubble(std::move(bubble_delegate)); + + if (!is_primary_partial_view_ && !button_click_time_.is_null()) { + // If the main view was shown after clicking on the toolbar button, + // record the time from click to shown. (The main view can be shown without + // clicking the toolbar button, e.g. from clicking on a notification.) + bubble_delegate_->GetWidget() + ->GetCompositor() + ->RequestSuccessfulPresentationTimeForNextFrame(base::BindOnce( + [](base::TimeTicks click_time, + const viz::FrameTimingDetails& frame_timing_details) { + base::TimeTicks presentation_time = + frame_timing_details.presentation_feedback.timestamp; + UmaHistogramTimes( + "Download.Bubble.ToolbarButtonClickToFullViewShownLatency", + presentation_time - click_time); + }, + button_click_time_)); + // Reset click time. + button_click_time_ = base::TimeTicks(); + } + + CloseAutofillPopup(); + if (ShouldShowBubbleAsInactive()) { + if (button) { + bubble_delegate_->GetWidget()->ShowInactive(); + bubble_closer_ = std::make_unique<BubbleCloser>( + button, base::BindOnce(&DownloadToolbarUIController::HideDetails, + base::Unretained(this))); + bubble_delegate_->GetWidget() + ->GetRootView() + ->GetViewAccessibility() + .AnnounceText( + l10n_util::GetStringUTF16(IDS_SHOW_BUBBLE_INACTIVE_DESCRIPTION)); + } + } else { + bubble_delegate_->GetWidget()->Show(); + } + if (action_item_.get()) { + action_item_->SetIsShowingBubble(true); + } + + // For IPH bubble. The IPH should show when the partial view is closed, either + // manually or automatically. + if (is_primary_partial_view_) { + bubble_delegate_->SetCloseCallback( + base::BindOnce(&DownloadToolbarUIController::OnPartialViewClosed, + weak_factory_.GetWeakPtr())); + } + + UpdateIconDormant(); +} + +void DownloadToolbarUIController::OnBubbleClosing() { + immersive_revealed_lock_.reset(); + bubble_delegate_ = nullptr; + bubble_contents_ = nullptr; + bubble_closer_.reset(); + UpdateIconDormant(); + + if (action_item_.get()) { + action_item_->SetIsShowingBubble(false); + } +} + +void DownloadToolbarUIController::OnPartialViewClosed() { + // We use PostTask to avoid calling the FocusAndActivateWindow + // function reentrantly from ui/wm/core/focus_controller.cc. + // We make sure each call to the FocusAndActivateWindow method + // finishes before the next. + content::GetUIThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce(&DownloadToolbarUIController::ShowIphPromo, + weak_factory_.GetWeakPtr())); +} + +void DownloadToolbarUIController::ShowIphPromo() { +#if BUILDFLAG(GOOGLE_CHROME_BRANDING) + Profile* profile = browser_view_->GetProfile(); + // Don't show IPH Promo if safe browsing level is set by policy. + if (safe_browsing::SafeBrowsingPolicyHandler:: + IsSafeBrowsingProtectionLevelSetByPolicy(profile->GetPrefs())) { + return; + } + if (safe_browsing::GetSafeBrowsingState(*profile->GetPrefs()) == + safe_browsing::SafeBrowsingState::STANDARD_PROTECTION && + !profile->IsOffTheRecord()) { + browser_view_->MaybeShowFeaturePromo( + feature_engagement::kIPHDownloadEsbPromoFeature); + } +#endif +} + +void DownloadToolbarUIController::AutoClosePartialView() { + // Nothing to do if the bubble is not open. + if (!bubble_contents_) { + return; + } + // Don't close the security page. + if (bubble_contents_->VisiblePage() == + DownloadBubbleContentsView::Page::kSecurity) { + return; + } + if (!is_primary_partial_view_ || !use_auto_close_bubble_timer_) { + return; + } + // Don't close if the user is hovering over the bubble. + if (bubble_contents_->IsMouseHovered()) { + return; + } + HideDetails(); +} + +std::vector<DownloadUIModel::DownloadUIModelPtr> +DownloadToolbarUIController::GetPrimaryViewModels() { + return is_primary_partial_view_ ? bubble_controller_->GetPartialView() + : bubble_controller_->GetMainView(); +} + +bool DownloadToolbarUIController::ShouldShowBubbleAsInactive() const { + // The bubble can either be shown as active or inactive. When the current + // browser is inactive, make the bubble inactive to avoid stealing focus from + // non-Chrome windows or showing on a different workspace. + if (!browser_view_->browser()->window() || + !browser_view_->browser()->window()->IsActive()) { + return true; + } + + // Don't show as active if there is a running context menu, otherwise the + // context menu will be closed. + if (content::WebContents* web_contents = + browser_view_->browser()->tab_strip_model()->GetActiveWebContents()) { + if (web_contents->IsShowingContextMenu()) { + return true; + } + } + + // The partial view shows up without user interaction, so it should not + // steal focus from the web contents. + return is_primary_partial_view_; +} + void DownloadToolbarUIController::CloseAutofillPopup() { content::WebContents* web_contents = browser_view_->browser()->tab_strip_model()->GetActiveWebContents(); @@ -302,3 +615,9 @@ DownloadDisplay::IconState DownloadToolbarUIController::GetIconState() const { return state_; } + +void DownloadToolbarUIController::OnAnyRowRemoved() { + if (bubble_contents_->info().row_list_view_info().rows().empty()) { + CloseDialog(views::Widget::ClosedReason::kUnspecified); + } +}
diff --git a/chrome/browser/ui/views/download/bubble/download_toolbar_ui_controller.h b/chrome/browser/ui/views/download/bubble/download_toolbar_ui_controller.h index f08ac42..28c4984 100644 --- a/chrome/browser/ui/views/download/bubble/download_toolbar_ui_controller.h +++ b/chrome/browser/ui/views/download/bubble/download_toolbar_ui_controller.h
@@ -8,21 +8,30 @@ #include <string> #include "base/memory/raw_ptr.h" +#include "base/timer/timer.h" #include "chrome/browser/download/download_ui_model.h" #include "chrome/browser/ui/browser_list_observer.h" +#include "chrome/browser/ui/download/download_bubble_row_list_view_info.h" #include "chrome/browser/ui/download/download_display.h" +#include "chrome/browser/ui/views/download/bubble/download_bubble_navigation_handler.h" #include "chrome/browser/ui/views/frame/immersive_mode_controller.h" #include "components/offline_items_collection/core/offline_item.h" #include "ui/base/metadata/metadata_header_macros.h" +#include "ui/events/event_observer.h" #include "ui/views/bubble/bubble_dialog_delegate_view.h" namespace offline_items_collection { struct ContentId; } +namespace views { +class EventMonitor; +} + class Browser; class BrowserView; class DownloadDisplayController; +class DownloadBubbleContentsView; class DownloadBubbleUIController; // DownloadToolbarUIController is a controller for the downloads button shown in @@ -30,8 +39,11 @@ // and badges for the button. The icon is made visible when pinned or when // downloads are in progress or when a download was initiated in the past 1 // hour. -class DownloadToolbarUIController : public DownloadDisplay, - public BrowserListObserver { +class DownloadToolbarUIController + : public DownloadDisplay, + public DownloadBubbleNavigationHandler, + public BrowserListObserver, + public DownloadBubbleRowListViewInfoObserver { public: explicit DownloadToolbarUIController(BrowserView* browser_view); DownloadToolbarUIController(const DownloadToolbarUIController&) = delete; @@ -58,10 +70,25 @@ void UpdateIcon(); + // DownloadBubbleNavigationHandler: + void OpenPrimaryDialog() override; + void OpenSecurityDialog( + const offline_items_collection::ContentId& content_id) override; + void CloseDialog(views::Widget::ClosedReason reason) override; + void OnSecurityDialogButtonPress(const DownloadUIModel& model, + DownloadCommands::Command command) override; + void OnDialogInteracted() override; + std::unique_ptr<views::BubbleDialogDelegate::CloseOnDeactivatePin> + PreventDialogCloseOnDeactivate() override; + base::WeakPtr<DownloadBubbleNavigationHandler> GetWeakPtr() override; + // BrowserListObserver: void OnBrowserSetLastActive(Browser* browser) override; void OnBrowserNoLongerActive(Browser* browser) override; + // Deactivates the automatic closing of the partial bubble. + void DeactivateAutoClose(); + void InvokeUI(); DownloadBubbleUIController* bubble_controller() { @@ -70,19 +97,80 @@ DownloadDisplayController* display_controller() { return controller_.get(); } + DownloadBubbleContentsView* bubble_contents_for_testing() { + return bubble_contents_; + } + + base::RetainingOneShotTimer* auto_close_bubble_timer_for_testing() { + return &auto_close_bubble_timer_; + } + private: + // Closes the bubble when it detects an event such as a mouse click, escape + // key press, etc., which indicates the user's intent to close the bubble. + // This is needed when the bubble is inactive (shown with ShowInactive) + // because the normal close-on-deactivate mechanism doesn't work from an + // already-inactive state. This is created by the DownloadToolbarButtonView + // when the bubble is shown with ShowInactive, and is destroyed when the + // bubble is closed. + // TODO(crbug.com/40943500): Factor out common logic copied from translate + // bubble. + class BubbleCloser : public ui::EventObserver { + public: + explicit BubbleCloser(views::Button* toolbar_button, + base::OnceClosure press_callback); + + BubbleCloser(const BubbleCloser& other) = delete; + BubbleCloser& operator=(const BubbleCloser& other) = delete; + + ~BubbleCloser() override; + + // ui::EventObserver: + void OnEvent(const ui::Event& event) override; + + private: + raw_ptr<views::Button> toolbar_button_ = nullptr; + base::OnceClosure callback_; + std::unique_ptr<views::EventMonitor> event_monitor_; + }; + + void CreateBubbleDialogDelegate(); + void OnBubbleClosing(); + + // Callback invoked when the partial view is closed. + void OnPartialViewClosed(); + + // Helper function to show an IPH promo. + void ShowIphPromo(); + + // Called to automatically close the partial view, if such closing has not + // been deactivated. + void AutoClosePartialView(); + + // Get the models for the primary view, which may be the full or the partial + // view. + std::vector<DownloadUIModel::DownloadUIModelPtr> GetPrimaryViewModels(); + + bool ShouldShowBubbleAsInactive() const; + void CloseAutofillPopup(); // Makes the required visual changes to set/unset the button into a dormant // or normal state. void UpdateIconDormant(); + // DownloadBubbleRowListViewInfoObserver: + void OnAnyRowRemoved() override; + raw_ptr<BrowserView> browser_view_; + bool is_primary_partial_view_ = false; base::WeakPtr<actions::ActionItem> action_item_ = nullptr; // Controller for the DownloadToolbarButton UI. std::unique_ptr<DownloadDisplayController> controller_; // Controller for keeping track of items for both main view and partial view. std::unique_ptr<DownloadBubbleUIController> bubble_controller_; + raw_ptr<views::BubbleDialogDelegate> bubble_delegate_ = nullptr; + raw_ptr<DownloadBubbleContentsView> bubble_contents_ = nullptr; // Whether the progress ring in the icon should be updated continuously // (false), or the icon should be displayed as dormant (true). This is a @@ -104,12 +192,26 @@ IconState state_ = IconState::kComplete; IconActive active_ = IconActive::kInactive; + // Tracks the task to automatically close the partial view after some amount + // of time open, to minimize disruption to the user. + base::RetainingOneShotTimer auto_close_bubble_timer_; + // Whether the above timer does anything, which may be false in tests. + bool use_auto_close_bubble_timer_ = true; + + base::TimeTicks button_click_time_; + // Maps number of in-progress downloads to the corresponding tooltip text, to // avoid having to create the strings repeatedly. The entry for 0 is the // default tooltip ("Downloads"), the entries for larger numbers are the // tooltips for N in-progress downloads ("N downloads in progress"). std::map<int, std::u16string> tooltip_texts_; + // Used for holding the top views visible while the download bubble is showing + // in immersive mode on ChromeOS and Mac. + std::unique_ptr<ImmersiveRevealedLock> immersive_revealed_lock_; + + std::unique_ptr<BubbleCloser> bubble_closer_; + base::WeakPtrFactory<DownloadToolbarUIController> weak_factory_{this}; };
diff --git a/chrome/browser/ui/views/download/bubble/download_toolbar_ui_controller_browsertest.cc b/chrome/browser/ui/views/download/bubble/download_toolbar_ui_controller_browsertest.cc index 61cb5f3..34f0687 100644 --- a/chrome/browser/ui/views/download/bubble/download_toolbar_ui_controller_browsertest.cc +++ b/chrome/browser/ui/views/download/bubble/download_toolbar_ui_controller_browsertest.cc
@@ -5,11 +5,14 @@ #include "chrome/browser/ui/views/download/bubble/download_toolbar_ui_controller.h" #include "base/files/file_path.h" +#include "base/test/run_until.h" #include "chrome/browser/download/download_browsertest_utils.h" +#include "chrome/browser/download/offline_item_utils.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/browser_window/public/browser_window_features.h" #include "chrome/browser/ui/toolbar/pinned_toolbar/pinned_toolbar_actions_model.h" #include "chrome/browser/ui/ui_features.h" +#include "chrome/browser/ui/views/download/bubble/download_bubble_contents_view.h" #include "chrome/browser/ui/views/frame/browser_view.h" #include "chrome/browser/ui/views/toolbar/pinned_toolbar_actions_container.h" #include "chrome/browser/ui/views/toolbar/toolbar_button.h" @@ -17,6 +20,7 @@ #include "chrome/common/webui_url_constants.h" #include "chrome/test/base/in_process_browser_test.h" #include "chrome/test/base/ui_test_utils.h" +#include "components/safe_browsing/core/common/safe_browsing_prefs.h" #include "content/public/test/browser_test.h" #include "content/public/test/browser_test_utils.h" #include "content/public/test/test_utils.h" @@ -138,7 +142,6 @@ views::test::WaitForAnimatingLayoutManager(toolbar_container()); EXPECT_NE(toolbar_button(), nullptr); EXPECT_TRUE(toolbar_button()->GetVisible()); - // ClickButton(toolbar_button()); { content::LoadStopObserver observer( browser()->tab_strip_model()->GetActiveWebContents()); @@ -148,4 +151,89 @@ EXPECT_EQ(GURL(chrome::kChromeUIDownloadsURL), browser()->tab_strip_model()->GetActiveWebContents()->GetURL()); } + +IN_PROC_BROWSER_TEST_F(DownloadToolbarUIControllerBrowserTest, + ButtonPressWithRecentDownloads) { + ui_test_utils::DownloadURL( + browser(), ui_test_utils::GetTestUrl( + base::FilePath().AppendASCII("downloads"), + base::FilePath().AppendASCII("a_zip_file.zip"))); + views::test::WaitForAnimatingLayoutManager(toolbar_container()); + EXPECT_NE(toolbar_button(), nullptr); + EXPECT_TRUE(toolbar_button()->GetVisible()); + ClickButton(toolbar_button()); + EXPECT_EQ(controller()->bubble_contents_for_testing()->VisiblePage(), + DownloadBubbleContentsView::Page::kPrimary); +} + +IN_PROC_BROWSER_TEST_F(DownloadToolbarUIControllerBrowserTest, + DialogAutoCloses) { + ui_test_utils::DownloadURL( + browser(), ui_test_utils::GetTestUrl( + base::FilePath().AppendASCII("downloads"), + base::FilePath().AppendASCII("a_zip_file.zip"))); + views::test::WaitForAnimatingLayoutManager(toolbar_container()); + controller()->ShowDetails(); + controller()->OpenPrimaryDialog(); + EXPECT_EQ(controller()->bubble_contents_for_testing()->VisiblePage(), + DownloadBubbleContentsView::Page::kPrimary); + controller()->auto_close_bubble_timer_for_testing()->user_task().Run(); + EXPECT_TRUE(base::test::RunUntil([&]() { + return controller()->bubble_contents_for_testing() == nullptr; + })); +} + +IN_PROC_BROWSER_TEST_F(DownloadToolbarUIControllerBrowserTest, + OpenPrimaryDialog) { + ui_test_utils::DownloadURL( + browser(), ui_test_utils::GetTestUrl( + base::FilePath().AppendASCII("downloads"), + base::FilePath().AppendASCII("a_zip_file.zip"))); + views::test::WaitForAnimatingLayoutManager(toolbar_container()); + controller()->ShowDetails(); + controller()->OpenPrimaryDialog(); + EXPECT_EQ(controller()->bubble_contents_for_testing()->VisiblePage(), + DownloadBubbleContentsView::Page::kPrimary); +} + +IN_PROC_BROWSER_TEST_F(DownloadToolbarUIControllerBrowserTest, + OpenSecurityDialog) { + // Disable SafeBrowsing and make a download dangerous so that showing the + // security view is valid. + browser()->profile()->GetPrefs()->SetBoolean(prefs::kSafeBrowsingEnabled, + false); + embedded_test_server()->ServeFilesFromDirectory(GetTestDataDirectory()); + ASSERT_TRUE(embedded_test_server()->Start()); + GURL download_url = + embedded_test_server()->GetURL(DownloadTestBase::kDangerousMockFilePath); + + std::unique_ptr<content::DownloadTestObserver> dangerous_observer( + DangerousDownloadWaiter( + browser(), 1, + content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_QUIT)); + ui_test_utils::NavigateToURLWithDisposition( + browser(), download_url, WindowOpenDisposition::NEW_BACKGROUND_TAB, + ui_test_utils::BROWSER_TEST_NO_WAIT); + dangerous_observer->WaitForFinished(); + std::vector<raw_ptr<download::DownloadItem, VectorExperimental>> + download_items; + GetDownloads(browser(), &download_items); + ASSERT_EQ(1UL, download_items.size()); + views::test::WaitForAnimatingLayoutManager(toolbar_container()); + + offline_items_collection::ContentId content_id = + OfflineItemUtils::GetContentIdForDownload(download_items[0].get()); + controller()->OpenSecuritySubpage(content_id); + EXPECT_EQ(controller()->bubble_contents_for_testing()->VisiblePage(), + DownloadBubbleContentsView::Page::kSecurity); + EXPECT_EQ(controller() + ->bubble_contents_for_testing() + ->security_view_for_testing() + ->content_id(), + content_id); + controller() + ->bubble_contents_for_testing() + ->ProcessSecuritySubpageButtonPress(content_id, + DownloadCommands::Command::DISCARD); +} #endif
diff --git a/chrome/browser/ui/views/exclusive_access_bubble_views.cc b/chrome/browser/ui/views/exclusive_access_bubble_views.cc index 333cfd1..d37f9f30 100644 --- a/chrome/browser/ui/views/exclusive_access_bubble_views.cc +++ b/chrome/browser/ui/views/exclusive_access_bubble_views.cc
@@ -148,19 +148,22 @@ ExclusiveAccessBubbleHideCallback first_hide_callback) { DCHECK(EXCLUSIVE_ACCESS_BUBBLE_TYPE_NONE != params.type || params.has_download); + bool already_shown = IsShowing() || IsVisible(); if (params_.type == params.type && params_.url == params.url && - !params.force_update && (IsShowing() || IsVisible())) { + !params.force_update && already_shown) { return; } - // Show the notification about overriding only if requesting a download - // notification, a notification was visible earlier, and the earlier - // notification was either a non-download one, or was one about an override - // itself. - notify_overridden_ = params.has_download && - (IsVisible() || animation_->IsShowing()) && - (!params_.has_download || notify_overridden_); - params_.has_download = params.has_download; + // Show the notification about overriding only if: + // 1. There was a notification visible earlier, and + // 2. Exactly one of the previous and current notifications has a download, + // or the previous notification was about an override itself. + // If both the previous and current notifications have a download, but + // neither is an override, then we don't need to show an override. + notify_overridden_ = + already_shown && + (notify_overridden_ || (params.has_download ^ params_.has_download)); + params_.has_download = params.has_download || notify_overridden_; // Bubble maybe be re-used after timeout. RunHideCallbackIfNeeded(ExclusiveAccessBubbleHideReason::kInterrupted);
diff --git a/chrome/browser/ui/views/exclusive_access_bubble_views_unittest.cc b/chrome/browser/ui/views/exclusive_access_bubble_views_unittest.cc index a3a592f..fe9d1087 100644 --- a/chrome/browser/ui/views/exclusive_access_bubble_views_unittest.cc +++ b/chrome/browser/ui/views/exclusive_access_bubble_views_unittest.cc
@@ -6,8 +6,10 @@ #include <string> +#include "base/strings/string_util.h" #include "build/buildflag.h" #include "chrome/browser/ui/accelerator_utils.h" +#include "chrome/browser/ui/exclusive_access/exclusive_access_bubble_type.h" #include "chrome/browser/ui/ui_features.h" #include "chrome/browser/ui/views/frame/browser_view.h" #include "chrome/browser/ui/views/frame/test_with_browser_view.h" @@ -22,6 +24,7 @@ kExitFullscreen = 0, kExitPointerLock = 1, kExitFullscreenAndSeeDownload = 2, + kSeeDownload = 3, }; enum Shortcut { @@ -35,8 +38,7 @@ ExclusiveAccessBubbleType type; UserGoal goal; Shortcut shortcut; - bool enable_feature; - bool has_download = false; + bool enable_feature = false; }; std::u16string GetUserGoalText(UserGoal goal) { @@ -47,6 +49,8 @@ return u"To show your cursor"; case kExitFullscreenAndSeeDownload: return u"To exit full screen and see download"; + case kSeeDownload: + return u"Download started. To see it"; default: return u""; } @@ -63,19 +67,9 @@ } // namespace -class ExclusiveAccessBubbleViewsTest - : public TestWithBrowserView, - public testing::WithParamInterface<InstructionTextTestCase> { +class ExclusiveAccessBubbleViewsTest : public TestWithBrowserView { public: - ExclusiveAccessBubbleViewsTest() { - if (GetParam().enable_feature) { - scoped_feature_list_.InitAndEnableFeature( - features::kPressAndHoldEscToExitBrowserFullscreen); - } else { - scoped_feature_list_.InitAndDisableFeature( - features::kPressAndHoldEscToExitBrowserFullscreen); - } - } + ExclusiveAccessBubbleViewsTest() = default; void SetUp() override { TestWithBrowserView::SetUp(); @@ -91,15 +85,10 @@ } void UpdateExclusiveAccessBubbleType(ExclusiveAccessBubbleType type, - bool has_download = false) { - // When `has_download` is true, the existing bubble type is not updated. - // In that case, set the type first, then signify the download bit. - ExclusiveAccessBubbleParams params{.type = type, .force_update = true}; + bool has_download) { + ExclusiveAccessBubbleParams params{ + .type = type, .has_download = has_download, .force_update = true}; bubble_view_->Update(params, base::NullCallback()); - if (has_download) { - params.has_download = true; - bubble_view_->Update(params, base::NullCallback()); - } } std::u16string GetFullscreenAcceleratorString() { @@ -139,19 +128,36 @@ return static_cast<SubtleNotificationView*>(bubble_view_->GetView()); } - private: + protected: std::unique_ptr<ExclusiveAccessBubbleViews> bubble_view_; +}; + +class ExclusiveAccessBubbleViewsInstructionTextTest + : public ExclusiveAccessBubbleViewsTest, + public testing::WithParamInterface<InstructionTextTestCase> { + public: + ExclusiveAccessBubbleViewsInstructionTextTest() { + if (GetParam().enable_feature) { + scoped_feature_list_.InitAndEnableFeature( + features::kPressAndHoldEscToExitBrowserFullscreen); + } else { + scoped_feature_list_.InitAndDisableFeature( + features::kPressAndHoldEscToExitBrowserFullscreen); + } + } + + private: base::test::ScopedFeatureList scoped_feature_list_; }; -TEST_P(ExclusiveAccessBubbleViewsTest, UpdateViewContent) { +TEST_P(ExclusiveAccessBubbleViewsInstructionTextTest, UpdateViewContent) { const InstructionTextTestCase& test_case = GetParam(); - UpdateExclusiveAccessBubbleType(test_case.type, test_case.has_download); + UpdateExclusiveAccessBubbleType(test_case.type, /*has_download=*/false); EXPECT_EQ(GetInstructionViewText(), CreateInstructionText(test_case.goal, test_case.shortcut)); } -TEST_P(ExclusiveAccessBubbleViewsTest, +TEST_F(ExclusiveAccessBubbleViewsTest, SubtleNotificationViewAccessibleProperties) { ui::AXNodeData data; GetSubtleNotificationView()->GetViewAccessibility().GetAccessibleNodeData( @@ -169,9 +175,10 @@ u"Sample Accessible Text"); } +// Tests where the bubble is updated once with the specified type. INSTANTIATE_TEST_SUITE_P( - ExclusiveAccessTestInstantiation, - ExclusiveAccessBubbleViewsTest, + /* no label */, + ExclusiveAccessBubbleViewsInstructionTextTest, testing::ValuesIn<InstructionTextTestCase>({ {"tabFullscreen", EXCLUSIVE_ACCESS_BUBBLE_TYPE_FULLSCREEN_EXIT_INSTRUCTION, @@ -209,30 +216,93 @@ {"extensionInitiatedBrowserFullscreen_EnablePressAndHoldEsc", EXCLUSIVE_ACCESS_BUBBLE_TYPE_EXTENSION_FULLSCREEN_EXIT_INSTRUCTION, UserGoal::kExitFullscreen, Shortcut::kPressAndHoldEsc, true}, + }), + [](const testing::TestParamInfo< + ExclusiveAccessBubbleViewsInstructionTextTest::ParamType>& info) { + return info.param.test_name; + }); + +// Tests the creation of a has_download, non-overriding notification. +TEST_F(ExclusiveAccessBubbleViewsTest, CreateForDownload) { + ExclusiveAccessBubbleParams params{.type = EXCLUSIVE_ACCESS_BUBBLE_TYPE_NONE, + .has_download = true}; + bubble_view_ = std::make_unique<ExclusiveAccessBubbleViews>( + browser_view(), params, base::NullCallback()); + EXPECT_TRUE(base::StartsWith( + GetInstructionViewText(), + CreateInstructionText(UserGoal::kSeeDownload, Shortcut::kPressEsc))); +} + +// Tests the updating of a has_download, non-overriding notification with a +// second one of the same. +TEST_F(ExclusiveAccessBubbleViewsTest, CreateForDownloadUpdateForDownload) { + ExclusiveAccessBubbleParams params{.type = EXCLUSIVE_ACCESS_BUBBLE_TYPE_NONE, + .has_download = true}; + bubble_view_ = std::make_unique<ExclusiveAccessBubbleViews>( + browser_view(), params, base::NullCallback()); + UpdateExclusiveAccessBubbleType(EXCLUSIVE_ACCESS_BUBBLE_TYPE_NONE, + /*has_download=*/true); + EXPECT_TRUE(base::StartsWith( + GetInstructionViewText(), + CreateInstructionText(UserGoal::kSeeDownload, Shortcut::kPressEsc))); +} + +// Tests updating the bubble first with the type, then a second time for a +// download notification. +using ExclusiveAccessBubbleViewsTestWithDownload = + ExclusiveAccessBubbleViewsInstructionTextTest; +TEST_P(ExclusiveAccessBubbleViewsTestWithDownload, + UpdateViewContentThenDownload) { + const InstructionTextTestCase& test_case = GetParam(); + UpdateExclusiveAccessBubbleType(test_case.type, /*has_download=*/false); + // Download notifications pass the type NONE. + UpdateExclusiveAccessBubbleType(EXCLUSIVE_ACCESS_BUBBLE_TYPE_NONE, + /*has_download=*/true); + EXPECT_EQ(GetInstructionViewText(), + CreateInstructionText(test_case.goal, test_case.shortcut)); +} + +// Tests the above but with the Update() calls coming in the other order. +TEST_P(ExclusiveAccessBubbleViewsTestWithDownload, + UpdateViewContentAfterDownload) { + const InstructionTextTestCase& test_case = GetParam(); + // Update it for a download. + UpdateExclusiveAccessBubbleType(EXCLUSIVE_ACCESS_BUBBLE_TYPE_NONE, + /*has_download=*/true); + // A subsequent Update() call with the test-specified type. + UpdateExclusiveAccessBubbleType(test_case.type, /*has_download=*/false); + EXPECT_EQ(GetInstructionViewText(), + CreateInstructionText(test_case.goal, test_case.shortcut)); +} + +INSTANTIATE_TEST_SUITE_P( + /* no label */, + ExclusiveAccessBubbleViewsTestWithDownload, + testing::ValuesIn<InstructionTextTestCase>({ {"tabFullscreenSeeDownload", EXCLUSIVE_ACCESS_BUBBLE_TYPE_FULLSCREEN_EXIT_INSTRUCTION, - UserGoal::kExitFullscreenAndSeeDownload, Shortcut::kPressEsc, false, - true}, + UserGoal::kExitFullscreenAndSeeDownload, Shortcut::kPressEsc, false}, {"browserFullscreenSeeDownload", EXCLUSIVE_ACCESS_BUBBLE_TYPE_BROWSER_FULLSCREEN_EXIT_INSTRUCTION, - UserGoal::kExitFullscreenAndSeeDownload, Shortcut::kAccelerator, false, - true}, + UserGoal::kExitFullscreenAndSeeDownload, Shortcut::kAccelerator, + false}, {"extensionInitiatedFullscreenSeeDownload", - EXCLUSIVE_ACCESS_BUBBLE_TYPE_BROWSER_FULLSCREEN_EXIT_INSTRUCTION, - UserGoal::kExitFullscreenAndSeeDownload, Shortcut::kAccelerator, false, - true}, + EXCLUSIVE_ACCESS_BUBBLE_TYPE_EXTENSION_FULLSCREEN_EXIT_INSTRUCTION, + UserGoal::kExitFullscreenAndSeeDownload, Shortcut::kAccelerator, + false}, {"tabFullscreenSeeDownload_EnablePressAndHoldEsc", EXCLUSIVE_ACCESS_BUBBLE_TYPE_FULLSCREEN_EXIT_INSTRUCTION, - UserGoal::kExitFullscreenAndSeeDownload, Shortcut::kPressEsc, true, - true}, + UserGoal::kExitFullscreenAndSeeDownload, Shortcut::kPressEsc, true}, {"browserFullscreenSeeDownload_EnablePressAndHoldEsc", EXCLUSIVE_ACCESS_BUBBLE_TYPE_BROWSER_FULLSCREEN_EXIT_INSTRUCTION, UserGoal::kExitFullscreenAndSeeDownload, Shortcut::kPressAndHoldEsc, - true, true}, + true}, {"extensionInitiatedFullscreenSeeDownload_EnablePressAndHoldEsc", EXCLUSIVE_ACCESS_BUBBLE_TYPE_EXTENSION_FULLSCREEN_EXIT_INSTRUCTION, UserGoal::kExitFullscreenAndSeeDownload, Shortcut::kPressAndHoldEsc, - true, true}, + true}, }), - [](const testing::TestParamInfo<ExclusiveAccessBubbleViewsTest::ParamType>& - info) { return info.param.test_name; }); + [](const testing::TestParamInfo< + ExclusiveAccessBubbleViewsTestWithDownload::ParamType>& info) { + return info.param.test_name; + });
diff --git a/chrome/browser/ui/views/frame/picture_in_picture_browser_frame_view_interactive_uitest.cc b/chrome/browser/ui/views/frame/picture_in_picture_browser_frame_view_interactive_uitest.cc index 735bdb1..3971b1c8 100644 --- a/chrome/browser/ui/views/frame/picture_in_picture_browser_frame_view_interactive_uitest.cc +++ b/chrome/browser/ui/views/frame/picture_in_picture_browser_frame_view_interactive_uitest.cc
@@ -6,6 +6,7 @@ #include "base/memory/raw_ptr.h" #include "base/strings/strcat.h" +#include "base/strings/to_string.h" #include "base/test/scoped_feature_list.h" #include "chrome/browser/media/webrtc/webrtc_browsertest_base.h" #include "chrome/browser/picture_in_picture/auto_picture_in_picture_tab_helper.h" @@ -159,7 +160,7 @@ GetOrCreateDocumentPictureInPictureController(active_web_contents); const std::string disallow_return_to_opener_js_string = (disallow_return_to_opener.has_value() - ? (*disallow_return_to_opener ? "true" : "false") + ? base::ToString(*disallow_return_to_opener) : "undefined"); const std::string size_string = (sizing_mode == SizingMode::kSized ? "300" : "undefined");
diff --git a/chrome/browser/ui/views/hats/hats_next_web_dialog.cc b/chrome/browser/ui/views/hats/hats_next_web_dialog.cc index 6da0f39e..f2c33e0a 100644 --- a/chrome/browser/ui/views/hats/hats_next_web_dialog.cc +++ b/chrome/browser/ui/views/hats/hats_next_web_dialog.cc
@@ -10,6 +10,7 @@ #include "base/memory/raw_ptr.h" #include "base/metrics/histogram_functions.h" #include "base/notreached.h" +#include "base/strings/to_string.h" #include "base/values.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/devtools/devtools_window.h" @@ -438,7 +439,7 @@ // by the wrapper website and provided to the HaTS backend service. base::Value::Dict dict; for (const auto& field_value : product_specific_bits_data_) { - dict.Set(field_value.first, field_value.second ? "true" : "false"); + dict.Set(field_value.first, base::ToString(field_value.second)); } for (const auto& field_value : product_specific_string_data_) { dict.Set(field_value.first, field_value.second);
diff --git a/chrome/browser/ui/views/hover_button_unittest.cc b/chrome/browser/ui/views/hover_button_unittest.cc index 67dea7d..eee2640e 100644 --- a/chrome/browser/ui/views/hover_button_unittest.cc +++ b/chrome/browser/ui/views/hover_button_unittest.cc
@@ -9,6 +9,7 @@ #include <string> #include "base/strings/strcat.h" +#include "base/strings/to_string.h" #include "base/strings/utf_string_conversions.h" #include "build/build_config.h" #include "chrome/test/views/chrome_views_test_base.h" @@ -115,7 +116,7 @@ for (size_t i = 0; i < std::size(kTitleSubtitlePairs); ++i) { TitleSubtitlePair pair = kTitleSubtitlePairs[i]; SCOPED_TRACE(testing::Message() << "Index: " << i << ", expected_tooltip=" - << (pair.tooltip ? "true" : "false")); + << base::ToString(pair.tooltip)); auto button = std::make_unique<HoverButton>(views::Button::PressedCallback(), CreateIcon(), pair.title, pair.subtitle);
diff --git a/chrome/browser/ui/views/passwords/password_change/password_change_info_bubble_view_unittest.cc b/chrome/browser/ui/views/passwords/password_change/password_change_info_bubble_view_unittest.cc index 9d8b3e3f..ce2ddb8 100644 --- a/chrome/browser/ui/views/passwords/password_change/password_change_info_bubble_view_unittest.cc +++ b/chrome/browser/ui/views/passwords/password_change/password_change_info_bubble_view_unittest.cc
@@ -57,8 +57,8 @@ void SetUp() override { PasswordBubbleViewTestBase::SetUp(); password_change_delegate_ = std::make_unique<PasswordChangeDelegateMock>(); - ON_CALL(*password_change_delegate_, GetChangePasswordUrl()) - .WillByDefault(ReturnRef(password_change_url_)); + ON_CALL(*password_change_delegate_, GetDisplayOrigin()) + .WillByDefault(Return(u"example.com")); ON_CALL(*model_delegate_mock(), GetPasswordChangeDelegate()) .WillByDefault(Return(password_change_delegate_.get())); AccountInfo account_info = identity_test_env()->MakePrimaryAccountAvailable( @@ -93,7 +93,6 @@ private: std::unique_ptr<PasswordChangeDelegateMock> password_change_delegate_; - GURL password_change_url_ = GURL("https://example.com/password"); raw_ptr<PasswordChangeInfoBubbleView> view_; };
diff --git a/chrome/browser/ui/views/passwords/password_change/privacy_notice_view_unittest.cc b/chrome/browser/ui/views/passwords/password_change/privacy_notice_view_unittest.cc index c3adc8a..e45bb098 100644 --- a/chrome/browser/ui/views/passwords/password_change/privacy_notice_view_unittest.cc +++ b/chrome/browser/ui/views/passwords/password_change/privacy_notice_view_unittest.cc
@@ -22,8 +22,6 @@ void SetUp() override { PasswordBubbleViewTestBase::SetUp(); password_change_delegate_ = std::make_unique<PasswordChangeDelegateMock>(); - ON_CALL(*password_change_delegate_, GetChangePasswordUrl()) - .WillByDefault(ReturnRef(password_change_url_)); ON_CALL(*model_delegate_mock(), GetPasswordChangeDelegate()) .WillByDefault(Return(password_change_delegate_.get())); } @@ -53,7 +51,6 @@ private: std::unique_ptr<PasswordChangeDelegateMock> password_change_delegate_; - GURL password_change_url_ = GURL("https://example.com/password"); raw_ptr<PrivacyNoticeView> view_; };
diff --git a/chrome/browser/ui/views/passwords/password_change/successful_password_change_view_unittest.cc b/chrome/browser/ui/views/passwords/password_change/successful_password_change_view_unittest.cc index 1e4ae47..90a3c974 100644 --- a/chrome/browser/ui/views/passwords/password_change/successful_password_change_view_unittest.cc +++ b/chrome/browser/ui/views/passwords/password_change/successful_password_change_view_unittest.cc
@@ -43,6 +43,12 @@ password_change_delegate_ = std::make_unique<PasswordChangeDelegateMock>(); ON_CALL(*model_delegate_mock(), GetPasswordChangeDelegate()) .WillByDefault(Return(password_change_delegate_.get())); + ON_CALL(*password_change_delegate_, GetDisplayOrigin()) + .WillByDefault(Return(kDomain)); + ON_CALL(*password_change_delegate_, GetUsername()) + .WillByDefault(ReturnRef(kTestEmail)); + ON_CALL(*password_change_delegate_, GetGeneratedPassword()) + .WillByDefault(ReturnRef(kPassword)); } void TearDown() override {
diff --git a/chrome/browser/ui/views/profiles/first_run_flow_controller_dice.cc b/chrome/browser/ui/views/profiles/first_run_flow_controller_dice.cc index 2ba03cf..6955496 100644 --- a/chrome/browser/ui/views/profiles/first_run_flow_controller_dice.cc +++ b/chrome/browser/ui/views/profiles/first_run_flow_controller_dice.cc
@@ -468,8 +468,7 @@ } } -void FirstRunFlowControllerDice::Init( - StepSwitchFinishedCallback step_switch_finished_callback) { +void FirstRunFlowControllerDice::Init() { RegisterStep( Step::kIntro, CreateIntroStep(host(), @@ -477,8 +476,7 @@ &FirstRunFlowControllerDice::HandleIntroSigninChoice, weak_ptr_factory_.GetWeakPtr()), /*enable_animations=*/true)); - SwitchToStep(Step::kIntro, /*reset_state=*/true, - std::move(step_switch_finished_callback)); + SwitchToStep(Step::kIntro, /*reset_state=*/true); signin_metrics::LogSignInOffered( kAccessPoint, signin_metrics::PromoAction:: @@ -499,6 +497,12 @@ StepSwitchFinishedCallback()); } +void FirstRunFlowControllerDice::PickProfile( + const base::FilePath& profile_path, + ProfilePicker::ProfilePickingArgs args) { + NOTREACHED() << "FRE is not expected to handle this flow"; +} + bool FirstRunFlowControllerDice::PreFinishWithBrowser() { DCHECK(first_run_exited_callback_); std::move(first_run_exited_callback_)
diff --git a/chrome/browser/ui/views/profiles/first_run_flow_controller_dice.h b/chrome/browser/ui/views/profiles/first_run_flow_controller_dice.h index 5e2447b..8458a1a 100644 --- a/chrome/browser/ui/views/profiles/first_run_flow_controller_dice.h +++ b/chrome/browser/ui/views/profiles/first_run_flow_controller_dice.h
@@ -40,8 +40,10 @@ ~FirstRunFlowControllerDice() override; // ProfileManagementFlowControllerImpl: - void Init(StepSwitchFinishedCallback step_switch_finished_callback) override; + void Init() override; void CancelPostSignInFlow() override; + void PickProfile(const base::FilePath& profile_path, + ProfilePicker::ProfilePickingArgs args) override; protected: // ProfileManagementFlowControllerImpl
diff --git a/chrome/browser/ui/views/profiles/profile_management_flow_controller.h b/chrome/browser/ui/views/profiles/profile_management_flow_controller.h index 46b0deb..92421fe2 100644 --- a/chrome/browser/ui/views/profiles/profile_management_flow_controller.h +++ b/chrome/browser/ui/views/profiles/profile_management_flow_controller.h
@@ -9,6 +9,7 @@ #include "base/containers/flat_map.h" #include "base/memory/raw_ptr.h" +#include "chrome/browser/ui/profiles/profile_picker.h" #include "chrome/browser/ui/views/profiles/profile_management_types.h" #include "chrome/browser/ui/views/profiles/profile_picker_web_contents_host.h" #include "content/public/browser/web_contents.h" @@ -69,11 +70,7 @@ virtual ~ProfileManagementFlowController(); // Starts the flow by registering and switching to the first step. - // If `step_switch_finished_callback` is provided, it will be called with - // `true` when the navigation to the initial step succeeded, or with `false` - // otherwise. - virtual void Init(StepSwitchFinishedCallback step_switch_finished_callback = - StepSwitchFinishedCallback()) = 0; + virtual void Init() = 0; // Instructs a step registered as `step` to be shown. // If `step_switch_finished_callback` is provided, it will be called @@ -96,6 +93,10 @@ // screen (if the original EntryPoint was to open the picker). virtual void CancelPostSignInFlow() = 0; + // Picks the profile with `profile_path`. + virtual void PickProfile(const base::FilePath& profile_path, + ProfilePicker::ProfilePickingArgs args) = 0; + // Clears the current state and reset it to the initial state that shows the // main screen. When calling this function the state should not be the // initial one. Executes `callback` when the initial state is shown.
diff --git a/chrome/browser/ui/views/profiles/profile_picker_dice_sign_in_provider_browsertest.cc b/chrome/browser/ui/views/profiles/profile_picker_dice_sign_in_provider_browsertest.cc index 33f84aa..2bfd79e3 100644 --- a/chrome/browser/ui/views/profiles/profile_picker_dice_sign_in_provider_browsertest.cc +++ b/chrome/browser/ui/views/profiles/profile_picker_dice_sign_in_provider_browsertest.cc
@@ -6,7 +6,6 @@ #include "base/functional/callback_helpers.h" #include "base/test/mock_callback.h" -#include "base/test/scoped_feature_list.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/profiles/nuke_profile_directory_utils.h" #include "chrome/browser/profiles/profile.h" @@ -14,6 +13,7 @@ #include "chrome/browser/profiles/profile_attributes_storage.h" #include "chrome/browser/profiles/profile_manager.h" #include "chrome/browser/ui/browser.h" +#include "chrome/browser/ui/views/profiles/profile_picker_view_test_utils.h" #include "chrome/browser/ui/views/profiles/profile_picker_web_contents_host.h" #include "chrome/test/base/in_process_browser_test.h" #include "chrome/test/base/profile_deletion_observer.h" @@ -34,30 +34,6 @@ const char kExpectedSigninBaseUrl[] = "https://accounts.google.com/signin/chrome/sync"; -class MockHost : public ProfilePickerWebContentsHost { - public: - MOCK_METHOD(void, - ShowScreen, - (content::WebContents * contents, - const GURL& url, - base::OnceClosure navigation_finished_closure)); - MOCK_METHOD(void, - ShowScreenInPickerContents, - (const GURL& url, base::OnceClosure navigation_finished_closure)); - MOCK_METHOD(bool, ShouldUseDarkColors, (), (const)); - MOCK_METHOD(content::WebContents*, GetPickerContents, (), (const)); - MOCK_METHOD(void, SetNativeToolbarVisible, (bool visible)); - MOCK_METHOD(SkColor, GetPreferredBackgroundColor, (), (const)); - MOCK_METHOD(content::WebContentsDelegate*, GetWebContentsDelegate, ()); - MOCK_METHOD(web_modal::WebContentsModalDialogHost*, - GetWebContentsModalDialogHost, - ()); - MOCK_METHOD(void, Reset, (StepSwitchFinishedCallback callback)); - MOCK_METHOD(void, - ShowForceSigninErrorDialog, - (const ForceSigninUIError& error, bool success)); -}; - Profile* GetContentsProfile(content::WebContents* contents) { return Profile::FromBrowserContext(contents->GetBrowserContext()); } @@ -69,11 +45,10 @@ ProfilePickerDiceSignInProviderBrowserTest() = default; ~ProfilePickerDiceSignInProviderBrowserTest() override = default; - testing::NiceMock<MockHost>* host() { return &host_; } + testing::NiceMock<MockProfilePickerWebContentsHost>* host() { return &host_; } private: - testing::NiceMock<MockHost> host_; - base::test::ScopedFeatureList scoped_feature_list_; + testing::NiceMock<MockProfilePickerWebContentsHost> host_; }; IN_PROC_BROWSER_TEST_F(ProfilePickerDiceSignInProviderBrowserTest,
diff --git a/chrome/browser/ui/views/profiles/profile_picker_flow_controller.cc b/chrome/browser/ui/views/profiles/profile_picker_flow_controller.cc index 52e92330..1dfaa18 100644 --- a/chrome/browser/ui/views/profiles/profile_picker_flow_controller.cc +++ b/chrome/browser/ui/views/profiles/profile_picker_flow_controller.cc
@@ -10,10 +10,12 @@ #include "base/functional/callback_forward.h" #include "base/functional/callback_helpers.h" #include "base/functional/overloaded.h" +#include "base/metrics/histogram_functions.h" #include "base/not_fatal_until.h" #include "base/strings/utf_string_conversions.h" #include "base/trace_event/trace_event.h" #include "chrome/browser/browser_process.h" +#include "chrome/browser/metrics/first_web_contents_profiler_base.h" #include "chrome/browser/profiles/delete_profile_helper.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile_manager.h" @@ -24,7 +26,10 @@ #include "chrome/browser/signin/identity_manager_factory.h" #include "chrome/browser/themes/theme_service.h" #include "chrome/browser/themes/theme_service_factory.h" +#include "chrome/browser/ui/browser_commands.h" +#include "chrome/browser/ui/chrome_pages.h" #include "chrome/browser/ui/profiles/profile_customization_util.h" +#include "chrome/browser/ui/singleton_tabs.h" #include "chrome/browser/ui/views/frame/browser_view.h" #include "chrome/browser/ui/views/frame/toolbar_button_provider.h" #include "chrome/browser/ui/views/profiles/avatar_toolbar_button.h" @@ -37,6 +42,7 @@ #include "chrome/browser/ui/views/profiles/profile_picker_dice_reauth_provider.h" #include "chrome/browser/ui/views/profiles/profile_picker_signed_in_flow_controller.h" #include "chrome/browser/ui/views/profiles/profile_picker_web_contents_host.h" +#include "chrome/browser/ui/webui/signin/profile_picker_handler.h" #include "chrome/browser/ui/webui/signin/signin_ui_error.h" #include "chrome/common/webui_url_constants.h" #include "chrome/grit/branded_strings.h" @@ -321,24 +327,168 @@ } #endif +void RecordProfilingFinishReason( + metrics::StartupProfilingFinishReason finish_reason) { + base::UmaHistogramEnumeration( + "ProfilePicker.FirstProfileTime.FirstWebContentsFinishReason", + finish_reason); +} + +class FirstWebContentsProfilerForProfilePicker + : public metrics::FirstWebContentsProfilerBase { + public: + explicit FirstWebContentsProfilerForProfilePicker( + content::WebContents* web_contents, + base::TimeTicks pick_time); + + FirstWebContentsProfilerForProfilePicker( + const FirstWebContentsProfilerForProfilePicker&) = delete; + FirstWebContentsProfilerForProfilePicker& operator=( + const FirstWebContentsProfilerForProfilePicker&) = delete; + + protected: + // FirstWebContentsProfilerBase: + void RecordFinishReason( + metrics::StartupProfilingFinishReason finish_reason) override; + void RecordNavigationFinished(base::TimeTicks navigation_start) override; + void RecordFirstNonEmptyPaint() override; + bool WasStartupInterrupted() override; + + private: + ~FirstWebContentsProfilerForProfilePicker() override; + + const base::TimeTicks pick_time_; +}; + +FirstWebContentsProfilerForProfilePicker:: + FirstWebContentsProfilerForProfilePicker(content::WebContents* web_contents, + base::TimeTicks pick_time) + : FirstWebContentsProfilerBase(web_contents), pick_time_(pick_time) { + DCHECK(!pick_time_.is_null()); +} + +FirstWebContentsProfilerForProfilePicker:: + ~FirstWebContentsProfilerForProfilePicker() = default; + +void FirstWebContentsProfilerForProfilePicker::RecordFinishReason( + metrics::StartupProfilingFinishReason finish_reason) { + RecordProfilingFinishReason(finish_reason); +} + +void FirstWebContentsProfilerForProfilePicker::RecordNavigationFinished( + base::TimeTicks navigation_start) { + // Nothing to record here for Profile Picker startups. +} + +void FirstWebContentsProfilerForProfilePicker::RecordFirstNonEmptyPaint() { + const char histogram_name[] = + "ProfilePicker.FirstProfileTime.FirstWebContentsNonEmptyPaint"; + base::TimeTicks paint_time = base::TimeTicks::Now(); + base::UmaHistogramLongTimes100(histogram_name, paint_time - pick_time_); + TRACE_EVENT_NESTABLE_ASYNC_BEGIN_WITH_TIMESTAMP0("startup", histogram_name, + this, pick_time_); + TRACE_EVENT_NESTABLE_ASYNC_END_WITH_TIMESTAMP0("startup", histogram_name, + this, paint_time); +} + +bool FirstWebContentsProfilerForProfilePicker::WasStartupInterrupted() { + // We're assuming that no interruptions block opening an existing profile + // from the profile picker. We would detect this by observing really high + // latency on the tracked metric, and can start tracking interruptions if we + // find that such cases occur. + return false; +} + +// Measures time to display the first web contents. +void BeginFirstWebContentsProfiling(Browser* browser, + base::TimeTicks pick_time) { + content::WebContents* visible_contents = + metrics::FirstWebContentsProfilerBase::GetVisibleContents(browser); + if (!visible_contents) { + RecordProfilingFinishReason(metrics::StartupProfilingFinishReason:: + kAbandonNoInitiallyVisibleContent); + return; + } + + if (visible_contents->CompletedFirstVisuallyNonEmptyPaint()) { + RecordProfilingFinishReason( + metrics::StartupProfilingFinishReason::kAbandonAlreadyPaintedContent); + return; + } + + // FirstWebContentsProfilerForProfilePicker owns itself and is also bound to + // |visible_contents|'s lifetime by observing WebContentsDestroyed(). + new FirstWebContentsProfilerForProfilePicker(visible_contents, pick_time); +} + +void ShowLocalProfileCustomization( + base::TimeTicks profile_picked_time_on_startup, + Browser* browser) { + if (!browser) { + // TODO(crbug.com/40242414): Make sure we do something or log an error if + // opening a browser window was not possible. + return; + } + + DCHECK(browser->window()); + Profile* profile = browser->profile(); + + TRACE_EVENT1("browser", "ShowLocalProfileCustomization", "profile_path", + profile->GetPath().AsUTF8Unsafe()); + + if (!profile_picked_time_on_startup.is_null()) { + BeginFirstWebContentsProfiling(browser, profile_picked_time_on_startup); + } + + browser->signin_view_controller()->ShowModalProfileCustomizationDialog( + /*is_local_profile_creation=*/true); +} + +void MaybeOpenPageInBrowser(Browser* browser, + const GURL& target_page_url, + bool open_settings) { + // User clicked 'Edit' from the profile card menu. + if (open_settings) { + chrome::ShowSettingsSubPage(browser, chrome::kManageProfileSubPage); + return; + } + + // If no url is provided, proceed with the normal profile startup tabs + // behaviour. + if (target_page_url.is_empty()) { + return; + } + + // Opens the target url upon user selecting a pre-existing profile. + if (target_page_url.spec() == chrome::kChromeUIHelpURL) { + chrome::ShowAboutChrome(browser); + } else if (target_page_url.spec() == chrome::kChromeUISettingsURL) { + chrome::ShowSettings(browser); + } else if (target_page_url.spec() == ProfilePicker::kTaskManagerUrl) { + chrome::OpenTaskManager(browser); + } else { + ShowSingletonTabOverwritingNTP(browser, target_page_url); + } +} + } // namespace ProfilePickerFlowController::ProfilePickerFlowController( ProfilePickerWebContentsHost* host, ClearHostClosure clear_host_callback, - ProfilePicker::EntryPoint entry_point) + ProfilePicker::EntryPoint entry_point, + const GURL& selected_profile_target_url) : ProfileManagementFlowControllerImpl(host, std::move(clear_host_callback)), - entry_point_(entry_point) {} + entry_point_(entry_point), + selected_profile_target_url_(selected_profile_target_url) {} ProfilePickerFlowController::~ProfilePickerFlowController() = default; -void ProfilePickerFlowController::Init( - StepSwitchFinishedCallback step_switch_finished_callback) { +void ProfilePickerFlowController::Init() { RegisterStep(Step::kProfilePicker, ProfileManagementStepController::CreateForProfilePickerApp( host(), GetInitialURL(entry_point_))); - SwitchToStep(Step::kProfilePicker, /*reset_state=*/true, - std::move(step_switch_finished_callback)); + SwitchToStep(Step::kProfilePicker, /*reset_state=*/true); } #if BUILDFLAG(ENABLE_DICE_SUPPORT) @@ -507,17 +657,81 @@ void ProfilePickerFlowController::SwitchToSignedOutPostIdentityFlow( Profile* profile, - PostHostClearedCallback post_host_cleared_callback, StepSwitchFinishedCallback step_switch_finished_callback) { CHECK(profile); created_profile_ = profile->GetWeakPtr(); CreateSignedOutFlowWebContents(created_profile_.get()); HandleIdentityStepsCompleted( - created_profile_.get(), std::move(post_host_cleared_callback), + created_profile_.get(), + PostHostClearedCallback(base::BindOnce(&ShowLocalProfileCustomization, + profile_picked_time_on_startup_)), /*is_continue_callback=*/false, std::move(step_switch_finished_callback)); } +void ProfilePickerFlowController::PickProfile( + const base::FilePath& profile_path, + ProfilePicker::ProfilePickingArgs args) { + if (args.should_record_startup_metrics && + // Avoid overriding the picked time if already recorded. This can happen + // for example if multiple profiles are picked: https://crbug.com/1277466. + profile_picked_time_on_startup_.is_null()) { + profile_picked_time_on_startup_ = base::TimeTicks::Now(); + } + + profiles::SwitchToProfile( + profile_path, /*always_create=*/false, + base::BindOnce(&ProfilePickerFlowController::OnSwitchToProfileComplete, + weak_ptr_factory_.GetWeakPtr(), args.open_settings)); +} + +void ProfilePickerFlowController::OnSwitchToProfileComplete(bool open_settings, + Browser* browser) { + if (!browser || browser->is_delete_scheduled()) { + // The browser is destroyed or about to be destroyed. + return; + } + + DCHECK(browser->window()); + Profile* profile = browser->profile(); + TRACE_EVENT1("browser", + "ProfilePickerFlowController::OnSwitchToProfileComplete", + "profile_path", profile->GetPath().AsUTF8Unsafe()); + + // Measure startup time to display first web contents if the profile picker + // was displayed on startup and if the initiating action is instrumented. For + // example we don't record pick time for profile creations. + if (!profile_picked_time_on_startup_.is_null()) { + BeginFirstWebContentsProfiling(browser, profile_picked_time_on_startup_); + } + + // Only show the profile switch IPH when the user clicked the card, and there + // are multiple profiles. + std::vector<ProfileAttributesEntry*> entries = + g_browser_process->profile_manager() + ->GetProfileAttributesStorage() + .GetAllProfilesAttributes(); + int profile_count = + base::ranges::count(entries, false, &ProfileAttributesEntry::IsOmitted); + if (profile_count > 1 && !open_settings && + selected_profile_target_url_.is_empty()) { + browser->window()->MaybeShowProfileSwitchIPH(); + } + + if (profile->IsGuestSession()) { + RecordProfilePickerAction(ProfilePickerAction::kLaunchGuestProfile); + } else { + RecordProfilePickerAction( + open_settings + ? ProfilePickerAction::kLaunchExistingProfileCustomizeSettings + : ProfilePickerAction::kLaunchExistingProfile); + } + + MaybeOpenPageInBrowser(browser, selected_profile_target_url_, open_settings); + // Closes the Profile Picker. + ExitFlow(); +} + base::queue<ProfileManagementFlowController::Step> ProfilePickerFlowController::RegisterPostIdentitySteps( PostHostClearedCallback post_host_cleared_callback) {
diff --git a/chrome/browser/ui/views/profiles/profile_picker_flow_controller.h b/chrome/browser/ui/views/profiles/profile_picker_flow_controller.h index f26a61e7..4a05ce2 100644 --- a/chrome/browser/ui/views/profiles/profile_picker_flow_controller.h +++ b/chrome/browser/ui/views/profiles/profile_picker_flow_controller.h
@@ -23,10 +23,11 @@ public: ProfilePickerFlowController(ProfilePickerWebContentsHost* host, ClearHostClosure clear_host_callback, - ProfilePicker::EntryPoint entry_point); + ProfilePicker::EntryPoint entry_point, + const GURL& selected_profile_target_url); ~ProfilePickerFlowController() override; - void Init(StepSwitchFinishedCallback step_switch_finished_callback) override; + void Init() override; #if BUILDFLAG(ENABLE_DICE_SUPPORT) void SwitchToDiceSignIn(ProfilePicker::ProfileInfo profile_info, @@ -47,9 +48,12 @@ // without signing in. void SwitchToSignedOutPostIdentityFlow( Profile* profile, - PostHostClearedCallback post_host_cleared_callback, StepSwitchFinishedCallback step_switch_finished_callback); + // ProfileManagementFlowControllerImpl: + void PickProfile(const base::FilePath& profile_path, + ProfilePicker::ProfilePickingArgs args) override; + protected: // ProfileManagementFlowControllerImpl base::queue<ProfileManagementFlowController::Step> RegisterPostIdentitySteps( @@ -75,7 +79,11 @@ const CoreAccountInfo& account_info, std::unique_ptr<content::WebContents> contents) override; + // Callback after loading a profile and opening a browser. + void OnSwitchToProfileComplete(bool open_settings, Browser* browser); + const ProfilePicker::EntryPoint entry_point_; + const GURL selected_profile_target_url_; // Color provided when a profile creation is initiated, that may be used to // tint screens of the profile creation flow (currently this only affects the @@ -92,6 +100,12 @@ weak_signed_in_flow_controller_; base::WeakPtr<Profile> created_profile_; + + // Time when the user picked a profile to open, to measure browser startup + // performance. Only set when the picker is shown on startup. + base::TimeTicks profile_picked_time_on_startup_; + + base::WeakPtrFactory<ProfilePickerFlowController> weak_ptr_factory_{this}; }; #endif // CHROME_BROWSER_UI_VIEWS_PROFILES_PROFILE_PICKER_FLOW_CONTROLLER_H_
diff --git a/chrome/browser/ui/views/profiles/profile_picker_glic_flow_controller.cc b/chrome/browser/ui/views/profiles/profile_picker_glic_flow_controller.cc new file mode 100644 index 0000000..236e6b5 --- /dev/null +++ b/chrome/browser/ui/views/profiles/profile_picker_glic_flow_controller.cc
@@ -0,0 +1,85 @@ +// 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/ui/views/profiles/profile_picker_glic_flow_controller.h" + +#include "base/functional/bind.h" +#include "base/notreached.h" +#include "chrome/browser/browser_process.h" +#include "chrome/browser/profiles/keep_alive/profile_keep_alive_types.h" +#include "chrome/browser/profiles/keep_alive/scoped_profile_keep_alive.h" +#include "chrome/browser/profiles/profile_manager.h" +#include "chrome/browser/ui/views/profiles/profile_management_step_controller.h" +#include "chrome/common/webui_url_constants.h" + +namespace { + +GURL GetProfilePickerGlicURL() { + const GURL base_url = GURL(chrome::kChromeUIProfilePickerUrl); + GURL::Replacements replacements; + replacements.SetQueryStr(chrome::kChromeUIProfilePickerGlicQuery); + return base_url.ReplaceComponents(replacements); +} + +} // namespace + +ProfilePickerGlicFlowController::ProfilePickerGlicFlowController( + ProfilePickerWebContentsHost* host, + ClearHostClosure clear_host_callback, + base::OnceCallback<void(Profile*)> picked_profile_callback) + : ProfileManagementFlowController(host, std::move(clear_host_callback)), + picked_profile_callback_(std::move(picked_profile_callback)) { + CHECK(picked_profile_callback_); +} + +ProfilePickerGlicFlowController::~ProfilePickerGlicFlowController() { + if (picked_profile_callback_) { + Clear(); + } +} + +void ProfilePickerGlicFlowController::Init() { + RegisterStep(Step::kProfilePicker, + ProfileManagementStepController::CreateForProfilePickerApp( + host(), GetProfilePickerGlicURL())); + SwitchToStep(Step::kProfilePicker, /*reset_state=*/true); +} + +void ProfilePickerGlicFlowController::PickProfile( + const base::FilePath& profile_path, + ProfilePicker::ProfilePickingArgs args) { + g_browser_process->profile_manager()->LoadProfileByPath( + profile_path, /*incognito=*/false, + base::BindOnce(&ProfilePickerGlicFlowController::OnPickedProfileLoaded, + base::Unretained(this))); +} + +void ProfilePickerGlicFlowController::OnPickedProfileLoaded(Profile* profile) { + if (!profile) { + Clear(); + return; + } + + // Effectively removes `ProfileKeepAliveOrigin::kWaitingForFirstBrowserWindow` + // and expects the call in `picked_profile_callback_` to set a new keep alive + // if the profile should not be destroyed. + ScopedProfileKeepAlive keep_alive( + profile, ProfileKeepAliveOrigin::kWaitingForGlicView); + + // Return the loaded `profile` to the caller. + std::move(picked_profile_callback_).Run(profile); + + // Close the picker. + ExitFlow(); +} + +void ProfilePickerGlicFlowController::Clear() { + std::move(picked_profile_callback_).Run(nullptr); + ExitFlow(); +} + +void ProfilePickerGlicFlowController::CancelPostSignInFlow() { + NOTREACHED() << "The glic flow controller is not expected to support this " + "part of the flow as it does not support signing in."; +}
diff --git a/chrome/browser/ui/views/profiles/profile_picker_glic_flow_controller.h b/chrome/browser/ui/views/profiles/profile_picker_glic_flow_controller.h new file mode 100644 index 0000000..6343a78a --- /dev/null +++ b/chrome/browser/ui/views/profiles/profile_picker_glic_flow_controller.h
@@ -0,0 +1,52 @@ +// 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 CHROME_BROWSER_UI_VIEWS_PROFILES_PROFILE_PICKER_GLIC_FLOW_CONTROLLER_H_ +#define CHROME_BROWSER_UI_VIEWS_PROFILES_PROFILE_PICKER_GLIC_FLOW_CONTROLLER_H_ + +#include "base/functional/callback_forward.h" +#include "chrome/browser/ui/views/profiles/profile_management_flow_controller.h" + +class Profile; + +// Profile management flow controller that will run the Glic version of the +// Profile Picker. +class ProfilePickerGlicFlowController : public ProfileManagementFlowController { + public: + // `picked_profile_callback` will always be called, and may be called with + // a nullptr profile in case the profile failed to load or the `host` was + // closed without any selection. + // If the returned `profile` is not null, the controller will ensure that the + // profile is not destroyed by keeping a `ScopedProfileKeepAlive` during the + // execution of `picked_profile_callback`, the callback is then expected to + // set its own if the Profile should not be destroyed. + ProfilePickerGlicFlowController( + ProfilePickerWebContentsHost* host, + ClearHostClosure clear_host_callback, + base::OnceCallback<void(Profile*)> picked_profile_callback); + ~ProfilePickerGlicFlowController() override; + + // ProfileManagementFlowController: + void Init() override; + // Loads the profile with `profile_path` asynchronously then attempts to run + // the `picked_profile_callback_` callback with the loaded profile. + // `args` are actually not used in this implementation. + void PickProfile(const base::FilePath& profile_path, + ProfilePicker::ProfilePickingArgs args) override; + + private: + // ProfileManagementFlowController: + void CancelPostSignInFlow() override; + + // Callback after loading the picked profile. + void OnPickedProfileLoaded(Profile* profile); + + // Makes sure to clear the current flow and return a nullptr profile to the + // callback. + void Clear(); + + base::OnceCallback<void(Profile*)> picked_profile_callback_; +}; + +#endif // CHROME_BROWSER_UI_VIEWS_PROFILES_PROFILE_PICKER_GLIC_FLOW_CONTROLLER_H_
diff --git a/chrome/browser/ui/views/profiles/profile_picker_glic_flow_controller_browsertest.cc b/chrome/browser/ui/views/profiles/profile_picker_glic_flow_controller_browsertest.cc new file mode 100644 index 0000000..353aa111 --- /dev/null +++ b/chrome/browser/ui/views/profiles/profile_picker_glic_flow_controller_browsertest.cc
@@ -0,0 +1,141 @@ +// 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/ui/views/profiles/profile_picker_glic_flow_controller.h" + +#include "base/files/file_path.h" +#include "base/functional/callback_forward.h" +#include "base/functional/callback_helpers.h" +#include "base/test/mock_callback.h" +#include "base/test/test_future.h" +#include "chrome/browser/browser_process.h" +#include "chrome/browser/profiles/keep_alive/profile_keep_alive_types.h" +#include "chrome/browser/profiles/profile.h" +#include "chrome/browser/profiles/profile_destroyer.h" +#include "chrome/browser/profiles/profile_manager.h" +#include "chrome/browser/profiles/profile_test_util.h" +#include "chrome/browser/ui/browser.h" +#include "chrome/browser/ui/views/profiles/profile_picker_view_test_utils.h" +#include "chrome/test/base/in_process_browser_test.h" +#include "chrome/test/base/profile_destruction_waiter.h" +#include "chrome/test/base/profile_waiter.h" +#include "content/public/test/browser_test.h" +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" + +class ProfilePickerGlicFlowControllerBrowserTest : public InProcessBrowserTest { + public: + ProfilePickerGlicFlowControllerBrowserTest() = default; + ~ProfilePickerGlicFlowControllerBrowserTest() override = default; + + testing::NiceMock<MockProfilePickerWebContentsHost>* host() { return &host_; } + + private: + testing::NiceMock<MockProfilePickerWebContentsHost> host_; +}; + +IN_PROC_BROWSER_TEST_F(ProfilePickerGlicFlowControllerBrowserTest, + InitController) { + EXPECT_CALL(*host(), ShowScreenInPickerContents( + GURL("chrome://profile-picker/?glic"), testing::_)); + + ProfilePickerGlicFlowController controller( + host(), ClearHostClosure(base::DoNothing()), base::DoNothing()); + controller.Init(); +} + +IN_PROC_BROWSER_TEST_F(ProfilePickerGlicFlowControllerBrowserTest, + PickProfileWithProfileNotLoaded) { + // Create a new Profile and destroy it immediately so that it is not loaded. + ProfileManager* profile_manager = g_browser_process->profile_manager(); + base::FilePath new_profile_path = + profile_manager->GenerateNextProfileDirectoryPath(); + Profile* new_profile = + &profiles::testing::CreateProfileSync(profile_manager, new_profile_path); + ProfileDestructionWaiter profile_destruction_waiter(new_profile); + Browser* new_browser = CreateBrowser(new_profile); + CloseBrowserSynchronously(new_browser); + profile_destruction_waiter.Wait(); + + base::MockCallback<base::OnceClosure> clear_host_callback; + EXPECT_CALL(clear_host_callback, Run()); + + base::MockCallback<base::OnceCallback<void(Profile*)>> + picked_profile_callback; + ProfileWaiter profile_waiter; + // Make sure that the loaded Profile is valid and corresponds to the newly + // created one. + EXPECT_CALL(picked_profile_callback, Run(testing::_)) + .WillOnce([&new_profile_path, &profile_manager](Profile* profile) { + ASSERT_TRUE(profile); + EXPECT_EQ(profile->GetPath(), new_profile_path); + EXPECT_FALSE(profile_manager->HasKeepAliveForTesting( + profile, ProfileKeepAliveOrigin::kWaitingForFirstBrowserWindow)); + EXPECT_TRUE(profile_manager->HasKeepAliveForTesting( + profile, ProfileKeepAliveOrigin::kWaitingForGlicView)); + }); + + ProfilePickerGlicFlowController controller( + host(), ClearHostClosure(clear_host_callback.Get()), + picked_profile_callback.Get()); + controller.PickProfile(new_profile_path, ProfilePicker::ProfilePickingArgs()); + + profile_waiter.WaitForProfileAdded(); +} + +IN_PROC_BROWSER_TEST_F(ProfilePickerGlicFlowControllerBrowserTest, + PickProfileWithCurrentProfile) { + base::MockCallback<base::OnceClosure> clear_host_callback; + EXPECT_CALL(clear_host_callback, Run()); + + base::MockCallback<base::OnceCallback<void(Profile*)>> + picked_profile_callback; + // Return the currently active profile right away if it is already loaded. + EXPECT_CALL(picked_profile_callback, Run(browser()->profile())); + + ProfilePickerGlicFlowController controller( + host(), ClearHostClosure(clear_host_callback.Get()), + picked_profile_callback.Get()); + controller.PickProfile(browser()->profile()->GetPath(), + ProfilePicker::ProfilePickingArgs()); +} + +IN_PROC_BROWSER_TEST_F(ProfilePickerGlicFlowControllerBrowserTest, + PickProfileWithNonExistingProfile) { + base::MockCallback<base::OnceClosure> clear_host_callback; + EXPECT_CALL(clear_host_callback, Run()); + + base::MockCallback<base::OnceCallback<void(Profile*)>> + picked_profile_callback; + // Callback returns a nullptr profile for non existing profiles. + EXPECT_CALL(picked_profile_callback, Run(nullptr)); + + ProfilePickerGlicFlowController controller( + host(), ClearHostClosure(clear_host_callback.Get()), + picked_profile_callback.Get()); + // Next profile directly is guaranteed not to be tied to an existing profile + // as it was not created yet. + base::FilePath non_profile_file_path = + g_browser_process->profile_manager()->GenerateNextProfileDirectoryPath(); + controller.PickProfile(non_profile_file_path, + ProfilePicker::ProfilePickingArgs()); +} + +IN_PROC_BROWSER_TEST_F(ProfilePickerGlicFlowControllerBrowserTest, + ClearingControllerShouldCallTheInputCallbacks) { + base::MockCallback<base::OnceClosure> clear_host_callback; + EXPECT_CALL(clear_host_callback, Run()); + + base::MockCallback<base::OnceCallback<void(Profile*)>> + picked_profile_callback; + // Callback returns a nullptr profile if no profile was selected. + EXPECT_CALL(picked_profile_callback, Run(nullptr)); + + { + ProfilePickerGlicFlowController controller( + host(), ClearHostClosure(clear_host_callback.Get()), + picked_profile_callback.Get()); + } + // Controller is destroyed without any profile selection. +}
diff --git a/chrome/browser/ui/views/profiles/profile_picker_view.cc b/chrome/browser/ui/views/profiles/profile_picker_view.cc index 68fba63..56d364d20 100644 --- a/chrome/browser/ui/views/profiles/profile_picker_view.cc +++ b/chrome/browser/ui/views/profiles/profile_picker_view.cc
@@ -42,7 +42,6 @@ #include "chrome/browser/ui/views/profiles/profile_management_types.h" #include "chrome/browser/ui/views/profiles/profile_picker_feature_promo_controller.h" #include "chrome/browser/ui/views/profiles/profile_picker_flow_controller.h" -#include "chrome/browser/ui/webui/signin/profile_picker_handler.h" #include "chrome/browser/ui/webui/signin/profile_picker_ui.h" #include "chrome/browser/ui/webui/signin/signin_url_utils.h" #include "chrome/browser/user_education/user_education_service_factory.h" @@ -185,14 +184,6 @@ } // static -GURL ProfilePicker::GetOnSelectProfileTargetUrl() { - if (g_profile_picker_view) { - return g_profile_picker_view->GetOnSelectProfileTargetUrl(); - } - return GURL(); -} - -// static base::FilePath ProfilePicker::GetSwitchProfilePath() { if (g_profile_picker_view) { return g_profile_picker_view->GetProfilePickerFlowController() @@ -226,12 +217,18 @@ // static void ProfilePicker::SwitchToSignedOutPostIdentityFlow( std::optional<SkColor> profile_color, - base::TimeTicks profile_picked_time_on_startup, base::OnceCallback<void(bool)> switch_finished_callback) { if (g_profile_picker_view) { g_profile_picker_view->SwitchToSignedOutPostIdentityFlow( - profile_color, profile_picked_time_on_startup, - std::move(switch_finished_callback)); + profile_color, std::move(switch_finished_callback)); + } +} + +// static +void ProfilePicker::PickProfile(const base::FilePath& profile_path, + ProfilePickingArgs args) { + if (g_profile_picker_view) { + g_profile_picker_view->flow_controller_->PickProfile(profile_path, args); } } @@ -446,7 +443,6 @@ void ProfilePickerView::SwitchToSignedOutPostIdentityFlow( std::optional<SkColor> profile_color, - base::TimeTicks profile_picked_time_on_startup, base::OnceCallback<void(bool)> switch_finished_callback) { size_t icon_index = profiles::GetPlaceholderAvatarIndex(); @@ -457,13 +453,11 @@ icon_index, /*is_hidden=*/true, base::BindOnce(&ProfilePickerView::OnLocalProfileInitialized, weak_ptr_factory_.GetWeakPtr(), profile_color, - profile_picked_time_on_startup, std::move(switch_finished_callback))); } void ProfilePickerView::OnLocalProfileInitialized( std::optional<SkColor> profile_color, - base::TimeTicks profile_picked_time_on_startup, base::OnceCallback<void(bool)> switch_finished_callback, Profile* profile) { if (!profile) { @@ -486,35 +480,7 @@ // Skip the FRE for this profile as sign-in was offered as part of the flow. profile->GetPrefs()->SetBoolean(prefs::kHasSeenWelcomePage, true); GetProfilePickerFlowController()->SwitchToSignedOutPostIdentityFlow( - profile, - PostHostClearedCallback(base::BindOnce( - &ProfilePickerView::ShowLocalProfileCustomization, - weak_ptr_factory_.GetWeakPtr(), profile_picked_time_on_startup)), - std::move(switch_finished_callback)); -} - -void ProfilePickerView::ShowLocalProfileCustomization( - base::TimeTicks profile_picked_time_on_startup, - Browser* browser) { - if (!browser) { - // TODO(crbug.com/40242414): Make sure we do something or log an error if - // opening a browser window was not possible. - return; - } - - DCHECK(browser->window()); - Profile* profile = browser->profile(); - - TRACE_EVENT1("browser", "ProfilePickerView::ShowLocalProfileCustomization", - "profile_path", profile->GetPath().AsUTF8Unsafe()); - - if (!profile_picked_time_on_startup.is_null()) { - ProfilePickerHandler::BeginFirstWebContentsProfiling( - browser, profile_picked_time_on_startup); - } - - browser->signin_view_controller()->ShowModalProfileCustomizationDialog( - /*is_local_profile_creation=*/true); + profile, std::move(switch_finished_callback)); } #if BUILDFLAG(ENABLE_DICE_SUPPORT) @@ -735,7 +701,8 @@ DCHECK(IsClassicProfilePickerFlow(params_)); return std::make_unique<ProfilePickerFlowController>( - /*host=*/this, std::move(clear_host_callback), params_.entry_point()); + /*host=*/this, std::move(clear_host_callback), params_.entry_point(), + params_.on_select_profile_target_url()); } #if BUILDFLAG(ENABLE_DICE_SUPPORT) @@ -959,10 +926,6 @@ tracker_service, user_education_service, g_profile_picker_view); } -GURL ProfilePickerView::GetOnSelectProfileTargetUrl() const { - return params_.on_select_profile_target_url(); -} - ProfilePickerFlowController* ProfilePickerView::GetProfilePickerFlowController() const { DCHECK(IsClassicProfilePickerFlow(params_));
diff --git a/chrome/browser/ui/views/profiles/profile_picker_view.h b/chrome/browser/ui/views/profiles/profile_picker_view.h index 695e2f0..6607bdb0 100644 --- a/chrome/browser/ui/views/profiles/profile_picker_view.h +++ b/chrome/browser/ui/views/profiles/profile_picker_view.h
@@ -32,7 +32,6 @@ class ScopedProfileKeepAlive; class ProfileManagementFlowController; class ProfilePickerFlowController; -class Browser; class ProfilePickerFeaturePromoController; class ForceSigninUIError; @@ -190,22 +189,14 @@ // when the picker is shown on startup. void SwitchToSignedOutPostIdentityFlow( std::optional<SkColor> profile_color, - base::TimeTicks profile_picked_time_on_startup, base::OnceCallback<void(bool)> switch_finished_callback); // Callback used when the profile is created in the signed out flow. void OnLocalProfileInitialized( std::optional<SkColor> profile_color, - base::TimeTicks profile_picked_time_on_startup, base::OnceCallback<void(bool)> switch_finished_callback, Profile* profile); - // Callback used when the browser is launched after finishing the signed out - // flow. - void ShowLocalProfileCustomization( - base::TimeTicks profile_picked_time_on_startup, - Browser* browser); - #if BUILDFLAG(ENABLE_DICE_SUPPORT) // Switches the layout to the sign-in screen (and creates a new profile or // load an existing one based on the `profile_info` content). @@ -236,10 +227,6 @@ // on Windows). void ConfigureAccelerators(); - // Getter of the target page url. If not empty and is valid, it opens on - // profile selection instead of the new tab page. - GURL GetOnSelectProfileTargetUrl() const; - ProfilePickerFlowController* GetProfilePickerFlowController() const; // Returns a closure that can be executed to clear (see
diff --git a/chrome/browser/ui/views/profiles/profile_picker_view_test_utils.cc b/chrome/browser/ui/views/profiles/profile_picker_view_test_utils.cc index 3f142de..f333270 100644 --- a/chrome/browser/ui/views/profiles/profile_picker_view_test_utils.cc +++ b/chrome/browser/ui/views/profiles/profile_picker_view_test_utils.cc
@@ -7,6 +7,7 @@ #include "base/files/file_path.h" #include "base/functional/bind.h" #include "base/location.h" +#include "base/notreached.h" #include "base/run_loop.h" #include "build/build_config.h" #include "chrome/browser/profiles/profile.h" @@ -54,23 +55,17 @@ initial_step_load_finished_closure_( std::move(initial_step_load_finished_closure)) {} - void Init(StepSwitchFinishedCallback step_switch_finished_callback) override { + void Init() override { RegisterStep(step_, step_controller_factory_.Run(host())); SwitchToStep( step_, /*reset_state=*/true, /*step_switch_finished_callback=*/ base::BindOnce( &TestProfileManagementFlowController::OnInitialStepSwitchFinished, - weak_ptr_factory_.GetWeakPtr(), - std::move(step_switch_finished_callback))); + weak_ptr_factory_.GetWeakPtr())); } - void OnInitialStepSwitchFinished(StepSwitchFinishedCallback original_callback, - bool success) { - if (original_callback) { - std::move(original_callback).Run(success); - } - + void OnInitialStepSwitchFinished(bool success) { if (host()->GetPickerContents()->IsLoading()) { Observe(host()->GetPickerContents()); } else { @@ -87,6 +82,11 @@ void CancelPostSignInFlow() override { NOTREACHED(); } + void PickProfile(const base::FilePath& profile_path, + ProfilePicker::ProfilePickingArgs args) override { + NOTREACHED(); + } + Step step_; ProfileManagementStepTestView::StepControllerFactory step_controller_factory_; base::OnceClosure initial_step_load_finished_closure_; @@ -249,6 +249,9 @@ run_loop_.QuitClosure()); } +MockProfilePickerWebContentsHost::MockProfilePickerWebContentsHost() = default; +MockProfilePickerWebContentsHost::~MockProfilePickerWebContentsHost() = default; + // -- Other utils -------------------------------------------------------------- namespace profiles::testing {
diff --git a/chrome/browser/ui/views/profiles/profile_picker_view_test_utils.h b/chrome/browser/ui/views/profiles/profile_picker_view_test_utils.h index d518336..6dccfdb1 100644 --- a/chrome/browser/ui/views/profiles/profile_picker_view_test_utils.h +++ b/chrome/browser/ui/views/profiles/profile_picker_view_test_utils.h
@@ -15,6 +15,7 @@ #include "chrome/browser/ui/views/profiles/profile_picker_view.h" #include "chrome/browser/ui/views/profiles/profile_picker_web_contents_host.h" #include "content/public/browser/web_contents_observer.h" +#include "testing/gmock/include/gmock/gmock.h" #include "ui/views/view_observer.h" class Profile; @@ -123,4 +124,32 @@ base::RunLoop run_loop_; }; +// Mock implementation of the `ProfilePickerWebContentsHost`. +class MockProfilePickerWebContentsHost : public ProfilePickerWebContentsHost { + public: + MockProfilePickerWebContentsHost(); + ~MockProfilePickerWebContentsHost(); + + MOCK_METHOD(void, + ShowScreen, + (content::WebContents * contents, + const GURL& url, + base::OnceClosure navigation_finished_closure)); + MOCK_METHOD(void, + ShowScreenInPickerContents, + (const GURL& url, base::OnceClosure navigation_finished_closure)); + MOCK_METHOD(bool, ShouldUseDarkColors, (), (const)); + MOCK_METHOD(content::WebContents*, GetPickerContents, (), (const)); + MOCK_METHOD(void, SetNativeToolbarVisible, (bool visible)); + MOCK_METHOD(SkColor, GetPreferredBackgroundColor, (), (const)); + MOCK_METHOD(content::WebContentsDelegate*, GetWebContentsDelegate, ()); + MOCK_METHOD(web_modal::WebContentsModalDialogHost*, + GetWebContentsModalDialogHost, + ()); + MOCK_METHOD(void, Reset, (StepSwitchFinishedCallback callback)); + MOCK_METHOD(void, + ShowForceSigninErrorDialog, + (const ForceSigninUIError& error, bool success)); +}; + #endif // CHROME_BROWSER_UI_VIEWS_PROFILES_PROFILE_PICKER_VIEW_TEST_UTILS_H_
diff --git a/chrome/browser/ui/views/side_panel/extensions/extension_side_panel_browsertest.cc b/chrome/browser/ui/views/side_panel/extensions/extension_side_panel_browsertest.cc index 0d6c744..31be534f 100644 --- a/chrome/browser/ui/views/side_panel/extensions/extension_side_panel_browsertest.cc +++ b/chrome/browser/ui/views/side_panel/extensions/extension_side_panel_browsertest.cc
@@ -4,6 +4,7 @@ #include "base/feature_list.h" #include "base/memory/ref_counted.h" +#include "base/strings/to_string.h" #include "base/test/run_until.h" #include "chrome/browser/extensions/api/side_panel/side_panel_api.h" #include "chrome/browser/extensions/extension_browsertest.h" @@ -183,7 +184,7 @@ : ""; std::string args = base::StringPrintf(R"([{%s%s"enabled":%s}])", tab_id_arg.c_str(), - path_arg.c_str(), enabled ? "true" : "false"); + path_arg.c_str(), base::ToString(enabled)); EXPECT_TRUE(api_test_utils::RunFunction(function.get(), args, profile())) << function->GetError(); } @@ -197,7 +198,7 @@ std::string args = base::StringPrintf(R"([{"openPanelOnActionClick":%s}])", - openPanelOnActionClick ? "true" : "false"); + base::ToString(openPanelOnActionClick)); EXPECT_TRUE(api_test_utils::RunFunction(function.get(), args, profile())) << function->GetError(); }
diff --git a/chrome/browser/ui/views/side_panel/side_panel_coordinator_browsertest.cc b/chrome/browser/ui/views/side_panel/side_panel_coordinator_browsertest.cc index e7145ed..ae53dd5 100644 --- a/chrome/browser/ui/views/side_panel/side_panel_coordinator_browsertest.cc +++ b/chrome/browser/ui/views/side_panel/side_panel_coordinator_browsertest.cc
@@ -11,6 +11,7 @@ #include "base/i18n/rtl.h" #include "base/memory/raw_ptr.h" #include "base/memory/scoped_refptr.h" +#include "base/strings/to_string.h" #include "base/strings/utf_string_conversions.h" #include "base/test/icu_test_util.h" #include "base/test/run_until.h" @@ -221,7 +222,7 @@ : ""; std::string args = base::StringPrintf(R"([{%s%s"enabled":%s}])", tab_id_arg.c_str(), - path_arg.c_str(), enabled ? "true" : "false"); + path_arg.c_str(), base::ToString(enabled)); EXPECT_TRUE(extensions::api_test_utils::RunFunction(function.get(), args, browser()->profile())) << function->GetError();
diff --git a/chrome/browser/ui/views/tabs/tab_strip_action_container.h b/chrome/browser/ui/views/tabs/tab_strip_action_container.h index 5a079b1..ef61dc1 100644 --- a/chrome/browser/ui/views/tabs/tab_strip_action_container.h +++ b/chrome/browser/ui/views/tabs/tab_strip_action_container.h
@@ -97,7 +97,7 @@ return tab_organization_service_; } - glic::GlicButton *GetGlicButton() { return glic_button_; } + glic::GlicButton* GetGlicButton() { return glic_button_; } ProductSpecificationsButton* GetProductSpecificationsButton() { return product_specifications_button_; @@ -183,8 +183,8 @@ raw_ptr<const Browser> browser_; // The TabStripController is removed as part of the TabStripRegionView's - // destructor before this class gets cleanup up. THis Pointer is avlid except - // during destruciotn. + // destructor before this class gets cleanup up. This pointer is valid except + // during destruction. const raw_ptr<TabStripController> tab_strip_controller_ = nullptr; // Timer for hiding tab_strip_nudge_button_ after show.
diff --git a/chrome/browser/ui/views/tabs/tab_strip_combo_button.cc b/chrome/browser/ui/views/tabs/tab_strip_combo_button.cc index ed5b4c9..7414003 100644 --- a/chrome/browser/ui/views/tabs/tab_strip_combo_button.cc +++ b/chrome/browser/ui/views/tabs/tab_strip_combo_button.cc
@@ -93,10 +93,15 @@ std::make_unique<views::Separator>(); const int color_id = features::HasTabstripComboButtonWithBackground() ? kColorTabStripComboButtonSeparator - : kColorTabStripComboButtonSeparatorOnHeader; + : kColorTabDividerFrameActive; separator->SetColorId(color_id); separator->SetBorderRadius(kSeparatorBorderRadius); separator->SetPreferredSize(gfx::Size(kSeparatorWidth, kSeparatorHeight)); + subscriptions_.push_back(browser->RegisterDidBecomeActive(base::BindRepeating( + &TabStripComboButton::DidBecomeActive, base::Unretained(this)))); + subscriptions_.push_back( + browser->RegisterDidBecomeInactive(base::BindRepeating( + &TabStripComboButton::DidBecomeInactive, base::Unretained(this)))); Edge tab_search_button_flat_edge = Edge::kNone; if (features::HasTabstripComboButtonWithBackground()) { @@ -166,6 +171,18 @@ UpdateSeparatorVisibility(); } +void TabStripComboButton::DidBecomeActive(BrowserWindowInterface* browser) { + if (features::HasTabstripComboButtonWithBackground()) { + separator_->SetColorId(kColorTabStripComboButtonSeparator); + } else { + separator_->SetColorId(kColorTabDividerFrameActive); + } +} + +void TabStripComboButton::DidBecomeInactive(BrowserWindowInterface* browser) { + separator_->SetColorId(kColorTabDividerFrameInactive); +} + void TabStripComboButton::UpdateSeparatorVisibility() { const views::Button::ButtonState new_tab_button_state = new_tab_button_->GetState();
diff --git a/chrome/browser/ui/views/tabs/tab_strip_combo_button.h b/chrome/browser/ui/views/tabs/tab_strip_combo_button.h index 25dc5ca..3c128a26 100644 --- a/chrome/browser/ui/views/tabs/tab_strip_combo_button.h +++ b/chrome/browser/ui/views/tabs/tab_strip_combo_button.h
@@ -27,6 +27,8 @@ void OnNewTabButtonStateChanged(); void OnTabSearchButtonStateChanged(); + void DidBecomeActive(BrowserWindowInterface* browser); + void DidBecomeInactive(BrowserWindowInterface* browser); void UpdateSeparatorVisibility(); views::Button* new_tab_button() { return new_tab_button_; }
diff --git a/chrome/browser/ui/views/toolbar/toolbar_controller_interactive_uitest.cc b/chrome/browser/ui/views/toolbar/toolbar_controller_interactive_uitest.cc index 998c5be..4442200 100644 --- a/chrome/browser/ui/views/toolbar/toolbar_controller_interactive_uitest.cc +++ b/chrome/browser/ui/views/toolbar/toolbar_controller_interactive_uitest.cc
@@ -7,6 +7,7 @@ #include "base/functional/overloaded.h" #include "base/strings/stringprintf.h" +#include "base/strings/to_string.h" #include "base/test/metrics/user_action_tester.h" #include "build/build_config.h" #include "chrome/app/chrome_command_ids.h" @@ -181,7 +182,7 @@ return CheckResult([this, id]() { return delegate()->IsOverflowed(id); }, overflowed, base::StringPrintf("CheckActionItemOverflowed(%s)", - overflowed ? "true" : "false")); + base::ToString(overflowed))); } // Forces `id` to overflow by filling toolbar with dummy buttons.
diff --git a/chrome/browser/ui/views/user_education/feature_promo_lifecycle_interactive_uitest.cc b/chrome/browser/ui/views/user_education/feature_promo_lifecycle_interactive_uitest.cc index 0efc2a1..f7c2d1ad 100644 --- a/chrome/browser/ui/views/user_education/feature_promo_lifecycle_interactive_uitest.cc +++ b/chrome/browser/ui/views/user_education/feature_promo_lifecycle_interactive_uitest.cc
@@ -164,7 +164,7 @@ return !testing::Test::HasNonfatalFailure(); })) .SetDescription(base::StringPrintf("CheckSnoozePrefs( %s, %d, %d )", - is_dismissed ? "true" : "false", + base::ToString(is_dismissed), show_count, snooze_count))); } @@ -211,7 +211,7 @@ {*feature, key}) == dismissed; })) .SetDescription( - base::StrCat({"CheckDismissed( ", dismissed ? "true" : "false", + base::StrCat({"CheckDismissed( ", base::ToString(dismissed), ", ", feature->name, " )"}))); }
diff --git a/chrome/browser/ui/views/user_education/help_bubble_factory_webui_interactive_uitest.cc b/chrome/browser/ui/views/user_education/help_bubble_factory_webui_interactive_uitest.cc index 2b68d1e7..3a89792 100644 --- a/chrome/browser/ui/views/user_education/help_bubble_factory_webui_interactive_uitest.cc +++ b/chrome/browser/ui/views/user_education/help_bubble_factory_webui_interactive_uitest.cc
@@ -8,6 +8,7 @@ #include "base/functional/callback_forward.h" #include "base/i18n/base_i18n_switches.h" #include "base/strings/stringprintf.h" +#include "base/strings/to_string.h" #include "base/strings/utf_string_conversions.h" #include "base/test/bind.h" #include "chrome/browser/profiles/profile.h" @@ -141,7 +142,7 @@ has_help_bubble) .SetDescription(base::StringPrintf( "CheckHandlerHasHelpBubble(%s)", - has_help_bubble ? "true" : "false")))); + base::ToString(has_help_bubble))))); } auto Cleanup() {
diff --git a/chrome/browser/ui/views/user_education/low_usage_promo_browsertest.cc b/chrome/browser/ui/views/user_education/low_usage_promo_browsertest.cc index 239f82b..cb2285c9 100644 --- a/chrome/browser/ui/views/user_education/low_usage_promo_browsertest.cc +++ b/chrome/browser/ui/views/user_education/low_usage_promo_browsertest.cc
@@ -6,6 +6,7 @@ #include <sstream> +#include "base/strings/to_string.h" #include "base/test/scoped_feature_list.h" #include "base/values.h" #include "chrome/browser/policy/policy_test_utils.h" @@ -33,10 +34,9 @@ bool GetUseAlternateSearchProvider() const { return std::get<1>(GetParam()); } void SetUp() override { - const std::string enabled = GetAiEnabled() ? "true" : "false"; feature_list_.InitAndEnableFeatureWithParameters( feature_engagement::kIPHDesktopReEngagementFeature, - {{"include_ai", enabled}}); + {{"include_ai", base::ToString(GetAiEnabled())}}); PolicyTest::SetUp(); }
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 18edd6b..7fbe73e6 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
@@ -977,7 +977,7 @@ UninstallPolicyAppById(profile, app_id); } - if (provider->registrar_unsafe().IsNotInRegistrar(app_id)) { + if (!provider->registrar_unsafe().IsInRegistrar(app_id)) { LOG(INFO) << "TearDownOnMainThread: Uninstall complete."; continue; }
diff --git a/chrome/browser/ui/web_applications/web_app_launch_utils.cc b/chrome/browser/ui/web_applications/web_app_launch_utils.cc index 798ed05..6c16b75 100644 --- a/chrome/browser/ui/web_applications/web_app_launch_utils.cc +++ b/chrome/browser/ui/web_applications/web_app_launch_utils.cc
@@ -179,10 +179,8 @@ Browser* browser, WebAppProvider* provider, const webapps::AppId& app_id) { - const ash::SystemWebAppDelegate* system_app = - GetSystemWebAppDelegate(browser, app_id); - return std::make_unique<ash::WebKioskBrowserControllerAsh>( - *provider, browser, app_id, system_app); + return std::make_unique<ash::WebKioskBrowserControllerAsh>(*provider, browser, + app_id); } #endif // BUILDFLAG(IS_CHROMEOS)
diff --git a/chrome/browser/ui/web_applications/web_app_navigate_browsertest.cc b/chrome/browser/ui/web_applications/web_app_navigate_browsertest.cc index 6e22a627..b5148baa 100644 --- a/chrome/browser/ui/web_applications/web_app_navigate_browsertest.cc +++ b/chrome/browser/ui/web_applications/web_app_navigate_browsertest.cc
@@ -30,18 +30,6 @@ } }; -namespace { - -// Navigate and wait until the browse becomes active. -// Returns the active browser. -Browser* NavigateAndWaitUntilBrowserBecomeActive(NavigateParams* params) { - Navigate(params); - ui_test_utils::WaitUntilBrowserBecomeActive(params->browser); - return params->browser; -} - -} // namespace - // This test verifies that navigating with "open_pwa_window_if_possible = true" // opens a new app window if there is an installed Web App for the URL. IN_PROC_BROWSER_TEST_F(WebAppNavigateBrowserTest, @@ -101,7 +89,8 @@ NavigateParams params(MakeNavigateParams()); params.disposition = WindowOpenDisposition::NEW_WINDOW; params.open_pwa_window_if_possible = true; - active_browser = NavigateAndWaitUntilBrowserBecomeActive(¶ms); + Navigate(¶ms); + active_browser = params.browser; } Browser* const app_browser = active_browser; const webapps::AppId app_id = app_browser->app_controller()->app_id(); @@ -110,7 +99,8 @@ NavigateParams params(MakeNavigateParams()); params.disposition = WindowOpenDisposition::NEW_WINDOW; params.app_id = app_id; - active_browser = NavigateAndWaitUntilBrowserBecomeActive(¶ms); + Navigate(¶ms); + active_browser = params.browser; } content::WebContents* const web_contents = active_browser->tab_strip_model()->GetActiveWebContents(); @@ -120,7 +110,8 @@ NavigateParams params(MakeNavigateParams()); params.disposition = WindowOpenDisposition::NEW_POPUP; params.source_contents = web_contents; - active_browser = NavigateAndWaitUntilBrowserBecomeActive(¶ms); + Navigate(¶ms); + active_browser = params.browser; EXPECT_FALSE(active_browser->app_controller()); } @@ -129,7 +120,8 @@ NavigateParams params(MakeNavigateParams()); params.app_id = app_id; params.disposition = WindowOpenDisposition::NEW_POPUP; - active_browser = NavigateAndWaitUntilBrowserBecomeActive(¶ms); + Navigate(¶ms); + active_browser = params.browser; EXPECT_EQ(active_browser->app_controller()->app_id(), app_id); } @@ -138,7 +130,8 @@ NavigateParams params(MakeNavigateParams()); params.browser = app_browser; params.disposition = WindowOpenDisposition::NEW_POPUP; - active_browser = NavigateAndWaitUntilBrowserBecomeActive(¶ms); + Navigate(¶ms); + active_browser = params.browser; EXPECT_EQ(active_browser->app_controller()->app_id(), app_id); } }
diff --git a/chrome/browser/ui/webui/ash/drive_internals/drive_internals_ui.cc b/chrome/browser/ui/webui/ash/drive_internals/drive_internals_ui.cc index 517e05ae..da075dc 100644 --- a/chrome/browser/ui/webui/ash/drive_internals/drive_internals_ui.cc +++ b/chrome/browser/ui/webui/ash/drive_internals/drive_internals_ui.cc
@@ -28,6 +28,7 @@ #include "base/strings/pattern.h" #include "base/strings/strcat.h" #include "base/strings/stringprintf.h" +#include "base/strings/to_string.h" #include "base/system/sys_info.h" #include "base/task/sequenced_task_runner.h" #include "base/task/task_traits.h" @@ -705,8 +706,7 @@ Value::List preferences; for (const char* key : kDriveRelatedPreferences) { // As of now, all preferences are boolean. - AppendKeyValue(preferences, key, - prefs->GetBoolean(key) ? "true" : "false"); + AppendKeyValue(preferences, key, base::ToString(prefs->GetBoolean(key))); } MaybeCallJavascript("updateDriveRelatedPreferences",
diff --git a/chrome/browser/ui/webui/ash/login/enrollment_screen_handler.cc b/chrome/browser/ui/webui/ash/login/enrollment_screen_handler.cc index 7a24355..805d88d 100644 --- a/chrome/browser/ui/webui/ash/login/enrollment_screen_handler.cc +++ b/chrome/browser/ui/webui/ash/login/enrollment_screen_handler.cc
@@ -373,7 +373,12 @@ break; case policy::DM_STATUS_SERVICE_INVALID_PACKAGED_DEVICE_FOR_KIOSK: ShowError(IDS_ENTERPRISE_ENROLLMENT_INVALID_PACKAGED_DEVICE_FOR_KIOSK, - true); + /*retry=*/true); + break; + case policy::DM_STATUS_SERVICE_ORG_UNIT_ENROLLMENT_LIMIT_EXCEEEDED: + ShowError( + IDS_ENTERPRISE_ENROLLMENT_ORG_UNIT_ENROLLMENT_LIMIT_EXCEEDED, + /*retry=*/true); break; default: ShowErrorMessage(
diff --git a/chrome/browser/ui/webui/ash/mako/mako_bubble_coordinator.cc b/chrome/browser/ui/webui/ash/mako/mako_bubble_coordinator.cc index 83801d36..0a3896c 100644 --- a/chrome/browser/ui/webui/ash/mako/mako_bubble_coordinator.cc +++ b/chrome/browser/ui/webui/ash/mako/mako_bubble_coordinator.cc
@@ -10,6 +10,7 @@ #include "ash/constants/ash_features.h" #include "base/check.h" #include "base/strings/string_util.h" +#include "base/strings/to_string.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/webui/ash/mako/mako_consent_view.h" @@ -82,7 +83,7 @@ url = net::AppendOrReplaceQueryParameter(url, kOrcaHostLanguageParamKey, GetSystemLocale()); url = net::AppendOrReplaceQueryParameter(url, kOrcaFeedbackEnabledParamKey, - feedback_enabled ? "true" : "false"); + base::ToString(feedback_enabled)); auto* magic_boost_state = chromeos::MagicBoostState::Get(); url = net::AppendOrReplaceQueryParameter( url, kOrcaMagicBoostParamKey,
diff --git a/chrome/browser/ui/webui/commerce/product_specifications_ui.cc b/chrome/browser/ui/webui/commerce/product_specifications_ui.cc index 7d8c87d..ba23dd4 100644 --- a/chrome/browser/ui/webui/commerce/product_specifications_ui.cc +++ b/chrome/browser/ui/webui/commerce/product_specifications_ui.cc
@@ -101,6 +101,9 @@ {"experimentalFeatureDisclaimer", IDS_COMPARE_DISCLAIMER}, {"learnMore", IDS_COMPARE_LEARN_MORE}, {"learnMoreA11yLabel", IDS_COMPARE_LEARN_MORE_A11Y_LABEL}, + {"menuDelete", IDS_COMPARE_CONTEXT_MENU_DELETE}, + {"menuOpenInNewTab", IDS_COMPARE_CONTEXT_MENU_OPEN_IN_NEW_TAB}, + {"menuRename", IDS_COMPARE_CONTEXT_MENU_RENAME}, {"offlineMessage", IDS_COMPARE_OFFLINE_TOAST_MESSAGE}, {"openProductPage", IDS_COMPARE_OPEN_PRODUCT_PAGE_IN_NEW_TAB}, {"pageTitle", IDS_COMPARE_DEFAULT_PAGE_TITLE},
diff --git a/chrome/browser/ui/webui/ntp/ntp_resource_cache.cc b/chrome/browser/ui/webui/ntp/ntp_resource_cache.cc index 9fa644a..b0bc5ac 100644 --- a/chrome/browser/ui/webui/ntp/ntp_resource_cache.cc +++ b/chrome/browser/ui/webui/ntp/ntp_resource_cache.cc
@@ -11,6 +11,7 @@ #include "base/memory/ref_counted_memory.h" #include "base/no_destructor.h" #include "base/strings/string_number_conversions.h" +#include "base/strings/to_string.h" #include "base/strings/utf_string_conversions.h" #include "base/values.h" #include "build/build_config.h" @@ -333,7 +334,7 @@ ThemeService::GetThemeProviderForProfile(incognito_profile); replacements["hasCustomBackground"] = - tp.HasCustomImage(IDR_THEME_NTP_BACKGROUND) ? "true" : "false"; + base::ToString(tp.HasCustomImage(IDR_THEME_NTP_BACKGROUND)); const std::string& app_locale = g_browser_process->GetApplicationLocale(); webui::SetLoadTimeDataDefaults(app_locale, &replacements);
diff --git a/chrome/browser/ui/webui/settings/people_handler.cc b/chrome/browser/ui/webui/settings/people_handler.cc index 14086009..fac742a 100644 --- a/chrome/browser/ui/webui/settings/people_handler.cc +++ b/chrome/browser/ui/webui/settings/people_handler.cc
@@ -460,8 +460,10 @@ identity_manager->HasPrimaryAccount(signin::ConsentLevel::kSync)) { // When the user has an unrecoverable error, they first have to sign out and // then sign in again. + // Note: this sets the consent level to `signin::ConsentLevel::kSignin`. identity_manager->GetPrimaryAccountMutator()->RevokeSyncConsent( signin_metrics::ProfileSignout::kRevokeSyncFromSettings); + DCHECK(identity_manager->HasPrimaryAccount(signin::ConsentLevel::kSignin)); } // If the identity manager already has a primary account, this is a @@ -474,10 +476,13 @@ DCHECK(error_controller->HasError()); signin_ui_util::ShowReauthForPrimaryAccountWithAuthError(profile_, access_point); - } else { - signin_ui_util::EnableSyncFromSingleAccountPromo( - profile_, CoreAccountInfo(), access_point); + return; } + + DCHECK(IsChangePrimaryAccountAllowed(profile_, /*email=*/std::string())) + << "Primary account already set and change is not allowed"; + signin_ui_util::EnableSyncFromSingleAccountPromo(profile_, CoreAccountInfo(), + access_point); } #endif // !BUILDFLAG(IS_CHROMEOS_ASH) @@ -791,9 +796,6 @@ syncer::SyncService* service = GetSyncService(); DCHECK(IsProfileAuthNeededOrHasErrors() || (service && service->HasUnrecoverableError())); - DCHECK(IsChangePrimaryAccountAllowed(profile_, /*email=*/std::string())) - << "Primary account already set and change is not allowed"; - DisplayGaiaLogin(signin_metrics::AccessPoint::ACCESS_POINT_SETTINGS); } #endif // BUILDFLAG(IS_CHROMEOS_ASH)
diff --git a/chrome/browser/ui/webui/settings/people_handler.h b/chrome/browser/ui/webui/settings/people_handler.h index bed1622..f78b4cc 100644 --- a/chrome/browser/ui/webui/settings/people_handler.h +++ b/chrome/browser/ui/webui/settings/people_handler.h
@@ -226,8 +226,7 @@ void DisplayGaiaLogin(signin_metrics::AccessPoint access_point); // When web-flow is enabled, displays the Gaia login form in a new tab. - // This function is virtual so that tests can override. - virtual void DisplayGaiaLoginInNewTabOrWindow( + void DisplayGaiaLoginInNewTabOrWindow( signin_metrics::AccessPoint access_point); #endif
diff --git a/chrome/browser/ui/webui/settings/people_handler_unittest.cc b/chrome/browser/ui/webui/settings/people_handler_unittest.cc index 90c55fc..7ac769e6 100644 --- a/chrome/browser/ui/webui/settings/people_handler_unittest.cc +++ b/chrome/browser/ui/webui/settings/people_handler_unittest.cc
@@ -29,6 +29,8 @@ #include "chrome/browser/signin/dice_web_signin_interceptor.h" #include "chrome/browser/signin/identity_test_environment_profile_adaptor.h" #include "chrome/browser/signin/signin_error_controller_factory.h" +#include "chrome/browser/signin/signin_ui_delegate.h" +#include "chrome/browser/signin/signin_ui_util.h" #include "chrome/browser/signin/signin_util.h" #include "chrome/browser/sync/sync_service_factory.h" #include "chrome/browser/ui/browser_finder.h" @@ -39,7 +41,6 @@ #include "chrome/common/pref_names.h" #include "chrome/common/url_constants.h" #include "chrome/test/base/browser_with_test_window_test.h" -#include "chrome/test/base/chrome_render_view_host_test_harness.h" #include "chrome/test/base/scoped_testing_local_state.h" #include "chrome/test/base/test_chrome_web_ui_controller_factory.h" #include "chrome/test/base/testing_browser_process.h" @@ -65,6 +66,7 @@ #include "content/public/test/browser_task_environment.h" #include "content/public/test/navigation_simulator.h" #include "content/public/test/scoped_web_ui_controller_factory_registration.h" +#include "content/public/test/test_web_contents_factory.h" #include "content/public/test/test_web_ui.h" #include "content/public/test/web_contents_tester.h" #include "google_apis/gaia/gaia_urls.h" @@ -73,6 +75,7 @@ #if BUILDFLAG(IS_CHROMEOS_ASH) #include "ash/constants/ash_features.h" +#include "chrome/test/base/chrome_render_view_host_test_harness.h" #endif // BUILDFLAG(IS_CHROMEOS_ASH) namespace { @@ -99,6 +102,35 @@ // Event fired when calling `PeopleHandler::UpdateSyncStatus()`. constexpr char kSyncStatusChangeEventName[] = "sync-status-changed"; + +class MockSigninUiDelegate : public signin_ui_util::SigninUiDelegate { + public: + MOCK_METHOD(void, + ShowTurnSyncOnUI, + (Profile*, + signin_metrics::AccessPoint, + signin_metrics::PromoAction, + const CoreAccountId&, + TurnSyncOnHelper::SigninAbortedMode, + bool), + (override)); + + MOCK_METHOD(void, + ShowSigninUI, + (Profile*, + bool, + signin_metrics::AccessPoint, + signin_metrics::PromoAction), + (override)); + MOCK_METHOD(void, + ShowReauthUI, + (Profile*, + const std::string&, + bool, + signin_metrics::AccessPoint, + signin_metrics::PromoAction), + (override)); +}; #endif // Returns a UserSelectableTypeSet with all types set. @@ -212,15 +244,16 @@ TestingPeopleHandler& operator=(const TestingPeopleHandler&) = delete; using PeopleHandler::is_configuring_sync; - - private: -#if !BUILDFLAG(IS_CHROMEOS_ASH) - void DisplayGaiaLoginInNewTabOrWindow( - signin_metrics::AccessPoint access_point) override {} -#endif }; -class PeopleHandlerTest : public ChromeRenderViewHostTestHarness { +class PeopleHandlerTest +#if BUILDFLAG(IS_CHROMEOS) + // ChromeRenderViewHostTestHarness is flaky, but is required on ChromeOS + // because `TestWebContentsFactory` does not work out of the box. + : public ChromeRenderViewHostTestHarness { +#else + : public testing::Test { +#endif public: PeopleHandlerTest() = default; @@ -230,8 +263,12 @@ ~PeopleHandlerTest() override = default; void SetUp() override { +#if BUILDFLAG(IS_CHROMEOS) ChromeRenderViewHostTestHarness::SetUp(); - +#else + profile_ = IdentityTestEnvironmentProfileAdaptor:: + CreateProfileForIdentityTestEnvironment(); +#endif identity_test_env_adaptor_ = std::make_unique<IdentityTestEnvironmentProfileAdaptor>(profile()); @@ -246,13 +283,17 @@ sync_service_ = nullptr; DestroyPeopleHandler(); identity_test_env_adaptor_.reset(); +#if BUILDFLAG(IS_CHROMEOS) ChromeRenderViewHostTestHarness::TearDown(); +#endif } +#if BUILDFLAG(IS_CHROMEOS) TestingProfile::TestingFactories GetTestingFactories() const override { return IdentityTestEnvironmentProfileAdaptor:: GetIdentityTestEnvironmentFactories(); } +#endif void SigninUserWithoutSyncFeature() { const CoreAccountInfo account_info = identity_test_env()->SetPrimaryAccount( @@ -269,7 +310,11 @@ void CreatePeopleHandler() { handler_ = std::make_unique<TestingPeopleHandler>(&web_ui_, profile()); handler_->AllowJavascript(); +#if !BUILDFLAG(IS_CHROMEOS) + web_contents_ = web_contents_factory_.CreateWebContents(profile()); +#endif web_ui_.set_web_contents(web_contents()); + handler_->RegisterMessages(); } void DestroyPeopleHandler() { @@ -277,6 +322,9 @@ handler_->set_web_ui(nullptr); handler_->DisallowJavascript(); handler_ = nullptr; +#if !BUILDFLAG(IS_CHROMEOS) + web_contents_ = nullptr; +#endif } } @@ -359,8 +407,19 @@ return sync_service_->GetUserSettings(); } +#if !BUILDFLAG(IS_CHROMEOS) + Profile* profile() { return profile_.get(); } + content::WebContents* web_contents() { return web_contents_; } + + content::BrowserTaskEnvironment task_environment_; +#endif std::unique_ptr<IdentityTestEnvironmentProfileAdaptor> identity_test_env_adaptor_; +#if !BUILDFLAG(IS_CHROMEOS) + std::unique_ptr<TestingProfile> profile_; + content::TestWebContentsFactory web_contents_factory_; + raw_ptr<content::WebContents> web_contents_ = nullptr; +#endif raw_ptr<syncer::TestSyncService> sync_service_; content::TestWebUI web_ui_; std::unique_ptr<TestingPeopleHandler> handler_; @@ -369,12 +428,21 @@ #if !BUILDFLAG(IS_CHROMEOS_ASH) TEST_F(PeopleHandlerTest, DisplayBasicLogin) { + testing::StrictMock<MockSigninUiDelegate> mock_signin_ui_delegate; + base::AutoReset<signin_ui_util::SigninUiDelegate*> delegate_auto_reset = + signin_ui_util::SetSigninUiDelegateForTesting(&mock_signin_ui_delegate); + ASSERT_FALSE(identity_test_env()->identity_manager()->HasPrimaryAccount( ConsentLevel::kSignin)); CreatePeopleHandler(); // Test that the HandleStartSignin call enables JavaScript. handler_->DisallowJavascript(); + EXPECT_CALL(mock_signin_ui_delegate, + ShowSigninUI(profile(), /*enable_sync=*/true, + signin_metrics::AccessPoint::ACCESS_POINT_SETTINGS, + signin_metrics::PromoAction:: + PROMO_ACTION_NEW_ACCOUNT_NO_EXISTING_ACCOUNT)); handler_->HandleStartSignin(base::Value::List()); // Sync setup hands off control to the gaia login tab. @@ -1525,6 +1593,35 @@ } } +// Regression test for https://crbug.com/389031469 +TEST_F(PeopleHandlerWithExplicitBrowserSigninTest, HandleStartSigninManaged) { + testing::StrictMock<MockSigninUiDelegate> mock_signin_ui_delegate; + base::AutoReset<signin_ui_util::SigninUiDelegate*> delegate_auto_reset = + signin_ui_util::SetSigninUiDelegateForTesting(&mock_signin_ui_delegate); + + const char kManagedEmail[] = "user@managedchrome.com"; + AccountInfo account = identity_test_env()->MakePrimaryAccountAvailable( + kManagedEmail, ConsentLevel::kSignin); + SetExplicitSignin(true); + // Make the account managed and disallow signout. + account.hosted_domain = "managedchrome.com"; + identity_test_env()->UpdateAccountInfoForAccount(account); + SigninClient* client = ChromeSigninClientFactory::GetForProfile(profile()); + client->set_is_clear_primary_account_allowed_for_testing( + SigninClient::SignoutDecision::CLEAR_PRIMARY_ACCOUNT_DISALLOWED); + ASSERT_FALSE( + client->IsClearPrimaryAccountAllowed(/*has_sync_account=*/false)); + TriggerPrimaryAccountInPersistentError(); + CreatePeopleHandler(); + // This should not crash. + EXPECT_CALL( + mock_signin_ui_delegate, + ShowReauthUI(profile(), kManagedEmail, /*enable_sync=*/false, + signin_metrics::AccessPoint::ACCESS_POINT_SETTINGS, + signin_metrics::PromoAction::PROMO_ACTION_NO_SIGNIN_PROMO)); + web_ui_.HandleReceivedMessage("SyncSetupStartSignIn", base::Value::List()); +} + TEST_F(PeopleHandlerWithExplicitBrowserSigninTest, SigninPendingValueWithSync) { CreatePeopleHandler();
diff --git a/chrome/browser/ui/webui/settings/performance_settings_interactive_uitest.cc b/chrome/browser/ui/webui/settings/performance_settings_interactive_uitest.cc index e0f51e92..1f4c177 100644 --- a/chrome/browser/ui/webui/settings/performance_settings_interactive_uitest.cc +++ b/chrome/browser/ui/webui/settings/performance_settings_interactive_uitest.cc
@@ -5,6 +5,7 @@ #include "base/json/values_util.h" #include "base/power_monitor/battery_state_sampler.h" #include "base/strings/string_util.h" +#include "base/strings/to_string.h" #include "base/test/bind.h" #include "base/test/metrics/histogram_tester.h" #include "base/test/power_monitor_test_utils.h" @@ -707,8 +708,8 @@ toggle_selection_change.event = kButtonWasClicked; toggle_selection_change.where = element; toggle_selection_change.type = StateChange::Type::kExistsAndConditionTrue; - toggle_selection_change.test_function = base::StrCat( - {"(el) => el.disabled === ", is_disabled ? "true" : "false"}); + toggle_selection_change.test_function = + base::StrCat({"(el) => el.disabled === ", base::ToString(is_disabled)}); return WaitForStateChange(contents_id, toggle_selection_change); } };
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 8e23ece..159fe908 100644 --- a/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc +++ b/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc
@@ -1714,6 +1714,8 @@ {"manageGoogleAccount", IDS_SETTINGS_MANAGE_GOOGLE_ACCOUNT}, {"syncAndNonPersonalizedServices", IDS_SETTINGS_SYNC_SYNC_AND_NON_PERSONALIZED_SERVICES}, + {"syncUnavailableForNonGoogleAccount", + IDS_SYNC_UNAVAILABLE_FOR_NON_GOOGLE_ACCOUNT}, #if BUILDFLAG(IS_CHROMEOS_ASH) {"accountManagerSubMenuLabel", IDS_SETTINGS_ACCOUNT_MANAGER_SUBMENU_LABEL},
diff --git a/chrome/browser/ui/webui/settings/settings_ui.cc b/chrome/browser/ui/webui/settings/settings_ui.cc index 26fc2c4a..d847005 100644 --- a/chrome/browser/ui/webui/settings/settings_ui.cc +++ b/chrome/browser/ui/webui/settings/settings_ui.cc
@@ -18,6 +18,7 @@ #include "build/build_config.h" #include "build/chromeos_buildflags.h" #include "chrome/browser/browser_features.h" +#include "chrome/browser/browser_process.h" #include "chrome/browser/commerce/shopping_service_factory.h" #include "chrome/browser/compose/compose_enabling.h" #include "chrome/browser/download/bubble/download_bubble_prefs.h" @@ -312,6 +313,13 @@ html_source->AddBoolean("signinAllowed", !profile->IsGuestSession() && profile->GetPrefs()->GetBoolean( prefs::kSigninAllowed)); + ProfileAttributesEntry* entry = + g_browser_process->profile_manager() + ->GetProfileAttributesStorage() + .GetProfileAttributesWithPath(profile->GetPath()); + + html_source->AddBoolean("isDasherlessProfile", + entry && entry->IsDasherlessManagement()); html_source->AddBoolean( "turnOffSyncAllowedForManagedProfiles",
diff --git a/chrome/browser/ui/webui/signin/profile_picker_handler.cc b/chrome/browser/ui/webui/signin/profile_picker_handler.cc index 050e2b7..cc42f70e 100644 --- a/chrome/browser/ui/webui/signin/profile_picker_handler.cc +++ b/chrome/browser/ui/webui/signin/profile_picker_handler.cc
@@ -21,7 +21,6 @@ #include "base/trace_event/trace_event.h" #include "base/values.h" #include "chrome/browser/browser_process.h" -#include "chrome/browser/metrics/first_web_contents_profiler_base.h" #include "chrome/browser/new_tab_page/chrome_colors/chrome_colors_service.h" #include "chrome/browser/new_tab_page/chrome_colors/generated_colors_info.h" #include "chrome/browser/profiles/keep_alive/profile_keep_alive_types.h" @@ -36,14 +35,11 @@ #include "chrome/browser/profiles/profile_window.h" #include "chrome/browser/profiles/profiles_state.h" #include "chrome/browser/signin/signin_util.h" -#include "chrome/browser/ui/browser_commands.h" #include "chrome/browser/ui/browser_finder.h" #include "chrome/browser/ui/browser_window.h" -#include "chrome/browser/ui/chrome_pages.h" #include "chrome/browser/ui/color/chrome_color_id.h" #include "chrome/browser/ui/profiles/profile_colors_util.h" #include "chrome/browser/ui/profiles/profile_picker.h" -#include "chrome/browser/ui/singleton_tabs.h" #include "chrome/browser/ui/ui_features.h" #include "chrome/browser/ui/webui/profile_helper.h" #include "chrome/browser/ui/webui/signin/login_ui_service.h" @@ -78,17 +74,6 @@ constexpr int kDefaultThemeColorId = -1; constexpr int kManuallyPickedColorId = 0; -// These values are persisted to logs. Entries should not be renumbered and -// numeric values should never be reused. -enum class ProfilePickerAction { - kLaunchExistingProfile = 0, - kLaunchExistingProfileCustomizeSettings = 1, - kLaunchGuestProfile = 2, - kLaunchNewProfile = 3, - kDeleteProfile = 4, - kMaxValue = kDeleteProfile, -}; - std::optional<SkColor> GetChromeColorColorById(int color_id) { for (chrome_colors::ColorInfo color_info : chrome_colors::kGeneratedColorsInfo) { @@ -100,10 +85,6 @@ return std::nullopt; } -void RecordProfilePickerAction(ProfilePickerAction action) { - base::UmaHistogramEnumeration("ProfilePicker.UserAction", action); -} - void RecordAskOnStartupChanged(bool value) { base::UmaHistogramBoolean("ProfilePicker.AskOnStartupChanged", value); } @@ -162,23 +143,6 @@ frame_text_color, scale_factor); } -void OpenOnSelectProfileTargetUrl(Browser* browser) { - GURL target_page_url = ProfilePicker::GetOnSelectProfileTargetUrl(); - if (target_page_url.is_empty()) { - return; - } - - if (target_page_url.spec() == chrome::kChromeUIHelpURL) { - chrome::ShowAboutChrome(browser); - } else if (target_page_url.spec() == chrome::kChromeUISettingsURL) { - chrome::ShowSettings(browser); - } else if (target_page_url.spec() == ProfilePicker::kTaskManagerUrl) { - chrome::OpenTaskManager(browser); - } else { - ShowSingletonTabOverwritingNTP(browser, target_page_url); - } -} - base::Value::Dict CreateProfileEntry(const ProfileAttributesEntry* entry, int avatar_icon_size) { base::Value::Dict profile_entry; @@ -219,78 +183,6 @@ return profile_entry; } -void RecordProfilingFinishReason( - metrics::StartupProfilingFinishReason finish_reason) { - base::UmaHistogramEnumeration( - "ProfilePicker.FirstProfileTime.FirstWebContentsFinishReason", - finish_reason); -} - -class FirstWebContentsProfilerForProfilePicker - : public metrics::FirstWebContentsProfilerBase { - public: - explicit FirstWebContentsProfilerForProfilePicker( - content::WebContents* web_contents, - base::TimeTicks pick_time); - - FirstWebContentsProfilerForProfilePicker( - const FirstWebContentsProfilerForProfilePicker&) = delete; - FirstWebContentsProfilerForProfilePicker& operator=( - const FirstWebContentsProfilerForProfilePicker&) = delete; - - protected: - // FirstWebContentsProfilerBase: - void RecordFinishReason( - metrics::StartupProfilingFinishReason finish_reason) override; - void RecordNavigationFinished(base::TimeTicks navigation_start) override; - void RecordFirstNonEmptyPaint() override; - bool WasStartupInterrupted() override; - - private: - ~FirstWebContentsProfilerForProfilePicker() override; - - const base::TimeTicks pick_time_; -}; - -FirstWebContentsProfilerForProfilePicker:: - FirstWebContentsProfilerForProfilePicker(content::WebContents* web_contents, - base::TimeTicks pick_time) - : FirstWebContentsProfilerBase(web_contents), pick_time_(pick_time) { - DCHECK(!pick_time_.is_null()); -} - -FirstWebContentsProfilerForProfilePicker:: - ~FirstWebContentsProfilerForProfilePicker() = default; - -void FirstWebContentsProfilerForProfilePicker::RecordFinishReason( - metrics::StartupProfilingFinishReason finish_reason) { - RecordProfilingFinishReason(finish_reason); -} - -void FirstWebContentsProfilerForProfilePicker::RecordNavigationFinished( - base::TimeTicks navigation_start) { - // Nothing to record here for Profile Picker startups. -} - -void FirstWebContentsProfilerForProfilePicker::RecordFirstNonEmptyPaint() { - const char histogram_name[] = - "ProfilePicker.FirstProfileTime.FirstWebContentsNonEmptyPaint"; - base::TimeTicks paint_time = base::TimeTicks::Now(); - base::UmaHistogramLongTimes100(histogram_name, paint_time - pick_time_); - TRACE_EVENT_NESTABLE_ASYNC_BEGIN_WITH_TIMESTAMP0("startup", histogram_name, - this, pick_time_); - TRACE_EVENT_NESTABLE_ASYNC_END_WITH_TIMESTAMP0("startup", histogram_name, - this, paint_time); -} - -bool FirstWebContentsProfilerForProfilePicker::WasStartupInterrupted() { - // We're assuming that no interruptions block opening an existing profile - // from the profile picker. We would detect this by observing really high - // latency on the tracked metric, and can start tracking interruptions if we - // find that such cases occur. - return false; -} - } // namespace ProfilePickerHandler::ProfilePickerHandler() = default; @@ -452,16 +344,12 @@ return; } - if (!creation_time_on_startup_.is_null() && - // Avoid overriding the picked time if already recorded. This can happen - // for example if multiple profiles are picked: https://crbug.com/1277466. - profile_picked_time_on_startup_.is_null()) { - profile_picked_time_on_startup_ = base::TimeTicks::Now(); - } - profiles::SwitchToProfile( - *profile_path, /*always_create=*/false, - base::BindOnce(&ProfilePickerHandler::OnSwitchToProfileComplete, - weak_factory_.GetWeakPtr(), false, open_settings)); + bool should_record_startup_metrics = !creation_time_on_startup_.is_null(); + ProfilePicker::PickProfile( + *profile_path, + ProfilePicker::ProfilePickingArgs{ + .open_settings = open_settings, + .should_record_startup_metrics = should_record_startup_metrics}); } void ProfilePickerHandler::OnProfileForDialogLoaded(Profile* profile) { @@ -517,9 +405,10 @@ const base::Value::List& args) { // TODO(crbug.com/40123459): Add check |IsGuestModeEnabled| once policy // checking has been added to the UI. - profiles::SwitchToGuestProfile( - base::BindOnce(&ProfilePickerHandler::OnSwitchToProfileComplete, - weak_factory_.GetWeakPtr(), false, false)); + ProfilePicker::PickProfile( + ProfileManager::GetGuestProfilePath(), + ProfilePicker::ProfilePickingArgs{ + .open_settings = false, .should_record_startup_metrics = false}); } void ProfilePickerHandler::HandleAskOnStartupChanged( @@ -601,7 +490,7 @@ ProfileMetrics::LogProfileAddNewUser( ProfileMetrics::ADD_NEW_PROFILE_PICKER_LOCAL); ProfilePicker::SwitchToSignedOutPostIdentityFlow( - profile_color, profile_picked_time_on_startup_, + profile_color, base::BindOnce( &ProfilePickerHandler::OnProfileCreationFinished, // `OnProfileCreationFinished` is called when we want to close the @@ -642,10 +531,10 @@ // TODO(crbug.com/40751337): remove the profile used for the sign-in // flow. - profiles::SwitchToProfile( - *profile_path, /*always_create=*/false, - base::BindOnce(&ProfilePickerHandler::OnSwitchToProfileComplete, - weak_factory_.GetWeakPtr(), false, false)); + ProfilePicker::PickProfile( + *profile_path, + ProfilePicker::ProfilePickingArgs{ + .open_settings = false, .should_record_startup_metrics = false}); } void ProfilePickerHandler::HandleCancelProfileSwitch( @@ -806,66 +695,6 @@ FireWebUIListener("load-signin-finished", base::Value(success)); } -void ProfilePickerHandler::OnSwitchToProfileComplete(bool new_profile, - bool open_settings, - Browser* browser) { - if (!browser || browser->is_delete_scheduled()) { - // The browser is destroyed or about to be destroyed. - return; - } - - DCHECK(browser->window()); - Profile* profile = browser->profile(); - TRACE_EVENT1("browser", "ProfilePickerHandler::OnSwitchToProfileComplete", - "profile_path", profile->GetPath().AsUTF8Unsafe()); - - // Measure startup time to display first web contents if the profile picker - // was displayed on startup and if the initiating action is instrumented. For - // example we don't record pick time for profile creations. - if (!profile_picked_time_on_startup_.is_null()) { - BeginFirstWebContentsProfiling(browser, profile_picked_time_on_startup_); - } - - // Only show the profile switch IPH when the user clicked the card, and there - // are multiple profiles. - std::vector<ProfileAttributesEntry*> entries = - g_browser_process->profile_manager() - ->GetProfileAttributesStorage() - .GetAllProfilesAttributes(); - int profile_count = - base::ranges::count(entries, false, &ProfileAttributesEntry::IsOmitted); - if (profile_count > 1 && !open_settings && - ProfilePicker::GetOnSelectProfileTargetUrl().is_empty()) { - browser->window()->MaybeShowProfileSwitchIPH(); - } - - if (new_profile) { - RecordProfilePickerAction(ProfilePickerAction::kLaunchNewProfile); - ProfilePicker::Hide(); - return; - } - - if (profile->IsGuestSession()) { - RecordProfilePickerAction(ProfilePickerAction::kLaunchGuestProfile); - } else { - RecordProfilePickerAction( - open_settings - ? ProfilePickerAction::kLaunchExistingProfileCustomizeSettings - : ProfilePickerAction::kLaunchExistingProfile); - } - - if (open_settings) { - // User clicked 'Edit' from the profile card menu. - chrome::ShowSettingsSubPage(browser, chrome::kManageProfileSubPage); - } else { - // Opens a target url upon user selecting a pre-existing profile. For - // new profiles the chrome welcome page is displayed. - OpenOnSelectProfileTargetUrl(browser); - } - - ProfilePicker::Hide(); -} - void ProfilePickerHandler::PushProfilesList() { DCHECK(IsJavascriptAllowed()); FireWebUIListener("profiles-list-changed", GetProfilesList()); @@ -1042,29 +871,6 @@ } } -// static -void ProfilePickerHandler::BeginFirstWebContentsProfiling( - Browser* browser, - base::TimeTicks pick_time) { - content::WebContents* visible_contents = - metrics::FirstWebContentsProfilerBase::GetVisibleContents(browser); - if (!visible_contents) { - RecordProfilingFinishReason(metrics::StartupProfilingFinishReason:: - kAbandonNoInitiallyVisibleContent); - return; - } - - if (visible_contents->CompletedFirstVisuallyNonEmptyPaint()) { - RecordProfilingFinishReason( - metrics::StartupProfilingFinishReason::kAbandonAlreadyPaintedContent); - return; - } - - // FirstWebContentsProfilerForProfilePicker owns itself and is also bound to - // |visible_contents|'s lifetime by observing WebContentsDestroyed(). - new FirstWebContentsProfilerForProfilePicker(visible_contents, pick_time); -} - void ProfilePickerHandler::MaybeUpdateGuestMode() { #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) if (!base::FeatureList::IsEnabled( @@ -1078,3 +884,7 @@ FireWebUIListener("guest-mode-availability-updated", base::Value(profiles::IsGuestModeEnabled())); } + +void RecordProfilePickerAction(ProfilePickerAction action) { + base::UmaHistogramEnumeration("ProfilePicker.UserAction", action); +}
diff --git a/chrome/browser/ui/webui/signin/profile_picker_handler.h b/chrome/browser/ui/webui/signin/profile_picker_handler.h index fefe180..a14f88c 100644 --- a/chrome/browser/ui/webui/signin/profile_picker_handler.h +++ b/chrome/browser/ui/webui/signin/profile_picker_handler.h
@@ -22,11 +22,26 @@ #include "content/public/browser/web_contents_observer.h" #include "content/public/browser/web_ui_message_handler.h" -class Browser; class ScopedProfileKeepAlive; class ForceSigninUIError; +// These values are persisted to logs. Entries should not be renumbered and +// numeric values should never be reused. +// +// LINT.IfChange(ProfilePickerAction) +enum class ProfilePickerAction { + kLaunchExistingProfile = 0, + kLaunchExistingProfileCustomizeSettings = 1, + kLaunchGuestProfile = 2, + kLaunchNewProfile = 3, + kDeleteProfile = 4, + kMaxValue = kDeleteProfile, +}; +// LINT.ThenChange(//tools/metrics/histograms/metadata/profile/enums.xml:ProfilePickerAction) + +void RecordProfilePickerAction(ProfilePickerAction action); + // The handler for Javascript messages related to the profile picker main view. class ProfilePickerHandler : public content::WebUIMessageHandler, public content::WebContentsObserver, @@ -55,12 +70,6 @@ void OnJavascriptAllowed() override; void OnJavascriptDisallowed() override; - // Measure startup time to display first web contents if the profile picker - // was displayed on startup and if the initiating action is instrumented. For - // example we don't record pick time for profile creations. - static void BeginFirstWebContentsProfiling(Browser* browser, - base::TimeTicks pick_time); - private: friend class ProfilePickerHandlerTest; friend class ProfilePickerHandlerInUserProfileTest; @@ -111,9 +120,6 @@ void GatherProfileStatistics(Profile* profile); void OnProfileStatisticsReceived(const base::FilePath& profile_path, profiles::ProfileCategoryStats result); - void OnSwitchToProfileComplete(bool new_profile, - bool open_settings, - Browser* browser); void OnProfileCreationFinished(bool finished_successfully); void PushProfilesList(); @@ -169,10 +175,6 @@ // when the picker is shown on startup. base::TimeTicks creation_time_on_startup_; - // Time when the user picked a profile to open, to measure browser startup - // performance. Only set when the picker is shown on startup. - base::TimeTicks profile_picked_time_on_startup_; - bool main_view_initialized_ = false; // Keep alive used when displaying the profile statistics in the profile
diff --git a/chrome/browser/ui/webui/top_chrome/webui_contents_preload_manager_browsertest.cc b/chrome/browser/ui/webui/top_chrome/webui_contents_preload_manager_browsertest.cc index 6d0656f1..0832154 100644 --- a/chrome/browser/ui/webui/top_chrome/webui_contents_preload_manager_browsertest.cc +++ b/chrome/browser/ui/webui/top_chrome/webui_contents_preload_manager_browsertest.cc
@@ -58,7 +58,7 @@ histogram_name, base::BindLambdaForTesting( [&](const char* histogram_name, uint64_t name_hash, - base::HistogramBase::Sample sample) { run_loop.Quit(); })); + base::HistogramBase::Sample32 sample) { run_loop.Quit(); })); run_loop.Run(); }
diff --git a/chrome/browser/updates/announcement_notification/announcement_notification_service_unittest.cc b/chrome/browser/updates/announcement_notification/announcement_notification_service_unittest.cc index ff53cb3..418ac7e 100644 --- a/chrome/browser/updates/announcement_notification/announcement_notification_service_unittest.cc +++ b/chrome/browser/updates/announcement_notification/announcement_notification_service_unittest.cc
@@ -10,6 +10,7 @@ #include "base/memory/ptr_util.h" #include "base/memory/raw_ptr.h" #include "base/strings/string_number_conversions.h" +#include "base/strings/to_string.h" #include "base/strings/utf_string_conversions.h" #include "base/test/scoped_feature_list.h" #include "base/test/simple_test_clock.h" @@ -354,7 +355,7 @@ const auto& param = GetParam(); auto now = SetNow("10 Feb 2020 13:00:00"); std::map<std::string, std::string> parameters = { - {kSkipFirstRun, param.skip_first_run ? "true" : "false"}, + {kSkipFirstRun, base::ToString(param.skip_first_run)}, {kVersion, base::NumberToString(param.version)}}; Init(parameters, param.enable_feature, false /*sign_in*/, param.current_version, false);
diff --git a/chrome/browser/web_applications/commands/navigate_and_trigger_install_dialog_command.cc b/chrome/browser/web_applications/commands/navigate_and_trigger_install_dialog_command.cc index 6d9c4a5..08a27b7 100644 --- a/chrome/browser/web_applications/commands/navigate_and_trigger_install_dialog_command.cc +++ b/chrome/browser/web_applications/commands/navigate_and_trigger_install_dialog_command.cc
@@ -170,7 +170,7 @@ CHECK(!app_id_.empty()); bool is_installable; - if (app_lock_->registrar().IsNotInRegistrar(app_id_)) { + if (!app_lock_->registrar().IsInRegistrar(app_id_)) { is_installable = true; } else { switch (app_lock_->registrar().GetInstallState(app_id_).value()) {
diff --git a/chrome/browser/web_applications/commands/web_install_from_url_command_browsertest.cc b/chrome/browser/web_applications/commands/web_install_from_url_command_browsertest.cc index 9c9a323..dee4add 100644 --- a/chrome/browser/web_applications/commands/web_install_from_url_command_browsertest.cc +++ b/chrome/browser/web_applications/commands/web_install_from_url_command_browsertest.cc
@@ -12,10 +12,12 @@ #include "chrome/browser/ui/tabs/tab_strip_model.h" #include "chrome/browser/ui/web_applications/web_app_browsertest_base.h" #include "chrome/browser/web_applications/test/command_metrics_test_helper.h" +#include "chrome/browser/web_applications/test/web_app_test_utils.h" #include "chrome/browser/web_applications/web_app_command_manager.h" #include "chrome/browser/web_applications/web_app_provider.h" #include "chrome/test/base/in_process_browser_test.h" #include "chrome/test/base/ui_test_utils.h" +#include "components/permissions/permission_request_manager.h" #include "content/public/browser/web_contents.h" #include "content/public/test/browser_test.h" #include "content/public/test/browser_test_utils.h" @@ -44,6 +46,12 @@ blink::features::kWebAppInstallation); } + void SetUpOnMainThread() override { + WebAppBrowserTestBase::SetUpOnMainThread(); + secondary_server_.AddDefaultHandlers(GetChromeTestDataDir()); + ASSERT_TRUE(secondary_server_.Start()); + } + content::WebContents* web_contents() { return browser()->tab_strip_model()->GetActiveWebContents(); } @@ -56,6 +64,18 @@ browser(), https_server()->GetURL("/simple.html"))); } + // When the permission prompt shows, it must be granted or denied. + void SetPermissionResponse(bool permission_granted) { + permissions::PermissionRequestManager::AutoResponseType response = + permission_granted + ? permissions::PermissionRequestManager::AutoResponseType:: + ACCEPT_ALL + : permissions::PermissionRequestManager::AutoResponseType::DENY_ALL; + + permissions::PermissionRequestManager::FromWebContents(web_contents()) + ->set_auto_response_for_test(response); + } + bool TryInstallApp(std::string manifest_id, std::string install_url, bool with_gesture = true) { @@ -96,38 +116,60 @@ return EvalJs(web_contents(), "webInstallError.name").ExtractString(); } + protected: + net::EmbeddedTestServer secondary_server_{ + net::EmbeddedTestServer::TYPE_HTTPS}; + private: base::test::ScopedFeatureList scoped_feature_list_; }; -IN_PROC_BROWSER_TEST_F(WebInstallFromUrlCommandBrowserTest, InstallApp) { +IN_PROC_BROWSER_TEST_F(WebInstallFromUrlCommandBrowserTest, + InstallAppSameOrigin_AllowPermission) { NavigateToValidUrl(); std::string install_url = GetInstallableAppURL().spec(); std::string manifest_id = install_url; - base::HistogramTester tester; + base::HistogramTester histograms; + SetPermissionResponse(/*permission_granted=*/true); ASSERT_TRUE(TryInstallApp(manifest_id, install_url)); EXPECT_TRUE(ResultExists()); EXPECT_EQ(GetManifestIdResult(), manifest_id); EXPECT_FALSE(ErrorExists()); - tester.ExpectUniqueSample("WebApp.Install.Source.Success", kInstallSource, 1); - tester.ExpectUniqueSample("WebApp.LaunchSource", kLaunchSource, 1); - tester.ExpectUniqueSample("WebApp.NewCraftedAppInstalled.ByUser", - /*sample=*/true, 1); + histograms.ExpectUniqueSample("WebApp.Install.Source.Success", kInstallSource, + 1); + histograms.ExpectUniqueSample("WebApp.LaunchSource", kLaunchSource, 1); + histograms.ExpectUniqueSample("WebApp.NewCraftedAppInstalled.ByUser", + /*sample=*/true, 1); - EXPECT_THAT(tester, + EXPECT_THAT(histograms, test::ForAllGetAllSamples( test::GetInstallCommandResultHistogramNames( ".WebInstallFromUrl", ".Crafted"), base::BucketsAre(base::Bucket( webapps::InstallResultCode::kSuccessNewInstall, 1)))); - EXPECT_THAT(tester, test::ForAllGetAllSamples( - test::GetInstallCommandSourceHistogramNames( - ".WebInstallFromUrl", ".Crafted"), - base::BucketsAre(base::Bucket( - webapps::WebappInstallSource::WEB_INSTALL, 1)))); + EXPECT_THAT(histograms, + test::ForAllGetAllSamples( + test::GetInstallCommandSourceHistogramNames( + ".WebInstallFromUrl", ".Crafted"), + base::BucketsAre(base::Bucket( + webapps::WebappInstallSource::WEB_INSTALL, 1)))); +} + +IN_PROC_BROWSER_TEST_F(WebInstallFromUrlCommandBrowserTest, + InstallAppSameOrigin_DenyPermission) { + NavigateToValidUrl(); + + std::string install_url = GetInstallableAppURL().spec(); + std::string manifest_id = install_url; + SetPermissionResponse(/*permission_granted=*/false); + ASSERT_TRUE(TryInstallApp(manifest_id, install_url)); + + EXPECT_FALSE(ResultExists()); + EXPECT_TRUE(ErrorExists()); + EXPECT_EQ(GetErrorName(), kAbortError); } IN_PROC_BROWSER_TEST_F(WebInstallFromUrlCommandBrowserTest, @@ -143,93 +185,68 @@ EXPECT_EQ(GetErrorName(), kNotAllowedError); } -IN_PROC_BROWSER_TEST_F(WebInstallFromUrlCommandBrowserTest, InvalidUrl) { - NavigateToValidUrl(); - - // If the site does not have a manifest, the manifest_id will default to the - // current document. - std::string install_url = https_server()->GetURL("/invalid_url").spec(); - std::string manifest_id = install_url; - base::HistogramTester tester; - ASSERT_TRUE(TryInstallApp(manifest_id, install_url)); - - EXPECT_FALSE(ResultExists()); - EXPECT_TRUE(ErrorExists()); - EXPECT_EQ(GetErrorName(), kAbortError); - - tester.ExpectUniqueSample("WebApp.Install.Source.Failure", kInstallSource, 1); - - EXPECT_THAT(tester, - test::ForAllGetAllSamples( - test::GetInstallCommandResultHistogramNames( - ".WebInstallFromUrl", ".Crafted"), - base::BucketsAre(base::Bucket( - webapps::InstallResultCode::kInstallURLLoadFailed, 1)))); - EXPECT_THAT(tester, test::ForAllGetAllSamples( - test::GetInstallCommandSourceHistogramNames( - ".WebInstallFromUrl", ".Crafted"), - base::BucketsAre(base::Bucket( - webapps::WebappInstallSource::WEB_INSTALL, 1)))); -} - IN_PROC_BROWSER_TEST_F(WebInstallFromUrlCommandBrowserTest, NoManifest) { NavigateToValidUrl(); // If the site does not have a manifest, the manifest_id will default to the - // current document. std::string install_url = https_server()->GetURL("/banners/no_manifest_test_page.html").spec(); std::string manifest_id = install_url; - base::HistogramTester tester; + base::HistogramTester histograms; + SetPermissionResponse(/*permission_granted=*/true); ASSERT_TRUE(TryInstallApp(manifest_id, install_url)); EXPECT_FALSE(ResultExists()); EXPECT_TRUE(ErrorExists()); EXPECT_EQ(GetErrorName(), kAbortError); - tester.ExpectUniqueSample("WebApp.Install.Source.Failure", kInstallSource, 1); + histograms.ExpectUniqueSample("WebApp.Install.Source.Failure", kInstallSource, + 1); EXPECT_THAT( - tester, + histograms, test::ForAllGetAllSamples( test::GetInstallCommandResultHistogramNames(".WebInstallFromUrl", ".Crafted"), base::BucketsAre(base::Bucket( webapps::InstallResultCode::kNotValidManifestForWebApp, 1)))); - EXPECT_THAT(tester, test::ForAllGetAllSamples( - test::GetInstallCommandSourceHistogramNames( - ".WebInstallFromUrl", ".Crafted"), - base::BucketsAre(base::Bucket( - webapps::WebappInstallSource::WEB_INSTALL, 1)))); + EXPECT_THAT(histograms, + test::ForAllGetAllSamples( + test::GetInstallCommandSourceHistogramNames( + ".WebInstallFromUrl", ".Crafted"), + base::BucketsAre(base::Bucket( + webapps::WebappInstallSource::WEB_INSTALL, 1)))); } IN_PROC_BROWSER_TEST_F(WebInstallFromUrlCommandBrowserTest, InvalidManifest) { NavigateToValidUrl(); // If the site has an invalid manifest, the manifest_id defaults to the - // current document. std::string install_url = https_server()->GetURL("/banners/invalid_manifest_test_page.html").spec(); std::string manifest_id = install_url; - base::HistogramTester tester; + base::HistogramTester histograms; + SetPermissionResponse(/*permission_granted=*/true); ASSERT_TRUE(TryInstallApp(manifest_id, install_url)); EXPECT_FALSE(ResultExists()); EXPECT_TRUE(ErrorExists()); EXPECT_EQ(GetErrorName(), kAbortError); - tester.ExpectUniqueSample("WebApp.Install.Source.Failure", kInstallSource, 1); + histograms.ExpectUniqueSample("WebApp.Install.Source.Failure", kInstallSource, + 1); EXPECT_THAT( - tester, + histograms, test::ForAllGetAllSamples( test::GetInstallCommandResultHistogramNames(".WebInstallFromUrl", ".Crafted"), base::BucketsAre(base::Bucket( webapps::InstallResultCode::kNotValidManifestForWebApp, 1)))); - EXPECT_THAT(tester, test::ForAllGetAllSamples( - test::GetInstallCommandSourceHistogramNames( - ".WebInstallFromUrl", ".Crafted"), - base::BucketsAre(base::Bucket( - webapps::WebappInstallSource::WEB_INSTALL, 1)))); + EXPECT_THAT(histograms, + test::ForAllGetAllSamples( + test::GetInstallCommandSourceHistogramNames( + ".WebInstallFromUrl", ".Crafted"), + base::BucketsAre(base::Bucket( + webapps::WebappInstallSource::WEB_INSTALL, 1)))); } IN_PROC_BROWSER_TEST_F(WebInstallFromUrlCommandBrowserTest, @@ -239,25 +256,28 @@ // The computed manifest id of this app is the same as the install_url. std::string install_url = GetInstallableAppURL().spec(); std::string manifest_id = https_server()->GetURL("/incorrect_id").spec(); - base::HistogramTester tester; + base::HistogramTester histograms; + SetPermissionResponse(/*permission_granted=*/true); ASSERT_TRUE(TryInstallApp(manifest_id, install_url)); EXPECT_FALSE(ResultExists()); EXPECT_TRUE(ErrorExists()); EXPECT_EQ(GetErrorName(), kAbortError); - tester.ExpectUniqueSample("WebApp.Install.Source.Failure", kInstallSource, 1); + histograms.ExpectUniqueSample("WebApp.Install.Source.Failure", kInstallSource, + 1); - EXPECT_THAT(tester, + EXPECT_THAT(histograms, test::ForAllGetAllSamples( test::GetInstallCommandResultHistogramNames( ".WebInstallFromUrl", ".Crafted"), base::BucketsAre(base::Bucket( webapps::InstallResultCode::kNotInstallable, 1)))); - EXPECT_THAT(tester, test::ForAllGetAllSamples( - test::GetInstallCommandSourceHistogramNames( - ".WebInstallFromUrl", ".Crafted"), - base::BucketsAre(base::Bucket( - webapps::WebappInstallSource::WEB_INSTALL, 1)))); + EXPECT_THAT(histograms, + test::ForAllGetAllSamples( + test::GetInstallCommandSourceHistogramNames( + ".WebInstallFromUrl", ".Crafted"), + base::BucketsAre(base::Bucket( + webapps::WebappInstallSource::WEB_INSTALL, 1)))); } IN_PROC_BROWSER_TEST_F(WebInstallFromUrlCommandBrowserTest, @@ -268,52 +288,118 @@ std::string install_url = GetAppURLWithManifest("/banners/manifest_no_icon.json").spec(); std::string manifest_id = install_url; - base::HistogramTester tester; + base::HistogramTester histograms; + SetPermissionResponse(/*permission_granted=*/true); ASSERT_TRUE(TryInstallApp(manifest_id, install_url)); EXPECT_FALSE(ResultExists()); - EXPECT_TRUE(ErrorExists()); EXPECT_EQ(GetErrorName(), kAbortError); - tester.ExpectUniqueSample("WebApp.Install.Source.Failure", kInstallSource, 1); + histograms.ExpectUniqueSample("WebApp.Install.Source.Failure", kInstallSource, + 1); EXPECT_THAT( - tester, + histograms, test::ForAllGetAllSamples( test::GetInstallCommandResultHistogramNames(".WebInstallFromUrl", ".Crafted"), base::BucketsAre(base::Bucket( webapps::InstallResultCode::kNotValidManifestForWebApp, 1)))); - EXPECT_THAT(tester, test::ForAllGetAllSamples( - test::GetInstallCommandSourceHistogramNames( - ".WebInstallFromUrl", ".Crafted"), - base::BucketsAre(base::Bucket( - webapps::WebappInstallSource::WEB_INSTALL, 1)))); + EXPECT_THAT(histograms, + test::ForAllGetAllSamples( + test::GetInstallCommandSourceHistogramNames( + ".WebInstallFromUrl", ".Crafted"), + base::BucketsAre(base::Bucket( + webapps::WebappInstallSource::WEB_INSTALL, 1)))); } IN_PROC_BROWSER_TEST_F(WebInstallFromUrlCommandBrowserTest, InvalidInstallUrl) { NavigateToValidUrl(); + // If the site does not have a manifest, the manifest_id will default to the + // current document. std::string install_url = "https://invalid.url"; std::string manifest_id = install_url; - base::HistogramTester tester; + base::HistogramTester histograms; + SetPermissionResponse(/*permission_granted=*/true); ASSERT_TRUE(TryInstallApp(manifest_id, install_url)); EXPECT_FALSE(ResultExists()); EXPECT_TRUE(ErrorExists()); EXPECT_EQ(GetErrorName(), kAbortError); - tester.ExpectUniqueSample("WebApp.Install.Source.Failure", kInstallSource, 1); + histograms.ExpectUniqueSample("WebApp.Install.Source.Failure", kInstallSource, + 1); - EXPECT_THAT(tester, + EXPECT_THAT(histograms, test::ForAllGetAllSamples( test::GetInstallCommandResultHistogramNames( ".WebInstallFromUrl", ".Crafted"), base::BucketsAre(base::Bucket( webapps::InstallResultCode::kInstallURLLoadFailed, 1)))); - EXPECT_THAT(tester, test::ForAllGetAllSamples( - test::GetInstallCommandSourceHistogramNames( - ".WebInstallFromUrl", ".Crafted"), - base::BucketsAre(base::Bucket( - webapps::WebappInstallSource::WEB_INSTALL, 1)))); + EXPECT_THAT(histograms, + test::ForAllGetAllSamples( + test::GetInstallCommandSourceHistogramNames( + ".WebInstallFromUrl", ".Crafted"), + base::BucketsAre(base::Bucket( + webapps::WebappInstallSource::WEB_INSTALL, 1)))); +} + +IN_PROC_BROWSER_TEST_F(WebInstallFromUrlCommandBrowserTest, + InstallAppCrossOrigin_AllowPermission) { + // Navigate to a valid URL on the primary server. + ASSERT_TRUE(ui_test_utils::NavigateToURL( + browser(), https_server()->GetURL("/simple.html"))); + + std::string install_url = + secondary_server_ + .GetURL("/banners/manifest_test_page.html?manifest=manifest.json") + .spec(); + std::string manifest_id = + secondary_server_.GetURL("/banners/manifest_test_page.html").spec(); + base::HistogramTester histograms; + SetPermissionResponse(/*permission_granted=*/true); + ASSERT_TRUE(TryInstallApp(manifest_id, install_url)); + EXPECT_TRUE(ResultExists()); + EXPECT_EQ(GetManifestIdResult(), manifest_id); + EXPECT_FALSE(ErrorExists()); + + histograms.ExpectUniqueSample("WebApp.Install.Source.Success", kInstallSource, + 1); + histograms.ExpectUniqueSample("WebApp.LaunchSource", kLaunchSource, 1); + histograms.ExpectUniqueSample("WebApp.NewCraftedAppInstalled.ByUser", + /*sample=*/true, 1); + + EXPECT_THAT(histograms, + test::ForAllGetAllSamples( + test::GetInstallCommandResultHistogramNames( + ".WebInstallFromUrl", ".Crafted"), + base::BucketsAre(base::Bucket( + webapps::InstallResultCode::kSuccessNewInstall, 1)))); + EXPECT_THAT(histograms, + test::ForAllGetAllSamples( + test::GetInstallCommandSourceHistogramNames( + ".WebInstallFromUrl", ".Crafted"), + base::BucketsAre(base::Bucket( + webapps::WebappInstallSource::WEB_INSTALL, 1)))); +} + +IN_PROC_BROWSER_TEST_F(WebInstallFromUrlCommandBrowserTest, + InstallAppCrossOrigin_DenyPermission) { + // Navigate to a valid URL on the primary server. + ASSERT_TRUE(ui_test_utils::NavigateToURL( + browser(), https_server()->GetURL("/simple.html"))); + + std::string install_url = + secondary_server_ + .GetURL("/banners/manifest_test_page.html?manifest=manifest.json") + .spec(); + std::string manifest_id = + secondary_server_.GetURL("/banners/manifest_test_page.html").spec(); + SetPermissionResponse(/*permission_granted=*/false); + ASSERT_TRUE(TryInstallApp(manifest_id, install_url)); + + EXPECT_FALSE(ResultExists()); + EXPECT_TRUE(ErrorExists()); + EXPECT_EQ(GetErrorName(), kAbortError); } } // namespace web_app
diff --git a/chrome/browser/web_applications/isolated_web_apps/isolated_web_app_browsing_data_browsertest.cc b/chrome/browser/web_applications/isolated_web_apps/isolated_web_app_browsing_data_browsertest.cc index 6215206e..6322b24 100644 --- a/chrome/browser/web_applications/isolated_web_apps/isolated_web_app_browsing_data_browsertest.cc +++ b/chrome/browser/web_applications/isolated_web_apps/isolated_web_app_browsing_data_browsertest.cc
@@ -11,6 +11,7 @@ #include "base/functional/callback_helpers.h" #include "base/run_loop.h" #include "base/strings/strcat.h" +#include "base/strings/to_string.h" #include "base/test/bind.h" #include "base/test/test_future.h" #include "base/time/time.h" @@ -819,7 +820,7 @@ const std::string partition_name("test_partition"); for (const bool in_memory : {true, false}) { SCOPED_TRACE(base::StrCat({"Controlled Frame partition is in-memory: ", - (in_memory ? "true" : "false")})); + base::ToString(in_memory)})); IsolatedWebAppUrlInfo url_info = InstallIsolatedWebApp(); Browser* browser = LaunchWebAppBrowserAndWait(url_info.app_id());
diff --git a/chrome/browser/web_applications/locks/partitioned_lock_id.cc b/chrome/browser/web_applications/locks/partitioned_lock_id.cc index 677c2a6..0dbebdd 100644 --- a/chrome/browser/web_applications/locks/partitioned_lock_id.cc +++ b/chrome/browser/web_applications/locks/partitioned_lock_id.cc
@@ -20,19 +20,4 @@ return out; } -bool operator<(const PartitionedLockId& x, const PartitionedLockId& y) { - if (x.partition != y.partition) { - return x.partition < y.partition; - } - return x.key < y.key; -} - -bool operator==(const PartitionedLockId& x, const PartitionedLockId& y) { - return x.partition == y.partition && x.key == y.key; -} - -bool operator!=(const PartitionedLockId& x, const PartitionedLockId& y) { - return !(x == y); -} - } // namespace web_app
diff --git a/chrome/browser/web_applications/locks/partitioned_lock_id.h b/chrome/browser/web_applications/locks/partitioned_lock_id.h index 4e7e1b5..fa6eafd 100644 --- a/chrome/browser/web_applications/locks/partitioned_lock_id.h +++ b/chrome/browser/web_applications/locks/partitioned_lock_id.h
@@ -13,15 +13,16 @@ struct PartitionedLockId { int partition; std::string key; + + friend auto operator<=>(const PartitionedLockId&, + const PartitionedLockId&) = default; + friend bool operator==(const PartitionedLockId&, + const PartitionedLockId&) = default; }; // Logging support. std::ostream& operator<<(std::ostream& out, const PartitionedLockId& range); -bool operator<(const PartitionedLockId& x, const PartitionedLockId& y); -bool operator==(const PartitionedLockId& x, const PartitionedLockId& y); -bool operator!=(const PartitionedLockId& x, const PartitionedLockId& y); - } // namespace web_app #endif // CHROME_BROWSER_WEB_APPLICATIONS_LOCKS_PARTITIONED_LOCK_ID_H_
diff --git a/chrome/browser/web_applications/preinstalled_web_app_manager_browsertest.cc b/chrome/browser/web_applications/preinstalled_web_app_manager_browsertest.cc index cd99e5a..3392c1c 100644 --- a/chrome/browser/web_applications/preinstalled_web_app_manager_browsertest.cc +++ b/chrome/browser/web_applications/preinstalled_web_app_manager_browsertest.cc
@@ -14,6 +14,7 @@ #include "base/path_service.h" #include "base/strings/strcat.h" #include "base/strings/string_util.h" +#include "base/strings/to_string.h" #include "base/task/sequenced_task_runner.h" #include "base/test/bind.h" #include "base/test/metrics/histogram_tester.h" @@ -1612,8 +1613,7 @@ "launch_container": "window", "user_type": ["unmanaged"] })", - {GetAppUrl().spec(), - IsPreferredAppForSupportedLinks() ? "true" : "false"}, + {GetAppUrl().spec(), base::ToString(IsPreferredAppForSupportedLinks())}, nullptr); webapps::AppId app_id = GenerateAppId(/*manifest_id=*/std::nullopt, GetAppUrl());
diff --git a/chrome/browser/web_applications/web_app_registrar.cc b/chrome/browser/web_applications/web_app_registrar.cc index 49ab851..cf5ad54 100644 --- a/chrome/browser/web_applications/web_app_registrar.cc +++ b/chrome/browser/web_applications/web_app_registrar.cc
@@ -722,10 +722,6 @@ return nullptr; } -bool WebAppRegistrar::IsNotInRegistrar(const webapps::AppId& app_id) const { - return !IsInRegistrar(app_id); -} - bool WebAppRegistrar::IsInRegistrar(const webapps::AppId& app_id) const { const WebApp* web_app = GetAppById(app_id); if (!web_app || web_app->is_uninstalling()) { @@ -746,7 +742,7 @@ std::optional<proto::InstallState> WebAppRegistrar::GetInstallState( const webapps::AppId& app_id) const { - if (IsNotInRegistrar(app_id)) { + if (!IsInRegistrar(app_id)) { return std::nullopt; } const WebApp* web_app = GetAppById(app_id);
diff --git a/chrome/browser/web_applications/web_app_registrar.h b/chrome/browser/web_applications/web_app_registrar.h index 2f220ef..7836ab6 100644 --- a/chrome/browser/web_applications/web_app_registrar.h +++ b/chrome/browser/web_applications/web_app_registrar.h
@@ -127,10 +127,6 @@ WebAppManagement::Type install_source, const GURL& install_url) const; - // DEPRECATED: Use IsInRegistrar instead. - // Returns true if the given app_id is not in the registrar. - bool IsNotInRegistrar(const webapps::AppId& app_id) const; - // Returns true if the given `app_id` is in the registrar. Important: This // function should not be used to check whether an app is installed or not. // Please consider GetInstallState() instead of this function for that.
diff --git a/chrome/browser/web_applications/web_app_utils.cc b/chrome/browser/web_applications/web_app_utils.cc index 3529fa1b..69893ef 100644 --- a/chrome/browser/web_applications/web_app_utils.cc +++ b/chrome/browser/web_applications/web_app_utils.cc
@@ -60,8 +60,6 @@ #include "url/gurl.h" #if BUILDFLAG(IS_CHROMEOS) -#include "ash/constants/ash_features.h" -#include "base/feature_list.h" #include "chrome/browser/ash/crosapi/browser_util.h" #include "chrome/browser/ash/profiles/profile_helper.h" #include "chromeos/ash/components/browser_context_helper/browser_context_types.h" @@ -287,14 +285,12 @@ return false; } auto* user_manager = user_manager::UserManager::Get(); - // Don't enable if SWAs in Kiosk session are disabled for the next session - // types. - if (!base::FeatureList::IsEnabled(ash::features::kKioskEnableSystemWebApps)) { - // Don't enable for Chrome App Kiosk sessions. - if (user_manager && user_manager->IsLoggedInAsKioskApp()) { - return false; - } + + // Don't enable for Chrome App Kiosk sessions. + if (user_manager && user_manager->IsLoggedInAsKioskApp()) { + return false; } + // Guest session forces OTR to be turned on. if (profile->IsGuestSession()) { return profile->IsOffTheRecord();
diff --git a/chrome/browser/web_applications/web_app_utils_unittest.cc b/chrome/browser/web_applications/web_app_utils_unittest.cc index ceb0de0..58a3517 100644 --- a/chrome/browser/web_applications/web_app_utils_unittest.cc +++ b/chrome/browser/web_applications/web_app_utils_unittest.cc
@@ -9,7 +9,6 @@ #include "ash/constants/web_app_id_constants.h" #include "base/containers/adapters.h" #include "base/files/file_path.h" -#include "base/test/scoped_feature_list.h" #include "build/chromeos_buildflags.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/web_applications/mojom/user_display_mode.mojom.h" @@ -240,16 +239,6 @@ EXPECT_FALSE(AreWebAppsEnabled(regular_profile)); } { - base::test::ScopedFeatureList feature_list; - feature_list.InitAndEnableFeature(features::kKioskEnableSystemWebApps); - auto user_manager = std::make_unique<ash::FakeChromeUserManager>(); - auto* user = user_manager->AddKioskAppUser(account_id); - user_manager->UserLoggedIn(user->GetAccountId(), user->username_hash(), - /*browser_restart=*/false, /*is_child=*/false); - user_manager::ScopedUserManager enabler(std::move(user_manager)); - EXPECT_TRUE(AreWebAppsEnabled(regular_profile)); - } - { auto user_manager = std::make_unique<ash::FakeChromeUserManager>(); auto* user = user_manager->AddWebKioskAppUser(account_id); user_manager->UserLoggedIn(user->GetAccountId(), user->username_hash(),
diff --git a/chrome/browser/web_applications/web_install_service_impl.cc b/chrome/browser/web_applications/web_install_service_impl.cc index d7d851d..3bea37067 100644 --- a/chrome/browser/web_applications/web_install_service_impl.cc +++ b/chrome/browser/web_applications/web_install_service_impl.cc
@@ -4,20 +4,36 @@ #include "chrome/browser/web_applications/web_install_service_impl.h" +#include "base/functional/bind.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/web_applications/commands/web_install_from_url_command.h" #include "chrome/browser/web_applications/web_app_command_manager.h" #include "chrome/browser/web_applications/web_app_command_scheduler.h" #include "chrome/browser/web_applications/web_app_provider.h" #include "chrome/browser/web_applications/web_app_utils.h" +#include "components/permissions/permission_request.h" #include "components/webapps/browser/install_result_code.h" +#include "components/webapps/browser/installable/installable_metrics.h" #include "components/webapps/common/web_app_id.h" +#include "content/public/browser/browser_context.h" +#include "content/public/browser/browser_thread.h" +#include "content/public/browser/permission_controller.h" +#include "content/public/browser/permission_request_description.h" #include "content/public/browser/web_contents.h" +#include "third_party/blink/public/common/permissions/permission_utils.h" +#include "third_party/blink/public/mojom/permissions/permission_status.mojom.h" #include "third_party/blink/public/mojom/web_install/web_install.mojom.h" #include "url/gurl.h" +#include "url/origin.h" namespace web_app { +namespace { + +using PermissionStatus = blink::mojom::PermissionStatus; + +} // namespace + WebInstallServiceImpl::WebInstallServiceImpl( content::RenderFrameHost& render_frame_host, mojo::PendingReceiver<blink::mojom::WebInstallService> receiver) @@ -72,9 +88,9 @@ } if (!options) { - // TODO(crbug.com/333795265): Queue a web app command against the current - // document. For the time being, stub out the callback to prevent the calls - // from hanging. + // TODO(crbug.com/381214488): Implement 0-param install. Queue a web app + // command against the current document. For the time being, stub out the + // callback to prevent the calls from hanging for zero parameters given. std::move(callback).Run(blink::mojom::WebInstallServiceResult::kSuccess, GURL()); } @@ -86,16 +102,88 @@ return; } - auto* profile = Profile::FromBrowserContext(rfh->GetBrowserContext()); - if (!profile) { + // Verify that the calling app has the Web Install permissions policy set. + if (!rfh->IsFeatureEnabled( + blink::mojom::PermissionsPolicyFeature::kWebAppInstallation)) { std::move(callback).Run(blink::mojom::WebInstallServiceResult::kAbortError, GURL()); return; } + RequestWebInstallPermission( + base::BindOnce(&WebInstallServiceImpl::OnPermissionDecided, + weak_ptr_factory_.GetWeakPtr(), options->manifest_id, + install_target, std::move(callback))); +} + +void WebInstallServiceImpl::RequestWebInstallPermission( + base::OnceCallback<void(const std::vector<PermissionStatus>&)> callback) { + content::BrowserContext* const browser_context = + render_frame_host().GetBrowserContext(); + if (!browser_context) { + // TODO(crbug.com/381282538): Technically this isn't correct since + // permission wasn't denied. Same for the if check below. Update to a more + // appropriate error. + std::move(callback).Run( + std::vector<PermissionStatus>({PermissionStatus::DENIED})); + return; + } + + content::PermissionController* const permission_controller = + browser_context->GetPermissionController(); + if (!permission_controller) { + std::move(callback).Run( + std::vector<PermissionStatus>({PermissionStatus::DENIED})); + return; + } + + // Check if the permission status is already set. + std::vector<blink::PermissionType> permission_requests; + content::PermissionResult permission_status = + permission_controller->GetPermissionResultForCurrentDocument( + blink::PermissionType::WEB_APP_INSTALLATION, &render_frame_host()); + switch (permission_status.status) { + case PermissionStatus::GRANTED: + std::move(callback).Run( + std::vector<PermissionStatus>({PermissionStatus::GRANTED})); + return; + case PermissionStatus::DENIED: + std::move(callback).Run( + std::vector<PermissionStatus>({PermissionStatus::DENIED})); + return; + case PermissionStatus::ASK: + break; + } + permission_requests.push_back(blink::PermissionType::WEB_APP_INSTALLATION); + + GURL requesting_origin = + render_frame_host().GetLastCommittedOrigin().GetURL(); + // User gesture requirement is enforced in NavigatorWebInstall::InstallImpl. + permission_controller->RequestPermissionsFromCurrentDocument( + &render_frame_host(), + content::PermissionRequestDescription( + permission_requests, /*user_gesture=*/true, requesting_origin), + std::move(callback)); +} + +void WebInstallServiceImpl::OnPermissionDecided( + const GURL& manifest_id, + const GURL& install_target, + InstallCallback callback, + const std::vector<PermissionStatus>& permission_status) { + // TODO(crbug.com/381282538): Throw different error if permission not granted. + CHECK_EQ(permission_status.size(), 1u); + if (permission_status[0] != PermissionStatus::GRANTED) { + std::move(callback).Run(blink::mojom::WebInstallServiceResult::kAbortError, + GURL()); + return; + } + auto* profile = + Profile::FromBrowserContext(render_frame_host().GetBrowserContext()); + auto* provider = WebAppProvider::GetForWebApps(profile); provider->scheduler().InstallAppFromUrl( - options->manifest_id, install_target, + manifest_id, install_target, base::BindOnce(&WebInstallServiceImpl::OnAppInstalled, weak_ptr_factory_.GetWeakPtr(), std::move(callback))); } @@ -103,6 +191,7 @@ void WebInstallServiceImpl::OnAppInstalled(InstallCallback callback, const GURL& manifest_id, webapps::InstallResultCode code) { + // TODO(crbug.com/381282538): Add error types for additional granularity. blink::mojom::WebInstallServiceResult result = blink::mojom::WebInstallServiceResult::kAbortError;
diff --git a/chrome/browser/web_applications/web_install_service_impl.h b/chrome/browser/web_applications/web_install_service_impl.h index 5c003bd..26687282 100644 --- a/chrome/browser/web_applications/web_install_service_impl.h +++ b/chrome/browser/web_applications/web_install_service_impl.h
@@ -8,6 +8,7 @@ #include "base/memory/weak_ptr.h" #include "components/webapps/common/web_app_id.h" #include "content/public/browser/document_service.h" +#include "third_party/blink/public/mojom/permissions/permission_status.mojom.h" #include "third_party/blink/public/mojom/web_install/web_install.mojom.h" #include "url/gurl.h" @@ -36,13 +37,22 @@ mojo::PendingReceiver<blink::mojom::WebInstallService> receiver); ~WebInstallServiceImpl() override; + void RequestWebInstallPermission( + base::OnceCallback< + void(const std::vector<blink::mojom::PermissionStatus>&)> callback); + + void OnPermissionDecided( + const GURL& manifest_id, + const GURL& install_target, + InstallCallback callback, + const std::vector<blink::mojom::PermissionStatus>& permission_status); + void OnAppInstalled(InstallCallback callback, const GURL& manifest_id, webapps::InstallResultCode code); const content::GlobalRenderFrameHostId frame_routing_id_; - - base::WeakPtrFactory<WebInstallServiceImpl> weak_ptr_factory_{this}; + base::WeakPtrFactory<web_app::WebInstallServiceImpl> weak_ptr_factory_{this}; }; } // namespace web_app
diff --git a/chrome/build/android-arm32.pgo.txt b/chrome/build/android-arm32.pgo.txt index f51b4bca..390ccf3 100644 --- a/chrome/build/android-arm32.pgo.txt +++ b/chrome/build/android-arm32.pgo.txt
@@ -1 +1 @@ -chrome-android32-main-1736510306-cd6adbbcbcd34e23bf35589a1993b59aa1ba396c-92c2bb99b59079b19c3a40503b593091c01b9b4b.profdata +chrome-android32-main-1736531933-228bc904ebf407e6f5265665948b4adbd3bdf254-ffa032aa746954106635699e59f2cf3b356a49fe.profdata
diff --git a/chrome/build/android-arm64.pgo.txt b/chrome/build/android-arm64.pgo.txt index dd80c1d..c0c1f871a 100644 --- a/chrome/build/android-arm64.pgo.txt +++ b/chrome/build/android-arm64.pgo.txt
@@ -1 +1 @@ -chrome-android64-main-1736507648-802ddfb153e2a4738c4d0ba17f67307d609f9b4b-b92fa63a9356f9cbcac5ee1a2da746f531b8df12.profdata +chrome-android64-main-1736531933-0bb86366eacf9bb8b754fea33cab7b57025fa8d3-ffa032aa746954106635699e59f2cf3b356a49fe.profdata
diff --git a/chrome/build/linux.pgo.txt b/chrome/build/linux.pgo.txt index a9285d87..c0ef5c7 100644 --- a/chrome/build/linux.pgo.txt +++ b/chrome/build/linux.pgo.txt
@@ -1 +1 @@ -chrome-linux-main-1736488671-13613ca89b6608377fc7024ba121cecca979db0e-92eb14dd09feef366e5e80bd838857b3dabc43a9.profdata +chrome-linux-main-1736531933-a09f04b39f39d34c6c9798a93762bb71d6b667de-ffa032aa746954106635699e59f2cf3b356a49fe.profdata
diff --git a/chrome/build/mac-arm.pgo.txt b/chrome/build/mac-arm.pgo.txt index b6cdd458..51114ea 100644 --- a/chrome/build/mac-arm.pgo.txt +++ b/chrome/build/mac-arm.pgo.txt
@@ -1 +1 @@ -chrome-mac-arm-main-1736510306-2fac4285aa434fba742a653542a5a45b41aab61a-92c2bb99b59079b19c3a40503b593091c01b9b4b.profdata +chrome-mac-arm-main-1736531933-6709b71c5ca7f5d7d4cb8ad775a7cd6c6d680236-ffa032aa746954106635699e59f2cf3b356a49fe.profdata
diff --git a/chrome/build/mac.pgo.txt b/chrome/build/mac.pgo.txt index 7d17b66a..492ebf28 100644 --- a/chrome/build/mac.pgo.txt +++ b/chrome/build/mac.pgo.txt
@@ -1 +1 @@ -chrome-mac-main-1736467164-764cba95635780c52471a18d308b55b2c961327f-724a5092e0411adcb81495777e552e1b63878fc6.profdata +chrome-mac-main-1736531933-a6e4651d897a627c25465f08e95f146b52e25eee-ffa032aa746954106635699e59f2cf3b356a49fe.profdata
diff --git a/chrome/build/win-arm64.pgo.txt b/chrome/build/win-arm64.pgo.txt index adb09c6..a7d612f 100644 --- a/chrome/build/win-arm64.pgo.txt +++ b/chrome/build/win-arm64.pgo.txt
@@ -1 +1 @@ -chrome-win-arm64-main-1736488671-a28392ce9acc99464d6a723138881551055ce753-92eb14dd09feef366e5e80bd838857b3dabc43a9.profdata +chrome-win-arm64-main-1736531933-1b6ae07b55d914c8323ed253c2826270a187a8a6-ffa032aa746954106635699e59f2cf3b356a49fe.profdata
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt index 0850557..cdd1565 100644 --- a/chrome/build/win32.pgo.txt +++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@ -chrome-win32-main-1736488671-9988bbfaf76a35b3481ee0950854e0983e740cc6-92eb14dd09feef366e5e80bd838857b3dabc43a9.profdata +chrome-win32-main-1736510306-f81a49cd21b328d70b48b3b859e44eafa159d030-92c2bb99b59079b19c3a40503b593091c01b9b4b.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt index 416de7b..051db7f 100644 --- a/chrome/build/win64.pgo.txt +++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@ -chrome-win64-main-1736488671-40084f4fc897080e52f12008db36a0491bf19c65-92eb14dd09feef366e5e80bd838857b3dabc43a9.profdata +chrome-win64-main-1736510306-05734b56a6442882d0cb2bd7c563c12dfe215f87-92c2bb99b59079b19c3a40503b593091c01b9b4b.profdata
diff --git a/chrome/common/auto_start_linux.cc b/chrome/common/auto_start_linux.cc index 9d5def7..b574230 100644 --- a/chrome/common/auto_start_linux.cc +++ b/chrome/common/auto_start_linux.cc
@@ -14,6 +14,7 @@ #include "base/nix/xdg_util.h" #include "base/strings/string_tokenizer.h" #include "base/strings/string_util.h" +#include "base/strings/to_string.h" namespace { @@ -35,7 +36,7 @@ base::FilePath autostart_file = autostart_directory.Append(autostart_filename); - std::string terminal = is_terminal_app ? "true" : "false"; + std::string terminal = base::ToString(is_terminal_app); std::string autostart_file_contents = "[Desktop Entry]\n" "Type=Application\n"
diff --git a/chrome/common/chrome_features.cc b/chrome/common/chrome_features.cc index d3ef178..ff3cae2 100644 --- a/chrome/common/chrome_features.cc +++ b/chrome/common/chrome_features.cc
@@ -734,12 +734,6 @@ base::FEATURE_DISABLED_BY_DEFAULT); #endif // BUILDFLAG(IS_CHROMEOS) -#if BUILDFLAG(IS_CHROMEOS) -BASE_FEATURE(kKioskEnableSystemWebApps, - "KioskEnableSystemWebApps", - base::FEATURE_DISABLED_BY_DEFAULT); -#endif // BUILDFLAG(IS_CHROMEOS) - // When enabled, allows other features to use the k-Anonymity Service. BASE_FEATURE(kKAnonymityService, "KAnonymityService",
diff --git a/chrome/common/chrome_features.h b/chrome/common/chrome_features.h index 6da3fa3..374ac75 100644 --- a/chrome/common/chrome_features.h +++ b/chrome/common/chrome_features.h
@@ -439,10 +439,22 @@ BASE_DECLARE_FEATURE(kIsolatedWebAppManagedGuestSessionInstall); #endif -#if BUILDFLAG(IS_CHROMEOS) +COMPONENT_EXPORT(CHROME_FEATURES) BASE_DECLARE_FEATURE(kKAnonymityService); COMPONENT_EXPORT(CHROME_FEATURES) -BASE_DECLARE_FEATURE(kKioskEnableSystemWebApps); -#endif +extern const base::FeatureParam<std::string> kKAnonymityServiceAuthServer; +COMPONENT_EXPORT(CHROME_FEATURES) +extern const base::FeatureParam<std::string> kKAnonymityServiceJoinRelayServer; +COMPONENT_EXPORT(CHROME_FEATURES) +extern const base::FeatureParam<std::string> kKAnonymityServiceJoinServer; +COMPONENT_EXPORT(CHROME_FEATURES) +extern const base::FeatureParam<base::TimeDelta> kKAnonymityServiceJoinInterval; +COMPONENT_EXPORT(CHROME_FEATURES) +extern const base::FeatureParam<std::string> kKAnonymityServiceQueryServer; +COMPONENT_EXPORT(CHROME_FEATURES) +extern const base::FeatureParam<std::string> kKAnonymityServiceQueryRelayServer; +COMPONENT_EXPORT(CHROME_FEATURES) +extern const base::FeatureParam<base::TimeDelta> + kKAnonymityServiceQueryInterval; COMPONENT_EXPORT(CHROME_FEATURES) BASE_DECLARE_FEATURE(kKAnonymityService); COMPONENT_EXPORT(CHROME_FEATURES)
diff --git a/chrome/common/extensions/api/tabs.json b/chrome/common/extensions/api/tabs.json index b0dba984..476c7ab 100644 --- a/chrome/common/extensions/api/tabs.json +++ b/chrome/common/extensions/api/tabs.json
@@ -64,10 +64,10 @@ "discarded": {"type": "boolean", "description": "Whether the tab is discarded. A discarded tab is one whose content has been unloaded from memory, but is still visible in the tab strip. Its content is reloaded the next time it is activated."}, "autoDiscardable": {"type": "boolean", "description": "Whether the tab can be discarded automatically by the browser when resources are low."}, "mutedInfo": {"$ref": "MutedInfo", "optional": true, "description": "The tab's muted state and the reason for the last state change."}, - "url": {"type": "string", "optional": true, "description": "The last committed URL of the main frame of the tab. This property is only present if the extension's manifest includes the <code>\"tabs\"</code> permission and may be an empty string if the tab has not yet committed. See also $(ref:Tab.pendingUrl)."}, - "pendingUrl": {"type": "string", "optional": true, "description": "The URL the tab is navigating to, before it has committed. This property is only present if the extension's manifest includes the <code>\"tabs\"</code> permission and there is a pending navigation."}, - "title": {"type": "string", "optional": true, "description": "The title of the tab. This property is only present if the extension's manifest includes the <code>\"tabs\"</code> permission."}, - "favIconUrl": {"type": "string", "optional": true, "description": "The URL of the tab's favicon. This property is only present if the extension's manifest includes the <code>\"tabs\"</code> permission. It may also be an empty string if the tab is loading."}, + "url": {"type": "string", "optional": true, "description": "The last committed URL of the main frame of the tab. This property is only present if the extension has the <code>\"tabs\"</code> permission or has host permissions for the page. May be an empty string if the tab has not yet committed. See also $(ref:Tab.pendingUrl)."}, + "pendingUrl": {"type": "string", "optional": true, "description": "The URL the tab is navigating to, before it has committed. This property is only present if the extension has the <code>\"tabs\"</code> permission or has host permissions for the page and there is a pending navigation."}, + "title": {"type": "string", "optional": true, "description": "The title of the tab. This property is only present if the extension has the <code>\"tabs\"</code> permission or has host permissions for the page."}, + "favIconUrl": {"type": "string", "optional": true, "description": "The URL of the tab's favicon. This property is only present if the extension has the <code>\"tabs\"</code> permission or has host permissions for the page. It may also be an empty string if the tab is loading."}, "status": { "$ref": "TabStatus", "optional": true, @@ -427,7 +427,7 @@ { "name": "tab", "optional": true, - "description": "Details about the duplicated tab. The $(ref:tabs.Tab) object does not contain <code>url</code>, <code>pendingUrl</code>, <code>title</code>, and <code>favIconUrl</code> if the <code>\"tabs\"</code> permission has not been requested.", + "description": "Details about the duplicated tab. The <code>url</code>, <code>pendingUrl</code>, <code>title</code> and <code>favIconUrl</code> properties are only included on the $(ref:tabs.Tab) object if the extension has the <code>\"tabs\"</code> permission or has host permissions for the page.", "$ref": "Tab" } ] @@ -500,7 +500,7 @@ "title": { "type": "string", "optional": true, - "description": "Match page titles against a pattern. This property is ignored if the extension does not have the <code>\"tabs\"</code> permission." + "description": "Match page titles against a pattern. This property is ignored if the extension does not have the <code>\"tabs\"</code> permission or host permissions for the page." }, "url": { "choices": [ @@ -508,7 +508,7 @@ {"type": "array", "items": {"type": "string"}} ], "optional": true, - "description": "Match tabs against one or more <a href='match_patterns'>URL patterns</a>. Fragment identifiers are not matched. This property is ignored if the extension does not have the <code>\"tabs\"</code> permission." + "description": "Match tabs against one or more <a href='match_patterns'>URL patterns</a>. Fragment identifiers are not matched. This property is ignored if the extension does not have the <code>\"tabs\"</code> permission or host permissions for the page." }, "groupId": { "type": "integer", @@ -655,7 +655,7 @@ "name": "tab", "$ref": "Tab", "optional": true, - "description": "Details about the updated tab. The $(ref:tabs.Tab) object does not contain <code>url</code>, <code>pendingUrl</code>, <code>title</code>, and <code>favIconUrl</code> if the <code>\"tabs\"</code> permission has not been requested." + "description": "Details about the updated tab. The <code>url</code>, <code>pendingUrl</code>, <code>title</code> and <code>favIconUrl</code> properties are only included on the $(ref:tabs.Tab) object if the extension has the <code>\"tabs\"</code> permission or has host permissions for the page." } ] }
diff --git a/chrome/common/pref_names.h b/chrome/common/pref_names.h index 9d687da..e8bb8fe 100644 --- a/chrome/common/pref_names.h +++ b/chrome/common/pref_names.h
@@ -2221,30 +2221,42 @@ // Whether the move confirmation dialog has been shown before for Google Drive. inline constexpr char kOfficeMoveConfirmationShownForDrive[] = "filebrowser.office.move_confirmation_shown_for_drive"; +inline constexpr char kOfficeMoveConfirmationShownForDriveSyncable[] = + "filebrowser.office.move_confirmation_shown_for_drive_syncable"; // Whether the move confirmation dialog has been shown before for OneDrive. inline constexpr char kOfficeMoveConfirmationShownForOneDrive[] = "filebrowser.office.move_confirmation_shown_for_onedrive"; +inline constexpr char kOfficeMoveConfirmationShownForOneDriveSyncable[] = + "filebrowser.office.move_confirmation_shown_for_onedrive_syncable"; // Whether the move confirmation dialog has been shown before for uploading // local files to Drive. inline constexpr char kOfficeMoveConfirmationShownForLocalToDrive[] = "filebrowser.office.move_confirmation_shown_for_local_to_drive"; +inline constexpr char kOfficeMoveConfirmationShownForLocalToDriveSyncable[] = + "filebrowser.office.move_confirmation_shown_for_local_to_drive_syncable"; // Whether the move confirmation dialog has been shown before for uploading // local files to OneDrive. inline constexpr char kOfficeMoveConfirmationShownForLocalToOneDrive[] = "filebrowser.office.move_confirmation_shown_for_local_to_onedrive"; +inline constexpr char kOfficeMoveConfirmationShownForLocalToOneDriveSyncable[] = + "filebrowser.office.move_confirmation_shown_for_local_to_onedrive_syncable"; // Whether the move confirmation dialog has been shown before for uploading // cloud files to Drive. inline constexpr char kOfficeMoveConfirmationShownForCloudToDrive[] = "filebrowser.office.move_confirmation_shown_for_cloud_to_drive"; +inline constexpr char kOfficeMoveConfirmationShownForCloudToDriveSyncable[] = + "filebrowser.office.move_confirmation_shown_for_cloud_to_drive_syncable"; // Whether the move confirmation dialog has been shown before for uploading // cloud files to OneDrive. inline constexpr char kOfficeMoveConfirmationShownForCloudToOneDrive[] = "filebrowser.office.move_confirmation_shown_for_cloud_to_onedrive"; +inline constexpr char kOfficeMoveConfirmationShownForCloudToOneDriveSyncable[] = + "filebrowser.office.move_confirmation_shown_for_cloud_to_onedrive_syncable"; // The timestamp of the latest office file automatically moved to OneDrive. inline constexpr char kOfficeFileMovedToOneDrive[] =
diff --git a/chrome/common/privacy_budget/field_trial_param_conversions.cc b/chrome/common/privacy_budget/field_trial_param_conversions.cc index e8eb742..3bf87f1 100644 --- a/chrome/common/privacy_budget/field_trial_param_conversions.cc +++ b/chrome/common/privacy_budget/field_trial_param_conversions.cc
@@ -12,6 +12,7 @@ #include "base/strings/strcat.h" #include "base/strings/string_number_conversions.h" #include "base/strings/string_split.h" +#include "base/strings/to_string.h" #include "third_party/blink/public/common/privacy_budget/identifiable_surface.h" namespace privacy_budget_internal { @@ -113,5 +114,5 @@ } // namespace privacy_budget_internal std::string EncodeIdentifiabilityFieldTrialParam(bool source) { - return source ? "true" : "false"; + return base::ToString(source); }
diff --git a/chrome/common/webui_url_constants.h b/chrome/common/webui_url_constants.h index d12c2cb..76a78d7 100644 --- a/chrome/common/webui_url_constants.h +++ b/chrome/common/webui_url_constants.h
@@ -540,6 +540,7 @@ "chrome://profile-customization"; inline constexpr char kChromeUIProfilePickerHost[] = "profile-picker"; inline constexpr char kChromeUIProfilePickerStartupQuery[] = "startup"; +inline constexpr char kChromeUIProfilePickerGlicQuery[] = "glic"; inline constexpr char kChromeUIProfilePickerUrl[] = "chrome://profile-picker/"; #endif
diff --git a/chrome/enterprise_companion/enterprise_companion_status.cc b/chrome/enterprise_companion/enterprise_companion_status.cc index 5301c1d..485a65d5 100644 --- a/chrome/enterprise_companion/enterprise_companion_status.cc +++ b/chrome/enterprise_companion/enterprise_companion_status.cc
@@ -78,6 +78,8 @@ return "Illegal account for packaged EDU license"; case policy::DM_STATUS_SERVICE_INVALID_PACKAGED_DEVICE_FOR_KIOSK: return "Packaged license device can't enroll KIOSK"; + case policy::DM_STATUS_SERVICE_ORG_UNIT_ENROLLMENT_LIMIT_EXCEEEDED: + return "Organization unit initial enrollment limit has been exceeded"; } }
diff --git a/chrome/installer/setup/install_unittest.cc b/chrome/installer/setup/install_unittest.cc index eb5e094d..325d05d 100644 --- a/chrome/installer/setup/install_unittest.cc +++ b/chrome/installer/setup/install_unittest.cc
@@ -22,6 +22,7 @@ #include "base/files/scoped_temp_dir.h" #include "base/path_service.h" #include "base/strings/strcat_win.h" +#include "base/strings/to_string.h" #include "base/strings/utf_string_conversions.h" #include "base/test/scoped_path_override.h" #include "base/test/test_shortcut_win.h" @@ -304,7 +305,7 @@ initial_prefs += (i == 0 ? "\"" : ",\""); initial_prefs += desired_prefs[i].pref_name; initial_prefs += "\":"; - initial_prefs += desired_prefs[i].is_desired ? "true" : "false"; + initial_prefs += base::ToString(desired_prefs[i].is_desired); } initial_prefs += "}}";
diff --git a/chrome/installer/setup/installer_crash_reporting.cc b/chrome/installer/setup/installer_crash_reporting.cc index a3158b3..31d0f0c 100644 --- a/chrome/installer/setup/installer_crash_reporting.cc +++ b/chrome/installer/setup/installer_crash_reporting.cc
@@ -14,6 +14,7 @@ #include "base/files/file_util.h" #include "base/notreached.h" #include "base/path_service.h" +#include "base/strings/to_string.h" #include "base/strings/utf_string_conversions.h" #include "base/version.h" #include "base/win/registry.h" @@ -100,7 +101,7 @@ operation.Set(OperationToString(state.operation())); static CrashKeyString<6> is_system_level("system-level"); - is_system_level.Set(state.system_install() ? "true" : "false"); + is_system_level.Set(base::ToString(state.system_install())); // This is a Windows registry key, which maxes out at 255 chars. static CrashKeyString<256> state_crash_key("state-key");
diff --git a/chrome/installer/util/additional_parameters_unittest.cc b/chrome/installer/util/additional_parameters_unittest.cc index 6b3201c..6bcb503 100644 --- a/chrome/installer/util/additional_parameters_unittest.cc +++ b/chrome/installer/util/additional_parameters_unittest.cc
@@ -7,6 +7,7 @@ #include <optional> #include <string_view> +#include "base/strings/to_string.h" #include "base/test/test_reg_util_win.h" #include "base/win/registry.h" #include "build/build_config.h" @@ -251,7 +252,7 @@ SCOPED_TRACE(::testing::Message() << "channel=" << static_cast<int>(channel.channel) << " is_extended_stable_channel=" - << (channel.is_extended_stable_channel ? "true" : "false")); + << base::ToString(channel.is_extended_stable_channel)); AdditionalParameters ap; ap.SetChannel(channel.channel, channel.is_extended_stable_channel); if (channel.channel == version_info::Channel::STABLE &&
diff --git a/chrome/renderer/autofill/password_generation_agent_browsertest.cc b/chrome/renderer/autofill/password_generation_agent_browsertest.cc index bc8a9ad..c662f73 100644 --- a/chrome/renderer/autofill/password_generation_agent_browsertest.cc +++ b/chrome/renderer/autofill/password_generation_agent_browsertest.cc
@@ -1572,21 +1572,5 @@ ExpectAutomaticGenerationAvailable(kPasswordElementId, kAvailable); } -TEST_F(PasswordGenerationAgentTest, - PopupNotShowingUpAfterUserRejectedGeneration) { - LoadHTMLWithUserGesture(kAccountCreationFormHTML); - SetFoundFormEligibleForGeneration(password_generation_, - GetMainFrame()->GetDocument(), - /*new_password_id=*/"first_password", - /*confirm_password_id=*/"second_password"); - ExpectAutomaticGenerationAvailable("first_password", kAvailable); - - password_generation_->GeneratedPasswordRejected(); - ExpectAutomaticGenerationAvailable("first_password", kNotReported); - - // The popup should still be available from the manual fallback. - SelectGenerationFallbackAndExpect(/*available=*/true); -} - } // namespace } // namespace autofill
diff --git a/chrome/renderer/supervised_user/supervised_user_error_page_controller.cc b/chrome/renderer/supervised_user/supervised_user_error_page_controller.cc index a5b5496b..91b6174d 100644 --- a/chrome/renderer/supervised_user/supervised_user_error_page_controller.cc +++ b/chrome/renderer/supervised_user/supervised_user_error_page_controller.cc
@@ -7,6 +7,7 @@ #include "base/functional/bind.h" #include "base/logging.h" #include "base/strings/stringprintf.h" +#include "base/strings/to_string.h" #include "base/strings/utf_string_conversions.h" #include "chrome/renderer/supervised_user/supervised_user_error_page_controller_delegate.h" #include "content/public/renderer/render_frame.h" @@ -80,9 +81,9 @@ } void SupervisedUserErrorPageController::OnRequestUrlAccessRemote(bool success) { - std::string result = success ? "true" : "false"; + std::string result = base::ToString(success); std::string is_outermost_main_frame = - render_frame_->GetWebFrame()->IsOutermostMainFrame() ? "true" : "false"; + base::ToString(render_frame_->GetWebFrame()->IsOutermostMainFrame()); std::string js = base::StringPrintf("setRequestStatus(%s, %s)", result.c_str(), is_outermost_main_frame.c_str());
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn index 5e5e74b..5607bfb 100644 --- a/chrome/test/BUILD.gn +++ b/chrome/test/BUILD.gn
@@ -5436,6 +5436,7 @@ "../browser/ui/startup/default_browser_prompt/default_browser_prompt_browsertest.cc", "../browser/ui/startup/first_run_service_browsertest.cc", "../browser/ui/views/profiles/profile_picker_dice_sign_in_provider_browsertest.cc", + "../browser/ui/views/profiles/profile_picker_glic_flow_controller_browsertest.cc", "../browser/ui/views/profiles/profile_picker_view_browsertest.cc", "../browser/ui/views/web_apps/web_app_integration_browsertest_mac_win_linux.cc",
diff --git a/chrome/test/chromedriver/test/run_py_tests.py b/chrome/test/chromedriver/test/run_py_tests.py index fb37a9d..ecc7ac3a 100755 --- a/chrome/test/chromedriver/test/run_py_tests.py +++ b/chrome/test/chromedriver/test/run_py_tests.py
@@ -8705,8 +8705,7 @@ 'enable-experimental-web-platform-features'] self._driver = self.CreateDriver( accept_insecure_certs=True, - chrome_switches=self.chrome_switches + - ["--enable-features=FedCmIdpSigninStatusEnabled"]) + chrome_switches=self.chrome_switches) self._driver.Load(self._url_prefix + "/mark-signed-in")
diff --git a/chrome/test/data/webui/chromeos/boca_ui/client_delegate_impl_test.ts b/chrome/test/data/webui/chromeos/boca_ui/client_delegate_impl_test.ts index 92fdaef..b3bcf84 100644 --- a/chrome/test/data/webui/chromeos/boca_ui/client_delegate_impl_test.ts +++ b/chrome/test/data/webui/chromeos/boca_ui/client_delegate_impl_test.ts
@@ -32,8 +32,12 @@ }); } override listCourses(): Promise<{courses: Course[]}> { - return Promise.resolve( - {courses: [{id: '1', name: 'course1'}, {id: '2', name: 'course2'}]}); + return Promise.resolve({ + courses: [ + {id: '1', name: 'course1', section: 'period1'}, + {id: '2', name: 'course2', section: ''} + ] + }); } override listStudents(id: string): Promise<{students: Identity[]}> { // Dummy action get around with unused variable check. @@ -236,6 +240,9 @@ id; return Promise.resolve({error: null}); } + override authenticateWebview() { + return Promise.resolve({success: true}); + } } suite('ClientDelegateTest', function() { @@ -279,7 +286,7 @@ const result = await clientDelegateImpl.getInstance().getCourseList(); assertDeepEquals( [ - {id: '1', name: 'course1', section: ''}, + {id: '1', name: 'course1', section: 'period1'}, {id: '2', name: 'course2', section: ''}, ], result); @@ -606,4 +613,11 @@ assertTrue(result); }); + test( + 'client delegate should respond correctly for authenticateWebview', + async () => { + const result = + await clientDelegateImpl.getInstance().authenticateWebview(); + assertTrue(result); + }); });
diff --git a/chrome/test/data/webui/commerce/product_specifications/app_test.ts b/chrome/test/data/webui/commerce/product_specifications/app_test.ts index cd94a40..242186e 100644 --- a/chrome/test/data/webui/commerce/product_specifications/app_test.ts +++ b/chrome/test/data/webui/commerce/product_specifications/app_test.ts
@@ -2427,7 +2427,7 @@ productSpecificationsProxy.setResultMapperFor( 'getComparisonTableUrlForUuid', (uuid: Uuid) => { - return Promise.resolve(`chrome://compare/?id=${uuid.value}`); + return Promise.resolve({url: `chrome://compare/?id=${uuid.value}`}); }); }); @@ -2564,5 +2564,72 @@ ], listElement.tables); }); + + test('table is populated when an item is clicked', async () => { + const specsSetUrls = [{url: 'https://example.com/'}]; + const specsSet = + createSpecsSet({urls: specsSetUrls, uuid: {value: '123'}}); + shoppingServiceApi.setResultFor( + 'getProductSpecificationsSetByUuid', + Promise.resolve({set: specsSet})); + const appElement = await createAppElement(); + + // Click an item in the list. + appElement.$.comparisonTableList.fire('item-click', { + uuid: {value: '123'}, + }); + await flushTasks(); + + assertEquals( + 1, + shoppingServiceApi.getCallCount('getProductSpecificationsSetByUuid')); + assertEquals( + '123', + shoppingServiceApi.getArgs('getProductSpecificationsSetByUuid')[0] + .value); + }); + + test( + 'table is deleted when the delete context menu item is clicked', + async () => { + const appElement = await createAppElement(); + await flushTasks(); + + appElement.$.comparisonTableList.fire('delete-table', { + uuid: {value: '123'}, + }); + await flushTasks(); + + assertEquals( + 1, + shoppingServiceApi.getCallCount( + 'deleteProductSpecificationsSet')); + assertEquals( + '123', + shoppingServiceApi.getArgs('deleteProductSpecificationsSet')[0] + .value); + }); + + test( + 'table is deleted when the delete context menu item is clicked', + async () => { + const appElement = await createAppElement(); + await flushTasks(); + + appElement.$.comparisonTableList.fire('rename-table', { + uuid: {value: '123'}, + name: 'xyz', + }); + await flushTasks(); + + assertEquals( + 1, + shoppingServiceApi.getCallCount( + 'setNameForProductSpecificationsSet')); + const args = shoppingServiceApi.getArgs( + 'setNameForProductSpecificationsSet')[0]; + assertEquals('123', args[0].value); + assertEquals('xyz', args[1]); + }); }); });
diff --git a/chrome/test/data/webui/commerce/product_specifications/comparison_table_list_item_test.ts b/chrome/test/data/webui/commerce/product_specifications/comparison_table_list_item_test.ts index 22cc2b22..41653f3b 100644 --- a/chrome/test/data/webui/commerce/product_specifications/comparison_table_list_item_test.ts +++ b/chrome/test/data/webui/commerce/product_specifications/comparison_table_list_item_test.ts
@@ -5,12 +5,15 @@ import 'chrome://compare/comparison_table_list_item.js'; import {ProductSpecificationsBrowserProxyImpl} from '//resources/cr_components/commerce/product_specifications_browser_proxy.js'; +import type {CrActionMenuElement} from '//resources/cr_elements/cr_action_menu/cr_action_menu.js'; +import type {CrIconButtonElement} from '//resources/cr_elements/cr_icon_button/cr_icon_button.js'; +import type {CrInputElement} from '//resources/cr_elements/cr_input/cr_input.js'; import {PluralStringProxyImpl} from '//resources/js/plural_string_proxy.js'; import type {ComparisonTableListItemElement} from 'chrome://compare/comparison_table_list_item.js'; import {loadTimeData} from 'chrome://resources/js/load_time_data.js'; import {assertEquals, assertStringContains, assertTrue} from 'chrome://webui-test/chai_assert.js'; import {TestPluralStringProxy} from 'chrome://webui-test/test_plural_string_proxy.js'; -import {eventToPromise, microtasksFinished} from 'chrome://webui-test/test_util.js'; +import {$$, eventToPromise, microtasksFinished} from 'chrome://webui-test/test_util.js'; import {TestProductSpecificationsBrowserProxy} from './test_product_specifications_browser_proxy.js'; @@ -22,6 +25,8 @@ suite('ComparisonTableListItemTest', () => { let itemElement: ComparisonTableListItemElement; + const productSpecsProxy: TestProductSpecificationsBrowserProxy = + new TestProductSpecificationsBrowserProxy(); const TABLE_NAME = 'abc'; const TABLE_UUID = {value: '123'}; @@ -29,6 +34,13 @@ const TABLE_IMAGE_URL = {url: 'http://example.com/image.png'}; const TABLE_URL = {url: `chrome://compare/?id=${TABLE_UUID.value}`}; + function getTrailingIconButton() { + const trailingIconButton = + $$<CrIconButtonElement>(itemElement, '#trailingIconButton'); + assertTrue(!!trailingIconButton); + return trailingIconButton; + } + setup(async () => { loadTimeData.overrideValues({ 'tableListItemTitle': `Compare ${TABLE_NAME}`, @@ -37,7 +49,7 @@ const pluralStringProxy = new ListItemTestPluralStringProxy(); PluralStringProxyImpl.setInstance(pluralStringProxy); - const productSpecsProxy = new TestProductSpecificationsBrowserProxy(); + productSpecsProxy.reset(); ProductSpecificationsBrowserProxyImpl.setInstance(productSpecsProxy); document.body.innerHTML = window.trustedTypes!.emptyHTML; @@ -63,11 +75,72 @@ }); test('click emits event with UUID', async () => { - const clickPromise = - eventToPromise('comparison-table-list-item-click', document); + const clickPromise = eventToPromise('item-click', document); itemElement.$.item.click(); const event = await clickPromise; assertEquals(TABLE_UUID, event.detail.uuid); }); + + suite('context menu', () => { + let menu: CrActionMenuElement; + + setup(() => { + getTrailingIconButton().click(); + + const maybeMenu = itemElement.$.menu.getIfExists(); + assertTrue(!!maybeMenu); + menu = maybeMenu; + }); + + test('open in new tab option opens the table in a new tab', async () => { + const openInNewTabButton = + menu.querySelector<HTMLButtonElement>('#openInNewTab'); + assertTrue(!!openInNewTabButton); + openInNewTabButton.click(); + + assertEquals( + 1, + productSpecsProxy.getCallCount( + 'showProductSpecificationsSetForUuid')); + const args = + productSpecsProxy.getArgs('showProductSpecificationsSetForUuid')[0]; + assertEquals(TABLE_UUID, args[0]); + assertEquals(/*inNewTab=*/ true, args[1]); + }); + + test( + 'rename option displays input, and submitting emits event with UUID ' + + 'and name', + async () => { + const newTableName = 'xyz'; + const renamePromise = eventToPromise('rename-table', document); + + const renameButton = menu.querySelector<HTMLButtonElement>('#rename'); + assertTrue(!!renameButton); + renameButton!.click(); + await microtasksFinished(); + + const input = $$<CrInputElement>(itemElement, '#renameInput'); + assertTrue(!!input); + input.value = newTableName; + input.focus(); + input.dispatchEvent(new KeyboardEvent('keydown', {key: 'Enter'})); + + const event = await renamePromise; + assertEquals(TABLE_UUID, event.detail.uuid); + assertEquals(newTableName, event.detail.name); + }); + + test('delete option emits event with UUID', async () => { + const deletePromise = eventToPromise('delete-table', document); + + const deleteButton = menu.querySelector<HTMLButtonElement>('#delete'); + assertTrue(!!deleteButton); + deleteButton!.click(); + + const event = await deletePromise; + assertEquals(TABLE_UUID, event.detail.uuid); + }); + }); });
diff --git a/chrome/test/data/webui/commerce/product_specifications/header_test.ts b/chrome/test/data/webui/commerce/product_specifications/header_test.ts index efbba0bc..1bfdd1ee 100644 --- a/chrome/test/data/webui/commerce/product_specifications/header_test.ts +++ b/chrome/test/data/webui/commerce/product_specifications/header_test.ts
@@ -7,8 +7,7 @@ import type {HeaderElement} from 'chrome://compare/header.js'; import type {CrInputElement} from 'chrome://resources/cr_elements/cr_input/cr_input.js'; import {assertEquals, assertFalse, assertNotEquals, assertTrue} from 'chrome://webui-test/chai_assert.js'; -import {flushTasks, waitAfterNextRender} from 'chrome://webui-test/polymer_test_util.js'; -import {$$, eventToPromise, hasStyle, isVisible} from 'chrome://webui-test/test_util.js'; +import {$$, eventToPromise, hasStyle, isVisible, microtasksFinished} from 'chrome://webui-test/test_util.js'; suite('HeaderTest', () => { let header: HeaderElement; @@ -17,7 +16,7 @@ document.body.innerHTML = window.trustedTypes!.emptyHTML; header = document.createElement('product-specifications-header'); document.body.appendChild(header); - await flushTasks(); + await microtasksFinished(); }); test('menu shown on click', async () => { @@ -26,7 +25,7 @@ assertEquals(menu.getIfExists(), null); header.$.menuButton.click(); - await flushTasks(); + await microtasksFinished(); assertNotEquals(menu.getIfExists(), null); }); @@ -37,7 +36,7 @@ menuButton.computedStyleMap().get('background-color'); assertTrue(!!baseBackgroundColor); menuButton.click(); - await flushTasks(); + await microtasksFinished(); const menuShownBackgroundColor = menuButton.computedStyleMap().get('background-color'); @@ -58,14 +57,14 @@ test('menu rename shows input', async () => { header.$.menuButton.click(); - await flushTasks(); + await microtasksFinished(); assertFalse(!!header.shadowRoot!.querySelector('#input')); const menu = header.$.menu.$.menu; const renameMenuItem = menu.get().querySelector<HTMLElement>('#rename'); assertTrue(!!renameMenuItem); renameMenuItem.click(); - await waitAfterNextRender(header); + await microtasksFinished(); assertTrue(!!header.shadowRoot!.querySelector('#input')); assertFalse(menu.get().open); @@ -73,7 +72,7 @@ test('input hides and changes name on enter', async () => { header.$.menu.dispatchEvent(new CustomEvent('rename-click')); - await waitAfterNextRender(header); + await microtasksFinished(); const input = header.shadowRoot!.querySelector<CrInputElement>('#input'); assertTrue(!!input); @@ -81,7 +80,7 @@ const newName = 'new name'; input.value = newName; input.dispatchEvent(new KeyboardEvent('keydown', {key: 'Enter'})); - await waitAfterNextRender(input); + await microtasksFinished(); assertFalse(isVisible(input)); assertEquals(newName, header.subtitle); @@ -95,7 +94,7 @@ assertTrue(hasStyle(header.$.menuButton, 'display', 'none')); header.subtitle = 'foo'; - await waitAfterNextRender(header); + await microtasksFinished(); assertEquals('foo', subtitle!.textContent!.trim()); assertFalse(hasStyle(subtitle, 'display', 'none')); @@ -107,7 +106,7 @@ const subtitle = $$(header, '#subtitle'); assertTrue(!!subtitle); subtitle.dispatchEvent(new KeyboardEvent('keydown', {key: 'Enter'})); - await waitAfterNextRender(header); + await microtasksFinished(); const input = header.shadowRoot!.querySelector<CrInputElement>('#input'); assertTrue(!!input); @@ -119,44 +118,43 @@ header.subtitle = subtitle; header.$.menu.dispatchEvent(new CustomEvent('rename-click')); - await waitAfterNextRender(header); + await microtasksFinished(); - const input = header.shadowRoot!.querySelector<CrInputElement>('#input'); + let input = header.shadowRoot!.querySelector<CrInputElement>('#input'); assertTrue(!!input); input.value = ''; input.dispatchEvent(new KeyboardEvent('keydown', {key: 'Enter'})); - await waitAfterNextRender(header); + await microtasksFinished(); - // Ensure the cursor is at the end of the input. - assertTrue(input.$.input.selectionStart === input.value.length); - assertTrue(input.$.input.selectionEnd === input.value.length); + // After finishing input, the element should be removed from the DOM. + input = header.shadowRoot!.querySelector<CrInputElement>('#input'); + assertFalse(!!input); assertEquals(subtitle, header.subtitle); - assertEquals(subtitle, input.value); }); test('cursor moves back to the end of the input on blur', async () => { header.subtitle = 'foo bar baz'; header.$.menu.dispatchEvent(new CustomEvent('rename-click')); - await waitAfterNextRender(header); + await microtasksFinished(); // Select a middle section of the input text. - const input = header.shadowRoot!.querySelector<CrInputElement>('#input'); + let input = header.shadowRoot!.querySelector<CrInputElement>('#input'); assertTrue(!!input); input.select(5, 9); input.dispatchEvent(new KeyboardEvent('keydown', {key: 'Enter'})); - await waitAfterNextRender(header); + await microtasksFinished(); - // Ensure the cursor is at the end of the input. - assertTrue(input.$.input.selectionStart === input.value.length); - assertTrue(input.$.input.selectionEnd === input.value.length); + // After finishing input, the element should be removed from the DOM. + input = header.shadowRoot!.querySelector<CrInputElement>('#input'); + assertFalse(!!input); }); test('`name-change` event is fired on input blur', async () => { const subtitle = $$(header, '#subtitle'); assertTrue(!!subtitle); subtitle.dispatchEvent(new KeyboardEvent('keydown', {key: 'Enter'})); - await waitAfterNextRender(header); + await microtasksFinished(); const input = header.shadowRoot!.querySelector<CrInputElement>('#input'); assertTrue(!!input);
diff --git a/chrome/test/data/webui/lens/overlay/searchbox_test.ts b/chrome/test/data/webui/lens/overlay/searchbox_test.ts index 10f770c..d4d42e29 100644 --- a/chrome/test/data/webui/lens/overlay/searchbox_test.ts +++ b/chrome/test/data/webui/lens/overlay/searchbox_test.ts
@@ -6,10 +6,10 @@ import {BrowserProxyImpl} from 'chrome-untrusted://lens-overlay/browser_proxy.js'; import type {LensOverlayAppElement} from 'chrome-untrusted://lens-overlay/lens_overlay_app.js'; -import {loadTimeData} from 'chrome-untrusted://resources/js/load_time_data.js'; -import {assertFalse, assertTrue} from 'chrome-untrusted://webui-test/chai_assert.js'; import {waitAfterNextRender} from 'chrome-untrusted://webui-test/polymer_test_util.js'; import {isVisible} from 'chrome-untrusted://webui-test/test_util.js'; +import {assertTrue, assertFalse} from 'chrome-untrusted://webui-test/chai_assert.js'; +import {loadTimeData} from 'chrome-untrusted://resources/js/load_time_data.js'; import {TestLensOverlayBrowserProxy} from './test_overlay_browser_proxy.js'; @@ -51,11 +51,8 @@ assertTrue(isVisible(lensOverlayElement.$.searchbox)); lensOverlayElement.$.searchbox.$.input.value = 'hello'; - // Simulate searchbox being focused and the autocomplete request being - // started. + // Simulate searchbox being focused lensOverlayElement.setSearchboxFocusForTesting(true); - document.dispatchEvent(new CustomEvent('query-autocomplete')); - await waitAfterNextRender(lensOverlayElement); assertTrue(isVisible(lensOverlayElement.$.searchboxGhostLoader)); // Simulate escape being pressed from the searchbox with empty input.
diff --git a/chrome/updater/app/server/win/com_classes_legacy.cc b/chrome/updater/app/server/win/com_classes_legacy.cc index 733a27b..1e808ddd5 100644 --- a/chrome/updater/app/server/win/com_classes_legacy.cc +++ b/chrome/updater/app/server/win/com_classes_legacy.cc
@@ -25,6 +25,7 @@ #include "base/strings/string_number_conversions.h" #include "base/strings/string_util.h" #include "base/strings/stringprintf.h" +#include "base/strings/to_string.h" #include "base/strings/utf_string_conversions.h" #include "base/synchronization/waitable_event.h" #include "base/task/sequenced_task_runner.h" @@ -91,7 +92,7 @@ } std::string GetStringFromValue(bool value) { - return value ? "true" : "false"; + return base::ToString(value); } std::string GetStringFromValue(const updater::UpdatesSuppressedTimes& value) {
diff --git a/chrome/updater/configurator.cc b/chrome/updater/configurator.cc index b64fd202f..8d603ae 100644 --- a/chrome/updater/configurator.cc +++ b/chrome/updater/configurator.cc
@@ -17,6 +17,7 @@ #include "base/memory/scoped_refptr.h" #include "base/rand_util.h" #include "base/sequence_checker.h" +#include "base/strings/to_string.h" #include "base/time/time.h" #include "base/version.h" #include "build/build_config.h" @@ -79,7 +80,7 @@ GetNetworkFetcherFactory(); #endif static crash_reporter::CrashKeyString<6> crash_key_managed("managed"); - crash_key_managed.Set(is_managed_device_ ? "true" : "false"); + crash_key_managed.Set(base::ToString(is_managed_device_)); } Configurator::~Configurator() = default;
diff --git a/chrome/updater/policy/service.cc b/chrome/updater/policy/service.cc index 47b40fb..0e0fd00b 100644 --- a/chrome/updater/policy/service.cc +++ b/chrome/updater/policy/service.cc
@@ -24,6 +24,7 @@ #include "base/sequence_checker.h" #include "base/strings/string_util.h" #include "base/strings/stringprintf.h" +#include "base/strings/to_string.h" #include "base/task/task_traits.h" #include "base/task/thread_pool.h" #include "base/time/time.h" @@ -175,7 +176,7 @@ bool is_cbcm_managed) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); static crash_reporter::CrashKeyString<6> crash_key_cbcm("cbcm"); - crash_key_cbcm.Set(is_cbcm_managed ? "true" : "false"); + crash_key_cbcm.Set(base::ToString(is_cbcm_managed)); if (fetch_policies_callback_) { // Combine with existing call.
diff --git a/chrome/updater/test/integration_test_commands_system.cc b/chrome/updater/test/integration_test_commands_system.cc index 15e992f..263b1d9 100644 --- a/chrome/updater/test/integration_test_commands_system.cc +++ b/chrome/updater/test/integration_test_commands_system.cc
@@ -16,6 +16,7 @@ #include "base/memory/scoped_refptr.h" #include "base/path_service.h" #include "base/strings/string_number_conversions.h" +#include "base/strings/to_string.h" #include "base/test/test_switches.h" #include "base/time/time.h" #include "base/values.h" @@ -48,7 +49,7 @@ } std::string BoolToString(const bool value) { - return value ? "true" : "false"; + return base::ToString(value); } std::string RegistrationRequestToString(
diff --git a/chromeos/ash/components/boca/boca_session_manager_unittest.cc b/chromeos/ash/components/boca/boca_session_manager_unittest.cc index 87cc55f..39ce0ad 100644 --- a/chromeos/ash/components/boca/boca_session_manager_unittest.cc +++ b/chromeos/ash/components/boca/boca_session_manager_unittest.cc
@@ -20,6 +20,7 @@ #include "chromeos/ash/components/boca/session_api/get_session_request.h" #include "chromeos/ash/components/boca/session_api/update_student_activities_request.h" #include "chromeos/ash/services/network_config/public/cpp/cros_network_config_test_helper.h" +#include "components/prefs/testing_pref_service.h" #include "components/signin/public/identity_manager/identity_manager.h" #include "components/signin/public/identity_manager/identity_test_environment.h" #include "components/user_manager/fake_user_manager.h" @@ -114,12 +115,16 @@ BocaSessionManagerTestBase() = default; void SetUp() override { // Sign in test user. + user_manager::UserManagerImpl::RegisterPrefs(local_state_.registry()); + fake_user_manager_.Reset( + std::make_unique<user_manager::FakeUserManager>(&local_state_)); + auto account_id = AccountId::FromUserEmailGaiaId(kTestUserEmail, GaiaId(kTestGaiaId)); const std::string username_hash = user_manager::FakeUserManager::GetFakeUsernameHash(account_id); - fake_user_manager_.Reset(std::make_unique<user_manager::FakeUserManager>()); - fake_user_manager_->AddUser(account_id); + fake_user_manager_->AddGaiaUser(account_id, + user_manager::UserType::kRegular); fake_user_manager_->UserLoggedIn(account_id, username_hash, /*browser_restart=*/false, /*is_child=*/false); @@ -181,6 +186,7 @@ base::test::ScopedFeatureList& scoped_feature_list() { return scoped_feature_list_; } + PrefService& local_state() { return local_state_; } private: content::BrowserTaskEnvironment task_environment_{ @@ -194,6 +200,7 @@ // Owned by BocaSessionManager, destructed before it. std::unique_ptr<StrictMock<MockSessionClientImpl>> session_client_impl_; std::unique_ptr<StrictMock<MockObserver>> observer_; + TestingPrefServiceSimple local_state_; user_manager::TypedScopedUserManager<user_manager::FakeUserManager> fake_user_manager_; CoreAccountId core_account_id_; @@ -761,8 +768,10 @@ auto account_id = AccountId::FromUserEmailGaiaId("another", GaiaId("user")); const std::string username_hash = user_manager::FakeUserManager::GetFakeUsernameHash(account_id); - fake_user_manager().Reset(std::make_unique<user_manager::FakeUserManager>()); - fake_user_manager()->AddUser(account_id); + fake_user_manager().Reset( + std::make_unique<user_manager::FakeUserManager>(&local_state())); + fake_user_manager()->AddGaiaUser(account_id, + user_manager::UserType::kRegular); fake_user_manager()->UserLoggedIn(account_id, username_hash, /*browser_restart=*/false, /*is_child=*/false); @@ -1091,20 +1100,22 @@ TEST_F(BocaSessionManagerTest, SwitchBetweenAccountShouldTriggerSessionReload) { // Add a second user. - auto account_id = AccountId::FromUserEmail("differentemail"); + auto account_id = AccountId::FromUserEmailGaiaId("different@email", + GaiaId("differentgaia")); const std::string username_hash = user_manager::FakeUserManager::GetFakeUsernameHash(account_id); // When login new user with existing active user, it would trigger an user // switch event for the existing user. EXPECT_CALL(*session_client_impl(), GetSession(_)).Times(1); - fake_user_manager()->AddUser(account_id); + fake_user_manager()->AddGaiaUser(account_id, + user_manager::UserType::kRegular); fake_user_manager()->UserLoggedIn(account_id, username_hash, /*browser_restart=*/false, /*is_child=*/false); // Account_id mismatch, should not load. EXPECT_CALL(*session_client_impl(), GetSession(_)).Times(0); fake_user_manager()->SwitchActiveUser( - AccountId::FromUserEmail("differentemail")); + AccountId::FromUserEmail("different@email")); // Switch back to active user, load again. EXPECT_CALL(*session_client_impl(), GetSession(_)).Times(1);
diff --git a/chromeos/ash/components/browser_context_helper/BUILD.gn b/chromeos/ash/components/browser_context_helper/BUILD.gn index c391e2e1..f59e2f2f 100644 --- a/chromeos/ash/components/browser_context_helper/BUILD.gn +++ b/chromeos/ash/components/browser_context_helper/BUILD.gn
@@ -51,6 +51,7 @@ "//ash/constants", "//base/test:test_support", "//components/account_id", + "//components/prefs:test_support", "//components/user_manager", "//components/user_manager:test_support", "//content/test:test_support",
diff --git a/chromeos/ash/components/browser_context_helper/browser_context_helper_unittest.cc b/chromeos/ash/components/browser_context_helper/browser_context_helper_unittest.cc index 899c705..b25affb 100644 --- a/chromeos/ash/components/browser_context_helper/browser_context_helper_unittest.cc +++ b/chromeos/ash/components/browser_context_helper/browser_context_helper_unittest.cc
@@ -14,11 +14,13 @@ #include "chromeos/ash/components/browser_context_helper/browser_context_types.h" #include "chromeos/ash/components/browser_context_helper/fake_browser_context_helper_delegate.h" #include "components/account_id/account_id.h" +#include "components/prefs/testing_pref_service.h" #include "components/user_manager/fake_user_manager.h" #include "components/user_manager/scoped_user_manager.h" #include "components/user_manager/user_manager.h" #include "content/public/test/browser_task_environment.h" #include "content/public/test/test_browser_context.h" +#include "google_apis/gaia/gaia_id.h" #include "testing/gtest/include/gtest/gtest.h" namespace ash { @@ -89,16 +91,18 @@ BrowserContextHelper helper(std::move(delegate)); // Set up UserManager. - user_manager::ScopedUserManager scoped_user_manager( - std::make_unique<user_manager::FakeUserManager>()); - auto* fake_user_manager = static_cast<user_manager::FakeUserManager*>( - user_manager::UserManager::Get()); + TestingPrefServiceSimple local_state; + user_manager::UserManagerImpl::RegisterPrefs(local_state.registry()); + user_manager::TypedScopedUserManager<user_manager::FakeUserManager> + fake_user_manager( + std::make_unique<user_manager::FakeUserManager>(&local_state)); // Set up a User and its BrowserContext instance. - const AccountId account_id = AccountId::FromUserEmail("test@test"); + const AccountId account_id = + AccountId::FromUserEmailGaiaId("test@test", GaiaId("fakegaia")); const std::string username_hash = user_manager::FakeUserManager::GetFakeUsernameHash(account_id); - fake_user_manager->AddUser(account_id); + fake_user_manager->AddGaiaUser(account_id, user_manager::UserType::kRegular); fake_user_manager->UserLoggedIn(account_id, username_hash, /*browser_restart=*/false, /*is_child=*/false); @@ -127,16 +131,19 @@ BrowserContextHelper helper(std::move(delegate)); // Set up UserManager. - user_manager::ScopedUserManager scoped_user_manager( - std::make_unique<user_manager::FakeUserManager>()); - auto* fake_user_manager = static_cast<user_manager::FakeUserManager*>( - user_manager::UserManager::Get()); + TestingPrefServiceSimple local_state; + user_manager::UserManagerImpl::RegisterPrefs(local_state.registry()); + user_manager::TypedScopedUserManager<user_manager::FakeUserManager> + fake_user_manager( + std::make_unique<user_manager::FakeUserManager>(&local_state)); // Set up a User and its BrowserContext instance. - const AccountId account_id = AccountId::FromUserEmail("test@test"); + const AccountId account_id = + AccountId::FromUserEmailGaiaId("test@test", GaiaId("fakegaia")); const std::string username_hash = user_manager::FakeUserManager::GetFakeUsernameHash(account_id); - const user_manager::User* user = fake_user_manager->AddUser(account_id); + const user_manager::User* user = fake_user_manager->AddGaiaUser( + account_id, user_manager::UserType::kRegular); fake_user_manager->UserLoggedIn(account_id, username_hash, /*browser_restart=*/false, /*is_child=*/false); @@ -166,10 +173,11 @@ BrowserContextHelper helper(std::move(delegate)); // Set up UserManager. - user_manager::ScopedUserManager scoped_user_manager( - std::make_unique<user_manager::FakeUserManager>()); - auto* fake_user_manager = static_cast<user_manager::FakeUserManager*>( - user_manager::UserManager::Get()); + TestingPrefServiceSimple local_state; + user_manager::UserManagerImpl::RegisterPrefs(local_state.registry()); + user_manager::TypedScopedUserManager<user_manager::FakeUserManager> + fake_user_manager( + std::make_unique<user_manager::FakeUserManager>(&local_state)); // Set up a User and its BrowserContext instance. const user_manager::User* user = fake_user_manager->AddGuestUser(); @@ -204,15 +212,18 @@ BrowserContextHelper helper(std::move(delegate)); // Set up UserManager. - user_manager::ScopedUserManager scoped_user_manager( - std::make_unique<user_manager::FakeUserManager>()); - auto* fake_user_manager = static_cast<user_manager::FakeUserManager*>( - user_manager::UserManager::Get()); + TestingPrefServiceSimple local_state; + user_manager::UserManagerImpl::RegisterPrefs(local_state.registry()); + user_manager::TypedScopedUserManager<user_manager::FakeUserManager> + fake_user_manager( + std::make_unique<user_manager::FakeUserManager>(&local_state)); - const AccountId account_id = AccountId::FromUserEmail("test@test"); + const AccountId account_id = + AccountId::FromUserEmailGaiaId("test@test", GaiaId("fakegaia")); const std::string username_hash = user_manager::FakeUserManager::GetFakeUsernameHash(account_id); - const user_manager::User* user = fake_user_manager->AddUser(account_id); + const user_manager::User* user = fake_user_manager->AddGaiaUser( + account_id, user_manager::UserType::kRegular); fake_user_manager->UserLoggedIn(account_id, username_hash, /*browser_restart=*/false, /*is_child=*/false);
diff --git a/chromeos/ash/components/file_manager/BUILD.gn b/chromeos/ash/components/file_manager/BUILD.gn index ded0851..bc6418c7 100644 --- a/chromeos/ash/components/file_manager/BUILD.gn +++ b/chromeos/ash/components/file_manager/BUILD.gn
@@ -74,6 +74,7 @@ "//chromeos/ash/components/browser_context_helper", "//chromeos/ash/components/browser_context_helper:test_support", "//components/account_id", + "//components/prefs:test_support", "//components/user_manager", "//components/user_manager:test_support", "//sql",
diff --git a/chromeos/ash/components/file_manager/indexing/file_index_service_registry_unittest.cc b/chromeos/ash/components/file_manager/indexing/file_index_service_registry_unittest.cc index 752e9bb..94437fd 100644 --- a/chromeos/ash/components/file_manager/indexing/file_index_service_registry_unittest.cc +++ b/chromeos/ash/components/file_manager/indexing/file_index_service_registry_unittest.cc
@@ -13,25 +13,32 @@ #include "chromeos/ash/components/browser_context_helper/browser_context_helper.h" #include "chromeos/ash/components/browser_context_helper/fake_browser_context_helper_delegate.h" #include "components/account_id/account_id.h" +#include "components/prefs/testing_pref_service.h" #include "components/user_manager/fake_user_manager.h" #include "components/user_manager/scoped_user_manager.h" +#include "google_apis/gaia/gaia_id.h" #include "testing/gtest/include/gtest/gtest.h" namespace { constexpr char kTestAccount[] = "primary-test@gmail.com"; +constexpr char kFakeGaia[] = "fakegaia"; constexpr char kTestAccount2[] = "secondary-test@gmail.com"; +constexpr char kFakeGaia2[] = "fakegaia2"; } // namespace namespace ash::file_manager { class FileIndexServiceRegistryTest : public testing::Test { public: void SetUp() override { + user_manager::UserManagerImpl::RegisterPrefs(local_state_.registry()); browser_context_helper_ = std::make_unique<ash::BrowserContextHelper>( std::make_unique<ash::FakeBrowserContextHelperDelegate>()); - fake_user_manager_.Reset(std::make_unique<user_manager::FakeUserManager>()); + fake_user_manager_.Reset( + std::make_unique<user_manager::FakeUserManager>(&local_state_)); registry_ = std::make_unique<FileIndexServiceRegistry>(fake_user_manager_->Get()); - primary_account_id_ = AccountId::FromUserEmail(kTestAccount); + primary_account_id_ = + AccountId::FromUserEmailGaiaId(kTestAccount, GaiaId(kFakeGaia)); fake_user_manager()->AddUser(primary_account_id_); } @@ -43,6 +50,11 @@ } void LoginUser(const AccountId& account_id) { + fake_user_manager()->UserLoggedIn( + account_id, + user_manager::FakeUserManager::GetFakeUsernameHash(account_id), + /*browser_restart=*/false, + /*is_child=*/false); fake_user_manager()->OnUserProfileCreated(account_id, nullptr); } @@ -59,6 +71,7 @@ AccountId primary_account_id_; std::unique_ptr<FileIndexServiceRegistry> registry_; + TestingPrefServiceSimple local_state_; std::unique_ptr<ash::BrowserContextHelper> browser_context_helper_; user_manager::TypedScopedUserManager<user_manager::FakeUserManager> fake_user_manager_; @@ -89,8 +102,10 @@ auto* primary_index = registry->GetFileIndexService(primary_account_id()); EXPECT_NE(primary_index, nullptr); - auto secondary_account_id = AccountId::FromUserEmail(kTestAccount2); - fake_user_manager()->AddUser(secondary_account_id); + auto secondary_account_id = + AccountId::FromUserEmailGaiaId(kTestAccount2, GaiaId(kFakeGaia2)); + fake_user_manager()->AddGaiaUser(secondary_account_id, + user_manager::UserType::kRegular); EXPECT_EQ(registry->GetFileIndexService(secondary_account_id), nullptr); LoginUser(secondary_account_id); auto* secondary_index = registry->GetFileIndexService(secondary_account_id);
diff --git a/chromeos/ash/components/login/login_state/BUILD.gn b/chromeos/ash/components/login/login_state/BUILD.gn index 60d777a..bda1991f 100644 --- a/chromeos/ash/components/login/login_state/BUILD.gn +++ b/chromeos/ash/components/login/login_state/BUILD.gn
@@ -41,6 +41,7 @@ ":login_state", "//ash/constants", "//base", + "//components/prefs:test_support", "//components/user_manager:test_support", "//testing/gtest", ]
diff --git a/chromeos/ash/components/login/login_state/login_state_unittest.cc b/chromeos/ash/components/login/login_state/login_state_unittest.cc index 9485b57e..2ea9c4b 100644 --- a/chromeos/ash/components/login/login_state/login_state_unittest.cc +++ b/chromeos/ash/components/login/login_state/login_state_unittest.cc
@@ -7,9 +7,11 @@ #include "base/command_line.h" #include "base/compiler_specific.h" #include "components/account_id/account_id.h" +#include "components/prefs/testing_pref_service.h" #include "components/user_manager/fake_user_manager.h" #include "components/user_manager/scoped_user_manager.h" #include "components/user_manager/user_manager.h" +#include "google_apis/gaia/gaia_id.h" #include "testing/gtest/include/gtest/gtest.h" namespace ash { @@ -128,11 +130,16 @@ } TEST_F(LoginStateTest, TestPrimaryUser) { - const AccountId account_id = AccountId::FromUserEmail("test@test"); + TestingPrefServiceSimple local_state; + user_manager::UserManagerImpl::RegisterPrefs(local_state.registry()); + auto fake_user_manager = + std::make_unique<user_manager::FakeUserManager>(&local_state); + + const AccountId account_id = + AccountId::FromUserEmailGaiaId("test@test", GaiaId("fakegaia")); std::string username_hash = user_manager::FakeUserManager::GetFakeUsernameHash(account_id); - auto fake_user_manager = std::make_unique<user_manager::FakeUserManager>(); - fake_user_manager->AddUser(account_id); + fake_user_manager->AddGaiaUser(account_id, user_manager::UserType::kRegular); fake_user_manager->UserLoggedIn(account_id, username_hash, /*browser_restart=*/false, /*is_child=*/false);
diff --git a/chromeos/ash/components/network/DEPS b/chromeos/ash/components/network/DEPS index adc84c3..84ff4fb 100644 --- a/chromeos/ash/components/network/DEPS +++ b/chromeos/ash/components/network/DEPS
@@ -73,6 +73,7 @@ "+components/sync_preferences/testing_pref_service_syncable.h", "+content/public/browser", "+content/public/test", + "+google_apis/gaia", ], "managed_network_configuration_handler_impl.cc": [ "+ash/components/arc/arc_prefs.h"
diff --git a/chromeos/ash/components/network/network_metadata_store_unittest.cc b/chromeos/ash/components/network/network_metadata_store_unittest.cc index e1c3ff0a..bf0dc408 100644 --- a/chromeos/ash/components/network/network_metadata_store_unittest.cc +++ b/chromeos/ash/components/network/network_metadata_store_unittest.cc
@@ -36,6 +36,7 @@ #include "components/sync_preferences/testing_pref_service_syncable.h" #include "components/user_manager/fake_user_manager.h" #include "components/user_manager/scoped_user_manager.h" +#include "google_apis/gaia/gaia_id.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/cros_system_api/dbus/service_constants.h" #include "third_party/cros_system_api/dbus/shill/dbus-constants.h" @@ -150,13 +151,17 @@ NetworkMetadataStore::RegisterPrefs(user_prefs_->registry()); NetworkMetadataStore::RegisterPrefs(device_prefs_->registry()); - auto fake_user_manager = std::make_unique<user_manager::FakeUserManager>(); - auto account_id = AccountId::FromUserEmail("account@test.com"); - auto second_account_id = AccountId::FromUserEmail("account2@test.com"); - primary_user_ = fake_user_manager->AddUser(account_id); - secondary_user_ = fake_user_manager->AddUser(second_account_id); - scoped_user_manager_ = std::make_unique<user_manager::ScopedUserManager>( - std::move(fake_user_manager)); + user_manager::UserManagerImpl::RegisterPrefs(local_state_.registry()); + fake_user_manager_.Reset( + std::make_unique<user_manager::FakeUserManager>(&local_state_)); + auto account_id = + AccountId::FromUserEmailGaiaId("account@test.com", GaiaId("fakegaia")); + primary_user_ = fake_user_manager_->AddGaiaUser( + account_id, user_manager::UserType::kRegular); + auto second_account_id = AccountId::FromUserEmailGaiaId( + "account2@test.com", GaiaId("fakegaia2")); + secondary_user_ = fake_user_manager_->AddGaiaUser( + second_account_id, user_manager::UserType::kRegular); metadata_store_ = std::make_unique<NetworkMetadataStore>( network_configuration_handler_.get(), network_connection_handler_.get(), @@ -180,7 +185,7 @@ network_profile_handler_.reset(); network_device_handler_.reset(); network_connection_handler_.reset(); - scoped_user_manager_.reset(); + fake_user_manager_.Reset(); network_configuration_handler_.reset(); NetworkHandler::Shutdown(); LoginState::Shutdown(); @@ -201,15 +206,13 @@ } void LoginUser(const user_manager::User* user) { - UserManager()->UserLoggedIn(user->GetAccountId(), user->username_hash(), - true /* browser_restart */, - false /* is_child */); - UserManager()->SwitchActiveUser(user->GetAccountId()); - } - - user_manager::FakeUserManager* UserManager() { - return static_cast<user_manager::FakeUserManager*>( - user_manager::UserManager::Get()); + fake_user_manager_->UserLoggedIn( + user->GetAccountId(), + user_manager::FakeUserManager::GetFakeUsernameHash( + user->GetAccountId()), + /*browser_restart=*/true, + /*is_child=*/false); + fake_user_manager_->SwitchActiveUser(user->GetAccountId()); } std::string ConfigureService(const std::string& shill_json_string) { @@ -234,6 +237,9 @@ NetworkStateHandler* network_state_handler() { return network_state_handler_; } + user_manager::FakeUserManager* fake_user_manager() { + return fake_user_manager_.Get(); + } base::test::SingleThreadTaskEnvironment* task_environment() { return &task_environment_; @@ -308,6 +314,7 @@ base::test::SingleThreadTaskEnvironment task_environment_{ base::test::TaskEnvironment::TimeSource::MOCK_TIME}; NetworkStateTestHelper helper_{/*use_default_devices_and_services=*/false}; + TestingPrefServiceSimple local_state_; std::unique_ptr<NetworkConfigurationHandler> network_configuration_handler_; std::unique_ptr<NetworkConnectionHandler> network_connection_handler_; raw_ptr<NetworkStateHandler> network_state_handler_; @@ -319,7 +326,8 @@ std::unique_ptr<sync_preferences::TestingPrefServiceSyncable> user_prefs_; std::unique_ptr<NetworkMetadataStore> metadata_store_; std::unique_ptr<TestNetworkMetadataObserver> metadata_observer_; - std::unique_ptr<user_manager::ScopedUserManager> scoped_user_manager_; + user_manager::TypedScopedUserManager<user_manager::FakeUserManager> + fake_user_manager_; }; TEST_F(NetworkMetadataStoreTest, FirstConnect) { @@ -504,58 +512,58 @@ } TEST_F(NetworkMetadataStoreTest, OwnOobeNetworks) { - UserManager()->LogoutAllUsers(); + fake_user_manager()->LogoutAllUsers(); ConfigureService(kConfigWifi1Shared); base::RunLoop().RunUntilIdle(); LoginUser(primary_user_); ASSERT_FALSE(metadata_store()->GetIsCreatedByUser(kGuid)); - UserManager()->SetIsCurrentUserNew(true); - UserManager()->SetOwnerId(primary_user_->GetAccountId()); + fake_user_manager()->SetIsCurrentUserNew(true); + fake_user_manager()->SetOwnerId(primary_user_->GetAccountId()); metadata_store()->LoggedInStateChanged(); ASSERT_TRUE(metadata_store()->GetIsCreatedByUser(kGuid)); } TEST_F(NetworkMetadataStoreTest, OwnOobeNetworks_EnterpriseEnrolled) { SetIsEnterpriseEnrolled(true); - UserManager()->LogoutAllUsers(); + fake_user_manager()->LogoutAllUsers(); ConfigureService(kConfigWifi1Shared); base::RunLoop().RunUntilIdle(); LoginUser(primary_user_); ASSERT_FALSE(metadata_store()->GetIsCreatedByUser(kGuid)); - UserManager()->SetIsCurrentUserNew(true); - UserManager()->SetOwnerId(primary_user_->GetAccountId()); + fake_user_manager()->SetIsCurrentUserNew(true); + fake_user_manager()->SetOwnerId(primary_user_->GetAccountId()); metadata_store()->LoggedInStateChanged(); ASSERT_FALSE(metadata_store()->GetIsCreatedByUser(kGuid)); } TEST_F(NetworkMetadataStoreTest, OwnOobeNetworks_NotOwner) { - UserManager()->LogoutAllUsers(); + fake_user_manager()->LogoutAllUsers(); ConfigureService(kConfigWifi1Shared); base::RunLoop().RunUntilIdle(); LoginUser(primary_user_); ASSERT_FALSE(metadata_store()->GetIsCreatedByUser(kGuid)); - UserManager()->SetIsCurrentUserNew(true); - UserManager()->ResetOwnerId(); + fake_user_manager()->SetIsCurrentUserNew(true); + fake_user_manager()->ResetOwnerId(); metadata_store()->LoggedInStateChanged(); ASSERT_FALSE(metadata_store()->GetIsCreatedByUser(kGuid)); } TEST_F(NetworkMetadataStoreTest, OwnOobeNetworks_NotFirstLogin) { - UserManager()->LogoutAllUsers(); + fake_user_manager()->LogoutAllUsers(); ConfigureService(kConfigWifi1Shared); base::RunLoop().RunUntilIdle(); LoginUser(primary_user_); ASSERT_FALSE(metadata_store()->GetIsCreatedByUser(kGuid)); - UserManager()->SetIsCurrentUserNew(false); - UserManager()->SetOwnerId(primary_user_->GetAccountId()); + fake_user_manager()->SetIsCurrentUserNew(false); + fake_user_manager()->SetOwnerId(primary_user_->GetAccountId()); metadata_store()->LoggedInStateChanged(); ASSERT_FALSE(metadata_store()->GetIsCreatedByUser(kGuid)); }
diff --git a/chromeos/ash/components/network/onc/BUILD.gn b/chromeos/ash/components/network/onc/BUILD.gn index a84e38b..80f89ae 100644 --- a/chromeos/ash/components/network/onc/BUILD.gn +++ b/chromeos/ash/components/network/onc/BUILD.gn
@@ -65,6 +65,7 @@ "//chromeos/components/onc", "//chromeos/components/onc:test_support", "//components/onc", + "//components/prefs:test_support", "//components/user_manager:test_support", "//crypto:test_support", "//net:test_support",
diff --git a/chromeos/ash/components/network/onc/network_onc_utils_unittest.cc b/chromeos/ash/components/network/onc/network_onc_utils_unittest.cc index ed24f9a4..c7d10f63 100644 --- a/chromeos/ash/components/network/onc/network_onc_utils_unittest.cc +++ b/chromeos/ash/components/network/onc/network_onc_utils_unittest.cc
@@ -22,8 +22,10 @@ #include "chromeos/components/onc/onc_test_utils.h" #include "chromeos/components/onc/variable_expander.h" #include "chromeos/test/chromeos_test_utils.h" +#include "components/prefs/testing_pref_service.h" #include "components/user_manager/fake_user_manager.h" #include "components/user_manager/scoped_user_manager.h" +#include "google_apis/gaia/gaia_id.h" #include "testing/gtest/include/gtest/gtest.h" namespace ash::onc { @@ -38,12 +40,18 @@ ~ONCUtilsTest() override = default; void SetUp() override { - auto fake_user_manager = std::make_unique<user_manager::FakeUserManager>(); - auto account_id = AccountId::FromUserEmail("account@test.com"); - const user_manager::User* user = fake_user_manager->AddUser(account_id); - fake_user_manager->UserLoggedIn(account_id, user->username_hash(), - /*browser_restart=*/false, - /*is_child=*/false); + user_manager::UserManagerImpl::RegisterPrefs(local_state_.registry()); + auto fake_user_manager = + std::make_unique<user_manager::FakeUserManager>(&local_state_); + auto account_id = + AccountId::FromUserEmailGaiaId("account@test.com", GaiaId("fakegaia")); + const user_manager::User* user = fake_user_manager->AddGaiaUser( + account_id, user_manager::UserType::kRegular); + fake_user_manager->UserLoggedIn( + account_id, + user_manager::FakeUserManager::GetFakeUsernameHash(account_id), + /*browser_restart=*/false, + /*is_child=*/false); fake_user_manager->SwitchActiveUser(account_id); scoped_user_manager_ = std::make_unique<user_manager::ScopedUserManager>( @@ -64,6 +72,7 @@ protected: base::test::SingleThreadTaskEnvironment task_environment_; + TestingPrefServiceSimple local_state_; std::unique_ptr<user_manager::ScopedUserManager> scoped_user_manager_; std::unique_ptr<ash::NetworkHandlerTestHelper> network_handler_test_helper_; };
diff --git a/chromeos/ash/components/osauth/impl/engines/cryptohome_fingerprint_engine_unittest.cc b/chromeos/ash/components/osauth/impl/engines/cryptohome_fingerprint_engine_unittest.cc index 5eadb5c..99b00e8 100644 --- a/chromeos/ash/components/osauth/impl/engines/cryptohome_fingerprint_engine_unittest.cc +++ b/chromeos/ash/components/osauth/impl/engines/cryptohome_fingerprint_engine_unittest.cc
@@ -20,6 +20,7 @@ #include "components/prefs/pref_registry_simple.h" #include "components/prefs/testing_pref_service.h" #include "components/user_manager/fake_user_manager.h" +#include "google_apis/gaia/gaia_id.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" @@ -86,8 +87,9 @@ } TEST_F(CryptohomeFingerprintEngineTest, StandardSuccessfulAuthenticate) { - AccountId id = AccountId::FromUserEmail("test@example.com"); - user_manager_.AddUser(id); + AccountId id = + AccountId::FromUserEmailGaiaId("test@example.com", GaiaId("fakegaia")); + user_manager_.AddGaiaUser(id, user_manager::UserType::kRegular); // Initialize the engine. TestFuture<AshAuthFactor> init_common; @@ -125,8 +127,9 @@ } TEST_F(CryptohomeFingerprintEngineTest, StandardFailedAuthenticate) { - AccountId id = AccountId::FromUserEmail("test@example.com"); - user_manager_.AddUser(id); + AccountId id = + AccountId::FromUserEmailGaiaId("test@example.com", GaiaId("fakegaia")); + user_manager_.AddGaiaUser(id, user_manager::UserType::kRegular); // Initialize the engine. TestFuture<AshAuthFactor> init_common;
diff --git a/chromeos/ash/components/osauth/impl/engines/cryptohome_pin_engine_unittest.cc b/chromeos/ash/components/osauth/impl/engines/cryptohome_pin_engine_unittest.cc index df4f9e1..7c3d892ad 100644 --- a/chromeos/ash/components/osauth/impl/engines/cryptohome_pin_engine_unittest.cc +++ b/chromeos/ash/components/osauth/impl/engines/cryptohome_pin_engine_unittest.cc
@@ -22,6 +22,7 @@ #include "components/prefs/testing_pref_service.h" #include "components/user_manager/fake_user_manager.h" #include "components/user_manager/known_user.h" +#include "google_apis/gaia/gaia_id.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" @@ -84,8 +85,9 @@ } TEST_F(CryptohomePinEngineTest, StandardSuccessfulAuthenticate) { - AccountId id = AccountId::FromUserEmail("test@example.com"); - user_manager_.AddUser(id); + AccountId id = + AccountId::FromUserEmailGaiaId("test@example.com", GaiaId("fakegaia")); + user_manager_.AddGaiaUser(id, user_manager::UserType::kRegular); user_manager::KnownUser known_user(&prefs_); known_user.SetStringPref(id, prefs::kQuickUnlockPinSalt, "test salt"); @@ -120,8 +122,9 @@ } TEST_F(CryptohomePinEngineTest, StandardFailedAuthenticate) { - AccountId id = AccountId::FromUserEmail("test@example.com"); - user_manager_.AddUser(id); + AccountId id = + AccountId::FromUserEmailGaiaId("test@example.com", GaiaId("fakegaia")); + user_manager_.AddGaiaUser(id, user_manager::UserType::kRegular); user_manager::KnownUser known_user(&prefs_); known_user.SetStringPref(id, prefs::kQuickUnlockPinSalt, "test salt");
diff --git a/chromeos/ash/components/osauth/impl/engines/prefs_pin_engine_unittest.cc b/chromeos/ash/components/osauth/impl/engines/prefs_pin_engine_unittest.cc index 478ce69..bc392a36 100644 --- a/chromeos/ash/components/osauth/impl/engines/prefs_pin_engine_unittest.cc +++ b/chromeos/ash/components/osauth/impl/engines/prefs_pin_engine_unittest.cc
@@ -19,6 +19,7 @@ #include "components/account_id/account_id.h" #include "components/prefs/testing_pref_service.h" #include "components/user_manager/fake_user_manager.h" +#include "google_apis/gaia/gaia_id.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" @@ -84,8 +85,9 @@ } TEST_F(PrefsPinEngineTest, StandardSuccessfulAuthenticate) { - AccountId id = AccountId::FromUserEmail("test@example.com"); - user_manager_.AddUser(id); + AccountId id = + AccountId::FromUserEmailGaiaId("test@example.com", GaiaId("fakegaia")); + user_manager_.AddGaiaUser(id, user_manager::UserType::kRegular); const std::string pin("12345"); AddPinToPrefs(pin); @@ -107,8 +109,9 @@ } TEST_F(PrefsPinEngineTest, StandardFailedAuthenticate) { - AccountId id = AccountId::FromUserEmail("test@example.com"); - user_manager_.AddUser(id); + AccountId id = + AccountId::FromUserEmailGaiaId("test@example.com", GaiaId("fakegaia")); + user_manager_.AddGaiaUser(id, user_manager::UserType::kRegular); const std::string pin("12345"), wrong_pin("23456"); AddPinToPrefs(pin); @@ -131,8 +134,9 @@ } TEST_F(PrefsPinEngineTest, FailuresLeadingToLockout) { - AccountId id = AccountId::FromUserEmail("test@example.com"); - user_manager_.AddUser(id); + AccountId id = + AccountId::FromUserEmailGaiaId("test@example.com", GaiaId("fakegaia")); + user_manager_.AddGaiaUser(id, user_manager::UserType::kRegular); const std::string pin("12345"), wrong_pin("23456"); AddPinToPrefs(pin); @@ -172,8 +176,9 @@ } TEST_F(PrefsPinEngineTest, LockoutClearedAfterAuth) { - AccountId id = AccountId::FromUserEmail("test@example.com"); - user_manager_.AddUser(id); + AccountId id = + AccountId::FromUserEmailGaiaId("test@example.com", GaiaId("fakegaia")); + user_manager_.AddGaiaUser(id, user_manager::UserType::kRegular); const std::string pin("12345"), wrong_pin("23456"); AddPinToPrefs(pin);
diff --git a/chromeos/ash/components/osauth/test_support/engine_test_util.h b/chromeos/ash/components/osauth/test_support/engine_test_util.h index 7a91ae9..d90985b 100644 --- a/chromeos/ash/components/osauth/test_support/engine_test_util.h +++ b/chromeos/ash/components/osauth/test_support/engine_test_util.h
@@ -30,7 +30,7 @@ ash::MockUserDataAuthClient mock_udac_; CryptohomeCoreImpl core_; TestingPrefServiceSimple prefs_; - user_manager::FakeUserManager user_manager_; + user_manager::FakeUserManager user_manager_{&prefs_}; base::test::ScopedFeatureList scoped_feature_list_; ash::ScopedStubInstallAttributes install_attributes{ ash::StubInstallAttributes::CreateConsumerOwned()};
diff --git a/chromeos/ash/components/sync_wifi/BUILD.gn b/chromeos/ash/components/sync_wifi/BUILD.gn index bf481aa..b1fad5f 100644 --- a/chromeos/ash/components/sync_wifi/BUILD.gn +++ b/chromeos/ash/components/sync_wifi/BUILD.gn
@@ -85,6 +85,7 @@ "//chromeos/ash/services/network_config:in_process_instance", "//chromeos/ash/services/network_config/public/cpp:test_support", "//components/onc", + "//components/prefs:test_support", "//components/proxy_config", "//components/sync:test_support", "//components/sync_preferences:test_support",
diff --git a/chromeos/ash/components/sync_wifi/network_test_helper.cc b/chromeos/ash/components/sync_wifi/network_test_helper.cc index 38452dbb..6cb58ea7 100644 --- a/chromeos/ash/components/sync_wifi/network_test_helper.cc +++ b/chromeos/ash/components/sync_wifi/network_test_helper.cc
@@ -20,10 +20,12 @@ #include "chromeos/ash/services/network_config/in_process_instance.h" #include "components/account_id/account_id.h" #include "components/onc/onc_pref_names.h" +#include "components/prefs/testing_pref_service.h" #include "components/proxy_config/pref_proxy_config_tracker_impl.h" #include "components/proxy_config/proxy_config_pref_names.h" #include "components/user_manager/fake_user_manager.h" #include "components/user_manager/scoped_user_manager.h" +#include "google_apis/gaia/gaia_id.h" namespace ash::sync_wifi { @@ -33,8 +35,10 @@ PrefProxyConfigTrackerImpl::RegisterProfilePrefs(user_prefs_.registry()); PrefProxyConfigTrackerImpl::RegisterPrefs(local_state_.registry()); - auto primary_account_id = AccountId::FromUserEmail("primary@test.com"); - auto secondary_account_id = AccountId::FromUserEmail("secondary@test.com"); + auto primary_account_id = + AccountId::FromUserEmailGaiaId("primary@test.com", GaiaId("fakegaia1")); + auto secondary_account_id = + AccountId::FromUserEmailGaiaId("secondary@test.com", GaiaId("fakegaia2")); network_profile_handler_ = NetworkProfileHandler::InitializeForTesting(); network_configuration_handler_ = @@ -61,11 +65,13 @@ /*network_configs_onc=*/base::Value::List(), /*global_network_config=*/base::Value::Dict()); - auto fake_user_manager = std::make_unique<user_manager::FakeUserManager>(); - primary_user_ = fake_user_manager->AddUser(primary_account_id); - secondary_user_ = fake_user_manager->AddUser(secondary_account_id); - scoped_user_manager_ = std::make_unique<user_manager::ScopedUserManager>( - std::move(fake_user_manager)); + user_manager::UserManagerImpl::RegisterPrefs(local_state_.registry()); + fake_user_manager_.Reset( + std::make_unique<user_manager::FakeUserManager>(&local_state_)); + primary_user_ = fake_user_manager_->AddGaiaUser( + primary_account_id, user_manager::UserType::kRegular); + secondary_user_ = fake_user_manager_->AddGaiaUser( + secondary_account_id, user_manager::UserType::kRegular); browser_context_helper_ = std::make_unique<BrowserContextHelper>( std::make_unique<FakeBrowserContextHelperDelegate>()); @@ -83,7 +89,9 @@ Shutdown(); network_handler_test_helper_.reset(); browser_context_helper_.reset(); - scoped_user_manager_.reset(); + secondary_user_ = nullptr; + primary_user_ = nullptr; + fake_user_manager_.Reset(); LoginState::Shutdown(); ui_proxy_config_service_.reset(); } @@ -100,11 +108,11 @@ } void NetworkTestHelper::LoginUser(const user_manager::User* user) { - auto* user_manager = static_cast<user_manager::FakeUserManager*>( - user_manager::UserManager::Get()); - user_manager->UserLoggedIn(user->GetAccountId(), user->username_hash(), - true /* browser_restart */, false /* is_child */); - user_manager->SwitchActiveUser(user->GetAccountId()); + fake_user_manager_->UserLoggedIn( + user->GetAccountId(), + user_manager::FakeUserManager::GetFakeUsernameHash(user->GetAccountId()), + /*browser_restart=*/true, /*is_child=*/false); + fake_user_manager_->SwitchActiveUser(user->GetAccountId()); } std::string NetworkTestHelper::ConfigureWiFiNetwork(
diff --git a/chromeos/ash/components/sync_wifi/network_test_helper.h b/chromeos/ash/components/sync_wifi/network_test_helper.h index a2791fa..e7d96c6 100644 --- a/chromeos/ash/components/sync_wifi/network_test_helper.h +++ b/chromeos/ash/components/sync_wifi/network_test_helper.h
@@ -17,6 +17,7 @@ #include "chromeos/ash/services/network_config/cros_network_config.h" #include "chromeos/ash/services/network_config/public/cpp/cros_network_config_test_helper.h" #include "components/sync_preferences/testing_pref_service_syncable.h" +#include "components/user_manager/fake_user_manager.h" #include "components/user_manager/scoped_user_manager.h" namespace user_manager { @@ -65,13 +66,14 @@ std::unique_ptr<ManagedNetworkConfigurationHandler> managed_network_configuration_handler_; std::unique_ptr<UIProxyConfigService> ui_proxy_config_service_; - std::unique_ptr<user_manager::ScopedUserManager> scoped_user_manager_; + user_manager::TypedScopedUserManager<user_manager::FakeUserManager> + fake_user_manager_; std::unique_ptr<BrowserContextHelper> browser_context_helper_; std::unique_ptr<NetworkHandlerTestHelper> network_handler_test_helper_; sync_preferences::TestingPrefServiceSyncable user_prefs_; - raw_ptr<const user_manager::User, DanglingUntriaged> primary_user_; - raw_ptr<const user_manager::User, DanglingUntriaged> secondary_user_; + raw_ptr<const user_manager::User> primary_user_; + raw_ptr<const user_manager::User> secondary_user_; TestingPrefServiceSimple local_state_; };
diff --git a/chromeos/ash/services/bluetooth_config/BUILD.gn b/chromeos/ash/services/bluetooth_config/BUILD.gn index 8b96f62..ceb319a 100644 --- a/chromeos/ash/services/bluetooth_config/BUILD.gn +++ b/chromeos/ash/services/bluetooth_config/BUILD.gn
@@ -180,6 +180,7 @@ "//chromeos/ash/services/bluetooth_config/public/cpp:unit_tests", "//chromeos/ash/services/nearby/public/cpp", "//chromeos/dbus/power", + "//components/prefs:test_support", "//components/session_manager/core", "//components/sync_preferences:test_support", "//components/user_manager:test_support",
diff --git a/chromeos/ash/services/bluetooth_config/bluetooth_power_controller_impl_unittest.cc b/chromeos/ash/services/bluetooth_config/bluetooth_power_controller_impl_unittest.cc index 19b78a2..f1f989b8 100644 --- a/chromeos/ash/services/bluetooth_config/bluetooth_power_controller_impl_unittest.cc +++ b/chromeos/ash/services/bluetooth_config/bluetooth_power_controller_impl_unittest.cc
@@ -12,6 +12,7 @@ #include "components/sync_preferences/testing_pref_service_syncable.h" #include "components/user_manager/fake_user_manager.h" #include "components/user_manager/scoped_user_manager.h" +#include "google_apis/gaia/gaia_id.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" @@ -20,6 +21,7 @@ namespace { constexpr char kUser1Email[] = "user1@bluetooth"; +constexpr char kFakeGaia1[] = "fakegaia1"; } // namespace @@ -39,11 +41,16 @@ BluetoothPowerControllerImpl::RegisterProfilePrefs( active_user_prefs()->registry()); - auto fake_user_manager = std::make_unique<user_manager::FakeUserManager>(); - fake_user_manager_ = fake_user_manager.get(); - scoped_user_manager_ = std::make_unique<user_manager::ScopedUserManager>( - std::move(fake_user_manager)); session_manager_ = std::make_unique<session_manager::SessionManager>(); + + user_manager::UserManagerImpl::RegisterPrefs(local_state()->registry()); + fake_user_manager_.Reset( + std::make_unique<user_manager::FakeUserManager>(local_state())); + } + + void TearDown() override { + fake_user_manager_.Reset(); + session_manager_.reset(); } void Init() { @@ -55,14 +62,17 @@ } void AddUserSession(const std::string& display_email, + const GaiaId& gaia_id, bool is_user_kiosk = false, bool is_new_profile = false) { - const AccountId account_id = AccountId::FromUserEmail(display_email); + const AccountId account_id = + AccountId::FromUserEmailGaiaId(display_email, gaia_id); const user_manager::User* user; if (is_user_kiosk) { user = fake_user_manager_->AddKioskAppUser(account_id); } else { - user = fake_user_manager_->AddUser(account_id); + user = fake_user_manager_->AddGaiaUser(account_id, + user_manager::UserType::kRegular); } fake_user_manager_->SetIsCurrentUserNew(is_new_profile); @@ -109,12 +119,12 @@ private: base::test::TaskEnvironment task_environment_; + sync_preferences::TestingPrefServiceSyncable local_state_; std::unique_ptr<session_manager::SessionManager> session_manager_; - raw_ptr<user_manager::FakeUserManager, DanglingUntriaged> fake_user_manager_; - std::unique_ptr<user_manager::ScopedUserManager> scoped_user_manager_; + user_manager::TypedScopedUserManager<user_manager::FakeUserManager> + fake_user_manager_; sync_preferences::TestingPrefServiceSyncable active_user_prefs_; - sync_preferences::TestingPrefServiceSyncable local_state_; FakeAdapterStateController fake_adapter_state_controller_; @@ -142,7 +152,7 @@ // Toggling Bluetooth off/on when there is user session should affect // user prefs. - AddUserSession(kUser1Email); + AddUserSession(kUser1Email, GaiaId(kFakeGaia1)); EXPECT_TRUE( active_user_prefs()->GetBoolean(prefs::kUserBluetoothAdapterEnabled)); @@ -241,7 +251,7 @@ ->IsDefaultValue()); EXPECT_EQ(GetAdapterState(), mojom::BluetoothSystemState::kEnabled); - AddUserSession(kUser1Email); + AddUserSession(kUser1Email, GaiaId(kFakeGaia1)); // Pref should now contain the current Bluetooth adapter state (on). EXPECT_FALSE(active_user_prefs() @@ -266,7 +276,8 @@ ->IsDefaultValue()); EXPECT_EQ(GetAdapterState(), mojom::BluetoothSystemState::kDisabled); - AddUserSession(kUser1Email, /*is_user_kiosk=*/false, /*is_new_profile=*/true); + AddUserSession(kUser1Email, GaiaId(kFakeGaia1), + /*is_user_kiosk=*/false, /*is_new_profile=*/true); // Pref should be set to true for first-login users, and this will also // trigger the Bluetooth power on. @@ -292,7 +303,8 @@ ->IsDefaultValue()); EXPECT_EQ(GetAdapterState(), mojom::BluetoothSystemState::kDisabled); - AddUserSession(kUser1Email, /*is_user_kiosk=*/true); + AddUserSession(kUser1Email, GaiaId(kFakeGaia1), + /*is_user_kiosk=*/true); // For non-regular user, the Bluetooth setting should not be applied and pref // not set. @@ -320,7 +332,7 @@ ->IsDefaultValue()); EXPECT_EQ(GetAdapterState(), mojom::BluetoothSystemState::kDisabled); - AddUserSession(kUser1Email); + AddUserSession(kUser1Email, GaiaId(kFakeGaia1)); // Pref should be applied to trigger the Bluetooth power on, and the pref // value should be unchanged.
diff --git a/chromeos/ash/services/bluetooth_config/system_properties_provider_impl_unittest.cc b/chromeos/ash/services/bluetooth_config/system_properties_provider_impl_unittest.cc index 756aa08..1be5f489 100644 --- a/chromeos/ash/services/bluetooth_config/system_properties_provider_impl_unittest.cc +++ b/chromeos/ash/services/bluetooth_config/system_properties_provider_impl_unittest.cc
@@ -15,9 +15,11 @@ #include "chromeos/ash/services/bluetooth_config/fake_device_cache.h" #include "chromeos/ash/services/bluetooth_config/fake_fast_pair_delegate.h" #include "chromeos/ash/services/bluetooth_config/fake_system_properties_observer.h" +#include "components/prefs/testing_pref_service.h" #include "components/session_manager/core/session_manager.h" #include "components/user_manager/fake_user_manager.h" #include "components/user_manager/scoped_user_manager.h" +#include "google_apis/gaia/gaia_id.h" #include "mojo/public/cpp/bindings/pending_remote.h" #include "mojo/public/cpp/bindings/receiver.h" #include "testing/gtest/include/gtest/gtest.h" @@ -71,19 +73,26 @@ // testing::Test: void SetUp() override { // Enable feature. - feature_list.InitAndEnableFeature( + feature_list_.InitAndEnableFeature( features::kFastPairDevicesBluetoothSettings); - auto fake_user_manager = std::make_unique<user_manager::FakeUserManager>(); - fake_user_manager_ = fake_user_manager.get(); - scoped_user_manager_ = std::make_unique<user_manager::ScopedUserManager>( - std::move(fake_user_manager)); + session_manager_ = std::make_unique<session_manager::SessionManager>(); + user_manager::UserManagerImpl::RegisterPrefs(local_state_.registry()); + fake_user_manager_.Reset( + std::make_unique<user_manager::FakeUserManager>(&local_state_)); + provider_ = std::make_unique<SystemPropertiesProviderImpl>( &fake_adapter_state_controller_, &fake_device_cache_, &fake_fast_pair_delegate_); } + void TearDown() override { + provider_.reset(); + fake_user_manager_.Reset(); + session_manager_.reset(); + } + void SetSystemState(mojom::BluetoothSystemState system_state) { fake_adapter_state_controller_.SetSystemState(system_state); provider_->FlushForTesting(); @@ -100,9 +109,11 @@ provider_->FlushForTesting(); } - const user_manager::User* LogIn(const std::string email) { - const AccountId account_id = AccountId::FromUserEmail(email); - const user_manager::User* user = fake_user_manager_->AddUser(account_id); + const user_manager::User* LogIn(std::string_view email, + const GaiaId& gaia_id) { + const AccountId account_id = AccountId::FromUserEmailGaiaId(email, gaia_id); + const user_manager::User* user = fake_user_manager_->AddGaiaUser( + account_id, user_manager::UserType::kRegular); // Create a session in SessionManager. This will also login the user in // UserManager. @@ -147,15 +158,16 @@ } private: + base::test::ScopedFeatureList feature_list_; base::test::TaskEnvironment task_environment_; + TestingPrefServiceSimple local_state_; + std::unique_ptr<session_manager::SessionManager> session_manager_; + user_manager::TypedScopedUserManager<user_manager::FakeUserManager> + fake_user_manager_; + FakeAdapterStateController fake_adapter_state_controller_; FakeDeviceCache fake_device_cache_{&fake_adapter_state_controller_}; FakeFastPairDelegate fake_fast_pair_delegate_; - std::unique_ptr<session_manager::SessionManager> session_manager_; - raw_ptr<user_manager::FakeUserManager, DanglingUntriaged> fake_user_manager_; - std::unique_ptr<user_manager::ScopedUserManager> scoped_user_manager_; - base::test::ScopedFeatureList feature_list; - std::unique_ptr<SystemPropertiesProviderImpl> provider_; }; @@ -246,7 +258,8 @@ observer->received_properties_list()[0]->modification_state); // Log in as the first user. They should be able to modify Bluetooth. - const user_manager::User* user1 = LogIn("email1@example.com"); + const user_manager::User* user1 = + LogIn("email1@example.com", GaiaId("fakegaia1")); ASSERT_EQ(2u, observer->received_properties_list().size()); EXPECT_EQ(mojom::BluetoothModificationState::kCanModifyBluetooth, observer->received_properties_list()[1]->modification_state); @@ -258,7 +271,7 @@ observer->received_properties_list()[2]->modification_state); // Log in as a second user. They should not be able to modify Bluetooth. - LogIn("email2@example.com"); + LogIn("email2@example.com", GaiaId("fakegaia2")); ASSERT_EQ(4u, observer->received_properties_list().size()); EXPECT_EQ(mojom::BluetoothModificationState::kCannotModifyBluetooth, observer->received_properties_list()[3]->modification_state);
diff --git a/clank b/clank index c78bc641..de102b69 160000 --- a/clank +++ b/clank
@@ -1 +1 @@ -Subproject commit c78bc64124bbc9103a59307e508591bf82cf7eb4 +Subproject commit de102b699470b4d92be37fc98f29f6c668e419f2
diff --git a/components/autofill/content/renderer/autofill_agent_browsertest.cc b/components/autofill/content/renderer/autofill_agent_browsertest.cc index 1281063..33620c9 100644 --- a/components/autofill/content/renderer/autofill_agent_browsertest.cc +++ b/components/autofill/content/renderer/autofill_agent_browsertest.cc
@@ -1336,10 +1336,6 @@ render_frame, std::move(password_autofill_agent), std::move(password_generation_agent), associated_interfaces); } - - MockAutofillAgent& autofill_agent() { - return static_cast<MockAutofillAgent&>(AutofillAgentTest::autofill_agent()); - } }; // Tests that the agent in 3P mode doesn't fill insecure forms.
diff --git a/components/autofill/content/renderer/password_generation_agent.cc b/components/autofill/content/renderer/password_generation_agent.cc index fdc84ee..f5d6db8 100644 --- a/components/autofill/content/renderer/password_generation_agent.cc +++ b/components/autofill/content/renderer/password_generation_agent.cc
@@ -470,7 +470,7 @@ GetTextDirectionForElement( current_generation_item_->generation_element_), current_generation_item_->form_data_, - current_generation_item_->generation_element_.Value().Utf16().empty()); + current_generation_item_->generation_rejected_); std::move(callback).Run(std::move(password_generation_ui_data)); current_generation_item_->generation_popup_shown_ = true; } else { @@ -697,10 +697,6 @@ DCHECK(current_generation_item_); DCHECK(current_generation_item_->generation_element_); - if (current_generation_item_->generation_rejected_) { - return; - } - LogMessage(Logger::STRING_GENERATION_RENDERER_AUTOMATIC_GENERATION_AVAILABLE); // If the field is not |type=password|, the list of suggestions // should not be populated with passwordS to avoid filling them in a @@ -720,7 +716,7 @@ is_generation_element_password_type, GetTextDirectionForElement(current_generation_item_->generation_element_), current_generation_item_->form_data_, - current_generation_item_->generation_element_.Value().Utf16().empty()); + current_generation_item_->generation_rejected_); current_generation_item_->generation_popup_shown_ = true; GetPasswordGenerationDriver().AutomaticGenerationAvailable( password_generation_ui_data);
diff --git a/components/autofill/core/browser/BUILD.gn b/components/autofill/core/browser/BUILD.gn index f506b69..d844840f 100644 --- a/components/autofill/core/browser/BUILD.gn +++ b/components/autofill/core/browser/BUILD.gn
@@ -59,6 +59,20 @@ rebase_path(outputs, root_build_dir) } +action("entity_schema_enums_and_functions") { + visibility = [ ":*" ] + + sources = [ "data_model/entity_schema.json" ] + + script = "data_model/transpile_entity_schema.py" + outputs = [ + "$target_gen_dir/data_model/entity_type_names.h", + "$target_gen_dir/data_model/entity_type_funcs.cc", + ] + args = [ "--input" ] + rebase_path(sources, root_build_dir) + [ "--output" ] + + rebase_path(outputs, root_build_dir) +} + proto_library("amount_extraction_heuristic_regexes_proto") { sources = [ "payments/amount_extraction_heuristic_regexes.proto" ] } @@ -152,6 +166,10 @@ "data_model/credit_card_cloud_token_data.h", "data_model/data_model_utils.cc", "data_model/data_model_utils.h", + "data_model/entity_instance.cc", + "data_model/entity_instance.h", + "data_model/entity_type.cc", + "data_model/entity_type.h", "data_model/ewallet.cc", "data_model/ewallet.h", "data_model/form_group.cc", @@ -650,6 +668,7 @@ ] sources += get_target_outputs(":regex_patterns_inl_h") + sources += get_target_outputs(":entity_schema_enums_and_functions") if (is_ios) { sources += [ @@ -757,6 +776,7 @@ deps = [ ":autofill_address_rewriter_resources", ":buildflags", + ":entity_schema_enums_and_functions", ":regex_patterns_inl_h", "//base", "//base:i18n", @@ -1164,6 +1184,8 @@ "data_model/contact_info_unittest.cc", "data_model/credit_card_benefit_unittest.cc", "data_model/credit_card_unittest.cc", + "data_model/entity_instance_unittest.cc", + "data_model/entity_type_unittest.cc", "data_model/ewallet_unittest.cc", "data_model/iban_unittest.cc", "data_model/payment_instrument_unittest.cc", @@ -1398,6 +1420,7 @@ ":autofill_address_rewriter_resources", ":browser", ":buildflags", + ":entity_schema_enums_and_functions", ":regex_patterns_inl_h", ":test_support", ":unit_tests_bundle_data",
diff --git a/components/autofill/core/browser/autofill_field.cc b/components/autofill/core/browser/autofill_field.cc index 60c5225e..426bf5a 100644 --- a/components/autofill/core/browser/autofill_field.cc +++ b/components/autofill/core/browser/autofill_field.cc
@@ -30,13 +30,10 @@ AutofillQueryResponse::FormSuggestion::FieldSuggestion::FieldPrediction; template <> -struct DenseSetTraits<FieldPrediction::Source> { - static constexpr FieldPrediction::Source kMinValue = - FieldPrediction::Source(0); - static constexpr FieldPrediction::Source kMaxValue = - FieldPrediction::Source_MAX; - static constexpr bool kPacked = false; -}; +struct DenseSetTraits<FieldPrediction::Source> + : EnumDenseSetTraits<FieldPrediction::Source, + FieldPrediction::Source_MIN, + FieldPrediction::Source_MAX> {}; namespace {
diff --git a/components/autofill/core/browser/data_model/entity_instance.cc b/components/autofill/core/browser/data_model/entity_instance.cc new file mode 100644 index 0000000..ce454011 --- /dev/null +++ b/components/autofill/core/browser/data_model/entity_instance.cc
@@ -0,0 +1,52 @@ +// 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 "components/autofill/core/browser/data_model/entity_instance.h" + +namespace autofill { + +AttributeInstance::Context::Context() = default; +AttributeInstance::Context::Context(const AttributeInstance::Context&) = + default; +AttributeInstance::Context& AttributeInstance::Context::operator=( + const AttributeInstance::Context&) = default; +AttributeInstance::Context::Context(AttributeInstance::Context&&) = default; +AttributeInstance::Context& AttributeInstance::Context::operator=( + AttributeInstance::Context&&) = default; +AttributeInstance::Context::~Context() = default; + +AttributeInstance::AttributeInstance(AttributeType type, + std::string value, + Context context) + : type_(type), value_(std::move(value)), context_(std::move(context)) {} + +AttributeInstance::AttributeInstance(const AttributeInstance&) = default; +AttributeInstance& AttributeInstance::operator=(const AttributeInstance&) = + default; +AttributeInstance::AttributeInstance(AttributeInstance&&) = default; +AttributeInstance& AttributeInstance::operator=(AttributeInstance&&) = default; +AttributeInstance::~AttributeInstance() = default; + +EntityInstance::EntityInstance( + EntityType type, + base::flat_set<AttributeInstance, AttributeInstance::CompareByType> + attributes, + base::Uuid guid, + std::string nickname, + base::TimeTicks date_modified, + bool synced) + : type_(type), + attributes_(std::move(attributes)), + guid_(std::move(guid)), + nickname_(std::move(nickname)), + date_modified_(date_modified), + synced_(synced) {} + +EntityInstance::EntityInstance(const EntityInstance&) = default; +EntityInstance& EntityInstance::operator=(const EntityInstance&) = default; +EntityInstance::EntityInstance(EntityInstance&&) = default; +EntityInstance& EntityInstance::operator=(EntityInstance&&) = default; +EntityInstance::~EntityInstance() = default; + +} // namespace autofill
diff --git a/components/autofill/core/browser/data_model/entity_instance.h b/components/autofill/core/browser/data_model/entity_instance.h new file mode 100644 index 0000000..a409e12 --- /dev/null +++ b/components/autofill/core/browser/data_model/entity_instance.h
@@ -0,0 +1,164 @@ +// 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 COMPONENTS_AUTOFILL_CORE_BROWSER_DATA_MODEL_ENTITY_INSTANCE_H_ +#define COMPONENTS_AUTOFILL_CORE_BROWSER_DATA_MODEL_ENTITY_INSTANCE_H_ + +#include <string> + +#include "base/compiler_specific.h" +#include "base/containers/flat_set.h" +#include "base/containers/span.h" +#include "base/time/time.h" +#include "base/types/cxx23_to_underlying.h" +#include "base/types/optional_ref.h" +#include "base/uuid.h" +#include "components/autofill/core/browser/data_model/entity_type.h" +#include "components/autofill/core/browser/field_types.h" +#include "components/autofill/core/common/dense_set.h" +#include "components/autofill/core/common/is_required.h" +#include "third_party/abseil-cpp/absl/types/variant.h" +#include "url/gurl.h" + +namespace autofill { + +// Entity and attribute types are blueprints for entity and attribute instances. +// +// For example, "passport" is an entity type and its attribute types include +// "name", "country", "issue date", "expiry date", etc. +// +// A specific passport is an entity instance, which has attribute instances with +// values such "John Doe", "USA", "05/2019", "04/2029", etc. +// +// Entity instances are loaded from a webdata table and exposed through +// EntityDataManager. +// TODO(crbug.com/388590912): Write the EntityDataManager. +class EntityInstance; +class AttributeInstance; + +// An attribute instance is a typed string value with additional metadata. +// It is associated with an EntityInstance. The type is an AttributeType. +class AttributeInstance final { + public: + // Metadata from the saving moment. + // This is more or less a placeholder for now. + // TODO(crbug.com/388590912): Figure out the details or delete Context. + struct Context { + Context(); + Context(const Context&); + Context& operator=(const Context&); + Context(Context&&); + Context& operator=(Context&&); + ~Context(); + + // Human-readable description of the format, e.g., "date in MM/YYYY". + std::string format; + }; + + // Less-than relation based on the AttributeType. + struct CompareByType; + + AttributeInstance(AttributeType type, std::string value, Context context); + + AttributeInstance(const AttributeInstance&); + AttributeInstance& operator=(const AttributeInstance&); + AttributeInstance(AttributeInstance&&); + AttributeInstance& operator=(AttributeInstance&&); + ~AttributeInstance(); + + AttributeType type() const { return AttributeType(type_); } + + // Typically a user-entered string, e.g., a date. + const std::string& value() const { return value_; } + + // Metadata from the saving moment of the value. + const Context& context() const { return context_; } + + private: + AttributeType type_; + std::string value_; + Context context_; +}; + +struct AttributeInstance::CompareByType { + using is_transparent = void; + + bool operator()(const AttributeInstance& lhs, AttributeType rhs) const { + return lt(lhs.type().name(), rhs.name()); + } + + bool operator()(AttributeType lhs, const AttributeInstance& rhs) const { + return lt(lhs.name(), rhs.type().name()); + } + + bool operator()(const AttributeInstance& lhs, + const AttributeInstance& rhs) const { + return lt(lhs.type().name(), rhs.type().name()); + } + + private: + bool lt(AttributeTypeName lhs, AttributeTypeName rhs) const { + return base::to_underlying(lhs) < base::to_underlying(rhs); + } +}; + +// An entity instance is a set of attribute instances with additional metadata. +// The type is an EntityType. +class EntityInstance final { + public: + EntityInstance(EntityType type_name, + base::flat_set<AttributeInstance, + AttributeInstance::CompareByType> attributes, + base::Uuid guid, + std::string nickname, + base::TimeTicks date_modified, + bool synced); + + EntityInstance(const EntityInstance&); + EntityInstance& operator=(const EntityInstance&); + EntityInstance(EntityInstance&&); + EntityInstance& operator=(EntityInstance&&); + ~EntityInstance(); + + EntityType type() const { return EntityType(type_); } + + // The attributes present in this instance. + // This is a subset of the attributes supported by the entity type. + base::span<const AttributeInstance> attributes() const LIFETIME_BOUND { + return attributes_; + } + + // Returns the instance of `a` if it is present. + base::optional_ref<const AttributeInstance> attribute(AttributeType a) const + LIFETIME_BOUND { + CHECK_EQ(a.entity_type(), type()); + auto it = attributes_.find(a); + return it != attributes_.end() ? &*it : nullptr; + } + + // Globally unique identifier of this entity. + const base::Uuid& guid() const LIFETIME_BOUND { return guid_; } + + // The nickname assigned to this instance by the user. + const std::string& nickname() const LIFETIME_BOUND { return nickname_; } + + // The latest time the instance, including any of its attributes, was edited. + base::TimeTicks date_modified() const { return date_modified_; } + + // Indicates if the instance is synced. + bool synced() const { return synced_; } + + private: + EntityType type_; + base::flat_set<AttributeInstance, AttributeInstance::CompareByType> + attributes_; + base::Uuid guid_; + std::string nickname_; + base::TimeTicks date_modified_; + bool synced_ = false; +}; + +} // namespace autofill + +#endif // COMPONENTS_AUTOFILL_CORE_BROWSER_DATA_MODEL_ENTITY_INSTANCE_H_
diff --git a/components/autofill/core/browser/data_model/entity_instance_unittest.cc b/components/autofill/core/browser/data_model/entity_instance_unittest.cc new file mode 100644 index 0000000..d639327 --- /dev/null +++ b/components/autofill/core/browser/data_model/entity_instance_unittest.cc
@@ -0,0 +1,60 @@ +// 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 "components/autofill/core/browser/data_model/entity_instance.h" + +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace autofill { +namespace { + +const EntityInstance& passport() { + using enum AttributeTypeName; + static const EntityInstance kMyPassport( + EntityType(EntityTypeName::kPassport), + {AttributeInstance(AttributeType(kPassportName), "Donald Duck", {}), + AttributeInstance(AttributeType(kPassportCountry), "USA", {}), + AttributeInstance(AttributeType(kPassportExpiryDate), "09/2098", {}), + AttributeInstance(AttributeType(kPassportIssueDate), "10/1998", {})}, + base::Uuid::GenerateRandomV4(), "Passie", base::TimeTicks::Now(), + /*synced=*/false); + return kMyPassport; +} + +const EntityInstance& loyalty_card() { + using enum AttributeTypeName; + static const EntityInstance kMyLoyaltyCard( + EntityType(EntityTypeName::kLoyaltyCard), + {AttributeInstance(AttributeType(kLoyaltyCardProgram), + "Asterisk Alliance", {}), + AttributeInstance(AttributeType(kLoyaltyCardProvider), "Duck Airways", + {}), + AttributeInstance(AttributeType(kLoyaltyCardMemberId), "1", {})}, + base::Uuid::GenerateRandomV4(), "Duckie", base::TimeTicks::Now(), + /*synced=*/true); + return kMyLoyaltyCard; +} + +TEST(AutofillEntityInstanceTest, Attributes) { + using enum AttributeTypeName; + EXPECT_EQ(passport().attributes().size(), 4u); + EXPECT_EQ(passport().type().attributes().size(), 6u); + EXPECT_FALSE(passport().attribute(AttributeType(kPassportNumber))); + { + base::optional_ref<const AttributeInstance> a = + passport().attribute(AttributeType(kPassportName)); + ASSERT_TRUE(a); + EXPECT_THAT(a->type(), AttributeType(kPassportName)); + EXPECT_THAT(a->value(), "Donald Duck"); + } +} + +TEST(AutofillEntityInstanceTest, Synced) { + EXPECT_FALSE(passport().synced()); + EXPECT_TRUE(loyalty_card().synced()); +} + +} // namespace +} // namespace autofill
diff --git a/components/autofill/core/browser/data_model/entity_schema.json b/components/autofill/core/browser/data_model/entity_schema.json new file mode 100644 index 0000000..aea68789 --- /dev/null +++ b/components/autofill/core/browser/data_model/entity_schema.json
@@ -0,0 +1,27 @@ +[ + { + "name": "Passport", + "attributes": [ "Name", "Number", "Country", "Expiry date", "Issue date", "Place of birth" ], + "unique keys": [ + [ "Number", "Expiry date" ] + ], + "required attributes": [ + [ "Number", "Name" ], + [ "Number", "Country" ], + [ "Number", "Expiry date" ] + ], + "disambiguation order": [ "Name", "Country", "Expiry date" ], + "syncable": false + }, + { + "name": "Loyalty Card", + "attributes": [ "Program", "Provider", "Member ID" ], + "unique keys": [ + [ "Program", "Member ID" ] + ], + "required attributes": [ + [ "Program", "Member ID" ] + ], + "syncable": true + } +]
diff --git a/components/autofill/core/browser/data_model/entity_type.cc b/components/autofill/core/browser/data_model/entity_type.cc new file mode 100644 index 0000000..6556d2a2 --- /dev/null +++ b/components/autofill/core/browser/data_model/entity_type.cc
@@ -0,0 +1,33 @@ +// 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 "components/autofill/core/browser/data_model/entity_type.h" + +#include "base/types/cxx23_to_underlying.h" + +namespace autofill { + +FieldType AttributeTypeNameToFieldType(AttributeTypeName a) { + switch (a) { + case AttributeTypeName::kPassportName: + return NAME_FULL; + default: + return NO_SERVER_DATA; + } + NOTREACHED(); +} + +EntityType AttributeType::entity_type() const { + return EntityType(AttributeTypeNameToEntityTypeName(name_)); +} + +std::ostream& operator<<(std::ostream& os, EntityType t) { + return os << base::to_underlying(t.name()); +} + +std::ostream& operator<<(std::ostream& os, AttributeType t) { + return os << base::to_underlying(t.name()); +} + +} // namespace autofill
diff --git a/components/autofill/core/browser/data_model/entity_type.h b/components/autofill/core/browser/data_model/entity_type.h new file mode 100644 index 0000000..bedf5379a --- /dev/null +++ b/components/autofill/core/browser/data_model/entity_type.h
@@ -0,0 +1,179 @@ +// 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 COMPONENTS_AUTOFILL_CORE_BROWSER_DATA_MODEL_ENTITY_TYPE_H_ +#define COMPONENTS_AUTOFILL_CORE_BROWSER_DATA_MODEL_ENTITY_TYPE_H_ + +#include <ostream> +#include <string_view> + +#include "base/containers/span.h" +#include "components/autofill/core/browser/data_model/entity_type_names.h" +#include "components/autofill/core/browser/field_types.h" +#include "components/autofill/core/common/dense_set.h" + +namespace autofill { + +// Entity and attribute types are blueprints for entity and attribute instances. +// +// For example, "passport" is an entity type and its attribute types include +// "name", "country", "issue date", "expiry date", etc. +// +// A specific passport is an entity instance, which has attribute instances with +// values such "John Doe", "USA", "05/2019", "04/2029", etc. +// +// Entity types are generated at compile time from the schema definition in +// entity_schema.json. +class EntityType; +class AttributeType; + +// Customization point for mapping attributes to FieldTypes. +// For example, a the "name" attribute type of a passport or identity card may +// be mapped to NAME_FULL. +FieldType AttributeTypeNameToFieldType(AttributeTypeName a); + +// An attribute type is the blueprint for an attribute instance, which in turn +// represents a string value with additional metadata. +// +// An AttributeType is uniquely identified by its AttributeTypeName from +// entity_type_names.h generated by transpile_entity_schema.py. AttributeType is +// merely a thin wrapper with member functions. +class AttributeType final { + public: + // Defines ordering for disambiguating different instances of the same entity + // type, as specified in the schema. + // "Less" according to this ordering means "higher precedence". + // + // For example, when disambiguating different passport instances, the name and + // country should likely take precedence over the passport number. + // + // Defined in entity_type_funcs.h generated by transpile_entity_schema.py. + struct DisambiguationComparator { + bool operator()(const AttributeType& lhs, const AttributeType& rhs) const; + }; + + constexpr explicit AttributeType(AttributeTypeName n) : name_(n) {} + + constexpr AttributeType(const AttributeType&) = default; + constexpr AttributeType& operator=(const AttributeType&) = default; + constexpr AttributeType(AttributeType&&) = default; + constexpr AttributeType& operator=(AttributeType&&) = default; + + constexpr AttributeTypeName name() const { return name_; } + + EntityType entity_type() const; + + // The FieldType associated with this attribute as defined in + // AttributeTypeNameToFieldType(). + FieldType field_type() const { return AttributeTypeNameToFieldType(name_); } + + // The string representation of the name. This is unique among all attribute + // types of the associated entity type. (It is not globally unique!) + // + // Defined in entity_type_funcs.h generated by transpile_entity_schema.py. + std::string_view name_as_string() const; + + friend constexpr bool operator==(const AttributeType& lhs, + const AttributeType& rhs) = default; + + private: + AttributeTypeName name_{}; +}; + +template <> +struct DenseSetTraits<AttributeType> { + using T = AttributeType; + using N = AttributeTypeName; + using UnderlyingType = std::underlying_type_t<N>; + + static constexpr T from_underlying(UnderlyingType x) { + return T(static_cast<N>(x)); + } + static constexpr UnderlyingType to_underlying(T x) { + return base::to_underlying(x.name()); + } + + static constexpr auto kMinValue = T(static_cast<N>(0)); + static constexpr auto kMaxValue = T(N::kMaxValue); + static constexpr bool kPacked = false; +}; + +// An entity type is the blueprint for an entity instance. It defines the +// available attributes and additional metadata. +// +// An EntityType is uniquely identified by its EntityTypeName from +// entity_type_names.h generated by transpile_entity_schema.py. EntityType is +// merely a thin wrapper with member functions. +class EntityType final { + public: + constexpr explicit EntityType(EntityTypeName n) : name_(n) {} + + constexpr EntityType(const EntityType&) = default; + constexpr EntityType& operator=(const EntityType&) = default; + constexpr EntityType(EntityType&&) = default; + constexpr EntityType& operator=(EntityType&&) = default; + + constexpr EntityTypeName name() const { return name_; } + + // The string representation of the name. This is unique among all entity + // types. + // + // Defined in entity_type_funcs.h generated by transpile_entity_schema.py. + std::string_view name_as_string() const; + + // The attributes supported by this entity type, as specified in the schema. + // An instance of this entity may define values for some or all of these + // attributes. For example, for a passport entity this may be the number, the + // name, the country etc. + // + // Defined in entity_type_funcs.h generated by transpile_entity_schema.py. + DenseSet<AttributeType> attributes() const; + + // The attributes that conceptually uniquely identify an instance among the + // instances stored for one user, as specified in the schema. For example, for + // a passport this may be {number} and {name, country, issue date} because + // passport numbers generally serve as unique identifiers and also a single + // user usually only has one passport per name, country, and date. + // + // Note that this is for data management purposes (e.g., deduping). It is + // *not* meant to be used, for example, to look up elements: Technically, + // there may be multiple, say, passports issued on the same day for different + // persons of the same name in one country. + // + // Defined in entity_type_funcs.h generated by transpile_entity_schema.py. + base::span<const DenseSet<AttributeType>> unique_keys() const; + + // The alternative sets of required attributes, as specified in the schema. + // "Required" means that an entity instance may be saved only if it contains + // values for those attributes. + // "Alternative" means that it suffices to satisfy one of those sets. For + // example, if the necessary attributes for a passport are {name, country} and + // {number}, then it suffices if an instances defines either the name and + // country, or just the number. + // + // Defined in entity_type_funcs.h generated by transpile_entity_schema.py. + base::span<const DenseSet<AttributeType>> required_attributes() const; + + // Indicates if instances of this type may be synced, as specified in the + // schema. + // + // Defined in entity_type_funcs.h generated by transpile_entity_schema.py. + bool syncable() const; + + friend constexpr bool operator==(const EntityType& lhs, + const EntityType& rhs) = default; + + private: + EntityTypeName name_{}; +}; + +// Defined in entity_type_funcs.h generated by transpile_entity_schema.py. +EntityTypeName AttributeTypeNameToEntityTypeName(AttributeTypeName a); + +std::ostream& operator<<(std::ostream& os, EntityType t); +std::ostream& operator<<(std::ostream& os, AttributeType t); + +} // namespace autofill + +#endif // COMPONENTS_AUTOFILL_CORE_BROWSER_DATA_MODEL_ENTITY_TYPE_H_
diff --git a/components/autofill/core/browser/data_model/entity_type_unittest.cc b/components/autofill/core/browser/data_model/entity_type_unittest.cc new file mode 100644 index 0000000..2865900 --- /dev/null +++ b/components/autofill/core/browser/data_model/entity_type_unittest.cc
@@ -0,0 +1,90 @@ +// 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 "components/autofill/core/browser/data_model/entity_type.h" + +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace autofill { +namespace { + +using ::testing::ElementsAre; +using ::testing::UnorderedElementsAre; + +TEST(AutofillAttributeTypeTest, Relationships) { + { + AttributeType a = AttributeType(AttributeTypeName::kPassportName); + EXPECT_EQ(a.entity_type(), EntityType(EntityTypeName::kPassport)); + EXPECT_EQ(a.field_type(), NAME_FULL); + } + { + AttributeType a = AttributeType(AttributeTypeName::kPassportNumber); + EXPECT_EQ(a.entity_type(), EntityType(EntityTypeName::kPassport)); + EXPECT_EQ(a.field_type(), NO_SERVER_DATA); + } +} + +TEST(AutofillEntityTypeTest, Attributes) { + using enum AttributeTypeName; + EntityType e = EntityType(EntityTypeName::kPassport); + EXPECT_THAT(e.attributes(), + UnorderedElementsAre(AttributeType(kPassportName), + AttributeType(kPassportNumber), + AttributeType(kPassportCountry), + AttributeType(kPassportExpiryDate), + AttributeType(kPassportIssueDate), + AttributeType(kPassportPlaceOfBirth))); + ASSERT_FALSE(e.attributes().empty()); +} + +TEST(AutofillEntityTypeTest, UniqueKeys) { + using enum AttributeTypeName; + EntityType e = EntityType(EntityTypeName::kPassport); + EXPECT_THAT(e.unique_keys(), ElementsAre(UnorderedElementsAre( + AttributeType(kPassportNumber), + AttributeType(kPassportExpiryDate)))); +} + +TEST(AutofillEntityTypeTest, RequiredAttributes) { + using enum AttributeTypeName; + EntityType e = EntityType(EntityTypeName::kPassport); + EXPECT_THAT(e.required_attributes(), + UnorderedElementsAre( + UnorderedElementsAre(AttributeType(kPassportNumber), + AttributeType(kPassportName)), + UnorderedElementsAre(AttributeType(kPassportNumber), + AttributeType(kPassportCountry)), + UnorderedElementsAre(AttributeType(kPassportNumber), + AttributeType(kPassportExpiryDate)))); +} + +TEST(AutofillEntityTypeTest, NameAsString) { + EntityType e = EntityType(EntityTypeName::kPassport); + AttributeType a = *e.attributes().begin(); + EXPECT_EQ(e.name_as_string(), "Passport"); + EXPECT_EQ(a.name_as_string(), "Name"); +} + +TEST(AutofillEntityTypeTest, DisambiguationOrder) { + using enum AttributeTypeName; + auto lt = [](AttributeTypeName lhs, AttributeTypeName rhs) { + AttributeType::DisambiguationComparator lt; + return lt(AttributeType(lhs), AttributeType(rhs)); + }; + EXPECT_TRUE(lt(kPassportName, kPassportCountry)); + EXPECT_TRUE(lt(kPassportCountry, kPassportExpiryDate)); + EXPECT_TRUE(lt(kPassportCountry, kPassportIssueDate)); + EXPECT_TRUE(lt(kPassportCountry, kPassportNumber)); + EXPECT_FALSE(lt(kPassportNumber, kPassportIssueDate)); +} + +TEST(AutofillEntityTypeTest, Syncable) { + using enum EntityTypeName; + EXPECT_FALSE(EntityType(kPassport).syncable()); + EXPECT_TRUE(EntityType(kLoyaltyCard).syncable()); +} + +} // namespace +} // namespace autofill
diff --git a/components/autofill/core/browser/data_model/transpile_entity_schema.py b/components/autofill/core/browser/data_model/transpile_entity_schema.py new file mode 100755 index 0000000..b18a5186a --- /dev/null +++ b/components/autofill/core/browser/data_model/transpile_entity_schema.py
@@ -0,0 +1,220 @@ +#!/usr/bin/env python + +# 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. + +"""Generates C++ code from an Autofill AI schema definition. + +See go/forms-ai:data-model. +TODO(crbug.com/388590912): Add more details. +""" + +import argparse +import io +import json +import re +import sys + +# For 'foo bar' returns 'kFooBar', which is the conventional format of C++ +# constants. +def name_to_constant(str): + return 'k' + ''.join([s.capitalize() for s in str.split(' ')]) + +# The enum constant's name of an entity type. +def entity_name(entity, qualified = True): + prefix = 'EntityTypeName::' if qualified else '' + return prefix + name_to_constant(entity) + +# The enum constant's name of an attribute type. +def attribute_name(entity, attribute, qualified = True): + prefix = 'AttributeTypeName::' if qualified else '' + return prefix + name_to_constant(entity +' '+ attribute) + +# Adds to list of unqualified enum constant values a `kMaxValue` constant. +def add_kMaxValue(constants): + constants = list(constants) + return constants + ['kMaxValue = '+ constants[-1]] + +# An expression that creates a DenseSet of attribute type names. +def attribute_dense_set(entity, attributes): + names = (attribute_name(entity, attribute) for attribute in attributes) + return f'DenseSet{{{", ".join((f"AttributeType({name})" for name in names))}}}' + +# Generates entity and attribute type name enum definitions. +def generate_cpp_enums(schema): + entities = (entity_name(entity['name'], qualified=False) for entity in schema) + attributes = ( + attribute_name(entity['name'], attribute, qualified=False) + for entity in schema + for attribute in entity['attributes'] + ) + yield f'enum class EntityTypeName {{ {", ".join(add_kMaxValue(entities))} }};' + yield '' + yield f'enum class AttributeTypeName {{ {", ".join(add_kMaxValue(attributes))} }};' + +# Generates the function implementations. +def generate_cpp_functions(schema): + yield 'EntityTypeName AttributeTypeNameToEntityTypeName(AttributeTypeName a) {' + yield ' switch (a) {' + for entity, attribute in ((entity['name'], attribute) for entity in schema for attribute in entity['attributes']): + yield f' case {attribute_name(entity, attribute)}:' + yield f' return {entity_name(entity)};' + yield ' }' + yield ' NOTREACHED();' + yield '}' + yield '' + yield 'std::string_view AttributeType::name_as_string() const {' + yield ' switch (name_) {' + for entity, attribute in ((entity['name'], attribute) for entity in schema for attribute in entity['attributes']): + yield f' case {attribute_name(entity, attribute)}:' + yield f' return "{attribute}";' + yield ' }' + yield ' NOTREACHED();' + yield '}' + yield '' + yield 'std::string_view EntityType::name_as_string() const {' + yield ' switch (name_) {' + for entity in (entity['name'] for entity in schema): + yield f' case {entity_name(entity)}:' + yield f' return "{entity}";' + yield ' }' + yield ' NOTREACHED();' + yield '}' + yield '' + yield 'DenseSet<AttributeType> EntityType::attributes() const {' + yield ' switch (name_) {' + for entity in schema: + yield f' case {entity_name(entity["name"])}:' + yield f' return {attribute_dense_set(entity["name"], entity["attributes"])};' + yield ' }' + yield ' NOTREACHED();' + yield '}' + yield '' + yield 'base::span<const DenseSet<AttributeType>> EntityType::unique_keys() const {' + yield ' switch (name_) {' + for entity in schema: + yield f' case {entity_name(entity["name"])}: {{' + yield f' static constexpr auto as = std::array{{{", ".join(attribute_dense_set(entity["name"], attributes) for attributes in entity["unique keys"])}}};' + yield f' return as;' + yield f' }}' + yield ' }' + yield ' NOTREACHED();' + yield '}' + yield '' + yield 'base::span<const DenseSet<AttributeType>> EntityType::required_attributes() const {' + yield ' switch (name_) {' + for entity in schema: + yield f' case {entity_name(entity["name"])}: {{' + yield f' static constexpr auto as = std::array{{{", ".join(attribute_dense_set(entity["name"], attributes) for attributes in entity["required attributes"])}}};' + yield f' return as;' + yield f' }}' + yield ' }' + yield ' NOTREACHED();' + yield '}' + yield '' + yield 'bool EntityType::syncable() const {' + yield ' switch (name_) {' + for entity, syncable in ((entity['name'], entity['syncable']) for entity in schema): + yield f' case {entity_name(entity)}:' + yield f' return {"true" if syncable else "false"};' + yield ' }' + yield ' NOTREACHED();' + yield '}' + yield '' + yield 'bool AttributeType::DisambiguationComparator::operator()(const AttributeType& lhs, const AttributeType& rhs) const {' + yield ' constexpr auto rank = [](const AttributeType& a) {' + yield ' static constexpr auto ranks = [] {' + yield ' std::array<int, base::to_underlying(AttributeTypeName::kMaxValue)> ranks{};' + for entity, order in ((entity['name'], entity.get('disambiguation order', [])) for entity in schema): + for rank, attribute in enumerate(order): + yield f' ranks[base::to_underlying({attribute_name(entity, attribute)})] = {rank+1};' + yield ' return ranks;' + yield ' }();' + yield ' auto r = ranks[base::to_underlying(a.name())];' + yield ' return r > 0 ? r : std::numeric_limits<decltype(r)>::max();' + yield ' };' + yield ' return rank(lhs) < rank(rhs);' + yield '}' + +def generate_cpp_enums_header(schema, include_guard): + yield f"""// 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 {include_guard} +#define {include_guard} + +namespace autofill {{ +""" + yield from generate_cpp_enums(schema) + yield f""" +}} // namespace autofill + +#endif // {include_guard}""" + +def generate_cpp_functions_header(schema, include_guard): + yield f"""// 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 <array> +#include <limits> +#include <string> + +#include "base/containers/span.h" +#include "base/notreached.h" +#include "base/types/cxx23_to_underlying.h" +#include "components/autofill/core/browser/data_model/entity_type.h" +#include "components/autofill/core/common/dense_set.h" + +namespace autofill {{ +""" + yield from generate_cpp_functions(schema) + yield f""" +}} // namespace autofill""" + +def parse_schema(input_file, output_files): + schema = {} + with io.open(input_file, 'r', encoding='utf-8') as input_handle: + schema = json.load(input_handle) + + def write_to_handle(generator, output_file): + include_guard = re.sub(r'\W', '_', output_file.upper()) +'_' + with io.open(output_file, 'w', encoding='utf-8') as output_handle: + for line in generator(schema, include_guard): + line += '\n' + # unicode() exists and is necessary only in Python 2, not in Python 3. + if sys.version_info[0] < 3: + line = unicode(s, 'utf-8') + output_handle.write(line) + + write_to_handle(generate_cpp_enums_header, output_files[0]) + write_to_handle(generate_cpp_functions_header, output_files[1]) + +if __name__ == '__main__': + parser = argparse.ArgumentParser( + description='Transpiles an Autofill AI schema from JSON to C++.') + parser.add_argument( + '--input', + metavar='schema.json', + required=True, + type=str, + help='JSON file containing the schema') + parser.add_argument( + '--output', + metavar='out.h', + required=True, + type=str, + nargs=2, + help=( + 'C++ files to be generated: first the header for the' + ' entity/attribute-type enums and second the source file for the' + ' function implementations' + ), + ) + args = parser.parse_args() + if not args.input or not args.output: + parser.print_help() + else: + parse_schema(args.input, args.output)
diff --git a/components/autofill/core/browser/field_types.h b/components/autofill/core/browser/field_types.h index 0cef2b3..35bad54 100644 --- a/components/autofill/core/browser/field_types.h +++ b/components/autofill/core/browser/field_types.h
@@ -508,11 +508,8 @@ }; template <> -struct DenseSetTraits<FieldType> { - static constexpr FieldType kMinValue = NO_SERVER_DATA; - static constexpr FieldType kMaxValue = MAX_VALID_FIELD_TYPE; - static constexpr bool kPacked = false; -}; +struct DenseSetTraits<FieldType> + : EnumDenseSetTraits<FieldType, NO_SERVER_DATA, MAX_VALID_FIELD_TYPE> {}; using FieldTypeSet = DenseSet<FieldType>;
diff --git a/components/autofill/core/browser/foundations/browser_autofill_manager.cc b/components/autofill/core/browser/foundations/browser_autofill_manager.cc index 5c06196..741602bd 100644 --- a/components/autofill/core/browser/foundations/browser_autofill_manager.cc +++ b/components/autofill/core/browser/foundations/browser_autofill_manager.cc
@@ -1378,9 +1378,9 @@ std::vector<Suggestion> plus_address_suggestions = client().GetPlusAddressDelegate()->GetSuggestionsFromPlusAddresses( plus_addresses, client().GetLastCommittedPrimaryMainFrameOrigin(), - client().IsOffTheRecord(), form, + client().IsOffTheRecord(), form, field, GetFieldTypeGroupsFromFormStructure(form_structure), - password_form_classification, field.global_id(), trigger_source); + password_form_classification, trigger_source); MixPlusAddressAndAddressSuggestions( std::move(plus_address_suggestions), std::move(suggestions), @@ -1464,9 +1464,9 @@ std::vector<Suggestion> plus_address_suggestions = client().GetPlusAddressDelegate()->GetSuggestionsFromPlusAddresses( plus_addresses, client().GetLastCommittedPrimaryMainFrameOrigin(), - client().IsOffTheRecord(), form, + client().IsOffTheRecord(), form, field, GetFieldTypeGroupsFromFormStructure(form_structure), - password_form_classification, field.global_id(), trigger_source); + password_form_classification, trigger_source); barrier_callback.Run(std::move(plus_address_suggestions)); }
diff --git a/components/autofill/core/browser/integrators/autofill_plus_address_delegate.h b/components/autofill/core/browser/integrators/autofill_plus_address_delegate.h index d3c232e..a892457 100644 --- a/components/autofill/core/browser/integrators/autofill_plus_address_delegate.h +++ b/components/autofill/core/browser/integrators/autofill_plus_address_delegate.h
@@ -97,9 +97,9 @@ const url::Origin& origin, bool is_off_the_record, const FormData& focused_form, + const FormFieldData& focused_field, const base::flat_map<FieldGlobalId, FieldTypeGroup>& form_field_types, const PasswordFormClassification& focused_form_classification, - const FieldGlobalId& focused_field_id, AutofillSuggestionTriggerSource trigger_source) = 0; // Returns the "Manage plus addresses..." suggestion which redirects the user
diff --git a/components/autofill/core/browser/integrators/mock_autofill_plus_address_delegate.h b/components/autofill/core/browser/integrators/mock_autofill_plus_address_delegate.h index a924ece..ab0c78e9 100644 --- a/components/autofill/core/browser/integrators/mock_autofill_plus_address_delegate.h +++ b/components/autofill/core/browser/integrators/mock_autofill_plus_address_delegate.h
@@ -39,9 +39,9 @@ const url::Origin&, bool, const FormData&, + const FormFieldData&, (const base::flat_map<FieldGlobalId, FieldTypeGroup>&), const PasswordFormClassification&, - const FieldGlobalId&, AutofillSuggestionTriggerSource), (override)); MOCK_METHOD(Suggestion, GetManagePlusAddressSuggestion, (), (const override));
diff --git a/components/autofill/core/browser/metrics/form_interactions_ukm_logger.h b/components/autofill/core/browser/metrics/form_interactions_ukm_logger.h index e7aa1c4a..a5bcb62 100644 --- a/components/autofill/core/browser/metrics/form_interactions_ukm_logger.h +++ b/components/autofill/core/browser/metrics/form_interactions_ukm_logger.h
@@ -77,10 +77,10 @@ kMaxValue = kWasFocused }; - struct FormEventSetTraits : public DenseSetTraits<FormEvent> { - static constexpr FormEvent kMaxValue = - static_cast<FormEvent>(base::to_underlying(NUM_FORM_EVENTS) - 1); - }; + using FormEventSetTraits = + EnumDenseSetTraits<FormEvent, + static_cast<FormEvent>(0), + static_cast<FormEvent>(NUM_FORM_EVENTS - 1)>; using FormEventSet = DenseSet<FormEvent, FormEventSetTraits>; explicit FormInteractionsUkmLogger(AutofillClient* autofill_client);
diff --git a/components/autofill/core/browser/suggestions/payments/payments_suggestion_generator.cc b/components/autofill/core/browser/suggestions/payments/payments_suggestion_generator.cc index c86cfcb..0a8f877 100644 --- a/components/autofill/core/browser/suggestions/payments/payments_suggestion_generator.cc +++ b/components/autofill/core/browser/suggestions/payments/payments_suggestion_generator.cc
@@ -688,6 +688,24 @@ return u""; } +#if BUILDFLAG(IS_ANDROID) +std::u16string CreateCardInfoRetrievalIphDescriptionText( + Suggestion suggestion) { + std::u16string description_text; + if (!suggestion.iph_metadata.iph_params.empty() && + !suggestion.iph_metadata.iph_params.front().empty()) { + description_text = l10n_util::GetStringFUTF16( + IDS_AUTOFILL_CARD_INFO_RETRIEVAL_SUGGESTION_IPH_BUBBLE_LABEL, + suggestion.iph_metadata.iph_params.front()); + } else { + description_text = l10n_util::GetStringUTF16( + IDS_AUTOFILL_CARD_INFO_RETRIEVAL_SUGGESTION_IPH_BUBBLE_FALLBACK_LABEL); + } + + return description_text; +} +#endif // BUILDFLAG(IS_ANDROID) + // Helper function to decide whether to show the virtual card option for // `candidate_card`. // TODO(crbug.com/326950201): Pass the argument by reference. @@ -826,6 +844,10 @@ &feature_engagement::kIPHAutofillCardInfoRetrievalSuggestionFeature); suggestion.iph_metadata.iph_params = { GetDisplayNameForIssuerId(credit_card.issuer_id())}; +#if BUILDFLAG(IS_ANDROID) + suggestion.iph_description_text = + CreateCardInfoRetrievalIphDescriptionText(suggestion); +#endif // BUILDFLAG(IS_ANDROID) } // For virtual cards, make some adjustments for the suggestion contents.
diff --git a/components/autofill/core/browser/suggestions/payments/payments_suggestion_generator_unittest.cc b/components/autofill/core/browser/suggestions/payments/payments_suggestion_generator_unittest.cc index 34c489262..5ef8bc8 100644 --- a/components/autofill/core/browser/suggestions/payments/payments_suggestion_generator_unittest.cc +++ b/components/autofill/core/browser/suggestions/payments/payments_suggestion_generator_unittest.cc
@@ -2807,8 +2807,9 @@ CreditCard::CardInfoRetrievalEnrollmentState:: kRetrievalUnenrolledAndEligible)); -// Verify that the card info retrieval enrolled suggestion `feature` and -// `iph_params` are set when card info retrieval enrollment state is enrolled. +// Verify that the card info retrieval enrolled suggestion `feature`, +// `iph_params` and `iph_description text` are set when card info retrieval +// enrollment state is enrolled. TEST_P(SuggestionIphBubbleTest, CreateCreditCardSuggestion_CardInfoRetrievalSuggestion) { CreditCard server_card = CreateServerCard(); @@ -2832,6 +2833,49 @@ card_info_retrieval_enrollment_state() == CreditCard::CardInfoRetrievalEnrollmentState::kRetrievalEnrolled, card_number_field_suggestion.iph_metadata.iph_params == kDiplayName); + +#if BUILDFLAG(IS_ANDROID) + std::u16string expected_description = + u"You can autofill this card because your PayPay account is linked to " + u"Google Pay."; + EXPECT_EQ( + card_info_retrieval_enrollment_state() == + CreditCard::CardInfoRetrievalEnrollmentState::kRetrievalEnrolled, + expected_description == + card_number_field_suggestion.iph_description_text); +#endif +} + +// Verify that the card info retrieval enrolled suggestion `feature` and +// `iph_description text` are set when card info retrieval enrollment state is +// enrolled but issuer_id is not set. +TEST_P(SuggestionIphBubbleTest, + CreateCreditCardSuggestion_CardInfoRetrievalSuggestion_WithoutIssuerId) { + CreditCard server_card = CreateServerCard(); + server_card.set_card_info_retrieval_enrollment_state( + card_info_retrieval_enrollment_state()); + + Suggestion card_number_field_suggestion = CreateCreditCardSuggestionForTest( + server_card, *autofill_client(), CREDIT_CARD_NUMBER, + /*virtual_card_option=*/false, + /*card_linked_offer_available=*/false); + + EXPECT_EQ( + card_info_retrieval_enrollment_state() == + CreditCard::CardInfoRetrievalEnrollmentState::kRetrievalEnrolled, + card_number_field_suggestion.iph_metadata.feature == + &feature_engagement::kIPHAutofillCardInfoRetrievalSuggestionFeature); + +#if BUILDFLAG(IS_ANDROID) + std::u16string expected_description = + u"You can autofill this card because your account is linked to " + u"Google Pay."; + EXPECT_EQ( + card_info_retrieval_enrollment_state() == + CreditCard::CardInfoRetrievalEnrollmentState::kRetrievalEnrolled, + expected_description == + card_number_field_suggestion.iph_description_text); +#endif } // Params of GetFilteredCardsToSuggestTest:
diff --git a/components/autofill/core/common/autofill_features.cc b/components/autofill/core/common/autofill_features.cc index b205dcde..6a8bf38 100644 --- a/components/autofill/core/common/autofill_features.cc +++ b/components/autofill/core/common/autofill_features.cc
@@ -14,6 +14,14 @@ BASE_FEATURE(kAutofillAcrossIframesIos, "AutofillAcrossIframesIos", base::FEATURE_DISABLED_BY_DEFAULT); + +// Throttles child frame extraction to a maximum number of child frames that +// can be extracted by applying the following rules: (1) remove the child frames +// from an individual form that busts the limit and (2) stop extracting child +// frames on other forms once the limit is reached across forms. +BASE_FEATURE(kAutofillAcrossIframesIosThrottling, + "AutofillAcrossIframesIosThrottling", + base::FEATURE_DISABLED_BY_DEFAULT); // LINT.ThenChange(//components/autofill/ios/form_util/resources/autofill_form_features.ts:autofill_across_iframes_ios) // Controls whether to trigger form extraction when detecting a form activity on
diff --git a/components/autofill/core/common/autofill_features.h b/components/autofill/core/common/autofill_features.h index e85870b..c35a053 100644 --- a/components/autofill/core/common/autofill_features.h +++ b/components/autofill/core/common/autofill_features.h
@@ -16,6 +16,8 @@ // All features in alphabetical order. COMPONENT_EXPORT(AUTOFILL) BASE_DECLARE_FEATURE(kAutofillAcrossIframesIos); COMPONENT_EXPORT(AUTOFILL) +BASE_DECLARE_FEATURE(kAutofillAcrossIframesIosThrottling); +COMPONENT_EXPORT(AUTOFILL) BASE_DECLARE_FEATURE(kAutofillAcrossIframesIosTriggerFormExtraction); COMPONENT_EXPORT(AUTOFILL) BASE_DECLARE_FEATURE(kAutofillAddressSuggestionsOnTyping);
diff --git a/components/autofill/core/common/dense_set.h b/components/autofill/core/common/dense_set.h index 41d6608..dc2bf31d 100644 --- a/components/autofill/core/common/dense_set.h +++ b/components/autofill/core/common/dense_set.h
@@ -18,6 +18,7 @@ #include "base/containers/span.h" #include "base/memory/raw_ptr.h" #include "base/numerics/safe_conversions.h" +#include "base/types/cxx23_to_underlying.h" namespace autofill { @@ -149,23 +150,74 @@ Word word_; }; +template <typename T, typename Traits> +concept ValidDenseSetTraits = + std::integral<typename Traits::UnderlyingType> && + std::same_as<decltype(Traits::from_underlying( + std::declval<typename Traits::UnderlyingType>())), + T> && + std::same_as<decltype(Traits::to_underlying(std::declval<T>())), + typename Traits::UnderlyingType> && + std::same_as<decltype(Traits::kMinValue), const T> && + std::same_as<decltype(Traits::kMaxValue), const T> && + std::same_as<decltype(Traits::kPacked), const bool>; + } // namespace internal -template <typename T> -struct DenseSetTraits { - static constexpr T kMinValue = T(0); - static constexpr T kMaxValue = T::kMaxValue; +// Helper for traits for integer DenseSets. +template <typename T, T kMinValueT, T kMaxValueT> + requires(std::is_integral_v<T>) +struct IntegralDenseSetTraits { + using UnderlyingType = T; + + static constexpr T from_underlying(UnderlyingType x) { return x; } + static constexpr UnderlyingType to_underlying(T x) { return x; } + + static constexpr T kMinValue = kMinValueT; + static constexpr T kMaxValue = kMaxValueT; static constexpr bool kPacked = false; }; -// A set container with a std::set<T>-like interface for integral or enum types -// T that have a dense and small representation as unsigned integers. +// Helper for traits for enum DenseSets. +template <typename T, T kMinValueT, T kMaxValueT> + requires(std::is_enum_v<T>) +struct EnumDenseSetTraits { + using UnderlyingType = std::underlying_type_t<T>; + + static constexpr T from_underlying(UnderlyingType x) { + return static_cast<T>(x); + } + static constexpr UnderlyingType to_underlying(T x) { + return base::to_underlying(x); + } + + static constexpr T kMinValue = kMinValueT; + static constexpr T kMaxValue = kMaxValueT; + static constexpr bool kPacked = false; +}; + +// The default traits. +template <typename T, typename = void> +struct DenseSetTraits {}; + +template <typename T> + requires(std::is_enum_v<T>) +struct DenseSetTraits<T> : public EnumDenseSetTraits<T, T(0), T::kMaxValue> {}; + +// A set container with a std::set<T>-like interface for a type T that has a +// dense and small integral representation. DenseSet is particularly suited for +// enums. // // The order of the elements in the container corresponds to their integer // representation. // +// Traits::UnderlyingType is the integral representation of the stored types. +// Traits::to_underlying() and Traits::from_underlying() convert between T and +// Traits::UnderlyingType. +// // The lower and upper bounds of elements storable in a container are -// [Traits::kMinValue, Traits::kMaxValue]. The default is [T(0), T::kMaxValue]. +// [Traits::kMinValue, Traits::kMaxValue]. +// For enums, the default is [T(0), T::kMaxValue]. // // The `Traits::kPacked` parameter indicates whether the memory consumption of a // DenseSet object should be minimized. That comes at the cost of slightly @@ -182,27 +234,22 @@ // Iterators are invalidated when the owning container is destructed or moved, // or when the element the iterator points to is erased from the container. template <typename T, typename Traits = DenseSetTraits<T>> + requires(internal::ValidDenseSetTraits<T, Traits>) class DenseSet { private: - static_assert(std::is_integral<T>::value || std::is_enum<T>::value); - - // Needed for std::conditional_t. - struct Wrapper { - using type = T; - }; - // For arithmetic on `T`. - using UnderlyingType = typename std::conditional_t<std::is_enum<T>::value, - std::underlying_type<T>, - Wrapper>::type; + using UnderlyingType = typename Traits::UnderlyingType; // The index of a bit in the underlying bitset. Use // value_to_index() and index_to_value() for conversion. using Index = std::make_unsigned_t<UnderlyingType>; - // We can't use `base::to_underlying()` because `T` may be not an enum. static constexpr UnderlyingType to_underlying(T x) { - return static_cast<UnderlyingType>(x); + return Traits::to_underlying(x); + } + + static constexpr T from_underlying(UnderlyingType x) { + return Traits::from_underlying(x); } static_assert(to_underlying(Traits::kMinValue) <= @@ -494,16 +541,16 @@ using Bitset = internal::Bitset<Word, kNumWords>; static constexpr Index value_to_index(T x) { - DCHECK_LE(Traits::kMinValue, x); - DCHECK_LE(x, Traits::kMaxValue); + DCHECK_LE(to_underlying(Traits::kMinValue), to_underlying(x)); + DCHECK_LE(to_underlying(x), to_underlying(Traits::kMaxValue)); return base::checked_cast<Index>(to_underlying(x) - to_underlying(Traits::kMinValue)); } static constexpr T index_to_value(Index i) { DCHECK_LE(i, kMaxBitIndex); - return static_cast<T>(base::checked_cast<UnderlyingType>(i) + - to_underlying(Traits::kMinValue)); + return from_underlying(base::checked_cast<UnderlyingType>(i) + + to_underlying(Traits::kMinValue)); } Bitset bitset_{};
diff --git a/components/autofill/core/common/dense_set_unittest.cc b/components/autofill/core/common/dense_set_unittest.cc index e13536e..f569f70 100644 --- a/components/autofill/core/common/dense_set_unittest.cc +++ b/components/autofill/core/common/dense_set_unittest.cc
@@ -16,29 +16,22 @@ namespace autofill { -template <auto kMinValueP, auto kMaxValueP> -struct DenseSetTraitsWrapper { - static constexpr auto kMinValue = kMinValueP; - static constexpr auto kMaxValue = kMaxValueP; - static constexpr bool kPacked = false; -}; - -template <typename T, T kMinValue = T::kMinValue, T kMaxValue = T::kMaxValue> -using DenseSetWrapper = - DenseSet<T, DenseSetTraitsWrapper<kMinValue, kMaxValue>>; +template <typename T, T kMinValue, T kMaxValue> +using IntDenseSet = + DenseSet<T, IntegralDenseSetTraits<T, kMinValue, kMaxValue>>; TEST(DenseSetTest, size_of) { - static_assert(sizeof(DenseSetWrapper<size_t, 0, 1>) == 1u); - static_assert(sizeof(DenseSetWrapper<size_t, 0, 7>) == 1u); - static_assert(sizeof(DenseSetWrapper<size_t, 0, 8>) == 2u); - static_assert(sizeof(DenseSetWrapper<size_t, 0, 15>) == 2u); - static_assert(sizeof(DenseSetWrapper<size_t, 0, 16>) == 4u); - static_assert(sizeof(DenseSetWrapper<size_t, 0, 31>) == 4u); - static_assert(sizeof(DenseSetWrapper<size_t, 0, 32>) == 8u); - static_assert(sizeof(DenseSetWrapper<size_t, 0, 63>) == 8u); - static_assert(sizeof(DenseSetWrapper<size_t, 0, 64>) == 16u); - static_assert(sizeof(DenseSetWrapper<size_t, 0, 127>) == 16u); - static_assert(sizeof(DenseSetWrapper<size_t, 0, 255>) == 32u); + static_assert(sizeof(IntDenseSet<size_t, 0, 1>) == 1u); + static_assert(sizeof(IntDenseSet<size_t, 0, 7>) == 1u); + static_assert(sizeof(IntDenseSet<size_t, 0, 8>) == 2u); + static_assert(sizeof(IntDenseSet<size_t, 0, 15>) == 2u); + static_assert(sizeof(IntDenseSet<size_t, 0, 16>) == 4u); + static_assert(sizeof(IntDenseSet<size_t, 0, 31>) == 4u); + static_assert(sizeof(IntDenseSet<size_t, 0, 32>) == 8u); + static_assert(sizeof(IntDenseSet<size_t, 0, 63>) == 8u); + static_assert(sizeof(IntDenseSet<size_t, 0, 64>) == 16u); + static_assert(sizeof(IntDenseSet<size_t, 0, 127>) == 16u); + static_assert(sizeof(IntDenseSet<size_t, 0, 255>) == 32u); } TEST(DenseSetTest, initialization) { @@ -95,45 +88,44 @@ { constexpr uint64_t kMax = 10; - constexpr DenseSetWrapper<uint64_t, 0, kMax> set{0, 1, kMax - 2, kMax - 1, - kMax}; + constexpr IntDenseSet<uint64_t, 0, kMax> set{0, 1, kMax - 2, kMax - 1, + kMax}; EXPECT_THAT(std::vector<uint64_t>(set.begin(), set.end()), ElementsAre(0, 1, kMax - 2, kMax - 1, kMax)); } { constexpr uint64_t kMax = kMaxValueForConstexpr; - constexpr DenseSetWrapper<uint64_t, 0, kMax> set{0, 1, kMax - 2, kMax - 1, - kMax}; + constexpr IntDenseSet<uint64_t, 0, kMax> set{0, 1, kMax - 2, kMax - 1, + kMax}; EXPECT_THAT(std::vector<uint64_t>(set.begin(), set.end()), ElementsAre(0, 1, kMax - 2, kMax - 1, kMax)); } { constexpr uint64_t kMax = kMaxValueForConstexpr + 1; - DenseSetWrapper<uint64_t, 0, kMax> set{0, 1, kMax - 2, kMax - 1, kMax}; + IntDenseSet<uint64_t, 0, kMax> set{0, 1, kMax - 2, kMax - 1, kMax}; EXPECT_THAT(std::vector<uint64_t>(set.begin(), set.end()), ElementsAre(0, 1, kMax - 2, kMax - 1, kMax)); } { constexpr uint64_t kMax = kMaxValueForConstexpr + 2; - DenseSetWrapper<uint64_t, 0, kMax> set{0, 1, kMax - 2, kMax - 1, kMax}; + IntDenseSet<uint64_t, 0, kMax> set{0, 1, kMax - 2, kMax - 1, kMax}; EXPECT_THAT(std::vector<uint64_t>(set.begin(), set.end()), ElementsAre(0, 1, kMax - 2, kMax - 1, kMax)); } { constexpr uint64_t kMax = kMaxValueForConstexpr + 100; - DenseSetWrapper<uint64_t, 0, kMax> set{0, 1, kMax - 2, kMax - 1, kMax}; + IntDenseSet<uint64_t, 0, kMax> set{0, 1, kMax - 2, kMax - 1, kMax}; EXPECT_THAT(std::vector<uint64_t>(set.begin(), set.end()), ElementsAre(0, 1, kMax - 2, kMax - 1, kMax)); } } TEST(DenseSetTest, all_non_enum) { - constexpr DenseSetWrapper<int, 0, 10> set = - DenseSetWrapper<int, 0, 10>::all(); + constexpr IntDenseSet<int, 0, 10> set = IntDenseSet<int, 0, 10>::all(); EXPECT_EQ(set.size(), 11u); EXPECT_THAT(std::vector<int>(set.begin(), set.end()), ElementsAre(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10)); @@ -146,9 +138,9 @@ kTwo = 2, kMaxValue = kTwo, }; + using Traits = EnumDenseSetTraits<T, T::kMinusOne, T::kMaxValue>; - constexpr DenseSetWrapper<T, T::kMinusOne> set = - DenseSetWrapper<T, T::kMinusOne>::all(); + constexpr DenseSet<T, Traits> set = DenseSet<T, Traits>::all(); // `set` will contain all values from -1 to 2, including 0 even if 0 doesn't // correspond to any value of `T`. EXPECT_EQ(set.size(), 4u); @@ -158,21 +150,21 @@ TEST(DenseSetTest, data) { { - constexpr DenseSetWrapper<uint64_t, 0, 23> set{0, 1, 2, 3, 4, 20, 23}; + constexpr IntDenseSet<uint64_t, 0, 23> set{0, 1, 2, 3, 4, 20, 23}; EXPECT_THAT( set.data(), ElementsAre((1ULL << 0) | (1ULL << 1) | (1ULL << 2) | (1ULL << 3) | (1ULL << 4) | (1ULL << 20) | (1ULL << 23))); } { - constexpr DenseSetWrapper<uint64_t, 0, 31> set{0, 1, 2, 3, 4, 20, 31}; + constexpr IntDenseSet<uint64_t, 0, 31> set{0, 1, 2, 3, 4, 20, 31}; EXPECT_THAT( set.data(), ElementsAre((1ULL << 0) | (1ULL << 1) | (1ULL << 2) | (1ULL << 3) | (1ULL << 4) | (1ULL << 20) | (1ULL << 31))); } { - constexpr DenseSetWrapper<uint64_t, 0, 63> set{0, 1, 63}; + constexpr IntDenseSet<uint64_t, 0, 63> set{0, 1, 63}; EXPECT_THAT(set.data(), ElementsAre((1ULL << 0) | (1ULL << 1) | (1ULL << 63))); } @@ -188,7 +180,9 @@ kFive = 5, kMaxValue = kFive, }; - DenseSetWrapper<T, T::kMinusOne> s; + using Traits = EnumDenseSetTraits<T, T::kMinusOne, T::kMaxValue>; + + DenseSet<T, Traits> s; s.insert(T::kTwo); s.insert(T::kFour); s.insert(T::kOne); @@ -230,8 +224,9 @@ kFive = 5, kMaxValue = kFive }; + using Traits = EnumDenseSetTraits<T, T::kMinusOne, T::kMaxValue>; - DenseSetWrapper<T, T::kMinusOne> s; + DenseSet<T, Traits> s; s.insert(T::kTwo); s.insert(T::kFour); s.insert(T::kOne); @@ -271,8 +266,9 @@ kFive = 5, kMaxValue = kFive }; + using Traits = EnumDenseSetTraits<T, T::kMinusOne, T::kMaxValue>; - DenseSetWrapper<T, T::kMinusOne> s; + DenseSet<T, Traits> s; s.insert(T::kTwo); s.insert(T::kFour); s.insert(T::kOne); @@ -315,8 +311,9 @@ kFive = 5, kMaxValue = kFive }; + using Traits = EnumDenseSetTraits<T, T::kMinusOne, T::kMaxValue>; - DenseSetWrapper<T, T::kMinusOne> s; + DenseSet<T, Traits> s; s.insert(T::kTwo); s.insert(T::kFour); s.insert(T::kOne); @@ -353,7 +350,7 @@ EXPECT_EQ(s.find(T::kFour), s.lower_bound(T::kFour)); EXPECT_EQ(s.find(T::kFive), s.lower_bound(T::kFive)); - DenseSetWrapper<T, T::kMinusOne> t; + DenseSet<T, Traits> t; EXPECT_TRUE(t.empty()); EXPECT_TRUE(t.contains_none({})); EXPECT_FALSE(t.contains_any({})); @@ -389,8 +386,9 @@ kFour = 4, kFive = 5 }; + using Traits = EnumDenseSetTraits<T, T::kMinusOne, T::kFive>; - DenseSetWrapper<T, T::kMinusOne, T::kFive> s; + DenseSet<T, Traits> s; s.insert(T::kTwo); s.insert(T::kFour); s.insert(T::kOne); @@ -463,7 +461,7 @@ // const int kFive = 5; const int kMaxValue = 5; - DenseSetWrapper<int, 0, kMaxValue> s; + IntDenseSet<int, 0, kMaxValue> s; EXPECT_TRUE(s.empty()); EXPECT_EQ(s.size(), 0u); EXPECT_EQ(s.max_size(), 6u); @@ -487,7 +485,7 @@ // const uint64_t kFive = 5; const uint64_t kMaxValue = 5; - DenseSetWrapper<uint64_t, 0, kMaxValue> s; + IntDenseSet<uint64_t, 0, kMaxValue> s; s.insert(kTwo); s.insert(kFour); s.insert(kOne); @@ -498,7 +496,7 @@ EXPECT_EQ(it, std::make_pair(set.find(value), took_place)); }; - DenseSetWrapper<uint64_t, 0, kMaxValue> t; + IntDenseSet<uint64_t, 0, kMaxValue> t; EXPECT_NE(s, t); EXPECT_INSERTION(t, kTwo, true); EXPECT_INSERTION(t, kTwo, false); @@ -601,8 +599,8 @@ TEST(DenseSetTest, intersect) { constexpr uint64_t kMaxValue = 5; - DenseSetWrapper<uint64_t, 0, kMaxValue> s = {1, 3, 4}; - DenseSetWrapper<uint64_t, 0, kMaxValue> t = {1, 2, 4}; + IntDenseSet<uint64_t, 0, kMaxValue> s = {1, 3, 4}; + IntDenseSet<uint64_t, 0, kMaxValue> t = {1, 2, 4}; s.intersect(t); // Expect that only 1 and 4 remain. t.erase(2); @@ -611,7 +609,7 @@ TEST(DenseSetTest, std_set) { constexpr uint64_t kMaxValue = 50; - DenseSetWrapper<uint64_t, 0, kMaxValue> dense_set; + IntDenseSet<uint64_t, 0, kMaxValue> dense_set; std::set<uint64_t> std_set; auto expect_equivalence = [&] {
diff --git a/components/autofill/core/common/mojom/autofill_types.mojom b/components/autofill/core/common/mojom/autofill_types.mojom index 58c0c87..9c7f775 100644 --- a/components/autofill/core/common/mojom/autofill_types.mojom +++ b/components/autofill/core/common/mojom/autofill_types.mojom
@@ -502,7 +502,7 @@ bool is_generation_element_password_type; mojo_base.mojom.TextDirection text_direction; FormData form_data; - bool input_field_empty; + bool generation_rejected; }; // autofill::PasswordSuggestionRequest
diff --git a/components/autofill/core/common/mojom/autofill_types_mojom_traits.cc b/components/autofill/core/common/mojom/autofill_types_mojom_traits.cc index 6c935b6..664cfe6 100644 --- a/components/autofill/core/common/mojom/autofill_types_mojom_traits.cc +++ b/components/autofill/core/common/mojom/autofill_types_mojom_traits.cc
@@ -609,7 +609,7 @@ out->max_length = data.max_length(); out->is_generation_element_password_type = data.is_generation_element_password_type(); - out->input_field_empty = data.input_field_empty(); + out->generation_rejected = data.generation_rejected(); return data.ReadGenerationElementId(&out->generation_element_id) && data.ReadGenerationElement(&out->generation_element) &&
diff --git a/components/autofill/core/common/mojom/autofill_types_mojom_traits.h b/components/autofill/core/common/mojom/autofill_types_mojom_traits.h index 4d5d6f9..79a360a 100644 --- a/components/autofill/core/common/mojom/autofill_types_mojom_traits.h +++ b/components/autofill/core/common/mojom/autofill_types_mojom_traits.h
@@ -693,9 +693,9 @@ return r.form_data; } - static bool input_field_empty( + static bool generation_rejected( const autofill::password_generation::PasswordGenerationUIData& r) { - return r.input_field_empty; + return r.generation_rejected; } static bool Read(
diff --git a/components/autofill/core/common/password_generation_util.cc b/components/autofill/core/common/password_generation_util.cc index 1bde086..69df5273 100644 --- a/components/autofill/core/common/password_generation_util.cc +++ b/components/autofill/core/common/password_generation_util.cc
@@ -20,7 +20,7 @@ bool is_generation_element_password_type, base::i18n::TextDirection text_direction, const FormData& form_data, - bool input_field_empty) + bool generation_rejected) : bounds(bounds), max_length(max_length), generation_element(generation_element), @@ -28,7 +28,7 @@ is_generation_element_password_type(is_generation_element_password_type), text_direction(text_direction), form_data(form_data), - input_field_empty(input_field_empty) {} + generation_rejected(generation_rejected) {} PasswordGenerationUIData::PasswordGenerationUIData() = default; PasswordGenerationUIData::PasswordGenerationUIData(
diff --git a/components/autofill/core/common/password_generation_util.h b/components/autofill/core/common/password_generation_util.h index ac89419..79642d802 100644 --- a/components/autofill/core/common/password_generation_util.h +++ b/components/autofill/core/common/password_generation_util.h
@@ -164,8 +164,8 @@ // The form associated with the password field. FormData form_data; - // Whether the password input field is empty. - bool input_field_empty = false; + // Whether the password generation was rejected by the user. + bool generation_rejected = false; }; void LogPasswordGenerationEvent(PasswordGenerationEvent event);
diff --git a/components/autofill/ios/browser/resources/autofill_controller.js b/components/autofill/ios/browser/resources/autofill_controller.js index d9eb408..c3a92e0 100644 --- a/components/autofill/ios/browser/resources/autofill_controller.js +++ b/components/autofill/ios/browser/resources/autofill_controller.js
@@ -461,6 +461,13 @@ const webForms = document.forms; let numFieldsSeen = 0; + let numFramesSeen = 0; + + // Returns true if the child frames can be extracted. + const canExtractChildFrames = () => + numFramesSeen <= fill_constants.MAX_EXTRACTABLE_FRAMES || + !gCrWeb.autofill_form_features.isAutofillAcrossIframesThrottlingEnabled(); + for (let formIndex = 0; formIndex < webForms.length; ++formIndex) { /** @type {HTMLFormElement} */ const formElement = webForms[formIndex]; @@ -478,7 +485,8 @@ const form = new __gCrWeb['common'].JSONSafeObject(); if (!__gCrWeb.fill.webFormElementToFormData( - window, formElement, null, form, /*field=*/ null)) { + window, formElement, null, form, /*field=*/ null, + canExtractChildFrames())) { continue; } @@ -487,16 +495,33 @@ break; } + numFramesSeen += (form.child_frames ?? []).length; + // Clear the frames for the form if the limit was busted after parsing this + // form. Child frames will still be registered for this form but won't be + // part for the frame tree for the form. Child frames for the forms + // following this one won't be extracted nor registered. + if (!canExtractChildFrames()) { + form.child_frames = []; + } + if (isFormInteresting_(form)) { forms.push(form); } } // Look for more extractable fields outside of forms. - const unownedForm = - extractUnownedFields(restrictUnownedFieldsToFormlessCheckout); + const unownedForm = extractUnownedFields( + restrictUnownedFieldsToFormlessCheckout, canExtractChildFrames()); if (unownedForm) { + numFramesSeen += (unownedForm.child_frames ?? []).length; + if (!canExtractChildFrames()) { + // Do not associate child frames with the form if the limit of frames + // across forms was reached. Forms that were parsed before this one will + // still keep their child frames. + unownedForm.child_frames = []; + } + numFieldsSeen += unownedForm['fields'].length; if (numFieldsSeen <= fill_constants.MAX_EXTRACTABLE_FIELDS) { if (isFormInteresting_(unownedForm)) {
diff --git a/components/autofill/ios/form_util/autofill_form_features_injector.mm b/components/autofill/ios/form_util/autofill_form_features_injector.mm index 06f52f56..3772b57b 100644 --- a/components/autofill/ios/form_util/autofill_form_features_injector.mm +++ b/components/autofill/ios/form_util/autofill_form_features_injector.mm
@@ -40,6 +40,11 @@ base::FeatureList::IsEnabled(features::kAutofillAcrossIframesIos)); AutofillFormFeaturesJavaScriptFeature::GetInstance() + ->SetAutofillAcrossIframesThrottling( + web_frame, base::FeatureList::IsEnabled( + features::kAutofillAcrossIframesIosThrottling)); + + AutofillFormFeaturesJavaScriptFeature::GetInstance() ->SetAutofillIsolatedContentWorld( web_frame, base::FeatureList::IsEnabled(kAutofillIsolatedWorldForJavascriptIos));
diff --git a/components/autofill/ios/form_util/autofill_form_features_injector_unittest.mm b/components/autofill/ios/form_util/autofill_form_features_injector_unittest.mm index 32e6c112..cfcaced 100644 --- a/components/autofill/ios/form_util/autofill_form_features_injector_unittest.mm +++ b/components/autofill/ios/form_util/autofill_form_features_injector_unittest.mm
@@ -59,7 +59,9 @@ ScopedFeatureList features; features.InitWithFeatures( /* enabled_features= */ {kAutofillIsolatedWorldForJavascriptIos, - autofill::features::kAutofillAcrossIframesIos}, + autofill::features::kAutofillAcrossIframesIos, + autofill::features:: + kAutofillAcrossIframesIosThrottling}, /* disabled_features= */ {}); AutofillFormFeaturesInjector injector(&fake_web_state_, @@ -69,11 +71,12 @@ for (auto* web_frame : fake_web_frames_manager_->GetAllWebFrames()) { auto* fake_frame = static_cast<FakeWebFrame*>(web_frame); - EXPECT_THAT(fake_frame->GetJavaScriptCallHistory(), - UnorderedElementsAre(u"__gCrWeb.autofill_form_features." - u"setAutofillIsolatedContentWorld(true);", - u"__gCrWeb.autofill_form_features." - u"setAutofillAcrossIframes(true);")); + EXPECT_THAT( + fake_frame->GetJavaScriptCallHistory(), + UnorderedElementsAre( + uR"(__gCrWeb.autofill_form_features.setAutofillIsolatedContentWorld(true);)", + uR"(__gCrWeb.autofill_form_features.setAutofillAcrossIframes(true);)", + uR"(__gCrWeb.autofill_form_features.setAutofillAcrossIframesThrottling(true);)")); } }
diff --git a/components/autofill/ios/form_util/autofill_form_features_java_script_feature.h b/components/autofill/ios/form_util/autofill_form_features_java_script_feature.h index de0e3e8..096cf9d 100644 --- a/components/autofill/ios/form_util/autofill_form_features_java_script_feature.h +++ b/components/autofill/ios/form_util/autofill_form_features_java_script_feature.h
@@ -25,6 +25,10 @@ // Enables/disables the AutofillAcrossIframes feature in `frame`. void SetAutofillAcrossIframes(web::WebFrame* frame, bool enabled); + // Enables/disables the throttling of child frame extraction for + // AutofillAcrossIframes in `frame`. + void SetAutofillAcrossIframesThrottling(web::WebFrame* frame, bool enabled); + // Enables/disables the renderer side behaviours in `frame` needed for // Autofill features to work in an isolated content world. void SetAutofillIsolatedContentWorld(web::WebFrame* frame, bool enabled);
diff --git a/components/autofill/ios/form_util/autofill_form_features_java_script_feature.mm b/components/autofill/ios/form_util/autofill_form_features_java_script_feature.mm index ac2e660..8f86bd8 100644 --- a/components/autofill/ios/form_util/autofill_form_features_java_script_feature.mm +++ b/components/autofill/ios/form_util/autofill_form_features_java_script_feature.mm
@@ -43,6 +43,15 @@ base::Value::List().Append(enabled)); } +void AutofillFormFeaturesJavaScriptFeature::SetAutofillAcrossIframesThrottling( + web::WebFrame* frame, + bool enabled) { + CHECK(frame); + frame->CallJavaScriptFunction( + "autofill_form_features.setAutofillAcrossIframesThrottling", + base::Value::List().Append(enabled)); +} + void AutofillFormFeaturesJavaScriptFeature::SetAutofillIsolatedContentWorld( web::WebFrame* frame, bool enabled) {
diff --git a/components/autofill/ios/form_util/resources/autofill_form_features.ts b/components/autofill/ios/form_util/resources/autofill_form_features.ts index 716652e..d6114a6 100644 --- a/components/autofill/ios/form_util/resources/autofill_form_features.ts +++ b/components/autofill/ios/form_util/resources/autofill_form_features.ts
@@ -16,6 +16,12 @@ * Corresponds to autofill::feature::AutofillAcrossIframesIos. */ let autofillAcrossIframes: boolean = false; + +/** + * True if the throttling of child frames for autofill across iframes is + * enabled. + */ +let autofillAcrossIframesThrottling: boolean = false; // LINT.ThenChange(//components/autofill/core/common/autofill_features.cc:autofill_across_iframes_ios) // LINT.IfChange(autofill_isolated_content_world) @@ -41,6 +47,20 @@ } /** + * @see autofillAcrossIframesThrottling + */ +function setAutofillAcrossIframesThrottling(enabled: boolean): void { + autofillAcrossIframesThrottling = enabled; +} + +/** + * @see setAutofillAcrossIframesThrottling + */ +function isAutofillAcrossIframesThrottlingEnabled(): boolean { + return autofillAcrossIframesThrottling; +} + +/** * @see autofillIsolatedContentWorld */ function setAutofillIsolatedContentWorld(enabled: boolean): void { @@ -59,6 +79,8 @@ gCrWeb.autofill_form_features = { setAutofillAcrossIframes, isAutofillAcrossIframesEnabled, + setAutofillAcrossIframesThrottling, + isAutofillAcrossIframesThrottlingEnabled, setAutofillIsolatedContentWorld, isAutofillIsolatedContentWorldEnabled, };
diff --git a/components/autofill/ios/form_util/resources/fill.ts b/components/autofill/ios/form_util/resources/fill.ts index 0aa7ad3..aeeeb8ab 100644 --- a/components/autofill/ios/form_util/resources/fill.ts +++ b/components/autofill/ios/form_util/resources/fill.ts
@@ -408,8 +408,8 @@ gCrWeb.fill.webFormElementToFormData = function( frame: Window, formElement: HTMLFormElement, formControlElement: fillConstants.FormControlElement, - form: fillUtil.AutofillFormData, - field?: fillUtil.AutofillFormFieldData): boolean { + form: fillUtil.AutofillFormData, field?: fillUtil.AutofillFormFieldData, + extractChildFrames: boolean = true): boolean { if (!frame) { return false; } @@ -435,11 +435,19 @@ const controlElements = gCrWeb.form.getFormControlElements(formElement); - const iframeElements = - gCrWeb.autofill_form_features.isAutofillAcrossIframesEnabled() ? + let iframeElements = extractChildFrames && + gCrWeb.autofill_form_features.isAutofillAcrossIframesEnabled() ? gCrWeb.form.getIframeElements(formElement) : []; + // To avoid performance bottlenecks, do not keep child frames if their + // quantity exceeds the allowed threshold. + if (iframeElements.length > fillConstants.MAX_EXTRACTABLE_FRAMES && + gCrWeb.autofill_form_features + .isAutofillAcrossIframesThrottlingEnabled()) { + iframeElements = []; + } + return formOrFieldsetsToFormData( formElement, formControlElement, /*fieldsets=*/[], controlElements, iframeElements, form, field); @@ -654,8 +662,15 @@ form.origin = removeQueryAndReferenceFromURL(frame.origin); form.action = ''; + // To avoid performance bottlenecks, do not keep child frames if their + // quantity exceeds the allowed threshold. + if (iframeElements.length > fillConstants.MAX_EXTRACTABLE_FRAMES && + gCrWeb.autofill_form_features + .isAutofillAcrossIframesThrottlingEnabled()) { + iframeElements = []; + } + if (!restrictUnownedFieldsToFormlessCheckout) { - // TODO(crbug.com/40266126): Pass iframe elements. return formOrFieldsetsToFormData( /*formElement=*/ null, /*formControlElement=*/ null, fieldsets, controlElements, /*iframeElements=*/ iframeElements, form); @@ -673,7 +688,6 @@ for (let index = 0; index < count; index++) { const keyword = keywords[index]!; if (title.includes(keyword) || path.includes(keyword)) { - // TODO(crbug.com/40266126): Pass iframe elements. return formOrFieldsetsToFormData( /* formElement= */ null, /* formControlElement= */ null, fieldsets, controlElements, /* iframeElements= */ iframeElements, form);
diff --git a/components/autofill/ios/form_util/resources/fill_constants.ts b/components/autofill/ios/form_util/resources/fill_constants.ts index 2a7cb43..fce9ca3 100644 --- a/components/autofill/ios/form_util/resources/fill_constants.ts +++ b/components/autofill/ios/form_util/resources/fill_constants.ts
@@ -37,6 +37,10 @@ */ const MAX_EXTRACTABLE_FIELDS = 200; +// The maximum number of frames we are willing to extract, due to computational +// costs. +const MAX_EXTRACTABLE_FRAMES = 20; + /** * A value for the "presentation" role. * @@ -73,6 +77,7 @@ MAX_DATA_LENGTH, MAX_STRING_LENGTH, MAX_EXTRACTABLE_FIELDS, + MAX_EXTRACTABLE_FRAMES, ROLE_ATTRIBUTE_PRESENTATION, RENDERER_ID_NOT_SET, UNIQUE_ID_ATTRIBUTE,
diff --git a/components/autofill_payments_strings.grdp b/components/autofill_payments_strings.grdp index c07a0f0..abfdf46 100644 --- a/components/autofill_payments_strings.grdp +++ b/components/autofill_payments_strings.grdp
@@ -927,12 +927,15 @@ <message name="IDS_AUTOFILL_VIRTUAL_CARD_DISABLED_SUGGESTION_OPTION_VALUE" desc="Text to be displayed for a virtual card option in the credit card suggestion list when the virtual card is disabled(opted-out) by the merchant. This suggestion will be grayed-out and the user will not be able to preview or select this option."> Merchant doesn't accept this virtual card </message> - <message name="IDS_AUTOFILL_CARD_INFO_RETRIEVAL_SUGGESTION_IPH_BUBBLE_LABEL" desc="Text shown in the `In-Product Help(IPH)` bubble for card info retrieval suggestions on Chrome Desktop. It is specifically for card info retrieval enrolled card. Card info will be copied after the user clicks the suggestion."> + <message name="IDS_AUTOFILL_CARD_INFO_RETRIEVAL_SUGGESTION_IPH_BUBBLE_LABEL" desc="Text shown in the `In-Product Help(IPH)` bubble for card info retrieval suggestions on Chrome Desktop and Android. It is specifically for card info retrieval enrolled card. Card info will be copied after the user clicks the suggestion."> You can autofill this card because your <ph name="CARD_ISSUER_NAME">$1<ex>PayPay</ex></ph> account is linked to Google Pay. </message> <message name="IDS_AUTOFILL_CARD_INFO_RETRIEVAL_SUGGESTION_IPH_BUBBLE_LABEL_SCREENREADER" desc="Text shown in the `In-Product Help(IPH)` bubble for card info retrieval suggestions on Chrome Desktop. It is specifically for card info retrieval enrolled card. Card info will be copied after the user clicks the suggestion."> Now you can autofill your <ph name="CARD_ISSUER_NAME">$1<ex>PayPay</ex></ph> cards because your <ph name="CARD_ISSUER_NAME">$1<ex>PayPay</ex></ph> account is linked to Google Pay. </message> + <message name="IDS_AUTOFILL_CARD_INFO_RETRIEVAL_SUGGESTION_IPH_BUBBLE_FALLBACK_LABEL" desc="Text shown in the `In-Product Help(IPH)` bubble for card info retrieval suggestions on Chrome Android when the issuer_id is not present in the card. It is specifically for card info retrieval enrolled card. Card info will be copied after the user clicks the suggestion."> + You can autofill this card because your account is linked to Google Pay. + </message> <message name="IDS_AUTOFILL_DISABLED_VIRTUAL_CARD_SUGGESTION_IPH_BUBBLE_LABEL_DESKTOP" desc="Text shown in the `In-Product Help(IPH)` bubble for disabled and grayed out virtual card suggestions on Chrome Desktop."> Cards not accepted by this merchant are disabled </message>
diff --git a/components/autofill_payments_strings_grdp/IDS_AUTOFILL_CARD_INFO_RETRIEVAL_SUGGESTION_IPH_BUBBLE_FALLBACK_LABEL.png.sha1 b/components/autofill_payments_strings_grdp/IDS_AUTOFILL_CARD_INFO_RETRIEVAL_SUGGESTION_IPH_BUBBLE_FALLBACK_LABEL.png.sha1 new file mode 100644 index 0000000..fc9fca3 --- /dev/null +++ b/components/autofill_payments_strings_grdp/IDS_AUTOFILL_CARD_INFO_RETRIEVAL_SUGGESTION_IPH_BUBBLE_FALLBACK_LABEL.png.sha1
@@ -0,0 +1 @@ +80430eff2c5e10a0521e918ad7d39664455eca46 \ No newline at end of file
diff --git a/components/bookmarks/browser/bookmark_model.cc b/components/bookmarks/browser/bookmark_model.cc index 043b8d1..ffc85c2 100644 --- a/components/bookmarks/browser/bookmark_model.cc +++ b/components/bookmarks/browser/bookmark_model.cc
@@ -19,6 +19,7 @@ #include "base/functional/callback_helpers.h" #include "base/i18n/string_compare.h" #include "base/memory/raw_ptr.h" +#include "base/metrics/histogram_functions.h" #include "base/notreached.h" #include "base/observer_list.h" #include "base/strings/string_util.h" @@ -1461,6 +1462,10 @@ return; } + base::ScopedUmaHistogramTimer scoped_timer( + "Bookmarks.RemoveAccountPermanentFoldersDuration", + base::ScopedUmaHistogramTimer::ScopedHistogramTiming::kMediumTimes); + CHECK(account_other_node_); CHECK(account_mobile_node_);
diff --git a/components/bookmarks/browser/bookmark_model_unittest.cc b/components/bookmarks/browser/bookmark_model_unittest.cc index 3beedc5..e6036f23 100644 --- a/components/bookmarks/browser/bookmark_model_unittest.cc +++ b/components/bookmarks/browser/bookmark_model_unittest.cc
@@ -15,6 +15,7 @@ #include <optional> #include <set> #include <string> +#include <string_view> #include <unordered_set> #include <utility> @@ -73,6 +74,9 @@ using testing::Invoke; using testing::WithArg; +constexpr std::string_view kRemoveAccountPermanentFoldersDurationMetricName = + "Bookmarks.RemoveAccountPermanentFoldersDuration"; + // Test cases used to test the removal of extra whitespace when adding // a new folder/bookmark or updating a title of a folder/bookmark. // Note that whitespace characters are all replaced with spaces, but spaces are @@ -2739,6 +2743,9 @@ ASSERT_NE(nullptr, model_->account_other_node()); ASSERT_NE(nullptr, model_->account_mobile_node()); + histogram_tester()->ExpectTotalCount( + kRemoveAccountPermanentFoldersDurationMetricName, 0); + ClearCounts(); model_->RemoveAccountPermanentFolders(); @@ -2747,6 +2754,30 @@ EXPECT_EQ(nullptr, model_->account_mobile_node()); AssertObserverCount(0, 0, 3, 0, 0, 3, 0, 0, 0); + + histogram_tester()->ExpectTotalCount( + kRemoveAccountPermanentFoldersDurationMetricName, 1); +} + +TEST_F(BookmarkModelTest, NoOpRemoveAccountPermanentFolders) { + ASSERT_EQ(nullptr, model_->account_bookmark_bar_node()); + ASSERT_EQ(nullptr, model_->account_other_node()); + ASSERT_EQ(nullptr, model_->account_mobile_node()); + + histogram_tester()->ExpectTotalCount( + kRemoveAccountPermanentFoldersDurationMetricName, 0); + + ClearCounts(); + model_->RemoveAccountPermanentFolders(); + + EXPECT_EQ(nullptr, model_->account_bookmark_bar_node()); + EXPECT_EQ(nullptr, model_->account_other_node()); + EXPECT_EQ(nullptr, model_->account_mobile_node()); + + AssertObserverCount(0, 0, 0, 0, 0, 0, 0, 0, 0); + + histogram_tester()->ExpectTotalCount( + kRemoveAccountPermanentFoldersDurationMetricName, 0); } TEST_F(BookmarkModelTest, IsLocalOnlyNodeWithSyncFeatureOff) {
diff --git a/components/bookmarks/browser/titled_url_index.cc b/components/bookmarks/browser/titled_url_index.cc index 146d109..b7c9462 100644 --- a/components/bookmarks/browser/titled_url_index.cc +++ b/components/bookmarks/browser/titled_url_index.cc
@@ -11,6 +11,7 @@ #include <unordered_set> #include <utility> +#include "base/feature_list.h" #include "base/i18n/case_conversion.h" #include "base/i18n/unicodestring.h" #include "base/logging.h" @@ -22,6 +23,7 @@ #include "components/bookmarks/browser/bookmark_utils.h" #include "components/bookmarks/browser/titled_url_match.h" #include "components/bookmarks/browser/titled_url_node.h" +#include "components/bookmarks/common/bookmark_features.h" #include "components/query_parser/snippet.h" #include "third_party/icu/source/common/unicode/normalizer2.h" #include "third_party/icu/source/common/unicode/utypes.h" @@ -30,16 +32,61 @@ namespace { -// Return true if `prefix` is a prefix of `string`. +// Returns true if `prefix` is a prefix of `string`. bool IsPrefix(const std::u16string& prefix, const std::u16string& string) { return prefix.size() <= string.size() && prefix.compare(0, prefix.size(), string, 0, prefix.size()) == 0; } +TitledUrlIndex::NodeSetType DetermineNodeSetTypeFromFeatureFlags() { + return base::FeatureList::IsEnabled(kBookmarksUseBinaryTreeInTitledUrlIndex) + ? TitledUrlIndex::NodeSetType::kBinaryTree + : TitledUrlIndex::NodeSetType::kFlat; +} + } // namespace -TitledUrlIndex::TitledUrlIndex(std::unique_ptr<TitledUrlNodeSorter> sorter) - : sorter_(std::move(sorter)) {} +TitledUrlIndex::NodeSet::NodeSet(TitledUrlIndex::NodeSetType type) { + switch (type) { + case NodeSetType::kFlat: + variant_.emplace<FlatNodeSet>(); + break; + case NodeSetType::kBinaryTree: + variant_.emplace<BinaryTreeNodeSet>(); + break; + } +} + +TitledUrlIndex::NodeSet::~NodeSet() = default; + +bool TitledUrlIndex::NodeSet::empty() const { + return std::visit([](const auto& set) { return set.empty(); }, variant_); +} + +void TitledUrlIndex::NodeSet::InsertSingleNode(const TitledUrlNode* node) { + std::visit([node](auto& set) { set.insert(node); }, variant_); +} + +void TitledUrlIndex::NodeSet::EraseSingleNode(const TitledUrlNode* node) { + std::visit([node](auto& set) { set.erase(node); }, variant_); +} + +TitledUrlIndex::NodeVector TitledUrlIndex::NodeSet::DeepCopyToVector() const { + return std::visit( + [](const auto& set) { return NodeVector(set.begin(), set.end()); }, + variant_); +} + +void TitledUrlIndex::NodeSet::AppendNodesToVector(NodeVector& output) const { + std::visit( + [&output](const auto& set) { + output.insert(output.end(), set.begin(), set.end()); + }, + variant_); +} + +TitledUrlIndex::TitledUrlIndex() + : indexed_node_set_type_(DetermineNodeSetTypeFromFeatureFlags()) {} TitledUrlIndex::~TitledUrlIndex() = default; @@ -99,13 +146,13 @@ // below will filter out nodes that neither match nor ancestor-match every // query term. static const size_t kMaxNodes = 1000; - TitledUrlNodeSet matches = + FlatNodeSet matches = RetrieveNodesMatchingAnyTerms(terms, matching_algorithm, kMaxNodes); if (matches.empty()) return {}; - TitledUrlNodes sorted_nodes; + NodeVector sorted_nodes; SortMatches(matches, &sorted_nodes); // We use a QueryParser to fill in match positions for us. It's not the most @@ -140,8 +187,8 @@ return base::i18n::UnicodeStringToString16(unicode_normalized_text); } -void TitledUrlIndex::SortMatches(const TitledUrlNodeSet& matches, - TitledUrlNodes* sorted_nodes) const { +void TitledUrlIndex::SortMatches(const FlatNodeSet& matches, + NodeVector* sorted_nodes) const { if (sorter_) { sorter_->SortMatches(matches, sorted_nodes); } else { @@ -150,7 +197,7 @@ } std::vector<TitledUrlMatch> TitledUrlIndex::MatchTitledUrlNodesWithQuery( - const TitledUrlNodes& nodes, + const NodeVector& nodes, const query_parser::QueryNodeVector& query_nodes, const std::vector<std::u16string>& query_terms, size_t max_count) { @@ -160,7 +207,7 @@ // `HistoryContentsProvider::ConvertResults()` will run backwards to assure // higher relevance will be attributed to the best matches. std::vector<TitledUrlMatch> matches; - for (TitledUrlNodes::const_iterator i = nodes.begin(); + for (NodeVector::const_iterator i = nodes.begin(); i != nodes.end() && matches.size() < max_count; ++i) { std::optional<TitledUrlMatch> match = MatchTitledUrlNodeWithQuery(*i, query_nodes, query_terms); @@ -265,23 +312,22 @@ return match; } -TitledUrlIndex::TitledUrlNodeSet TitledUrlIndex::RetrieveNodesMatchingAllTerms( +TitledUrlIndex::FlatNodeSet TitledUrlIndex::RetrieveNodesMatchingAllTerms( const std::vector<std::u16string>& terms, query_parser::MatchingAlgorithm matching_algorithm) const { DCHECK(!terms.empty()); - TitledUrlNodeSet matches = - RetrieveNodesMatchingTerm(terms[0], matching_algorithm); + FlatNodeSet matches = RetrieveNodesMatchingTerm(terms[0], matching_algorithm); for (size_t i = 1; i < terms.size() && !matches.empty(); ++i) { - TitledUrlNodeSet term_matches = + FlatNodeSet term_matches = RetrieveNodesMatchingTerm(terms[i], matching_algorithm); // Compute intersection between the two sets. - base::EraseIf(matches, base::IsNotIn<TitledUrlNodeSet>(term_matches)); + base::EraseIf(matches, base::IsNotIn<FlatNodeSet>(term_matches)); } return matches; } -TitledUrlIndex::TitledUrlNodeSet TitledUrlIndex::RetrieveNodesMatchingAnyTerms( +TitledUrlIndex::FlatNodeSet TitledUrlIndex::RetrieveNodesMatchingAnyTerms( const std::vector<std::u16string>& terms, query_parser::MatchingAlgorithm matching_algorithm, size_t max_nodes) const { @@ -303,13 +349,13 @@ if (!terms_not_path.empty()) return RetrieveNodesMatchingAllTerms(terms_not_path, matching_algorithm); - std::vector<TitledUrlNodes> matches_per_term; + std::vector<NodeVector> matches_per_term; bool some_term_had_empty_matches = false; for (const std::u16string& term : terms) { // Use `matching_algorithm`, as opposed to exact matching, to allow inputs // like 'myFolder goog' to match a 'google.com' bookmark in a 'myFolder' // folder. - TitledUrlNodes term_matches = + NodeVector term_matches = RetrieveNodesMatchingTerm(term, matching_algorithm); if (term_matches.empty()) some_term_had_empty_matches = true; @@ -325,7 +371,7 @@ [](const auto& matches) { return matches.size(); }); // Use an `unordered_set` to avoid potentially 1000's of linear time - // insertions into the ordered `TitledUrlNodeSet` (i.e. `flat_set`). + // insertions into the ordered `FlatNodeSet` (i.e. `flat_set`). std::unordered_set<const TitledUrlNode*> matches; for (const auto& term_matches : matches_per_term) { for (const TitledUrlNode* node : term_matches) { @@ -343,14 +389,14 @@ // is a superset of the intersection of `matches_per_term`s, if // `matches_per_term[0].size() <= max_nodes`, all of `matches_per_term[0]`, // and therefore the intersection matches`, are already in `matches`. - TitledUrlNodeSet all_term_matches; + FlatNodeSet all_term_matches; if (!some_term_had_empty_matches && matches_per_term[0].size() > max_nodes) { - all_term_matches = matches_per_term[0]; + all_term_matches = std::move(matches_per_term[0]); for (size_t i = 1; i < matches_per_term.size() && !all_term_matches.empty(); ++i) { // Compute intersection between the two sets. base::EraseIf(all_term_matches, - base::IsNotIn<TitledUrlNodeSet>(matches_per_term[i])); + base::IsNotIn<FlatNodeSet>(matches_per_term[i])); } // `all_term_matches` is the intersection of each term's node matches; the // same as `RetrieveNodesMatchingAllTerms()`. We don't call the latter as a @@ -360,10 +406,10 @@ } matches.insert(all_term_matches.begin(), all_term_matches.end()); - return TitledUrlNodeSet(matches.begin(), matches.end()); + return FlatNodeSet(matches.begin(), matches.end()); } -TitledUrlIndex::TitledUrlNodes TitledUrlIndex::RetrieveNodesMatchingTerm( +TitledUrlIndex::NodeVector TitledUrlIndex::RetrieveNodesMatchingTerm( const std::u16string& term, query_parser::MatchingAlgorithm matching_algorithm) const { Index::const_iterator i = index_.lower_bound(term); @@ -375,15 +421,14 @@ // Term is too short for prefix match, compare using exact match. if (i->first != term) return {}; // No title/URL pairs with this term. - return TitledUrlNodes(i->second.begin(), i->second.end()); + return i->second.DeepCopyToVector(); } // Loop through index adding all entries that start with term to // `prefix_matches`. - TitledUrlNodes prefix_matches; + NodeVector prefix_matches; while (i != index_.end() && IsPrefix(term, i->first)) { - prefix_matches.insert(prefix_matches.end(), i->second.begin(), - i->second.end()); + i->second.AppendNodesToVector(prefix_matches); ++i; } return prefix_matches; @@ -434,7 +479,8 @@ void TitledUrlIndex::RegisterNode(const std::u16string& term, const TitledUrlNode* node) { - index_[term].insert(node); + index_.try_emplace(term, indexed_node_set_type_) + .first->second.InsertSingleNode(node); } void TitledUrlIndex::UnregisterNode(const std::u16string& term, @@ -445,7 +491,7 @@ // example, a node with the title 'foo foo' would end up here. return; } - i->second.erase(node); + i->second.EraseSingleNode(node); if (i->second.empty()) index_.erase(i); }
diff --git a/components/bookmarks/browser/titled_url_index.h b/components/bookmarks/browser/titled_url_index.h index 61f2f67..6697cdb 100644 --- a/components/bookmarks/browser/titled_url_index.h +++ b/components/bookmarks/browser/titled_url_index.h
@@ -13,10 +13,10 @@ #include <set> #include <string> #include <string_view> +#include <variant> #include <vector> #include "base/containers/flat_set.h" -#include "base/feature_list.h" #include "base/memory/raw_ptr.h" #include "components/bookmarks/browser/titled_url_node_sorter.h" #include "components/query_parser/query_parser.h" @@ -34,20 +34,17 @@ // TitledUrlNodes that contain that string in their title or URL. class TitledUrlIndex { public: - using TitledUrlNodeSet = - base::flat_set<raw_ptr<const TitledUrlNode, CtnExperimental>>; - - // Constructs a TitledUrlIndex. `sorter` is used to construct a sorted list - // of matches when matches are returned from the index. If null, matches are - // returned unsorted. - explicit TitledUrlIndex( - std::unique_ptr<TitledUrlNodeSorter> sorter = nullptr); + TitledUrlIndex(); TitledUrlIndex(const TitledUrlIndex&) = delete; TitledUrlIndex& operator=(const TitledUrlIndex&) = delete; ~TitledUrlIndex(); + // Sets a node sorter as provided by `sorter`, which is used to construct a + // sorted list of matches when matches are returned from the index. If null + // (which is also the default before this function is called), matches are + // returned unsorted. void SetNodeSorter(std::unique_ptr<TitledUrlNodeSorter> sorter); // Invoked when a title/URL pair has been added to the model. @@ -75,22 +72,51 @@ // normalize the string, returns `text` itself as a best-effort. static std::u16string Normalize(std::u16string_view text); + // The type of container used internally by the index, determined via feature + // flags. + enum class NodeSetType { + kFlat, + kBinaryTree, + }; + private: friend class TitledUrlIndexFake; - using TitledUrlNodes = - std::vector<raw_ptr<const TitledUrlNode, CtnExperimental>>; - using Index = std::map<std::u16string, TitledUrlNodeSet>; + using NodeVector = std::vector<raw_ptr<const TitledUrlNode, CtnExperimental>>; + using FlatNodeSet = + base::flat_set<raw_ptr<const TitledUrlNode, CtnExperimental>>; + + class NodeSet { + public: + explicit NodeSet(NodeSetType type); + NodeSet(const NodeSet&) = delete; + NodeSet& operator=(const NodeSet&) = delete; + ~NodeSet(); + + bool empty() const; + void InsertSingleNode(const TitledUrlNode* node); + void EraseSingleNode(const TitledUrlNode* node); + + NodeVector DeepCopyToVector() const; + void AppendNodesToVector(NodeVector& output) const; + + private: + using BinaryTreeNodeSet = + std::set<raw_ptr<const TitledUrlNode, CtnExperimental>>; + + std::variant<FlatNodeSet, BinaryTreeNodeSet> variant_; + }; + + using Index = std::map<std::u16string, NodeSet>; // Constructs `sorted_nodes` by copying the matches in `matches` and sorting // them. - void SortMatches(const TitledUrlNodeSet& matches, - TitledUrlNodes* sorted_nodes) const; + void SortMatches(const FlatNodeSet& matches, NodeVector* sorted_nodes) const; // For each node, calls `MatchTitledUrlNodeWithQuery()` and returns the // aggregated `TitledUrlMatch`s. std::vector<TitledUrlMatch> MatchTitledUrlNodesWithQuery( - const TitledUrlNodes& nodes, + const NodeVector& nodes, const query_parser::QueryNodeVector& query_nodes, const std::vector<std::u16string>& query_terms, size_t max_count); @@ -104,7 +130,7 @@ // Return matches for the specified `terms`. This is an intersection of each // term's matches. - TitledUrlNodeSet RetrieveNodesMatchingAllTerms( + FlatNodeSet RetrieveNodesMatchingAllTerms( const std::vector<std::u16string>& terms, query_parser::MatchingAlgorithm matching_algorithm) const; @@ -114,13 +140,13 @@ // `max_nodes_per_term` nodes won't have their nodes accumulated by union; and // accumulation is capped to `max_nodes`. Guaranteed to include any node // `RetrieveNodesMatchingAllTerms()` includes. - TitledUrlNodeSet RetrieveNodesMatchingAnyTerms( + FlatNodeSet RetrieveNodesMatchingAnyTerms( const std::vector<std::u16string>& terms, query_parser::MatchingAlgorithm matching_algorithm, size_t max_nodes) const; // Return matches for the specified `term`. May return duplicates. - TitledUrlNodes RetrieveNodesMatchingTerm( + NodeVector RetrieveNodesMatchingTerm( const std::u16string& term, query_parser::MatchingAlgorithm matching_algorithm) const; @@ -143,6 +169,10 @@ // Removes `node` from `index_`. void UnregisterNode(const std::u16string& term, const TitledUrlNode* node); + // A cached result of evaluating feature flags, to avoid repeated evaluation + // via base::FeatureList. + const NodeSetType indexed_node_set_type_; + // A map of terms and the nodes containing those terms in their titles or // URLs. E.g., given 2 bookmarks titled 'x y x' and 'x z', `index` would // contain: `{ x: set[node1, node2], y: set[node1], z: set[node2] }`.
diff --git a/components/bookmarks/browser/titled_url_index_unittest.cc b/components/bookmarks/browser/titled_url_index_unittest.cc index dfdff76..8920820c 100644 --- a/components/bookmarks/browser/titled_url_index_unittest.cc +++ b/components/bookmarks/browser/titled_url_index_unittest.cc
@@ -24,6 +24,7 @@ #include "components/bookmarks/browser/titled_url_match.h" #include "components/bookmarks/browser/titled_url_node.h" #include "components/bookmarks/browser/typed_count_sorter.h" +#include "components/bookmarks/common/bookmark_features.h" #include "components/bookmarks/test/test_bookmark_client.h" #include "components/query_parser/query_parser.h" #include "testing/gtest/include/gtest/gtest.h" @@ -116,11 +117,21 @@ namespace { -class TitledUrlIndexTest : public testing::Test { +class TitledUrlIndexTest : public testing::TestWithParam<bool> { public: const GURL kAboutBlankURL = GURL("about:blank"); - TitledUrlIndexTest() { ResetNodes(); } + TitledUrlIndexTest() { + if (GetParam()) { + feature_list_.InitAndEnableFeature( + kBookmarksUseBinaryTreeInTitledUrlIndex); + } else { + feature_list_.InitAndDisableFeature( + kBookmarksUseBinaryTreeInTitledUrlIndex); + } + + ResetNodes(); + } ~TitledUrlIndexTest() override = default; @@ -237,6 +248,7 @@ TitledUrlIndexFake* index() { return index_.get(); } private: + base::test::ScopedFeatureList feature_list_; std::vector<std::unique_ptr<TestTitledUrlNode>> owned_nodes_; std::vector<std::unique_ptr<TestTitledUrlNode>> owned_path_nodes_; std::unique_ptr<TitledUrlIndexFake> index_; @@ -244,7 +256,7 @@ // Various permutations with differing input, queries and output that exercises // all query paths. -TEST_F(TitledUrlIndexTest, GetResultsMatching) { +TEST_P(TitledUrlIndexTest, GetResultsMatching) { struct TestData { const std::string titles; const std::string query; @@ -311,7 +323,7 @@ } } -TEST_F(TitledUrlIndexTest, GetResultsMatchingAlwaysPrefixSearch) { +TEST_P(TitledUrlIndexTest, GetResultsMatchingAlwaysPrefixSearch) { struct TestData { const std::string titles; const std::string query; @@ -372,7 +384,7 @@ // Analogous to GetResultsMatching, this test tests various permutations // of title, URL, and input to see if the title/URL matches the input as // expected. -TEST_F(TitledUrlIndexTest, GetResultsMatchingWithURLs) { +TEST_P(TitledUrlIndexTest, GetResultsMatchingWithURLs) { struct TestData { const std::string query; const std::string title; @@ -426,7 +438,7 @@ } } -TEST_F(TitledUrlIndexTest, GetResultsMatchingWithSymbols) { +TEST_P(TitledUrlIndexTest, GetResultsMatchingWithSymbols) { auto does_query_match_title = [&](std::string query, std::string title) { ResetNodes(); AddNode(title, kAboutBlankURL); @@ -465,7 +477,7 @@ EXPECT_FALSE(does_query_match_title("@", "@")); } -TEST_F(TitledUrlIndexTest, Normalization) { +TEST_P(TitledUrlIndexTest, Normalization) { struct TestData { const char* const title; const char* const query; @@ -492,7 +504,7 @@ } // Makes sure match positions are updated appropriately for title matches. -TEST_F(TitledUrlIndexTest, MatchPositionsTitles) { +TEST_P(TitledUrlIndexTest, MatchPositionsTitles) { struct TestData { const std::string title; const std::string query; @@ -525,7 +537,7 @@ } // Makes sure match positions are updated appropriately for URL matches. -TEST_F(TitledUrlIndexTest, MatchPositionsURLs) { +TEST_P(TitledUrlIndexTest, MatchPositionsURLs) { // The encoded stuff between /wiki/ and the # is 第二次世界大戦 const std::string ja_wiki_url = "http://ja.wikipedia.org/wiki/%E7%AC%AC%E4" @@ -572,7 +584,7 @@ } // Makes sure index is updated when a node is removed. -TEST_F(TitledUrlIndexTest, Remove) { +TEST_P(TitledUrlIndexTest, Remove) { TitledUrlNode* n1 = AddNode("foo", GURL("http://foo")).first; TitledUrlNode* n2 = AddNode("bar", GURL("http://bar")).first; TitledUrlNode* n3 = AddNode("bar", GURL("http://bar/baz")).first; @@ -593,7 +605,7 @@ } // Makes sure index is updated when a node is removed. -TEST_F(TitledUrlIndexTest, Remove_PathIndex) { +TEST_P(TitledUrlIndexTest, Remove_PathIndex) { auto* parent_dir = AddNode("foo", GURL("http://foo"), "folder").second; ASSERT_EQ(1U, GetResultsMatching("foo folder", 10).size()); @@ -603,7 +615,7 @@ } // Makes sure no more than max queries is returned. -TEST_F(TitledUrlIndexTest, HonorMax) { +TEST_P(TitledUrlIndexTest, HonorMax) { AddNode("abcd", kAboutBlankURL); AddNode("abcde", kAboutBlankURL); @@ -612,7 +624,7 @@ // Makes sure if the lower case string of a bookmark title is more characters // than the upper case string no match positions are returned. -TEST_F(TitledUrlIndexTest, EmptyMatchOnMultiwideLowercaseString) { +TEST_P(TitledUrlIndexTest, EmptyMatchOnMultiwideLowercaseString) { TitledUrlNode* n1 = AddNode(u"\u0130 i", GURL("http://www.google.com")).first; std::vector<TitledUrlMatch> matches = GetResultsMatching("i", 100); @@ -621,7 +633,7 @@ EXPECT_TRUE(matches[0].title_match_positions.empty()); } -TEST_F(TitledUrlIndexTest, GetResultsSortedByTypedCount) { +TEST_P(TitledUrlIndexTest, GetResultsSortedByTypedCount) { struct TestData { const GURL url; const char* title; @@ -669,7 +681,7 @@ index()->SetNodeSorter(nullptr); } -TEST_F(TitledUrlIndexTest, MatchTitledUrlNodeWithQuery) { +TEST_P(TitledUrlIndexTest, MatchTitledUrlNodeWithQuery) { // When the query matches the node, should return non `nullopt`. EXPECT_TRUE(index()->MatchTitledUrlNodeWithQuery(u"matching", u"match")); // When the query approximately matches the node, should return `nullopt`. @@ -678,7 +690,7 @@ EXPECT_FALSE(index()->MatchTitledUrlNodeWithQuery(u"natch", u"match")); } -TEST_F(TitledUrlIndexTest, MatchTitledUrlNodeWithQuery_ApproximateNodeMatch) { +TEST_P(TitledUrlIndexTest, MatchTitledUrlNodeWithQuery_ApproximateNodeMatch) { // When the query matches the node, should return non `nullopt`. EXPECT_TRUE(index()->MatchTitledUrlNodeWithQuery(u"matching", u"match")); // When the query approximately matches the node, should return `nullopt`. @@ -687,7 +699,7 @@ EXPECT_FALSE(index()->MatchTitledUrlNodeWithQuery(u"natch", u"match")); } -TEST_F(TitledUrlIndexTest, RetrieveNodesMatchingAllTerms) { +TEST_P(TitledUrlIndexTest, RetrieveNodesMatchingAllTerms) { TitledUrlNode* node = AddNode("term1 term2 other xyz ab", GURL("http://foo.com")).first; @@ -718,7 +730,7 @@ }; } -TEST_F(TitledUrlIndexTest, RetrieveNodesMatchingAnyTerms_PathMatch) { +TEST_P(TitledUrlIndexTest, RetrieveNodesMatchingAnyTerms_PathMatch) { ResetNodes(); AddNode("term1 term2 other xyz ab", GURL("http://foo.com")); AddNode("no_match", GURL("http://no_match.com"), "path commo"); @@ -758,7 +770,7 @@ VerifyRetrieveNodesMatchingAnyTerms("commo commo", {2, 3, 4, 5}); } -TEST_F(TitledUrlIndexTest, RetrieveNodesMatchingAnyTerms_PathIndex) { +TEST_P(TitledUrlIndexTest, RetrieveNodesMatchingAnyTerms_PathIndex) { AddNode("term1 term2 other xyz ab", GURL("http://foo.com"), "parent"); AddNode("term1 term3", GURL("http://foo.com"), "parent2"); @@ -775,7 +787,7 @@ VerifyRetrieveNodesMatchingAnyTerms("term2 term3 parent", {}); } -TEST_F(TitledUrlIndexTest, GetResultsMatchingAncestors) { +TEST_P(TitledUrlIndexTest, GetResultsMatchingAncestors) { TitledUrlNode* node = AddNode("leaf pare", GURL("http://foo.com"), "parent").first; @@ -817,5 +829,12 @@ }; } +INSTANTIATE_TEST_SUITE_P(ContainerType, + TitledUrlIndexTest, + testing::Bool(), + [](const testing::TestParamInfo<bool>& info) { + return info.param ? "BinaryTree" : "FlatTree"; + }); + } // namespace } // namespace bookmarks
diff --git a/components/bookmarks/common/bookmark_features.cc b/components/bookmarks/common/bookmark_features.cc index e4079200..e9eddc78 100644 --- a/components/bookmarks/common/bookmark_features.cc +++ b/components/bookmarks/common/bookmark_features.cc
@@ -15,4 +15,11 @@ "AllBookmarksBaselineFolderVisibility", base::FEATURE_DISABLED_BY_DEFAULT); +// Determines which container is used internally in `TitledUrlIndex`, +// leading to slightly different performance characteristics. If enabled, +// a std::set is used per indexed term instead of base::flat_set. +BASE_FEATURE(kBookmarksUseBinaryTreeInTitledUrlIndex, + "BookmarksUseBinaryTreeInTitledUrlIndex", + base::FEATURE_DISABLED_BY_DEFAULT); + } // namespace bookmarks
diff --git a/components/bookmarks/common/bookmark_features.h b/components/bookmarks/common/bookmark_features.h index b3010d5..6039ad49 100644 --- a/components/bookmarks/common/bookmark_features.h +++ b/components/bookmarks/common/bookmark_features.h
@@ -11,6 +11,8 @@ BASE_DECLARE_FEATURE(kAllBookmarksBaselineFolderVisibility); +BASE_DECLARE_FEATURE(kBookmarksUseBinaryTreeInTitledUrlIndex); + } // namespace bookmarks #endif // COMPONENTS_BOOKMARKS_COMMON_BOOKMARK_FEATURES_H_
diff --git a/components/browser_ui/bottomsheet/android/internal/java/src/org/chromium/components/browser_ui/bottomsheet/BottomSheetObserverTest.java b/components/browser_ui/bottomsheet/android/internal/java/src/org/chromium/components/browser_ui/bottomsheet/BottomSheetObserverTest.java index 584d03b4..ed8e0bf 100644 --- a/components/browser_ui/bottomsheet/android/internal/java/src/org/chromium/components/browser_ui/bottomsheet/BottomSheetObserverTest.java +++ b/components/browser_ui/bottomsheet/android/internal/java/src/org/chromium/components/browser_ui/bottomsheet/BottomSheetObserverTest.java
@@ -129,19 +129,7 @@ mScrimCoordinator = new ScrimCoordinator( sTestRule.getActivity(), - new ScrimCoordinator.SystemUiScrimDelegate() { - @Override - public void setStatusBarScrimFraction( - float scrimFraction) { - // Intentional noop - } - - @Override - public void setNavigationBarScrimFraction( - float scrimFraction) { - // Intentional noop - } - }, + /* systemUiScrimDelegate= */ null, rootView, Color.WHITE); Supplier<ScrimCoordinator> scrimSupplier = () -> mScrimCoordinator;
diff --git a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/scrim/ScrimCoordinator.java b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/scrim/ScrimCoordinator.java index 5984ff8..6e68395 100644 --- a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/scrim/ScrimCoordinator.java +++ b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/scrim/ScrimCoordinator.java
@@ -9,6 +9,7 @@ import android.view.ViewGroup; import androidx.annotation.ColorInt; +import androidx.annotation.Nullable; import org.chromium.base.ObserverList; import org.chromium.base.supplier.Supplier; @@ -37,27 +38,28 @@ public interface SystemUiScrimDelegate { /** * Pass the current scrim color to the relevant system UI elements. + * * @param scrimColor The current base color of the scrim. */ - default void setScrimColor(@ColorInt int scrimColor) { - // Default no-op, since we fallback to R.color.default_scrim_color if this isn't called. - } + default void setScrimColor(@ColorInt int scrimColor) {} /** * Set the amount of scrim over the status bar. The implementor may choose to not respect * the value provided to this method. + * * @param scrimFraction The scrim fraction over the status bar. 0 is completely hidden, 1 is - * completely shown. + * completely shown. */ - void setStatusBarScrimFraction(float scrimFraction); + default void setStatusBarScrimFraction(float scrimFraction) {} /** * Set the amount of scrim over the navigation bar. The implementor may choose to not * respect the value provided to this method. + * * @param scrimFraction The scrim fraction over the status bar. 0 is completely hidden, 1 is - * completely shown. + * completely shown. */ - void setNavigationBarScrimFraction(float scrimFraction); + default void setNavigationBarScrimFraction(float scrimFraction) {} } /** A mechanism for delegating motion events out to the mediator. */ @@ -101,7 +103,7 @@ */ public ScrimCoordinator( Context context, - SystemUiScrimDelegate systemUiScrimDelegate, + @Nullable SystemUiScrimDelegate systemUiScrimDelegate, ViewGroup parent, @ColorInt int defaultColor) { mMediator =
diff --git a/components/certificate_transparency/data/log_list.json b/components/certificate_transparency/data/log_list.json index d94129d..626a18c 100644 --- a/components/certificate_transparency/data/log_list.json +++ b/components/certificate_transparency/data/log_list.json
@@ -1,6 +1,6 @@ { - "version": "50.64", - "log_list_timestamp": "2025-01-09T12:55:41Z", + "version": "50.65", + "log_list_timestamp": "2025-01-10T12:59:29Z", "operators": [ { "name": "Google",
diff --git a/components/collaboration/internal/collaboration_controller.cc b/components/collaboration/internal/collaboration_controller.cc index fcbe1b94..c9cf4c0b 100644 --- a/components/collaboration/internal/collaboration_controller.cc +++ b/components/collaboration/internal/collaboration_controller.cc
@@ -218,6 +218,9 @@ // If user is not part of the group, do a readgroup to ensure version // match. + // TODO(haileywang): We should either remove this read group request and + // do the version check in the preview data or do the network requests + // in parallel instead of one by one. controller->data_sharing_service()->ReadNewGroup( controller->flow().join_token(), base::BindOnce(&CheckingFlowRequirementsState:: @@ -270,12 +273,11 @@ : ControllerState(id, controller) {} void OnEnter(const ErrorInfo& error) override { - // TODO(crbug.com/380113830): Add preview data here. - data_sharing::SharedDataPreview preview_data; - controller->delegate()->ShowJoinDialog( - controller->flow().join_token(), preview_data, - base::BindOnce(&AddingUserToGroupState::ProcessOutcome, - weak_ptr_factory_.GetWeakPtr())); + controller->data_sharing_service()->GetSharedEntitiesPreview( + controller->flow().join_token(), + base::BindOnce( + &AddingUserToGroupState::ProcessSharedDataPreviewOrFailureOutcome, + local_weak_ptr_factory_.GetWeakPtr())); } void OnProcessingFinishedWithSuccess() override { @@ -287,6 +289,23 @@ } controller->TransitionTo(StateId::kWaitingForSyncAndDataSharingGroup); } + + private: + void ProcessSharedDataPreviewOrFailureOutcome( + const data_sharing::DataSharingService::SharedDataPreviewOrFailureOutcome& + preview_outcome) { + if (!preview_outcome.has_value()) { + HandleError(); + return; + } + + controller->delegate()->ShowJoinDialog( + controller->flow().join_token(), preview_outcome.value(), + base::BindOnce(&AddingUserToGroupState::ProcessOutcome, + weak_ptr_factory_.GetWeakPtr())); + } + + base::WeakPtrFactory<AddingUserToGroupState> local_weak_ptr_factory_{this}; }; class WaitingForSyncAndDataSharingGroup
diff --git a/components/collaboration/internal/collaboration_controller_unittest.cc b/components/collaboration/internal/collaboration_controller_unittest.cc index 8d00374..5086ca22 100644 --- a/components/collaboration/internal/collaboration_controller_unittest.cc +++ b/components/collaboration/internal/collaboration_controller_unittest.cc
@@ -154,12 +154,19 @@ GroupData group_data = GroupData(group_id, /*display_name=*/"", /*members=*/{}, kAccessToken); base::OnceCallback<void(Outcome)> join_ui_callback; + base::OnceCallback<void(const data_sharing::DataSharingService:: + SharedDataPreviewOrFailureOutcome&)> + preview_callback; + EXPECT_CALL(*data_sharing_service_, + GetSharedEntitiesPreview(token, IsNotNullCallback())) + .WillOnce(MoveArg<1>(&preview_callback)); EXPECT_CALL(*delegate_, ShowJoinDialog(_, _, IsNotNullCallback())) .WillOnce(MoveArg<2>(&join_ui_callback)); // 4. CheckingFlowRequirements -> AddingUserToGroup state. std::move(group_data_callback).Run(group_data); EXPECT_EQ(controller_->GetStateForTesting(), StateId::kAddingUserToGroup); + std::move(preview_callback).Run(data_sharing::SharedDataPreview()); // Simulate the user accepts the join invitation. Wait for tab group to be // added in sync. @@ -256,6 +263,30 @@ run_loop.Run(); } +TEST_F(CollaborationControllerTest, PreviewDataFailures) { + // Start Join flow. + InitializeJoinController(base::DoNothing()); + + base::OnceCallback<void(const data_sharing::DataSharingService:: + SharedDataPreviewOrFailureOutcome&)> + preview_callback; + EXPECT_CALL(*data_sharing_service_, + GetSharedEntitiesPreview( + GroupToken(data_sharing::GroupId(kGroupId), kAccessToken), + IsNotNullCallback())) + .WillOnce(MoveArg<1>(&preview_callback)); + controller_->SetStateForTesting(StateId::kAddingUserToGroup); + base::OnceCallback<void(Outcome)> error_ui_callback; + EXPECT_CALL(*delegate_, ShowError(ErrorInfo(ErrorInfo::Type::kGenericError), + IsNotNullCallback())) + .WillOnce(MoveArg<1>(&error_ui_callback)); + + std::move(preview_callback) + .Run(base::unexpected(data_sharing::DataSharingService:: + PeopleGroupActionFailure::kUnknown)); + EXPECT_EQ(controller_->GetStateForTesting(), StateId::kError); +} + TEST_F(CollaborationControllerTest, AuthenticationError) { RunLoop run_loop; // Start Join flow with authenticating screens.
diff --git a/components/commerce/core/commerce_feature_list.cc b/components/commerce/core/commerce_feature_list.cc index 864ba1bd..5227aa86 100644 --- a/components/commerce/core/commerce_feature_list.cc +++ b/components/commerce/core/commerce_feature_list.cc
@@ -184,11 +184,6 @@ const char kPriceInsightsUseCacheParam[] = "price-insights-use-cache"; const base::FeatureParam<bool> kPriceInsightsUseCache{ &commerce::kPriceInsights, kPriceInsightsUseCacheParam, true}; -const char kProductSpecsMigrateToMultiSpecificsParam[] = - "migrate-legacy-to-multi-specifics"; -const base::FeatureParam<bool> kProductSpecsMigrateToMultiSpecifics{ - &commerce::kProductSpecificationsMultiSpecifics, - kProductSpecsMigrateToMultiSpecificsParam, false}; // Promotion in Magic Stack for Price Tracking users from other platforms. BASE_FEATURE(kPriceTrackingPromo, @@ -205,11 +200,6 @@ "ProductSpecificationsClearMetadataOnNewlySupportedFields", base::FEATURE_ENABLED_BY_DEFAULT); -// Stores Product Specifications across multiple specifics instead of one. -BASE_FEATURE(kProductSpecificationsMultiSpecifics, - "ProductSpecificationsMultiSpecifics", - base::FEATURE_ENABLED_BY_DEFAULT); - BASE_FEATURE(kCompareConfirmationToast, "CompareConfirmationToast", base::FEATURE_DISABLED_BY_DEFAULT);
diff --git a/components/commerce/core/commerce_feature_list.h b/components/commerce/core/commerce_feature_list.h index 5ddd951..fd05c44 100644 --- a/components/commerce/core/commerce_feature_list.h +++ b/components/commerce/core/commerce_feature_list.h
@@ -42,13 +42,10 @@ extern const base::FeatureParam<bool> kPriceInsightsShowFeedback; extern const char kPriceInsightsUseCacheParam[]; extern const base::FeatureParam<bool> kPriceInsightsUseCache; -extern const char kProductSpecsMigrateToMultiSpecificsParam[]; -extern const base::FeatureParam<bool> kProductSpecsMigrateToMultiSpecifics; BASE_DECLARE_FEATURE(kPriceTrackingPromo); BASE_DECLARE_FEATURE(kProductSpecifications); BASE_DECLARE_FEATURE(kProductSpecificationsClearMetadataOnNewlySupportedFields); -BASE_DECLARE_FEATURE(kProductSpecificationsMultiSpecifics); BASE_DECLARE_FEATURE(kCompareConfirmationToast); BASE_DECLARE_FEATURE(kProductSpecificationsCache); BASE_DECLARE_FEATURE(kCompareManagementInterface);
diff --git a/components/commerce/core/flag_descriptions.cc b/components/commerce/core/flag_descriptions.cc index a788514..f85c363 100644 --- a/components/commerce/core/flag_descriptions.cc +++ b/components/commerce/core/flag_descriptions.cc
@@ -15,12 +15,6 @@ const char kProductSpecificationsDescription[] = "Enable the Product Specifications feature."; -const char kProductSpecificationsMultiSpecificsName[] = - "Product Specifications Multi Specifics"; -const char kProductSpecificationsMultiSpecificsDescription[] = - "Enable the Product Specifications backed by the sync multi specifics " - "representation."; - const char kCompareConfirmationToastName[] = "Added to set confirmation toast"; const char kCompareConfirmationToastDescription[] = "Enable to show the added to set confirmation in a toast.";
diff --git a/components/commerce/core/flag_descriptions.h b/components/commerce/core/flag_descriptions.h index 4d1ec9f..a6ba848 100644 --- a/components/commerce/core/flag_descriptions.h +++ b/components/commerce/core/flag_descriptions.h
@@ -15,9 +15,6 @@ extern const char kProductSpecificationsName[]; extern const char kProductSpecificationsDescription[]; -extern const char kProductSpecificationsMultiSpecificsName[]; -extern const char kProductSpecificationsMultiSpecificsDescription[]; - extern const char kCompareConfirmationToastName[]; extern const char kCompareConfirmationToastDescription[];
diff --git a/components/commerce/core/product_specifications/product_specifications_service.cc b/components/commerce/core/product_specifications/product_specifications_service.cc index 7b025f3..c750caf5 100644 --- a/components/commerce/core/product_specifications/product_specifications_service.cc +++ b/components/commerce/core/product_specifications/product_specifications_service.cc
@@ -147,22 +147,6 @@ url_infos, top_level_specific->product_comparison().name()); } -std::vector<GURL> GetUrls(const std::vector<commerce::UrlInfo> url_infos) { - std::vector<GURL> urls; - for (const auto& url_info : url_infos) { - urls.push_back(url_info.url); - } - return urls; -} - -std::vector<commerce::UrlInfo> GetUrlInfos(std::vector<GURL> urls) { - std::vector<commerce::UrlInfo> url_infos; - for (const auto& url : urls) { - url_infos.emplace_back(url, std::u16string()); - } - return url_infos; -} - } // namespace namespace commerce { @@ -194,68 +178,45 @@ return {}; } - if (base::FeatureList::IsEnabled( - commerce::kProductSpecificationsMultiSpecifics)) { - std::map<std::string, std::vector<sync_pb::ProductComparisonSpecifics>> - items_lookup; - // Map product_comparison_uuid to product_comparison_item so the data for - // each item can be merged the top level specific stored in - // product_comparison. - for (auto& [_, specifics] : bridge_->entries()) { - if (specifics.has_product_comparison_item()) { - std::string uuid = - specifics.product_comparison_item().product_comparison_uuid(); - if (!items_lookup.contains(uuid)) { - items_lookup[uuid] = {}; - } - items_lookup[uuid].push_back(specifics); + std::map<std::string, std::vector<sync_pb::ProductComparisonSpecifics>> + items_lookup; + // Map product_comparison_uuid to product_comparison_item so the data for + // each item can be merged the top level specific stored in + // product_comparison. + for (auto& [_, specifics] : bridge_->entries()) { + if (specifics.has_product_comparison_item()) { + std::string uuid = + specifics.product_comparison_item().product_comparison_uuid(); + if (!items_lookup.contains(uuid)) { + items_lookup[uuid] = {}; } + items_lookup[uuid].push_back(specifics); } - // Order items, as defined by UniquePosition. - for (auto& [_, item_specifics] : items_lookup) { - SortItemSpecifics(item_specifics); - } - // Create ProductSpecificationSets. - std::vector<ProductSpecificationsSet> sets; - for (auto& [uuid, specifics] : bridge_->entries()) { - if (specifics.has_product_comparison()) { - std::vector<UrlInfo> url_infos; - if (base::FindOrNull(items_lookup, uuid)) { - for (auto& specific : items_lookup.find(uuid)->second) { - std::u16string title = - base::UTF8ToUTF16(specific.product_comparison_item().title()); - url_infos.emplace_back( - GURL(specific.product_comparison_item().url()), title); - } - } - sets.emplace_back(specifics.uuid(), - specifics.creation_time_unix_epoch_millis(), - specifics.update_time_unix_epoch_millis(), url_infos, - specifics.product_comparison().name()); - } - } - return sets; - } else { - std::vector<ProductSpecificationsSet> product_specifications; - for (auto& entry : bridge_->entries()) { - // Specifics with ProductComparison or ProductComparisonItem follow a - // different format where the ProductSpecificationsSet is stored across - // multiple specifics. Skip over them for the single specifics case. - if (entry.second.has_product_comparison() || - entry.second.has_product_comparison_item()) { - continue; - } - std::vector<GURL> urls; - for (auto& data : entry.second.data()) { - urls.emplace_back(data.url()); - } - product_specifications.emplace_back( - entry.second.uuid(), entry.second.creation_time_unix_epoch_millis(), - entry.second.update_time_unix_epoch_millis(), urls, - entry.second.name()); - } - return product_specifications; } + // Order items, as defined by UniquePosition. + for (auto& [_, item_specifics] : items_lookup) { + SortItemSpecifics(item_specifics); + } + // Create ProductSpecificationSets. + std::vector<ProductSpecificationsSet> sets; + for (auto& [uuid, specifics] : bridge_->entries()) { + if (specifics.has_product_comparison()) { + std::vector<UrlInfo> url_infos; + if (base::FindOrNull(items_lookup, uuid)) { + for (auto& specific : items_lookup.find(uuid)->second) { + std::u16string title = + base::UTF8ToUTF16(specific.product_comparison_item().title()); + url_infos.emplace_back(GURL(specific.product_comparison_item().url()), + title); + } + } + sets.emplace_back(specifics.uuid(), + specifics.creation_time_unix_epoch_millis(), + specifics.update_time_unix_epoch_millis(), url_infos, + specifics.product_comparison().name()); + } + } + return sets; } void ProductSpecificationsService::GetAllProductSpecifications( @@ -286,19 +247,8 @@ return std::nullopt; } - if (base::FeatureList::IsEnabled( - commerce::kProductSpecificationsMultiSpecifics)) { - return GetProductSpecificationsSetFromMultiSpecifics(uuid, - bridge_->entries()); - } - // TODO(b:337263623): Consider centralizing ID logic for product - // specifications. - auto it = bridge_->entries().find(uuid.AsLowercaseString()); - if (it == bridge_->entries().end()) { - return std::nullopt; - } - - return ProductSpecificationsSet::FromProto(it->second); + return GetProductSpecificationsSetFromMultiSpecifics(uuid, + bridge_->entries()); } void ProductSpecificationsService::GetSetByUuid( @@ -343,58 +293,32 @@ // TODO(crbug.com/332545064) add for a product specification set being added. std::vector<sync_pb::ProductComparisonSpecifics> specifics; int64_t time_now = base::Time::Now().InMillisecondsSinceUnixEpoch(); - if (base::FeatureList::IsEnabled( - commerce::kProductSpecificationsMultiSpecifics)) { - sync_pb::ProductComparisonSpecifics comparison_specifics; - std::string top_level_uuid = - base::Uuid::GenerateRandomV4().AsLowercaseString(); - comparison_specifics.set_uuid(top_level_uuid); - comparison_specifics.set_creation_time_unix_epoch_millis(time_now); - comparison_specifics.set_update_time_unix_epoch_millis(time_now); - comparison_specifics.mutable_product_comparison()->set_name(final_name); - specifics.push_back(comparison_specifics); - base::Time now = base::Time::Now(); + sync_pb::ProductComparisonSpecifics comparison_specifics; + std::string top_level_uuid = + base::Uuid::GenerateRandomV4().AsLowercaseString(); + comparison_specifics.set_uuid(top_level_uuid); + comparison_specifics.set_creation_time_unix_epoch_millis(time_now); + comparison_specifics.set_update_time_unix_epoch_millis(time_now); + comparison_specifics.mutable_product_comparison()->set_name(final_name); + specifics.push_back(comparison_specifics); + base::Time now = base::Time::Now(); - // Truncate to 10 URLs if we're over the max. - std::vector<UrlInfo> final_url_infos; - for (size_t i = 0; i < url_infos.size() && i < kMaxTableSize; ++i) { - final_url_infos.push_back(url_infos[i]); - } - - std::vector<sync_pb::ProductComparisonSpecifics> item_specifics = - CreateItemLevelSpecifics(top_level_uuid, final_url_infos, now); - specifics.insert(specifics.end(), - std::make_move_iterator(item_specifics.begin()), - std::make_move_iterator(item_specifics.end())); - bridge_->AddSpecifics(specifics); - ProductSpecificationsSet set = ProductSpecificationsSet( - top_level_uuid, time_now, time_now, final_url_infos, final_name); - OnProductSpecificationsSetAdded(set); - return set; - } else { - sync_pb::ProductComparisonSpecifics comparison_specifics; - comparison_specifics.set_uuid( - base::Uuid::GenerateRandomV4().AsLowercaseString()); - comparison_specifics.set_creation_time_unix_epoch_millis(time_now); - comparison_specifics.set_update_time_unix_epoch_millis(time_now); - comparison_specifics.set_name(final_name); - size_t current_url_count = 0; - for (const GURL& url : GetUrls(url_infos)) { - sync_pb::ComparisonData* comparison_data = - comparison_specifics.add_data(); - comparison_data->set_url(url.spec()); - current_url_count++; - - // Truncate the URL count at the max. - if (current_url_count >= kMaxTableSize) { - break; - } - } - bridge_->AddSpecifics({comparison_specifics}); - OnProductSpecificationsSetAdded( - ProductSpecificationsSet::FromProto(comparison_specifics)); - return ProductSpecificationsSet::FromProto(comparison_specifics); + // Truncate to 10 URLs if we're over the max. + std::vector<UrlInfo> final_url_infos; + for (size_t i = 0; i < url_infos.size() && i < kMaxTableSize; ++i) { + final_url_infos.push_back(url_infos[i]); } + + std::vector<sync_pb::ProductComparisonSpecifics> item_specifics = + CreateItemLevelSpecifics(top_level_uuid, final_url_infos, now); + specifics.insert(specifics.end(), + std::make_move_iterator(item_specifics.begin()), + std::make_move_iterator(item_specifics.end())); + bridge_->AddSpecifics(specifics); + ProductSpecificationsSet set = ProductSpecificationsSet( + top_level_uuid, time_now, time_now, final_url_infos, final_name); + OnProductSpecificationsSetAdded(set); + return set; } const std::optional<ProductSpecificationsSet> @@ -404,70 +328,38 @@ return std::nullopt; } - if (base::FeatureList::IsEnabled( - commerce::kProductSpecificationsMultiSpecifics)) { - const sync_pb::ProductComparisonSpecifics* top_level_specific = - GetTopLevelSpecific(uuid.AsLowercaseString(), bridge_->entries()); - if (!top_level_specific) { - return std::nullopt; - } - std::optional<ProductSpecificationsSet> previous_set = GetSetByUuid(uuid); - if (!previous_set.has_value()) { - return std::nullopt; - } - std::vector<sync_pb::ProductComparisonSpecifics> specifics_to_remove = - GetItemSpecifics(uuid.AsLowercaseString(), bridge_->entries()); - - base::Time now = base::Time::Now(); - bridge_->DeleteSpecifics(specifics_to_remove); - - // Truncate to 10 URLs if we're over the max. - std::vector<UrlInfo> final_url_infos; - for (size_t i = 0; i < url_infos.size() && i < kMaxTableSize; ++i) { - final_url_infos.push_back(url_infos[i]); - } - - // SetUrls has not been updated to include title yet, so use - // GetUrlInfos(...) to convert GURLs -> UrlInfos with a blank title. - bridge_->AddSpecifics(CreateItemLevelSpecifics(uuid.AsLowercaseString(), - final_url_infos, now)); - ProductSpecificationsSet updated_set( - uuid.AsLowercaseString(), - top_level_specific->creation_time_unix_epoch_millis(), - now.InMillisecondsSinceUnixEpoch(), final_url_infos, - previous_set->name()); - NotifyProductSpecificationsUpdate(previous_set.value(), updated_set); - return updated_set; - } else { - auto entry = bridge_->entries().find(uuid.AsLowercaseString()); - - if (entry == bridge_->entries().end()) { - return std::nullopt; - } - sync_pb::ProductComparisonSpecifics original = entry->second; - sync_pb::ProductComparisonSpecifics& specifics = entry->second; - specifics.clear_data(); - - size_t current_url_count = 0; - for (const UrlInfo& url_info : url_infos) { - sync_pb::ComparisonData* data = specifics.add_data(); - data->set_url(url_info.url.spec()); - current_url_count++; - - // Truncate the URL count at the max. - if (current_url_count >= kMaxTableSize) { - break; - } - } - specifics.set_update_time_unix_epoch_millis( - base::Time::Now().InMillisecondsSinceUnixEpoch()); - bridge_->UpdateSpecifics(specifics); - ProductSpecificationsSet set = - ProductSpecificationsSet::FromProto(specifics); - NotifyProductSpecificationsUpdate( - ProductSpecificationsSet::FromProto(original), set); - return set; + const sync_pb::ProductComparisonSpecifics* top_level_specific = + GetTopLevelSpecific(uuid.AsLowercaseString(), bridge_->entries()); + if (!top_level_specific) { + return std::nullopt; } + std::optional<ProductSpecificationsSet> previous_set = GetSetByUuid(uuid); + if (!previous_set.has_value()) { + return std::nullopt; + } + std::vector<sync_pb::ProductComparisonSpecifics> specifics_to_remove = + GetItemSpecifics(uuid.AsLowercaseString(), bridge_->entries()); + + base::Time now = base::Time::Now(); + bridge_->DeleteSpecifics(specifics_to_remove); + + // Truncate to 10 URLs if we're over the max. + std::vector<UrlInfo> final_url_infos; + for (size_t i = 0; i < url_infos.size() && i < kMaxTableSize; ++i) { + final_url_infos.push_back(url_infos[i]); + } + + // SetUrls has not been updated to include title yet, so use + // GetUrlInfos(...) to convert GURLs -> UrlInfos with a blank title. + bridge_->AddSpecifics( + CreateItemLevelSpecifics(uuid.AsLowercaseString(), final_url_infos, now)); + ProductSpecificationsSet updated_set( + uuid.AsLowercaseString(), + top_level_specific->creation_time_unix_epoch_millis(), + now.InMillisecondsSinceUnixEpoch(), final_url_infos, + previous_set->name()); + NotifyProductSpecificationsUpdate(previous_set.value(), updated_set); + return updated_set; } const std::optional<ProductSpecificationsSet> @@ -483,61 +375,40 @@ final_name = name.substr(0, kMaxNameLength); } - if (base::FeatureList::IsEnabled( - commerce::kProductSpecificationsMultiSpecifics)) { - // If we can't find the top level entry (perhaps due to a sync failure - - // item level entries were synced, but the top level entry sync failed, the - // item level entries are considered orphaned and the - // ProductSpecificationsSet does not exist until the top level entry is - // synced. - if (bridge_->entries().find(uuid.AsLowercaseString()) == - bridge_->entries().end()) { - return std::nullopt; - } - std::optional<ProductSpecificationsSet> previous_set = GetSetByUuid(uuid); - if (!previous_set.has_value()) { - return std::nullopt; - } - sync_pb::ProductComparisonSpecifics top_level_specific = - *GetTopLevelSpecific(uuid.AsLowercaseString(), bridge_->entries()); - top_level_specific.set_name(final_name); - base::Time now = base::Time::Now(); - top_level_specific.mutable_product_comparison()->set_name(final_name); - top_level_specific.set_update_time_unix_epoch_millis( - now.InMillisecondsSinceUnixEpoch()); - bridge_->UpdateSpecifics(top_level_specific); - std::vector<GURL> urls; - std::vector<sync_pb::ProductComparisonSpecifics> item_specifics = - GetItemSpecifics(uuid.AsLowercaseString(), bridge_->entries()); - SortItemSpecifics(item_specifics); - for (const sync_pb::ProductComparisonSpecifics& specifics : - item_specifics) { - urls.emplace_back(specifics.product_comparison_item().url()); - } - ProductSpecificationsSet updated_set( - uuid.AsLowercaseString(), - top_level_specific.creation_time_unix_epoch_millis(), - now.InMillisecondsSinceUnixEpoch(), urls, final_name); - NotifyProductSpecificationsUpdate(previous_set.value(), updated_set); - return updated_set; - } else { - auto entry = bridge_->entries().find(uuid.AsLowercaseString()); - - if (entry == bridge_->entries().end()) { - return std::nullopt; - } - sync_pb::ProductComparisonSpecifics original = entry->second; - sync_pb::ProductComparisonSpecifics& specifics = entry->second; - specifics.set_update_time_unix_epoch_millis( - base::Time::Now().InMillisecondsSinceUnixEpoch()); - specifics.set_name(final_name); - bridge_->UpdateSpecifics(specifics); - ProductSpecificationsSet set = - ProductSpecificationsSet::FromProto(specifics); - NotifyProductSpecificationsUpdate( - ProductSpecificationsSet::FromProto(original), set); - return set; + // If we can't find the top level entry (perhaps due to a sync failure - + // item level entries were synced, but the top level entry sync failed, the + // item level entries are considered orphaned and the + // ProductSpecificationsSet does not exist until the top level entry is + // synced. + if (bridge_->entries().find(uuid.AsLowercaseString()) == + bridge_->entries().end()) { + return std::nullopt; } + std::optional<ProductSpecificationsSet> previous_set = GetSetByUuid(uuid); + if (!previous_set.has_value()) { + return std::nullopt; + } + sync_pb::ProductComparisonSpecifics top_level_specific = + *GetTopLevelSpecific(uuid.AsLowercaseString(), bridge_->entries()); + top_level_specific.set_name(final_name); + base::Time now = base::Time::Now(); + top_level_specific.mutable_product_comparison()->set_name(final_name); + top_level_specific.set_update_time_unix_epoch_millis( + now.InMillisecondsSinceUnixEpoch()); + bridge_->UpdateSpecifics(top_level_specific); + std::vector<GURL> urls; + std::vector<sync_pb::ProductComparisonSpecifics> item_specifics = + GetItemSpecifics(uuid.AsLowercaseString(), bridge_->entries()); + SortItemSpecifics(item_specifics); + for (const sync_pb::ProductComparisonSpecifics& specifics : item_specifics) { + urls.emplace_back(specifics.product_comparison_item().url()); + } + ProductSpecificationsSet updated_set( + uuid.AsLowercaseString(), + top_level_specific.creation_time_unix_epoch_millis(), + now.InMillisecondsSinceUnixEpoch(), urls, final_name); + NotifyProductSpecificationsUpdate(previous_set.value(), updated_set); + return updated_set; } void ProductSpecificationsService::DeleteProductSpecificationsSet( @@ -545,8 +416,6 @@ if (!is_initialized_) { return; } - if (base::FeatureList::IsEnabled( - commerce::kProductSpecificationsMultiSpecifics)) { std::vector<sync_pb::ProductComparisonSpecifics> specifics_to_delete; const sync_pb::ProductComparisonSpecifics* top_level = nullptr; @@ -571,16 +440,6 @@ NotifyProductSpecificationsRemoval(set); } bridge_->DeleteSpecifics(specifics_to_delete); - } else { - auto it = bridge_->entries().find(uuid); - if (it == bridge_->entries().end()) { - return; - } - sync_pb::ProductComparisonSpecifics to_remove = it->second; - bridge_->DeleteSpecifics({to_remove}); - NotifyProductSpecificationsRemoval( - ProductSpecificationsSet::FromProto(to_remove)); - } } void ProductSpecificationsService::AddObserver( @@ -600,7 +459,6 @@ std::move(deferred_operation).Run(); } deferred_operations_.clear(); - MigrateLegacySpecificsIfApplicable(); } void ProductSpecificationsService::OnProductSpecificationsSetAdded( @@ -719,35 +577,6 @@ } } -void ProductSpecificationsService::MigrateLegacySpecificsIfApplicable() { - if (kProductSpecsMigrateToMultiSpecifics.Get()) { - std::vector<sync_pb::ProductComparisonSpecifics> migrate_specifics_to_add; - for (auto [uuid, specifics] : bridge_->entries()) { - // It's possible for the legacy format to have no URLs and just a name - // so detect legacy specifics to have a name and no ProductComparison - // and no ProductComparisonItem fields. - if (specifics.has_name() && !specifics.has_product_comparison() && - !specifics.has_product_comparison_item()) { - specifics.mutable_product_comparison()->set_name(specifics.name()); - specifics.clear_name(); - bridge_->UpdateSpecifics(specifics); - - std::vector<GURL> urls; - for (const sync_pb::ComparisonData& data : specifics.data()) { - urls.emplace_back(data.url()); - } - // Title can be left blank in GetUrlInfos, as the migration - // is of specifics created before we included title. - bridge_->AddSpecifics(CreateItemLevelSpecifics( - uuid, GetUrlInfos(urls), - base::Time::FromMillisecondsSinceUnixEpoch( - specifics.update_time_unix_epoch_millis()))); - specifics.clear_data(); - } - } - } -} - void ProductSpecificationsService::DisableInitializedForTesting() { is_initialized_ = false; }
diff --git a/components/commerce/core/product_specifications/product_specifications_service.h b/components/commerce/core/product_specifications/product_specifications_service.h index e30d7ea..649ae7c 100644 --- a/components/commerce/core/product_specifications/product_specifications_service.h +++ b/components/commerce/core/product_specifications/product_specifications_service.h
@@ -121,8 +121,6 @@ void NotifyProductSpecificationsRemoval(const ProductSpecificationsSet& set); - void MigrateLegacySpecificsIfApplicable(); - void DisableInitializedForTesting(); base::WeakPtrFactory<ProductSpecificationsService> weak_ptr_factory_{this};
diff --git a/components/commerce/core/product_specifications/product_specifications_service_unittest.cc b/components/commerce/core/product_specifications/product_specifications_service_unittest.cc index 22a0996..5f375a5 100644 --- a/components/commerce/core/product_specifications/product_specifications_service_unittest.cc +++ b/components/commerce/core/product_specifications/product_specifications_service_unittest.cc
@@ -61,25 +61,6 @@ return specifics; } -void CheckSpecsAgainstSpecifics( - const commerce::ProductSpecificationsSet& specifications, - const sync_pb::ProductComparisonSpecifics& specifics) { - EXPECT_EQ(base::Uuid::ParseLowercase(specifics.uuid()), - specifications.uuid()); - EXPECT_EQ(base::Time::FromMillisecondsSinceUnixEpoch( - specifics.creation_time_unix_epoch_millis()), - specifications.creation_time()); - EXPECT_EQ(base::Time::FromMillisecondsSinceUnixEpoch( - specifics.update_time_unix_epoch_millis()), - specifications.update_time()); - EXPECT_EQ(specifics.name(), specifications.name()); - std::vector<GURL> urls; - for (const sync_pb::ComparisonData& data : specifics.data()) { - urls.emplace_back(data.url()); - } - EXPECT_EQ(urls, specifications.urls()); -} - const auto kProductComparisonSpecifics = std::to_array<sync_pb::ProductComparisonSpecifics>( {BuildProductComparisonSpecifics( @@ -95,26 +76,6 @@ "my next set", {"https://some-url.com", "https://another-url.com"})}); -syncer::EntityData MakeEntityData( - const sync_pb::ProductComparisonSpecifics& specifics) { - syncer::EntityData entity_data; - *entity_data.specifics.mutable_product_comparison() = specifics; - entity_data.name = base::StringPrintf("%s_%s", specifics.name().c_str(), - specifics.uuid().c_str()); - return entity_data; -} - -void AddTestSpecifics(commerce::ProductSpecificationsSyncBridge* bridge) { - syncer::EntityChangeList add_changes; - for (const auto& specifics : kProductComparisonSpecifics) { - add_changes.push_back(syncer::EntityChange::CreateAdd( - specifics.uuid(), MakeEntityData(specifics))); - } - bridge->ApplyIncrementalSyncChanges( - std::make_unique<syncer::InMemoryMetadataChangeList>(), - std::move(add_changes)); -} - template <class T> void Swap(std::vector<T>& items, std::vector<std::pair<int, int>> indices) { for (auto& indice_pair : indices) { @@ -122,24 +83,6 @@ } } -MATCHER_P(HasAllProductSpecs, product_comparison_specifics, "") { - std::vector<GURL> specifics_urls; - for (const sync_pb::ComparisonData& data : - product_comparison_specifics.data()) { - specifics_urls.emplace_back(data.url()); - } - return arg.uuid().AsLowercaseString() == - product_comparison_specifics.uuid() && - arg.creation_time() == base::Time::FromMillisecondsSinceUnixEpoch( - product_comparison_specifics - .creation_time_unix_epoch_millis()) && - arg.update_time() == base::Time::FromMillisecondsSinceUnixEpoch( - product_comparison_specifics - .update_time_unix_epoch_millis()) && - arg.name() == product_comparison_specifics.name() && - arg.urls() == specifics_urls; -} - MATCHER_P(IsSetWithUuid, uuid, "") { return arg.uuid() == uuid; } @@ -239,19 +182,6 @@ return service()->deferred_operations_.size(); } - void DisableMultiSpecFlag() { - scoped_feature_list_.InitAndDisableFeature( - commerce::kProductSpecificationsMultiSpecifics); - } - - void EnableMigrateProductSpecificationsSets() { - scoped_feature_list_.InitAndEnableFeatureWithParameters( - commerce::kProductSpecificationsMultiSpecifics, - { - {commerce::kProductSpecsMigrateToMultiSpecificsParam, "true"}, - }); - } - std::map<std::string, sync_pb::ProductComparisonSpecifics> GetAllStoreData() { base::RunLoop loop; std::map<std::string, sync_pb::ProductComparisonSpecifics> @@ -361,10 +291,6 @@ bridge()->DeleteSpecifics(to_delete); } - void MigrateLegacySpecificsIfApplicable() { - service()->MigrateLegacySpecificsIfApplicable(); - } - protected: base::test::TaskEnvironment task_environment_; std::unique_ptr<ProductSpecificationsService> service_; @@ -402,286 +328,6 @@ std::unique_ptr<ProductSpecificationsSet> initial_set_; }; -TEST_F(ProductSpecificationsServiceTest, TestGetProductSpecifications) { - DisableMultiSpecFlag(); - for (const sync_pb::ProductComparisonSpecifics& specifics : - kProductComparisonSpecifics) { - AddCompareSpecificsForTesting(specifics); - } - const std::vector<ProductSpecificationsSet> specifications = - service()->GetAllProductSpecifications(); - EXPECT_EQ(2u, specifications.size()); - for (uint64_t i = 0; i < specifications.size(); i++) { - CheckSpecsAgainstSpecifics(specifications[i], - kProductComparisonSpecifics[i]); - } -} - -TEST_F(ProductSpecificationsServiceTest, TestGetProductSpecificationsAsync) { - DisableMultiSpecFlag(); - SetIsInitialized(false); - for (const sync_pb::ProductComparisonSpecifics& specifics : - kProductComparisonSpecifics) { - AddCompareSpecificsForTesting(specifics); - } - base::RunLoop run_loop; - - service()->GetAllProductSpecifications( - base::BindOnce([](const std::vector<ProductSpecificationsSet> - specifications) { - EXPECT_EQ(2u, specifications.size()); - for (uint64_t i = 0; i < specifications.size(); i++) { - CheckSpecsAgainstSpecifics(specifications[i], - kProductComparisonSpecifics[i]); - } - }).Then(run_loop.QuitClosure())); - - EXPECT_EQ(1u, GetDeferredOperationsSize()); - OnInit(); - run_loop.Run(); -} - -TEST_F(ProductSpecificationsServiceTest, TestGetSetByUuidAsync) { - DisableMultiSpecFlag(); - SetIsInitialized(false); - for (const sync_pb::ProductComparisonSpecifics& specifics : - kProductComparisonSpecifics) { - AddCompareSpecificsForTesting(specifics); - } - base::RunLoop run_loop; - - service()->GetSetByUuid( - base::Uuid::ParseLowercase(kProductComparisonSpecifics[0].uuid()), - base::BindOnce([](std::optional<ProductSpecificationsSet> specification) { - EXPECT_TRUE(specification.has_value()); - CheckSpecsAgainstSpecifics(specification.value(), - kProductComparisonSpecifics[0]); - }).Then(run_loop.QuitClosure())); - - EXPECT_EQ(1u, GetDeferredOperationsSize()); - OnInit(); - run_loop.Run(); -} - -TEST_F(ProductSpecificationsServiceTest, - TestGetSetByUuidAsyncAlreadyInitialized) { - DisableMultiSpecFlag(); - SetIsInitialized(true); - for (const sync_pb::ProductComparisonSpecifics& specifics : - kProductComparisonSpecifics) { - AddCompareSpecificsForTesting(specifics); - } - base::RunLoop run_loop; - - service()->GetSetByUuid( - base::Uuid::ParseLowercase(kProductComparisonSpecifics[0].uuid()), - base::BindOnce([](std::optional<ProductSpecificationsSet> specification) { - EXPECT_TRUE(specification.has_value()); - CheckSpecsAgainstSpecifics(specification.value(), - kProductComparisonSpecifics[0]); - }).Then(run_loop.QuitClosure())); - run_loop.Run(); -} - -TEST_F(ProductSpecificationsServiceTest, TestAddProductSpecificationsSuccess) { - DisableMultiSpecFlag(); - std::vector<GURL> expected_product_urls{GURL(kProductOneUrl), - GURL(kProductTwoUrl)}; - EXPECT_CALL(*observer(), - OnProductSpecificationsSetAdded(HasProductSpecsNameUrl( - kProductSpecsName, expected_product_urls))) - .Times(1); - std::optional<ProductSpecificationsSet> product_spec_set = - service()->AddProductSpecificationsSet( - kProductSpecsName, {UrlInfo(GURL(kProductOneUrl), u""), - UrlInfo(GURL(kProductTwoUrl), u"")}); - EXPECT_TRUE(product_spec_set.has_value()); - EXPECT_EQ(kProductSpecsName, product_spec_set.value().name()); - EXPECT_EQ(kProductOneUrl, product_spec_set.value().urls()[0].spec()); - EXPECT_EQ(kProductTwoUrl, product_spec_set.value().urls()[1].spec()); -} - -TEST_F(ProductSpecificationsServiceTest, TestRemoveProductSpecifications) { - DisableMultiSpecFlag(); - AddTestSpecifics(bridge()); - EXPECT_CALL( - *observer(), - OnProductSpecificationsSetRemoved(IsSetWithUuid( - base::Uuid::ParseLowercase(kProductComparisonSpecifics[0].uuid())))) - .Times(1); - service()->DeleteProductSpecificationsSet( - kProductComparisonSpecifics[0].uuid()); -} - -TEST_F(ProductSpecificationsServiceTest, TestObserverNewSpecifics) { - DisableMultiSpecFlag(); - syncer::EntityChangeList add_changes; - for (const auto& specifics : kProductComparisonSpecifics) { - add_changes.push_back(syncer::EntityChange::CreateAdd( - specifics.uuid(), MakeEntityData(specifics))); - EXPECT_CALL(*observer(), - OnProductSpecificationsSetAdded(HasAllProductSpecs(specifics))) - .Times(1); - } - bridge()->ApplyIncrementalSyncChanges( - std::make_unique<syncer::InMemoryMetadataChangeList>(), - std::move(add_changes)); -} - -TEST_F(ProductSpecificationsServiceTest, TestSetUrls) { - DisableMultiSpecFlag(); - for (const sync_pb::ProductComparisonSpecifics& specifics : - kProductComparisonSpecifics) { - AddCompareSpecificsForTesting(specifics); - } - - const std::vector<ProductSpecificationsSet> specifications = - service()->GetAllProductSpecifications(); - - const base::Uuid uuid_to_modify = specifications[0].uuid(); - - EXPECT_CALL(*observer(), - OnProductSpecificationsSetUpdate( - HasAllProductSpecs(kProductComparisonSpecifics[0]), - IsSetWithUuid(uuid_to_modify))) - .Times(1); - - const std::vector<UrlInfo> new_urls = { - UrlInfo(GURL("http://example.com/updated"), u"")}; - - service()->SetUrls(uuid_to_modify, new_urls); - - const std::optional<ProductSpecificationsSet> updated_set = - service()->GetSetByUuid(uuid_to_modify); - - EXPECT_TRUE(updated_set.has_value()); - EXPECT_EQ(new_urls[0].url.spec(), updated_set->urls()[0].spec()); - EXPECT_GT(updated_set->update_time(), specifications[0].update_time()); - EXPECT_EQ(updated_set->creation_time(), specifications[0].creation_time()); -} - -TEST_F(ProductSpecificationsServiceTest, TestSetName) { - DisableMultiSpecFlag(); - for (const sync_pb::ProductComparisonSpecifics& specifics : - kProductComparisonSpecifics) { - AddCompareSpecificsForTesting(specifics); - } - - const std::vector<ProductSpecificationsSet> specifications = - service()->GetAllProductSpecifications(); - - const base::Uuid uuid_to_modify = specifications[0].uuid(); - - const std::string new_name = "updated name"; - EXPECT_CALL(*observer(), - OnProductSpecificationsSetUpdate( - HasAllProductSpecs(kProductComparisonSpecifics[0]), - IsSetWithUuid(uuid_to_modify))) - .Times(1); - EXPECT_CALL(*observer(), - OnProductSpecificationsSetNameUpdate( - HasProductSpecsName(kProductComparisonSpecifics[0].name()), - HasProductSpecsName(new_name))) - .Times(1); - - service()->SetName(uuid_to_modify, new_name); - - const std::optional<ProductSpecificationsSet> updated_set = - service()->GetSetByUuid(uuid_to_modify); - - EXPECT_TRUE(updated_set.has_value()); - EXPECT_EQ(new_name, updated_set->name()); - EXPECT_GT(updated_set->update_time(), specifications[0].update_time()); - EXPECT_EQ(updated_set->creation_time(), specifications[0].creation_time()); -} - -TEST_F(ProductSpecificationsServiceTest, TestSetNameAndUrls_BadId) { - DisableMultiSpecFlag(); - for (const sync_pb::ProductComparisonSpecifics& specifics : - kProductComparisonSpecifics) { - AddCompareSpecificsForTesting(specifics); - } - - const std::vector<ProductSpecificationsSet> specifications = - service()->GetAllProductSpecifications(); - - const base::Uuid uuid_to_modify = - base::Uuid::ParseLowercase("90000000-0000-0000-0000-000000000000"); - - EXPECT_CALL(*observer(), - OnProductSpecificationsSetUpdate(testing::_, testing::_)) - .Times(0); - - EXPECT_CALL(*observer(), - OnProductSpecificationsSetNameUpdate(testing::_, testing::_)) - .Times(0); - - const std::vector<UrlInfo> new_urls = { - UrlInfo(GURL("http://example.com/updated"), u"")}; - - service()->SetUrls(uuid_to_modify, new_urls); - service()->SetName(uuid_to_modify, "new name"); - - const std::optional<ProductSpecificationsSet> updated_set = - service()->GetSetByUuid(uuid_to_modify); - - EXPECT_FALSE(updated_set.has_value()); -} - -TEST_F(ProductSpecificationsServiceTest, TestObserverUpdateSpecifics) { - DisableMultiSpecFlag(); - AddTestSpecifics(bridge()); - syncer::EntityChangeList update_changes; - sync_pb::ProductComparisonSpecifics new_specifics = - kProductComparisonSpecifics[0]; - sync_pb::ComparisonData* new_specifics_data = new_specifics.add_data(); - new_specifics_data->set_url("https://newurl.com/"); - new_specifics.set_update_time_unix_epoch_millis( - new_specifics.update_time_unix_epoch_millis() + - base::Time::kMillisecondsPerDay); - update_changes.push_back(syncer::EntityChange::CreateUpdate( - new_specifics.uuid(), MakeEntityData(new_specifics))); - - // Won't be updated because the update timestamp hasn't increased. - sync_pb::ProductComparisonSpecifics noupdate_specifics = - kProductComparisonSpecifics[1]; - sync_pb::ComparisonData* noupdate_specifics_data = - noupdate_specifics.add_data(); - noupdate_specifics_data->set_url("https://newurl.com/"); - update_changes.push_back(syncer::EntityChange::CreateUpdate( - noupdate_specifics.uuid(), MakeEntityData(noupdate_specifics))); - - EXPECT_CALL(*observer(), - OnProductSpecificationsSetUpdate( - HasAllProductSpecs(kProductComparisonSpecifics[0]), - HasAllProductSpecs(new_specifics))) - .Times(1); - EXPECT_CALL(*observer(), - OnProductSpecificationsSetUpdate( - HasAllProductSpecs(kProductComparisonSpecifics[1]), - HasAllProductSpecs(noupdate_specifics))) - .Times(0); - bridge()->ApplyIncrementalSyncChanges( - std::make_unique<syncer::InMemoryMetadataChangeList>(), - std::move(update_changes)); -} - -TEST_F(ProductSpecificationsServiceTest, TestObserverRemoveSpecifics) { - DisableMultiSpecFlag(); - AddTestSpecifics(bridge()); - syncer::EntityChangeList remove_changes; - for (const auto& specifics : kProductComparisonSpecifics) { - remove_changes.push_back( - syncer::EntityChange::CreateDelete(specifics.uuid())); - EXPECT_CALL(*observer(), OnProductSpecificationsSetRemoved(IsSetWithUuid( - base::Uuid::ParseLowercase(specifics.uuid())))) - .Times(1); - } - bridge()->ApplyIncrementalSyncChanges( - std::make_unique<syncer::InMemoryMetadataChangeList>(), - std::move(remove_changes)); -} - TEST_F(ProductSpecificationsServiceTest, TestGetProductSpecificationsMultiSpecifics) { std::vector<UrlInfo> expected_product_urls{ @@ -1249,61 +895,6 @@ VerifyProductSpecificationsSet(new_set->uuid(), std::nullopt); } -TEST_F(ProductSpecificationsServiceTest, TestMigration) { - std::string expected_name = "test_name"; - std::vector<GURL> expected_urls = {GURL("https://a.example.com/"), - GURL("https://b.example.com/")}; - base::Uuid expected_uuid = - base::Uuid::ParseLowercase("50000000-0000-0000-0000-000000000000"); - sync_pb::ProductComparisonSpecifics specifics; - specifics.set_uuid(expected_uuid.AsLowercaseString()); - specifics.set_name(expected_name); - for (const GURL& url : expected_urls) { - specifics.add_data()->set_url(url.spec()); - } - AddSpecifics({specifics}); - EnableMigrateProductSpecificationsSets(); - EXPECT_EQ(std::nullopt, service()->GetSetByUuid(expected_uuid)); - MigrateLegacySpecificsIfApplicable(); - std::optional<ProductSpecificationsSet> migrated_set = - service()->GetSetByUuid(expected_uuid); - EXPECT_NE(std::nullopt, migrated_set); - EXPECT_EQ(expected_uuid, migrated_set->uuid()); - EXPECT_EQ(expected_urls, migrated_set->urls()); - // TODO(crbug.com/353746117) add in time checks - EXPECT_EQ(expected_name, migrated_set->name()); -} - -TEST_F(ProductSpecificationsServiceTest, - TestMultiSpecificsIgnoredForSingleSpecificsFlagOff) { - DisableMultiSpecFlag(); - std::string multi_specs_set_uuid = "50000000-0000-0000-0000-000000000000"; - sync_pb::ProductComparisonSpecifics top_level; - top_level.set_uuid(multi_specs_set_uuid); - top_level.mutable_product_comparison()->set_name("test_name"); - - sync_pb::ProductComparisonSpecifics item_level; - item_level.set_uuid("30000000-0000-0000-0000-000000000000"); - item_level.mutable_product_comparison_item()->set_product_comparison_uuid( - "50000000-0000-0000-0000-000000000000"); - item_level.mutable_product_comparison_item()->set_url( - "https://a.example.com/"); - *item_level.mutable_product_comparison_item()->mutable_unique_position() = - syncer::UniquePosition::InitialPosition( - syncer::UniquePosition::RandomSuffix()) - .ToProto(); - - AddSpecifics({top_level, item_level}); - std::vector<ProductSpecificationsSet> sets = - service()->GetAllProductSpecifications(); - - EXPECT_EQ(sets.end(), base::ranges::find_if(sets, [&multi_specs_set_uuid]( - const auto& query_set) { - return query_set.uuid().AsLowercaseString() == - multi_specs_set_uuid; - })); -} - TEST_F(ProductSpecificationsServiceTest, TestMultiSpecificsIgnoredForSingleSpecificsFlagOn) { std::string multi_specs_set_uuid = "50000000-0000-0000-0000-000000000000";
diff --git a/components/commerce/core/product_specifications/product_specifications_sync_bridge.cc b/components/commerce/core/product_specifications/product_specifications_sync_bridge.cc index 39454458..e6190c1 100644 --- a/components/commerce/core/product_specifications/product_specifications_sync_bridge.cc +++ b/components/commerce/core/product_specifications/product_specifications_sync_bridge.cc
@@ -37,11 +37,6 @@ return entity_data; } -bool IsMultiSpecSetsEnabled() { - return base::FeatureList::IsEnabled( - commerce::kProductSpecificationsMultiSpecifics); -} - } // namespace namespace commerce { @@ -71,14 +66,12 @@ ProductSpecificationsSyncBridge::MergeFullSyncData( std::unique_ptr<syncer::MetadataChangeList> metadata_change_list, syncer::EntityChangeList entity_changes) { - if (IsMultiSpecSetsEnabled()) { - std::set<std::string> server_uuids; - for (const std::unique_ptr<syncer::EntityChange>& change : entity_changes) { - server_uuids.emplace(change->storage_key()); - } - - SendInitialSyncData(server_uuids, metadata_change_list.get()); + std::set<std::string> server_uuids; + for (const std::unique_ptr<syncer::EntityChange>& change : entity_changes) { + server_uuids.emplace(change->storage_key()); } + + SendInitialSyncData(server_uuids, metadata_change_list.get()); return ApplyIncrementalSyncChanges(std::move(metadata_change_list), std::move(entity_changes)); } @@ -91,10 +84,8 @@ store_->CreateWriteBatch(); std::map<std::string, sync_pb::ProductComparisonSpecifics> prev_entries; - if (IsMultiSpecSetsEnabled()) { - for (const auto& [uuid, specific] : entries_) { - prev_entries.emplace(uuid, specific); - } + for (const auto& [uuid, specific] : entries_) { + prev_entries.emplace(uuid, specific); } std::vector<sync_pb::ProductComparisonSpecifics> multi_specifics_changed; @@ -102,31 +93,26 @@ sync_pb::ProductComparisonSpecifics specifics = change->data().specifics.product_comparison(); - if (IsMultiSpecSetsEnabled()) { - if (specifics.has_product_comparison() || - specifics.has_product_comparison_item()) { - multi_specifics_changed.push_back(specifics); - } + if (specifics.has_product_comparison() || + specifics.has_product_comparison_item()) { + multi_specifics_changed.push_back(specifics); + } - // A delete only passes the Uuid, not the specifics itself which is - // required for OnMultiSpecificsChanged to correctly detect deleted - // ProductSpecificationsSets. Acquire specifics from local representation - // so the specifics can be passed to OnMultiSpecificsChanged. - // TODO(crbug.com/353982776) investigate OnMultiSpecificsChanged using - // uuids instead to avoid special handling of this case. - if (change->type() == syncer::EntityChange::ACTION_DELETE && - entries_.find(change->storage_key()) != entries_.end()) { - multi_specifics_changed.push_back( - entries_.find(change->storage_key())->second); - } + // A delete only passes the Uuid, not the specifics itself which is + // required for OnMultiSpecificsChanged to correctly detect deleted + // ProductSpecificationsSets. Acquire specifics from local representation + // so the specifics can be passed to OnMultiSpecificsChanged. + // TODO(crbug.com/353982776) investigate OnMultiSpecificsChanged using + // uuids instead to avoid special handling of this case. + if (change->type() == syncer::EntityChange::ACTION_DELETE && + entries_.find(change->storage_key()) != entries_.end()) { + multi_specifics_changed.push_back( + entries_.find(change->storage_key())->second); } switch (change->type()) { case syncer::EntityChange::ACTION_ADD: entries_.emplace(change->storage_key(), specifics); batch->WriteData(change->storage_key(), specifics.SerializeAsString()); - if (!IsMultiSpecSetsEnabled()) { - delegate_->OnSpecificsAdded({specifics}); - } break; case syncer::EntityChange::ACTION_UPDATE: { auto local_specifics = entries_.find(change->storage_key()); @@ -138,9 +124,6 @@ entries_[change->storage_key()] = specifics; batch->WriteData(change->storage_key(), specifics.SerializeAsString()); - if (!IsMultiSpecSetsEnabled()) { - delegate_->OnSpecificsUpdated({{before, specifics}}); - } } } break; @@ -154,15 +137,10 @@ entries_.erase(change->storage_key()); batch->DeleteData(change->storage_key()); - if (!IsMultiSpecSetsEnabled()) { - delegate_->OnSpecificsRemoved({deleted_specifics}); - } break; } } - if (IsMultiSpecSetsEnabled()) { - delegate_->OnMultiSpecificsChanged(multi_specifics_changed, prev_entries); - } + delegate_->OnMultiSpecificsChanged(multi_specifics_changed, prev_entries); batch->TakeMetadataChangesFrom(std::move(metadata_change_list)); Commit(std::move(batch)); @@ -395,14 +373,13 @@ data->set_url(data_to_copy.url()); } - if (IsMultiSpecSetsEnabled() && specifics.has_product_comparison()) { + if (specifics.has_product_comparison()) { *entity_specifics->mutable_product_comparison() = specifics.product_comparison(); entity_data->name = base::StringPrintf("product_comparison_%s_%s", specifics.uuid().c_str(), specifics.product_comparison().name().c_str()); - } else if (IsMultiSpecSetsEnabled() && - specifics.has_product_comparison_item()) { + } else if (specifics.has_product_comparison_item()) { *entity_specifics->mutable_product_comparison_item() = specifics.product_comparison_item(); entity_data->name = base::StringPrintf( @@ -430,10 +407,8 @@ trimmed_comparison_data.clear_update_time_unix_epoch_millis(); trimmed_comparison_data.clear_name(); trimmed_comparison_data.clear_data(); - if (IsMultiSpecSetsEnabled()) { - trimmed_comparison_data.clear_product_comparison(); - trimmed_comparison_data.clear_product_comparison_item(); - } + trimmed_comparison_data.clear_product_comparison(); + trimmed_comparison_data.clear_product_comparison_item(); return trimmed_comparison_data; }
diff --git a/components/commerce/core/product_specifications/product_specifications_sync_bridge_unittest.cc b/components/commerce/core/product_specifications/product_specifications_sync_bridge_unittest.cc index 498ab6ce..781d0a7b 100644 --- a/components/commerce/core/product_specifications/product_specifications_sync_bridge_unittest.cc +++ b/components/commerce/core/product_specifications/product_specifications_sync_bridge_unittest.cc
@@ -352,16 +352,6 @@ base::test::ScopedFeatureList scoped_feature_list_; }; -class ProductSpecificationsSyncMultiSpecsBridgeTest - : public ProductSpecificationsSyncBridgeTest { - public: - void SetUp() override { - ProductSpecificationsSyncBridgeTest::SetUp(); - scoped_feature_list_.InitAndEnableFeature( - commerce::kProductSpecificationsMultiSpecifics); - } -}; - TEST_F(ProductSpecificationsSyncBridgeTest, TestGetStorageKey) { syncer::EntityData entity; entity.specifics.mutable_product_comparison()->set_uuid("my_uuid"); @@ -698,7 +688,7 @@ entity_data->specifics.product_comparison().data()[1].url()); } -TEST_F(ProductSpecificationsSyncMultiSpecsBridgeTest, +TEST_F(ProductSpecificationsSyncBridgeTest, TestCreateEntityDataTopLevelSpecifics) { sync_pb::ProductComparisonSpecifics specifics; specifics.set_uuid("70000000-0000-0000-0000-000000000000"); @@ -721,7 +711,7 @@ entity_data->specifics.product_comparison().product_comparison().name()); } -TEST_F(ProductSpecificationsSyncMultiSpecsBridgeTest, +TEST_F(ProductSpecificationsSyncBridgeTest, TestCreateEntityDataItemLevelSpecifics) { sync_pb::ProductComparisonSpecifics specifics; specifics.set_uuid("50000000-0000-0000-0000-000000000000"); @@ -765,7 +755,7 @@ // TODO(crbug.com/354231134) expand TestTrimSpecificsForCachingTopLevelSpecific // and TestTrimSpecificsForCachingProductComparisonItem to include unsupported // fields. -TEST_F(ProductSpecificationsSyncMultiSpecsBridgeTest, +TEST_F(ProductSpecificationsSyncBridgeTest, TestTrimSpecificsForCachingTopLevelSpecific) { sync_pb::ProductComparisonSpecifics specifics; specifics.set_uuid("50000000-0000-0000-0000-000000000000"); @@ -784,7 +774,7 @@ EXPECT_FALSE(trimmed_specifics.has_product_comparison_item()); } -TEST_F(ProductSpecificationsSyncMultiSpecsBridgeTest, +TEST_F(ProductSpecificationsSyncBridgeTest, TestTrimSpecificsForCachingProductComparisonItem) { sync_pb::ProductComparisonSpecifics specifics; specifics.set_uuid("50000000-0000-0000-0000-000000000000"); @@ -810,8 +800,7 @@ EXPECT_FALSE(trimmed_specifics.has_product_comparison_item()); } -TEST_F(ProductSpecificationsSyncMultiSpecsBridgeTest, - TestSyncEntriesOnFirstDownload) { +TEST_F(ProductSpecificationsSyncBridgeTest, TestSyncEntriesOnFirstDownload) { entries().clear(); sync_pb::ProductComparisonSpecifics client_specifics; client_specifics.set_uuid("70000000-0000-0000-0000-000000000000"); @@ -838,7 +827,7 @@ EXPECT_EQ(client_specifics.uuid(), storage_key); } -TEST_F(ProductSpecificationsSyncMultiSpecsBridgeTest, +TEST_F(ProductSpecificationsSyncBridgeTest, TestSyncEntriesOnFirstDownloadNotTrackingMetadata) { ProcessorNotTrackingMetadata(); sync_pb::ProductComparisonSpecifics client_specifics;
diff --git a/components/commerce_strings.grdp b/components/commerce_strings.grdp index 07839ced..ccb5b27 100644 --- a/components/commerce_strings.grdp +++ b/components/commerce_strings.grdp
@@ -685,6 +685,15 @@ <message name="IDS_COMPARE_YOUR_COMPARISON_TABLES" desc="The header above the list of a user's existing comparison tables in the compare UI"> Your comparison tables </message> + <message name="IDS_COMPARE_CONTEXT_MENU_OPEN_IN_NEW_TAB" desc="The label for the comparison table list dropdown menu item for opening a comparison table in a new tab."> + Open in new tab + </message> + <message name="IDS_COMPARE_CONTEXT_MENU_RENAME" desc="The label for the comparison table list dropdown menu item for renaming a comparison table."> + Rename + </message> + <message name="IDS_COMPARE_CONTEXT_MENU_DELETE" desc="The label for the comparison table list dropdown menu item for deleting a comparison table."> + Delete + </message> <!-- For Compare Disclosure --> <message name="IDS_COMPARE_DISCLOSURE_TITLE" desc="The text for the title of the Compare first-run experience disclosure bubble."> Compare similar products side-by-side
diff --git a/components/commerce_strings_grdp/IDS_COMPARE_CONTEXT_MENU_DELETE.png.sha1 b/components/commerce_strings_grdp/IDS_COMPARE_CONTEXT_MENU_DELETE.png.sha1 new file mode 100644 index 0000000..77f824a --- /dev/null +++ b/components/commerce_strings_grdp/IDS_COMPARE_CONTEXT_MENU_DELETE.png.sha1
@@ -0,0 +1 @@ +fd4fe5034db0c297d022bfb8977c34075ee6a24b \ No newline at end of file
diff --git a/components/commerce_strings_grdp/IDS_COMPARE_CONTEXT_MENU_OPEN_IN_NEW_TAB.png.sha1 b/components/commerce_strings_grdp/IDS_COMPARE_CONTEXT_MENU_OPEN_IN_NEW_TAB.png.sha1 new file mode 100644 index 0000000..749bac8 --- /dev/null +++ b/components/commerce_strings_grdp/IDS_COMPARE_CONTEXT_MENU_OPEN_IN_NEW_TAB.png.sha1
@@ -0,0 +1 @@ +9c69f9602d2087ea9320c46ec813324435a056fa \ No newline at end of file
diff --git a/components/commerce_strings_grdp/IDS_COMPARE_CONTEXT_MENU_RENAME.png.sha1 b/components/commerce_strings_grdp/IDS_COMPARE_CONTEXT_MENU_RENAME.png.sha1 new file mode 100644 index 0000000..cb589f4 --- /dev/null +++ b/components/commerce_strings_grdp/IDS_COMPARE_CONTEXT_MENU_RENAME.png.sha1
@@ -0,0 +1 @@ +7a65b4a813c4ef179f55faac71e864296702af79 \ No newline at end of file
diff --git a/components/cronet/gn2bp/run_gn2bp.py b/components/cronet/gn2bp/run_gn2bp.py index cc4818a..ceb6f58 100755 --- a/components/cronet/gn2bp/run_gn2bp.py +++ b/components/cronet/gn2bp/run_gn2bp.py
@@ -184,10 +184,7 @@ def main(): parser = argparse.ArgumentParser() - parser.add_argument('--stamp', - type=str, - help='Path to touch on success', - required=True) + parser.add_argument('--stamp', type=str, help='Path to touch on success') parser.add_argument('--config', type=str, help='Copy.bara.sky file path to run Copybara on', @@ -208,7 +205,14 @@ type=bool, help=('Skips building the build_scripts output, ' 'this should be only used for testing.')) + parser.add_argument('--skip-copybara', + action='store_true', + help=("Only generate the build files - do not run " + "copybara afterwards. This is useful if you only " + "want to take a look at the generated files " + "without doing an actual import.")) args = parser.parse_args() + run_copybara = not args.skip_copybara try: # Create empty temp file for each architecture. @@ -240,7 +244,7 @@ res_boringssl = _gen_boringssl() res_copybara = 1 - if res_gn2bp == 0 and res_boringssl == 0 and res_license_generation == 0: + if run_copybara and res_gn2bp == 0 and res_boringssl == 0 and res_license_generation == 0: # Only run Copybara if all build files generated successfully. res_copybara = _run_copybara_to_aosp( config=args.config, @@ -261,12 +265,13 @@ elif res_license_generation != 0: print('Failed to generate license data!') sys.exit(-1) - elif res_copybara != 0: + elif run_copybara and res_copybara != 0: print('Failed to execute copybara!') sys.exit(-1) else: - build_utils.Touch(args.stamp) - print('Successfully run copybara!') + if args.stamp is not None: + build_utils.Touch(args.stamp) + print('Success!') return 0
diff --git a/components/data_sharing/public/android/conversion_utils.cc b/components/data_sharing/public/android/conversion_utils.cc index 4d57311c1..4b5a885 100644 --- a/components/data_sharing/public/android/conversion_utils.cc +++ b/components/data_sharing/public/android/conversion_utils.cc
@@ -31,9 +31,11 @@ ScopedJavaLocalRef<jobject> CreateJavaGroupMember(JNIEnv* env, const GroupMember& member) { + auto gaia_id = member.gaia_id.empty() + ? ScopedJavaLocalRef<jobject>() + : ConvertToJavaGaiaId(env, member.gaia_id); return Java_GroupMember_createGroupMember( - env, ConvertToJavaGaiaId(env, member.gaia_id), - ConvertUTF8ToJavaString(env, member.display_name), + env, gaia_id, ConvertUTF8ToJavaString(env, member.display_name), ConvertUTF8ToJavaString(env, member.email), static_cast<int>(member.role), url::GURLAndroid::FromNativeGURL(env, member.avatar_url), ConvertUTF8ToJavaString(env, member.given_name));
diff --git a/components/data_sharing/public/android/java/src/org/chromium/components/data_sharing/configs/DataSharingManageUiConfig.java b/components/data_sharing/public/android/java/src/org/chromium/components/data_sharing/configs/DataSharingManageUiConfig.java index 0289edeb5..4a22102c6 100644 --- a/components/data_sharing/public/android/java/src/org/chromium/components/data_sharing/configs/DataSharingManageUiConfig.java +++ b/components/data_sharing/public/android/java/src/org/chromium/components/data_sharing/configs/DataSharingManageUiConfig.java
@@ -8,6 +8,7 @@ import org.chromium.components.data_sharing.GroupToken; import org.chromium.components.sync.protocol.GroupData; import org.chromium.components.sync.protocol.GroupMember; +import org.chromium.url.GURL; /** Config class for the Data Sharing Manage UI. */ public class DataSharingManageUiConfig { @@ -17,6 +18,7 @@ // --- Manage Usage Config --- private ManageCallback mManageCallback; + private GURL mLearnAboutBlockedAccounts; private DataSharingUiConfig mCommonConfig; /** Callback interface for data sharing Manage UI events. */ @@ -48,6 +50,7 @@ private DataSharingManageUiConfig(Builder builder) { this.mGroupToken = builder.mGroupToken; + this.mLearnAboutBlockedAccounts = builder.mLearnAboutBlockedAccounts; this.mManageCallback = builder.mManageCallback; this.mCommonConfig = builder.mCommonConfig; } @@ -60,6 +63,10 @@ return mManageCallback; } + public GURL getLearnAboutBlockedAccounts() { + return mLearnAboutBlockedAccounts; + } + public DataSharingUiConfig getCommonConfig() { return mCommonConfig; } @@ -67,6 +74,7 @@ // Builder class public static class Builder { private GroupToken mGroupToken; + private GURL mLearnAboutBlockedAccounts; private ManageCallback mManageCallback; private DataSharingUiConfig mCommonConfig; @@ -91,6 +99,16 @@ } /** + * Sets the hyperlink for "learn about blocked accounts". + * + * @param learnAboutBlockedAccounts The hyperlink to learn about blocked accounts. + */ + public Builder setLearnAboutBlockedAccounts(GURL learnAboutBlockedAccounts) { + this.mLearnAboutBlockedAccounts = learnAboutBlockedAccounts; + return this; + } + + /** * Sets the data sharing common UI config. * * @param commonConfig The common UI config.
diff --git a/components/data_sharing/public/android/java/src/org/chromium/components/data_sharing/configs/DataSharingUiConfig.java b/components/data_sharing/public/android/java/src/org/chromium/components/data_sharing/configs/DataSharingUiConfig.java index 832dcf7..9a207d8 100644 --- a/components/data_sharing/public/android/java/src/org/chromium/components/data_sharing/configs/DataSharingUiConfig.java +++ b/components/data_sharing/public/android/java/src/org/chromium/components/data_sharing/configs/DataSharingUiConfig.java
@@ -31,6 +31,8 @@ default void onLearnMoreAboutSharedTabGroupsClicked(GURL url) {} default void onLearnMoreAboutSharedTabGroupsClicked(Context context, GURL url) {} + + default void onClickOpenChromeCustomTab(Context context, GURL url) {} } private DataSharingUiConfig(Builder builder) {
diff --git a/components/facilitated_payments/android/facilitated_payments_api_client_android.cc b/components/facilitated_payments/android/facilitated_payments_api_client_android.cc index 7d029fb..f6b7f8d5 100644 --- a/components/facilitated_payments/android/facilitated_payments_api_client_android.cc +++ b/components/facilitated_payments/android/facilitated_payments_api_client_android.cc
@@ -80,7 +80,7 @@ purchase_action_callback_ = std::move(callback); JNIEnv* env = base::android::AttachCurrentThread(); Java_FacilitatedPaymentsApiClientBridge_invokePurchaseAction( - env, java_bridge_, ConvertToJavaCoreAccountInfo(env, primary_account), + env, java_bridge_, primary_account, base::android::ToJavaByteArray(env, action_token)); }
diff --git a/components/facilitated_payments/android/java/src/org/chromium/components/facilitated_payments/FacilitatedPaymentsApiClientBridge.java b/components/facilitated_payments/android/java/src/org/chromium/components/facilitated_payments/FacilitatedPaymentsApiClientBridge.java index fdcefea..5e7376b 100644 --- a/components/facilitated_payments/android/java/src/org/chromium/components/facilitated_payments/FacilitatedPaymentsApiClientBridge.java +++ b/components/facilitated_payments/android/java/src/org/chromium/components/facilitated_payments/FacilitatedPaymentsApiClientBridge.java
@@ -6,6 +6,7 @@ import org.jni_zero.CalledByNative; import org.jni_zero.JNINamespace; +import org.jni_zero.JniType; import org.jni_zero.NativeMethods; import org.chromium.components.signin.base.CoreAccountInfo; @@ -69,7 +70,8 @@ * @param actionToken An opaque token used for invoking the purchase action. */ @CalledByNative - public void invokePurchaseAction(CoreAccountInfo primaryAccount, byte[] actionToken) { + public void invokePurchaseAction( + @JniType("CoreAccountInfo") CoreAccountInfo primaryAccount, byte[] actionToken) { mApiClient.invokePurchaseAction(primaryAccount, actionToken); }
diff --git a/components/feature_engagement/public/android/java/src/org/chromium/components/feature_engagement/EventConstants.java b/components/feature_engagement/public/android/java/src/org/chromium/components/feature_engagement/EventConstants.java index 86108d1..ea3e0e9 100644 --- a/components/feature_engagement/public/android/java/src/org/chromium/components/feature_engagement/EventConstants.java +++ b/components/feature_engagement/public/android/java/src/org/chromium/components/feature_engagement/EventConstants.java
@@ -68,6 +68,10 @@ public static final String KEYBOARD_ACCESSORY_PAYMENT_AUTOFILLED = "autofill_virtual_card_suggestion_accepted"; + /** The keyboard accessory was used to fill card info retrieval data into a form. */ + public static final String KEYBOARD_ACCESSORY_PAYMENT_CARD_INFO_RETRIEVAL_AUTOFILLED = + "autofill_card_info_retrieval_suggestion_accepted"; + /** The keyboard accessory was swiped to reveal more suggestions. */ public static final String KEYBOARD_ACCESSORY_BAR_SWIPED = "keyboard_accessory_bar_swiped";
diff --git a/components/feature_engagement/public/android/java/src/org/chromium/components/feature_engagement/FeatureConstants.java b/components/feature_engagement/public/android/java/src/org/chromium/components/feature_engagement/FeatureConstants.java index d76c1dc..b132f8c 100644 --- a/components/feature_engagement/public/android/java/src/org/chromium/components/feature_engagement/FeatureConstants.java +++ b/components/feature_engagement/public/android/java/src/org/chromium/components/feature_engagement/FeatureConstants.java
@@ -54,6 +54,7 @@ FeatureConstants.KEYBOARD_ACCESSORY_PASSWORD_FILLING_FEATURE, FeatureConstants.KEYBOARD_ACCESSORY_PAYMENT_FILLING_FEATURE, FeatureConstants.KEYBOARD_ACCESSORY_PAYMENT_OFFER_FEATURE, + FeatureConstants.KEYBOARD_ACCESSORY_PAYMENT_CARD_INFO_RETRIEVAL_FEATURE, FeatureConstants.KEYBOARD_ACCESSORY_PAYMENT_VIRTUAL_CARD_FEATURE, FeatureConstants.KEYBOARD_ACCESSORY_PAYMENT_VIRTUAL_CARD_DISABLED_FEATURE, FeatureConstants.KEYBOARD_ACCESSORY_PLUS_ADDRESS_CREATE_SUGGESTION, @@ -153,6 +154,8 @@ String EPHEMERAL_TAB_FEATURE = "IPH_EphemeralTab"; String KEYBOARD_ACCESSORY_ADDRESS_FILL_FEATURE = "IPH_KeyboardAccessoryAddressFilling"; String KEYBOARD_ACCESSORY_PASSWORD_FILLING_FEATURE = "IPH_KeyboardAccessoryPasswordFilling"; + String KEYBOARD_ACCESSORY_PAYMENT_CARD_INFO_RETRIEVAL_FEATURE = + "IPH_AutofillCardInfoRetrievalSuggestion"; String KEYBOARD_ACCESSORY_PAYMENT_FILLING_FEATURE = "IPH_KeyboardAccessoryPaymentFilling"; String KEYBOARD_ACCESSORY_PAYMENT_OFFER_FEATURE = "IPH_KeyboardAccessoryPaymentOffer"; String KEYBOARD_ACCESSORY_PAYMENT_VIRTUAL_CARD_FEATURE = "IPH_AutofillVirtualCardSuggestion";
diff --git a/components/feature_engagement/public/feature_configurations.cc b/components/feature_engagement/public/feature_configurations.cc index e7f819ee..b3e25dd 100644 --- a/components/feature_engagement/public/feature_configurations.cc +++ b/components/feature_engagement/public/feature_configurations.cc
@@ -1641,6 +1641,31 @@ return config; } + if (kIPHAutofillCardInfoRetrievalSuggestionFeature.name == feature->name) { + // A config that allows the card info retrieval suggestion IPH to be shown + // when it has been shown less than three times in last 90 days and only + // once per session. IPH will not be shown once user has selected the + // suggestion. + std::optional<FeatureConfig> config = FeatureConfig(); + config->valid = true; + config->availability = Comparator(ANY, 0); + config->session_rate = Comparator(LESS_THAN, 1); + config->trigger = EventConfig("autofill_card_info_retrieval_iph_trigger", + Comparator(LESS_THAN, 3), 90, 360); + config->used = + EventConfig("autofill_card_info_retrieval_suggestion_accepted", + Comparator(ANY, 0), 90, 360); + + // This promo blocks specific promos in the same session. + config->session_rate_impact.type = SessionRateImpact::Type::EXPLICIT; + config->session_rate_impact.affected_features.emplace(); + config->session_rate_impact.affected_features->push_back( + "IPH_KeyboardAccessoryBarSwiping"); + config->session_rate_impact.affected_features->push_back( + "IPH_AutofillVirtualCardSuggestion"); + + return config; + } #endif // BUILDFLAG(IS_ANDROID) #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_LINUX) || \
diff --git a/components/feature_engagement/public/feature_constants.cc b/components/feature_engagement/public/feature_constants.cc index 53239c5..984c44e 100644 --- a/components/feature_engagement/public/feature_constants.cc +++ b/components/feature_engagement/public/feature_constants.cc
@@ -629,6 +629,9 @@ BASE_FEATURE(kIPHiOSSharedTabGroupForeground, "IPH_iOSSharedTabGroupForeground", base::FEATURE_ENABLED_BY_DEFAULT); +BASE_FEATURE(kIPHiOSDefaultBrowserBannerPromoFeature, + "IPH_iOSDefaultBrowserBannerPromoFeature", + base::FEATURE_ENABLED_BY_DEFAULT); // Non-FET feature. BASE_FEATURE(kDefaultBrowserEligibilitySlidingWindow,
diff --git a/components/feature_engagement/public/feature_constants.h b/components/feature_engagement/public/feature_constants.h index 920db54..ba04a3fd 100644 --- a/components/feature_engagement/public/feature_constants.h +++ b/components/feature_engagement/public/feature_constants.h
@@ -265,6 +265,7 @@ FEATURE_CONSTANTS_DECLARE_FEATURE(kIPHHomeCustomizationMenuFeature); FEATURE_CONSTANTS_DECLARE_FEATURE(kIPHiOSLensOverlayEntrypointTipFeature); FEATURE_CONSTANTS_DECLARE_FEATURE(kIPHiOSSharedTabGroupForeground); +FEATURE_CONSTANTS_DECLARE_FEATURE(kIPHiOSDefaultBrowserBannerPromoFeature); // A feature flag to enable and parametrize the sliding window of time for a // user's eligibility to be shown a default browser promo. This is not an FET
diff --git a/components/feature_engagement/public/feature_list.cc b/components/feature_engagement/public/feature_list.cc index 1aa31e5..a21f624 100644 --- a/components/feature_engagement/public/feature_list.cc +++ b/components/feature_engagement/public/feature_list.cc
@@ -160,6 +160,7 @@ &kIPHHomeCustomizationMenuFeature, &kIPHiOSLensOverlayEntrypointTipFeature, &kIPHiOSSharedTabGroupForeground, + &kIPHiOSDefaultBrowserBannerPromoFeature, #endif // BUILDFLAG(IS_IOS) #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_LINUX) || \ BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_FUCHSIA)
diff --git a/components/feature_engagement/public/feature_list.h b/components/feature_engagement/public/feature_list.h index 49587f86..b4bb8b1 100644 --- a/components/feature_engagement/public/feature_list.h +++ b/components/feature_engagement/public/feature_list.h
@@ -276,6 +276,8 @@ "IPH_HomeCustomizationMenu"); DEFINE_VARIATION_PARAM(kIPHiOSSharedTabGroupForeground, "IPH_iOSSharedTabGroupForeground"); +DEFINE_VARIATION_PARAM(kIPHiOSDefaultBrowserBannerPromoFeature, + "IPH_iOSDefaultBrowserBannerPromoFeature"); #endif // BUILDFLAG(IS_IOS) #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_LINUX) || \ @@ -643,6 +645,7 @@ VARIATION_ENTRY(kIPHHomeCustomizationMenuFeature), VARIATION_ENTRY(kIPHiOSLensOverlayEntrypointTipFeature), VARIATION_ENTRY(kIPHiOSSharedTabGroupForeground), + VARIATION_ENTRY(kIPHiOSDefaultBrowserBannerPromoFeature), #elif BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \ BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_FUCHSIA) VARIATION_ENTRY(kIPHBatterySaverModeFeature),
diff --git a/components/feature_engagement/public/ios_promo_feature_configuration.cc b/components/feature_engagement/public/ios_promo_feature_configuration.cc index 6031326..48fde943 100644 --- a/components/feature_engagement/public/ios_promo_feature_configuration.cc +++ b/components/feature_engagement/public/ios_promo_feature_configuration.cc
@@ -330,6 +330,26 @@ return config; } + if (kIPHiOSDefaultBrowserBannerPromoFeature.name == feature->name) { + // Promo should show only once, and also require time since other promos. + std::optional<FeatureConfig> config = FeatureConfig(); + config->valid = true; + config->availability = Comparator(ANY, 0); + config->session_rate = Comparator(EQUAL, 0); + config->used = EventConfig("default_browser_banner_promo_used", + Comparator(ANY, 0), 365, 365); + config->trigger = + EventConfig("default_browser_banner_promo_trigger", + Comparator(EQUAL, 0), feature_engagement::kMaxStoragePeriod, + feature_engagement::kMaxStoragePeriod); + // This promo counts as a default browser promo despite not being a + // fullscreen promo from the promos manager because it's still a + // non-contextual default browser promo. Thus, it should share cooldown + // rules. + config->groups.push_back(kiOSDefaultBrowserPromosGroup.name); + return config; + } + return std::nullopt; } } // namespace
diff --git a/components/history_embeddings/ml_embedder_unittest.cc b/components/history_embeddings/ml_embedder_unittest.cc index c6ea491..c0e4420 100644 --- a/components/history_embeddings/ml_embedder_unittest.cc +++ b/components/history_embeddings/ml_embedder_unittest.cc
@@ -135,16 +135,22 @@ FakePassageEmbeddingsServiceController() = default; ~FakePassageEmbeddingsServiceController() override = default; - void LaunchService() override { - did_launch_service_ = true; + void MaybeLaunchService() override { service_remote_.reset(); service_ = std::make_unique<FakePassageEmbeddingsService>( service_remote_.BindNewPipeAndPassReceiver()); } + using passage_embeddings::PassageEmbeddingsServiceController:: + ResetEmbedderRemote; + + void ResetServiceRemote() override { + ResetEmbedderRemote(); + service_remote_.reset(); + } + private: std::unique_ptr<FakePassageEmbeddingsService> service_; - bool did_launch_service_ = false; }; class TestOptimizationGuideModelProvider @@ -322,18 +328,54 @@ histogram_tester_.ExpectUniqueSample(kModelInfoMetricName, EmbeddingsModelInfoStatus::kValid, 1); - base::test::TestFuture<std::vector<std::string>, std::vector<Embedding>, - ComputeEmbeddingsStatus> - future; - ml_embedder->ComputePassagesEmbeddings(PassageKind::PAGE_VISIT_PASSAGE, - {"foo", "bar"}, future.GetCallback()); - auto [passages, embeddings, status] = future.Get(); + { + base::test::TestFuture<std::vector<std::string>, std::vector<Embedding>, + ComputeEmbeddingsStatus> + future; + ml_embedder->ComputePassagesEmbeddings( + PassageKind::PAGE_VISIT_PASSAGE, {"foo", "bar"}, future.GetCallback()); + auto [passages, embeddings, status] = future.Get(); - EXPECT_EQ(status, ComputeEmbeddingsStatus::KSuccess); - EXPECT_EQ(passages[0], "foo"); - EXPECT_EQ(passages[1], "bar"); - EXPECT_EQ(embeddings[0].Dimensions(), kEmbeddingsModelOutputSize); - EXPECT_EQ(embeddings[1].Dimensions(), kEmbeddingsModelOutputSize); + EXPECT_EQ(status, ComputeEmbeddingsStatus::KSuccess); + EXPECT_EQ(passages[0], "foo"); + EXPECT_EQ(passages[1], "bar"); + EXPECT_EQ(embeddings[0].Dimensions(), kEmbeddingsModelOutputSize); + EXPECT_EQ(embeddings[1].Dimensions(), kEmbeddingsModelOutputSize); + } + + service_controller_->ResetEmbedderRemote(); + + { + base::test::TestFuture<std::vector<std::string>, std::vector<Embedding>, + ComputeEmbeddingsStatus> + future; + ml_embedder->ComputePassagesEmbeddings( + PassageKind::PAGE_VISIT_PASSAGE, {"foo", "bar"}, future.GetCallback()); + auto [passages, embeddings, status] = future.Get(); + + EXPECT_EQ(status, ComputeEmbeddingsStatus::KSuccess); + EXPECT_EQ(passages[0], "foo"); + EXPECT_EQ(passages[1], "bar"); + EXPECT_EQ(embeddings[0].Dimensions(), kEmbeddingsModelOutputSize); + EXPECT_EQ(embeddings[1].Dimensions(), kEmbeddingsModelOutputSize); + } + + service_controller_->ResetServiceRemote(); + + { + base::test::TestFuture<std::vector<std::string>, std::vector<Embedding>, + ComputeEmbeddingsStatus> + future; + ml_embedder->ComputePassagesEmbeddings( + PassageKind::PAGE_VISIT_PASSAGE, {"foo", "bar"}, future.GetCallback()); + auto [passages, embeddings, status] = future.Get(); + + EXPECT_EQ(status, ComputeEmbeddingsStatus::KSuccess); + EXPECT_EQ(passages[0], "foo"); + EXPECT_EQ(passages[1], "bar"); + EXPECT_EQ(embeddings[0].Dimensions(), kEmbeddingsModelOutputSize); + EXPECT_EQ(embeddings[1].Dimensions(), kEmbeddingsModelOutputSize); + } } TEST_F(MlEmbedderTest, ReturnsModelUnavailableErrorIfModelInfoNotValid) {
diff --git a/components/ip_protection/common/url_matcher_with_bypass.cc b/components/ip_protection/common/url_matcher_with_bypass.cc index 8f0e435..dbd97d37 100644 --- a/components/ip_protection/common/url_matcher_with_bypass.cc +++ b/components/ip_protection/common/url_matcher_with_bypass.cc
@@ -9,10 +9,12 @@ #include <string_view> #include <unordered_set> #include <utility> +#include <vector> #include "base/check.h" #include "base/containers/contains.h" #include "base/logging.h" +#include "base/memory/raw_ptr.h" #include "base/notreached.h" #include "base/strings/strcat.h" #include "base/trace_event/memory_usage_estimator.h" @@ -107,29 +109,6 @@ } // namespace // static -std::unique_ptr<net::SchemeHostPortMatcher> -UrlMatcherWithBypass::BuildBypassMatcher( - const masked_domain_list::ResourceOwner& resource_owner) { - auto bypass_matcher = std::make_unique<net::SchemeHostPortMatcher>(); - - // De-dupe domains that are in owned_properties and owned_resources. - std::set<std::string_view> domains; - for (std::string_view property : resource_owner.owned_properties()) { - domains.insert(property); - } - for (const masked_domain_list::Resource& resource : - resource_owner.owned_resources()) { - domains.insert(resource.domain()); - } - - for (std::string_view domain : domains) { - AddRulesToMatcher(domain, !HasSubdomainCoverage(domain), *bypass_matcher); - } - - return bypass_matcher; -} - -// static std::string UrlMatcherWithBypass::PartitionMapKey(std::string_view domain) { auto last_dot = domain.rfind("."); if (last_dot != std::string::npos) { @@ -169,8 +148,6 @@ const masked_domain_list::ResourceOwner& resource_owner, const std::unordered_set<std::string>& excluded_domains, bool create_bypass_matcher) { - net::SchemeHostPortMatcher* bypass_matcher = nullptr; - // Extract eligble domains from resource_owner --> if 0 domains, exit early. std::set<std::string> eligible_domains = GetEligibleDomains(resource_owner, excluded_domains); @@ -178,38 +155,64 @@ return; } - // Build the bypass matcher if requested by the caller. + std::map<std::string, std::unique_ptr<net::SchemeHostPortMatcher>> + matchers_map; + + unsigned int bypass_matcher_key_to_use = 0; if (create_bypass_matcher) { - bypass_matchers_.emplace_back(BuildBypassMatcher(resource_owner)); - bypass_matcher = bypass_matchers_.back().get(); - } else { - bypass_matcher = &empty_bypass_matcher_; + bypass_matcher_key_++; + bypass_matcher_key_to_use = bypass_matcher_key_; } - // Add the eligible domains to the match_list_with_bypass_map_. + for (const auto& resource : resource_owner.owned_resources()) { + std::string domain = resource.domain(); + auto matcher = std::make_unique<net::SchemeHostPortMatcher>(); + AddRulesToMatcher(domain, !HasSubdomainCoverage(domain), *matcher); + matchers_map[domain] = std::move(matcher); + } + + if (create_bypass_matcher) { + for (const auto& property : resource_owner.owned_properties()) { + // If the property is already in the matchers map, then it is a domain + // that is already in the owned_resources. + if (base::Contains(matchers_map, property)) { + continue; + } + + auto matcher = std::make_unique<net::SchemeHostPortMatcher>(); + AddRulesToMatcher(property, !HasSubdomainCoverage(property), *matcher); + matchers_map[property] = std::move(matcher); + } + } + for (const auto& [partition_key, partitioned_domains] : PartitionDomains(eligible_domains)) { - net::SchemeHostPortMatcher matcher; + std::vector<raw_ptr<net::SchemeHostPortMatcher>> matcher_ptrs; for (const auto& domain : partitioned_domains) { DCHECK(domain.ends_with(partition_key)); - AddRulesToMatcher(domain, !HasSubdomainCoverage(domain), matcher); + matcher_ptrs.emplace_back(matchers_map[domain].get()); } - if (!matcher.rules().empty()) { - match_list_with_bypass_map_[partition_key].emplace_back(PartitionMatcher{ - .matcher = std::move(matcher), .bypass_matcher = bypass_matcher}); - } + matcher_ptrs.shrink_to_fit(); + match_list_with_bypass_map_[partition_key].emplace_back( + std::move(matcher_ptrs), bypass_matcher_key_to_use); + } + + for (auto& [_, matcher] : matchers_map) { + bypass_matchers_map_[bypass_matcher_key_to_use].emplace_back( + std::move(matcher)); } } void UrlMatcherWithBypass::Clear() { match_list_with_bypass_map_.clear(); - bypass_matchers_.clear(); + bypass_matchers_map_.clear(); + bypass_matcher_key_ = 0; } size_t UrlMatcherWithBypass::EstimateMemoryUsage() const { - return base::trace_event::EstimateMemoryUsage(match_list_with_bypass_map_) + - base::trace_event::EstimateMemoryUsage(bypass_matchers_); + return base::trace_event::EstimateMemoryUsage(bypass_matchers_map_) + + base::trace_event::EstimateMemoryUsage(match_list_with_bypass_map_); } bool UrlMatcherWithBypass::IsPopulated() const { @@ -245,18 +248,28 @@ } for (const PartitionMatcher& partition_matcher : it->second) { - auto rule_result = partition_matcher.matcher.Evaluate(request_url); - if (rule_result == net::SchemeHostPortMatcherResult::kInclude) { - if (skip_bypass_check) { - vlog("matched with skipped bypass check", true); + for (const auto& matcher : partition_matcher.matchers) { + auto rule_result = matcher->Evaluate(request_url); + if (rule_result == net::SchemeHostPortMatcherResult::kInclude) { + if (skip_bypass_check) { + vlog("matched with skipped bypass check", true); + return UrlMatcherWithBypassResult::kMatchAndNoBypass; + } + + // Check bypass matchers. + if (partition_matcher.bypass_matcher_key != 0) { + for (const auto& bypass_matcher : + bypass_matchers_map_.at(partition_matcher.bypass_matcher_key)) { + if (bypass_matcher->Evaluate(top_frame_site->GetURL()) != + net::SchemeHostPortMatcherResult::kNoMatch) { + vlog("bypass_matcher.NoMatch", false); + return UrlMatcherWithBypassResult::kMatchAndBypass; + } + } + } + vlog("matched with no bypass", true); return UrlMatcherWithBypassResult::kMatchAndNoBypass; } - const bool no_match = partition_matcher.bypass_matcher->Evaluate( - top_frame_site->GetURL()) == - net::SchemeHostPortMatcherResult::kNoMatch; - vlog("bypass_matcher.NoMatch", no_match); - return no_match ? UrlMatcherWithBypassResult::kMatchAndNoBypass - : UrlMatcherWithBypassResult::kMatchAndBypass; } } @@ -264,4 +277,22 @@ return UrlMatcherWithBypassResult::kNoMatch; } +// Define PartitionMatcher. +UrlMatcherWithBypass::PartitionMatcher::PartitionMatcher( + std::vector<raw_ptr<net::SchemeHostPortMatcher>> matcher_ptrs, + unsigned int bypass_matcher_key) + : matchers(std::move(matcher_ptrs)), + bypass_matcher_key(bypass_matcher_key) {} + +UrlMatcherWithBypass::PartitionMatcher::~PartitionMatcher() = default; + +UrlMatcherWithBypass::PartitionMatcher::PartitionMatcher( + const PartitionMatcher& other) = default; + +size_t UrlMatcherWithBypass::PartitionMatcher::EstimateMemoryUsage() const { + return sizeof(matchers) + + +(matchers.capacity() * sizeof(raw_ptr<net::SchemeHostPortMatcher>)) + + sizeof(bypass_matcher_key); +} + } // namespace ip_protection
diff --git a/components/ip_protection/common/url_matcher_with_bypass.h b/components/ip_protection/common/url_matcher_with_bypass.h index d13f209..fd34cc2 100644 --- a/components/ip_protection/common/url_matcher_with_bypass.h +++ b/components/ip_protection/common/url_matcher_with_bypass.h
@@ -11,6 +11,7 @@ #include <unordered_set> #include <vector> +#include "base/memory/raw_ptr.h" #include "base/trace_event/memory_usage_estimator.h" #include "base/types/optional_ref.h" #include "components/privacy_sandbox/masked_domain_list/masked_domain_list.pb.h" @@ -75,9 +76,6 @@ // See base/trace_event/memory_usage_estimator.h for more info. size_t EstimateMemoryUsage() const; - static std::unique_ptr<net::SchemeHostPortMatcher> BuildBypassMatcher( - const masked_domain_list::ResourceOwner& resource_owner); - // Determine the partition of the `match_list_with_bypass_map_` that contains // the given domain. static std::string PartitionMapKey(std::string_view domain); @@ -89,26 +87,47 @@ private: struct PartitionMatcher { - net::SchemeHostPortMatcher matcher; - raw_ptr<net::SchemeHostPortMatcher> bypass_matcher; + PartitionMatcher( + std::vector<raw_ptr<net::SchemeHostPortMatcher>> matcher_ptrs, + unsigned int bypass_matcher_key); - size_t EstimateMemoryUsage() const { - return base::trace_event::EstimateMemoryUsage(matcher) + - sizeof(bypass_matcher); - } + ~PartitionMatcher(); + + PartitionMatcher(const PartitionMatcher& other); + + std::vector<raw_ptr<net::SchemeHostPortMatcher>> matchers; + + // If this is set to 0, then the bypass matcher is not used. Otherwise, maps + // to a vector of bypass matchers in `bypass_matchers_map_`. + unsigned int bypass_matcher_key; + + // Estimates dynamic memory usage. + // See base/trace_event/memory_usage_estimator.h for more info. + size_t EstimateMemoryUsage() const; }; - // Contains a single bypass matcher for each ResourceOwner that is referenced - // by `match_list_with_bypass_map_`. - std::vector<std::unique_ptr<net::SchemeHostPortMatcher>> bypass_matchers_; - - // Empty matcher used by reference instead of creating new empty instances. - net::SchemeHostPortMatcher empty_bypass_matcher_; + // Maps bypass matcher keys to the bypass matchers. Each bypass matcher key in + // partition matcher in `match_list_with_bypass_map_` references a vector of + // bypass matchers in this map. The key 0 is reserved for matchers that are + // not used as a bypass matcher. + // NOTE: bypass_matchers_map_ must be declared before + // match_list_with_bypass_map_ to ensure that the bypass matchers are + // destroyed after the match list. + std::map<unsigned int, + std::vector<std::unique_ptr<net::SchemeHostPortMatcher>>> + bypass_matchers_map_; // Maps partition map keys to smaller maps of domains eligible for the match // list and the top frame domains that allow the match list to be bypassed. std::map<std::string, std::vector<PartitionMatcher>> match_list_with_bypass_map_; + + // This is used to generate a unique key for each bypass matcher. It MUST be + // incremented for each resource owner that requires a bypass matcher to be + // added AND set to 0 when `bypass_matchers_` is + // cleared. + // NOTE: 0 is reserved for matchers that do are not used as a bypass matcher. + unsigned int bypass_matcher_key_ = 0; }; } // namespace ip_protection
diff --git a/components/ip_protection/common/url_matcher_with_bypass_unittest.cc b/components/ip_protection/common/url_matcher_with_bypass_unittest.cc index b3b5e9b5..b1d75f6 100644 --- a/components/ip_protection/common/url_matcher_with_bypass_unittest.cc +++ b/components/ip_protection/common/url_matcher_with_bypass_unittest.cc
@@ -43,19 +43,6 @@ EXPECT_EQ(PartitionMapKey("foo.co.uk"), "co.uk"); } -TEST_F(UrlMatcherWithBypassTest, BuildBypassMatcher_Dedupes) { - auto resource_owner = masked_domain_list::ResourceOwner(); - resource_owner.add_owned_properties("example.com"); - resource_owner.add_owned_properties("example2.com"); - auto* resource = resource_owner.add_owned_resources(); - resource->set_domain("example.com"); - auto bypass_matcher = - UrlMatcherWithBypass::BuildBypassMatcher(resource_owner); - - // 2 distinct domains become 4 rules because of subdomain matching rules. - EXPECT_EQ(bypass_matcher->rules().size(), 4u); -} - TEST_F(UrlMatcherWithBypassTest, GetEligibleDomains_DoesNotRemoveDomainsIfExclusionSetIsEmpty) { auto resource_owner = masked_domain_list::ResourceOwner();
diff --git a/components/media_effects/media_effects_model_provider.h b/components/media_effects/media_effects_model_provider.h index a1540c9..14e35718 100644 --- a/components/media_effects/media_effects_model_provider.h +++ b/components/media_effects/media_effects_model_provider.h
@@ -9,6 +9,7 @@ #include "base/files/file_path.h" #include "base/observer_list_types.h" +#include "base/types/optional_ref.h" class MediaEffectsModelProvider { public: @@ -16,8 +17,10 @@ public: // Invoked when background segmentation model becomes available or was // updated. `path` will contain the file system path to the new model file. + // If `path` is a nullopt, it means that there is no new model file + // available and the consumers of the old model file should cease using it. virtual void OnBackgroundSegmentationModelUpdated( - const base::FilePath& path) = 0; + base::optional_ref<const base::FilePath> path) = 0; }; virtual ~MediaEffectsModelProvider() = default;
diff --git a/components/media_effects/media_effects_service.cc b/components/media_effects/media_effects_service.cc index 91c38a5..d449884 100644 --- a/components/media_effects/media_effects_service.cc +++ b/components/media_effects/media_effects_service.cc
@@ -91,9 +91,17 @@ } void MediaEffectsService::OnBackgroundSegmentationModelUpdated( - const base::FilePath& path) { + base::optional_ref<const base::FilePath> path) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + if (!path.has_value()) { + // We have not received a valid path, so there is nothing to open. + // Just pass an invalid `base::File`, it will be handled by lower + // layers. + OnBackgroundSegmentationModelOpened(base::File()); + return; + } + // We have received new path to the model, let's open it and inform the Video // Effects Service about it. Opening a file is considered blocking, schedule // it in a context where blocking is allowed: @@ -110,7 +118,7 @@ return model; }, - path), + *path), base::BindOnce(&MediaEffectsService::OnBackgroundSegmentationModelOpened, weak_factory_.GetWeakPtr())); } @@ -119,6 +127,9 @@ base::File model_file) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + video_effects::GetVideoEffectsService()->SetBackgroundSegmentationModel( + model_file.Duplicate()); + // Swap newly opened file with the old one and then close the old one: std::swap(latest_segmentation_model_file_, model_file); // Closing a file is considered blocking, schedule it in a context where @@ -128,14 +139,6 @@ FROM_HERE, {base::MayBlock()}, base::DoNothingWithBoundArgs(std::move(model_file))); } - - // Propagate the new file to Video Effects Service if valid: - if (!latest_segmentation_model_file_.IsValid()) { - return; - } - - video_effects::GetVideoEffectsService()->SetBackgroundSegmentationModel( - latest_segmentation_model_file_.Duplicate()); } VideoEffectsManagerImpl& MediaEffectsService::GetOrCreateVideoEffectsManager(
diff --git a/components/media_effects/media_effects_service.h b/components/media_effects/media_effects_service.h index b1ae444d..ebd36a25 100644 --- a/components/media_effects/media_effects_service.h +++ b/components/media_effects/media_effects_service.h
@@ -82,7 +82,7 @@ // MediaEffectsModelProvider::Observer: void OnBackgroundSegmentationModelUpdated( - const base::FilePath& path) override; + base::optional_ref<const base::FilePath> path) override; private: VideoEffectsManagerImpl& GetOrCreateVideoEffectsManager(
diff --git a/components/media_effects/media_effects_service_unittest.cc b/components/media_effects/media_effects_service_unittest.cc index 9bbc5f7..19504d1 100644 --- a/components/media_effects/media_effects_service_unittest.cc +++ b/components/media_effects/media_effects_service_unittest.cc
@@ -5,6 +5,7 @@ #include "components/media_effects/media_effects_service.h" #include <memory> +#include <optional> #include "base/containers/span.h" #include "base/files/file_path.h" @@ -58,7 +59,7 @@ void AddObserver(Observer* observer) override { observers_.AddObserver(observer); if (model_path_) { - observer->OnBackgroundSegmentationModelUpdated(*model_path_); + observer->OnBackgroundSegmentationModelUpdated(model_path_); } } @@ -67,10 +68,10 @@ } // Sets the model path and notifies observers about it: - void SetModelPath(base::FilePath model_path) { + void SetModelPath(std::optional<base::FilePath> model_path) { model_path_ = std::move(model_path); for (auto& observer : observers_) { - observer.OnBackgroundSegmentationModelUpdated(*model_path_); + observer.OnBackgroundSegmentationModelUpdated(model_path_); } } @@ -377,9 +378,14 @@ fake_effects_service.GetBackgroundSegmentationModelFuture(); model_provider_->SetModelPath( temporary_directory.GetPath().AppendASCII("should_not_exist.tmp")); - // Since we want to make sure that the service did *not* receive the model - // file, make the run loop run until it's idle and then verify that the future - // is not ready. - base::RunLoop().RunUntilIdle(); - EXPECT_FALSE(model_opened_future->IsReady()); + + model_file = model_opened_future->Take(); + EXPECT_FALSE(model_file.IsValid()); + + model_opened_future = + fake_effects_service.GetBackgroundSegmentationModelFuture(); + model_provider_->SetModelPath(std::nullopt); + + model_file = model_opened_future->Take(); + EXPECT_FALSE(model_file.IsValid()); }
diff --git a/components/metrics/dwa/BUILD.gn b/components/metrics/dwa/BUILD.gn index 05a32f1..103b600 100644 --- a/components/metrics/dwa/BUILD.gn +++ b/components/metrics/dwa/BUILD.gn
@@ -34,6 +34,7 @@ "//components/prefs:prefs", "//components/version_info:version_info", "//mojo/public/cpp/bindings", + "//net:net", ] }
diff --git a/components/metrics/dwa/DEPS b/components/metrics/dwa/DEPS index 16764a92..b3a9001 100644 --- a/components/metrics/dwa/DEPS +++ b/components/metrics/dwa/DEPS
@@ -1,3 +1,4 @@ include_rules = [ "+mojo/public/cpp/bindings", + "+net/base/registry_controlled_domains", ]
diff --git a/components/metrics/dwa/dwa_entry_builder.cc b/components/metrics/dwa/dwa_entry_builder.cc index fe9b69a..019a2f7 100644 --- a/components/metrics/dwa/dwa_entry_builder.cc +++ b/components/metrics/dwa/dwa_entry_builder.cc
@@ -14,7 +14,7 @@ DwaEntryBuilder::~DwaEntryBuilder() = default; void DwaEntryBuilder::SetContent(std::string_view content) { - SetContentInternal(base::HashMetricName(content)); + SetContentInternal(base::HashMetricName(SanitizeContent(content))); } void DwaEntryBuilder::SetMetric(std::string_view metric_name, int64_t value) {
diff --git a/components/metrics/dwa/dwa_entry_builder_base.cc b/components/metrics/dwa/dwa_entry_builder_base.cc index fc48e97c..4755ded 100644 --- a/components/metrics/dwa/dwa_entry_builder_base.cc +++ b/components/metrics/dwa/dwa_entry_builder_base.cc
@@ -1,4 +1,4 @@ -// Copyright 2024 The Chromium Authors +// 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. @@ -11,8 +11,18 @@ #include "base/containers/flat_set.h" #include "base/metrics/metrics_hashes.h" #include "components/metrics/dwa/mojom/dwa_interface.mojom.h" +#include "net/base/registry_controlled_domains/registry_controlled_domain.h" +#include "url/gurl.h" namespace dwa::internal { +namespace { + +std::string GetEtldPlusOne(const GURL& url) { + return net::registry_controlled_domains::GetDomainAndRegistry( + url, net::registry_controlled_domains::INCLUDE_PRIVATE_REGISTRIES); +} + +} // namespace DwaEntryBuilderBase::DwaEntryBuilderBase(DwaEntryBuilderBase&&) = default; @@ -52,4 +62,8 @@ return &entry_; } +std::string DwaEntryBuilderBase::SanitizeContent(std::string_view content) { + return GetEtldPlusOne(GURL(content)); +} + } // namespace dwa::internal
diff --git a/components/metrics/dwa/dwa_entry_builder_base.h b/components/metrics/dwa/dwa_entry_builder_base.h index b1f1f4e..a9efef61 100644 --- a/components/metrics/dwa/dwa_entry_builder_base.h +++ b/components/metrics/dwa/dwa_entry_builder_base.h
@@ -1,4 +1,4 @@ -// Copyright 2024 The Chromium Authors +// 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. @@ -36,6 +36,11 @@ // Return a pointer to internal DwaEntryPtr for testing. metrics::dwa::mojom::DwaEntryPtr* GetEntryForTesting(); + // Sanitizes `content` and returns the sanitized content as a string. For + // contents which are URLs, the eTLD+1 domain is returned. All content URLs + // logged by DWA are required to be eTLD+1. + static std::string SanitizeContent(std::string_view content); + protected: explicit DwaEntryBuilderBase(uint64_t event_hash);
diff --git a/components/metrics/dwa/dwa_entry_builder_unittest.cc b/components/metrics/dwa/dwa_entry_builder_unittest.cc index dd4d15c..917a678 100644 --- a/components/metrics/dwa/dwa_entry_builder_unittest.cc +++ b/components/metrics/dwa/dwa_entry_builder_unittest.cc
@@ -1,4 +1,4 @@ -// Copyright 2024 The Chromium Authors +// 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. @@ -49,13 +49,50 @@ TEST(DwaEntryBuilderTest, BuilderAllowsSettingContent) { DwaEntryBuilder builder("Kangaroo.Jumped"); - builder.SetContent("content_"); + builder.SetContent("https://google.com/content"); EXPECT_THAT((*builder.GetEntryForTesting())->content_hash, - testing::Eq(base::HashMetricName("content_"))); + testing::Eq(base::HashMetricName("google.com"))); + // Invalid content are expected to be hashed as empty strings. builder.SetContent("content_"); EXPECT_THAT((*builder.GetEntryForTesting())->content_hash, - testing::Eq(base::HashMetricName("content_"))); + testing::Eq(base::HashMetricName(""))); +} + +TEST(DwaEntryBuilderTest, SanitizeContent) { + struct { + std::string input; + std::string expected_output; + } test_cases[] = { + {"https://google.com", "google.com"}, + {"https://google.com/", "google.com"}, + {"https://google.com/mail", "google.com"}, + {"https://google.com/file.html", "google.com"}, + {"https://www.google.com/mail", "google.com"}, + {"https://..google.com/file.html", "google.com"}, + {"https://www.google.co.uk/mail", "google.co.uk"}, + {"http://www.google.co.uk/mail", "google.co.uk"}, + {"http://www.google.co.uk/mail/", "google.co.uk"}, + {"http://www.google.co.uk/xyz/index.html", "google.co.uk"}, + {"mail://www.google.co.uk/mail", "google.co.uk"}, + {"https://google.com./file.html", "google.com."}, + {"https://a.b.co.uk/file.html", "b.co.uk"}, + {"http://foo.bar/file.html", "foo.bar"}, + {"google.co.uk/", ""}, + {"google.co.uk", ""}, + {"google.co.uk/mail", ""}, + {"www.google.co.uk/mail/", ""}, + {"file:///C:/bar.html", ""}, + {"http://foo.com../file.html", ""}, + {"http://192.168.0.1/file.html", ""}, + {"http://bar/file.html", ""}, + {"http://co.uk/file.html", ""}, + }; + + for (const auto& test_case : test_cases) { + EXPECT_THAT(DwaEntryBuilder::SanitizeContent(test_case.input), + testing::Eq(test_case.expected_output)); + } } } // namespace dwa
diff --git a/components/metrics/dwa/dwa_recorder_unittest.cc b/components/metrics/dwa/dwa_recorder_unittest.cc index 9fb7b92a..756fb57 100644 --- a/components/metrics/dwa/dwa_recorder_unittest.cc +++ b/components/metrics/dwa/dwa_recorder_unittest.cc
@@ -118,7 +118,7 @@ TEST_F(DwaRecorderEnabledTest, ValidateHasEntriesWhenEntryIsAdded) { ::dwa::DwaEntryBuilder builder("Kangaroo.Jumped"); - builder.SetContent("adtech.com"); + builder.SetContent("https://adtech.com"); builder.SetMetric("Length", 5); builder.Record(GetRecorder()); @@ -129,7 +129,7 @@ GetRecorder()->DisableRecording(); ::dwa::DwaEntryBuilder builder("Kangaroo.Jumped"); - builder.SetContent("adtech.com"); + builder.SetContent("https://adtech.com"); builder.SetMetric("Length", 5); builder.Record(GetRecorder()); @@ -139,13 +139,13 @@ TEST_F(DwaRecorderEnabledTest, ValidateOnPageLoadCreatesPageLoadEventsWithVaryingMetrics) { ::dwa::DwaEntryBuilder builder_1("Kangaroo.Jumped"); - builder_1.SetContent("adtech.com"); + builder_1.SetContent("https://adtech.com"); builder_1.SetMetric("Length", 5); builder_1.SetMetric("Width", 10); builder_1.Record(GetRecorder()); ::dwa::DwaEntryBuilder builder_2("Kangaroo.Jumped"); - builder_2.SetContent("adtech.com"); + builder_2.SetContent("https://adtech.com"); builder_2.SetMetric("Length", 3); builder_2.SetMetric("Width", 12); builder_2.Record(GetRecorder()); @@ -204,17 +204,17 @@ TEST_F(DwaRecorderEnabledTest, ValidateOnPageLoadCreatesPageLoadEventsWithVaryingContent) { ::dwa::DwaEntryBuilder builder_1("Kangaroo.Jumped"); - builder_1.SetContent("adtech.com"); + builder_1.SetContent("https://adtech.com"); builder_1.SetMetric("Latency", 10); builder_1.Record(GetRecorder()); ::dwa::DwaEntryBuilder builder_2("Kangaroo.Jumped"); - builder_2.SetContent("adtech.com"); + builder_2.SetContent("https://adtech.com"); builder_2.SetMetric("Latency", 12); builder_2.Record(GetRecorder()); ::dwa::DwaEntryBuilder builder_3("Kangaroo.Jumped"); - builder_3.SetContent("adtech2.com"); + builder_3.SetContent("https://adtech2.com"); builder_3.SetMetric("Latency", 14); builder_3.Record(GetRecorder()); @@ -247,17 +247,17 @@ TEST_F(DwaRecorderEnabledTest, ValidateOnPageLoadCreatesPageLoadEventsWithVaryingEvents) { ::dwa::DwaEntryBuilder builder_1("Kangaroo.Jumped"); - builder_1.SetContent("adtech.com"); + builder_1.SetContent("https://adtech.com"); builder_1.SetMetric("Latency", 10); builder_1.Record(GetRecorder()); ::dwa::DwaEntryBuilder builder_2("Kangaroo.Jumped"); - builder_2.SetContent("adtech.com"); + builder_2.SetContent("https://adtech.com"); builder_2.SetMetric("Latency", 12); builder_2.Record(GetRecorder()); ::dwa::DwaEntryBuilder builder_3("Frog.Leaped"); - builder_3.SetContent("adtech.com"); + builder_3.SetContent("https://adtech.com"); builder_3.SetMetric("Latency", 14); builder_3.Record(GetRecorder()); @@ -289,7 +289,7 @@ ->Activate(); ::dwa::DwaEntryBuilder builder_1("Kangaroo.Jumped"); - builder_1.SetContent("adtech.com"); + builder_1.SetContent("https://adtech.com"); builder_1.AddToStudiesOfInterest("test_trial_1"); builder_1.AddToStudiesOfInterest("test_trial_2"); builder_1.SetMetric("Latency", 10); @@ -299,7 +299,7 @@ ::dwa::DwaEntryBuilder builder_2("Frog.Leaped"); builder_2.AddToStudiesOfInterest("test_trial_3"); - builder_2.SetContent("adtech.com"); + builder_2.SetContent("https://adtech.com"); builder_2.SetMetric("Latency", 12); builder_2.Record(GetRecorder()); @@ -336,7 +336,7 @@ TEST_F(DwaRecorderDisabledTest, FeatureDisabled) { ::dwa::DwaEntryBuilder builder("Kangaroo.Jumped"); - builder.SetContent("adtech.com"); + builder.SetContent("https://adtech.com"); builder.SetMetric("Length", 5); builder.Record(GetRecorder());
diff --git a/components/metrics/dwa/dwa_service_unittest.cc b/components/metrics/dwa/dwa_service_unittest.cc index 471d5c7..63af1e3 100644 --- a/components/metrics/dwa/dwa_service_unittest.cc +++ b/components/metrics/dwa/dwa_service_unittest.cc
@@ -59,7 +59,7 @@ // Records a test data DWA metric into DwaRecorder. void RecordTestMetric() { ::dwa::DwaEntryBuilder builder("Kangaroo.Jumped"); - builder.SetContent("adtech.com"); + builder.SetContent("https://adtech.com"); builder.SetMetric("Length", 5); builder.Record(DwaRecorder::Get()); }
diff --git a/components/omnibox/common/android/java/src/org/chromium/components/omnibox/OmniboxFeatures.java b/components/omnibox/common/android/java/src/org/chromium/components/omnibox/OmniboxFeatures.java index 0e0bedb..f9808f6 100644 --- a/components/omnibox/common/android/java/src/org/chromium/components/omnibox/OmniboxFeatures.java +++ b/components/omnibox/common/android/java/src/org/chromium/components/omnibox/OmniboxFeatures.java
@@ -158,12 +158,6 @@ public static final BooleanCachedFeatureParam sRichInlineShowFullUrl = newBooleanParam(sRichInlineAutocomplete, "rich_autocomplete_full_url", true); - public static final IntCachedFeatureParam sRichInlineMinimumInputChars = - newIntParam( - sRichInlineAutocomplete, - "rich_autocomplete_minimum_characters", - DEFAULT_RICH_INLINE_MIN_CHAR); - public static final IntCachedFeatureParam sJumpStartOmniboxMemoryThresholdKb = newIntParam(sJumpStartOmnibox, "jump_start_memory_threshold_kb", 2 * 1024 * 1024); @@ -343,7 +337,7 @@ public static boolean shouldShowRichInlineAutocompleteUrl(int inputCount) { return sRichInlineAutocomplete.isEnabled() && sRichInlineShowFullUrl.getValue() - && inputCount >= sRichInlineMinimumInputChars.getValue(); + && inputCount >= DEFAULT_RICH_INLINE_MIN_CHAR; } /** Modifies the output of {@link #shouldRetainOmniboxOnFocus()} for testing. */
diff --git a/components/optimization_guide/core/BUILD.gn b/components/optimization_guide/core/BUILD.gn index 3997e81f..0309dc9 100644 --- a/components/optimization_guide/core/BUILD.gn +++ b/components/optimization_guide/core/BUILD.gn
@@ -249,8 +249,6 @@ "model_execution/model_execution_manager.h", "model_execution/model_execution_util.cc", "model_execution/model_execution_util.h", - "model_execution/on_device_asset_manager.cc", - "model_execution/on_device_asset_manager.h", "model_execution/on_device_model_access_controller.cc", "model_execution/on_device_model_access_controller.h", "model_execution/on_device_model_adaptation_controller.cc", @@ -525,7 +523,6 @@ "model_execution/model_execution_features_unittest.cc", "model_execution/model_execution_fetcher_unittest.cc", "model_execution/model_execution_manager_unittest.cc", - "model_execution/on_device_asset_manager_unittest.cc", "model_execution/on_device_model_adaptation_loader_unittest.cc", "model_execution/on_device_model_component_unittest.cc", "model_execution/on_device_model_execution_proto_value_utils_unittest.cc",
diff --git a/components/optimization_guide/core/model_execution/model_execution_manager.cc b/components/optimization_guide/core/model_execution/model_execution_manager.cc index b79788b..93bbf8c0 100644 --- a/components/optimization_guide/core/model_execution/model_execution_manager.cc +++ b/components/optimization_guide/core/model_execution/model_execution_manager.cc
@@ -122,6 +122,31 @@ nullptr); } +std::map<ModelBasedCapabilityKey, OnDeviceModelAdaptationLoader> +GetRequiredModelAdaptationLoaders( + OptimizationGuideModelProvider* model_provider, + base::WeakPtr<OnDeviceModelComponentStateManager> + on_device_component_state_manager, + PrefService* local_state, + base::WeakPtr<OnDeviceModelServiceController> + on_device_model_service_controller) { + std::map<ModelBasedCapabilityKey, OnDeviceModelAdaptationLoader> loaders; + for (const auto feature : kAllModelBasedCapabilityKeys) { + if (!features::internal::GetOptimizationTargetForCapability(feature)) { + continue; + } + loaders.emplace( + std::piecewise_construct, std::forward_as_tuple(feature), + std::forward_as_tuple( + feature, model_provider, on_device_component_state_manager, + local_state, + base::BindRepeating( + &OnDeviceModelServiceController::MaybeUpdateModelAdaptation, + on_device_model_service_controller, feature))); + } + return loaders; +} + } // namespace using ModelExecutionError = @@ -129,13 +154,18 @@ ModelExecutionManager::ModelExecutionManager( scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory, + PrefService* local_state, signin::IdentityManager* identity_manager, scoped_refptr<OnDeviceModelServiceController> on_device_model_service_controller, + OptimizationGuideModelProvider* model_provider, + base::WeakPtr<OnDeviceModelComponentStateManager> + on_device_component_state_manager, OptimizationGuideLogger* optimization_guide_logger, base::WeakPtr<ModelQualityLogsUploaderService> model_quality_uploader_service) : model_quality_uploader_service_(model_quality_uploader_service), + on_device_component_state_manager_(on_device_component_state_manager), optimization_guide_logger_(optimization_guide_logger), model_execution_service_url_(net::AppendOrReplaceQueryParameter( GetModelExecutionServiceURL(), @@ -143,11 +173,47 @@ features::GetOptimizationGuideServiceAPIKey())), url_loader_factory_(url_loader_factory), identity_manager_(identity_manager), + model_adaptation_loaders_(GetRequiredModelAdaptationLoaders( + model_provider, + on_device_component_state_manager_, + local_state, + on_device_model_service_controller + ? on_device_model_service_controller->GetWeakPtr() + : nullptr)), + model_provider_(model_provider), on_device_model_service_controller_( std::move(on_device_model_service_controller)) { + if (!model_provider_ && !on_device_model_service_controller_) { + return; + } + if (!features::ShouldUseTextSafetyClassifierModel()) { + return; + } + if (GetGenAILocalFoundationalModelEnterprisePolicySettings(local_state) != + model_execution::prefs:: + GenAILocalFoundationalModelEnterprisePolicySettings::kAllowed) { + return; + } + + if (on_device_component_state_manager_) { + on_device_component_state_manager_->AddObserver(this); + if (on_device_component_state_manager_->IsInstallerRegistered()) { + RegisterTextSafetyAndLanguageModels(); + } + } } ModelExecutionManager::~ModelExecutionManager() { + if (on_device_component_state_manager_) { + on_device_component_state_manager_->RemoveObserver(this); + } + if (did_register_for_supplementary_on_device_models_) { + model_provider_->RemoveObserverForOptimizationTargetModel( + proto::OptimizationTarget::OPTIMIZATION_TARGET_TEXT_SAFETY, this); + model_provider_->RemoveObserverForOptimizationTargetModel( + proto::OptimizationTarget::OPTIMIZATION_TARGET_LANGUAGE_DETECTION, + this); + } } void ModelExecutionManager::Shutdown() { @@ -260,6 +326,11 @@ std::move(execute_fn), config_params); } +// Whether the supplementary on-device models are registered. +bool ModelExecutionManager::IsSupplementaryModelRegistered() { + return did_register_for_supplementary_on_device_models_; +} + void ModelExecutionManager::OnModelExecuteResponse( ModelBasedCapabilityKey feature, std::unique_ptr<proto::LogAiDataRequest> log_ai_data_request, @@ -395,6 +466,47 @@ std::move(log_entry)); } +void ModelExecutionManager::RegisterTextSafetyAndLanguageModels() { + if (!did_register_for_supplementary_on_device_models_) { + did_register_for_supplementary_on_device_models_ = true; + model_provider_->AddObserverForOptimizationTargetModel( + proto::OptimizationTarget::OPTIMIZATION_TARGET_TEXT_SAFETY, + /*model_metadata=*/std::nullopt, this); + model_provider_->AddObserverForOptimizationTargetModel( + proto::OptimizationTarget::OPTIMIZATION_TARGET_LANGUAGE_DETECTION, + /*model_metadata=*/std::nullopt, this); + } +} + +void ModelExecutionManager::OnModelUpdated( + proto::OptimizationTarget optimization_target, + base::optional_ref<const ModelInfo> model_info) { + switch (optimization_target) { + case proto::OPTIMIZATION_TARGET_TEXT_SAFETY: + if (on_device_model_service_controller_) { + on_device_model_service_controller_->MaybeUpdateSafetyModel(model_info); + } + break; + + case proto::OPTIMIZATION_TARGET_LANGUAGE_DETECTION: + if (on_device_model_service_controller_) { + on_device_model_service_controller_->SetLanguageDetectionModel( + model_info); + } + break; + + default: + break; + } +} + +void ModelExecutionManager::StateChanged( + const OnDeviceModelComponentState* state) { + if (state) { + RegisterTextSafetyAndLanguageModels(); + } +} + optimization_guide::OnDeviceModelEligibilityReason ModelExecutionManager::GetOnDeviceModelEligibility( optimization_guide::ModelBasedCapabilityKey feature) {
diff --git a/components/optimization_guide/core/model_execution/model_execution_manager.h b/components/optimization_guide/core/model_execution/model_execution_manager.h index 52a3ef3b..51398810 100644 --- a/components/optimization_guide/core/model_execution/model_execution_manager.h +++ b/components/optimization_guide/core/model_execution/model_execution_manager.h
@@ -19,6 +19,8 @@ #include "components/optimization_guide/core/optimization_target_model_observer.h" #include "components/optimization_guide/proto/model_execution.pb.h" #include "components/optimization_guide/proto/model_quality_service.pb.h" +#include "mojo/public/cpp/bindings/pending_remote.h" +#include "services/on_device_model/public/mojom/on_device_model.mojom.h" #include "url/gurl.h" class OptimizationGuideLogger; @@ -34,19 +36,28 @@ namespace optimization_guide { class ModelExecutionFetcher; +class OnDeviceModelAdaptationLoader; class OnDeviceModelServiceController; +class OptimizationGuideModelProvider; -class ModelExecutionManager final { +class ModelExecutionManager + : public OptimizationTargetModelObserver, + public OnDeviceModelComponentStateManager::Observer { public: ModelExecutionManager( scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory, + PrefService* local_state, signin::IdentityManager* identity_manager, scoped_refptr<OnDeviceModelServiceController> on_device_model_service_controller, + OptimizationGuideModelProvider* model_provider, + base::WeakPtr<OnDeviceModelComponentStateManager> + on_device_component_state_manager, OptimizationGuideLogger* optimization_guide_logger, base::WeakPtr<ModelQualityLogsUploaderService> model_quality_uploader_service); - ~ModelExecutionManager(); + + ~ModelExecutionManager() override; ModelExecutionManager(const ModelExecutionManager&) = delete; ModelExecutionManager& operator=(const ModelExecutionManager&) = delete; @@ -78,6 +89,16 @@ ModelBasedCapabilityKey feature, const std::optional<SessionConfigParams>& config_params); + // Whether the supplementary on-device models are registered. + bool IsSupplementaryModelRegistered(); + + // OptimizationTargetModelObserver: + void OnModelUpdated(proto::OptimizationTarget target, + base::optional_ref<const ModelInfo> model_info) override; + + // OnDeviceModelComponentStateManager::Observer: + void StateChanged(const OnDeviceModelComponentState* state) override; + void Shutdown(); private: @@ -89,12 +110,19 @@ base::expected<const proto::ExecuteResponse, OptimizationGuideModelExecutionError> execute_response); + // Registers text safety and language detection models. Does nothing if + // already registered. + void RegisterTextSafetyAndLanguageModels(); + // Owned by OptimizationGuideKeyedService and outlives `this`. This is to be // passed through the ModelQualityLogEntry to invoke upload during log // destruction. base::WeakPtr<ModelQualityLogsUploaderService> model_quality_uploader_service_; + base::WeakPtr<OnDeviceModelComponentStateManager> + on_device_component_state_manager_; + // Owned by OptimizationGuideKeyedService and outlives `this`. raw_ptr<OptimizationGuideLogger> optimization_guide_logger_; @@ -112,10 +140,21 @@ // incognito profiles. const raw_ptr<signin::IdentityManager> identity_manager_; + // Map from feature to its model adaptation loader. Present only for features + // that require model adaptation. + const std::map<ModelBasedCapabilityKey, OnDeviceModelAdaptationLoader> + model_adaptation_loaders_; + + // The model provider to observe for updates to auxiliary models. + raw_ptr<OptimizationGuideModelProvider> model_provider_; + // Controller for the on-device service. scoped_refptr<OnDeviceModelServiceController> on_device_model_service_controller_; + // Whether the user registered for supplementary on-device models. + bool did_register_for_supplementary_on_device_models_ = false; + SEQUENCE_CHECKER(sequence_checker_); // Used to get `weak_ptr_` to self.
diff --git a/components/optimization_guide/core/model_execution/model_execution_manager_unittest.cc b/components/optimization_guide/core/model_execution/model_execution_manager_unittest.cc index 770ac5d..16234d1 100644 --- a/components/optimization_guide/core/model_execution/model_execution_manager_unittest.cc +++ b/components/optimization_guide/core/model_execution/model_execution_manager_unittest.cc
@@ -7,16 +7,18 @@ #include <memory> #include "base/files/file_path.h" -#include "base/functional/callback_helpers.h" #include "base/test/metrics/histogram_tester.h" #include "base/test/scoped_feature_list.h" #include "base/test/task_environment.h" #include "base/test/test.pb.h" #include "base/test/test_future.h" +#include "components/optimization_guide/core/model_execution/model_execution_features.h" +#include "components/optimization_guide/core/model_execution/model_execution_prefs.h" #include "components/optimization_guide/core/model_execution/on_device_model_access_controller.h" #include "components/optimization_guide/core/model_execution/on_device_model_service_controller.h" #include "components/optimization_guide/core/model_execution/test/request_builder.h" #include "components/optimization_guide/core/model_execution/test/response_holder.h" +#include "components/optimization_guide/core/model_execution/test/test_on_device_model_component_state_manager.h" #include "components/optimization_guide/core/optimization_guide_constants.h" #include "components/optimization_guide/core/optimization_guide_logger.h" #include "components/optimization_guide/core/optimization_guide_model_executor.h" @@ -53,9 +55,68 @@ return execute_response; } +class FakeServiceController : public OnDeviceModelServiceController { + public: + FakeServiceController() + : OnDeviceModelServiceController(nullptr, nullptr, base::DoNothing()) {} + + void MaybeUpdateSafetyModel( + base::optional_ref<const ModelInfo> model_info) override { + received_safety_info_ = true; + } + + bool received_safety_info() const { return received_safety_info_; } + + std::optional<base::FilePath> language_detection_model_path() { + return OnDeviceModelServiceController::language_detection_model_path(); + } + + private: + ~FakeServiceController() override = default; + + bool received_safety_info_ = false; +}; + +class FakeModelProvider : public TestOptimizationGuideModelProvider { + public: + void AddObserverForOptimizationTargetModel( + proto::OptimizationTarget optimization_target, + const std::optional<optimization_guide::proto::Any>& model_metadata, + OptimizationTargetModelObserver* observer) override { + switch (optimization_target) { + case proto::OPTIMIZATION_TARGET_TEXT_SAFETY: + registered_for_text_safety_ = true; + break; + + case proto::OPTIMIZATION_TARGET_LANGUAGE_DETECTION: + registered_for_language_detection_ = true; + break; + + default: + NOTREACHED(); + } + } + + void Reset() { + registered_for_text_safety_ = false; + registered_for_language_detection_ = false; + } + + bool was_registered() const { + return registered_for_text_safety_ && registered_for_language_detection_; + } + + private: + bool registered_for_text_safety_ = false; + bool registered_for_language_detection_ = false; +}; + class ModelExecutionManagerTest : public testing::Test { public: - ModelExecutionManagerTest() = default; + ModelExecutionManagerTest() { + scoped_feature_list_.InitWithFeatures({}, + {features::kTextSafetyClassifier}); + } ~ModelExecutionManagerTest() override = default; // Sets up most of the fields except `model_execution_manager_` and @@ -64,11 +125,29 @@ url_loader_factory_ = base::MakeRefCounted<network::WeakWrapperSharedURLLoaderFactory>( &test_url_loader_factory_); - service_controller_ = base::MakeRefCounted<OnDeviceModelServiceController>( - nullptr, nullptr, base::DoNothing()); + local_state_ = std::make_unique<TestingPrefServiceSimple>(); + model_execution::prefs::RegisterLocalStatePrefs(local_state_->registry()); + service_controller_ = base::MakeRefCounted<FakeServiceController>(); + } + + void CreateModelExecutionManager() { model_execution_manager_ = std::make_unique<ModelExecutionManager>( - url_loader_factory_, identity_test_env_.identity_manager(), - service_controller_, &optimization_guide_logger_, nullptr); + url_loader_factory_, local_state_.get(), + identity_test_env_.identity_manager(), service_controller_, + &model_provider_, + component_manager_ ? component_manager_->get()->GetWeakPtr() : nullptr, + &optimization_guide_logger_, nullptr); + } + + void CreateComponentManager(bool should_observe) { + component_manager_ = + std::make_unique<TestOnDeviceModelComponentStateManager>( + local_state_.get()); + component_manager_->get()->OnStartup(); + task_environment_.FastForwardBy(base::Seconds(1)); + if (should_observe) { + component_manager_->get()->AddObserver(model_execution_manager_.get()); + } } bool SimulateResponse(const std::string& content, @@ -100,7 +179,9 @@ return model_execution_manager_.get(); } - OnDeviceModelServiceController* service_controller() { + FakeModelProvider* model_provider() { return &model_provider_; } + + FakeServiceController* service_controller() { return service_controller_.get(); } @@ -114,25 +195,37 @@ EXPECT_THAT(body_bytes, HasSubstr(message)); } + void SetModelComponentReady() { + component_manager_->SetReady(base::FilePath()); + } + network::TestURLLoaderFactory* test_url_loader_factory() { return &test_url_loader_factory_; } + PrefService* local_state() { return local_state_.get(); } + + void Reset() { model_execution_manager_ = nullptr; } + private: base::test::TaskEnvironment task_environment_{ base::test::TaskEnvironment::TimeSource::MOCK_TIME}; base::test::ScopedFeatureList scoped_feature_list_; + std::unique_ptr<TestingPrefServiceSimple> local_state_; signin::IdentityTestEnvironment identity_test_env_; variations::ScopedVariationsIdsProvider scoped_variations_ids_provider_{ variations::VariationsIdsProvider::Mode::kUseSignedInState}; scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory_; network::TestURLLoaderFactory test_url_loader_factory_; - scoped_refptr<OnDeviceModelServiceController> service_controller_; + scoped_refptr<FakeServiceController> service_controller_; + std::unique_ptr<TestOnDeviceModelComponentStateManager> component_manager_; + FakeModelProvider model_provider_; OptimizationGuideLogger optimization_guide_logger_; std::unique_ptr<ModelExecutionManager> model_execution_manager_; }; TEST_F(ModelExecutionManagerTest, ExecuteModelEmptyAccessToken) { + CreateModelExecutionManager(); base::HistogramTester histogram_tester; ResponseHolder response_holder; model_execution_manager()->ExecuteModel( @@ -151,6 +244,7 @@ } TEST_F(ModelExecutionManagerTest, ExecuteModelWithUserSignIn) { + CreateModelExecutionManager(); base::HistogramTester histogram_tester; ResponseHolder response_holder; SetAutomaticIssueOfAccessTokens(); @@ -180,6 +274,7 @@ } TEST_F(ModelExecutionManagerTest, ExecuteModelWithServerError) { + CreateModelExecutionManager(); base::HistogramTester histogram_tester; ResponseHolder response_holder; @@ -211,6 +306,7 @@ TEST_F(ModelExecutionManagerTest, ExecuteModelWithServerErrorAllowedForLogging) { + CreateModelExecutionManager(); base::HistogramTester histogram_tester; ResponseHolder response_holder; @@ -252,6 +348,7 @@ } TEST_F(ModelExecutionManagerTest, ExecuteModelExecutionModeSetOnDeviceOnly) { + CreateModelExecutionManager(); base::HistogramTester histogram_tester; SetAutomaticIssueOfAccessTokens(); @@ -270,6 +367,7 @@ } TEST_F(ModelExecutionManagerTest, ExecuteModelExecutionModeSetToServerOnly) { + CreateModelExecutionManager(); base::HistogramTester histogram_tester; ResponseHolder response_holder; @@ -310,6 +408,7 @@ TEST_F(ModelExecutionManagerTest, ExecuteModelExecutionModeExplicitlySetToDefault) { + CreateModelExecutionManager(); base::HistogramTester histogram_tester; ResponseHolder response_holder; @@ -349,6 +448,7 @@ } TEST_F(ModelExecutionManagerTest, ExecuteModelWithPassthroughSession) { + CreateModelExecutionManager(); base::HistogramTester histogram_tester; ResponseHolder response_holder; @@ -382,6 +482,7 @@ } TEST_F(ModelExecutionManagerTest, LogsContextToExecutionTimeHistogram) { + CreateModelExecutionManager(); base::HistogramTester histogram_tester; SetAutomaticIssueOfAccessTokens(); auto session = model_execution_manager()->StartSession( @@ -422,6 +523,7 @@ TEST_F(ModelExecutionManagerTest, ExecuteModelWithPassthroughSessionAddContext) { + CreateModelExecutionManager(); ResponseHolder response_holder; SetAutomaticIssueOfAccessTokens(); auto session = model_execution_manager()->StartSession( @@ -438,6 +540,7 @@ TEST_F(ModelExecutionManagerTest, ExecuteModelWithPassthroughSessionMultipleAddContext) { + CreateModelExecutionManager(); ResponseHolder response_holder; SetAutomaticIssueOfAccessTokens(); auto session = model_execution_manager()->StartSession( @@ -454,6 +557,7 @@ TEST_F(ModelExecutionManagerTest, ExecuteModelWithPassthroughSessionExecuteOverridesAddContext) { + CreateModelExecutionManager(); ResponseHolder response_holder; SetAutomaticIssueOfAccessTokens(); auto session = model_execution_manager()->StartSession( @@ -469,6 +573,7 @@ } TEST_F(ModelExecutionManagerTest, TestMultipleParallelRequests) { + CreateModelExecutionManager(); base::HistogramTester histogram_tester; ResponseHolder response_holder1, response_holder2; @@ -517,6 +622,103 @@ "OptimizationGuide.ModelExecution.Result.Compose", false, 1); } +TEST_F(ModelExecutionManagerTest, DoesNotRegisterTextSafetyIfNotEnabled) { + CreateModelExecutionManager(); + EXPECT_FALSE(model_provider()->was_registered()); +} + +class ModelExecutionManagerSafetyEnabledTest + : public ModelExecutionManagerTest { + public: + ModelExecutionManagerSafetyEnabledTest() { + scoped_feature_list_.InitWithFeatures({features::kTextSafetyClassifier}, + {}); + } + + private: + base::test::ScopedFeatureList scoped_feature_list_; +}; + +#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) +TEST_F(ModelExecutionManagerSafetyEnabledTest, + RegistersTextSafetyModelWithOverrideModel) { + // Effectively, when an override is set, the model component will be ready + // before ModelExecutionManager can be added as an observer. Here we simulate + // that by simply setting up the component without adding + // ModelExecutionManager as an observer. + CreateComponentManager(/*should_observe=*/false); + SetModelComponentReady(); + CreateModelExecutionManager(); + + EXPECT_TRUE(model_provider()->was_registered()); +} + +TEST_F(ModelExecutionManagerSafetyEnabledTest, + RegistersTextSafetyModelIfEnabled) { + CreateModelExecutionManager(); + EXPECT_FALSE(model_provider()->was_registered()); + + // Text safety model should only be registered after the base model is ready. + local_state()->SetInteger( + model_execution::prefs::localstate::kOnDevicePerformanceClass, + base::to_underlying(OnDeviceModelPerformanceClass::kHigh)); + CreateComponentManager(/*should_observe=*/true); + SetModelComponentReady(); + + EXPECT_TRUE(model_provider()->was_registered()); +} +#endif + +TEST_F(ModelExecutionManagerSafetyEnabledTest, + DoesNotNotifyServiceControllerWrongTarget) { + CreateModelExecutionManager(); + std::unique_ptr<ModelInfo> model_info = + TestModelInfoBuilder().SetVersion(123).Build(); + model_execution_manager()->OnModelUpdated( + proto::OPTIMIZATION_TARGET_PAGE_ENTITIES, *model_info); + + EXPECT_FALSE(service_controller()->received_safety_info()); +} + +TEST_F(ModelExecutionManagerSafetyEnabledTest, NotifiesServiceController) { + CreateModelExecutionManager(); + std::unique_ptr<ModelInfo> model_info = + TestModelInfoBuilder().SetVersion(123).Build(); + model_execution_manager()->OnModelUpdated( + proto::OPTIMIZATION_TARGET_TEXT_SAFETY, *model_info); + + EXPECT_TRUE(service_controller()->received_safety_info()); +} + +TEST_F(ModelExecutionManagerSafetyEnabledTest, UpdateLanguageDetection) { + CreateModelExecutionManager(); + const base::FilePath kTestPath{FILE_PATH_LITERAL("foo")}; + std::unique_ptr<ModelInfo> model_info = TestModelInfoBuilder() + .SetVersion(123) + .SetModelFilePath(kTestPath) + .Build(); + model_execution_manager()->OnModelUpdated( + proto::OPTIMIZATION_TARGET_LANGUAGE_DETECTION, *model_info); + EXPECT_EQ(kTestPath, service_controller()->language_detection_model_path()); +} + +TEST_F(ModelExecutionManagerSafetyEnabledTest, + NotRegisteredWhenDisabledByEnterprisePolicy) { + CreateModelExecutionManager(); + model_provider()->Reset(); + local_state()->SetInteger( + model_execution::prefs::localstate:: + kGenAILocalFoundationalModelEnterprisePolicySettings, + static_cast<int>(model_execution::prefs:: + GenAILocalFoundationalModelEnterprisePolicySettings:: + kDisallowed)); + CreateModelExecutionManager(); + EXPECT_FALSE(model_provider()->was_registered()); + + // Reset manager to make sure removing observer doesn't crash. + Reset(); +} + } // namespace } // namespace optimization_guide
diff --git a/components/optimization_guide/core/model_execution/on_device_asset_manager.cc b/components/optimization_guide/core/model_execution/on_device_asset_manager.cc deleted file mode 100644 index b1f81df..0000000 --- a/components/optimization_guide/core/model_execution/on_device_asset_manager.cc +++ /dev/null
@@ -1,132 +0,0 @@ -// Copyright 2024 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "components/optimization_guide/core/model_execution/on_device_asset_manager.h" - -#include "components/optimization_guide/core/model_execution/model_execution_features.h" -#include "components/optimization_guide/core/model_execution/model_execution_util.h" -#include "components/optimization_guide/core/model_execution/on_device_model_adaptation_loader.h" -#include "components/optimization_guide/core/model_execution/on_device_model_service_controller.h" -#include "components/optimization_guide/core/optimization_guide_model_provider.h" - -namespace optimization_guide { - -namespace { - -std::map<ModelBasedCapabilityKey, OnDeviceModelAdaptationLoader> -GetRequiredModelAdaptationLoaders( - OptimizationGuideModelProvider* model_provider, - base::WeakPtr<OnDeviceModelComponentStateManager> - on_device_component_state_manager, - PrefService* local_state, - base::WeakPtr<OnDeviceModelServiceController> - on_device_model_service_controller) { - std::map<ModelBasedCapabilityKey, OnDeviceModelAdaptationLoader> loaders; - for (const auto feature : kAllModelBasedCapabilityKeys) { - if (!features::internal::GetOptimizationTargetForCapability(feature)) { - continue; - } - loaders.emplace( - std::piecewise_construct, std::forward_as_tuple(feature), - std::forward_as_tuple( - feature, model_provider, on_device_component_state_manager, - local_state, - base::BindRepeating( - &OnDeviceModelServiceController::MaybeUpdateModelAdaptation, - on_device_model_service_controller, feature))); - } - return loaders; -} - -} // namespace - -OnDeviceAssetManager::OnDeviceAssetManager( - PrefService* local_state, - base::WeakPtr<OnDeviceModelServiceController> service_controller, - base::WeakPtr<OnDeviceModelComponentStateManager> component_state_manager, - raw_ptr<OptimizationGuideModelProvider> model_provider) - : on_device_model_service_controller_(service_controller), - on_device_component_state_manager_(component_state_manager), - model_provider_(model_provider), - model_adaptation_loaders_( - GetRequiredModelAdaptationLoaders(model_provider, - on_device_component_state_manager_, - local_state, - service_controller)) { - if (!features::ShouldUseTextSafetyClassifierModel()) { - return; - } - if (GetGenAILocalFoundationalModelEnterprisePolicySettings(local_state) != - model_execution::prefs:: - GenAILocalFoundationalModelEnterprisePolicySettings::kAllowed) { - return; - } - - if (on_device_component_state_manager_) { - on_device_component_state_manager_->AddObserver(this); - if (on_device_component_state_manager_->IsInstallerRegistered()) { - RegisterTextSafetyAndLanguageModels(); - } - } -} -OnDeviceAssetManager::~OnDeviceAssetManager() { - if (on_device_component_state_manager_) { - on_device_component_state_manager_->RemoveObserver(this); - } - if (did_register_for_supplementary_on_device_models_) { - model_provider_->RemoveObserverForOptimizationTargetModel( - proto::OptimizationTarget::OPTIMIZATION_TARGET_TEXT_SAFETY, this); - model_provider_->RemoveObserverForOptimizationTargetModel( - proto::OptimizationTarget::OPTIMIZATION_TARGET_LANGUAGE_DETECTION, - this); - } -} - -// Whether the supplementary on-device models are registered. -bool OnDeviceAssetManager::IsSupplementaryModelRegistered() { - return did_register_for_supplementary_on_device_models_; -} - -void OnDeviceAssetManager::RegisterTextSafetyAndLanguageModels() { - if (!did_register_for_supplementary_on_device_models_) { - did_register_for_supplementary_on_device_models_ = true; - model_provider_->AddObserverForOptimizationTargetModel( - proto::OptimizationTarget::OPTIMIZATION_TARGET_TEXT_SAFETY, - /*model_metadata=*/std::nullopt, this); - model_provider_->AddObserverForOptimizationTargetModel( - proto::OptimizationTarget::OPTIMIZATION_TARGET_LANGUAGE_DETECTION, - /*model_metadata=*/std::nullopt, this); - } -} - -void OnDeviceAssetManager::OnModelUpdated( - proto::OptimizationTarget optimization_target, - base::optional_ref<const ModelInfo> model_info) { - switch (optimization_target) { - case proto::OPTIMIZATION_TARGET_TEXT_SAFETY: - if (on_device_model_service_controller_) { - on_device_model_service_controller_->MaybeUpdateSafetyModel(model_info); - } - break; - - case proto::OPTIMIZATION_TARGET_LANGUAGE_DETECTION: - if (on_device_model_service_controller_) { - on_device_model_service_controller_->SetLanguageDetectionModel( - model_info); - } - break; - - default: - break; - } -} - -void OnDeviceAssetManager::StateChanged( - const OnDeviceModelComponentState* state) { - if (state) { - RegisterTextSafetyAndLanguageModels(); - } -} - -} // namespace optimization_guide
diff --git a/components/optimization_guide/core/model_execution/on_device_asset_manager.h b/components/optimization_guide/core/model_execution/on_device_asset_manager.h deleted file mode 100644 index 8c053e4..0000000 --- a/components/optimization_guide/core/model_execution/on_device_asset_manager.h +++ /dev/null
@@ -1,76 +0,0 @@ -// Copyright 2024 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. -#ifndef COMPONENTS_OPTIMIZATION_GUIDE_CORE_MODEL_EXECUTION_ON_DEVICE_ASSET_MANAGER_H_ -#define COMPONENTS_OPTIMIZATION_GUIDE_CORE_MODEL_EXECUTION_ON_DEVICE_ASSET_MANAGER_H_ - -#include <map> -#include <memory> - -#include "base/files/file_path.h" -#include "base/memory/raw_ptr.h" -#include "base/memory/weak_ptr.h" -#include "base/sequence_checker.h" -#include "components/optimization_guide/core/model_execution/feature_keys.h" -#include "components/optimization_guide/core/model_execution/on_device_model_component.h" -#include "components/optimization_guide/core/optimization_guide_features.h" -#include "components/optimization_guide/core/optimization_guide_model_executor.h" -#include "components/optimization_guide/core/optimization_target_model_observer.h" -#include "components/optimization_guide/proto/model_execution.pb.h" -#include "components/optimization_guide/proto/model_quality_service.pb.h" - -namespace optimization_guide { - -class OnDeviceModelAdaptationLoader; -class OnDeviceModelServiceController; -class OptimizationGuideModelProvider; - -// Registers for on-device asset downloads and notifies about updates. -class OnDeviceAssetManager final - : public OptimizationTargetModelObserver, - public OnDeviceModelComponentStateManager::Observer { - public: - OnDeviceAssetManager( - PrefService* local_state, - base::WeakPtr<OnDeviceModelServiceController> service_controller, - base::WeakPtr<OnDeviceModelComponentStateManager> component_state_manager, - raw_ptr<OptimizationGuideModelProvider> model_provider); - ~OnDeviceAssetManager() final; - - // OptimizationTargetModelObserver: - void OnModelUpdated(proto::OptimizationTarget target, - base::optional_ref<const ModelInfo> model_info) override; - - private: - // Registers text safety and language detection models. Does nothing if - // already registered. - void RegisterTextSafetyAndLanguageModels(); - - // Whether the supplementary on-device models are registered. - bool IsSupplementaryModelRegistered(); - - // OnDeviceModelComponentStateManager::Observer: - void StateChanged(const OnDeviceModelComponentState* state) override; - - // Controller for the on-device service. - base::WeakPtr<OnDeviceModelServiceController> - on_device_model_service_controller_; - - base::WeakPtr<OnDeviceModelComponentStateManager> - on_device_component_state_manager_; - - // The model provider to observe for updates to auxiliary models. - raw_ptr<OptimizationGuideModelProvider> model_provider_; - - // Map from feature to its model adaptation loader. Present only for features - // that require model adaptation. - const std::map<ModelBasedCapabilityKey, OnDeviceModelAdaptationLoader> - model_adaptation_loaders_; - - // Whether the user registered for supplementary on-device models. - bool did_register_for_supplementary_on_device_models_ = false; -}; - -} // namespace optimization_guide - -#endif // COMPONENTS_OPTIMIZATION_GUIDE_CORE_MODEL_EXECUTION_ON_DEVICE_ASSET_MANAGER_H_
diff --git a/components/optimization_guide/core/model_execution/on_device_asset_manager_unittest.cc b/components/optimization_guide/core/model_execution/on_device_asset_manager_unittest.cc deleted file mode 100644 index 7278ab8..0000000 --- a/components/optimization_guide/core/model_execution/on_device_asset_manager_unittest.cc +++ /dev/null
@@ -1,225 +0,0 @@ -// Copyright 2024 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "components/optimization_guide/core/model_execution/on_device_asset_manager.h" - -#include <memory> - -#include "base/files/file_path.h" -#include "base/functional/callback_helpers.h" -#include "base/test/metrics/histogram_tester.h" -#include "base/test/scoped_feature_list.h" -#include "base/test/task_environment.h" -#include "base/test/test.pb.h" -#include "base/test/test_future.h" -#include "components/optimization_guide/core/model_execution/model_execution_features.h" -#include "components/optimization_guide/core/model_execution/model_execution_prefs.h" -#include "components/optimization_guide/core/model_execution/on_device_model_access_controller.h" -#include "components/optimization_guide/core/model_execution/on_device_model_adaptation_loader.h" -#include "components/optimization_guide/core/model_execution/on_device_model_service_controller.h" -#include "components/optimization_guide/core/model_execution/test/test_on_device_model_component_state_manager.h" -#include "components/optimization_guide/core/optimization_guide_constants.h" -#include "components/optimization_guide/core/optimization_guide_util.h" -#include "components/optimization_guide/core/test_model_info_builder.h" -#include "components/optimization_guide/core/test_optimization_guide_model_provider.h" -#include "components/prefs/pref_service.h" -#include "components/sync_preferences/testing_pref_service_syncable.h" -#include "testing/gmock/include/gmock/gmock.h" -#include "testing/gtest/include/gtest/gtest.h" - -namespace optimization_guide { - -namespace { - -class FakeServiceController : public OnDeviceModelServiceController { - public: - FakeServiceController() - : OnDeviceModelServiceController(nullptr, nullptr, base::DoNothing()) {} - - void MaybeUpdateSafetyModel( - base::optional_ref<const ModelInfo> model_info) override { - received_safety_info_ = true; - } - - bool received_safety_info() const { return received_safety_info_; } - - std::optional<base::FilePath> language_detection_model_path() { - return OnDeviceModelServiceController::language_detection_model_path(); - } - - private: - ~FakeServiceController() override = default; - - bool received_safety_info_ = false; -}; - -class FakeModelProvider : public TestOptimizationGuideModelProvider { - public: - void AddObserverForOptimizationTargetModel( - proto::OptimizationTarget optimization_target, - const std::optional<optimization_guide::proto::Any>& model_metadata, - OptimizationTargetModelObserver* observer) override { - switch (optimization_target) { - case proto::OPTIMIZATION_TARGET_TEXT_SAFETY: - registered_for_text_safety_ = true; - break; - - case proto::OPTIMIZATION_TARGET_LANGUAGE_DETECTION: - registered_for_language_detection_ = true; - break; - - default: - NOTREACHED(); - } - } - - void Reset() { - registered_for_text_safety_ = false; - registered_for_language_detection_ = false; - } - - bool was_registered() const { - return registered_for_text_safety_ && registered_for_language_detection_; - } - - private: - bool registered_for_text_safety_ = false; - bool registered_for_language_detection_ = false; -}; - -class OnDeviceAssetManagerTest : public testing::Test { - public: - OnDeviceAssetManagerTest() { - scoped_feature_list_.InitWithFeatures({features::kTextSafetyClassifier}, - {}); - model_execution::prefs::RegisterLocalStatePrefs(local_state_.registry()); - local_state_.SetInteger( - model_execution::prefs::localstate::kOnDevicePerformanceClass, - base::to_underlying(OnDeviceModelPerformanceClass::kHigh)); - service_controller_ = base::MakeRefCounted<FakeServiceController>(); - } - - void CreateComponentManager() { - component_manager_.get()->OnStartup(); - task_environment_.FastForwardBy(base::Seconds(1)); - } - - void SetModelComponentReady() { - component_manager_.SetReady(base::FilePath()); - } - - void CreateAssetManager() { - asset_manager_ = std::make_unique<OnDeviceAssetManager>( - &local_state_, service_controller_->GetWeakPtr(), - component_manager_.get()->GetWeakPtr(), &model_provider_, ); - } - - OnDeviceAssetManager* asset_manager() { return asset_manager_.get(); } - - PrefService* local_state() { return &local_state_; } - - FakeModelProvider* model_provider() { return &model_provider_; } - - FakeServiceController* service_controller() { - return service_controller_.get(); - } - - void Reset() { asset_manager_ = nullptr; } - - private: - base::test::TaskEnvironment task_environment_{ - base::test::TaskEnvironment::TimeSource::MOCK_TIME}; - base::test::ScopedFeatureList scoped_feature_list_; - TestingPrefServiceSimple local_state_; - scoped_refptr<FakeServiceController> service_controller_; - TestOnDeviceModelComponentStateManager component_manager_{&local_state_}; - FakeModelProvider model_provider_; - std::unique_ptr<OnDeviceAssetManager> asset_manager_; -}; - -#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) -TEST_F(OnDeviceAssetManagerTest, RegistersTextSafetyModelWithOverrideModel) { - // Effectively, when an override is set, the model component will be ready - // before ModelExecutionManager can be added as an observer. - CreateComponentManager(); - SetModelComponentReady(); - - CreateAssetManager(); - - EXPECT_TRUE(model_provider()->was_registered()); -} - -TEST_F(OnDeviceAssetManagerTest, RegistersTextSafetyModelIfEnabled) { - CreateAssetManager(); - - // Text safety model should not be registered until the base model is ready. - EXPECT_FALSE(model_provider()->was_registered()); - - CreateComponentManager(); - SetModelComponentReady(); - - EXPECT_TRUE(model_provider()->was_registered()); -} - -TEST_F(OnDeviceAssetManagerTest, DoesNotRegisterTextSafetyIfNotEnabled) { - base::test::ScopedFeatureList scoped_feature_list; - scoped_feature_list.InitWithFeatures({}, {features::kTextSafetyClassifier}); - CreateAssetManager(); - CreateComponentManager(); - SetModelComponentReady(); - EXPECT_FALSE(model_provider()->was_registered()); -} -#endif - -TEST_F(OnDeviceAssetManagerTest, DoesNotNotifyServiceControllerWrongTarget) { - CreateAssetManager(); - std::unique_ptr<ModelInfo> model_info = - TestModelInfoBuilder().SetVersion(123).Build(); - asset_manager()->OnModelUpdated(proto::OPTIMIZATION_TARGET_PAGE_ENTITIES, - *model_info); - - EXPECT_FALSE(service_controller()->received_safety_info()); -} - -TEST_F(OnDeviceAssetManagerTest, NotifiesServiceController) { - CreateAssetManager(); - std::unique_ptr<ModelInfo> model_info = - TestModelInfoBuilder().SetVersion(123).Build(); - asset_manager()->OnModelUpdated(proto::OPTIMIZATION_TARGET_TEXT_SAFETY, - *model_info); - - EXPECT_TRUE(service_controller()->received_safety_info()); -} - -TEST_F(OnDeviceAssetManagerTest, UpdateLanguageDetection) { - CreateAssetManager(); - const base::FilePath kTestPath{FILE_PATH_LITERAL("foo")}; - std::unique_ptr<ModelInfo> model_info = TestModelInfoBuilder() - .SetVersion(123) - .SetModelFilePath(kTestPath) - .Build(); - asset_manager()->OnModelUpdated(proto::OPTIMIZATION_TARGET_LANGUAGE_DETECTION, - *model_info); - EXPECT_EQ(kTestPath, service_controller()->language_detection_model_path()); -} - -TEST_F(OnDeviceAssetManagerTest, NotRegisteredWhenDisabledByEnterprisePolicy) { - CreateAssetManager(); - model_provider()->Reset(); - local_state()->SetInteger( - model_execution::prefs::localstate:: - kGenAILocalFoundationalModelEnterprisePolicySettings, - static_cast<int>(model_execution::prefs:: - GenAILocalFoundationalModelEnterprisePolicySettings:: - kDisallowed)); - CreateAssetManager(); - EXPECT_FALSE(model_provider()->was_registered()); - - // Reset manager to make sure removing observer doesn't crash. - Reset(); -} - -} // namespace - -} // namespace optimization_guide
diff --git a/components/optimization_guide/proto/features/model_prototyping.proto b/components/optimization_guide/proto/features/model_prototyping.proto index fbe6ecb7..afcf83f 100644 --- a/components/optimization_guide/proto/features/model_prototyping.proto +++ b/components/optimization_guide/proto/features/model_prototyping.proto
@@ -291,6 +291,9 @@ // Whether to collect the forms data. bool forms_data = 7; + + // Whether to collect the annotated page content. + bool annotated_page_content = 8; } // Used to specify the context to collect for a set of tabs.
diff --git a/components/passage_embeddings/passage_embeddings_service_controller.cc b/components/passage_embeddings/passage_embeddings_service_controller.cc index 8a598bf..db47563 100644 --- a/components/passage_embeddings/passage_embeddings_service_controller.cc +++ b/components/passage_embeddings/passage_embeddings_service_controller.cc
@@ -27,8 +27,8 @@ } // Makes the parameters used to run the passage embedder. -passage_embeddings::mojom::PassageEmbedderParamsPtr MakeEmbedderParams() { - auto params = passage_embeddings::mojom::PassageEmbedderParams::New(); +mojom::PassageEmbedderParamsPtr MakeEmbedderParams() { + auto params = mojom::PassageEmbedderParams::New(); params->user_initiated_priority_num_threads = kUserInitiatedPriorityNumThreads.Get(); params->passive_priority_num_threads = kPassivePriorityNumThreads.Get(); @@ -64,7 +64,7 @@ embeddings_model_path_.clear(); sp_model_path_.clear(); model_metadata_ = std::nullopt; - ResetRemotes(); + ResetEmbedderRemote(); ScopedEmbeddingsModelInfoStatusLogger logger; if (!model_info.has_value()) { @@ -123,7 +123,7 @@ void PassageEmbeddingsServiceController::OnLoadModelsResult(bool success) { if (!success) { - ResetRemotes(); + ResetEmbedderRemote(); } } @@ -147,16 +147,20 @@ return; } - if (!service_remote_) { - LaunchService(); + if (!embedder_remote_) { + MaybeLaunchService(); + auto receiver = embedder_remote_.BindNewPipeAndPassReceiver(); + // Unretained is safe because `this` owns `embedder_remote_`, which + // synchronously calls the disconnect and idle handlers. embedder_remote_.set_disconnect_handler( - base::BindOnce(&PassageEmbeddingsServiceController::OnDisconnected, - weak_ptr_factory_.GetWeakPtr())); + base::BindOnce(&PassageEmbeddingsServiceController::ResetEmbedderRemote, + base::Unretained(this))); embedder_remote_.set_idle_handler( kEmbedderTimeout.Get(), - base::BindRepeating(&PassageEmbeddingsServiceController::ResetRemotes, - weak_ptr_factory_.GetWeakPtr())); + base::BindRepeating( + &PassageEmbeddingsServiceController::ResetEmbedderRemote, + base::Unretained(this))); base::ThreadPool::PostTaskAndReplyWithResult( FROM_HERE, {base::MayBlock()}, base::BindOnce(&MakeModelParams, embeddings_model_path_, sp_model_path_, @@ -182,12 +186,7 @@ return !sp_model_path_.empty() && !embeddings_model_path_.empty(); } -void PassageEmbeddingsServiceController::ResetRemotes() { - service_remote_.reset(); - embedder_remote_.reset(); -} - -void PassageEmbeddingsServiceController::OnDisconnected() { +void PassageEmbeddingsServiceController::ResetEmbedderRemote() { embedder_remote_.reset(); }
diff --git a/components/passage_embeddings/passage_embeddings_service_controller.h b/components/passage_embeddings/passage_embeddings_service_controller.h index 1e195d4..164d7045 100644 --- a/components/passage_embeddings/passage_embeddings_service_controller.h +++ b/components/passage_embeddings/passage_embeddings_service_controller.h
@@ -44,30 +44,30 @@ EmbedderMetadata GetEmbedderMetadata(); protected: - // Launches the passage embeddings service, and bind `cpu_logger_` to the - // service process. - virtual void LaunchService() = 0; + // Launches the passage embeddings service and binds `cpu_logger_` to the + // service process. Does nothing if the service is already launched. + virtual void MaybeLaunchService() = 0; - // Reset both service_remote_ and embedder_remote_. - virtual void ResetRemotes(); + // Resets `service_remote_` and `cpu_logger_`. Called when the service remote + // is idle or disconnects. + virtual void ResetServiceRemote() = 0; + + // Resets `embedder_remote_`. Called when the model info is updated, when + // models fail to load, or when the embedder remote is idle or disconnects. + void ResetEmbedderRemote(); mojo::Remote<mojom::PassageEmbeddingsService> service_remote_; - mojo::Remote<mojom::PassageEmbedder> embedder_remote_; private: // Called when the model files on disks are opened and ready to be sent to // the service. void LoadModelsToService( - mojo::PendingReceiver<passage_embeddings::mojom::PassageEmbedder> - receiver, - passage_embeddings::mojom::PassageEmbeddingsLoadModelsParamsPtr params); + mojo::PendingReceiver<mojom::PassageEmbedder> receiver, + mojom::PassageEmbeddingsLoadModelsParamsPtr params); // Called when an attempt to load models to service finishes. void OnLoadModelsResult(bool success); - // Called when the embedder_remote_ disconnects. - void OnDisconnected(); - // Version of the embeddings model. int64_t model_version_; @@ -78,6 +78,8 @@ base::FilePath embeddings_model_path_; base::FilePath sp_model_path_; + mojo::Remote<mojom::PassageEmbedder> embedder_remote_; + // Used to generate weak pointers to self. base::WeakPtrFactory<PassageEmbeddingsServiceController> weak_ptr_factory_{ this};
diff --git a/components/payments/content/payment_credential.cc b/components/payments/content/payment_credential.cc index 175491d..cad1fc0 100644 --- a/components/payments/content/payment_credential.cc +++ b/components/payments/content/payment_credential.cc
@@ -106,6 +106,8 @@ if (browser_bound_key_store_) { // TODO(crbug.com/384940850): Regenerate the browser bound key identifier // if a browser bound key with the same identifier already exists. + // TODO(crbug.com/377278827): Provide the browser bound public key + // credential parameters from the payment extensions to the key store. browser_bound_key = browser_bound_key_store_->GetOrCreateBrowserBoundKeyForCredentialId( *browser_bound_key_id);
diff --git a/components/payments/content/secure_payment_confirmation_app.cc b/components/payments/content/secure_payment_confirmation_app.cc index dc39c0cd..3a8f63e 100644 --- a/components/payments/content/secure_payment_confirmation_app.cc +++ b/components/payments/content/secure_payment_confirmation_app.cc
@@ -131,6 +131,8 @@ if (!browser_bound_key_store_) { browser_bound_key_store_ = GetBrowserBoundKeyStoreInstance(); } + // TODO(crbug.com/377278827): Provide the browser bound public key + // credential parameters from the payment extensions to the key store. browser_bound_key_ = browser_bound_key_store_->GetOrCreateBrowserBoundKeyForCredentialId( *browser_bound_key_id_);
diff --git a/components/permissions/request_type.cc b/components/permissions/request_type.cc index 1b7d23b6..0531b29d7 100644 --- a/components/permissions/request_type.cc +++ b/components/permissions/request_type.cc
@@ -121,7 +121,7 @@ #endif case RequestType::kWebAppInstallation: // TODO(crbug.com/333795265): provide a dedicated icon. - return vector_icons::kTouchpadMouseIcon; + return vector_icons::kInstallDesktopIcon; #if BUILDFLAG(IS_CHROMEOS) && BUILDFLAG(USE_CUPS) case RequestType::kWebPrinting: return vector_icons::kPrinterIcon; @@ -174,7 +174,7 @@ return vector_icons::kPointerLockOffIcon; case RequestType::kWebAppInstallation: // TODO(crbug.com/333795265): provide a dedicated icon. - return gfx::kNoneIcon; + return vector_icons::kInstallDesktopOffIcon; default: NOTREACHED(); } @@ -258,6 +258,10 @@ return RequestType::kIdentityProvider; default: return std::nullopt; +#if !BUILDFLAG(IS_ANDROID) + case ContentSettingsType::WEB_APP_INSTALLATION: + return RequestType::kWebAppInstallation; +#endif // !BUILDFLAG(IS_ANDROID) } } @@ -336,6 +340,10 @@ #endif case RequestType::kTopLevelStorageAccess: return ContentSettingsType::TOP_LEVEL_STORAGE_ACCESS; +#if !BUILDFLAG(IS_ANDROID) + case RequestType::kWebAppInstallation: + return ContentSettingsType::WEB_APP_INSTALLATION; +#endif // !BUILDFLAG(IS_ANDROID) default: // Not associated with a ContentSettingsType. return std::nullopt;
diff --git a/components/plus_addresses/fake_plus_address_service.cc b/components/plus_addresses/fake_plus_address_service.cc index 75c4646..ae80e97 100644 --- a/components/plus_addresses/fake_plus_address_service.cc +++ b/components/plus_addresses/fake_plus_address_service.cc
@@ -47,10 +47,10 @@ const url::Origin& last_committed_primary_main_frame_origin, bool is_off_the_record, const autofill::FormData& focused_form, + const autofill::FormFieldData& focused_field, const base::flat_map<autofill::FieldGlobalId, autofill::FieldTypeGroup>& form_field_type_groups, const autofill::PasswordFormClassification& focused_form_classification, - const autofill::FieldGlobalId& focused_field_id, autofill::AutofillSuggestionTriggerSource trigger_source) { if (IsPlusAddressCreationEnabled(last_committed_primary_main_frame_origin, is_off_the_record)) {
diff --git a/components/plus_addresses/fake_plus_address_service.h b/components/plus_addresses/fake_plus_address_service.h index b129345..917483b 100644 --- a/components/plus_addresses/fake_plus_address_service.h +++ b/components/plus_addresses/fake_plus_address_service.h
@@ -39,10 +39,10 @@ const url::Origin& origin, bool is_off_the_record, const autofill::FormData& focused_form, + const autofill::FormFieldData& focused_field, const base::flat_map<autofill::FieldGlobalId, autofill::FieldTypeGroup>& form_field_type_groups, const autofill::PasswordFormClassification& focused_form_classification, - const autofill::FieldGlobalId& focused_field_id, autofill::AutofillSuggestionTriggerSource trigger_source) override; autofill::Suggestion GetManagePlusAddressSuggestion() const override; void RecordAutofillSuggestionEvent(SuggestionEvent suggestion_event) override;
diff --git a/components/plus_addresses/plus_address_service_impl.cc b/components/plus_addresses/plus_address_service_impl.cc index 2455adbf..4f92753 100644 --- a/components/plus_addresses/plus_address_service_impl.cc +++ b/components/plus_addresses/plus_address_service_impl.cc
@@ -311,10 +311,10 @@ const url::Origin& origin, bool is_off_the_record, const autofill::FormData& focused_form, + const autofill::FormFieldData& focused_field, const base::flat_map<autofill::FieldGlobalId, autofill::FieldTypeGroup>& form_field_type_groups, const autofill::PasswordFormClassification& focused_form_classification, - const autofill::FieldGlobalId& focused_field_id, AutofillSuggestionTriggerSource trigger_source) { if (!IsPlusAddressFillingEnabled(origin)) { return {}; @@ -327,8 +327,8 @@ plus_address_allocator_.get(), std::move(origin)) .GetSuggestions(plus_addresses, is_creation_enabled, focused_form, - form_field_type_groups, focused_form_classification, - focused_field_id, trigger_source); + focused_field, form_field_type_groups, + focused_form_classification, trigger_source); const autofill::DenseSet<SuggestionType> suggestion_types(suggestions, &Suggestion::type);
diff --git a/components/plus_addresses/plus_address_service_impl.h b/components/plus_addresses/plus_address_service_impl.h index 35e71e90..639f0c8 100644 --- a/components/plus_addresses/plus_address_service_impl.h +++ b/components/plus_addresses/plus_address_service_impl.h
@@ -83,10 +83,10 @@ const url::Origin& origin, bool is_off_the_record, const autofill::FormData& focused_form, + const autofill::FormFieldData& focused_field, const base::flat_map<autofill::FieldGlobalId, autofill::FieldTypeGroup>& form_field_type_groups, const autofill::PasswordFormClassification& focused_form_classification, - const autofill::FieldGlobalId& focused_field_id, autofill::AutofillSuggestionTriggerSource trigger_source) override; autofill::Suggestion GetManagePlusAddressSuggestion() const override; void RecordAutofillSuggestionEvent(SuggestionEvent suggestion_event) override;
diff --git a/components/plus_addresses/plus_address_service_impl_unittest.cc b/components/plus_addresses/plus_address_service_impl_unittest.cc index fd631aa5..5901710 100644 --- a/components/plus_addresses/plus_address_service_impl_unittest.cc +++ b/components/plus_addresses/plus_address_service_impl_unittest.cc
@@ -182,8 +182,9 @@ form.set_fields({focused_field}); return service().GetSuggestionsFromPlusAddresses( affiliated_plus_addresses, origin, is_off_the_record, form, + focused_field, /*form_field_type_groups=*/{}, focused_form_classification, - focused_field.global_id(), trigger_source); + trigger_source); } protected:
diff --git a/components/plus_addresses/plus_address_suggestion_generator.cc b/components/plus_addresses/plus_address_suggestion_generator.cc index 3a59ee7..6b60c55 100644 --- a/components/plus_addresses/plus_address_suggestion_generator.cc +++ b/components/plus_addresses/plus_address_suggestion_generator.cc
@@ -14,6 +14,7 @@ #include "components/autofill/core/browser/data_model/transliterator.h" #include "components/autofill/core/browser/field_types.h" #include "components/autofill/core/browser/suggestions/suggestion.h" +#include "components/autofill/core/common/autofill_util.h" #include "components/autofill/core/common/form_field_data.h" #include "components/autofill/core/common/mojom/autofill_types.mojom-shared.h" #include "components/autofill/core/common/unique_ids.h" @@ -180,17 +181,24 @@ const std::vector<std::string>& affiliated_plus_addresses, bool is_creation_enabled, const autofill::FormData& focused_form, + const autofill::FormFieldData& focused_field, const base::flat_map<autofill::FieldGlobalId, autofill::FieldTypeGroup>& form_field_type_groups, const autofill::PasswordFormClassification& focused_form_classification, - const autofill::FieldGlobalId& focused_field_id, autofill::AutofillSuggestionTriggerSource trigger_source) { - const autofill::FormFieldData& focused_field = - CHECK_DEREF(focused_form.FindFieldByGlobalId(focused_field_id)); using enum autofill::AutofillSuggestionTriggerSource; const std::u16string normalized_field_value = autofill::RemoveDiacriticsAndConvertToLowerCase(focused_field.value()); + // Generally, plus address suggestions are only available on empty fields. In + // cases where the field was previously autofilled, plus address suggestions + // should be among the single field suggestions offered and no prefix matching + // should be applied. + const bool is_field_empty_or_autofilled = + normalized_field_value.empty() || + (focused_field.is_autofilled() && + autofill::IsAddressFieldSwappingEnabled()); + if (affiliated_plus_addresses.empty()) { // Do not offer creation if disabled. if (!is_creation_enabled) { @@ -200,7 +208,7 @@ // Do not offer creation on non-empty fields and certain form types (e.g. // login forms). if (trigger_source != kManualFallbackPlusAddresses && - (!normalized_field_value.empty() || + (!is_field_empty_or_autofilled || !ShouldOfferPlusAddressCreationOnForm( focused_form, form_field_type_groups, focused_form_classification, focused_field.global_id()))) { @@ -217,6 +225,8 @@ // Only suggest filling a plus address whose prefix matches the field's // value. if (trigger_source == kManualFallbackPlusAddresses || + is_field_empty_or_autofilled || + // Apply prefix matching if the field is not empty and not autofilled. plus_address.starts_with(normalized_field_value)) { suggestions.push_back( CreateFillPlusAddressSuggestion(std::move(plus_address)));
diff --git a/components/plus_addresses/plus_address_suggestion_generator.h b/components/plus_addresses/plus_address_suggestion_generator.h index 741c23b..c6c250b 100644 --- a/components/plus_addresses/plus_address_suggestion_generator.h +++ b/components/plus_addresses/plus_address_suggestion_generator.h
@@ -46,10 +46,10 @@ const std::vector<std::string>& affiliated_plus_addresses, bool is_creation_enabled, const autofill::FormData& focused_form, + const autofill::FormFieldData& focused_field, const base::flat_map<autofill::FieldGlobalId, autofill::FieldTypeGroup>& form_field_type_groups, const autofill::PasswordFormClassification& focused_form_classification, - const autofill::FieldGlobalId& focused_field_id, autofill::AutofillSuggestionTriggerSource trigger_source); // Updates `suggestion` with a refreshed plus address by setting a new
diff --git a/components/plus_addresses/plus_address_suggestion_generator_unittest.cc b/components/plus_addresses/plus_address_suggestion_generator_unittest.cc index 62f52f46..42ceb7d7 100644 --- a/components/plus_addresses/plus_address_suggestion_generator_unittest.cc +++ b/components/plus_addresses/plus_address_suggestion_generator_unittest.cc
@@ -14,6 +14,7 @@ #include "components/autofill/core/browser/suggestions/suggestion.h" #include "components/autofill/core/browser/suggestions/suggestion_test_helpers.h" #include "components/autofill/core/browser/suggestions/suggestion_type.h" +#include "components/autofill/core/common/autofill_features.h" #include "components/autofill/core/common/autofill_test_utils.h" #include "components/autofill/core/common/form_field_data.h" #include "components/autofill/core/common/unique_ids.h" @@ -114,14 +115,13 @@ &setting_service(), &allocator(), url::Origin::Create(GURL("https://foo.bar"))); FormData form = CreateTestSignupFormData(); - EXPECT_THAT( - generator.GetSuggestions( - /*affiliated_plus_addresses=*/{}, - /*is_creation_enabled=*/true, form, /*form_field_type_groups=*/{}, - PasswordFormClassification(), form.fields()[0].global_id(), - AutofillSuggestionTriggerSource::kFormControlElementClicked), - ElementsAre(IsCreateInlineSuggestion( - /*suggested_plus_address=*/std::nullopt))); + EXPECT_THAT(generator.GetSuggestions( + /*affiliated_plus_addresses=*/{}, + /*is_creation_enabled=*/true, form, form.fields()[0], + /*form_field_type_groups=*/{}, PasswordFormClassification(), + AutofillSuggestionTriggerSource::kFormControlElementClicked), + ElementsAre(IsCreateInlineSuggestion( + /*suggested_plus_address=*/std::nullopt))); } // Tests that if there are cached plus addresses available, then one is set is @@ -136,15 +136,14 @@ &setting_service(), &allocator(), url::Origin::Create(GURL("https://foo.bar"))); FormData form = CreateTestSignupFormData(); - EXPECT_THAT( - generator.GetSuggestions( - /*affiliated_plus_addresses=*/{}, - /*is_creation_enabled=*/true, form, /*form_field_type_groups=*/{}, - PasswordFormClassification(), form.fields()[0].global_id(), - AutofillSuggestionTriggerSource::kFormControlElementClicked), - ElementsAre(IsCreateInlineSuggestion( - /*suggested_plus_address=*/base::UTF8ToUTF16( - *test::CreatePlusProfile().plus_address)))); + EXPECT_THAT(generator.GetSuggestions( + /*affiliated_plus_addresses=*/{}, + /*is_creation_enabled=*/true, form, form.fields()[0], + /*form_field_type_groups=*/{}, PasswordFormClassification(), + AutofillSuggestionTriggerSource::kFormControlElementClicked), + ElementsAre(IsCreateInlineSuggestion( + /*suggested_plus_address=*/base::UTF8ToUTF16( + *test::CreatePlusProfile().plus_address)))); } TEST_F(PlusAddressSuggestionGeneratorTest, @@ -220,6 +219,40 @@ EXPECT_TRUE(inline_suggestion.IsAcceptable()); } +// Tests that creation is offered on fields where autofill was previously +// triggered. +TEST_F(PlusAddressSuggestionGeneratorTest, + CreationSuggestionOnPreviouslyAutofilledFields) { + base::test::ScopedFeatureList inline_creation_feature( + features::kPlusAddressInlineCreation); + PlusAddressSuggestionGenerator generator( + &setting_service(), &allocator(), + url::Origin::Create(GURL("https://foo.bar"))); + + autofill::FormData form; + autofill::FormFieldData focused_field; + form.set_fields({focused_field}); + EXPECT_THAT(generator.GetSuggestions( + /*affiliated_plus_addresses=*/{}, + /*is_creation_enabled=*/true, form, focused_field, + /*form_field_type_groups=*/{}, PasswordFormClassification(), + AutofillSuggestionTriggerSource::kFormControlElementClicked), + ElementsAre(IsCreateInlineSuggestion( + /*suggested_plus_address=*/std::nullopt))); + + // Field got autofilled. The values does not prefix-match any plus address. + focused_field.set_is_autofilled(true); + focused_field.set_value(u"pp"); + form.set_fields({focused_field}); + EXPECT_THAT(generator.GetSuggestions( + /*affiliated_plus_addresses=*/{}, + /*is_creation_enabled=*/true, form, focused_field, + /*form_field_type_groups=*/{}, PasswordFormClassification(), + AutofillSuggestionTriggerSource::kFormControlElementClicked), + ElementsAre(IsCreateInlineSuggestion( + /*suggested_plus_address=*/std::nullopt))); +} + #endif // !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_IOS) // Tests that the creation suggestion contains no labels if the notice has not @@ -234,8 +267,8 @@ EXPECT_THAT( generator.GetSuggestions( /*affiliated_plus_addresses=*/{}, - /*is_creation_enabled=*/true, form, /*form_field_type_groups=*/{}, - PasswordFormClassification(), form.fields()[0].global_id(), + /*is_creation_enabled=*/true, form, form.fields()[0], + /*form_field_type_groups=*/{}, PasswordFormClassification(), AutofillSuggestionTriggerSource::kFormControlElementClicked), ElementsAre(AllOf(EqualsSuggestion(SuggestionType::kCreateNewPlusAddress), Field(&Suggestion::labels, IsEmpty())))); @@ -249,19 +282,19 @@ const FormData login_form = SetGeneratedFrameTokenAndHostFormId( autofill::test::CreateTestPasswordFormData()); ASSERT_THAT(login_form.fields(), SizeIs(2)); - const FieldGlobalId focused_field_id = login_form.fields()[0].global_id(); + const autofill::FormFieldData focused_field = login_form.fields()[0]; const base::flat_map<FieldGlobalId, autofill::FieldTypeGroup> form_field_type_groups = { - {focused_field_id, autofill::FieldTypeGroup::kUsernameField}, + {focused_field.global_id(), autofill::FieldTypeGroup::kUsernameField}, {login_form.fields()[1].global_id(), autofill::FieldTypeGroup::kPasswordField}}; PasswordFormClassification classification; classification.type = PasswordFormClassification::Type::kLoginForm; - classification.username_field = focused_field_id; + classification.username_field = focused_field.global_id(); EXPECT_THAT(generator.GetSuggestions( /*affiliated_plus_addresses=*/{}, - /*is_creation_enabled=*/true, login_form, - form_field_type_groups, classification, focused_field_id, + /*is_creation_enabled=*/true, login_form, focused_field, + form_field_type_groups, classification, AutofillSuggestionTriggerSource::kFormControlElementClicked), IsEmpty()); } @@ -286,21 +319,21 @@ } form = SetGeneratedFrameTokenAndHostFormId(std::move(form)); ASSERT_THAT(form.fields(), SizeIs(3)); - const FieldGlobalId focused_field_id = form.fields()[0].global_id(); + const autofill::FormFieldData focused_field = form.fields()[0]; const base::flat_map<FieldGlobalId, autofill::FieldTypeGroup> form_field_type_groups = { - {focused_field_id, autofill::FieldTypeGroup::kUsernameField}, + {focused_field.global_id(), autofill::FieldTypeGroup::kUsernameField}, {form.fields()[1].global_id(), autofill::FieldTypeGroup::kPasswordField}, {form.fields()[2].global_id(), autofill::FieldTypeGroup::kName}}; PasswordFormClassification classification; classification.type = PasswordFormClassification::Type::kLoginForm; - classification.username_field = focused_field_id; + classification.username_field = focused_field.global_id(); EXPECT_THAT( generator.GetSuggestions( /*affiliated_plus_addresses=*/{}, - /*is_creation_enabled=*/true, form, form_field_type_groups, - classification, focused_field_id, + /*is_creation_enabled=*/true, form, focused_field, + form_field_type_groups, classification, AutofillSuggestionTriggerSource::kFormControlElementClicked), ElementsAre(EqualsSuggestion(SuggestionType::kCreateNewPlusAddress))); } @@ -322,19 +355,51 @@ form.set_fields(std::move(fields)); } form = SetGeneratedFrameTokenAndHostFormId(std::move(form)); - const FieldGlobalId focused_field_id = form.fields()[0].global_id(); + const autofill::FormFieldData focused_field = form.fields()[0]; PasswordFormClassification classification; classification.type = PasswordFormClassification::Type::kLoginForm; - classification.username_field = focused_field_id; + classification.username_field = focused_field.global_id(); classification.password_field = form.fields()[1].global_id(); EXPECT_THAT( generator.GetSuggestions( /*affiliated_plus_addresses=*/{}, - /*is_creation_enabled=*/true, form, /*form_field_type_groups=*/{}, - classification, focused_field_id, + /*is_creation_enabled=*/true, form, focused_field, + /*form_field_type_groups=*/{}, classification, AutofillSuggestionTriggerSource::kFormControlElementClicked), ElementsAre(EqualsSuggestion(SuggestionType::kCreateNewPlusAddress))); } +// Tests that filling is offered on fields where autofill was previously +// triggered and prefix-matching is not applied. +TEST_F(PlusAddressSuggestionGeneratorTest, + FillingSuggestionOnPreviouslyAutofilledFields) { + base::test::ScopedFeatureList field_swapping{ + autofill::features::kAutofillAddressFieldSwapping}; + PlusAddressSuggestionGenerator generator( + &setting_service(), &allocator(), + url::Origin::Create(GURL("https://foo.bar"))); + const std::string plus_address = "test+plus@test.com"; + + autofill::FormData form; + autofill::FormFieldData focused_field; + form.set_fields({focused_field}); + EXPECT_THAT(generator.GetSuggestions( + /*affiliated_plus_addresses=*/{plus_address}, + /*is_creation_enabled=*/true, form, focused_field, + /*form_field_type_groups=*/{}, PasswordFormClassification(), + AutofillSuggestionTriggerSource::kFormControlElementClicked), + test::IsSingleFillPlusAddressSuggestion(plus_address)); + + // Field got autofilled. The values does not prefix-match any plus address. + focused_field.set_is_autofilled(true); + focused_field.set_value(u"pp"); + form.set_fields({focused_field}); + EXPECT_THAT(generator.GetSuggestions( + /*affiliated_plus_addresses=*/{plus_address}, + /*is_creation_enabled=*/true, form, focused_field, + /*form_field_type_groups=*/{}, PasswordFormClassification(), + AutofillSuggestionTriggerSource::kFormControlElementClicked), + test::IsSingleFillPlusAddressSuggestion(plus_address)); +} } // namespace } // namespace plus_addresses
diff --git a/components/policy/core/browser/cloud/message_util.cc b/components/policy/core/browser/cloud/message_util.cc index 9bf588ed..1ea0be2 100644 --- a/components/policy/core/browser/cloud/message_util.cc +++ b/components/policy/core/browser/cloud/message_util.cc
@@ -68,6 +68,8 @@ return IDS_POLICY_DM_STATUS_INVALID_PACKAGED_DEVICE_FOR_KIOSK; case DM_STATUS_SERVICE_ILLEGAL_ACCOUNT_FOR_PACKAGED_EDU_LICENSE: return IDS_POLICY_DM_STATUS_SERVICE_DOMAIN_MISMATCH; + case DM_STATUS_SERVICE_ORG_UNIT_ENROLLMENT_LIMIT_EXCEEEDED: + return IDS_POLICY_DM_STATUS_ORG_UNIT_ENROLLMENT_LIMIT_EXCEEDED; } NOTREACHED() << "Unhandled DM status " << status; }
diff --git a/components/policy/core/common/cloud/cloud_policy_constants.h b/components/policy/core/common/cloud/cloud_policy_constants.h index 5513980..24099bb 100644 --- a/components/policy/core/common/cloud/cloud_policy_constants.h +++ b/components/policy/core/common/cloud/cloud_policy_constants.h
@@ -173,7 +173,9 @@ // Service error: Illegal account for packaged EDU license. DM_STATUS_SERVICE_ILLEGAL_ACCOUNT_FOR_PACKAGED_EDU_LICENSE = 908, // Service error: Packaged license device can't enroll KIOSK. - DM_STATUS_SERVICE_INVALID_PACKAGED_DEVICE_FOR_KIOSK = 909 + DM_STATUS_SERVICE_INVALID_PACKAGED_DEVICE_FOR_KIOSK = 909, + // Service error: Org Unit enrollment limit has been exceeded. + DM_STATUS_SERVICE_ORG_UNIT_ENROLLMENT_LIMIT_EXCEEEDED = 910 }; // List of modes that the device can be locked into. Some IDs are skipped
diff --git a/components/policy/core/common/cloud/cloud_policy_refresh_scheduler.cc b/components/policy/core/common/cloud/cloud_policy_refresh_scheduler.cc index 7d62e4f..3acb499 100644 --- a/components/policy/core/common/cloud/cloud_policy_refresh_scheduler.cc +++ b/components/policy/core/common/cloud/cloud_policy_refresh_scheduler.cc
@@ -381,6 +381,7 @@ case DM_STATUS_SERVICE_ENTERPRISE_TOS_HAS_NOT_BEEN_ACCEPTED: case DM_STATUS_SERVICE_ILLEGAL_ACCOUNT_FOR_PACKAGED_EDU_LICENSE: case DM_STATUS_SERVICE_INVALID_PACKAGED_DEVICE_FOR_KIOSK: + case DM_STATUS_SERVICE_ORG_UNIT_ENROLLMENT_LIMIT_EXCEEEDED: // Need a re-registration, no use in retrying. CancelRefresh(); return;
diff --git a/components/policy/core/common/cloud/cloud_policy_refresh_scheduler_unittest.cc b/components/policy/core/common/cloud/cloud_policy_refresh_scheduler_unittest.cc index 2e94da2..dfc53e0 100644 --- a/components/policy/core/common/cloud/cloud_policy_refresh_scheduler_unittest.cc +++ b/components/policy/core/common/cloud/cloud_policy_refresh_scheduler_unittest.cc
@@ -684,6 +684,9 @@ {DM_STATUS_SERVICE_ILLEGAL_ACCOUNT_FOR_PACKAGED_EDU_LICENSE, kUnspecified, -1, 1}, {DM_STATUS_SERVICE_INVALID_PACKAGED_DEVICE_FOR_KIOSK, kUnspecified, -1, 1}, + {DM_STATUS_SERVICE_INVALID_PACKAGED_DEVICE_FOR_KIOSK, kUnspecified, + /*expected_delay_ms=*/-1, /*backoff_factor=*/1}, + }; class CloudPolicyRefreshSchedulerClientErrorTest
diff --git a/components/policy/core/common/cloud/device_management_service.cc b/components/policy/core/common/cloud/device_management_service.cc index 75a9d20..b7060adc 100644 --- a/components/policy/core/common/cloud/device_management_service.cc +++ b/components/policy/core/common/cloud/device_management_service.cc
@@ -151,6 +151,8 @@ return "IllegalAccountForPackagedEDULicense"; case DeviceManagementService::kInvalidPackagedDeviceForKiosk: return "InvalidPackagedDeviceForKiosk"; + case DeviceManagementService::kOrgUnitEnrollmentLimitExceeded: + return "OrgUnitEnrollmentLimitExceeded"; } return base::NumberToString(response_code); @@ -185,6 +187,7 @@ const int DeviceManagementService::kTosHasNotBeenAccepted; const int DeviceManagementService::kIllegalAccountForPackagedEDULicense; const int DeviceManagementService::kInvalidPackagedDeviceForKiosk; +const int DeviceManagementService::kOrgUnitEnrollmentLimitExceeded; // static std::string DeviceManagementService::JobConfiguration::GetJobTypeAsString(
diff --git a/components/policy/core/common/cloud/device_management_service.h b/components/policy/core/common/cloud/device_management_service.h index 6713f10..18625e0 100644 --- a/components/policy/core/common/cloud/device_management_service.h +++ b/components/policy/core/common/cloud/device_management_service.h
@@ -73,6 +73,7 @@ static constexpr int kRequestTooLarge = 413; static constexpr int kConsumerAccountWithPackagedLicense = 417; static constexpr int kInvalidPackagedDeviceForKiosk = 418; + static constexpr int kOrgUnitEnrollmentLimitExceeded = 419; static constexpr int kTooManyRequests = 429; static constexpr int kInternalServerError = 500; static constexpr int kServiceUnavailable = 503;
diff --git a/components/policy/core/common/cloud/device_management_service_unittest.cc b/components/policy/core/common/cloud/device_management_service_unittest.cc index 98741b2..259ec34 100644 --- a/components/policy/core/common/cloud/device_management_service_unittest.cc +++ b/components/policy/core/common/cloud/device_management_service_unittest.cc
@@ -610,6 +610,11 @@ net::OK, 418, PROTO_STRING(kResponseEmpty)), + FailedRequestParams( + DM_STATUS_SERVICE_ORG_UNIT_ENROLLMENT_LIMIT_EXCEEEDED, + net::OK, + 419, + PROTO_STRING(kResponseEmpty)), FailedRequestParams(DM_STATUS_SERVICE_TOO_MANY_REQUESTS, net::OK, 429,
diff --git a/components/policy/core/common/cloud/dmserver_job_configurations.cc b/components/policy/core/common/cloud/dmserver_job_configurations.cc index 7fd956e..ecd8e8f0 100644 --- a/components/policy/core/common/cloud/dmserver_job_configurations.cc +++ b/components/policy/core/common/cloud/dmserver_job_configurations.cc
@@ -301,6 +301,8 @@ return DM_STATUS_SERVICE_ILLEGAL_ACCOUNT_FOR_PACKAGED_EDU_LICENSE; case DeviceManagementService::kInvalidPackagedDeviceForKiosk: return DM_STATUS_SERVICE_INVALID_PACKAGED_DEVICE_FOR_KIOSK; + case DeviceManagementService::kOrgUnitEnrollmentLimitExceeded: + return DM_STATUS_SERVICE_ORG_UNIT_ENROLLMENT_LIMIT_EXCEEEDED; default: // Handle all unknown 5xx HTTP error codes as temporary and any other // unknown error as one that needs more time to recover.
diff --git a/components/policy/core/common/cloud/enterprise_metrics.h b/components/policy/core/common/cloud/enterprise_metrics.h index f9496c1..eabfdd1 100644 --- a/components/policy/core/common/cloud/enterprise_metrics.h +++ b/components/policy/core/common/cloud/enterprise_metrics.h
@@ -157,8 +157,10 @@ // A registration certificate could not be fetched from the PCA due to // attestation not being available. kMetricEnrollmentRegistrationCertificateFetchNotAvailable = 68, + // Enrollment failed: Organization unit enrollment limit exceeded. + kMetricEnrollmentOrgUnitEnrollmentLimitExceeded = 69, // Max value for use with enumeration histogram UMA functions. - kMaxValue = kMetricEnrollmentRegistrationCertificateFetchNotAvailable + kMaxValue = kMetricEnrollmentOrgUnitEnrollmentLimitExceeded }; // Events related to policy refresh.
diff --git a/components/policy/resources/templates/policies.yaml b/components/policy/resources/templates/policies.yaml index 4ec2222..ebd0f9a8 100644 --- a/components/policy/resources/templates/policies.yaml +++ b/components/policy/resources/templates/policies.yaml
@@ -1325,6 +1325,8 @@ 1324: WebRtcIPHandlingUrl 1325: GenAIPhotoEditingSettings 1326: PartitionedBlobUrlUsage + 1327: GlicEnabled + atomic_groups: 1: Homepage
diff --git a/components/policy/resources/templates/policy_definitions/Miscellaneous/GlicEnabled.yaml b/components/policy/resources/templates/policy_definitions/Miscellaneous/GlicEnabled.yaml new file mode 100644 index 0000000..59c4652 --- /dev/null +++ b/components/policy/resources/templates/policy_definitions/Miscellaneous/GlicEnabled.yaml
@@ -0,0 +1,27 @@ +caption: Enable <ph name="GLIC">Glic</ph> +desc: |- + If this policy is Enabled or not set, users are able to use the + <ph name="GLIC">Glic</ph> feature. Setting this policy to Disabled prevents + users from interacting with <ph name="GLIC">Glic</ph>; the button in the tab + strip is hidden and <ph name="GLIC">Glic</ph> is unavailable via keyboard + shortcut unless enabled in another profile. +owners: +- bokan@chromium.org +- file://chrome/browser/glic/OWNERS +example_value: true +future_on: +- chrome.* +features: + dynamic_refresh: true + per_profile: true +type: main +schema: + type: boolean +items: +- caption: Enable use of <ph name="GLIC">Glic</ph> + value: true +- caption: Disable use of <ph name="GLIC">Glic</ph>. + value: false +default: true +tags: +- google-sharing
diff --git a/components/policy/test/data/pref_mapping/GlicEnabled.json b/components/policy/test/data/pref_mapping/GlicEnabled.json new file mode 100644 index 0000000..adefe72 --- /dev/null +++ b/components/policy/test/data/pref_mapping/GlicEnabled.json
@@ -0,0 +1,17 @@ +[ + { + "os": [ + "linux", + "mac", + "win" + ], + "simple_policy_pref_mapping_test": { + "pref_name": "glic.enabled_by_policy", + "default_value": true, + "values_to_test": [ + true, + false + ] + } + } +]
diff --git a/components/policy/test_support/test_server_helpers.cc b/components/policy/test_support/test_server_helpers.cc index 00b4b77..83a9c20 100644 --- a/components/policy/test_support/test_server_helpers.cc +++ b/components/policy/test_support/test_server_helpers.cc
@@ -57,8 +57,9 @@ // HTTP code is used. // TODO(crbug.com/40209048): Make GetHttpReasonPhrase support custom codes // instead. - if (base::ranges::lower_bound(kStandardHttpStatusCodes, code()) != - std::ranges::end(kStandardHttpStatusCodes)) { + if (std::find(std::begin(kStandardHttpStatusCodes), + std::end(kStandardHttpStatusCodes), + code()) != std::end(kStandardHttpStatusCodes)) { reason = BasicHttpResponse::reason(); } delegate->SendHeadersContentAndFinish(code(), reason, BuildHeaders(),
diff --git a/components/policy_strings.grdp b/components/policy_strings.grdp index c724438..49e12f0 100644 --- a/components/policy_strings.grdp +++ b/components/policy_strings.grdp
@@ -52,6 +52,9 @@ <message name="IDS_POLICY_DM_STATUS_INVALID_PACKAGED_DEVICE_FOR_KIOSK" desc="Message to show when the user tries to enroll a device with a packaged license into Kiosk."> This is a bundled device and can not be enrolled with Kiosk and Signage Upgrade. </message> + <message name="IDS_POLICY_DM_STATUS_ORG_UNIT_ENROLLMENT_LIMIT_EXCEEDED" desc="Error message to show when the user tries to enroll a device but the initial enrollment limit for the organization unit has been reached."> + This device can't be enrolled right now because your organization unit has reached its initial enrollment limit. Contact your administrator for assistance. + </message> <message name="IDS_POLICY_DM_STATUS_SERVICE_DOMAIN_MISMATCH" desc="Message indicating this client cannot be registered with the specified domain."> Domain mismatch </message>
diff --git a/components/policy_strings_grdp/IDS_POLICY_DM_STATUS_ORG_UNIT_ENROLLMENT_LIMIT_EXCEEDED.png.sha1 b/components/policy_strings_grdp/IDS_POLICY_DM_STATUS_ORG_UNIT_ENROLLMENT_LIMIT_EXCEEDED.png.sha1 new file mode 100644 index 0000000..e867d83 --- /dev/null +++ b/components/policy_strings_grdp/IDS_POLICY_DM_STATUS_ORG_UNIT_ENROLLMENT_LIMIT_EXCEEDED.png.sha1
@@ -0,0 +1 @@ +69598262035ee9fa0e0e2e6cfed1fcda9553886d \ No newline at end of file
diff --git a/components/remote_cocoa/app_shim/native_widget_mac_nswindow.h b/components/remote_cocoa/app_shim/native_widget_mac_nswindow.h index 945b01f..d5591477 100644 --- a/components/remote_cocoa/app_shim/native_widget_mac_nswindow.h +++ b/components/remote_cocoa/app_shim/native_widget_mac_nswindow.h
@@ -61,6 +61,15 @@ - (void)orderWindowByShuffling:(NSWindowOrderingMode)place relativeTo:(NSInteger)otherWin; +// "Activation independence" allows the activation of the window to be +// independent of the activation of the owning app. This is a combination of two +// different properties: +// +// - !NSWindow.canHide +// - The equivalent of NSWindowStyleMaskNonactivatingPanel being set, if that +// were possible on NSWindows. +- (void)setActivationIndependence:(BOOL)independence; + // Order the window to the front (space switch if necessary), and ensure that // the window maintains its key state. A space switch will normally activate a // window, so this function prevents that if the window is currently inactive.
diff --git a/components/remote_cocoa/app_shim/native_widget_mac_nswindow.mm b/components/remote_cocoa/app_shim/native_widget_mac_nswindow.mm index 4f87558..0454bc5 100644 --- a/components/remote_cocoa/app_shim/native_widget_mac_nswindow.mm +++ b/components/remote_cocoa/app_shim/native_widget_mac_nswindow.mm
@@ -124,6 +124,7 @@ - (BOOL)_isConsideredOpenForPersistentState; - (void)_zoomToScreenEdge:(NSUInteger)edge; - (void)_removeFromGroups:(NSWindow*)window; +- (BOOL)_isNonactivatingPanel; @end // Private API as of at least macOS 13. @@ -197,6 +198,7 @@ BOOL _willSaveRestorableStateAfterDelay; BOOL _isEnforcingNeverMadeVisible; BOOL _preventKeyWindow; + BOOL _activationIndependence; BOOL _isTooltip; BOOL _isHeadless; BOOL _isShufflingForOrdering; @@ -405,6 +407,23 @@ return NO; } +// This override, if it returns YES, allows the window to take input events +// without activating the owning app. This is functionally equivalent to having +// the window style NSWindowStyleMaskNonactivatingPanel set; see the +// documentation for that constant for more details. +// +// The NSWindowStyleMaskNonactivatingPanel constant is only valid for NSPanels, +// not NSWindows, so the window style cannot be directly set. In addition, even +// if it were valid to set that style for windows, setting the window style +// recalculates and re-caches a bunch of stuff, so a surgical override is the +// cleanest approach. +- (BOOL)_isNonactivatingPanel { + if (_activationIndependence) { + return YES; + } + return [super _isNonactivatingPanel]; +} + // Ignore [super canBecome{Key,Main}Window]. The default is NO for windows with // NSWindowStyleMaskBorderless, which is not the desired behavior. // Note these can be called via -[NSWindow close] while the widget is being torn @@ -520,6 +539,11 @@ [[self viewsNSWindowDelegate] onWindowOrderChanged:nil]; } +- (void)setActivationIndependence:(BOOL)independence { + self.canHide = !independence; + _activationIndependence = independence; +} + // Override window order functions to intercept other visibility changes. This // is needed in addition to the -[NSWindow display] override because Cocoa // hardly ever calls display, and reports -[NSWindow isVisible] incorrectly
diff --git a/components/remote_cocoa/app_shim/native_widget_ns_window_bridge.h b/components/remote_cocoa/app_shim/native_widget_ns_window_bridge.h index 326bb97..91b4017 100644 --- a/components/remote_cocoa/app_shim/native_widget_ns_window_bridge.h +++ b/components/remote_cocoa/app_shim/native_widget_ns_window_bridge.h
@@ -265,6 +265,7 @@ bool is_maximizable) override; void SetOpacity(float opacity) override; void SetWindowLevel(int32_t level) override; + void SetActivationIndependence(bool independence) override; void SetAspectRatio(const gfx::SizeF& aspect_ratio, const gfx::Size& excluded_margin) override; void SetCALayerParams(const gfx::CALayerParams& ca_layer_params) override;
diff --git a/components/remote_cocoa/app_shim/native_widget_ns_window_bridge.mm b/components/remote_cocoa/app_shim/native_widget_ns_window_bridge.mm index e02a94b..3b8e96f 100644 --- a/components/remote_cocoa/app_shim/native_widget_ns_window_bridge.mm +++ b/components/remote_cocoa/app_shim/native_widget_ns_window_bridge.mm
@@ -1636,6 +1636,16 @@ [window_ setCollectionBehavior:behavior]; } +void NativeWidgetNSWindowBridge::SetActivationIndependence(bool independence) { + for (NSWindow* window = window_; window; window = window.parentWindow) { + // This cast may fail, and if so, the message send to the nil pointer will + // (intentionally) silently fail. + NativeWidgetMacNSWindow* nwm_window = + base::apple::ObjCCast<NativeWidgetMacNSWindow>(window); + [nwm_window setActivationIndependence:independence]; + } +} + void NativeWidgetNSWindowBridge::SetAspectRatio( const gfx::SizeF& aspect_ratio, const gfx::Size& excluded_margin) {
diff --git a/components/remote_cocoa/common/native_widget_ns_window.mojom b/components/remote_cocoa/common/native_widget_ns_window.mojom index 153f8fc..211370a 100644 --- a/components/remote_cocoa/common/native_widget_ns_window.mojom +++ b/components/remote_cocoa/common/native_widget_ns_window.mojom
@@ -228,6 +228,18 @@ // Set the window level of the NSWindow. SetWindowLevel(int32 level); + // Set or un-set the NSWindow as being "activation independent". This sets + // two properties: + // + // - If Chromium is hidden (from the Dock menu or programmatically), the + // NSWindow is not forced to be hidden as well. + // - The NSWindow can be interacted with without causing Chromium to be + // activated. + // + // To accomplish this, the activation independence state of all ancestor + // NSWindows is set as well. + SetActivationIndependence(bool independence); + // Set the aspect ratio of the NSWindow. `aspect_ratio` must not be empty. // The aspect ratio refers to the client area only; system-drawn window // decorations like a title bar are not considered in the aspect ratio.
diff --git a/components/safe_browsing/content/resources/real_time_url_checks_allowlist/push_real_time_url_allowlist_proto.py b/components/safe_browsing/content/resources/real_time_url_checks_allowlist/push_real_time_url_allowlist_proto.py index 4ed5b3d..45ddd03 100755 --- a/components/safe_browsing/content/resources/real_time_url_checks_allowlist/push_real_time_url_allowlist_proto.py +++ b/components/safe_browsing/content/resources/real_time_url_checks_allowlist/push_real_time_url_allowlist_proto.py
@@ -41,11 +41,11 @@ shutil.rmtree(allowlist_dir) script_name = ':make_real_time_url_allowlist_protobuf_for_gcs' - gn_command = ['ninja', '-C', opts.dir, RESOURCE_SUBDIR + script_name] + gn_command = ['autoninja', '-C', opts.dir, RESOURCE_SUBDIR + script_name] print("Running the following") print(" " + (' '.join(gn_command))) if subprocess.call(gn_command): - print("Ninja failed.") + print("Autoninja failed.") return 1 os.chdir(allowlist_dir)
diff --git a/components/safe_browsing/core/browser/ping_manager.cc b/components/safe_browsing/core/browser/ping_manager.cc index 7a5059c3..181c9630 100644 --- a/components/safe_browsing/core/browser/ping_manager.cc +++ b/components/safe_browsing/core/browser/ping_manager.cc
@@ -296,6 +296,7 @@ if (!hit_report->post_data.empty()) { resource_request->method = "POST"; } + resource_request->site_for_cookies = net::SiteForCookies::FromUrl(report_url); auto report_ptr = network::SimpleURLLoader::Create( std::move(resource_request), kTrafficAnnotation); @@ -463,6 +464,7 @@ resource_request->url = report_url; resource_request->load_flags = net::LOAD_DISABLE_CACHE; resource_request->method = "POST"; + resource_request->site_for_cookies = net::SiteForCookies::FromUrl(report_url); if (!access_token.empty()) { LogAuthenticatedCookieResets(
diff --git a/components/safe_browsing/core/common/safe_browsing_prefs.cc b/components/safe_browsing/core/common/safe_browsing_prefs.cc index 1f92a93..ffe7bf6 100644 --- a/components/safe_browsing/core/common/safe_browsing_prefs.cc +++ b/components/safe_browsing/core/common/safe_browsing_prefs.cc
@@ -261,10 +261,6 @@ registry->RegisterBooleanPref(prefs::kSafeBrowsingSurveysEnabled, true); registry->RegisterBooleanPref(prefs::kSafeBrowsingDeepScanningEnabled, true); registry->RegisterBooleanPref( - prefs::kSafeBrowsingAutomaticDeepScanningIPHSeen, false); - registry->RegisterBooleanPref(prefs::kSafeBrowsingAutomaticDeepScanPerformed, - false); - registry->RegisterBooleanPref( prefs::kSafeBrowsingScoutReportingEnabledWhenDeprecated, false); registry->RegisterDictionaryPref(prefs::kExternalAppRedirectTimestamps); }
diff --git a/components/safe_browsing/core/common/safe_browsing_prefs.h b/components/safe_browsing/core/common/safe_browsing_prefs.h index dfc533c..2f25267b 100644 --- a/components/safe_browsing/core/common/safe_browsing_prefs.h +++ b/components/safe_browsing/core/common/safe_browsing_prefs.h
@@ -225,19 +225,6 @@ inline constexpr char kHashPrefixRealTimeChecksAllowedByPolicy[] = "safebrowsing.hash_prefix_real_time_checks_allowed_by_policy"; -// A preference indicating that the user has seen the IPH telling them automatic -// deep scans are coming. Since IPH may be delayed for a variety of reasons -// (startup grace periods, other IPH in the session), we want to wait to enable -// automatic deep scans until they've actually seen the IPH. -inline constexpr char kSafeBrowsingAutomaticDeepScanningIPHSeen[] = - "safebrowsing.automatic_deep_scanning_iph_seen"; - -// A preference indicating that the user has already done an automatic -// deep scan. This addresses an edge case where deep scan notices remain -// in the bubble after the user performs an automatic deep scan. -inline constexpr char kSafeBrowsingAutomaticDeepScanPerformed[] = - "safe_browsing.automatic_deep_scan_performed"; - // Records a mapping from app names to most recent redirect to that // app. This is used to avoid sending reports of external app redirects // for common apps.
diff --git a/components/saved_tab_groups/internal/saved_tab_group_model.cc b/components/saved_tab_groups/internal/saved_tab_group_model.cc index b7fd332..3d558b5 100644 --- a/components/saved_tab_groups/internal/saved_tab_group_model.cc +++ b/components/saved_tab_groups/internal/saved_tab_group_model.cc
@@ -158,8 +158,6 @@ base::Uuid group_guid = saved_group.saved_guid(); CHECK(!Contains(group_guid)); - stats::RecordEmptyGroupsMetricsOnGroupAddedLocally(saved_group, is_loaded_); - InsertGroupImpl(std::move(saved_group)); for (auto& observer : observers_) {
diff --git a/components/saved_tab_groups/internal/shared_tab_group_data_sync_bridge.cc b/components/saved_tab_groups/internal/shared_tab_group_data_sync_bridge.cc index e9c97ce3..5c17f09 100644 --- a/components/saved_tab_groups/internal/shared_tab_group_data_sync_bridge.cc +++ b/components/saved_tab_groups/internal/shared_tab_group_data_sync_bridge.cc
@@ -889,6 +889,9 @@ SharedTabGroupTabToSpecifics(tab, std::move(unique_position)); StoreSharedGroup(*ongoing_write_batch_, tab_specifics, GroupToLocalOnlyData(*group)); + + // Pending NTP should never be created for locally added groups. + CHECK(!tab.is_pending_ntp()); SendToSync(tab_specifics, syncer::CollaborationMetadata::ForLocalChange( tab.shared_attribution().updated_by, @@ -1239,6 +1242,10 @@ sync_pb::SharedTabGroupDataSpecifics specifics = SharedTabGroupTabToSpecifics( tab, CalculateUniquePosition(group, tab_index.value())); StoreSharedTab(write_batch, specifics); + // Pending NTP should never be synced, only be stored locally. + if (tab.is_pending_ntp()) { + return; + } SendToSync(specifics, syncer::CollaborationMetadata::ForLocalChange( tab.shared_attribution().updated_by,
diff --git a/components/saved_tab_groups/internal/shared_tab_group_data_sync_bridge_unittest.cc b/components/saved_tab_groups/internal/shared_tab_group_data_sync_bridge_unittest.cc index f5d544fd..61e727d 100644 --- a/components/saved_tab_groups/internal/shared_tab_group_data_sync_bridge_unittest.cc +++ b/components/saved_tab_groups/internal/shared_tab_group_data_sync_bridge_unittest.cc
@@ -1636,6 +1636,55 @@ HasTabMetadata("tab 1", "https://google.com/1"))); } +TEST_F(SharedTabGroupDataSyncBridgeTest, + ShouldCreatePendingNtpOnLastTabRemoval) { + const CollaborationId kCollaborationId("collaboration"); + ASSERT_TRUE(InitializeBridgeAndModel()); + + // Create a shared tab group locally with one tab. + SavedTabGroup group(u"title", tab_groups::TabGroupColorId::kGrey, + /*urls=*/{}, /*position=*/std::nullopt); + group.SetCollaborationId(kCollaborationId); + group.AddTabLocally(test::CreateSavedTabGroupTab( + "https://google.com/0", u"tab 0", group.saved_guid(), /*position=*/0)); + + GenerateUniquePositionsForTabsInGroup(group); + model()->AddedLocally(group); + + ASSERT_THAT(model()->saved_tab_groups().front().saved_tabs(), + ElementsAre(HasTabMetadata("tab 0", "https://google.com/0"))); + + // Delete the tab from sync. It should result in creating a pending NTP which + // is never synced. + EXPECT_CALL(mock_processor(), Put).Times(0); + + syncer::EntityChangeList change_list; + change_list.push_back( + CreateDeleteEntityChange(StorageKeyForTab(group.saved_tabs()[0]))); + bridge()->ApplyIncrementalSyncChanges(bridge()->CreateMetadataChangeList(), + std::move(change_list)); + + // Verify that the only tab in the group is a pending NTP. + ASSERT_THAT(model()->saved_tab_groups(), Not(testing::IsEmpty())); + EXPECT_THAT(model()->saved_tab_groups().front().saved_tabs(), + ElementsAre(HasTabMetadata("New tab", "chrome://newtab/"))); + + // Simulate browser restart to verify that the pending NTP is persisted. + SavedTabGroupTab pending_ntp = + model()->saved_tab_groups().front().saved_tabs()[0]; + + StoreMetadataAndReset(); + ASSERT_THAT(model(), IsNull()); + ASSERT_TRUE(InitializeBridgeAndModel()); + ASSERT_THAT(model()->Get(group.saved_guid()), NotNull()); + + ASSERT_EQ(1u, model()->Get(group.saved_guid())->saved_tabs().size()); + EXPECT_EQ(model()->Get(group.saved_guid())->saved_tabs()[0].saved_tab_guid(), + pending_ntp.saved_tab_guid()); + EXPECT_EQ(model()->Get(group.saved_guid())->saved_tabs()[0].url(), + pending_ntp.url()); +} + TEST_F(SharedTabGroupDataSyncBridgeTest, ShouldAssignLocalGroupId) { const CollaborationId kCollaborationId("collaboration"); ASSERT_TRUE(InitializeBridgeAndModel());
diff --git a/components/segmentation_platform/components_unittests.filter b/components/segmentation_platform/components_unittests.filter index fc135c1..90de9161 100644 --- a/components/segmentation_platform/components_unittests.filter +++ b/components/segmentation_platform/components_unittests.filter
@@ -53,6 +53,7 @@ *PowerUserModelTest.* *PrefsMigratorTest.* *PriceTrackingNotificationPromoTest.* +*QuickDeletePromoTest.* *RankFetcherHelperTest.* *RequestDispatcherTest.* *RequestHandlerTest.*
diff --git a/components/segmentation_platform/embedder/home_modules/BUILD.gn b/components/segmentation_platform/embedder/home_modules/BUILD.gn index 99b85fe..9916c9b 100644 --- a/components/segmentation_platform/embedder/home_modules/BUILD.gn +++ b/components/segmentation_platform/embedder/home_modules/BUILD.gn
@@ -43,6 +43,8 @@ sources += [ "default_browser_promo.cc", "default_browser_promo.h", + "quick_delete_promo.cc", + "quick_delete_promo.h", "tab_group_promo.cc", "tab_group_promo.h", "tab_group_sync_promo.cc", @@ -98,6 +100,7 @@ if (is_android) { sources += [ "default_browser_promo_unittest.cc", + "quick_delete_promo_unittest.cc", "tab_group_promo_unittest.cc", "tab_group_sync_promo_unittest.cc", ]
diff --git a/components/segmentation_platform/embedder/home_modules/constants.h b/components/segmentation_platform/embedder/home_modules/constants.h index 08da7b6..85f655f3 100644 --- a/components/segmentation_platform/embedder/home_modules/constants.h +++ b/components/segmentation_platform/embedder/home_modules/constants.h
@@ -47,9 +47,10 @@ const char kTabGroupPromoShownCount[] = "tab_group_shown_count"; const char kSyncedTabGroupExists[] = "synced_tab_group_exists"; const char kTabGroupSyncPromoShownCount[] = "tab_group_sync_shown_count"; -const char kHaveClearedBrowsingDataInThirtyDays[] = - "have_cleared_browsing_data_in_thirty_days"; -const char kHaveUsedIncognito[] = "have_used_incognito"; +const char kCountOfClearingBrowsingData[] = "count_of_clearing_browsing_data"; +const char kCountOfClearingBrowsingDataThroughQuickDelete[] = + "count_of_clearing_browsing_data_through_quick_delete"; +const char kQuickDeletePromoShownCount[] = "quick_delete_shown_count"; // Placeholder output label for segmentation model executor. inline constexpr char kPlaceholderEphemeralModuleLabel[] = "placeholder_module";
diff --git a/components/segmentation_platform/embedder/home_modules/home_modules_card_registry.cc b/components/segmentation_platform/embedder/home_modules/home_modules_card_registry.cc index 5b96a6c64..e1cac78 100644 --- a/components/segmentation_platform/embedder/home_modules/home_modules_card_registry.cc +++ b/components/segmentation_platform/embedder/home_modules/home_modules_card_registry.cc
@@ -14,6 +14,7 @@ #include "components/segmentation_platform/embedder/home_modules/default_browser_promo.h" #include "components/segmentation_platform/embedder/home_modules/ephemeral_module_utils.h" #include "components/segmentation_platform/embedder/home_modules/price_tracking_notification_promo.h" +#include "components/segmentation_platform/embedder/home_modules/quick_delete_promo.h" #include "components/segmentation_platform/embedder/home_modules/send_tab_notification_promo.h" #include "components/segmentation_platform/embedder/home_modules/tab_group_promo.h" #include "components/segmentation_platform/embedder/home_modules/tab_group_sync_promo.h" @@ -43,6 +44,10 @@ "ephemeral_pref_counter.tab_group_sync_promo_counter"; const char kTabGroupSyncPromoInteractedPref[] = "ephemeral_pref_interacted.tab_group_sync_promo_interacted"; +const char kQuickDeletePromoImpressionCounterPref[] = + "ephemeral_pref_counter.quick_delete_promo_counter"; +const char kQuickDeletePromoInteractedPref[] = + "ephemeral_pref_interacted.quick_delete_promo_interacted"; #endif namespace { @@ -183,6 +188,8 @@ registry->RegisterBooleanPref(kTabGroupPromoInteractedPref, false); registry->RegisterIntegerPref(kTabGroupSyncPromoImpressionCounterPref, 0); registry->RegisterBooleanPref(kTabGroupSyncPromoInteractedPref, false); + registry->RegisterIntegerPref(kQuickDeletePromoImpressionCounterPref, 0); + registry->RegisterBooleanPref(kQuickDeletePromoInteractedPref, false); #endif } @@ -267,8 +274,13 @@ profile_prefs_->GetInteger(kTabGroupSyncPromoImpressionCounterPref); profile_prefs_->SetInteger(kTabGroupSyncPromoImpressionCounterPref, freshness_impression_count + 1); + } else if (strcmp(card_name, kQuickDeletePromo) == 0) { + int freshness_impression_count = + profile_prefs_->GetInteger(kQuickDeletePromoImpressionCounterPref); + profile_prefs_->SetInteger(kQuickDeletePromoImpressionCounterPref, + freshness_impression_count + 1); } - } + } #endif } @@ -320,6 +332,8 @@ profile_prefs_->SetBoolean(kTabGroupPromoInteractedPref, true); } else if (strcmp(card_name, kTabGroupSyncPromo) == 0) { profile_prefs_->SetBoolean(kTabGroupSyncPromoInteractedPref, true); + } else if (strcmp(card_name, kQuickDeletePromo) == 0) { + profile_prefs_->SetBoolean(kQuickDeletePromoInteractedPref, true); } #endif } @@ -404,6 +418,13 @@ all_cards_by_priority_.push_back( std::make_unique<TabGroupSyncPromo>(profile_prefs_)); } + + int quick_delete_promo_count = + profile_prefs_->GetInteger(kQuickDeletePromoImpressionCounterPref); + if (QuickDeletePromo::IsEnabled(quick_delete_promo_count)) { + all_cards_by_priority_.push_back( + std::make_unique<QuickDeletePromo>(profile_prefs_)); + } #endif InitializeAfterAddingCards(); }
diff --git a/components/segmentation_platform/embedder/home_modules/home_modules_card_registry.h b/components/segmentation_platform/embedder/home_modules/home_modules_card_registry.h index 63c3301..2a981a4 100644 --- a/components/segmentation_platform/embedder/home_modules/home_modules_card_registry.h +++ b/components/segmentation_platform/embedder/home_modules/home_modules_card_registry.h
@@ -22,11 +22,13 @@ extern const char kDefaultBrowserPromoImpressionCounterPref[]; extern const char kTabGroupPromoImpressionCounterPref[]; extern const char kTabGroupSyncPromoImpressionCounterPref[]; +extern const char kQuickDeletePromoImpressionCounterPref[]; // Interaction flag for each card. extern const char kDefaultBrowserPromoInteractedPref[]; extern const char kTabGroupPromoInteractedPref[]; extern const char kTabGroupSyncPromoInteractedPref[]; +extern const char kQuickDeletePromoInteractedPref[]; #endif // Registry that manages all ephemeral cards in mobile home modules.
diff --git a/components/segmentation_platform/embedder/home_modules/home_modules_card_registry_unittest.cc b/components/segmentation_platform/embedder/home_modules/home_modules_card_registry_unittest.cc index 276aec7..1062426 100644 --- a/components/segmentation_platform/embedder/home_modules/home_modules_card_registry_unittest.cc +++ b/components/segmentation_platform/embedder/home_modules/home_modules_card_registry_unittest.cc
@@ -274,6 +274,53 @@ EXPECT_THAT(signalKeys, Not(Contains("synced_tab_group_exists"))); EXPECT_THAT(signalKeys, Not(Contains("tab_group_sync_shown_count"))); } + +// Tests that the Registry registers the QuickDeletePromo card when its feature +// is enabled. +TEST_F(HomeModulesCardRegistryTest, TestQuickDeletePromoCardEnabled) { + feature_list_.InitWithFeatures({features::kEducationalTipModule}, {}); + registry_ = std::make_unique<HomeModulesCardRegistry>(&pref_service_); + + EXPECT_THAT(registry_->all_output_labels(), Contains(kQuickDeletePromo)); + EXPECT_GE(registry_->all_cards_input_size(), 10u); + const std::vector<std::unique_ptr<CardSelectionInfo>>& all_cards = + registry_->get_all_cards_by_priority(); + std::vector<std::string> card_names = ExtractCardNames(all_cards); + EXPECT_THAT(card_names, Contains(kQuickDeletePromo)); + + const CardSignalMap& signal_map = registry_->get_card_signal_map(); + std::vector<std::string> signalKeys = + GetSignalKeys(signal_map, kQuickDeletePromo); + EXPECT_THAT(signalKeys, Contains("count_of_clearing_browsing_data")); + EXPECT_THAT(signalKeys, + Contains("count_of_clearing_browsing_data_through_quick_delete")); + EXPECT_THAT(signalKeys, Contains("quick_delete_shown_count")); +} + +// Tests that the Registry won't register the QuickDeletePromo card when it is +// disabled because of user's interaction history. +TEST_F(HomeModulesCardRegistryTest, TestQuickDeletePromoCardDisabled) { + feature_list_.InitWithFeatures({features::kEducationalTipModule}, {}); + pref_service_.SetUserPref(kQuickDeletePromoImpressionCounterPref, + std::make_unique<base::Value>(11)); + registry_ = std::make_unique<HomeModulesCardRegistry>(&pref_service_); + + EXPECT_THAT(registry_->all_output_labels(), Not(Contains(kQuickDeletePromo))); + EXPECT_GE(registry_->all_cards_input_size(), 0u); + const std::vector<std::unique_ptr<CardSelectionInfo>>& all_cards = + registry_->get_all_cards_by_priority(); + std::vector<std::string> card_names = ExtractCardNames(all_cards); + EXPECT_THAT(card_names, Not(Contains(kQuickDeletePromo))); + + const CardSignalMap& signal_map = registry_->get_card_signal_map(); + std::vector<std::string> signalKeys = + GetSignalKeys(signal_map, kQuickDeletePromo); + EXPECT_THAT(signalKeys, Not(Contains("count_of_clearing_browsing_data"))); + EXPECT_THAT( + signalKeys, + Not(Contains("count_of_clearing_browsing_data_through_quick_delete"))); + EXPECT_THAT(signalKeys, Not(Contains("quick_delete_shown_count"))); +} #endif } // namespace segmentation_platform::home_modules
diff --git a/components/segmentation_platform/embedder/home_modules/quick_delete_promo.cc b/components/segmentation_platform/embedder/home_modules/quick_delete_promo.cc new file mode 100644 index 0000000..508a975a --- /dev/null +++ b/components/segmentation_platform/embedder/home_modules/quick_delete_promo.cc
@@ -0,0 +1,148 @@ +// 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 "components/segmentation_platform/embedder/home_modules/quick_delete_promo.h" + +#include "base/metrics/field_trial_params.h" +#include "components/commerce/core/commerce_feature_list.h" +#include "components/segmentation_platform/embedder/home_modules/constants.h" +#include "components/segmentation_platform/embedder/home_modules/ephemeral_module_utils.h" +#include "components/segmentation_platform/embedder/home_modules/home_modules_card_registry.h" +#include "components/segmentation_platform/public/features.h" +#include "components/segmentation_platform/public/proto/model_metadata.pb.h" + +namespace { + +// The number of times the quick delete promo card can be shown to the user in +// a single day. +const int kShownCountLimit = 3; + +const char kQuickDeletePromoHistogramName[] = + "MagicStack.Clank.NewTabPage.Module.TopImpressionV2"; + +// TODO(crbug.com/382803396): The enum id of the quick delete promo card. Could +// be referenced after refactor. +const int kQuickDeletePromoId = 9; + +const char kClearBrowsingDataHistogramName[] = + "Privacy.DeleteBrowsingData.Action"; + +constexpr std::array<int32_t, 0> kClearBrowsingDataHistogramEnumValues{}; + +const int kClearBrowsingDataHistogramQuickDeleteId = 6; + +} // namespace + +namespace segmentation_platform::home_modules { + +QuickDeletePromo::QuickDeletePromo(PrefService* profile_prefs) + : CardSelectionInfo(kQuickDeletePromo), profile_prefs_(profile_prefs) {} + +std::map<SignalKey, FeatureQuery> QuickDeletePromo::GetInputs() { + std::map<SignalKey, FeatureQuery> map; + + // Define the number of times user cleared browsing data in the past 30 days. + DEFINE_UMA_FEATURE_ENUM_COUNT(countOfClearBrowsingData, + kClearBrowsingDataHistogramName, + kClearBrowsingDataHistogramEnumValues.data(), + kClearBrowsingDataHistogramEnumValues.size(), + /* days= */ 30); + map.emplace(kCountOfClearingBrowsingData, + std::move(countOfClearBrowsingData)); + + // Define the number of times user cleared browsing data through quick delete + // in the past 30 days. + DEFINE_UMA_FEATURE_ENUM_COUNT(countOfClearBrowsingDataThroughQuickDelete, + kClearBrowsingDataHistogramName, + &kClearBrowsingDataHistogramQuickDeleteId, + /* enum_size= */ 1, + /* days= */ 30); + map.emplace(kCountOfClearingBrowsingDataThroughQuickDelete, + std::move(countOfClearBrowsingDataThroughQuickDelete)); + + // Define signal for number of times quick delete promo card has shown to the + // user in last 24 hours. + DEFINE_UMA_FEATURE_ENUM_COUNT(countOfQuickDeletePromoShownTimes, + kQuickDeletePromoHistogramName, + &kQuickDeletePromoId, /* enum_size= */ 1, + /* days= */ 1); + map.emplace(kQuickDeletePromoShownCount, + std::move(countOfQuickDeletePromoShownTimes)); + + return map; +} + +CardSelectionInfo::ShowResult QuickDeletePromo::ComputeCardResult( + const CardSelectionSignals& signals) const { + // Check for a forced `ShowResult`. + std::optional<CardSelectionInfo::ShowResult> forced_result = + GetForcedEphemeralModuleShowResult(); + + if (forced_result.has_value() && + forced_result.value().result_label.has_value() && + kQuickDeletePromo == forced_result.value().result_label.value()) { + return forced_result.value(); + } + + CardSelectionInfo::ShowResult result; + result.result_label = kQuickDeletePromo; + + bool has_been_interacted_with = + profile_prefs_->GetBoolean(kQuickDeletePromoInteractedPref); + if (has_been_interacted_with) { + result.position = EphemeralHomeModuleRank::kNotShown; + return result; + } + + std::optional<float> resultForCountOfClearingBrowsingData = + signals.GetSignal(kCountOfClearingBrowsingData); + std::optional<float> resultForCountOfClearingBrowsingDataThroughQuickDelete = + signals.GetSignal(kCountOfClearingBrowsingDataThroughQuickDelete); + std::optional<float> resultForQuickDeletePromoShownCount = + signals.GetSignal(kQuickDeletePromoShownCount); + + if (!resultForCountOfClearingBrowsingData.has_value() || + !resultForCountOfClearingBrowsingDataThroughQuickDelete.has_value() || + !resultForQuickDeletePromoShownCount.has_value()) { + result.position = EphemeralHomeModuleRank::kNotShown; + return result; + } + + // Show the promo card if the user has never cleared browsing data or has + // cleared browsing data but never through quick delete in the past 30 days + // and the promo card has not been shown more than 3 times in 24 hours. + if ((resultForCountOfClearingBrowsingData.value() == 0 || + (resultForCountOfClearingBrowsingData.value() > 0 && + resultForCountOfClearingBrowsingDataThroughQuickDelete.value() == 0)) && + resultForQuickDeletePromoShownCount.value() < kShownCountLimit) { + result.position = EphemeralHomeModuleRank::kTop; + return result; + } + + result.position = EphemeralHomeModuleRank::kNotShown; + return result; +} + +bool QuickDeletePromo::IsEnabled(int impression_count) { + std::optional<CardSelectionInfo::ShowResult> forced_result = + GetForcedEphemeralModuleShowResult(); + + if (forced_result.has_value() && + forced_result.value().result_label.has_value() && + kQuickDeletePromo == forced_result.value().result_label.value()) { + return true; + } + + if (!base::FeatureList::IsEnabled(features::kEducationalTipModule)) { + return false; + } + + if (impression_count >= features::kMaxQuickDeleteCardImpressions.Get()) { + return false; + } + + return true; +} + +} // namespace segmentation_platform::home_modules
diff --git a/components/segmentation_platform/embedder/home_modules/quick_delete_promo.h b/components/segmentation_platform/embedder/home_modules/quick_delete_promo.h new file mode 100644 index 0000000..ddee6f3 --- /dev/null +++ b/components/segmentation_platform/embedder/home_modules/quick_delete_promo.h
@@ -0,0 +1,36 @@ +// 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 COMPONENTS_SEGMENTATION_PLATFORM_EMBEDDER_HOME_MODULES_QUICK_DELETE_PROMO_H_ +#define COMPONENTS_SEGMENTATION_PLATFORM_EMBEDDER_HOME_MODULES_QUICK_DELETE_PROMO_H_ + +#include "components/prefs/pref_service.h" +#include "components/segmentation_platform/embedder/home_modules/card_selection_info.h" + +namespace segmentation_platform::home_modules { + +// 'QuickDeletePromo' is a class that represents an ephemeral home module, +// specifically designed for the quick delete promo card found in the +// educational tip section on chrome android. It is responsible for determining +// whether the module should be shown to the user based on the enable signal and +// the user's interaction history. +class QuickDeletePromo : public CardSelectionInfo { + public: + explicit QuickDeletePromo(PrefService* profile_prefs); + ~QuickDeletePromo() override = default; + + static bool IsEnabled(int impression_count); + + // CardSelectionInfo + std::map<SignalKey, FeatureQuery> GetInputs() override; + ShowResult ComputeCardResult( + const CardSelectionSignals& signals) const override; + + private: + raw_ptr<PrefService> profile_prefs_; +}; + +} // namespace segmentation_platform::home_modules + +#endif // COMPONENTS_SEGMENTATION_PLATFORM_EMBEDDER_HOME_MODULES_QUICK_DELETE_PROMO_H_
diff --git a/components/segmentation_platform/embedder/home_modules/quick_delete_promo_unittest.cc b/components/segmentation_platform/embedder/home_modules/quick_delete_promo_unittest.cc new file mode 100644 index 0000000..2206cc7 --- /dev/null +++ b/components/segmentation_platform/embedder/home_modules/quick_delete_promo_unittest.cc
@@ -0,0 +1,132 @@ +// 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 "components/segmentation_platform/embedder/home_modules/quick_delete_promo.h" + +#include "components/prefs/testing_pref_service.h" +#include "components/segmentation_platform/embedder/home_modules/card_selection_signals.h" +#include "components/segmentation_platform/embedder/home_modules/constants.h" +#include "components/segmentation_platform/embedder/home_modules/home_modules_card_registry.h" +#include "components/segmentation_platform/embedder/home_modules/test_utils.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace segmentation_platform::home_modules { + +// Tests QuickDeletePromo's functionality. +class QuickDeletePromoTest : public testing::Test { + public: + QuickDeletePromoTest() = default; + ~QuickDeletePromoTest() override = default; + + void SetUp() override { + HomeModulesCardRegistry::RegisterProfilePrefs(pref_service_.registry()); + } + + void TearDown() override { Test::TearDown(); } + + protected: + TestingPrefServiceSimple pref_service_; +}; + +// Verifies that the `GetInputs(…)` method returns the expected inputs. +TEST_F(QuickDeletePromoTest, GetInputsReturnsExpectedInputs) { + auto card = std::make_unique<QuickDeletePromo>(&pref_service_); + std::map<SignalKey, FeatureQuery> inputs = card->GetInputs(); + EXPECT_EQ(inputs.size(), 3u); + // Verify that the inputs map contains the expected keys. + EXPECT_NE(inputs.find(segmentation_platform::kCountOfClearingBrowsingData), + inputs.end()); + EXPECT_NE(inputs.find(segmentation_platform:: + kCountOfClearingBrowsingDataThroughQuickDelete), + inputs.end()); + EXPECT_NE(inputs.find(segmentation_platform::kQuickDeletePromoShownCount), + inputs.end()); +} + +// Validates that ComputeCardResult() returns kTop when quick delete promo card +// is enabled for user who never cleared their browsing data at all in the past +// 30 days. +TEST_F(QuickDeletePromoTest, + TestComputeCardResultWithCardEnabledForNeverClearedBrowsingData) { + pref_service_.SetUserPref(kQuickDeletePromoInteractedPref, + std::make_unique<base::Value>(false)); + auto card = std::make_unique<QuickDeletePromo>(&pref_service_); + AllCardSignals all_signals = CreateAllCardSignals( + card.get(), {/* kCountOfClearingBrowsingData */ 0, + /* kCountOfClearingBrowsingDataThroughQuickDelete */ 0, + /* kQuickDeletePromoShownCount */ 0}); + CardSelectionSignals card_signal(&all_signals, kQuickDeletePromo); + CardSelectionInfo::ShowResult result = card->ComputeCardResult(card_signal); + EXPECT_EQ(EphemeralHomeModuleRank::kTop, result.position); +} + +// Validates that ComputeCardResult() returns kTop when quick delete promo card +// is enabled for user who cleared their browsing data without knowing about the +// Quick Delete feature in the past 30 days. +TEST_F(QuickDeletePromoTest, + TestComputeCardResultWithCardEnabledForNotUseQuickDelete) { + pref_service_.SetUserPref(kQuickDeletePromoInteractedPref, + std::make_unique<base::Value>(false)); + auto card = std::make_unique<QuickDeletePromo>(&pref_service_); + AllCardSignals all_signals = CreateAllCardSignals( + card.get(), {/* kCountOfClearingBrowsingData */ 5, + /* kCountOfClearingBrowsingDataThroughQuickDelete */ 0, + /* kQuickDeletePromoShownCount */ 0}); + CardSelectionSignals card_signal(&all_signals, kQuickDeletePromo); + CardSelectionInfo::ShowResult result = card->ComputeCardResult(card_signal); + EXPECT_EQ(EphemeralHomeModuleRank::kTop, result.position); +} + +// Validates that when the quick delete promo card is disabled because the user +// have used the Quick Delete feature, the ComputeCardResult() function returns +// kNotShown. +TEST_F(QuickDeletePromoTest, + TestComputeCardResultWithCardDisabledForHaveUsedQuickDelete) { + pref_service_.SetUserPref(kQuickDeletePromoInteractedPref, + std::make_unique<base::Value>(false)); + auto card = std::make_unique<QuickDeletePromo>(&pref_service_); + AllCardSignals all_signals = CreateAllCardSignals( + card.get(), {/* kCountOfClearingBrowsingData */ 5, + /* kCountOfClearingBrowsingDataThroughQuickDelete */ 3, + /* kQuickDeletePromoShownCount */ 0}); + CardSelectionSignals card_signal(&all_signals, kQuickDeletePromo); + CardSelectionInfo::ShowResult result = card->ComputeCardResult(card_signal); + EXPECT_EQ(EphemeralHomeModuleRank::kNotShown, result.position); +} + +// Validates that the ComputeCardResult() function returns kNotShown when the +// card has been displayed to the user more times than the single day limit +// allows. +TEST_F(QuickDeletePromoTest, + TestComputeCardResultWithCardDisabledForHasReachedSessionLimit) { + pref_service_.SetUserPref(kQuickDeletePromoInteractedPref, + std::make_unique<base::Value>(false)); + auto card = std::make_unique<QuickDeletePromo>(&pref_service_); + AllCardSignals all_signals = CreateAllCardSignals( + card.get(), {/* kCountOfClearingBrowsingData */ 5, + /* kCountOfClearingBrowsingDataThroughQuickDelete */ 0, + /* kQuickDeletePromoShownCount */ 3}); + CardSelectionSignals card_signal(&all_signals, kQuickDeletePromo); + CardSelectionInfo::ShowResult result = card->ComputeCardResult(card_signal); + EXPECT_EQ(EphemeralHomeModuleRank::kNotShown, result.position); +} + +// Validates that the ComputeCardResult() function returns kNotShown when the +// quick delete promo card is disabled because the user already interacted with +// the card. +TEST_F(QuickDeletePromoTest, + TestComputeCardResultWithCardDisabledForUserInteraction) { + pref_service_.SetUserPref(kQuickDeletePromoInteractedPref, + std::make_unique<base::Value>(true)); + auto card = std::make_unique<QuickDeletePromo>(&pref_service_); + AllCardSignals all_signals = CreateAllCardSignals( + card.get(), {/* kCountOfClearingBrowsingData */ 5, + /* kCountOfClearingBrowsingDataThroughQuickDelete */ 0, + /* kQuickDeletePromoShownCount */ 0}); + CardSelectionSignals card_signal(&all_signals, kQuickDeletePromo); + CardSelectionInfo::ShowResult result = card->ComputeCardResult(card_signal); + EXPECT_EQ(EphemeralHomeModuleRank::kNotShown, result.position); +} + +} // namespace segmentation_platform::home_modules
diff --git a/components/segmentation_platform/public/features.cc b/components/segmentation_platform/public/features.cc index 9851c247..d4726bf 100644 --- a/components/segmentation_platform/public/features.cc +++ b/components/segmentation_platform/public/features.cc
@@ -246,6 +246,9 @@ constexpr base::FeatureParam<int> kMaxTabGroupSyncCardImpressions{ &kEducationalTipModule, "max_tab_group_sync_card_impressions", /*default_value=*/10}; +constexpr base::FeatureParam<int> kMaxQuickDeleteCardImpressions{ + &kEducationalTipModule, "max_quick_delete_card_impressions", + /*default_value=*/10}; BASE_FEATURE(kSegmentationPlatformFedCmUser, "SegmentationPlatformFedCmUser",
diff --git a/components/segmentation_platform/public/features.h b/components/segmentation_platform/public/features.h index 5c822db..74e8016b 100644 --- a/components/segmentation_platform/public/features.h +++ b/components/segmentation_platform/public/features.h
@@ -159,6 +159,9 @@ // The maximum number of times the tab group sync promo card can be visible to // the user. extern const base::FeatureParam<int> kMaxTabGroupSyncCardImpressions; +// The maximum number of times the quick delete promo card can be visible to the +// user. +extern const base::FeatureParam<int> kMaxQuickDeleteCardImpressions; // Feature flag for enabling FedCM user segment. BASE_DECLARE_FEATURE(kSegmentationPlatformFedCmUser);
diff --git a/components/services/storage/indexed_db/locks/partitioned_lock_id.cc b/components/services/storage/indexed_db/locks/partitioned_lock_id.cc index 519005c..5c436ca 100644 --- a/components/services/storage/indexed_db/locks/partitioned_lock_id.cc +++ b/components/services/storage/indexed_db/locks/partitioned_lock_id.cc
@@ -20,18 +20,4 @@ return out; } -bool operator<(const PartitionedLockId& x, const PartitionedLockId& y) { - if (x.partition != y.partition) - return x.partition < y.partition; - return x.key < y.key; -} - -bool operator==(const PartitionedLockId& x, const PartitionedLockId& y) { - return x.partition == y.partition && x.key == y.key; -} - -bool operator!=(const PartitionedLockId& x, const PartitionedLockId& y) { - return !(x == y); -} - } // namespace content::indexed_db
diff --git a/components/services/storage/indexed_db/locks/partitioned_lock_id.h b/components/services/storage/indexed_db/locks/partitioned_lock_id.h index 7ec250a..cf50150 100644 --- a/components/services/storage/indexed_db/locks/partitioned_lock_id.h +++ b/components/services/storage/indexed_db/locks/partitioned_lock_id.h
@@ -13,15 +13,16 @@ struct PartitionedLockId { int partition; std::string key; + + friend auto operator<=>(const PartitionedLockId&, + const PartitionedLockId&) = default; + friend bool operator==(const PartitionedLockId&, + const PartitionedLockId&) = default; }; // Logging support. std::ostream& operator<<(std::ostream& out, const PartitionedLockId& range); -bool operator<(const PartitionedLockId& x, const PartitionedLockId& y); -bool operator==(const PartitionedLockId& x, const PartitionedLockId& y); -bool operator!=(const PartitionedLockId& x, const PartitionedLockId& y); - } // namespace content::indexed_db #endif // COMPONENTS_SERVICES_STORAGE_INDEXED_DB_LOCKS_PARTITIONED_LOCK_ID_H_
diff --git a/components/shared_highlighting/core/common/text_fragment_unittest.cc b/components/shared_highlighting/core/common/text_fragment_unittest.cc index da59a86..95ad7e5 100644 --- a/components/shared_highlighting/core/common/text_fragment_unittest.cc +++ b/components/shared_highlighting/core/common/text_fragment_unittest.cc
@@ -20,95 +20,96 @@ TEST(TextFragmentTest, FragmentToValueFromEncodedString) { // Success cases - std::string fragment = "start"; - base::Value::Dict result = TextFragmentToValue(fragment).TakeDict(); + base::Value result_val = TextFragmentToValue("start"); + ASSERT_TRUE(result_val.is_dict()); + base::Value::Dict result = std::move(result_val).TakeDict(); EXPECT_FALSE(result.contains(kFragmentPrefixKey)); EXPECT_EQ("start", *result.FindString(kFragmentTextStartKey)); EXPECT_FALSE(result.contains(kFragmentTextEndKey)); EXPECT_FALSE(result.contains(kFragmentSuffixKey)); - fragment = "start,end"; - result = TextFragmentToValue(fragment).TakeDict(); + result_val = TextFragmentToValue("start,end"); + ASSERT_TRUE(result_val.is_dict()); + result = std::move(result_val).TakeDict(); EXPECT_FALSE(result.contains(kFragmentPrefixKey)); EXPECT_EQ("start", *result.FindString(kFragmentTextStartKey)); EXPECT_EQ("end", *result.FindString(kFragmentTextEndKey)); EXPECT_FALSE(result.contains(kFragmentSuffixKey)); - fragment = "prefix-,start"; - result = TextFragmentToValue(fragment).TakeDict(); + result_val = TextFragmentToValue("prefix-,start"); + ASSERT_TRUE(result_val.is_dict()); + result = std::move(result_val).TakeDict(); EXPECT_EQ("prefix", *result.FindString(kFragmentPrefixKey)); EXPECT_EQ("start", *result.FindString(kFragmentTextStartKey)); EXPECT_FALSE(result.contains(kFragmentTextEndKey)); EXPECT_FALSE(result.contains(kFragmentSuffixKey)); - fragment = "start,-suffix"; - result = TextFragmentToValue(fragment).TakeDict(); + result_val = TextFragmentToValue("start,-suffix"); + ASSERT_TRUE(result_val.is_dict()); + result = std::move(result_val).TakeDict(); EXPECT_FALSE(result.contains(kFragmentPrefixKey)); EXPECT_EQ("start", *result.FindString(kFragmentTextStartKey)); EXPECT_FALSE(result.contains(kFragmentTextEndKey)); EXPECT_EQ("suffix", *result.FindString(kFragmentSuffixKey)); - fragment = "prefix-,start,end"; - result = TextFragmentToValue(fragment).TakeDict(); + result_val = TextFragmentToValue("prefix-,start,end"); + ASSERT_TRUE(result_val.is_dict()); + result = std::move(result_val).TakeDict(); EXPECT_EQ("prefix", *result.FindString(kFragmentPrefixKey)); EXPECT_EQ("start", *result.FindString(kFragmentTextStartKey)); EXPECT_EQ("end", *result.FindString(kFragmentTextEndKey)); EXPECT_FALSE(result.contains(kFragmentSuffixKey)); - fragment = "start,end,-suffix"; - result = TextFragmentToValue(fragment).TakeDict(); + result_val = TextFragmentToValue("start,end,-suffix"); + ASSERT_TRUE(result_val.is_dict()); + result = std::move(result_val).TakeDict(); EXPECT_FALSE(result.contains(kFragmentPrefixKey)); EXPECT_EQ("start", *result.FindString(kFragmentTextStartKey)); EXPECT_EQ("end", *result.FindString(kFragmentTextEndKey)); EXPECT_EQ("suffix", *result.FindString(kFragmentSuffixKey)); - fragment = "prefix-,start,end,-suffix"; - result = TextFragmentToValue(fragment).TakeDict(); + result_val = TextFragmentToValue("prefix-,start,end,-suffix"); + ASSERT_TRUE(result_val.is_dict()); + result = std::move(result_val).TakeDict(); EXPECT_EQ("prefix", *result.FindString(kFragmentPrefixKey)); EXPECT_EQ("start", *result.FindString(kFragmentTextStartKey)); EXPECT_EQ("end", *result.FindString(kFragmentTextEndKey)); EXPECT_EQ("suffix", *result.FindString(kFragmentSuffixKey)); // Trailing comma doesn't break otherwise valid fragment - fragment = "start,"; - result = TextFragmentToValue(fragment).TakeDict(); + result_val = TextFragmentToValue("start,"); + ASSERT_TRUE(result_val.is_dict()); + result = std::move(result_val).TakeDict(); EXPECT_FALSE(result.contains(kFragmentPrefixKey)); EXPECT_EQ("start", *result.FindString(kFragmentTextStartKey)); EXPECT_FALSE(result.contains(kFragmentTextEndKey)); EXPECT_FALSE(result.contains(kFragmentSuffixKey)); // Failure Cases - fragment = ""; - base::Value result_val = TextFragmentToValue(fragment); + result_val = TextFragmentToValue(""); EXPECT_EQ(base::Value::Type::NONE, result_val.type()); - fragment = "some,really-,malformed,-thing,with,too,many,commas"; - result_val = TextFragmentToValue(fragment); + result_val = + TextFragmentToValue("some,really-,malformed,-thing,with,too,many,commas"); EXPECT_EQ(base::Value::Type::NONE, result_val.type()); - fragment = "prefix-,-suffix"; - result_val = TextFragmentToValue(fragment); + result_val = TextFragmentToValue("prefix-,-suffix"); EXPECT_EQ(base::Value::Type::NONE, result_val.type()); - fragment = "start,prefix-,-suffix"; - result_val = TextFragmentToValue(fragment); + result_val = TextFragmentToValue("start,prefix-,-suffix"); EXPECT_EQ(base::Value::Type::NONE, result_val.type()); - fragment = "prefix-,-suffix,start"; - result_val = TextFragmentToValue(fragment); + result_val = TextFragmentToValue("prefix-,-suffix,start"); EXPECT_EQ(base::Value::Type::NONE, result_val.type()); - fragment = "prefix-"; - result_val = TextFragmentToValue(fragment); + result_val = TextFragmentToValue("prefix-"); EXPECT_EQ(base::Value::Type::NONE, result_val.type()); - fragment = "-suffix"; - result_val = TextFragmentToValue(fragment); + result_val = TextFragmentToValue("-suffix"); EXPECT_EQ(base::Value::Type::NONE, result_val.type()); // Invalid characters - fragment = "\xFF\xFF"; - result_val = TextFragmentToValue(fragment); + result_val = TextFragmentToValue("\xFF\xFF"); EXPECT_EQ(base::Value::Type::NONE, result_val.type()); } @@ -172,8 +173,8 @@ std::optional<TextFragment> opt_fragment = TextFragment::FromValue(&fragment_value); - EXPECT_TRUE(opt_fragment.has_value()); - TextFragment fragment = opt_fragment.value(); + ASSERT_TRUE(opt_fragment.has_value()); + const TextFragment& fragment = opt_fragment.value(); EXPECT_EQ(text_start, fragment.text_start()); EXPECT_EQ(text_end, fragment.text_end()); EXPECT_EQ(prefix, fragment.prefix());
diff --git a/components/signin/internal/identity_manager/account_capabilities_fetcher_android.cc b/components/signin/internal/identity_manager/account_capabilities_fetcher_android.cc index 6298a4d..fc9af368 100644 --- a/components/signin/internal/identity_manager/account_capabilities_fetcher_android.cc +++ b/components/signin/internal/identity_manager/account_capabilities_fetcher_android.cc
@@ -37,7 +37,7 @@ weak_ptr_factory_.GetWeakPtr())); base::android::ScopedJavaLocalRef<jobject> local_java_ref = signin::Java_AccountCapabilitiesFetcher_Constructor( - env, ConvertToJavaCoreAccountInfo(env, account_info), + env, account_info, reinterpret_cast<intptr_t>(heap_callback.release())); java_ref_.Reset(env, local_java_ref.obj()); }
diff --git a/components/signin/internal/identity_manager/account_capabilities_fetcher_unittest.cc b/components/signin/internal/identity_manager/account_capabilities_fetcher_unittest.cc index 97c542a6..5e042819c 100644 --- a/components/signin/internal/identity_manager/account_capabilities_fetcher_unittest.cc +++ b/components/signin/internal/identity_manager/account_capabilities_fetcher_unittest.cc
@@ -75,10 +75,9 @@ } void AddAccount(const CoreAccountInfo& account_info) { - JNIEnv* env = base::android::AttachCurrentThread(); signin::Java_AccountCapabilitiesFetcherTestUtil_expectAccount( - env, java_test_util_ref_, - ConvertToJavaCoreAccountInfo(env, account_info)); + base::android::AttachCurrentThread(), java_test_util_ref_, + account_info); } std::unique_ptr<AccountCapabilitiesFetcher> CreateFetcher( @@ -114,8 +113,7 @@ const AccountCapabilities& capabilities) { JNIEnv* env = base::android::AttachCurrentThread(); signin::Java_AccountCapabilitiesFetcherTestUtil_returnCapabilities( - env, java_test_util_ref_, - ConvertToJavaCoreAccountInfo(env, account_info), + env, java_test_util_ref_, account_info, capabilities.ConvertToJavaAccountCapabilities(env)); }
diff --git a/components/signin/public/android/java/src/org/chromium/components/signin/AccountCapabilitiesFetcher.java b/components/signin/public/android/java/src/org/chromium/components/signin/AccountCapabilitiesFetcher.java index 0969046..d8d62ab 100644 --- a/components/signin/public/android/java/src/org/chromium/components/signin/AccountCapabilitiesFetcher.java +++ b/components/signin/public/android/java/src/org/chromium/components/signin/AccountCapabilitiesFetcher.java
@@ -5,6 +5,7 @@ package org.chromium.components.signin; import org.jni_zero.CalledByNative; +import org.jni_zero.JniType; import org.jni_zero.NativeMethods; import org.chromium.components.signin.base.AccountCapabilities; @@ -23,13 +24,13 @@ /** * Constructs a fetcher tied to a single account identified by {@code coreAccountInfo}. * - * WARNING: - * {@code nativeCallback} points to an unowned callback object allocated on native heap. {@code - * this} *must* call {@link #onCapabilitiesFetchComplete} in order to clean up the callback - * object properly. + * <p>WARNING: {@code nativeCallback} points to an unowned callback object allocated on native + * heap. {@code this} *must* call {@link #onCapabilitiesFetchComplete} in order to clean up the + * callback object properly. */ @CalledByNative - public AccountCapabilitiesFetcher(CoreAccountInfo coreAccountInfo, long nativeCallback) { + public AccountCapabilitiesFetcher( + @JniType("CoreAccountInfo") CoreAccountInfo coreAccountInfo, long nativeCallback) { assert nativeCallback != INVALID_NATIVE_CALLBACK; mCoreAccountInfo = coreAccountInfo; mNativeCallback = nativeCallback;
diff --git a/components/signin/public/android/java/src/org/chromium/components/signin/identitymanager/AccountManagedStatusFinder.java b/components/signin/public/android/java/src/org/chromium/components/signin/identitymanager/AccountManagedStatusFinder.java index d38110b..ac1057e 100644 --- a/components/signin/public/android/java/src/org/chromium/components/signin/identitymanager/AccountManagedStatusFinder.java +++ b/components/signin/public/android/java/src/org/chromium/components/signin/identitymanager/AccountManagedStatusFinder.java
@@ -104,7 +104,7 @@ public interface Natives { long createNativeObject( @JniType("IdentityManager*") IdentityManager identityManager, - CoreAccountInfo account, + @JniType("CoreAccountInfo") CoreAccountInfo account, @JniType("base::RepeatingClosure") Runnable asyncCallback, long timeout);
diff --git a/components/signin/public/android/java/src/org/chromium/components/signin/test/util/AccountCapabilitiesFetcherTestUtil.java b/components/signin/public/android/java/src/org/chromium/components/signin/test/util/AccountCapabilitiesFetcherTestUtil.java index f1e6b78..4dd568b 100644 --- a/components/signin/public/android/java/src/org/chromium/components/signin/test/util/AccountCapabilitiesFetcherTestUtil.java +++ b/components/signin/public/android/java/src/org/chromium/components/signin/test/util/AccountCapabilitiesFetcherTestUtil.java
@@ -10,6 +10,7 @@ import android.os.Looper; import org.jni_zero.CalledByNative; +import org.jni_zero.JniType; import org.mockito.Mockito; import org.chromium.base.Promise; @@ -49,7 +50,7 @@ * with {@code accountInfo}. */ @CalledByNative - public void expectAccount(CoreAccountInfo accountInfo) { + public void expectAccount(@JniType("CoreAccountInfo") CoreAccountInfo accountInfo) { // Only one account at a time is supported. assert mCapabilitiesPromise == null; assert mExpectedAccount == null; @@ -64,7 +65,9 @@ * #expectAccount} has been called with the same {@code accountInfo} parameter. */ @CalledByNative - public void returnCapabilities(CoreAccountInfo accountInfo, AccountCapabilities capabilities) { + public void returnCapabilities( + @JniType("CoreAccountInfo") CoreAccountInfo accountInfo, + AccountCapabilities capabilities) { assert mCapabilitiesPromise != null; assert mExpectedAccount != null; assert mExpectedAccount.equals(accountInfo);
diff --git a/components/signin/public/identity_manager/account_info.h b/components/signin/public/identity_manager/account_info.h index 2743dc46..37873bf 100644 --- a/components/signin/public/identity_manager/account_info.h +++ b/components/signin/public/identity_manager/account_info.h
@@ -166,6 +166,22 @@ // Constructs a C++ GaiaId from the provided Java GaiaId. GaiaId ConvertFromJavaGaiaId(JNIEnv* env, const base::android::JavaRef<jobject>& j_gaia_id); + +namespace jni_zero { +template <> +inline CoreAccountInfo FromJniType<CoreAccountInfo>( + JNIEnv* env, + const JavaRef<jobject>& j_core_account_info) { + return ConvertFromJavaCoreAccountInfo(env, j_core_account_info); +} + +template <> +inline ScopedJavaLocalRef<jobject> ToJniType( + JNIEnv* env, + const CoreAccountInfo& core_account_info) { + return ConvertToJavaCoreAccountInfo(env, core_account_info); +} +} // namespace jni_zero #endif #endif // COMPONENTS_SIGNIN_PUBLIC_IDENTITY_MANAGER_ACCOUNT_INFO_H_
diff --git a/components/signin/public/identity_manager/account_managed_status_finder.cc b/components/signin/public/identity_manager/account_managed_status_finder.cc index 6facfc6..97eb97fc 100644 --- a/components/signin/public/identity_manager/account_managed_status_finder.cc +++ b/components/signin/public/identity_manager/account_managed_status_finder.cc
@@ -11,6 +11,7 @@ #include "base/location.h" #include "base/logging.h" #include "base/time/time.h" +#include "components/signin/public/identity_manager/account_info.h" #include "google_apis/gaia/gaia_auth_util.h" #include "google_apis/gaia/google_service_auth_error.h" @@ -684,16 +685,14 @@ static jlong JNI_AccountManagedStatusFinder_CreateNativeObject( JNIEnv* env, IdentityManager* identity_manager, - const base::android::JavaParamRef<jobject>& j_core_account_info, + CoreAccountInfo& account, base::RepeatingClosure& callback, jlong timeout_in_millis) { - CoreAccountInfo account_info = - ConvertFromJavaCoreAccountInfo(env, j_core_account_info); base::TimeDelta timeout = timeout_in_millis < 0 ? base::TimeDelta::Max() : base::Milliseconds(timeout_in_millis); auto result = std::make_unique<AccountManagedStatusFinder>( - identity_manager, std::move(account_info), callback, timeout); + identity_manager, account, std::move(callback), timeout); return reinterpret_cast<intptr_t>(result.release()); }
diff --git a/components/sync/android/java/src/org/chromium/components/sync/ExplicitPassphrasePlatformClient.java b/components/sync/android/java/src/org/chromium/components/sync/ExplicitPassphrasePlatformClient.java index 87840dd..c189f96 100644 --- a/components/sync/android/java/src/org/chromium/components/sync/ExplicitPassphrasePlatformClient.java +++ b/components/sync/android/java/src/org/chromium/components/sync/ExplicitPassphrasePlatformClient.java
@@ -9,6 +9,7 @@ import com.google.protobuf.InvalidProtocolBufferException; import org.jni_zero.CalledByNative; +import org.jni_zero.JniType; import org.chromium.base.ServiceLoaderUtil; import org.chromium.components.signin.base.CoreAccountInfo; @@ -29,7 +30,8 @@ CoreAccountInfo account, NigoriKey nigoriKey); @CalledByNative - private static void setExplicitDecryptionPassphrase(CoreAccountInfo account, byte[] nigoriKey) { + private static void setExplicitDecryptionPassphrase( + @JniType("CoreAccountInfo") CoreAccountInfo account, byte[] nigoriKey) { NigoriKey parsedKey; try { parsedKey = NigoriKey.parseFrom(nigoriKey);
diff --git a/components/sync/service/sync_service_impl.cc b/components/sync/service/sync_service_impl.cc index c14cf53..27c32b2 100644 --- a/components/sync/service/sync_service_impl.cc +++ b/components/sync/service/sync_service_impl.cc
@@ -2075,8 +2075,7 @@ proto.SerializeToArray(bytes.data(), byte_size); JNIEnv* env = base::android::AttachCurrentThread(); Java_ExplicitPassphrasePlatformClient_setExplicitDecryptionPassphrase( - env, ConvertToJavaCoreAccountInfo(env, GetAccountInfo()), - base::android::ToJavaByteArray(env, bytes)); + env, GetAccountInfo(), base::android::ToJavaByteArray(env, bytes)); #endif // BUILDFLAG(IS_ANDROID) }
diff --git a/components/sync_bookmarks/local_bookmark_to_account_merger.cc b/components/sync_bookmarks/local_bookmark_to_account_merger.cc index 090e41b..055d6c4 100644 --- a/components/sync_bookmarks/local_bookmark_to_account_merger.cc +++ b/components/sync_bookmarks/local_bookmark_to_account_merger.cc
@@ -8,6 +8,7 @@ #include <list> #include <optional> #include <string> +#include <unordered_map> #include <utility> #include <vector> @@ -159,7 +160,7 @@ LocalBookmarkToAccountMerger::LocalBookmarkToAccountMerger( bookmarks::BookmarkModel* model) - : model_(model), uuid_to_match_map_(FindGuidMatches(model)) { + : model_(model) { CHECK(model_); CHECK(model_->loaded()); for (const auto& [local_permanent_node, account_permanent_node] : @@ -203,9 +204,6 @@ /*account_subtree_root=*/account_permanent_node); } - // Clear the UUID match map to avoid dangling pointers. - uuid_to_match_map_.clear(); - // All local nodes have been copied to account storage and can be safely // removed. for (const auto& [local_permanent_node, unused] : @@ -223,50 +221,6 @@ RemoveChildrenAt(parent, indices_to_remove, location); } -// static -std::unordered_map<base::Uuid, - LocalBookmarkToAccountMerger::GuidMatch, - base::UuidHash> -LocalBookmarkToAccountMerger::FindGuidMatches( - const bookmarks::BookmarkModel* model) { - CHECK(model); - CHECK(model->loaded()); - - std::unordered_map<base::Uuid, LocalBookmarkToAccountMerger::GuidMatch, - base::UuidHash> - uuid_to_match_map; - - // Iterate through all local bookmarks to find matches by UUID. - for (const auto& [local_permanent_node, unused] : - GetLocalAndAccountPermanentNodePairs(model)) { - CHECK(local_permanent_node); - ui::TreeNodeIterator<const bookmarks::BookmarkNode> local_iterator( - local_permanent_node); - while (local_iterator.has_next()) { - const bookmarks::BookmarkNode* const local_node = local_iterator.Next(); - CHECK(local_node->uuid().is_valid()); - - const bookmarks::BookmarkNode* const account_node = model->GetNodeByUuid( - local_node->uuid(), - bookmarks::BookmarkModel::NodeTypeForUuidLookup::kAccountNodes); - if (!account_node) { - // No match found by UUID. - continue; - } - - if (NodesCompatibleForMatchByUuid(account_node, local_node)) { - const bool success = uuid_to_match_map - .emplace(account_node->uuid(), - GuidMatch{local_node, account_node}) - .second; - CHECK(success); - } - } - } - - return uuid_to_match_map; -} - void LocalBookmarkToAccountMerger::RemoveChildrenAt( const bookmarks::BookmarkNode* parent, const std::vector<size_t>& indices_to_remove, @@ -286,8 +240,6 @@ if (indices_to_remove.size() == 1u) { const size_t index = *indices_to_remove.begin(); const bookmarks::BookmarkNode* child = parent->children().at(index).get(); - // Remove the UUID from the map to avoid dangling pointers. - uuid_to_match_map_.erase(child->uuid()); model_->Remove(child, kEditSourceForMetrics, location); return; } @@ -296,8 +248,6 @@ switches::kSyncFastDeletionsDuringBookmarkBatchUpload)) { for (size_t index : base::Reversed(indices_to_remove)) { const bookmarks::BookmarkNode* child = parent->children().at(index).get(); - // Remove the UUID from the map to avoid dangling pointers. - uuid_to_match_map_.erase(child->uuid()); model_->Remove(child, kEditSourceForMetrics, location); } return; @@ -317,8 +267,6 @@ // internal indices in BookmarkModel, which can exhibit slower characteristics // depending on the actual content of the nodes, such as the title or the URL. for (size_t i = 0; i < indices_to_remove.size(); ++i) { - // Remove the UUID from the map to avoid dangling pointers. - uuid_to_match_map_.erase(parent->children().back()->uuid()); model_->RemoveLastChild(parent, kEditSourceForMetrics, FROM_HERE); } } @@ -396,9 +344,10 @@ MergeAndDeleteDescendantsThatMatchByUuid(local_child); // Move the local node to account storage, along with all remaining - // descendants that didn't match by UUID. - // TODO(crbug.com/332532186): This has quadratic runtime complexity and - // should be improved. + // descendants that didn't match by UUID. Note that this can theoretically + // lead to quadratic runtime complexity, but measurements with a large + // number of bookmarks suggest the issue is not severe in practice and the + // complexity of the improved algorithm is not worth the maintenance cost. model_->Move(local_child, account_subtree_root, account_subtree_root->children().size()); } @@ -408,9 +357,6 @@ // merged into it, as nodes without a match have been moved. Therefore, the // remaining local data can be safely deleted. while (!local_subtree_root->children().empty()) { - // Update the UUID match map to avoid dangling pointers. - uuid_to_match_map_.erase(local_subtree_root->children().back()->uuid()); - model_->RemoveLastChild(local_subtree_root, kEditSourceForMetrics, FROM_HERE); } @@ -471,17 +417,14 @@ const bookmarks::BookmarkNode* account_node) const { CHECK(account_node); - const auto it = uuid_to_match_map_.find(account_node->uuid()); - if (it == uuid_to_match_map_.end()) { - return nullptr; + const bookmarks::BookmarkNode* const local_node = model_->GetNodeByUuid( + account_node->uuid(), + bookmarks::BookmarkModel::NodeTypeForUuidLookup::kLocalOrSyncableNodes); + if (local_node && NodesCompatibleForMatchByUuid(local_node, account_node) && + !model_->client()->IsNodeManaged(local_node)) { + return local_node; } - - const bookmarks::BookmarkNode* local_node = it->second.local_node; - CHECK(local_node); - CHECK_EQ(it->second.account_node, account_node); - CHECK(NodesCompatibleForMatchByUuid(local_node, account_node)); - - return local_node; + return nullptr; } const bookmarks::BookmarkNode* @@ -489,17 +432,13 @@ const bookmarks::BookmarkNode* local_node) const { CHECK(local_node); - const auto it = uuid_to_match_map_.find(local_node->uuid()); - if (it == uuid_to_match_map_.end()) { - return nullptr; + const bookmarks::BookmarkNode* const account_node = model_->GetNodeByUuid( + local_node->uuid(), + bookmarks::BookmarkModel::NodeTypeForUuidLookup::kAccountNodes); + if (account_node && NodesCompatibleForMatchByUuid(local_node, account_node)) { + return account_node; } - - const bookmarks::BookmarkNode* account_node = it->second.account_node; - CHECK(account_node); - CHECK_EQ(it->second.local_node, local_node); - CHECK(NodesCompatibleForMatchByUuid(local_node, account_node)); - - return account_node; + return nullptr; } } // namespace sync_bookmarks
diff --git a/components/sync_bookmarks/local_bookmark_to_account_merger.h b/components/sync_bookmarks/local_bookmark_to_account_merger.h index 8849803..1d94186 100644 --- a/components/sync_bookmarks/local_bookmark_to_account_merger.h +++ b/components/sync_bookmarks/local_bookmark_to_account_merger.h
@@ -5,11 +5,9 @@ #ifndef COMPONENTS_SYNC_BOOKMARKS_LOCAL_BOOKMARK_TO_ACCOUNT_MERGER_H_ #define COMPONENTS_SYNC_BOOKMARKS_LOCAL_BOOKMARK_TO_ACCOUNT_MERGER_H_ -#include <unordered_map> #include <vector> #include "base/memory/raw_ptr.h" -#include "base/uuid.h" namespace base { class Location; @@ -45,19 +43,6 @@ const base::Location& location); private: - // Represents a pair of bookmarks, one in local storage one in account - // storage, that have been matched by UUID. They are guaranteed to have the - // same type and URL (if applicable). - struct GuidMatch { - raw_ptr<const bookmarks::BookmarkNode> local_node = nullptr; - raw_ptr<const bookmarks::BookmarkNode> account_node = nullptr; - }; - - // Computes bookmark pairs that should be matched by UUID. Note that matches - // may be incompatible, that is, if only one of the two is a folder. - static std::unordered_map<base::Uuid, GuidMatch, base::UuidHash> - FindGuidMatches(const bookmarks::BookmarkModel* model); - // Removes an arbitrary set of nodes among siblings under `parent`, as // selected by `indices_to_remove`, which must be sorted in ascending order. // `location` is used for logging purposes and investigations. @@ -102,7 +87,6 @@ const bookmarks::BookmarkNode* local_node) const; const raw_ptr<bookmarks::BookmarkModel> model_; - std::unordered_map<base::Uuid, GuidMatch, base::UuidHash> uuid_to_match_map_; }; } // namespace sync_bookmarks
diff --git a/components/update_client/update_client.cc b/components/update_client/update_client.cc index 58762bc..e48cc05 100644 --- a/components/update_client/update_client.cc +++ b/components/update_client/update_client.cc
@@ -93,7 +93,9 @@ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); if (IsUpdating(id)) { - std::move(callback).Run(Error::UPDATE_IN_PROGRESS); + base::SequencedTaskRunner::GetCurrentDefault()->PostTask( + FROM_HERE, + base::BindOnce(std::move(callback), Error::UPDATE_IN_PROGRESS)); return base::DoNothing(); }
diff --git a/components/update_client/update_client.h b/components/update_client/update_client.h index 4dab85f9..526e16f 100644 --- a/components/update_client/update_client.h +++ b/components/update_client/update_client.h
@@ -426,15 +426,15 @@ // the observers are being notified. virtual void RemoveObserver(Observer* observer) = 0; - // Installs the specified CRX. Calls back on |callback| after the + // Installs the specified CRX. Calls `callback` on the same sequence after the // update has been handled. Provides state change notifications through - // invocations of the optional |crx_state_change_callback| callback. - // The |error| parameter of the |callback| contains an error code in the case + // invocations of the optional `crx_state_change_callback` callback. + // The `error` parameter of the `callback` contains an error code in the case // of a run-time error, or 0 if the install has been handled successfully. // Overlapping calls of this function are executed concurrently, as long as // the id parameter is different, meaning that installs of different // components are parallelized. - // The |Install| function is intended to be used for foreground installs of + // The `Install` function is intended to be used for foreground installs of // one CRX. These cases are usually associated with on-demand install // scenarios, which are triggered by user actions. Installs are never // queued up.
diff --git a/components/variations/service/variations_field_trial_creator_base.cc b/components/variations/service/variations_field_trial_creator_base.cc index 753fc84..779af93 100644 --- a/components/variations/service/variations_field_trial_creator_base.cc +++ b/components/variations/service/variations_field_trial_creator_base.cc
@@ -316,11 +316,19 @@ command_line->GetSwitchValuePath(switches::kVariationsTestSeedJsonPath)); } + // Get client filterable state to be used by CreateTrialsFromSeed() + std::unique_ptr<ClientFilterableState> client_filterable_state = nullptr; + const base::Version& current_version = version_info::GetVersion(); + if (current_version.IsValid()) { + client_filterable_state = + GetClientFilterableStateForVersion(current_version); + } + bool used_seed = false; - if (!used_testing_config) { - used_seed = - CreateTrialsFromSeed(entropy_providers, feature_list.get(), - safe_seed_manager, synthetic_trial_registry); + if (!used_testing_config && client_filterable_state) { + used_seed = CreateTrialsFromSeed( + entropy_providers, feature_list.get(), safe_seed_manager, + synthetic_trial_registry, std::move(client_filterable_state)); } platform_field_trials->SetUpClientSideFieldTrials( @@ -621,7 +629,8 @@ const EntropyProviders& entropy_providers, base::FeatureList* feature_list, SafeSeedManagerBase* safe_seed_manager, - SyntheticTrialRegistry* synthetic_trial_registry) { + SyntheticTrialRegistry* synthetic_trial_registry, + std::unique_ptr<ClientFilterableState> client_state) { // This histogram name uses "VariationsFieldTrialCreator" rather than // "VariationsFieldTrialCreatorBase" for consistency with historical data TRACE_EVENT0("startup", "VariationsFieldTrialCreator::CreateTrialsFromSeed"); @@ -632,17 +641,9 @@ base::TimeTicks start_time = base::TimeTicks::Now(); - const base::Version& current_version = version_info::GetVersion(); - if (!current_version.IsValid()) { - return false; - } - - std::unique_ptr<ClientFilterableState> client_filterable_state = - GetClientFilterableStateForVersion(current_version); - base::UmaHistogramSparse("Variations.UserChannel", - client_filterable_state->channel); + base::UmaHistogramSparse("Variations.UserChannel", client_state->channel); base::UmaHistogramEnumeration("Variations.PolicyRestriction", - client_filterable_state->policy_restriction); + client_state->policy_restriction); seed_type_ = safe_seed_manager->GetSeedType(); // If we have tried safe seed and we still get crashes, try null seed. @@ -658,7 +659,7 @@ const bool run_in_safe_mode = seed_type_ == SeedType::kSafeSeed; const bool seed_loaded = run_in_safe_mode - ? GetSeedStore()->LoadSafeSeed(&seed, client_filterable_state.get()) + ? GetSeedStore()->LoadSafeSeed(&seed, client_state.get()) : GetSeedStore()->LoadSeed(&seed, &seed_data, &base64_seed_signature); if (!seed_loaded) { // If Chrome should run in safe mode but the safe seed was not successfully @@ -711,7 +712,7 @@ // not components/variations/service) as the variations component should not // depend on //ui/base. VariationsSeedProcessor().CreateTrialsFromSeed( - seed, *client_filterable_state, + seed, *client_state, base::BindRepeating(&VariationsFieldTrialCreatorBase::OverrideUIString, base::Unretained(this)), entropy_providers, layers, feature_list); @@ -727,7 +728,7 @@ safe_seed_manager->SetActiveSeedState( seed_data, base64_seed_signature, local_state()->GetInteger(prefs::kVariationsSeedMilestone), - std::move(client_filterable_state), seed_store_->GetLastFetchTime()); + std::move(client_state), seed_store_->GetLastFetchTime()); } base::UmaHistogramCounts1M("Variations.AppliedSeed.Size", seed_data.size());
diff --git a/components/variations/service/variations_field_trial_creator_base.h b/components/variations/service/variations_field_trial_creator_base.h index 048149a..7fd2370 100644 --- a/components/variations/service/variations_field_trial_creator_base.h +++ b/components/variations/service/variations_field_trial_creator_base.h
@@ -282,7 +282,8 @@ bool CreateTrialsFromSeed(const EntropyProviders& entropy_providers, base::FeatureList* feature_list, SafeSeedManagerBase* safe_seed_manager, - SyntheticTrialRegistry* synthetic_trial_registry); + SyntheticTrialRegistry* synthetic_trial_registry, + std::unique_ptr<ClientFilterableState> state); // Reads a seed's data and signature from the file at |json_seed_path| and // writes them to Local State. Exits Chrome if (A) the file's contents can't
diff --git a/components/viz/common/features.cc b/components/viz/common/features.cc index 55bb7f0..f8b31e1 100644 --- a/components/viz/common/features.cc +++ b/components/viz/common/features.cc
@@ -126,6 +126,13 @@ BASE_FEATURE(kDCompSurfacesForDelegatedInk, "DCompSurfacesForDelegatedInk", base::FEATURE_ENABLED_BY_DEFAULT); + +// If enabled, Chromium will utilize DXGI SwapChains and DComp visuals as the +// software output device rather than GDI bit block transfer to the redirection +// surface. +BASE_FEATURE(kUseSwapChainForSoftwareRendering, + "UseSwapChainForSoftwareRendering", + base::FEATURE_DISABLED_BY_DEFAULT); #endif // Note: This feature is actively being finched (Oct, 2024). @@ -213,10 +220,6 @@ base::FEATURE_ENABLED_BY_DEFAULT); #endif -BASE_FEATURE(kDrawPredictedInkPoint, - "DrawPredictedInkPoint", - base::FEATURE_ENABLED_BY_DEFAULT); - #if BUILDFLAG(IS_APPLE) // Increase the max CALayer number allowed for CoreAnimation. // * If this feature is disabled, then the default limit is 128 quads, @@ -531,10 +534,6 @@ return base::FeatureList::IsEnabled(kWebRtcLogCapturePipeline); } -bool ShouldDrawPredictedInkPoints() { - return base::FeatureList::IsEnabled(kDrawPredictedInkPoint); -} - #if BUILDFLAG(IS_ANDROID) bool UseWebViewNewInvalidateHeuristic() { // For Android TVs we bundle this with WebViewSurfaceControlForTV.
diff --git a/components/viz/common/features.h b/components/viz/common/features.h index 81d3ed6..db2b37a 100644 --- a/components/viz/common/features.h +++ b/components/viz/common/features.h
@@ -50,6 +50,7 @@ #if BUILDFLAG(IS_WIN) VIZ_COMMON_EXPORT BASE_DECLARE_FEATURE(kDCompSurfacesForDelegatedInk); +VIZ_COMMON_EXPORT BASE_DECLARE_FEATURE(kUseSwapChainForSoftwareRendering); #endif VIZ_COMMON_EXPORT BASE_DECLARE_FEATURE(kRenderPassDrawnRect); VIZ_COMMON_EXPORT BASE_DECLARE_FEATURE(kRecordSkPicture); @@ -93,7 +94,6 @@ VIZ_COMMON_EXPORT BASE_DECLARE_FEATURE(kVSyncAlignedPresent); #endif -VIZ_COMMON_EXPORT BASE_DECLARE_FEATURE(kDrawPredictedInkPoint); VIZ_COMMON_EXPORT BASE_DECLARE_FEATURE(kAllowUndamagedNonrootRenderPassToSkip); VIZ_COMMON_EXPORT BASE_DECLARE_FEATURE( kAllowForceMergeRenderPassWithRequireOverlayQuads); @@ -160,7 +160,6 @@ VIZ_COMMON_EXPORT bool IsUsingVizFrameSubmissionForWebView(); VIZ_COMMON_EXPORT bool IsUsingPreferredIntervalForVideo(); VIZ_COMMON_EXPORT bool ShouldWebRtcLogCapturePipeline(); -VIZ_COMMON_EXPORT bool ShouldDrawPredictedInkPoints(); VIZ_COMMON_EXPORT bool UseWebViewNewInvalidateHeuristic(); VIZ_COMMON_EXPORT bool UseSurfaceLayerForVideo(); VIZ_COMMON_EXPORT int MaxOverlaysConsidered();
diff --git a/components/viz/service/BUILD.gn b/components/viz/service/BUILD.gn index 32a1a1d..29881fa 100644 --- a/components/viz/service/BUILD.gn +++ b/components/viz/service/BUILD.gn
@@ -467,12 +467,26 @@ "display_embedder/software_output_device_win.h", "display_embedder/software_output_device_win_base.cc", "display_embedder/software_output_device_win_base.h", + "display_embedder/software_output_device_win_swapchain.cc", + "display_embedder/software_output_device_win_swapchain.h", "frame_sinks/external_begin_frame_source_win.cc", "frame_sinks/external_begin_frame_source_win.h", "gl/info_collection_gpu_service_impl.cc", "gl/info_collection_gpu_service_impl.h", ] + libs = [ + "d3d11.lib", + "dxgi.lib", + "dcomp.lib", + ] + + ldflags = [ + "/DELAYLOAD:d3d11.dll", + "/DELAYLOAD:dxgi.dll", + "/DELAYLOAD:dcomp.dll", + ] + # SkiaOutputDeviceBufferQueue doesn't support Windows. sources -= [ "display_embedder/output_presenter.h",
diff --git a/components/viz/service/display/delegated_ink_trail_data.cc b/components/viz/service/display/delegated_ink_trail_data.cc index 56661c51..a566f350 100644 --- a/components/viz/service/display/delegated_ink_trail_data.cc +++ b/components/viz/service/display/delegated_ink_trail_data.cc
@@ -50,10 +50,6 @@ void DelegatedInkTrailData::PredictPoints( std::vector<gfx::DelegatedInkPoint>* ink_points_to_draw, gfx::DelegatedInkMetadata* metadata) { - if (!features::ShouldDrawPredictedInkPoints()) { - return; - } - TRACE_EVENT0("delegated_ink_trails", "DelegatedInkTrailData::PredictPoints"); base::TimeDelta latency_improvement_with_prediction;
diff --git a/components/viz/service/display/skia_renderer.cc b/components/viz/service/display/skia_renderer.cc index e2ee649..2f69c38 100644 --- a/components/viz/service/display/skia_renderer.cc +++ b/components/viz/service/display/skia_renderer.cc
@@ -1095,17 +1095,19 @@ surface_candidate.damage_rect = use_partial_swap_ ? gfx::RectF(swap_buffer_rect_) : gfx::RectF(surface_plane.resource_size); -#if BUILDFLAG(IS_MAC) +#if BUILDFLAG(IS_OZONE) + // Ozone DRM needs the primary plane as the first overlay when overlay + // testing. + const auto insert_positon = current_frame()->overlay_list.begin(); + current_frame()->overlay_list.insert(insert_positon, surface_candidate); +#elif BUILDFLAG(IS_MAC) // Mac doesn't use the plane_z_order field and it needs to have primary // plane last in the list of overlays. - auto insert_positon = current_frame()->overlay_list.end(); + current_frame()->overlay_list.push_back(surface_candidate); #else - // Most platforms respect plane_z_order so the list order doesn't matter - // but Ozone DRM needs the primary plane as the first overlay when overlay - // testing. - auto insert_positon = current_frame()->overlay_list.begin(); + // Other platforms respect plane_z_order so the list order doesn't matter. + current_frame()->overlay_list.push_back(surface_candidate); #endif - current_frame()->overlay_list.insert(insert_positon, surface_candidate); } else { if (buffer_queue_) {
diff --git a/components/viz/service/display_embedder/output_device_backing.cc b/components/viz/service/display_embedder/output_device_backing.cc index eda65c7c..465333ad 100644 --- a/components/viz/service/display_embedder/output_device_backing.cc +++ b/components/viz/service/display_embedder/output_device_backing.cc
@@ -5,6 +5,7 @@ #include "components/viz/service/display_embedder/output_device_backing.h" #include <algorithm> +#include <utility> #include <vector> #include "base/containers/contains.h" @@ -20,6 +21,8 @@ // bitmap for it. constexpr size_t kMaxBitmapSizeBytes = 4 * (16384 * 8192); +constexpr DXGI_FORMAT kDXGISwapChainFormat = DXGI_FORMAT_B8G8R8A8_UNORM; + // Finds the size in bytes to hold |viewport_size| pixels. If |viewport_size| is // a valid size this will return true and |out_bytes| will contain the size in // bytes. If |viewport_size| is not a valid size then this will return false. @@ -44,6 +47,17 @@ } void OutputDeviceBacking::ClientResized() { + if (d3d11_staging_texture_) { + D3D11_TEXTURE2D_DESC d3d11_texture_desc; + d3d11_staging_texture_->GetDesc(&d3d11_texture_desc); + // Check if we already have a staging texture that matches the max + // viewport size. + if (GetMaxViewportSize() != + gfx::Size(d3d11_texture_desc.Width, d3d11_texture_desc.Height)) { + d3d11_staging_texture_.Reset(); + } + } + // If the max viewport size doesn't change then nothing here changes. if (GetMaxViewportBytes() == created_shm_bytes_) return; @@ -108,4 +122,89 @@ return max_bytes; } +gfx::Size OutputDeviceBacking::GetMaxViewportSize() const { + gfx::Size size; + for (OutputDeviceBacking::Client* client : clients_) { + size.SetToMax(client->GetViewportPixelSize()); + } + return size; +} + +HRESULT OutputDeviceBacking::GetOrCreateDXObjects( + Microsoft::WRL::ComPtr<ID3D11Device>* d3d11_device_out, + Microsoft::WRL::ComPtr<IDXGIFactory2>* dxgi_factory_out, + Microsoft::WRL::ComPtr<IDCompositionDevice>* dcomp_device_out) { + if (!d3d11_device_) { + DCHECK(!dxgi_factory_); + + Microsoft::WRL::ComPtr<IDXGIFactory2> dxgi_factory; + HRESULT hr = ::CreateDXGIFactory1(IID_PPV_ARGS(&dxgi_factory)); + if (FAILED(hr)) { + LOG(ERROR) << "CreateDXGIFactory1 failed: " + << logging::SystemErrorCodeToString(hr); + return hr; + } + + Microsoft::WRL::ComPtr<ID3D11Device> d3d11_device; + hr = ::D3D11CreateDevice( + NULL, D3D_DRIVER_TYPE_WARP, nullptr, D3D11_CREATE_DEVICE_SINGLETHREADED, + nullptr, 0, D3D11_SDK_VERSION, &d3d11_device, nullptr, nullptr); + if (FAILED(hr)) { + LOG(ERROR) << "D3D11CreateDevice failed: " + << logging::SystemErrorCodeToString(hr); + return hr; + } + + Microsoft::WRL::ComPtr<IDCompositionDevice> dcomp_device; + hr = ::DCompositionCreateDevice(nullptr, IID_PPV_ARGS(&dcomp_device)); + if (FAILED(hr)) { + LOG(ERROR) << "DCompositionCreateDevice failed: " + << logging::SystemErrorCodeToString(hr); + return hr; + } + + // Once all of the resources have been allocated into local variables + // copy them as a group to member variables so the object is never in a half + // baked state. + d3d11_device_ = std::move(d3d11_device); + dxgi_factory_ = std::move(dxgi_factory); + dcomp_device_ = std::move(dcomp_device); + } + + *d3d11_device_out = d3d11_device_; + *dxgi_factory_out = dxgi_factory_; + *dcomp_device_out = dcomp_device_; + return S_OK; +} + +Microsoft::WRL::ComPtr<ID3D11Texture2D> +OutputDeviceBacking::GetOrCreateStagingTexture() { + if (!d3d11_staging_texture_) { + gfx::Size texture_dimensions = GetMaxViewportSize(); + D3D11_TEXTURE2D_DESC d3d11_texture_desc = { + .Width = static_cast<UINT>(texture_dimensions.width()), + .Height = static_cast<UINT>(texture_dimensions.height()), + .MipLevels = 1, + .ArraySize = 1, + .Format = kDXGISwapChainFormat, + .SampleDesc = {.Count = 1, .Quality = 0}, + .Usage = D3D11_USAGE_STAGING, + .BindFlags = 0, + .CPUAccessFlags = D3D11_CPU_ACCESS_WRITE | D3D11_CPU_ACCESS_READ, + .MiscFlags = 0}; + Microsoft::WRL::ComPtr<ID3D11Texture2D> d3d11_staging_texture; + const HRESULT hr = d3d11_device_->CreateTexture2D( + &d3d11_texture_desc, nullptr, &d3d11_staging_texture); + if (FAILED(hr)) { + LOG(ERROR) + << "ID3D11Texture2D::CreateTexture2D (for staging texture) failed: " + << logging::SystemErrorCodeToString(hr); + return nullptr; + } + d3d11_staging_texture_ = std::move(d3d11_staging_texture); + } + + return d3d11_staging_texture_; +} + } // namespace viz
diff --git a/components/viz/service/display_embedder/output_device_backing.h b/components/viz/service/display_embedder/output_device_backing.h index d287c1b..d8763a8 100644 --- a/components/viz/service/display_embedder/output_device_backing.h +++ b/components/viz/service/display_embedder/output_device_backing.h
@@ -5,6 +5,11 @@ #ifndef COMPONENTS_VIZ_SERVICE_DISPLAY_EMBEDDER_OUTPUT_DEVICE_BACKING_H_ #define COMPONENTS_VIZ_SERVICE_DISPLAY_EMBEDDER_OUTPUT_DEVICE_BACKING_H_ +#include <d3d11.h> +#include <dcomp.h> +#include <dxgi1_3.h> +#include <wrl/client.h> + #include <memory> #include <vector> @@ -44,7 +49,7 @@ void UnregisterClient(Client* client); // Called when a client has resized. Clients should call Resize() after being - // registered when they have a valid size. Will potential invalidate + // registered when they have a valid size. Will potentially invalidate // SharedMemory and call ReleaseCanvas() on clients. void ClientResized(); @@ -58,10 +63,30 @@ // registered clients. size_t GetMaxViewportBytes(); + // Retrieve the ID3D11Device and IDCompositionDevice to use for presentation. + HRESULT GetOrCreateDXObjects( + Microsoft::WRL::ComPtr<ID3D11Device>* d3d11_device, + Microsoft::WRL::ComPtr<IDXGIFactory2>* dxgi_factory, + Microsoft::WRL::ComPtr<IDCompositionDevice>* dcomp_device); + + // Returns the D3D11 staging texture or creates one if it doesn't exist. + Microsoft::WRL::ComPtr<ID3D11Texture2D> GetOrCreateStagingTexture(); + + // Returns the size needed for the largest viewport from registered clients, + // in pixels. + gfx::Size GetMaxViewportSize() const; + private: std::vector<raw_ptr<Client, VectorExperimental>> clients_; base::UnsafeSharedMemoryRegion region_; size_t created_shm_bytes_ = 0; + + // The following are used to cache resources that are common to all + // software output device backings. + Microsoft::WRL::ComPtr<ID3D11Device> d3d11_device_; + Microsoft::WRL::ComPtr<IDXGIFactory2> dxgi_factory_; + Microsoft::WRL::ComPtr<ID3D11Texture2D> d3d11_staging_texture_; + Microsoft::WRL::ComPtr<IDCompositionDevice> dcomp_device_; }; } // namespace viz
diff --git a/components/viz/service/display_embedder/output_device_backing_unittest.cc b/components/viz/service/display_embedder/output_device_backing_unittest.cc index 09c502a..32e3fd5 100644 --- a/components/viz/service/display_embedder/output_device_backing_unittest.cc +++ b/components/viz/service/display_embedder/output_device_backing_unittest.cc
@@ -63,6 +63,7 @@ EXPECT_EQ(GetViewportSizeInBytes(client_b.viewport_size()), backing.GetMaxViewportBytes()); + EXPECT_EQ(client_b.viewport_size(), backing.GetMaxViewportSize()); } // Verify that unregistering a client works as expected.
diff --git a/components/viz/service/display_embedder/output_surface_provider_impl.cc b/components/viz/service/display_embedder/output_surface_provider_impl.cc index 98e50a61..9186701 100644 --- a/components/viz/service/display_embedder/output_surface_provider_impl.cc +++ b/components/viz/service/display_embedder/output_surface_provider_impl.cc
@@ -146,8 +146,13 @@ return std::make_unique<SoftwareOutputDevice>(); #if BUILDFLAG(IS_WIN) - return CreateSoftwareOutputDeviceWin(surface_handle, &output_device_backing_, - display_client); + HWND child_hwnd; + auto device = CreateSoftwareOutputDeviceWin( + surface_handle, &output_device_backing_, display_client, child_hwnd); + if (child_hwnd) { + display_client->AddChildWindowToBrowser(child_hwnd); + } + return device; #elif BUILDFLAG(IS_APPLE) return std::make_unique<SoftwareOutputDeviceMac>(task_runner_); #elif BUILDFLAG(IS_ANDROID)
diff --git a/components/viz/service/display_embedder/software_output_device_win.cc b/components/viz/service/display_embedder/software_output_device_win.cc index ed90f0ed..ac6fe5e 100644 --- a/components/viz/service/display_embedder/software_output_device_win.cc +++ b/components/viz/service/display_embedder/software_output_device_win.cc
@@ -11,7 +11,9 @@ #include "base/trace_event/trace_event.h" #include "base/win/windows_version.h" #include "components/viz/common/display/use_layered_window.h" +#include "components/viz/common/features.h" #include "components/viz/common/resources/resource_sizes.h" +#include "components/viz/service/display_embedder/software_output_device_win_swapchain.h" #include "mojo/public/cpp/bindings/pending_remote.h" #include "mojo/public/cpp/system/platform_handle.h" #include "services/viz/privileged/mojom/compositing/layered_window_updater.mojom.h" @@ -170,7 +172,16 @@ std::unique_ptr<SoftwareOutputDevice> CreateSoftwareOutputDeviceWin( HWND hwnd, OutputDeviceBacking* backing, - mojom::DisplayClient* display_client) { + mojom::DisplayClient* display_client, + HWND& child_hwnd) { + child_hwnd = NULL; + + if (base::FeatureList::IsEnabled( + features::kUseSwapChainForSoftwareRendering)) { + return std::make_unique<SoftwareOutputDeviceWinSwapChain>(hwnd, child_hwnd, + backing); + } + if (NeedsToUseLayerWindow(hwnd)) { DCHECK(display_client); @@ -182,9 +193,9 @@ return std::make_unique<SoftwareOutputDeviceWinProxy>( hwnd, std::move(layered_window_updater)); - } else { - return std::make_unique<SoftwareOutputDeviceWinDirect>(hwnd, backing); } + + return std::make_unique<SoftwareOutputDeviceWinDirect>(hwnd, backing); } } // namespace viz
diff --git a/components/viz/service/display_embedder/software_output_device_win.h b/components/viz/service/display_embedder/software_output_device_win.h index fe570e5..19d4d0f9 100644 --- a/components/viz/service/display_embedder/software_output_device_win.h +++ b/components/viz/service/display_embedder/software_output_device_win.h
@@ -83,7 +83,8 @@ VIZ_SERVICE_EXPORT std::unique_ptr<SoftwareOutputDevice> CreateSoftwareOutputDeviceWin(HWND hwnd, OutputDeviceBacking* backing, - mojom::DisplayClient* display_client); + mojom::DisplayClient* display_client, + HWND& child_hwnd); } // namespace viz
diff --git a/components/viz/service/display_embedder/software_output_device_win_swapchain.cc b/components/viz/service/display_embedder/software_output_device_win_swapchain.cc new file mode 100644 index 0000000..b9ede23b --- /dev/null +++ b/components/viz/service/display_embedder/software_output_device_win_swapchain.cc
@@ -0,0 +1,235 @@ +// 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 "components/viz/service/display_embedder/software_output_device_win_swapchain.h" + +#include <utility> + +#include "base/logging.h" +#include "mojo/public/cpp/system/platform_handle.h" +#include "skia/ext/platform_canvas.h" +#include "skia/ext/skia_utils_win.h" + +namespace viz { + +namespace { + +constexpr DXGI_FORMAT kDXGISwapChainFormat = DXGI_FORMAT_B8G8R8A8_UNORM; + +D3D11_BOX ToD3D11Box(const gfx::Rect& gfx_rect) { + D3D11_BOX d3d11_box = {.left = static_cast<UINT>(gfx_rect.x()), + .top = static_cast<UINT>(gfx_rect.y()), + .front = 0, + .right = static_cast<UINT>(gfx_rect.right()), + .bottom = static_cast<UINT>(gfx_rect.bottom()), + .back = 1}; + return d3d11_box; +} + +} // namespace + +SoftwareOutputDeviceWinSwapChain::SoftwareOutputDeviceWinSwapChain( + HWND hwnd, + HWND& child_hwnd, + OutputDeviceBacking* output_backing) + : SoftwareOutputDeviceWinBase(hwnd), output_backing_(output_backing) { + child_window_.Initialize(); + child_hwnd = child_window_.window(); + output_backing_->RegisterClient(this); +} + +SoftwareOutputDeviceWinSwapChain::~SoftwareOutputDeviceWinSwapChain() { + output_backing_->UnregisterClient(this); + // If DWM.exe crashes, the Chromium window will become black until the next + // commit. Therefore clear the root visual manually and proactively commit. + dcomp_root_visual_.Reset(); + dcomp_target_.Reset(); + if (dcomp_device_) { + dcomp_device_->Commit(); + } +} + +void SoftwareOutputDeviceWinSwapChain::ResizeDelegated() { + // Update window size. + if (!SetWindowPos(child_window_.window(), nullptr, 0, 0, + viewport_pixel_size_.width(), viewport_pixel_size_.height(), + SWP_NOMOVE | SWP_NOACTIVATE | SWP_NOCOPYBITS | + SWP_NOOWNERZORDER | SWP_NOZORDER)) { + return; + } + + // If the swapchain already exists, resize it instead of creating a new one. + if (dxgi_swapchain_) { + DCHECK(d3d11_device_); + DCHECK(d3d11_device_context_); + + HRESULT hr = dxgi_swapchain_->ResizeBuffers(2, viewport_pixel_size_.width(), + viewport_pixel_size_.height(), + kDXGISwapChainFormat, 0); + if (FAILED(hr)) { + LOG(ERROR) << "IDXGISwapChain::ResizeBuffers failed: " + << logging::SystemErrorCodeToString(hr); + return; + } + } else { + // Defer the creation of DirectX related objects to when they're needed + // rather than on creation of the object. This allows for a retry in the + // following resize call if a transient error prevents their initial + // creation. Furthermore it prevents the object from persisting in a + // semi-initialized state. + DCHECK(!d3d11_device_); + DCHECK(!d3d11_device_context_); + Microsoft::WRL::ComPtr<IDXGIFactory2> dxgi_factory; + Microsoft::WRL::ComPtr<ID3D11Device> d3d11_device; + Microsoft::WRL::ComPtr<IDCompositionDevice> dcomp_device; + HRESULT hr = output_backing_->GetOrCreateDXObjects( + &d3d11_device, &dxgi_factory, &dcomp_device); + if (FAILED(hr)) { + return; + } + + Microsoft::WRL::ComPtr<ID3D11DeviceContext> d3d11_device_context; + d3d11_device->GetImmediateContext(&d3d11_device_context); + + // Set up the visual tree. + Microsoft::WRL::ComPtr<IDCompositionTarget> dcomp_target; + hr = dcomp_device->CreateTargetForHwnd(child_window_.window(), TRUE, + &dcomp_target); + CHECK_EQ(hr, S_OK); + + Microsoft::WRL::ComPtr<IDCompositionVisual> dcomp_root_visual; + hr = dcomp_device->CreateVisual(&dcomp_root_visual); + CHECK_EQ(hr, S_OK); + + hr = dcomp_target->SetRoot(dcomp_root_visual.Get()); + CHECK_EQ(hr, S_OK); + + // Create swapchain. + DXGI_SWAP_CHAIN_DESC1 dxgi_swapchain_desc = { + .Width = static_cast<UINT>(viewport_pixel_size_.width()), + .Height = static_cast<UINT>(viewport_pixel_size_.height()), + .Format = kDXGISwapChainFormat, + .Stereo = FALSE, + .SampleDesc = {.Count = 1, .Quality = 0}, + .BufferUsage = 0, + .BufferCount = 2, + .Scaling = DXGI_SCALING_STRETCH, + .SwapEffect = DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL, + // TODO(crbug.com/384897625) Consider changing alpha mode based on + // whether current frame has alpha. + .AlphaMode = DXGI_ALPHA_MODE_PREMULTIPLIED, + .Flags = 0}; + Microsoft::WRL::ComPtr<IDXGISwapChain1> dxgi_swapchain; + hr = dxgi_factory->CreateSwapChainForComposition( + d3d11_device.Get(), &dxgi_swapchain_desc, nullptr, &dxgi_swapchain); + if (FAILED(hr)) { + LOG(ERROR) << "IDXGIFactory2::CreateSwapChainForComposition failed: " + << logging::SystemErrorCodeToString(hr); + return; + } + + // Set swapchain as root visual content. + hr = dcomp_root_visual->SetContent(dxgi_swapchain.Get()); + CHECK_EQ(hr, S_OK); + + hr = dcomp_device->Commit(); + if (FAILED(hr)) { + LOG(ERROR) << "IDCompositionDevice::Commit failed: " + << logging::SystemErrorCodeToString(hr); + return; + } + + // Once all of the resources have been allocated into local variables + // copy them as a group to the member variables so the object is never + // in a half baked state. + d3d11_device_ = std::move(d3d11_device); + d3d11_device_context_ = std::move(d3d11_device_context); + dxgi_swapchain_ = std::move(dxgi_swapchain); + dcomp_device_ = std::move(dcomp_device); + dcomp_target_ = std::move(dcomp_target); + dcomp_root_visual_ = std::move(dcomp_root_visual); + } + + // Notify backing of successful resizing. + output_backing_->ClientResized(); +} + +SkCanvas* SoftwareOutputDeviceWinSwapChain::BeginPaintDelegated() { + CHECK(!d3d11_staging_texture_); + d3d11_staging_texture_ = output_backing_->GetOrCreateStagingTexture(); + if (!d3d11_device_context_ || !d3d11_staging_texture_) { + return nullptr; + } + + D3D11_MAPPED_SUBRESOURCE mapped_subresource{0}; + HRESULT hr = + d3d11_device_context_->Map(d3d11_staging_texture_.Get(), 0, + D3D11_MAP_READ_WRITE, 0, &mapped_subresource); + CHECK_EQ(hr, S_OK); + + D3D11_TEXTURE2D_DESC d3d11_texture_desc; + d3d11_staging_texture_->GetDesc(&d3d11_texture_desc); + + DCHECK_LE(static_cast<unsigned int>(viewport_pixel_size_.width()), + d3d11_texture_desc.Width); + DCHECK_LE(static_cast<unsigned int>(viewport_pixel_size_.height()), + d3d11_texture_desc.Height); + + sk_canvas_ = skia::CreatePlatformCanvasWithPixels( + d3d11_texture_desc.Width, d3d11_texture_desc.Height, false, + static_cast<uint8_t*>(mapped_subresource.pData), + mapped_subresource.RowPitch, skia::CRASH_ON_FAILURE); + return sk_canvas_.get(); +} + +void SoftwareOutputDeviceWinSwapChain::EndPaintDelegated( + const gfx::Rect& damage) { + if (!sk_canvas_) { + return; + } + + sk_canvas_.reset(); + // The staging texture must be non-null if there was an `sk_canvas_`. + CHECK(d3d11_staging_texture_); + d3d11_device_context_->Unmap(d3d11_staging_texture_.Get(), 0); + + Microsoft::WRL::ComPtr<ID3D11Texture2D> d3d11_texture; + HRESULT hr = dxgi_swapchain_->GetBuffer(0, IID_PPV_ARGS(&d3d11_texture)); + CHECK_EQ(hr, S_OK); + + // Copy the newest damage rendered to the staging texture to the next rendered + // frame. + const D3D11_BOX d3d11_box = ToD3D11Box(damage); + d3d11_device_context_->CopySubresourceRegion( + d3d11_texture.Get(), 0, damage.x(), damage.y(), 0, + d3d11_staging_texture_.Get(), 0, &d3d11_box); + + RECT damage_rect_win = damage.ToRECT(); + DXGI_PRESENT_PARAMETERS present_parameters = { + .DirtyRectsCount = 1, .pDirtyRects = &damage_rect_win}; + hr = dxgi_swapchain_->Present1(0, 0, &present_parameters); + d3d11_staging_texture_.Reset(); + // DXGI_STATUS_OCCLUDED does not indicate anything wrong with the present; + // only that the window is not visible at present time. + if (FAILED(hr) && hr != DXGI_STATUS_OCCLUDED) { + LOG(ERROR) << "IDXGISwapChain1::Present failed: " + << logging::SystemErrorCodeToString(hr); + return; + } +} + +void SoftwareOutputDeviceWinSwapChain::ReleaseCanvas() { + // |sk_canvas_| is the only thing we retain that relies on the shared staging + // texture from OutputDeviceBacking. We don't expect this be called between + // BeginPaintDelegated() and EndPaintDelegated(), however, so we just check + // that the canvas isn't present. + CHECK(!sk_canvas_); +} + +const gfx::Size& SoftwareOutputDeviceWinSwapChain::GetViewportPixelSize() + const { + return viewport_pixel_size_; +} + +} // namespace viz
diff --git a/components/viz/service/display_embedder/software_output_device_win_swapchain.h b/components/viz/service/display_embedder/software_output_device_win_swapchain.h new file mode 100644 index 0000000..9f71339 --- /dev/null +++ b/components/viz/service/display_embedder/software_output_device_win_swapchain.h
@@ -0,0 +1,61 @@ +// 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 COMPONENTS_VIZ_SERVICE_DISPLAY_EMBEDDER_SOFTWARE_OUTPUT_DEVICE_WIN_SWAPCHAIN_H_ +#define COMPONENTS_VIZ_SERVICE_DISPLAY_EMBEDDER_SOFTWARE_OUTPUT_DEVICE_WIN_SWAPCHAIN_H_ + +#include <d3d11.h> +#include <dcomp.h> +#include <dxgi1_3.h> +#include <wrl/client.h> + +#include <memory> + +#include "components/viz/service/display_embedder/output_device_backing.h" +#include "components/viz/service/display_embedder/software_output_device_win_base.h" +#include "ui/gl/child_window_win.h" + +namespace viz { + +// SoftwareOutputDevice implementation in which Skia draws to a DXGI swap chain. +// Using DXGI swap chains guarantees that alpha blending happens correctly and +// consistently with the window behind. SoftwareOutputDeviceWinSwapChain creates +// a trivial dcomp tree that only contains a swap chain. I.e. it is not intended +// to support video overlays or any other feature provided by +// `SkiaOutputDeviceDComp`. +class VIZ_SERVICE_EXPORT SoftwareOutputDeviceWinSwapChain + : public SoftwareOutputDeviceWinBase, + public OutputDeviceBacking::Client { + public: + SoftwareOutputDeviceWinSwapChain(HWND hwnd, + HWND& child_hwnd, + OutputDeviceBacking* backing); + ~SoftwareOutputDeviceWinSwapChain() override; + + // SoftwareOutputDeviceWinBase implementation. + void ResizeDelegated() override; + SkCanvas* BeginPaintDelegated() override; + void EndPaintDelegated(const gfx::Rect& rect) override; + + // OutputDeviceBacking::Client implementation. + const gfx::Size& GetViewportPixelSize() const override; + void ReleaseCanvas() override; + + private: + raw_ptr<OutputDeviceBacking> const output_backing_; + gl::ChildWindowWin child_window_; + Microsoft::WRL::ComPtr<ID3D11Device> d3d11_device_; + Microsoft::WRL::ComPtr<ID3D11DeviceContext> d3d11_device_context_; + Microsoft::WRL::ComPtr<IDXGISwapChain1> dxgi_swapchain_; + Microsoft::WRL::ComPtr<IDCompositionDevice> dcomp_device_; + Microsoft::WRL::ComPtr<IDCompositionTarget> dcomp_target_; + Microsoft::WRL::ComPtr<IDCompositionVisual> dcomp_root_visual_; + Microsoft::WRL::ComPtr<ID3D11Texture2D> d3d11_staging_texture_; + + std::unique_ptr<SkCanvas> sk_canvas_; +}; + +} // namespace viz + +#endif // COMPONENTS_VIZ_SERVICE_DISPLAY_EMBEDDER_SOFTWARE_OUTPUT_DEVICE_WIN_SWAPCHAIN_H_
diff --git a/components/webauthn/json/value_conversions_unittest.cc b/components/webauthn/json/value_conversions_unittest.cc index f22a6a3e..6ee82d1 100644 --- a/components/webauthn/json/value_conversions_unittest.cc +++ b/components/webauthn/json/value_conversions_unittest.cc
@@ -198,7 +198,8 @@ /*device_scope_requested=*/true, /*provider_scope_requested=*/true, device::AttestationConveyancePreference::kDirect, - std::vector<std::string>({"a", "b", "c"})))); + std::vector<std::string>({"a", "b", "c"})), + std::vector<device::PublicKeyCredentialParams::CredentialInfo>())); base::Value value = ToValue(options); std::string json;
diff --git a/content/browser/accessibility/accessibility_win_browsertest.cc b/content/browser/accessibility/accessibility_win_browsertest.cc index e79a102..50bf60b 100644 --- a/content/browser/accessibility/accessibility_win_browsertest.cc +++ b/content/browser/accessibility/accessibility_win_browsertest.cc
@@ -3770,10 +3770,206 @@ received_selections.Receive(), received_selections.ReceiveSize())); ASSERT_EQ(1, received_selections.size()); - EXPECT_EQ(received_selections[0].startOffset, 0); + EXPECT_EQ(received_selections[0].startOffset, 3); + EXPECT_EQ(abc_text.Get(), received_selections[0].startObj); + ASSERT_EQ(received_selections[0].endOffset, 3); + EXPECT_EQ(def_text.Get(), received_selections[0].endObj); + ASSERT_EQ(received_selections[0].startIsActive, false); +} + +IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest, + TestIAccessibleTextSelectionContainerSelectToEndOfText) { + LoadInitialAccessibilityTreeFromHtml(R"HTML(<!DOCTYPE html> + <p>abc<a href="#">def</a>ghi<a href="#"></a>mno</p> + )HTML"); + + Microsoft::WRL::ComPtr<IAccessible> document(GetRendererAccessible()); + std::vector<base::win::ScopedVariant> document_children = + GetAllAccessibleChildren(document.Get()); + ASSERT_EQ(1u, document_children.size()); + + // Check that first child of document is an editable text object + Microsoft::WRL::ComPtr<IAccessible2> paragraph; + ASSERT_HRESULT_SUCCEEDED(QueryIAccessible2( + GetAccessibleFromVariant(document.Get(), document_children[0].AsInput()) + .Get(), + ¶graph)); + LONG paragraph_role = 0; + ASSERT_HRESULT_SUCCEEDED(paragraph->role(¶graph_role)); + ASSERT_EQ(IA2_ROLE_PARAGRAPH, paragraph_role); + + Microsoft::WRL::ComPtr<IAccessibleText> paragraph_text; + ASSERT_HRESULT_SUCCEEDED(paragraph.As(¶graph_text)); + LONG n_characters; + ASSERT_HRESULT_SUCCEEDED(paragraph_text->get_nCharacters(&n_characters)); + ASSERT_EQ(11, n_characters); + + std::vector<base::win::ScopedVariant> paragraph_children = + GetAllAccessibleChildren(paragraph.Get()); + ASSERT_EQ(5u, paragraph_children.size()); + + // Get the first link. + Microsoft::WRL::ComPtr<IAccessible2> first_link; + ASSERT_HRESULT_SUCCEEDED(QueryIAccessible2( + GetAccessibleFromVariant(paragraph.Get(), paragraph_children[1].AsInput()) + .Get(), + &first_link)); + LONG first_link_role = 0; + ASSERT_HRESULT_SUCCEEDED(first_link->role(&first_link_role)); + ASSERT_EQ(ROLE_SYSTEM_LINK, first_link_role) + << "Wrong role, was: " << IAccessible2RoleToString(first_link_role); + + Microsoft::WRL::ComPtr<IAccessibleText> first_link_text; + ASSERT_HRESULT_SUCCEEDED(first_link.As(&first_link_text)); + ASSERT_HRESULT_SUCCEEDED(first_link_text->get_nCharacters(&n_characters)); + ASSERT_EQ(3, n_characters); + + // Get the first link's text, "def". + std::vector<base::win::ScopedVariant> first_link_children = + GetAllAccessibleChildren(first_link.Get()); + ASSERT_EQ(1u, first_link_children.size()); + + Microsoft::WRL::ComPtr<IAccessible2> def; + ASSERT_HRESULT_SUCCEEDED( + QueryIAccessible2(GetAccessibleFromVariant( + first_link.Get(), first_link_children[0].AsInput()) + .Get(), + &def)); + LONG def_role = 0; + ASSERT_HRESULT_SUCCEEDED(def->role(&def_role)); + ASSERT_EQ(ROLE_SYSTEM_STATICTEXT, def_role) + << "Wrong role, was: " << IAccessible2RoleToString(def_role); + + Microsoft::WRL::ComPtr<IAccessibleText> def_text; + ASSERT_HRESULT_SUCCEEDED(def.As(&def_text)); + ASSERT_HRESULT_SUCCEEDED(def_text->get_nCharacters(&n_characters)); + ASSERT_EQ(3, n_characters); + + // Test setting the selection to "def". + std::vector<IA2TextSelection> requested_selections; + IA2TextSelection requested_selection_range = { + first_link_text.Get(), 0, first_link_text.Get(), 3, false}; + requested_selections.push_back(requested_selection_range); + + Microsoft::WRL::ComPtr<IAccessibleTextSelectionContainer> selection_container; + ASSERT_HRESULT_SUCCEEDED(document.As(&selection_container)); + + AccessibilityNotificationWaiter waiter( + shell()->web_contents(), ui::kAXModeComplete, + ax::mojom::Event::kDocumentSelectionChanged); + ASSERT_HRESULT_SUCCEEDED( + selection_container->setSelections(1, &requested_selections[0])); + ASSERT_TRUE(waiter.WaitForNotification()); + + ui::ScopedCoMemArray<IA2TextSelection> received_selections; + ASSERT_HRESULT_SUCCEEDED(selection_container->get_selections( + received_selections.Receive(), received_selections.ReceiveSize())); + ASSERT_EQ(1, received_selections.size()); + + // TODO(accessibility) Don't expose IAccessibleText on text leaf nodes, which + // means that the startObj/endObj will become first_link_text (the parent link + // of the def_text text node). EXPECT_EQ(def_text.Get(), received_selections[0].startObj); - ASSERT_EQ(received_selections[0].endOffset, 0); - EXPECT_EQ(ghi_text.Get(), received_selections[0].endObj); + EXPECT_EQ(received_selections[0].startOffset, 0); + EXPECT_EQ(def_text.Get(), received_selections[0].endObj); + ASSERT_EQ(received_selections[0].endOffset, 3); + ASSERT_EQ(received_selections[0].startIsActive, false); +} + +IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest, + TestIAccessibleTextSelectionContainerSelectInEmptyText) { + LoadInitialAccessibilityTreeFromHtml(R"HTML(<!DOCTYPE html> + <p>abc<a href="#"></a>def + )HTML"); + + Microsoft::WRL::ComPtr<IAccessible> document(GetRendererAccessible()); + std::vector<base::win::ScopedVariant> document_children = + GetAllAccessibleChildren(document.Get()); + ASSERT_EQ(1u, document_children.size()); + + // Check that first child of document is an editable text object + Microsoft::WRL::ComPtr<IAccessible2> paragraph; + ASSERT_HRESULT_SUCCEEDED(QueryIAccessible2( + GetAccessibleFromVariant(document.Get(), document_children[0].AsInput()) + .Get(), + ¶graph)); + LONG paragraph_role = 0; + ASSERT_HRESULT_SUCCEEDED(paragraph->role(¶graph_role)); + ASSERT_EQ(IA2_ROLE_PARAGRAPH, paragraph_role); + + Microsoft::WRL::ComPtr<IAccessibleText> paragraph_text; + ASSERT_HRESULT_SUCCEEDED(paragraph.As(¶graph_text)); + LONG n_characters; + ASSERT_HRESULT_SUCCEEDED(paragraph_text->get_nCharacters(&n_characters)); + ASSERT_EQ(7, n_characters); + + std::vector<base::win::ScopedVariant> paragraph_children = + GetAllAccessibleChildren(paragraph.Get()); + ASSERT_EQ(3u, paragraph_children.size()); + + // Get the link. + Microsoft::WRL::ComPtr<IAccessible2> link; + ASSERT_HRESULT_SUCCEEDED(QueryIAccessible2( + GetAccessibleFromVariant(paragraph.Get(), paragraph_children[1].AsInput()) + .Get(), + &link)); + LONG link_role = 0; + ASSERT_HRESULT_SUCCEEDED(link->role(&link_role)); + ASSERT_EQ(ROLE_SYSTEM_LINK, link_role) + << "Wrong role, was: " << IAccessible2RoleToString(link_role); + + Microsoft::WRL::ComPtr<IAccessibleText> link_text; + ASSERT_HRESULT_SUCCEEDED(link.As(&link_text)); + ASSERT_HRESULT_SUCCEEDED(link_text->get_nCharacters(&n_characters)); + ASSERT_EQ(0, n_characters); + + // Get the first link's text, "". + std::vector<base::win::ScopedVariant> link_children = + GetAllAccessibleChildren(link.Get()); + ASSERT_EQ(0u, link_children.size()); + + // Get the last text node, "def". + Microsoft::WRL::ComPtr<IAccessible2> def; + ASSERT_HRESULT_SUCCEEDED(QueryIAccessible2( + GetAccessibleFromVariant(paragraph.Get(), paragraph_children[2].AsInput()) + .Get(), + &def)); + LONG def_role = 0; + ASSERT_HRESULT_SUCCEEDED(def->role(&def_role)); + ASSERT_EQ(ROLE_SYSTEM_STATICTEXT, def_role) + << "Wrong role, was: " << IAccessible2RoleToString(def_role); + + Microsoft::WRL::ComPtr<IAccessibleText> def_text; + ASSERT_HRESULT_SUCCEEDED(def.As(&def_text)); + ASSERT_HRESULT_SUCCEEDED(def_text->get_nCharacters(&n_characters)); + ASSERT_EQ(3, n_characters); + + // Test setting the selection starting from offset 0 on the empty link's + // hypertext to the end of the paragraph. + std::vector<IA2TextSelection> requested_selections; + IA2TextSelection requested_selection_range = {link_text.Get(), 0, + paragraph_text.Get(), 7, false}; + requested_selections.push_back(requested_selection_range); + + Microsoft::WRL::ComPtr<IAccessibleTextSelectionContainer> selection_container; + ASSERT_HRESULT_SUCCEEDED(document.As(&selection_container)); + + AccessibilityNotificationWaiter waiter( + shell()->web_contents(), ui::kAXModeComplete, + ax::mojom::Event::kDocumentSelectionChanged); + ASSERT_HRESULT_SUCCEEDED( + selection_container->setSelections(1, &requested_selections[0])); + ASSERT_TRUE(waiter.WaitForNotification()); + + ui::ScopedCoMemArray<IA2TextSelection> received_selections; + ASSERT_HRESULT_SUCCEEDED(selection_container->get_selections( + received_selections.Receive(), received_selections.ReceiveSize())); + ASSERT_EQ(1, received_selections.size()); + + EXPECT_EQ(link_text.Get(), received_selections[0].startObj); + EXPECT_EQ(received_selections[0].startOffset, 0); + EXPECT_EQ(def_text.Get(), received_selections[0].endObj); + ASSERT_EQ(received_selections[0].endOffset, 3); ASSERT_EQ(received_selections[0].startIsActive, false); }
diff --git a/content/browser/aggregation_service/aggregation_service_storage_sql_unittest.cc b/content/browser/aggregation_service/aggregation_service_storage_sql_unittest.cc index f28caba..7efe17d 100644 --- a/content/browser/aggregation_service/aggregation_service_storage_sql_unittest.cc +++ b/content/browser/aggregation_service/aggregation_service_storage_sql_unittest.cc
@@ -1136,7 +1136,7 @@ // second time when it detects that it was poisoned during the first attempt. histograms_.ExpectUniqueSample( "PrivacySandbox.AggregationService.Storage.Sql.Error", - base::checked_cast<base::HistogramBase::Sample>( + base::checked_cast<base::HistogramBase::Sample32>( sql::SqliteLoggedResultCode::kCorrupt), /*expected_bucket_count=*/2);
diff --git a/content/browser/android/battery_metrics.cc b/content/browser/android/battery_metrics.cc index e437312..4ce4b06 100644 --- a/content/browser/android/battery_metrics.cc +++ b/content/browser/android/battery_metrics.cc
@@ -290,7 +290,7 @@ // Also track the total capacity consumed in a single-bucket-histogram, // emitting one sample for every 100 uAh drained. - static constexpr base::Histogram::Sample kSampleFactor = 100; + static constexpr base::Histogram::Sample32 kSampleFactor = 100; UMA_HISTOGRAM_SCALED_EXACT_LINEAR("Power.ForegroundBatteryDrain", /*sample=*/1, capacity_consumed, /*sample_max=*/1, kSampleFactor);
diff --git a/content/browser/attribution_reporting/attribution_report_network_sender_unittest.cc b/content/browser/attribution_reporting/attribution_report_network_sender_unittest.cc index 0537628..9143570 100644 --- a/content/browser/attribution_reporting/attribution_report_network_sender_unittest.cc +++ b/content/browser/attribution_reporting/attribution_report_network_sender_unittest.cc
@@ -676,7 +676,7 @@ const auto verify_histogram = [](base::HistogramTester& histograms, std::string_view suffix, bool has_trigger_context_id, - base::HistogramBase::Sample sample, + base::HistogramBase::Sample32 sample, base::HistogramBase::Count count) { histograms.ExpectUniqueSample(base::StrCat({"Conversions.", suffix}), sample, count); @@ -1075,7 +1075,7 @@ const auto verify_histogram = [](base::HistogramTester& histograms, std::string_view suffix, bool has_trigger_context_id, - base::HistogramBase::Sample sample, + base::HistogramBase::Sample32 sample, base::HistogramBase::Count count) { histograms.ExpectUniqueSample(base::StrCat({"Conversions.", suffix}), sample, count);
diff --git a/content/browser/back_forward_cache_browsertest.cc b/content/browser/back_forward_cache_browsertest.cc index f1d1b46..b724732 100644 --- a/content/browser/back_forward_cache_browsertest.cc +++ b/content/browser/back_forward_cache_browsertest.cc
@@ -183,10 +183,10 @@ // As above but `LocalMainFrameHost::DidFirstVisuallyNonEmptyPaint()`. std::erase_if(samples, [](base::Bucket bucket) { return bucket.min == - static_cast<base::HistogramBase::Sample>(base::HashMetricName( + static_cast<base::HistogramBase::Sample32>(base::HashMetricName( blink::mojom::LocalFrameHost::Name_)) || bucket.min == - static_cast<base::HistogramBase::Sample>(base::HashMetricName( + static_cast<base::HistogramBase::Sample32>(base::HashMetricName( blink::mojom::LocalMainFrameHost::Name_)); }); @@ -319,7 +319,7 @@ } bool BackForwardCacheBrowserTest::HistogramContainsIntValue( - base::HistogramBase::Sample sample, + base::HistogramBase::Sample32 sample, std::vector<base::Bucket> histogram_values) { return base::Contains(histogram_values, static_cast<int>(sample), &base::Bucket::min);
diff --git a/content/browser/back_forward_cache_browsertest.h b/content/browser/back_forward_cache_browsertest.h index 0e5e6e7..bbb33e11 100644 --- a/content/browser/back_forward_cache_browsertest.h +++ b/content/browser/back_forward_cache_browsertest.h
@@ -105,7 +105,7 @@ std::string DepictFrameTree(FrameTreeNode* node); - bool HistogramContainsIntValue(base::HistogramBase::Sample sample, + bool HistogramContainsIntValue(base::HistogramBase::Sample32 sample, std::vector<base::Bucket> histogram_values); void EvictByJavaScript(RenderFrameHostImpl* rfh);
diff --git a/content/browser/back_forward_cache_features_browsertest.cc b/content/browser/back_forward_cache_features_browsertest.cc index 068f5668..22547af1 100644 --- a/content/browser/back_forward_cache_features_browsertest.cc +++ b/content/browser/back_forward_cache_features_browsertest.cc
@@ -1636,7 +1636,7 @@ // requests (kOutstandingNetworkRequestOthers). This causes flakiness if we // check against all blocklisted features. As a result, we only check for the // blocklist we care about. - base::HistogramBase::Sample sample = base::HistogramBase::Sample( + base::HistogramBase::Sample32 sample = base::HistogramBase::Sample32( blink::scheduler::WebSchedulerTrackedFeature::kPaymentManager); std::vector<base::Bucket> blocklist_values = histogram_tester().GetAllSamples( "BackForwardCache.HistoryNavigationOutcome."
diff --git a/content/browser/back_forward_cache_internal_browsertest.cc b/content/browser/back_forward_cache_internal_browsertest.cc index cc659804..2b56c638 100644 --- a/content/browser/back_forward_cache_internal_browsertest.cc +++ b/content/browser/back_forward_cache_internal_browsertest.cc
@@ -553,7 +553,7 @@ run_loop.Run(); // 4) Check the histogram. - base::HistogramBase::Sample sample = base::HistogramBase::Sample( + base::HistogramBase::Sample32 sample = base::HistogramBase::Sample32( base::TaskAnnotator::ScopedSetIpcHash::MD5HashMetricName( "blink.mojom.LocalFrame"));
diff --git a/content/browser/back_forward_cache_test_util.cc b/content/browser/back_forward_cache_test_util.cc index f36b0996..cd14955a9 100644 --- a/content/browser/back_forward_cache_test_util.cc +++ b/content/browser/back_forward_cache_test_util.cc
@@ -19,7 +19,7 @@ using ::testing::UnorderedElementsAreArray; void AddSampleToBuckets(std::vector<base::Bucket>* buckets, - base::HistogramBase::Sample sample) { + base::HistogramBase::Sample32 sample) { auto it = base::ranges::find(*buckets, sample, &base::Bucket::min); if (it == buckets->end()) { buckets->push_back(base::Bucket(sample, 1)); @@ -52,8 +52,9 @@ << location.ToString(); } - if (!check_all_sites_) + if (!check_all_sites_) { return; + } EXPECT_EQ(expected_outcomes_, histogram_tester().GetAllSamples( @@ -99,8 +100,9 @@ std::string not_restored_reasons = "BackForwardCache.NotRestoredReasons"; - if (!check_all_sites_) + if (!check_all_sites_) { return; + } EXPECT_EQ(expected_not_restored_, histogram_tester().GetAllSamples( @@ -132,7 +134,8 @@ base::Location location) { for (BackForwardCacheMetrics::EvictedAfterDocumentRestoredReason reason : reasons) { - base::HistogramBase::Sample sample = base::HistogramBase::Sample(reason); + base::HistogramBase::Sample32 sample = + base::HistogramBase::Sample32(reason); AddSampleToBuckets(&expected_eviction_after_committing_, sample); } @@ -140,8 +143,9 @@ "BackForwardCache.EvictedAfterDocumentRestoredReason"), UnorderedElementsAreArray(expected_eviction_after_committing_)) << location.ToString(); - if (!check_all_sites_) + if (!check_all_sites_) { return; + } EXPECT_THAT( histogram_tester().GetAllSamples( @@ -154,7 +158,7 @@ BackForwardCacheMetrics::HistoryNavigationOutcome outcome, std::vector<BackForwardCacheMetrics::NotRestoredReason> not_restored, base::Location location) { - base::HistogramBase::Sample sample = base::HistogramBase::Sample(outcome); + base::HistogramBase::Sample32 sample = base::HistogramBase::Sample32(outcome); AddSampleToBuckets(&expected_outcomes_, sample); auto delegate_disabled_idx = @@ -171,8 +175,9 @@ << location.ToString(); } - if (!check_all_sites_) + if (!check_all_sites_) { return; + } EXPECT_THAT(histogram_tester().GetAllSamples( "BackForwardCache.AllSites.HistoryNavigationOutcome"), @@ -228,7 +233,8 @@ base::Location location) { uint64_t not_restored_reasons_bits = 0; for (BackForwardCacheMetrics::NotRestoredReason reason : reasons) { - base::HistogramBase::Sample sample = base::HistogramBase::Sample(reason); + base::HistogramBase::Sample32 sample = + base::HistogramBase::Sample32(reason); AddSampleToBuckets(&expected_not_restored_, sample); not_restored_reasons_bits |= 1ull << static_cast<int>(reason); } @@ -247,8 +253,9 @@ << location.ToString(); } - if (!check_all_sites_) + if (!check_all_sites_) { return; + } EXPECT_THAT(histogram_tester().GetAllSamples( "BackForwardCache.AllSites.HistoryNavigationOutcome." @@ -269,7 +276,8 @@ std::vector<blink::scheduler::WebSchedulerTrackedFeature> features, base::Location location) { for (auto feature : features) { - base::HistogramBase::Sample sample = base::HistogramBase::Sample(feature); + base::HistogramBase::Sample32 sample = + base::HistogramBase::Sample32(feature); AddSampleToBuckets(&expected_blocklisted_features_, sample); } @@ -279,8 +287,9 @@ UnorderedElementsAreArray(expected_blocklisted_features_)) << location.ToString(); - if (!check_all_sites_) + if (!check_all_sites_) { return; + } EXPECT_THAT(histogram_tester().GetAllSamples( "BackForwardCache.AllSites.HistoryNavigationOutcome." @@ -293,7 +302,7 @@ const std::vector<BackForwardCache::DisabledReason>& reasons, base::Location location) { for (BackForwardCache::DisabledReason reason : reasons) { - base::HistogramBase::Sample sample = base::HistogramBase::Sample( + base::HistogramBase::Sample32 sample = base::HistogramBase::Sample32( content::BackForwardCacheMetrics::MetricValue(reason)); AddSampleToBuckets(&expected_disabled_reasons_, sample); } @@ -308,7 +317,7 @@ const std::vector<uint64_t>& reasons, base::Location location) { for (const uint64_t& reason : reasons) { - base::HistogramBase::Sample sample(reason); + base::HistogramBase::Sample32 sample(reason); AddSampleToBuckets(&expected_disallow_activation_reasons_, sample); } EXPECT_THAT(histogram_tester().GetAllSamples( @@ -323,7 +332,8 @@ const std::vector<ShouldSwapBrowsingInstance>& reasons, base::Location location) { for (auto reason : reasons) { - base::HistogramBase::Sample sample = base::HistogramBase::Sample(reason); + base::HistogramBase::Sample32 sample = + base::HistogramBase::Sample32(reason); AddSampleToBuckets(&expected_browsing_instance_not_swapped_reasons_, sample); } @@ -333,8 +343,9 @@ UnorderedElementsAreArray( expected_browsing_instance_not_swapped_reasons_)) << location.ToString(); - if (!check_all_sites_) + if (!check_all_sites_) { return; + } EXPECT_THAT(histogram_tester().GetAllSamples( "BackForwardCache.AllSites.HistoryNavigationOutcome."
diff --git a/content/browser/cookie_deprecation_label/cookie_deprecation_label_browsertest.cc b/content/browser/cookie_deprecation_label/cookie_deprecation_label_browsertest.cc index 8b4bafb..e72d8dc 100644 --- a/content/browser/cookie_deprecation_label/cookie_deprecation_label_browsertest.cc +++ b/content/browser/cookie_deprecation_label/cookie_deprecation_label_browsertest.cc
@@ -160,8 +160,8 @@ IN_PROC_BROWSER_TEST_F(CookieDeprecationLabelEnabledBrowserTest, HeaderAddedOnceOptedIn) { base::HistogramTester histograms; - constexpr base::HistogramBase::Sample kNoCookie = 2; - constexpr base::HistogramBase::Sample kHeaderSet = 0; + constexpr base::HistogramBase::Sample32 kNoCookie = 2; + constexpr base::HistogramBase::Sample32 kHeaderSet = 0; auto https_server = CreateTestServer(EmbeddedTestServer::TYPE_HTTPS); auto response_a_a =
diff --git a/content/browser/devtools/protocol/browser_handler.cc b/content/browser/devtools/protocol/browser_handler.cc index 98fa8fd9..ab89a18 100644 --- a/content/browser/devtools/protocol/browser_handler.cc +++ b/content/browser/devtools/protocol/browser_handler.cc
@@ -666,7 +666,7 @@ for (const std::unique_ptr<base::SampleCountIterator> it = data->Iterator(); !it->Done(); it->Next()) { base::HistogramBase::Count count; - base::HistogramBase::Sample low; + base::HistogramBase::Sample32 low; int64_t high; it->Get(&low, &high, &count); out_buckets->emplace_back(Browser::Bucket::Create()
diff --git a/content/browser/dips/DEPS b/content/browser/dips/DEPS index 7f55837..a3b7fd6 100644 --- a/content/browser/dips/DEPS +++ b/content/browser/dips/DEPS
@@ -2,4 +2,7 @@ "dips_bounce_detector_browsertest\.cc": [ "+device/fido", ], + "dips_navigation_flow_detector_browsertest\.cc": [ + "+device/fido", + ], }
diff --git a/content/browser/dips/dips_bounce_detector_unittest.cc b/content/browser/dips/dips_bounce_detector_unittest.cc index 24cec327..9f0115a 100644 --- a/content/browser/dips/dips_bounce_detector_unittest.cc +++ b/content/browser/dips/dips_bounce_detector_unittest.cc
@@ -943,7 +943,7 @@ // Verify the time-to-bounce metric was recorded for the client bounce. histograms.ExpectBucketCount( "Privacy.DIPS.TimeFromNavigationCommitToClientBounce", - static_cast<base::HistogramBase::Sample>( + static_cast<base::HistogramBase::Sample32>( base::Seconds(3).InMilliseconds()), /*expected_count=*/1); }
diff --git a/content/browser/dips/dips_navigation_flow_detector.cc b/content/browser/dips/dips_navigation_flow_detector.cc index 5815aa94..e6ea278 100644 --- a/content/browser/dips/dips_navigation_flow_detector.cc +++ b/content/browser/dips/dips_navigation_flow_detector.cc
@@ -178,11 +178,16 @@ client_redirector_info.WasNavigationToPageClientRedirect()) {} InFlowSuccessorInteractionState::InFlowSuccessorInteractionState( - dips::EntrypointInfo&& flow_entrypoint) + dips::EntrypointInfo flow_entrypoint) : flow_entrypoint_(flow_entrypoint) {} InFlowSuccessorInteractionState::~InFlowSuccessorInteractionState() = default; +void InFlowSuccessorInteractionState:: + RecordTriggeringStorageAccessByEntrypoint() { + flow_entrypoint_.had_triggering_storage_access = true; +} + void InFlowSuccessorInteractionState::IncrementFlowIndex(size_t increment) { flow_index_ += increment; } @@ -440,15 +445,14 @@ return; } - const dips::EntrypointInfo& flow_entrypoint = - successor_interaction_tracking_state_->flow_entrypoint(); for (size_t index : successor_interaction_tracking_state_->successor_interaction_indices()) { ukm::builders::DIPS_TrustIndicator_InFlowSuccessorInteraction( - flow_entrypoint.source_id) + successor_interaction_tracking_state_->flow_entrypoint().source_id) .SetSuccessorRedirectIndex(index) .SetDidEntrypointAccessStorage( - flow_entrypoint.had_triggering_storage_access) + successor_interaction_tracking_state_->flow_entrypoint() + .had_triggering_storage_access) .Record(ukm::UkmRecorder::Get()); } } @@ -566,6 +570,11 @@ } current_page_visit_info_->did_page_access_cookies = true; + if (flow_status_ == dips::kFlowOngoing && + !successor_interaction_tracking_state_->IsAtSuccessor()) { + successor_interaction_tracking_state_ + ->RecordTriggeringStorageAccessByEntrypoint(); + } } void DipsNavigationFlowDetector::OnCookiesAccessed( @@ -593,6 +602,11 @@ } current_page_visit_info_->did_page_access_cookies = true; + if (flow_status_ == dips::kFlowOngoing && + !successor_interaction_tracking_state_->IsAtSuccessor()) { + successor_interaction_tracking_state_ + ->RecordTriggeringStorageAccessByEntrypoint(); + } return; } @@ -605,6 +619,11 @@ if (details.url == current_page_visit_info_->url) { current_page_visit_info_->did_page_access_cookies = true; + if (flow_status_ == dips::kFlowOngoing && + !successor_interaction_tracking_state_->IsAtSuccessor()) { + successor_interaction_tracking_state_ + ->RecordTriggeringStorageAccessByEntrypoint(); + } } else { // This notification might be for an in-progress navigation, so we should // remember this notification until the next navigation finishes. @@ -620,6 +639,11 @@ return; } current_page_visit_info_->did_page_access_storage = true; + if (flow_status_ == dips::kFlowOngoing && + !successor_interaction_tracking_state_->IsAtSuccessor()) { + successor_interaction_tracking_state_ + ->RecordTriggeringStorageAccessByEntrypoint(); + } } void DipsNavigationFlowDetector::FrameReceivedUserActivation(
diff --git a/content/browser/dips/dips_navigation_flow_detector.h b/content/browser/dips/dips_navigation_flow_detector.h index 4084e767..e4e4e7a 100644 --- a/content/browser/dips/dips_navigation_flow_detector.h +++ b/content/browser/dips/dips_navigation_flow_detector.h
@@ -16,6 +16,7 @@ #include "base/time/default_clock.h" #include "base/time/time.h" #include "content/browser/dips/dips_bounce_detector.h" +#include "content/common/content_export.h" #include "content/public/browser/web_contents_observer.h" #include "content/public/browser/web_contents_user_data.h" #include "services/metrics/public/cpp/ukm_source_id.h" @@ -78,9 +79,10 @@ class InFlowSuccessorInteractionState { public: explicit InFlowSuccessorInteractionState( - dips::EntrypointInfo&& flow_entrypoint); + dips::EntrypointInfo flow_entrypoint); ~InFlowSuccessorInteractionState(); + void RecordTriggeringStorageAccessByEntrypoint(); void IncrementFlowIndex(size_t increment); void RecordSuccessorInteractionAtCurrentFlowIndex(); bool IsAtSuccessor() const; @@ -105,7 +107,7 @@ // distinguish user-interest navigation flows from navigational tracking. // Currently only reports UKM to inform how we might identify possible // navigational tracking by sites that also perform user-interest activity. -class DipsNavigationFlowDetector +class CONTENT_EXPORT DipsNavigationFlowDetector : public RedirectChainDetector::Observer, public content::WebContentsObserver, public content::WebContentsUserData<DipsNavigationFlowDetector> {
diff --git a/content/browser/dips/dips_navigation_flow_detector_browsertest.cc b/content/browser/dips/dips_navigation_flow_detector_browsertest.cc index 885ac43..99e1561 100644 --- a/content/browser/dips/dips_navigation_flow_detector_browsertest.cc +++ b/content/browser/dips/dips_navigation_flow_detector_browsertest.cc
@@ -12,14 +12,20 @@ #include "base/test/test_future.h" #include "base/test/test_timeouts.h" #include "base/types/expected.h" +#include "components/ukm/content/source_url_recorder.h" #include "components/ukm/test_ukm_recorder.h" +#include "content/browser/dips/dips_browsertest_utils.h" #include "content/browser/dips/dips_test_utils.h" #include "content/public/browser/attribution_data_model.h" +#include "content/public/browser/browser_context.h" #include "content/public/browser/network_service_instance.h" +#include "content/public/common/content_features.h" #include "content/public/test/browser_test.h" #include "content/public/test/browser_test_utils.h" +#include "content/public/test/content_browser_test.h" #include "content/public/test/hit_test_region_observer.h" #include "content/public/test/prerender_test_util.h" +#include "content/shell/browser/shell.h" #include "net/dns/mock_host_resolver.h" #include "net/test/embedded_test_server/embedded_test_server.h" #include "services/metrics/public/cpp/metrics_utils.h" @@ -30,6 +36,15 @@ #include "testing/gtest/include/gtest/gtest.h" #include "third_party/blink/public/common/switches.h" +#if !BUILDFLAG(IS_ANDROID) +#include "components/network_session_configurator/common/network_switches.h" +#include "content/public/browser/scoped_authenticator_environment_for_testing.h" +#include "content/public/common/content_switches.h" +#include "content/public/test/content_mock_cert_verifier.h" +#include "device/fido/virtual_ctap2_device.h" +#include "device/fido/virtual_fido_device_factory.h" +#endif + namespace { using AttributionData = std::set<content::AttributionDataModel::DataKey>; @@ -109,19 +124,16 @@ std::string_view kSiteD = "d.test"; } // namespace -class DipsNavigationFlowDetectorTest : public PlatformBrowserTest { +class DipsNavigationFlowDetectorTest : public content::ContentBrowserTest { public: DipsNavigationFlowDetectorTest() - : embedded_https_test_server_(net::EmbeddedTestServer::TYPE_HTTPS) { - std::vector<base::test::FeatureRef> enabled_features; - std::vector<base::test::FeatureRef> disabled_features; - enabled_features.emplace_back(features::kPrivacySandboxAdsAPIsOverride); - scoped_feature_list_.InitWithFeatures(enabled_features, disabled_features); - } + : embedded_https_test_server_(net::EmbeddedTestServer::TYPE_HTTPS) {} ~DipsNavigationFlowDetectorTest() override = default; void SetUpOnMainThread() override { + ContentBrowserTest::SetUpOnMainThread(); + host_resolver()->AddRule("*", "127.0.0.1"); embedded_https_test_server_.AddDefaultHandlers( base::FilePath(FILE_PATH_LITERAL("content/test/data"))); @@ -139,8 +151,13 @@ command_line->AppendSwitch(blink::switches::kAllowPreCommitInput); } + void PreRunTestOnMainThread() override { + content::ContentBrowserTest::PreRunTestOnMainThread(); + ukm::InitializeSourceUrlRecorderForWebContents(GetActiveWebContents()); + } + content::WebContents* GetActiveWebContents() { - return chrome_test_utils::GetActiveWebContents(this); + return shell()->web_contents(); } protected: @@ -225,7 +242,6 @@ } private: - base::test::ScopedFeatureList scoped_feature_list_; std::optional<ukm::TestAutoSetUkmRecorder> ukm_recorder_; void SetTestClock() { GetDetector()->SetClockForTesting(&test_clock_); } @@ -267,11 +283,16 @@ class DipsNavigationFlowDetectorPATApiTest : public DipsNavigationFlowDetectorTest { public: - void SetUpOnMainThread() override { + DipsNavigationFlowDetectorPATApiTest() { // Enable Privacy Sandbox APIs on all sites. - privacy_sandbox::PrivacySandboxAttestations::GetInstance() - ->SetAllPrivacySandboxAttestedForTesting(true); + scoped_feature_list_.InitWithFeatures( + {features::kPrivacySandboxAdsAPIsOverride}, {}); + } + + void SetUpOnMainThread() override { RegisterTrustTokenTestHandler(&trust_token_request_handler_); + browser_client_.emplace(); + browser_client().SetBlockThirdPartyCookiesByDefault(true); DipsNavigationFlowDetectorTest::SetUpOnMainThread(); } @@ -347,6 +368,8 @@ run_loop.Run(); } + TpcBlockingBrowserClient& browser_client() { return browser_client_->impl(); } + private: void RegisterTrustTokenTestHandler( network::test::TrustTokenRequestHandler* handler) { @@ -387,10 +410,8 @@ // Trust Tokens issuance or redemption protocol response message. std::unique_ptr<net::test_server::HttpResponse> MakeTrustTokenResponse( std::string_view contents) { - CHECK([&]() { - std::string temp; - return base::Base64Decode(contents, &temp); - }()); + std::string temp; + CHECK(base::Base64Decode(contents, &temp)); auto response = std::make_unique<net::test_server::BasicHttpResponse>(); response->AddCustomHeader("Sec-Private-State-Token", std::string(contents)); @@ -405,7 +426,10 @@ run_loop.Run(); } + base::test::ScopedFeatureList scoped_feature_list_; network::test::TrustTokenRequestHandler trust_token_request_handler_; + std::optional<content::ContentBrowserTestTpcBlockingBrowserClient> + browser_client_; }; IN_PROC_BROWSER_TEST_F(DipsNavigationFlowDetectorTest, @@ -476,8 +500,7 @@ content::WebContents* web_contents = GetActiveWebContents(); GURL url = embedded_https_test_server_.GetURL(kSiteA, "/page204.html"); base::RunLoop ukm_loop; - ASSERT_TRUE( - content::NavigateToURL(web_contents, url, GURL(url::kAboutBlankURL))); + ASSERT_TRUE(content::NavigateToURL(web_contents, url, GURL(""))); ExpectNoUkmEventsOfType(kDirectNavigationUkmEventName); } @@ -507,8 +530,16 @@ // Implied assert: no DirectNavigation UKM entry for link_target_url. } +// TODO - crbug.com/388718419: Flaky on release builds +#if defined(NDEBUG) +#define MAYBE_SuspectedTrackerFlowEmittedForServerRedirectExit \ + DISABLED_SuspectedTrackerFlowEmittedForServerRedirectExit +#else +#define MAYBE_SuspectedTrackerFlowEmittedForServerRedirectExit \ + SuspectedTrackerFlowEmittedForServerRedirectExit +#endif IN_PROC_BROWSER_TEST_F(DipsNavigationFlowDetectorTest, - SuspectedTrackerFlowEmittedForServerRedirectExit) { + MAYBE_SuspectedTrackerFlowEmittedForServerRedirectExit) { // Visit A. content::WebContents* web_contents = GetActiveWebContents(); GURL referrer_url = @@ -551,9 +582,17 @@ ExpectNoUkmEventsOfType(kInFlowInteractionUkmEventName); } +// TODO - crbug.com/388718419: Flaky on release builds +#if defined(NDEBUG) +#define MAYBE_SuspectedTrackerFlowEmittedForServerRedirectExitConsecutiveEvents \ + DISABLED_SuspectedTrackerFlowEmittedForServerRedirectExitConsecutiveEvents +#else +#define MAYBE_SuspectedTrackerFlowEmittedForServerRedirectExitConsecutiveEvents \ + SuspectedTrackerFlowEmittedForServerRedirectExitConsecutiveEvents +#endif IN_PROC_BROWSER_TEST_F( DipsNavigationFlowDetectorTest, - SuspectedTrackerFlowEmittedForServerRedirectExitConsecutiveEvents) { + MAYBE_SuspectedTrackerFlowEmittedForServerRedirectExitConsecutiveEvents) { // Visit A. content::WebContents* web_contents = GetActiveWebContents(); GURL referrer_url = @@ -681,6 +720,7 @@ observer.Wait(); // Interact with B. SimulateUserActivation(web_contents); + // TODO - crbug.com/389048223: Speed up this step ASSERT_TRUE(WaitUntilTransientActivationLost( web_contents->GetPrimaryMainFrame(), base::Seconds(5))); // Make B client-redirect to C, and wait for UKM to be recorded. @@ -1043,6 +1083,7 @@ embedded_https_test_server_.GetURL(kSiteB, "/title2.html"); PerformClientRedirect(web_contents, successor_url); SimulateUserActivation(web_contents); + // TODO - crbug.com/389048223: Speed up this step ASSERT_TRUE(WaitUntilTransientActivationLost( web_contents->GetPrimaryMainFrame(), base::Seconds(5))); // Client-redirect to C, ending the flow, and wait for UKM to emit. @@ -1086,6 +1127,7 @@ ASSERT_TRUE(content::NavigateToURLFromRendererWithoutUserGesture( web_contents, server_redirector_url, successor_url)); SimulateUserActivation(web_contents); + // TODO - crbug.com/389048223: Speed up this step ASSERT_TRUE(WaitUntilTransientActivationLost( web_contents->GetPrimaryMainFrame(), base::Seconds(5))); // Client-redirect to C, ending the flow, and wait for UKM to emit. @@ -1128,6 +1170,7 @@ ASSERT_TRUE(content::NavigateToURLFromRendererWithoutUserGesture( web_contents, first_successor_url)); SimulateUserActivation(web_contents); + // TODO - crbug.com/389048223: Speed up this step ASSERT_TRUE(WaitUntilTransientActivationLost( web_contents->GetPrimaryMainFrame(), base::Seconds(5))); // Client-redirect to yet another page on B, the second successor for this @@ -1137,6 +1180,7 @@ ASSERT_TRUE(content::NavigateToURLFromRendererWithoutUserGesture( web_contents, first_successor_url)); SimulateUserActivation(web_contents); + // TODO - crbug.com/389048223: Speed up this step ASSERT_TRUE(WaitUntilTransientActivationLost( web_contents->GetPrimaryMainFrame(), base::Seconds(5))); // Client-redirect to C, ending the flow, and wait for UKM to emit. @@ -1184,6 +1228,7 @@ ASSERT_TRUE(content::NavigateToURLFromRendererWithoutUserGesture( web_contents, first_successor_url)); SimulateUserActivation(web_contents); + // TODO - crbug.com/389048223: Speed up this step ASSERT_TRUE(WaitUntilTransientActivationLost( web_contents->GetPrimaryMainFrame(), base::Seconds(5))); // Client-redirect to C, ending the first flow, and wait for UKM to emit. @@ -1211,6 +1256,7 @@ ASSERT_TRUE(content::NavigateToURLFromRendererWithoutUserGesture( web_contents, second_successor_url)); SimulateUserActivation(web_contents); + // TODO - crbug.com/389048223: Speed up this step ASSERT_TRUE(WaitUntilTransientActivationLost( web_contents->GetPrimaryMainFrame(), base::Seconds(5))); // Client-redirect to C, ending the second flow, and wait for UKM to emit. @@ -1236,8 +1282,10 @@ second_entrypoint_url); ukm_recorder().ExpectEntryMetric(second_ukm_entry, "SuccessorRedirectIndex", 3); - ukm_recorder().ExpectEntryMetric(second_ukm_entry, - "DidEntrypointAccessStorage", true); + // TODO - crbug.com/388718419: Uncomment this assertion — currently flaky on + // release builds. + // ukm_recorder().ExpectEntryMetric(second_ukm_entry, + // "DidEntrypointAccessStorage", true); } IN_PROC_BROWSER_TEST_F(DipsNavigationFlowDetectorTest, @@ -1259,6 +1307,7 @@ ASSERT_TRUE(content::NavigateToURLFromRendererWithoutUserGesture( web_contents, successor_url)); SimulateUserActivation(web_contents); + // TODO - crbug.com/389048223: Speed up this step ASSERT_TRUE(WaitUntilTransientActivationLost( web_contents->GetPrimaryMainFrame(), base::Seconds(5))); @@ -1288,6 +1337,7 @@ ASSERT_TRUE(content::NavigateToURLFromRendererWithoutUserGesture( web_contents, successor_url)); SimulateUserActivation(web_contents); + // TODO - crbug.com/389048223: Speed up this step ASSERT_TRUE(WaitUntilTransientActivationLost( web_contents->GetPrimaryMainFrame(), base::Seconds(5))); // Client-redirect to C, which would end a valid flow. @@ -1321,12 +1371,15 @@ ASSERT_TRUE(content::NavigateToURLFromRendererWithoutUserGesture( web_contents, server_redirector_url, successor_url)); SimulateUserActivation(web_contents); + // TODO - crbug.com/389048223: Speed up this step ASSERT_TRUE(WaitUntilTransientActivationLost( web_contents->GetPrimaryMainFrame(), base::Seconds(5))); SimulateUserActivation(web_contents); + // TODO - crbug.com/389048223: Speed up this step ASSERT_TRUE(WaitUntilTransientActivationLost( web_contents->GetPrimaryMainFrame(), base::Seconds(5))); SimulateUserActivation(web_contents); + // TODO - crbug.com/389048223: Speed up this step ASSERT_TRUE(WaitUntilTransientActivationLost( web_contents->GetPrimaryMainFrame(), base::Seconds(5))); // Client-redirect to C, ending the flow, and wait for UKM to emit. @@ -1514,9 +1567,6 @@ GURL second_page_url = embedded_https_test_server_.GetURL(kSiteB, "/title1.html"); ASSERT_TRUE(content::NavigateToURL(web_contents, second_page_url)); - PrivacySandboxSettingsFactory::GetForProfile( - Profile::FromBrowserContext(web_contents->GetBrowserContext())) - ->SetAllPrivacySandboxAllowedForTesting(); ASSERT_TRUE(content::ExecJs(web_contents, R"( (async () => { @@ -1545,25 +1595,20 @@ GURL second_page_url = embedded_https_test_server_.GetURL(kSiteB, "/title1.html"); ASSERT_TRUE(content::NavigateToURL(web_contents, second_page_url)); - PrivacySandboxSettingsFactory::GetForProfile( - Profile::FromBrowserContext(web_contents->GetBrowserContext())) - ->SetAllPrivacySandboxAllowedForTesting(); ASSERT_TRUE(content::ExecJs(web_contents->GetPrimaryMainFrame(), content::JsReplace(R"( - (async () => { - const pageOrigin = new URL($1).origin; - const interestGroup = { - name: "exampleInterestGroup", - owner: pageOrigin, - }; + const pageOrigin = new URL($1).origin; + const interestGroup = { + name: "exampleInterestGroup", + owner: pageOrigin, + }; - await navigator.joinAdInterestGroup( - interestGroup, - // Pick an arbitrarily high duration to - // guarantee that we never leave the ad - // interest group while the test runs. - /*durationSeconds=*/3000000); - })(); + navigator.joinAdInterestGroup( + interestGroup, + // Pick an arbitrarily high duration to + // guarantee that we never leave the ad + // interest group while the test runs. + /*durationSeconds=*/3000000); )", second_page_url), content::EXECUTE_SCRIPT_NO_USER_GESTURE)); @@ -1593,9 +1638,6 @@ embedded_https_test_server_.GetURL(kSiteB, "/title1.html"); ProvideRequestHandlerKeyCommitmentsToNetworkService({kSiteB}); ASSERT_TRUE(content::NavigateToURL(web_contents, second_page_url)); - PrivacySandboxSettingsFactory::GetForProfile( - Profile::FromBrowserContext(web_contents->GetBrowserContext())) - ->SetAllPrivacySandboxAllowedForTesting(); ASSERT_TRUE(content::ExecJs( web_contents, content::JsReplace( @@ -1631,9 +1673,6 @@ ASSERT_TRUE(content::NavigateToURL(web_contents, first_page_url)); // Visit a page on site B that accesses storage via the Attribution Reporting // API. - PrivacySandboxSettingsFactory::GetForProfile( - Profile::FromBrowserContext(web_contents->GetBrowserContext())) - ->SetAllPrivacySandboxAllowedForTesting(); GURL second_page_url = embedded_https_test_server_.GetURL(kSiteB, "/title1.html"); ASSERT_TRUE(content::NavigateToURL(web_contents, second_page_url)); @@ -2141,7 +2180,8 @@ // permits it (Requires mocking the Android Platform Authenticator i.e. GMS // Core). #if !BUILDFLAG(IS_ANDROID) -class DipsNavigationFlowDetectorWebAuthnTest : public CertVerifierBrowserTest { +class DipsNavigationFlowDetectorWebAuthnTest + : public content::ContentBrowserTest { public: DipsNavigationFlowDetectorWebAuthnTest() : embedded_https_test_server_(net::EmbeddedTestServer::TYPE_HTTPS) {} @@ -2152,14 +2192,22 @@ const DipsNavigationFlowDetectorWebAuthnTest&) = delete; void SetUpCommandLine(base::CommandLine* command_line) override { - CertVerifierBrowserTest::SetUpCommandLine(command_line); + content::ContentBrowserTest::SetUpCommandLine(command_line); command_line->AppendSwitch( switches::kEnableExperimentalWebPlatformFeatures); command_line->AppendSwitch(switches::kIgnoreCertificateErrors); } + void SetUpInProcessBrowserTestFixture() override { + mock_cert_verifier_.SetUpInProcessBrowserTestFixture(); + } + + void TearDownInProcessBrowserTestFixture() override { + mock_cert_verifier_.TearDownInProcessBrowserTestFixture(); + } + void SetUpOnMainThread() override { - CertVerifierBrowserTest::SetUpOnMainThread(); + content::ContentBrowserTest::SetUpOnMainThread(); // Allowlist all certs for the HTTPS server. mock_cert_verifier()->set_default_result(net::OK); @@ -2189,17 +2237,22 @@ ukm_recorder_.emplace(); } + void PreRunTestOnMainThread() override { + content::ContentBrowserTest::PreRunTestOnMainThread(); + ukm::InitializeSourceUrlRecorderForWebContents(GetActiveWebContents()); + } + void TearDownOnMainThread() override { - CertVerifierBrowserTest::TearDownOnMainThread(); + content::ContentBrowserTest::TearDownOnMainThread(); } void PostRunTestOnMainThread() override { auth_env_.reset(); - CertVerifierBrowserTest::PostRunTestOnMainThread(); + content::ContentBrowserTest::PostRunTestOnMainThread(); } content::WebContents* GetActiveWebContents() { - return chrome_test_utils::GetActiveWebContents(this); + return shell()->web_contents(); } void GetWebAuthnAssertion() { @@ -2224,11 +2277,16 @@ ukm::TestAutoSetUkmRecorder& ukm_recorder() { return ukm_recorder_.value(); } + content::ContentMockCertVerifier::CertVerifier* mock_cert_verifier() { + return mock_cert_verifier_.mock_cert_verifier(); + } + protected: const std::string authn_hostname = std::string(kSiteB); net::EmbeddedTestServer embedded_https_test_server_; private: + content::ContentMockCertVerifier mock_cert_verifier_; std::unique_ptr<content::ScopedAuthenticatorEnvironmentForTesting> auth_env_; std::optional<ukm::TestAutoSetUkmRecorder> ukm_recorder_; };
diff --git a/content/browser/interest_group/interest_group_auction.cc b/content/browser/interest_group/interest_group_auction.cc index 4e807016..3dc8c16 100644 --- a/content/browser/interest_group/interest_group_auction.cc +++ b/content/browser/interest_group/interest_group_auction.cc
@@ -2393,6 +2393,13 @@ bool bid_filtered = new_priority.has_value() && *new_priority < 0; UMA_HISTOGRAM_BOOLEAN("Ads.InterestGroup.Auction.BidFiltered", bid_filtered); + std::string previously_bid_uma_name = + bid_filtered + ? "Ads.InterestGroup.Auction.FilteredInterestGroupPreviouslyBid" + : "Ads.InterestGroup.Auction.UnfilteredInterestGroupPreviouslyBid"; + bool previously_bid = state->bidder->bidding_browser_signals->bid_count > 0; + base::UmaHistogramBoolean(previously_bid_uma_name, previously_bid); + if (bid_filtered) { if (state->trace_id) { TRACE_EVENT_NESTABLE_ASYNC_INSTANT0("fledge", "bid_filtered", @@ -3510,6 +3517,9 @@ InterestGroupAuctionReporter::WinningBidInfo winning_bid_info( winner->bid->bid_state->bidder); winning_bid_info.render_url = winner->bid->ad_descriptor.url; + // `bid_ad` is a raw pointer owned by the InterestGroup, which is wrapped in a + // refptr that `winning_bid_info` now points to, so this is safe. + winning_bid_info.bid_ad = winner->bid->bid_ad; winning_bid_info.allowed_reporting_origins = winner->bid->bid_ad->allowed_reporting_origins; // Need the bid from the bidder itself. If the bid was from a component
diff --git a/content/browser/interest_group/interest_group_auction_reporter.cc b/content/browser/interest_group/interest_group_auction_reporter.cc index a3346237..d7986542 100644 --- a/content/browser/interest_group/interest_group_auction_reporter.cc +++ b/content/browser/interest_group/interest_group_auction_reporter.cc
@@ -68,16 +68,6 @@ return url.is_valid() && url.SchemeIs(url::kHttpsScheme); } -const blink::InterestGroup::Ad& ChosenAd( - const SingleStorageInterestGroup& storage_interest_group, - const GURL& winning_ad_url) { - auto chosen_ad = base::ranges::find( - *storage_interest_group->interest_group.ads, winning_ad_url, - [](const blink::InterestGroup::Ad& ad) { return ad.render_url(); }); - CHECK(chosen_ad != storage_interest_group->interest_group.ads->end()); - return *chosen_ad; -} - bool IsKAnonForReporting( const SingleStorageInterestGroup& storage_interest_group, const blink::InterestGroup::Ad& chosen_ad, @@ -192,7 +182,7 @@ InterestGroupAuctionReporter::WinningBidInfo::WinningBidInfo( const SingleStorageInterestGroup& storage_interest_group) - : storage_interest_group(std::move(storage_interest_group)) {} + : storage_interest_group(storage_interest_group) {} InterestGroupAuctionReporter::WinningBidInfo::WinningBidInfo(WinningBidInfo&&) = default; InterestGroupAuctionReporter::WinningBidInfo::~WinningBidInfo() = default; @@ -583,17 +573,14 @@ std::optional<std::string> browser_signal_selected_buyer_and_seller_reporting_id; - auto chosen_ad = ChosenAd(winning_bid_info_.storage_interest_group, - winning_bid_info_.render_url); - // For B&A server components, we already checked k-anonymity on the server. if ((top_level_with_components && component_seller_winning_bid_info_->saved_response.has_value()) || IsKAnonForReporting( - winning_bid_info_.storage_interest_group, chosen_ad, + winning_bid_info_.storage_interest_group, *winning_bid_info_.bid_ad, winning_bid_info_.selected_buyer_and_seller_reporting_id)) { browser_signal_buyer_and_seller_reporting_id = - chosen_ad.buyer_and_seller_reporting_id; + winning_bid_info_.bid_ad->buyer_and_seller_reporting_id; browser_signal_selected_buyer_and_seller_reporting_id = winning_bid_info_.selected_buyer_and_seller_reporting_id; } @@ -826,9 +813,6 @@ std::optional<std::string> buyer_and_seller_reporting_id; std::optional<std::string> selected_buyer_and_seller_reporting_id; - const blink::InterestGroup::Ad& chosen_ad = ChosenAd( - winning_bid_info_.storage_interest_group, winning_bid_info_.render_url); - // If k-anonymity enforcement is on we can only reveal the winning reporting // id in reportWin if the winning ad's reporting_ads_kanon entry is // k-anonymous. @@ -837,14 +821,14 @@ // information anyway. if (winning_bid_info_.provided_as_additional_bid || IsKAnonForReporting( - winning_bid_info_.storage_interest_group, chosen_ad, + winning_bid_info_.storage_interest_group, *winning_bid_info_.bid_ad, winning_bid_info_.selected_buyer_and_seller_reporting_id)) { SetReportWinReportingIds( winning_bid_info_.storage_interest_group->interest_group.name, - winning_bid_info_.selected_buyer_and_seller_reporting_id, chosen_ad, - reporting_id_field, interest_group_name_reporting_id, - buyer_reporting_id, buyer_and_seller_reporting_id, - selected_buyer_and_seller_reporting_id); + winning_bid_info_.selected_buyer_and_seller_reporting_id, + *winning_bid_info_.bid_ad, reporting_id_field, + interest_group_name_reporting_id, buyer_reporting_id, + buyer_and_seller_reporting_id, selected_buyer_and_seller_reporting_id); } base::UmaHistogramEnumeration( top_level_seller_winning_bid_info_.saved_response.has_value()
diff --git a/content/browser/interest_group/interest_group_auction_reporter.h b/content/browser/interest_group/interest_group_auction_reporter.h index eaeca8f0..0ac389d 100644 --- a/content/browser/interest_group/interest_group_auction_reporter.h +++ b/content/browser/interest_group/interest_group_auction_reporter.h
@@ -168,6 +168,11 @@ const SingleStorageInterestGroup storage_interest_group; GURL render_url; + + // Points to the InterestGroupAd within the `interest_group` owned by + // `storage_interest_group`. + raw_ptr<const blink::InterestGroup::Ad> bid_ad; + std::optional<std::vector<url::Origin>> allowed_reporting_origins; // Bid returned by the bidder.
diff --git a/content/browser/interest_group/interest_group_auction_reporter_unittest.cc b/content/browser/interest_group/interest_group_auction_reporter_unittest.cc index 3db7cb90..62f8e38 100644 --- a/content/browser/interest_group/interest_group_auction_reporter_unittest.cc +++ b/content/browser/interest_group/interest_group_auction_reporter_unittest.cc
@@ -180,6 +180,7 @@ winning_bid_info_.render_url = GURL((*interest_group.ads)[0].render_url()); winning_bid_info_.ad_metadata = kWinningAdMetadata; + winning_bid_info_.bid_ad = &(*interest_group.ads)[0]; // The actual value doesn't matter for tests, but need to set some value as // it doesn't have a default one.
diff --git a/content/browser/interest_group/interest_group_browsertest.cc b/content/browser/interest_group/interest_group_browsertest.cc index c5420a4..a9132b26 100644 --- a/content/browser/interest_group/interest_group_browsertest.cc +++ b/content/browser/interest_group/interest_group_browsertest.cc
@@ -3718,17 +3718,15 @@ EXPECT_EQ(group.ads.value()[0].buyer_and_seller_reporting_id, "sh1"); ASSERT_TRUE(group.ads.value()[0] .selectable_buyer_and_seller_reporting_ids.has_value()); - EXPECT_EQ( - group.ads.value()[0].selectable_buyer_and_seller_reporting_ids->size(), - 2u); - EXPECT_EQ( - group.ads.value()[0].selectable_buyer_and_seller_reporting_ids.value(), - kSelectableBuyerAndSellerReportingIds); + EXPECT_THAT(*group.ads.value()[0].selectable_buyer_and_seller_reporting_ids, + ::testing::ElementsAre("selectable_id1", "selectable_id2")); EXPECT_EQ(group.ads.value()[1].render_url(), GURL("https://example.com/render2")); EXPECT_FALSE(group.ads.value()[1].buyer_reporting_id.has_value()); EXPECT_EQ(group.ads.value()[1].buyer_and_seller_reporting_id, "sh2"); + EXPECT_FALSE(group.ads.value()[1] + .selectable_buyer_and_seller_reporting_ids.has_value()); } IN_PROC_BROWSER_TEST_F(InterestGroupBrowserTest, @@ -13952,6 +13950,57 @@ EXPECT_EQ(false, EvalJs(shell(), kQuerySelectableReportingIds)); } +IN_PROC_BROWSER_TEST_F(InterestGroupAuctionFledgeDealSupportDisabledTest, + JoinInterestGroupSelectableReportingIdsIgnored) { + GURL url = embedded_https_test_server().GetURL("a.test", "/echo"); + auto origin = url::Origin::Create(url); + std::vector<std::string> selectable_buyer_and_seller_reporting_ids = { + "selectable_id1", "selectable_id2"}; + ASSERT_TRUE(NavigateToURL(shell(), url)); + + EXPECT_EQ( + kSuccess, + JoinInterestGroup( + blink::TestInterestGroupBuilder(origin, "cars") + .SetAds( + {{{GURL("https://example.com/render"), + /*metadata=*/std::nullopt, /*size_group=*/std::nullopt, + /*buyer_reporting_id=*/"brid1", + /*buyer_and_seller_reporting_id=*/"sh1", + /*selectable_buyer_and_seller_reporting_ids=*/ + std::vector<std::string>{"selectable_id1", + "selectable_id2"}, + /*ad_render_id=*/std::nullopt}, + {GURL("https://example.com/render2"), + /*metadata=*/std::nullopt, /*size_group=*/std::nullopt, + /*buyer_reporting_id=*/std::nullopt, + /*buyer_and_seller_reporting_id=*/"sh2", + /*selectable_buyer_and_seller_reporting_ids=*/std::nullopt, + /*ad_render_id=*/std::nullopt}}}) + .Build())); + + scoped_refptr<StorageInterestGroups> groups = + GetInterestGroupsForOwner(origin); + ASSERT_EQ(groups->size(), 1u); + const blink::InterestGroup& group = + groups->GetInterestGroups()[0]->interest_group; + ASSERT_TRUE(group.ads.has_value()); + ASSERT_EQ(group.ads->size(), 2u); + EXPECT_EQ(group.ads.value()[0].render_url(), + GURL("https://example.com/render")); + EXPECT_EQ(group.ads.value()[0].buyer_reporting_id, "brid1"); + EXPECT_EQ(group.ads.value()[0].buyer_and_seller_reporting_id, "sh1"); + EXPECT_FALSE(group.ads.value()[0] + .selectable_buyer_and_seller_reporting_ids.has_value()); + + EXPECT_EQ(group.ads.value()[1].render_url(), + GURL("https://example.com/render2")); + EXPECT_FALSE(group.ads.value()[1].buyer_reporting_id.has_value()); + EXPECT_EQ(group.ads.value()[1].buyer_and_seller_reporting_id, "sh2"); + EXPECT_FALSE(group.ads.value()[1] + .selectable_buyer_and_seller_reporting_ids.has_value()); +} + // When an interest group contains selectableBuyerAndSellerReportingIds, // and the feature is disabled, we expect the selectable to never be set, // and therefore should be treated as a regular bid as if it was never there.
diff --git a/content/browser/renderer_host/input/composited_scrolling_browsertest.cc b/content/browser/renderer_host/input/composited_scrolling_browsertest.cc index 448cda1..2b9da97 100644 --- a/content/browser/renderer_host/input/composited_scrolling_browsertest.cc +++ b/content/browser/renderer_host/input/composited_scrolling_browsertest.cc
@@ -282,7 +282,7 @@ content::FetchHistogramsFromChildProcesses(); - base::HistogramBase::Sample expected_bucket = + base::HistogramBase::Sample32 expected_bucket = CompositedScrollEnabled() ? kScrollingOnCompositor : RasterInducingScrollEnabled() ? kRasterInducingScroll : kScrollingOnMain; @@ -330,7 +330,7 @@ content::FetchHistogramsFromChildProcesses(); - base::HistogramBase::Sample expected_bucket = + base::HistogramBase::Sample32 expected_bucket = CompositedScrollEnabled() ? kScrollingOnCompositorBlockedOnMain : kScrollingOnMain; @@ -386,7 +386,7 @@ content::FetchHistogramsFromChildProcesses(); - base::HistogramBase::Sample expected_bucket = + base::HistogramBase::Sample32 expected_bucket = CompositedScrollEnabled() ? kScrollingOnCompositor : RasterInducingScrollEnabled() ? kRasterInducingScroll : kScrollingOnMain;
diff --git a/content/browser/renderer_host/render_frame_host_manager.cc b/content/browser/renderer_host/render_frame_host_manager.cc index d010f86..85216c18 100644 --- a/content/browser/renderer_host/render_frame_host_manager.cc +++ b/content/browser/renderer_host/render_frame_host_manager.cc
@@ -2654,7 +2654,7 @@ if (destination_url_info.is_prefetch_with_cross_site_contamination) { UMA_HISTOGRAM_EXACT_LINEAR( "Preloading.PrefetchBCGSwap.RelatedActiveContents", - base::saturated_cast<base::HistogramBase::Sample>( + base::saturated_cast<base::HistogramBase::Sample32>( current_instance->GetRelatedActiveContentsCount()), 51); if (base::FeatureList::IsEnabled(
diff --git a/content/browser/shared_storage/shared_storage_browsertest.cc b/content/browser/shared_storage/shared_storage_browsertest.cc index 3846841..489de83 100644 --- a/content/browser/shared_storage/shared_storage_browsertest.cc +++ b/content/browser/shared_storage/shared_storage_browsertest.cc
@@ -188,7 +188,7 @@ histogram_name, base::BindLambdaForTesting( [&](const char* histogram_name, uint64_t name_hash, - base::HistogramBase::Sample sample) { run_loop.Quit(); })); + base::HistogramBase::Sample32 sample) { run_loop.Quit(); })); run_loop.Run(); }
diff --git a/content/browser/tpcd_heuristics/opener_heuristic_metrics.cc b/content/browser/tpcd_heuristics/opener_heuristic_metrics.cc index 0a5ff55..10f7321 100644 --- a/content/browser/tpcd_heuristics/opener_heuristic_metrics.cc +++ b/content/browser/tpcd_heuristics/opener_heuristic_metrics.cc
@@ -25,7 +25,7 @@ // This bucketing implementation is based heavily on // base::Histogram::InitializeBucketRanges, but without allocating extra // memory. - base::Histogram::Sample current = 1; + base::Histogram::Sample32 current = 1; double log_current = 0; double log_max = log(static_cast<double>(maximum)); // Iterate over buckets and return the one closest to the sample. @@ -36,7 +36,7 @@ // number of remaining buckets. double log_next = log_current + (log_max - log_current) / (kCutoffCount - cutoff_index); - base::Histogram::Sample next = static_cast<int>(std::round(exp(log_next))); + base::Histogram::Sample32 next = static_cast<int>(std::round(exp(log_next))); // If the difference between the buckets is too close, just add 1 to the // previous bucket.
diff --git a/content/browser/tracing/background_tracing_rule.cc b/content/browser/tracing/background_tracing_rule.cc index cbfa3d8c..e83c9f4 100644 --- a/content/browser/tracing/background_tracing_rule.cc +++ b/content/browser/tracing/background_tracing_rule.cc
@@ -265,11 +265,11 @@ tracing::mojom::BackgroundTracingRule::New(rule_name())); } - void OnHistogramChangedCallback(base::Histogram::Sample reference_lower_value, - base::Histogram::Sample reference_upper_value, + void OnHistogramChangedCallback(base::Histogram::Sample32 reference_lower_value, + base::Histogram::Sample32 reference_upper_value, const char* histogram_name, uint64_t name_hash, - base::Histogram::Sample actual_value) { + base::Histogram::Sample32 actual_value) { DCHECK_EQ(histogram_name, histogram_name_); if (reference_lower_value > actual_value || reference_upper_value < actual_value) {
diff --git a/content/browser/web_package/signed_exchange_handler.cc b/content/browser/web_package/signed_exchange_handler.cc index 8d194f5..cc7b15f 100644 --- a/content/browser/web_package/signed_exchange_handler.cc +++ b/content/browser/web_package/signed_exchange_handler.cc
@@ -584,13 +584,13 @@ // result here. UMA_HISTOGRAM_ENUMERATION(kHistogramOCSPResponseStatus, ocsp_result.response_status, - static_cast<base::HistogramBase::Sample>( + static_cast<base::HistogramBase::Sample32>( bssl::OCSPVerifyResult::RESPONSE_STATUS_MAX) + 1); if (ocsp_result.response_status == bssl::OCSPVerifyResult::PROVIDED) { UMA_HISTOGRAM_ENUMERATION(kHistogramOCSPRevocationStatus, ocsp_result.revocation_status, - static_cast<base::HistogramBase::Sample>( + static_cast<base::HistogramBase::Sample32>( bssl::OCSPRevocationStatus::MAX_VALUE) + 1); if (ocsp_result.revocation_status == bssl::OCSPRevocationStatus::GOOD) {
diff --git a/content/browser/webid/federated_auth_request_impl.cc b/content/browser/webid/federated_auth_request_impl.cc index 5b33f27..fbada39c 100644 --- a/content/browser/webid/federated_auth_request_impl.cc +++ b/content/browser/webid/federated_auth_request_impl.cc
@@ -928,9 +928,7 @@ permission_delegate_); url::Origin idp_origin = url::Origin::Create(idp_ptr->config->config_url); - if (has_failing_idp_signin_status && - webid::GetIdpSigninStatusMode(render_frame_host(), idp_origin) == - FedCmIdpSigninStatusMode::ENABLED) { + if (has_failing_idp_signin_status) { if (idp_get_params_ptr->mode == blink::mojom::RpMode::kPassive) { if (IsFedCmMultipleIdentityProvidersEnabled()) { // In the multi IDP case, we do not want to complete the request @@ -1333,11 +1331,7 @@ webid::ShouldFailAccountsEndpointRequestBecauseNotSignedInWithIdp( render_frame_host(), identity_provider_config_url, permission_delegate_); - if (idp_info->has_failing_idp_signin_status && - webid::GetIdpSigninStatusMode( - render_frame_host(), - url::Origin::Create(identity_provider_config_url)) == - FedCmIdpSigninStatusMode::ENABLED) { + if (idp_info->has_failing_idp_signin_status) { // If the user is logged out and we are in a active-mode, allow the user // to sign-in to the IdP and return early. if (rp_mode_ == blink::mojom::RpMode::kActive) { @@ -1833,10 +1827,7 @@ std::optional<TokenStatus> token_status) { url::Origin idp_origin = url::Origin::Create(idp_info->provider->config->config_url); - FedCmIdpSigninStatusMode signin_status_mode = - webid::GetIdpSigninStatusMode(render_frame_host(), idp_origin); - if (!old_idp_signin_status.has_value() || - signin_status_mode == FedCmIdpSigninStatusMode::METRICS_ONLY) { + if (!old_idp_signin_status.has_value()) { if (rp_mode_ == blink::mojom::RpMode::kActive) { MaybeShowActiveModeModalDialog(idp_info->provider->config->config_url, idp_info->metadata.idp_login_url);
diff --git a/content/browser/webid/federated_auth_request_impl_unittest.cc b/content/browser/webid/federated_auth_request_impl_unittest.cc index d838d9c..ba03272d 100644 --- a/content/browser/webid/federated_auth_request_impl_unittest.cc +++ b/content/browser/webid/federated_auth_request_impl_unittest.cc
@@ -1906,16 +1906,26 @@ EXPECT_EQ("Provider's FedCM config file is invalid.", messages[1]); } -// Test that request does not fail if config is missing an IDP login URL. +// Test that request fails if config is missing an IDP login URL. TEST_F(FederatedAuthRequestImplTest, MissingLoginURL) { - // Login URL is only optional when the signin status API is disabled. - base::test::ScopedFeatureList list; - list.InitAndDisableFeature(features::kFedCmIdpSigninStatusEnabled); - MockConfiguration configuration = kConfigurationValid; configuration.idp_info[kProviderUrlFull].config.idp_login_url = ""; - RunAuthTest(kDefaultRequestParameters, kExpectationSuccess, configuration); + RequestExpectations expectations = { + RequestTokenStatus::kError, + FederatedAuthRequestResult::kConfigInvalidResponse, + /*standalone_console_message=*/std::nullopt, + /*selected_idp_config_url=*/std::nullopt}; + RunAuthTest(kDefaultRequestParameters, expectations, configuration); EXPECT_TRUE(DidFetchWellKnownAndConfig()); + + std::vector<std::string> messages = + RenderFrameHostTester::For(main_rfh())->GetConsoleMessages(); + ASSERT_EQ(2U, messages.size()); + EXPECT_EQ( + "Config file is missing or has an invalid URL for the following:\n" + "\"login_url\"\n", + messages[0]); + EXPECT_EQ("Provider's FedCM config file is invalid.", messages[1]); } // Test that client metadata endpoint is not required in config. @@ -1945,10 +1955,6 @@ // Test that request fails if IDP login URL is different origin from IDP config // URL. TEST_F(FederatedAuthRequestImplTest, LoginUrlDifferentOriginIdp) { - // We only validate the login_url if IdpSigninStatus is enabled. - base::test::ScopedFeatureList list; - list.InitAndEnableFeature(features::kFedCmIdpSigninStatusEnabled); - MockConfiguration configuration = kConfigurationValid; configuration.idp_info[kProviderUrlFull].config.idp_login_url = "https://idp2.example/login_url"; @@ -3830,9 +3836,6 @@ // Test that first API call with a given IDP is not affected by the // IdpSigninStatus bit. TEST_F(FederatedAuthRequestImplTest, IdpSigninStatusTestFirstTimeFetchSuccess) { - base::test::ScopedFeatureList list; - list.InitAndEnableFeature(features::kFedCmIdpSigninStatusEnabled); - EXPECT_CALL(*test_permission_delegate_, SetIdpSigninStatus(OriginFromString(kProviderUrlFull), true)) .Times(1); @@ -3850,9 +3853,6 @@ // failure during fetching accounts. TEST_F(FederatedAuthRequestImplTest, IdpSigninStatusTestFirstTimeFetchNoFailureUi) { - base::test::ScopedFeatureList list; - list.InitAndEnableFeature(features::kFedCmIdpSigninStatusEnabled); - EXPECT_CALL(*test_permission_delegate_, SetIdpSigninStatus(OriginFromString(kProviderUrlFull), false)) .Times(1); @@ -3873,9 +3873,6 @@ // Test that a failure UI will be displayed if the accounts fetch is failed but // the IdpSigninStatus claims that the user is signed in. TEST_F(FederatedAuthRequestImplTest, IdpSigninStatusTestShowFailureUi) { - base::test::ScopedFeatureList list; - list.InitAndEnableFeature(features::kFedCmIdpSigninStatusEnabled); - test_permission_delegate_ ->idp_signin_statuses_[OriginFromString(kProviderUrlFull)] = true; @@ -3898,9 +3895,6 @@ // UI is displayed. TEST_F(FederatedAuthRequestImplTest, IdpSigninStatusTestApiFailedIfUserNotSignedInWithIdp) { - base::test::ScopedFeatureList list; - list.InitAndEnableFeature(features::kFedCmIdpSigninStatusEnabled); - test_permission_delegate_ ->idp_signin_statuses_[OriginFromString(kProviderUrlFull)] = false; @@ -3977,9 +3971,6 @@ // 2) User signs-in // 3) User selects "Continue" in account chooser dialog. TEST_F(FederatedAuthRequestImplTest, FailureUiThenSuccessfulSignin) { - base::test::ScopedFeatureList list; - list.InitAndEnableFeature(features::kFedCmIdpSigninStatusEnabled); - SetNetworkRequestManager( std::make_unique<ParseStatusOverrideIdpNetworkRequestManager>()); auto* network_manager = @@ -4030,9 +4021,6 @@ // 2) User switches tabs // 3) User signs into IdP in different tab TEST_F(FederatedAuthRequestImplTest, FailureUiThenSuccessfulSigninButHidden) { - base::test::ScopedFeatureList list; - list.InitAndEnableFeature(features::kFedCmIdpSigninStatusEnabled); - SetNetworkRequestManager( std::make_unique<ParseStatusOverrideIdpNetworkRequestManager>()); auto* network_manager = @@ -4082,9 +4070,6 @@ // 1) Failure dialog is shown due to IdP sign-in status mismatch // 2) In a different tab, user signs into different IdP TEST_F(FederatedAuthRequestImplTest, FailureUiSigninFromDifferentIdp) { - base::test::ScopedFeatureList list; - list.InitAndEnableFeature(features::kFedCmIdpSigninStatusEnabled); - SetNetworkRequestManager( std::make_unique<ParseStatusOverrideIdpNetworkRequestManager>()); auto* network_manager = @@ -4139,9 +4124,6 @@ // That ShowFailureDialog() is called a 2nd time after the IdP sign-in status // update. TEST_F(FederatedAuthRequestImplTest, FailureUiAccountEndpointKeepsFailing) { - base::test::ScopedFeatureList list; - list.InitAndEnableFeature(features::kFedCmIdpSigninStatusEnabled); - url::Origin kIdpOrigin = OriginFromString(kProviderUrlFull); MockConfiguration configuration = kConfigurationValid; @@ -4199,9 +4181,6 @@ // status update. // That user is shown IdP-sign-in-failure dialog. TEST_F(FederatedAuthRequestImplTest, FailureUiThenFailDifferentEndpoint) { - base::test::ScopedFeatureList list; - list.InitAndEnableFeature(features::kFedCmIdpSigninStatusEnabled); - SetNetworkRequestManager( std::make_unique<ParseStatusOverrideIdpNetworkRequestManager>()); auto* network_manager = @@ -4261,21 +4240,6 @@ CheckAllFedCmSessionIDs(); } -// Test that when IdpSigninStatus API is in the metrics-only mode, that an IDP -// signed-out status stays signed-out regardless of what is returned by the -// accounts endpoint. -TEST_F(FederatedAuthRequestImplTest, IdpSigninStatusMetricsModeStaysSignedout) { - base::test::ScopedFeatureList list; - list.InitWithFeatures({}, {features::kFedCmIdpSigninStatusEnabled}); - - test_permission_delegate_ - ->idp_signin_statuses_[OriginFromString(kProviderUrlFull)] = false; - EXPECT_CALL(*test_permission_delegate_, SetIdpSigninStatus(_, _)).Times(0); - - RunAuthTest(kDefaultRequestParameters, kExpectationSuccess, - kConfigurationValid); -} - // Test that when IdpSigninStatus API does not have any state for an IDP, that // the state transitions to sign-in if the accounts endpoint returns a // non-empty list of accounts. @@ -4291,31 +4255,6 @@ kConfigurationValid); } -// Test that when IdpSigninStatus API is in metrics-only mode, that IDP sign-in -// status transitions to signed-out if the accounts endpoint returns no -// information. -TEST_F(FederatedAuthRequestImplTest, - IdpSigninStatusMetricsModeTransitionsToSignedoutWhenNoAccounts) { - base::test::ScopedFeatureList list; - list.InitWithFeatures({}, {features::kFedCmIdpSigninStatusEnabled}); - - test_permission_delegate_ - ->idp_signin_statuses_[OriginFromString(kProviderUrlFull)] = true; - EXPECT_CALL(*test_permission_delegate_, - SetIdpSigninStatus(OriginFromString(kProviderUrlFull), false)); - - MockConfiguration configuration = kConfigurationValid; - configuration.idp_info[kProviderUrlFull].accounts_response.parse_status = - ParseStatus::kInvalidResponseError; - RequestExpectations expectations = { - RequestTokenStatus::kError, - FederatedAuthRequestResult::kAccountsInvalidResponse, - /*standalone_console_message=*/std::nullopt, std::nullopt}; - RunAuthTest(kDefaultRequestParameters, expectations, configuration); - EXPECT_TRUE(DidFetch(FetchedEndpoint::ACCOUNTS)); - EXPECT_FALSE(did_show_accounts_dialog()); -} - // Tests that multiple IDPs provided results in an error if the // `kFedCmMultipleIdentityProviders` flag is disabled. TEST_F(FederatedAuthRequestImplTest, MultiIdpDisabled) { @@ -6507,9 +6446,6 @@ // Tests that when a mismatch dialog is shown, the appropriate metrics are // recorded. TEST_F(FederatedAuthRequestImplTest, MismatchDialogShownMetric) { - base::test::ScopedFeatureList list; - list.InitAndEnableFeature(features::kFedCmIdpSigninStatusEnabled); - base::RunLoop ukm_loop; ukm_recorder()->SetOnAddEntryCallback(FedCmEntry::kEntryName, ukm_loop.QuitClosure()); @@ -6540,9 +6476,6 @@ // Tests that a mismatch dialog is shown twice. TEST_F(FederatedAuthRequestImplTest, DoubleMismatchDialog) { - base::test::ScopedFeatureList list; - list.InitAndEnableFeature(features::kFedCmIdpSigninStatusEnabled); - base::RunLoop ukm_loop; ukm_recorder()->SetOnAddEntryCallback(FedCmEntry::kEntryName, ukm_loop.QuitClosure()); @@ -6638,9 +6571,6 @@ // Tests that when a mismatch dialog is aborted, the appropriate duration // metrics are recorded. TEST_F(FederatedAuthRequestImplTest, AbortedMismatchDialogShownDurationMetric) { - base::test::ScopedFeatureList list; - list.InitAndEnableFeature(features::kFedCmIdpSigninStatusEnabled); - base::RunLoop ukm_loop; ukm_recorder()->SetOnAddEntryCallback(FedCmEntry::kEntryName, ukm_loop.QuitClosure()); @@ -6852,9 +6782,6 @@ // Test that permission is embargoed upon closing a mismatch dialog. TEST_F(FederatedAuthRequestImplTest, IdpSigninStatusCloseMismatchEmbargo) { - base::test::ScopedFeatureList list; - list.InitAndEnableFeature(features::kFedCmIdpSigninStatusEnabled); - test_permission_delegate_ ->idp_signin_statuses_[OriginFromString(kProviderUrlFull)] = true; @@ -6877,9 +6804,6 @@ // Test that permission is not embargoed upon closing an IDP sign-in flow // pop-up. TEST_F(FederatedAuthRequestImplTest, IdpSigninStatusClosePopupEmbargo) { - base::test::ScopedFeatureList list; - list.InitAndEnableFeature(features::kFedCmIdpSigninStatusEnabled); - test_permission_delegate_ ->idp_signin_statuses_[OriginFromString(kProviderUrlFull)] = true;
diff --git a/content/browser/webid/federated_auth_user_info_request.cc b/content/browser/webid/federated_auth_user_info_request.cc index 8f2437e..523a49dc 100644 --- a/content/browser/webid/federated_auth_user_info_request.cc +++ b/content/browser/webid/federated_auth_user_info_request.cc
@@ -144,9 +144,7 @@ } if (webid::ShouldFailAccountsEndpointRequestBecauseNotSignedInWithIdp( - *render_frame_host_, idp_config_url_, permission_delegate_) && - webid::GetIdpSigninStatusMode(*render_frame_host_, idp_origin) == - FedCmIdpSigninStatusMode::ENABLED) { + *render_frame_host_, idp_config_url_, permission_delegate_)) { CompleteWithError(FederatedAuthUserInfoRequestResult::kNotSignedInWithIdp); return; } @@ -198,10 +196,7 @@ does_idp_have_failing_signin_status_ = webid::ShouldFailAccountsEndpointRequestBecauseNotSignedInWithIdp( *render_frame_host_, idp_config_url_, permission_delegate_); - if (does_idp_have_failing_signin_status_ && - webid::GetIdpSigninStatusMode(*render_frame_host_, - url::Origin::Create(idp_config_url_)) == - FedCmIdpSigninStatusMode::ENABLED) { + if (does_idp_have_failing_signin_status_) { CompleteWithError(FederatedAuthUserInfoRequestResult::kNotSignedInWithIdp); return; }
diff --git a/content/browser/webid/federated_provider_fetcher.cc b/content/browser/webid/federated_provider_fetcher.cc index 3760ab8..ac42508 100644 --- a/content/browser/webid/federated_provider_fetcher.cc +++ b/content/browser/webid/federated_provider_fetcher.cc
@@ -242,11 +242,9 @@ url::Origin::Create(result.identity_provider_config_url); bool is_login_url_valid = - webid::GetIdpSigninStatusMode(render_frame_host_.get(), idp_origin) != - FedCmIdpSigninStatusMode::ENABLED || - (result.metadata && - webid::IsEndpointSameOrigin(result.identity_provider_config_url, - result.metadata->idp_login_url)); + result.metadata && + webid::IsEndpointSameOrigin(result.identity_provider_config_url, + result.metadata->idp_login_url); if (!is_token_valid || !is_accounts_valid || !is_login_url_valid) { std::string console_message =
diff --git a/content/browser/webid/federated_provider_fetcher_unittest.cc b/content/browser/webid/federated_provider_fetcher_unittest.cc index ad42546..7b03525a 100644 --- a/content/browser/webid/federated_provider_fetcher_unittest.cc +++ b/content/browser/webid/federated_provider_fetcher_unittest.cc
@@ -515,8 +515,6 @@ } TEST_F(FederatedProviderFetcherTest, InvalidCrossOriginSigninUrl) { - feature_list_.InitAndEnableFeature(features::kFedCmIdpSigninStatusEnabled); - FederatedProviderFetcher::FetchResult result; result.endpoints.accounts = GURL("https://idp.example/accounts"); result.endpoints.token = GURL("https://idp.example/token");
diff --git a/content/browser/webid/flags.cc b/content/browser/webid/flags.cc index fd60d46f..69ad149 100644 --- a/content/browser/webid/flags.cc +++ b/content/browser/webid/flags.cc
@@ -27,13 +27,6 @@ features::kFedCmMultipleIdentityProviders); } -FedCmIdpSigninStatusMode GetFedCmIdpSigninStatusFlag() { - if (base::FeatureList::IsEnabled(features::kFedCmIdpSigninStatusEnabled)) { - return FedCmIdpSigninStatusMode::ENABLED; - } - return FedCmIdpSigninStatusMode::METRICS_ONLY; -} - bool IsFedCmMetricsEndpointEnabled() { return base::FeatureList::IsEnabled(features::kFedCmMetricsEndpoint); }
diff --git a/content/browser/webid/flags.h b/content/browser/webid/flags.h index 5784993..b631bd3 100644 --- a/content/browser/webid/flags.h +++ b/content/browser/webid/flags.h
@@ -11,9 +11,6 @@ namespace content { -// IDP IdpSigninStatus API modes. -enum class FedCmIdpSigninStatusMode { METRICS_ONLY, ENABLED }; - // Whether the authz flags has been overridden. If it has been overridden // to false, we should not let it be enabled using an origin trial. std::optional<bool> IsFedCmAuthzOverridden(); @@ -24,11 +21,6 @@ // Whether multiple identity providers are enabled. bool IsFedCmMultipleIdentityProvidersEnabled(); -// Returns the IdpSigninStatus API mode. -// Most callers should use webid::GetIdpSigninStatusMode() in webid_utils.h -// instead, as that version takes origin trial status into account. -FedCmIdpSigninStatusMode GetFedCmIdpSigninStatusFlag(); - // Whether metrics endpoint is enabled. bool IsFedCmMetricsEndpointEnabled();
diff --git a/content/browser/webid/webid_browsertest.cc b/content/browser/webid/webid_browsertest.cc index d068193..9cb7363 100644 --- a/content/browser/webid/webid_browsertest.cc +++ b/content/browser/webid/webid_browsertest.cc
@@ -424,8 +424,6 @@ class WebIdIdpSigninStatusBrowserTest : public WebIdBrowserTest { public: void SetUpCommandLine(base::CommandLine* command_line) override { - scoped_feature_list_.InitAndEnableFeature( - features::kFedCmIdpSigninStatusEnabled); command_line->AppendSwitch(switches::kIgnoreCertificateErrors); } @@ -441,9 +439,7 @@ public: void SetUpCommandLine(base::CommandLine* command_line) override { scoped_feature_list_.InitWithFeatures( - {features::kFedCmIdpSigninStatusEnabled, - blink::features::kKeepAliveInBrowserMigration}, - {}); + {blink::features::kKeepAliveInBrowserMigration}, {}); command_line->AppendSwitch(switches::kIgnoreCertificateErrors); }
diff --git a/content/browser/webid/webid_utils.cc b/content/browser/webid/webid_utils.cc index d74513c..574a325 100644 --- a/content/browser/webid/webid_utils.cc +++ b/content/browser/webid/webid_utils.cc
@@ -397,13 +397,6 @@ } } -FedCmIdpSigninStatusMode GetIdpSigninStatusMode(RenderFrameHost& host, - const url::Origin& idp_origin) { - // TODO(crbug.com/40283354): Remove this function in favor of - // GetFedCmIdpSigninStatusFlag. - return GetFedCmIdpSigninStatusFlag(); -} - std::string FormatUrlForDisplay(const GURL& url) { // We do not use url_formatter::FormatUrlForSecurityDisplay() directly because // our UI intentionally shows only the eTLD+1, as it makes for a shorter text
diff --git a/content/browser/webid/webid_utils.h b/content/browser/webid/webid_utils.h index 5276b95..d797646 100644 --- a/content/browser/webid/webid_utils.h +++ b/content/browser/webid/webid_utils.h
@@ -86,9 +86,6 @@ CONTENT_EXPORT std::string GetDisconnectConsoleErrorMessage( FedCmDisconnectStatus disconnect_status_for_metrics); -FedCmIdpSigninStatusMode GetIdpSigninStatusMode(RenderFrameHost& host, - const url::Origin& idp_origin); - // Returns the eTLD+1 for a given url. For localhost, returns the host. std::string FormatUrlForDisplay(const GURL& url);
diff --git a/content/child/runtime_features.cc b/content/child/runtime_features.cc index 78e7788..f522dee 100644 --- a/content/child/runtime_features.cc +++ b/content/child/runtime_features.cc
@@ -211,9 +211,6 @@ kDefault}, {wf::EnableFedCmIdPRegistration, raw_ref(features::kFedCmIdPRegistration), kDefault}, - {wf::EnableFedCmIdpSigninStatus, - raw_ref(features::kFedCmIdpSigninStatusEnabled), - kSetOnlyIfOverridden}, {wf::EnableFedCmLightweightMode, raw_ref(features::kFedCmLightweightMode), kDefault}, {wf::EnableGamepadMultitouch,
diff --git a/content/public/android/java/src/org/chromium/content/browser/SpeechRecognitionImpl.java b/content/public/android/java/src/org/chromium/content/browser/SpeechRecognitionImpl.java index 59d8e0e..be8c3dec 100644 --- a/content/public/android/java/src/org/chromium/content/browser/SpeechRecognitionImpl.java +++ b/content/public/android/java/src/org/chromium/content/browser/SpeechRecognitionImpl.java
@@ -182,8 +182,7 @@ assumeNonNull(bundle.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION)); String[] results = list.toArray(new String[list.size()]); - float[] scores = - assumeNonNull(bundle.getFloatArray(SpeechRecognizer.CONFIDENCE_SCORES)); + float @Nullable [] scores = bundle.getFloatArray(SpeechRecognizer.CONFIDENCE_SCORES); SpeechRecognitionImplJni.get() .onRecognitionResults( @@ -356,7 +355,7 @@ long nativeSpeechRecognizerImplAndroid, SpeechRecognitionImpl caller, String[] results, - float[] scores, + float @Nullable [] scores, boolean provisional); void onRecognitionError(
diff --git a/content/public/common/content_features.cc b/content/public/common/content_features.cc index 372a558f..4a4c04e 100644 --- a/content/public/common/content_features.cc +++ b/content/public/common/content_features.cc
@@ -436,14 +436,6 @@ "FedCmIdPregistration", base::FEATURE_DISABLED_BY_DEFAULT); -// Enables the IDP signin status API for use with FedCM, including avoiding -// network requests when not signed in and mismatch handling. -// When turned off, Login-Status headers are still parsed and processed -// and FedCM mismatch metrics are collected. -BASE_FEATURE(kFedCmIdpSigninStatusEnabled, - "FedCmIdpSigninStatusEnabled", - base::FEATURE_ENABLED_BY_DEFAULT); - // Enables usage of the FedCM API with metrics endpoint at the same time. BASE_FEATURE(kFedCmMetricsEndpoint, "FedCmMetricsEndpoint",
diff --git a/content/public/common/content_features.h b/content/public/common/content_features.h index 2b4c1101..741a1e1 100644 --- a/content/public/common/content_features.h +++ b/content/public/common/content_features.h
@@ -112,7 +112,6 @@ CONTENT_EXPORT BASE_DECLARE_FEATURE(kFedCmButtonMode); CONTENT_EXPORT BASE_DECLARE_FEATURE(kFedCmDelegation); CONTENT_EXPORT BASE_DECLARE_FEATURE(kFedCmIdPRegistration); -CONTENT_EXPORT BASE_DECLARE_FEATURE(kFedCmIdpSigninStatusEnabled); CONTENT_EXPORT BASE_DECLARE_FEATURE(kFedCmMetricsEndpoint); CONTENT_EXPORT BASE_DECLARE_FEATURE(kFedCmMultipleIdentityProviders); CONTENT_EXPORT BASE_DECLARE_FEATURE(kFedCmSelectiveDisclosure);
diff --git a/content/renderer/media/renderer_webaudiodevice_impl.cc b/content/renderer/media/renderer_webaudiodevice_impl.cc index 38daf55..10e3ab6 100644 --- a/content/renderer/media/renderer_webaudiodevice_impl.cc +++ b/content/renderer/media/renderer_webaudiodevice_impl.cc
@@ -352,7 +352,7 @@ RendererWebAudioDeviceImpl::GetSilentSinkTaskRunner() { if (!silent_sink_task_runner_) { silent_sink_task_runner_ = base::ThreadPool::CreateSingleThreadTaskRunner( - {base::TaskPriority::USER_VISIBLE, + {base::TaskPriority::USER_BLOCKING, base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN}); } return silent_sink_task_runner_;
diff --git a/content/services/auction_worklet/bidder_worklet.cc b/content/services/auction_worklet/bidder_worklet.cc index 13952c7..ff71e8a 100644 --- a/content/services/auction_worklet/bidder_worklet.cc +++ b/content/services/auction_worklet/bidder_worklet.cc
@@ -291,9 +291,10 @@ size_t threads) { return fmin( features::kFledgeMaxBidderContextsPerThreadInAdvance.Get(), - fmax(1, (max_expected_required_contexts * - features::kFledgeBidderContextsMultiplier.Get()) / - (threads * features::kFledgeBidderContextsDivisor.Get()))); + fmax(features::kFledgeMinBidderContextsPerThreadInAdvance.Get(), + (max_expected_required_contexts * + features::kFledgeBidderContextsMultiplier.Get()) / + (threads * features::kFledgeBidderContextsDivisor.Get()))); } // Check if trusted bidding signals, if any, are same-origin or cross-origin.
diff --git a/content/services/auction_worklet/bidder_worklet_unittest.cc b/content/services/auction_worklet/bidder_worklet_unittest.cc index c32f9833..a19c3143 100644 --- a/content/services/auction_worklet/bidder_worklet_unittest.cc +++ b/content/services/auction_worklet/bidder_worklet_unittest.cc
@@ -9373,7 +9373,8 @@ features::kFledgePrepareBidderContextsInAdvance, {{"BidderContextsDivisor", "2"}, {"BidderContextsMultiplier", "1"}, - {"MaxBidderContextsPerThread", "4"}}); + {"MaxBidderContextsPerThread", "4"}, + {"MinBidderContextsPerThread", "1"}}); interest_group_trusted_bidding_signals_url_ = GURL("https://signals.test/"); const GURL kFullSignalsUrl( "https://signals.test/?hostname=top.window.test&interestGroupNames=Fred");
diff --git a/content/services/auction_worklet/public/cpp/auction_worklet_features.cc b/content/services/auction_worklet/public/cpp/auction_worklet_features.cc index bdf31157..06ffb53 100644 --- a/content/services/auction_worklet/public/cpp/auction_worklet_features.cc +++ b/content/services/auction_worklet/public/cpp/auction_worklet_features.cc
@@ -47,6 +47,11 @@ "MaxBidderContextsPerThread", 10); BASE_FEATURE_PARAM(int, + kFledgeMinBidderContextsPerThreadInAdvance, + &kFledgePrepareBidderContextsInAdvance, + "MinBidderContextsPerThread", + 1); +BASE_FEATURE_PARAM(int, kFledgeBidderContextsDivisor, &kFledgePrepareBidderContextsInAdvance, "BidderContextsDivisor",
diff --git a/content/services/auction_worklet/public/cpp/auction_worklet_features.h b/content/services/auction_worklet/public/cpp/auction_worklet_features.h index a148980..90f5d55 100644 --- a/content/services/auction_worklet/public/cpp/auction_worklet_features.h +++ b/content/services/auction_worklet/public/cpp/auction_worklet_features.h
@@ -40,6 +40,9 @@ CONTENT_EXPORT BASE_DECLARE_FEATURE_PARAM( int, kFledgeMaxBidderContextsPerThreadInAdvance); +CONTENT_EXPORT BASE_DECLARE_FEATURE_PARAM( + int, + kFledgeMinBidderContextsPerThreadInAdvance); CONTENT_EXPORT BASE_DECLARE_FEATURE_PARAM(int, kFledgeBidderContextsDivisor); CONTENT_EXPORT BASE_DECLARE_FEATURE_PARAM(int, kFledgeBidderContextsMultiplier);
diff --git a/content/test/BUILD.gn b/content/test/BUILD.gn index 2564f6d2f..fac5ded 100644 --- a/content/test/BUILD.gn +++ b/content/test/BUILD.gn
@@ -1437,6 +1437,7 @@ "../browser/devtools/site_per_process_devtools_browsertest.cc", "../browser/dips/dips_bounce_detector_browsertest.cc", "../browser/dips/dips_helper_browsertest.cc", + "../browser/dips/dips_navigation_flow_detector_browsertest.cc", "../browser/direct_sockets/direct_sockets_test_utils.cc", "../browser/direct_sockets/direct_sockets_test_utils.h", "../browser/display_cutout/display_cutout_browsertest.cc",
diff --git a/content/test/gpu/unexpected_passes/gpu_expectations_unittest.py b/content/test/gpu/unexpected_passes/gpu_expectations_unittest.py index 3773a50..4ad5f2b 100755 --- a/content/test/gpu/unexpected_passes/gpu_expectations_unittest.py +++ b/content/test/gpu/unexpected_passes/gpu_expectations_unittest.py
@@ -10,14 +10,19 @@ import unittest from unittest import mock +# vpython-provided modules. +from pyfakefs import fake_filesystem_unittest # pylint: disable=import-error + from unexpected_passes import gpu_expectations from unexpected_passes_common import data_types # pylint: disable=protected-access -class CreateTestExpectationMapUnittest(unittest.TestCase): +class CreateTestExpectationMapUnittest(fake_filesystem_unittest.TestCase): + def setUp(self) -> None: + self.setUpPyfakefs() self.instance = gpu_expectations.GpuExpectations() self._expectation_content: Dict[str, str] = {} @@ -33,8 +38,8 @@ def testSlowExpectationsDropped(self) -> None: """Tests that slow expectations get dropped from the generated map.""" - filename = '/tmp/foo' - self._expectation_content[filename] = """\ + filename = '/foo' + expectation_content = """\ # tags: [ win linux ] # tags: [ nvidia intel ] # results: [ Failure Slow ] @@ -44,6 +49,10 @@ [ linux nvidia ] foo/test [ Slow ] [ linux intel ] foo/test [ Failure ] """ + self._expectation_content[filename] = expectation_content + with open(filename, 'w', encoding='utf-8') as outfile: + outfile.write(expectation_content) + expectation_map = self.instance.CreateTestExpectationMap( filename, None, datetime.timedelta(days=0)) # The Slow expectations should be omitted.
diff --git a/device/bluetooth/public/cpp/bluetooth_uuid.cc b/device/bluetooth/public/cpp/bluetooth_uuid.cc index b99991a..713ac58 100644 --- a/device/bluetooth/public/cpp/bluetooth_uuid.cc +++ b/device/bluetooth/public/cpp/bluetooth_uuid.cc
@@ -158,18 +158,6 @@ return bytes; } -bool BluetoothUUID::operator<(const BluetoothUUID& uuid) const { - return canonical_value_ < uuid.canonical_value_; -} - -bool BluetoothUUID::operator==(const BluetoothUUID& uuid) const { - return canonical_value_ == uuid.canonical_value_; -} - -bool BluetoothUUID::operator!=(const BluetoothUUID& uuid) const { - return canonical_value_ != uuid.canonical_value_; -} - std::ostream& operator<<(std::ostream& os, BluetoothUUID uuid) { return os << uuid.canonical_value(); }
diff --git a/device/bluetooth/public/cpp/bluetooth_uuid.h b/device/bluetooth/public/cpp/bluetooth_uuid.h index c86af35..211d01a 100644 --- a/device/bluetooth/public/cpp/bluetooth_uuid.h +++ b/device/bluetooth/public/cpp/bluetooth_uuid.h
@@ -94,13 +94,15 @@ // invalid. std::vector<uint8_t> GetBytes() const; - // Permit sufficient comparison to allow a UUID to be used as a key in a - // std::map. - bool operator<(const BluetoothUUID& uuid) const; + // Allow a UUID to be passed to e.g. `std::ranges::is_sorted()`. + auto operator<=>(const BluetoothUUID& uuid) const { + return canonical_value_ <=> uuid.canonical_value_; + } // Equality operators. - bool operator==(const BluetoothUUID& uuid) const; - bool operator!=(const BluetoothUUID& uuid) const; + bool operator==(const BluetoothUUID& uuid) const { + return canonical_value_ == uuid.canonical_value_; + } private: // String representation of the UUID that was used during construction. For
diff --git a/docs/website b/docs/website index b294694..9390101 160000 --- a/docs/website +++ b/docs/website
@@ -1 +1 @@ -Subproject commit b2946942a27e261a3a94a354d819b842c4b10c57 +Subproject commit 939010115caac895e1879c5af408c4550a547db6
diff --git a/docs/workflow/debugging-with-swarming.md b/docs/workflow/debugging-with-swarming.md index 7d03706..6677c0f 100644 --- a/docs/workflow/debugging-with-swarming.md +++ b/docs/workflow/debugging-with-swarming.md
@@ -22,7 +22,7 @@ but held by the CAS server and identified by a digest of its contents. The isolate also includes the command(s) to run, which is why the command is specified when building the isolate, not when executing it. See the -[infra glossay](../infra/glossary.md) for the definitions of these terms and +[infra glossary](../infra/glossary.md) for the definitions of these terms and more. Normally, when you do a CQ dry run, something like this happens:
diff --git a/extensions/common/manifest_handlers/web_accessible_resources_info.cc b/extensions/common/manifest_handlers/web_accessible_resources_info.cc index 0bf6c0a..6e20aed 100644 --- a/extensions/common/manifest_handlers/web_accessible_resources_info.cc +++ b/extensions/common/manifest_handlers/web_accessible_resources_info.cc
@@ -171,7 +171,7 @@ const GURL& target_url) { std::string relative_path = target_url.path(); - // Set the intiator_url. + // Set the initiator_url. GURL initiator_url; if (initiator_origin) { if (initiator_origin->opaque()) { @@ -219,7 +219,7 @@ } } - // Determine if the `intiator_url` is allowed to access this resource. + // Determine if the `initiator_url` is allowed to access this resource. if (entry.matches.MatchesURL(initiator_url)) { return result; }
diff --git a/extensions/renderer/extensions_renderer_client.cc b/extensions/renderer/extensions_renderer_client.cc index 7cb1b4da..a52f5b6 100644 --- a/extensions/renderer/extensions_renderer_client.cc +++ b/extensions/renderer/extensions_renderer_client.cc
@@ -8,10 +8,7 @@ #include <ostream> #include "base/check.h" -#include "base/command_line.h" #include "base/functional/bind.h" -#include "base/lazy_instance.h" -#include "base/metrics/histogram_functions.h" #include "components/guest_view/buildflags/buildflags.h" #include "content/public/common/content_constants.h" #include "content/public/common/content_switches.h" @@ -20,14 +17,12 @@ #include "extensions/buildflags/buildflags.h" #include "extensions/common/constants.h" #include "extensions/common/extension.h" -#include "extensions/common/extension_set.h" #include "extensions/common/mojom/context_type.mojom.h" #include "extensions/common/switches.h" #include "extensions/renderer/dispatcher.h" #include "extensions/renderer/extension_frame_helper.h" #include "extensions/renderer/extension_web_view_helper.h" #include "extensions/renderer/extensions_render_frame_observer.h" -#include "extensions/renderer/renderer_extension_registry.h" #include "extensions/renderer/resource_request_policy.h" #include "extensions/renderer/script_context.h" #include "third_party/blink/public/common/security/protocol_handler_security_level.h"
diff --git a/extensions/renderer/script_context_set.cc b/extensions/renderer/script_context_set.cc index 16a74deb..3fca384 100644 --- a/extensions/renderer/script_context_set.cc +++ b/extensions/renderer/script_context_set.cc
@@ -27,6 +27,7 @@ #include "third_party/blink/public/platform/scheduler/web_agent_group_scheduler.h" #include "third_party/blink/public/web/web_document.h" #include "third_party/blink/public/web/web_local_frame.h" +#include "url/origin.h" #include "v8/include/v8-isolate.h" #include "v8/include/v8-object.h" @@ -89,16 +90,7 @@ } else if (effective_context_type == mojom::ContextType::kWebPage && !is_webview && context_data.HasControlledFrameCapability()) { host_id.type = mojom::HostID::HostType::kControlledFrameEmbedder; - // TODO(crbug.com/41490370): Improve how we derive origin for controlled - // frame embedders in renderer. - host_id.id = ""; - if (frame_url.has_scheme()) { - host_id.id += frame_url.scheme() + "://"; - } - host_id.id += frame_url.host(); - if (frame_url.has_port()) { - host_id.id += ":" + frame_url.port(); - } + host_id.id = url::Origin::Create(frame_url).Serialize(); } std::optional<int> blink_isolated_world_id;
diff --git a/google_apis/classroom/classroom_api_courses_response_types.cc b/google_apis/classroom/classroom_api_courses_response_types.cc index 0cb8bf6..2e824dd7 100644 --- a/google_apis/classroom/classroom_api_courses_response_types.cc +++ b/google_apis/classroom/classroom_api_courses_response_types.cc
@@ -18,6 +18,7 @@ constexpr char kApiResponseCoursesKey[] = "courses"; constexpr char kApiResponseCourseStateKey[] = "courseState"; +constexpr char kApiResponseSectionKey[] = "section"; constexpr char kActiveCourseState[] = "ACTIVE"; @@ -31,11 +32,16 @@ // ----- Course ----- +Course::Course() = default; + +Course::~Course() = default; + // static void Course::RegisterJSONConverter( base::JSONValueConverter<Course>* converter) { converter->RegisterStringField(kApiResponseIdKey, &Course::id_); converter->RegisterStringField(kApiResponseNameKey, &Course::name_); + converter->RegisterStringField(kApiResponseSectionKey, &Course::section_); converter->RegisterCustomField<Course::State>( kApiResponseCourseStateKey, &Course::state_, &ConvertCourseState); }
diff --git a/google_apis/classroom/classroom_api_courses_response_types.h b/google_apis/classroom/classroom_api_courses_response_types.h index 7befd2d..c7ce1be8 100644 --- a/google_apis/classroom/classroom_api_courses_response_types.h +++ b/google_apis/classroom/classroom_api_courses_response_types.h
@@ -28,10 +28,10 @@ kOther, }; - Course() = default; + Course(); Course(const Course&) = delete; Course& operator=(const Course&) = delete; - ~Course() = default; + ~Course(); // Registers the mapping between JSON field names and the members in this // class. @@ -42,6 +42,7 @@ const std::string& id() const { return id_; } const std::string& name() const { return name_; } + const std::string& section() const { return section_; } State state() const { return state_; } private: @@ -51,6 +52,9 @@ // Name of the course. For example, "10th Grade Biology". std::string name_; + // Section of the course. For example, "Period 2". + std::string section_; + // State of the course. State state_ = State::kOther; };
diff --git a/google_apis/classroom/classroom_api_courses_response_types_unittest.cc b/google_apis/classroom/classroom_api_courses_response_types_unittest.cc index 264d10b9..8f1dece 100644 --- a/google_apis/classroom/classroom_api_courses_response_types_unittest.cc +++ b/google_apis/classroom/classroom_api_courses_response_types_unittest.cc
@@ -27,7 +27,7 @@ const auto raw_courses = JSONReader::Read(R"( { "courses": [ - {"id": "course-1", "name": "Course Name 1", "courseState": "ACTIVE"}, + {"id": "course-1", "name": "Course Name 1", "section": "Period 1", "courseState": "ACTIVE"}, {"id": "course-2", "name": "Course Name 2", "courseState": "ARCHIVED"} ] })"); @@ -40,10 +40,12 @@ EXPECT_EQ(courses->items().at(0)->id(), "course-1"); EXPECT_EQ(courses->items().at(0)->name(), "Course Name 1"); + EXPECT_EQ(courses->items().at(0)->section(), "Period 1"); EXPECT_EQ(courses->items().at(0)->state(), Course::State::kActive); EXPECT_EQ(courses->items().at(1)->id(), "course-2"); EXPECT_EQ(courses->items().at(1)->name(), "Course Name 2"); + EXPECT_EQ(courses->items().at(1)->section(), ""); EXPECT_EQ(courses->items().at(1)->state(), Course::State::kOther); }
diff --git a/google_apis/classroom/classroom_api_list_courses_request.cc b/google_apis/classroom/classroom_api_list_courses_request.cc index 1e8d218..53f648d 100644 --- a/google_apis/classroom/classroom_api_list_courses_request.cc +++ b/google_apis/classroom/classroom_api_list_courses_request.cc
@@ -29,7 +29,7 @@ constexpr char kFieldsParameterName[] = "fields"; constexpr char kRequestedFields[] = - "courses(id,name,courseState),nextPageToken"; + "courses(id,name,section,courseState),nextPageToken"; constexpr char kCourseStatesParameterName[] = "courseStates"; constexpr char kPageTokenParameterName[] = "pageToken";
diff --git a/google_apis/classroom/classroom_api_list_courses_request_unittest.cc b/google_apis/classroom/classroom_api_list_courses_request_unittest.cc index f65acf2..002e62d2 100644 --- a/google_apis/classroom/classroom_api_list_courses_request_unittest.cc +++ b/google_apis/classroom/classroom_api_list_courses_request_unittest.cc
@@ -118,7 +118,8 @@ Field(&HttpRequest::method, Eq(HttpMethod::METHOD_GET)), Field(&HttpRequest::relative_url, Eq("/v1/courses" - "?fields=courses(id%2Cname%2CcourseState)%2CnextPageToken" + "?fields=courses(id%2Cname%2Csection%2CcourseState)" + "%2CnextPageToken" "&studentId=test1%40test.com" "&courseStates=ACTIVE"))))) .WillOnce(Return(ByMove(TestRequestHandler::CreateSuccessfulResponse()))); @@ -144,7 +145,8 @@ Field(&HttpRequest::method, Eq(HttpMethod::METHOD_GET)), Field(&HttpRequest::relative_url, Eq("/v1/courses" - "?fields=courses(id%2Cname%2CcourseState)%2CnextPageToken" + "?fields=courses(id%2Cname%2Csection%2CcourseState)" + "%2CnextPageToken" "&studentId=test1%40test.com" "&courseStates=ACTIVE" "&pageToken=qwerty"))))) @@ -170,7 +172,8 @@ Field(&HttpRequest::method, Eq(HttpMethod::METHOD_GET)), Field(&HttpRequest::relative_url, Eq("/v1/courses" - "?fields=courses(id%2Cname%2CcourseState)%2CnextPageToken" + "?fields=courses(id%2Cname%2Csection%2CcourseState)" + "%2CnextPageToken" "&studentId=test1%40test.com" "&courseStates=ACTIVE"))))) .WillOnce(Return(ByMove(TestRequestHandler::CreateFailedResponse()))); @@ -194,7 +197,8 @@ Field(&HttpRequest::method, Eq(HttpMethod::METHOD_GET)), Field(&HttpRequest::relative_url, Eq("/v1/courses" - "?fields=courses(id%2Cname%2CcourseState)%2CnextPageToken" + "?fields=courses(id%2Cname%2Csection%2CcourseState)" + "%2CnextPageToken" "&teacherId=teacher1%40test.com" "&courseStates=ACTIVE"))))) .WillOnce(Return(ByMove(TestRequestHandler::CreateSuccessfulResponse())));
diff --git a/headless/lib/browser/headless_web_contents_impl.cc b/headless/lib/browser/headless_web_contents_impl.cc index 2a4ca91..1253bb1 100644 --- a/headless/lib/browser/headless_web_contents_impl.cc +++ b/headless/lib/browser/headless_web_contents_impl.cc
@@ -398,6 +398,17 @@ SetBounds(initial_bounds); } +void HeadlessWebContentsImpl::SetWindowState(const std::string& state) { + if (state == "normal" || state == "maximized" || state == "fullscreen") { + web_contents_->WasShown(); + } else if (state == "minimized") { + web_contents_->WasHidden(); + } else { + NOTREACHED(); + } + window_state_ = state; +} + void HeadlessWebContentsImpl::SetBounds(const gfx::Rect& bounds) { browser()->PlatformSetWebContentsBounds(this, bounds); }
diff --git a/headless/lib/browser/headless_web_contents_impl.h b/headless/lib/browser/headless_web_contents_impl.h index d2ec70a9..337c7f47 100644 --- a/headless/lib/browser/headless_web_contents_impl.h +++ b/headless/lib/browser/headless_web_contents_impl.h
@@ -65,13 +65,11 @@ return window_tree_host_.get(); } int window_id() const { return window_id_; } - void set_window_state(const std::string& state) { - DCHECK(state == "normal" || state == "minimized" || state == "maximized" || - state == "fullscreen"); - window_state_ = state; - } const std::string& window_state() const { return window_state_; } + // Set the WebContent's platform window state and visibility. + void SetWindowState(const std::string& state); + // Set bounds of WebContent's platform window. void SetBounds(const gfx::Rect& bounds);
diff --git a/headless/lib/browser/protocol/browser_handler.cc b/headless/lib/browser/protocol/browser_handler.cc index 4451e4ef..558ca3b 100644 --- a/headless/lib/browser/protocol/browser_handler.cc +++ b/headless/lib/browser/protocol/browser_handler.cc
@@ -110,7 +110,7 @@ "state first."); } - web_contents->set_window_state(window_state); + web_contents->SetWindowState(window_state); web_contents->SetBounds(bounds); return Response::Success(); }
diff --git a/infra/config/generated/builders/build/ios-build-perf-developer/properties.json b/infra/config/generated/builders/build/ios-build-perf-developer/properties.json index a90ccec..ce685ce 100644 --- a/infra/config/generated/builders/build/ios-build-perf-developer/properties.json +++ b/infra/config/generated/builders/build/ios-build-perf-developer/properties.json
@@ -68,5 +68,5 @@ }, "builder_group": "chromium.build", "recipe": "chrome_build/build_perf_developer", - "xcode_build_version": "16b40" + "xcode_build_version": "16c5032a" } \ No newline at end of file
diff --git a/infra/config/generated/builders/build/ios-build-perf-ninja/properties.json b/infra/config/generated/builders/build/ios-build-perf-ninja/properties.json index 034c8d6..35acda9 100644 --- a/infra/config/generated/builders/build/ios-build-perf-ninja/properties.json +++ b/infra/config/generated/builders/build/ios-build-perf-ninja/properties.json
@@ -62,5 +62,5 @@ }, "builder_group": "chromium.build", "recipe": "chrome_build/build_perf", - "xcode_build_version": "16b40" + "xcode_build_version": "16c5032a" } \ No newline at end of file
diff --git a/infra/config/generated/builders/build/ios-build-perf-siso/properties.json b/infra/config/generated/builders/build/ios-build-perf-siso/properties.json index 3fba148..1e1b10e3 100644 --- a/infra/config/generated/builders/build/ios-build-perf-siso/properties.json +++ b/infra/config/generated/builders/build/ios-build-perf-siso/properties.json
@@ -74,5 +74,5 @@ }, "builder_group": "chromium.build", "recipe": "chrome_build/build_perf_siso", - "xcode_build_version": "16b40" + "xcode_build_version": "16c5032a" } \ No newline at end of file
diff --git a/infra/config/generated/builders/ci/Libfuzzer Upload iOS Catalyst Debug/properties.json b/infra/config/generated/builders/ci/Libfuzzer Upload iOS Catalyst Debug/properties.json index 0fadb4d..63c3455 100644 --- a/infra/config/generated/builders/ci/Libfuzzer Upload iOS Catalyst Debug/properties.json +++ b/infra/config/generated/builders/ci/Libfuzzer Upload iOS Catalyst Debug/properties.json
@@ -80,5 +80,5 @@ ], "upload_bucket": "chromium-browser-libfuzzer", "upload_directory": "ios-catalyst-debug", - "xcode_build_version": "16b40" + "xcode_build_version": "16c5032a" } \ No newline at end of file
diff --git a/infra/config/generated/builders/ci/ToTiOS/properties.json b/infra/config/generated/builders/ci/ToTiOS/properties.json index 11d8855d..0aa1237 100644 --- a/infra/config/generated/builders/ci/ToTiOS/properties.json +++ b/infra/config/generated/builders/ci/ToTiOS/properties.json
@@ -76,5 +76,5 @@ "sheriff_rotations": [ "chromium.clang" ], - "xcode_build_version": "16b40" + "xcode_build_version": "16c5032a" } \ No newline at end of file
diff --git a/infra/config/generated/builders/ci/ToTiOS/targets/chromium.clang.json b/infra/config/generated/builders/ci/ToTiOS/targets/chromium.clang.json index 1cc7250..5c1451df 100644 --- a/infra/config/generated/builders/ci/ToTiOS/targets/chromium.clang.json +++ b/infra/config/generated/builders/ci/ToTiOS/targets/chromium.clang.json
@@ -13,7 +13,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -42,7 +42,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -61,7 +61,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -90,7 +90,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ],
diff --git a/infra/config/generated/builders/ci/ToTiOSDevice/properties.json b/infra/config/generated/builders/ci/ToTiOSDevice/properties.json index ebe24ece..747c1ba 100644 --- a/infra/config/generated/builders/ci/ToTiOSDevice/properties.json +++ b/infra/config/generated/builders/ci/ToTiOSDevice/properties.json
@@ -76,5 +76,5 @@ "sheriff_rotations": [ "chromium.clang" ], - "xcode_build_version": "16b40" + "xcode_build_version": "16c5032a" } \ No newline at end of file
diff --git a/infra/config/generated/builders/ci/ToTiOSDevice/targets/chromium.clang.json b/infra/config/generated/builders/ci/ToTiOSDevice/targets/chromium.clang.json index d86b211..e067f399 100644 --- a/infra/config/generated/builders/ci/ToTiOSDevice/targets/chromium.clang.json +++ b/infra/config/generated/builders/ci/ToTiOSDevice/targets/chromium.clang.json
@@ -26,7 +26,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -53,7 +53,7 @@ "expiration": 21600, "named_caches": [ { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -69,7 +69,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -96,7 +96,7 @@ "expiration": 21600, "named_caches": [ { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ],
diff --git a/infra/config/generated/builders/ci/ios-angle-builder/targets/chromium.angle.json b/infra/config/generated/builders/ci/ios-angle-builder/targets/chromium.angle.json index 20c84f5..6661f4e9 100644 --- a/infra/config/generated/builders/ci/ios-angle-builder/targets/chromium.angle.json +++ b/infra/config/generated/builders/ci/ios-angle-builder/targets/chromium.angle.json
@@ -12,7 +12,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -45,7 +45,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -66,7 +66,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -99,7 +99,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -120,7 +120,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -153,7 +153,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -174,7 +174,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -207,7 +207,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ],
diff --git a/infra/config/generated/builders/ci/ios-angle-intel/targets/chromium.angle.json b/infra/config/generated/builders/ci/ios-angle-intel/targets/chromium.angle.json index e5fc7be..7366a6a 100644 --- a/infra/config/generated/builders/ci/ios-angle-intel/targets/chromium.angle.json +++ b/infra/config/generated/builders/ci/ios-angle-intel/targets/chromium.angle.json
@@ -11,7 +11,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -44,7 +44,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -65,7 +65,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -98,7 +98,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -119,7 +119,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -152,7 +152,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -173,7 +173,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -206,7 +206,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ],
diff --git a/infra/config/generated/builders/ci/ios-asan/properties.json b/infra/config/generated/builders/ci/ios-asan/properties.json index 2adff109..f9796db 100644 --- a/infra/config/generated/builders/ci/ios-asan/properties.json +++ b/infra/config/generated/builders/ci/ios-asan/properties.json
@@ -85,5 +85,5 @@ "sheriff_rotations": [ "ios" ], - "xcode_build_version": "16b40" + "xcode_build_version": "16c5032a" } \ No newline at end of file
diff --git a/infra/config/generated/builders/ci/ios-asan/targets/chromium.memory.json b/infra/config/generated/builders/ci/ios-asan/targets/chromium.memory.json index adb64f6..34c7d516 100644 --- a/infra/config/generated/builders/ci/ios-asan/targets/chromium.memory.json +++ b/infra/config/generated/builders/ci/ios-asan/targets/chromium.memory.json
@@ -13,7 +13,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -42,7 +42,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -61,7 +61,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -90,7 +90,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -109,7 +109,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -138,7 +138,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -157,7 +157,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -186,7 +186,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -205,7 +205,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -234,7 +234,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -253,7 +253,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -282,7 +282,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -301,7 +301,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -330,7 +330,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -349,7 +349,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -378,7 +378,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -397,7 +397,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -426,7 +426,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -445,7 +445,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -474,7 +474,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -493,7 +493,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -522,7 +522,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -541,7 +541,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -570,7 +570,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -589,7 +589,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -618,7 +618,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -637,7 +637,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -666,7 +666,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -685,7 +685,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -714,7 +714,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -733,7 +733,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -762,7 +762,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -781,7 +781,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -810,7 +810,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -829,7 +829,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -858,7 +858,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -878,7 +878,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -907,7 +907,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -928,7 +928,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -957,7 +957,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -978,7 +978,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1007,7 +1007,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1028,7 +1028,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1057,7 +1057,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1080,7 +1080,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1109,7 +1109,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1132,7 +1132,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1161,7 +1161,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1184,7 +1184,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1213,7 +1213,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1236,7 +1236,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1265,7 +1265,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1288,7 +1288,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1317,7 +1317,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1340,7 +1340,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1369,7 +1369,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1392,7 +1392,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1421,7 +1421,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1444,7 +1444,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1473,7 +1473,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1494,7 +1494,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1523,7 +1523,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1544,7 +1544,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1573,7 +1573,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1594,7 +1594,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1623,7 +1623,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1644,7 +1644,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1673,7 +1673,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1694,7 +1694,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1723,7 +1723,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1743,7 +1743,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1772,7 +1772,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1792,7 +1792,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1821,7 +1821,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1841,7 +1841,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1870,7 +1870,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1892,7 +1892,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1921,7 +1921,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1944,7 +1944,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1973,7 +1973,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1996,7 +1996,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2025,7 +2025,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2048,7 +2048,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2077,7 +2077,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2097,7 +2097,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2126,7 +2126,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2145,7 +2145,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2174,7 +2174,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2194,7 +2194,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2223,7 +2223,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2244,7 +2244,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2273,7 +2273,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2294,7 +2294,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2323,7 +2323,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2344,7 +2344,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2373,7 +2373,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2393,7 +2393,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2422,7 +2422,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2441,7 +2441,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2470,7 +2470,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2489,7 +2489,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2518,7 +2518,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2538,7 +2538,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2567,7 +2567,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2587,7 +2587,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2616,7 +2616,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2635,7 +2635,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2664,7 +2664,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2683,7 +2683,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2712,7 +2712,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2731,7 +2731,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2760,7 +2760,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2780,7 +2780,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2809,7 +2809,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2829,7 +2829,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2858,7 +2858,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2878,7 +2878,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2907,7 +2907,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2927,7 +2927,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2956,7 +2956,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2975,7 +2975,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3004,7 +3004,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3023,7 +3023,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3052,7 +3052,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3071,7 +3071,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3100,7 +3100,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3119,7 +3119,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3148,7 +3148,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3167,7 +3167,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3196,7 +3196,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3215,7 +3215,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3244,7 +3244,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3263,7 +3263,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3292,7 +3292,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3311,7 +3311,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3340,7 +3340,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3359,7 +3359,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3388,7 +3388,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3407,7 +3407,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3436,7 +3436,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3455,7 +3455,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3484,7 +3484,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3503,7 +3503,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3532,7 +3532,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3551,7 +3551,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3580,7 +3580,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3599,7 +3599,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3628,7 +3628,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3647,7 +3647,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3676,7 +3676,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3695,7 +3695,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3724,7 +3724,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3743,7 +3743,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3772,7 +3772,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3791,7 +3791,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3820,7 +3820,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ],
diff --git a/infra/config/generated/builders/ci/ios-blink-dbg-fyi/properties.json b/infra/config/generated/builders/ci/ios-blink-dbg-fyi/properties.json index 0d48b08..9f4adc2 100644 --- a/infra/config/generated/builders/ci/ios-blink-dbg-fyi/properties.json +++ b/infra/config/generated/builders/ci/ios-blink-dbg-fyi/properties.json
@@ -73,5 +73,5 @@ }, "builder_group": "chromium.fyi", "recipe": "chromium", - "xcode_build_version": "16b40" + "xcode_build_version": "16c5032a" } \ No newline at end of file
diff --git a/infra/config/generated/builders/ci/ios-blink-dbg-fyi/targets/chromium.fyi.json b/infra/config/generated/builders/ci/ios-blink-dbg-fyi/targets/chromium.fyi.json index 35764137..7bc72d0e 100644 --- a/infra/config/generated/builders/ci/ios-blink-dbg-fyi/targets/chromium.fyi.json +++ b/infra/config/generated/builders/ci/ios-blink-dbg-fyi/targets/chromium.fyi.json
@@ -13,7 +13,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -42,7 +42,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -61,7 +61,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -90,7 +90,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -109,7 +109,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -138,7 +138,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -158,7 +158,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -187,7 +187,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -209,7 +209,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -238,7 +238,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -259,7 +259,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -288,7 +288,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -307,7 +307,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -336,7 +336,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -355,7 +355,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -384,7 +384,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -403,7 +403,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -432,7 +432,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -451,7 +451,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -480,7 +480,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -499,7 +499,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -528,7 +528,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -547,7 +547,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -576,7 +576,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -598,7 +598,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -632,7 +632,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -654,7 +654,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -688,7 +688,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -707,7 +707,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -736,7 +736,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -755,7 +755,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -784,7 +784,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -803,7 +803,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -832,7 +832,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -851,7 +851,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -880,7 +880,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -899,7 +899,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -928,7 +928,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -947,7 +947,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -976,7 +976,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -995,7 +995,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1024,7 +1024,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1043,7 +1043,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1072,7 +1072,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1094,7 +1094,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1123,7 +1123,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1145,7 +1145,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1174,7 +1174,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1195,7 +1195,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1224,7 +1224,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1245,7 +1245,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1274,7 +1274,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1295,7 +1295,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1324,7 +1324,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1345,7 +1345,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1374,7 +1374,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1395,7 +1395,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1424,7 +1424,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1445,7 +1445,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1474,7 +1474,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1495,7 +1495,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1524,7 +1524,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1545,7 +1545,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1574,7 +1574,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1595,7 +1595,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1624,7 +1624,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1645,7 +1645,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1674,7 +1674,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1693,7 +1693,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1722,7 +1722,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1741,7 +1741,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1770,7 +1770,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1789,7 +1789,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1818,7 +1818,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1837,7 +1837,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1866,7 +1866,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1885,7 +1885,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1914,7 +1914,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1933,7 +1933,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1962,7 +1962,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1981,7 +1981,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2010,7 +2010,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2029,7 +2029,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2058,7 +2058,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2077,7 +2077,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2106,7 +2106,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2125,7 +2125,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2154,7 +2154,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2173,7 +2173,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2202,7 +2202,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2221,7 +2221,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2250,7 +2250,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2269,7 +2269,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2298,7 +2298,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2317,7 +2317,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2346,7 +2346,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2367,7 +2367,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2396,7 +2396,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2417,7 +2417,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2446,7 +2446,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2465,7 +2465,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2494,7 +2494,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2513,7 +2513,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2542,7 +2542,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2561,7 +2561,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2590,7 +2590,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2609,7 +2609,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2638,7 +2638,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2657,7 +2657,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2686,7 +2686,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2705,7 +2705,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2734,7 +2734,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2755,7 +2755,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2784,7 +2784,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2805,7 +2805,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2834,7 +2834,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2853,7 +2853,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2882,7 +2882,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2901,7 +2901,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2930,7 +2930,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2949,7 +2949,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2978,7 +2978,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2997,7 +2997,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3026,7 +3026,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3045,7 +3045,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3074,7 +3074,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3093,7 +3093,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3122,7 +3122,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3141,7 +3141,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3170,7 +3170,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3189,7 +3189,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3218,7 +3218,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3237,7 +3237,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3266,7 +3266,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3285,7 +3285,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3314,7 +3314,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3335,7 +3335,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3364,7 +3364,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3385,7 +3385,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3414,7 +3414,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3439,7 +3439,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3468,7 +3468,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3493,7 +3493,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3522,7 +3522,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3547,7 +3547,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3576,7 +3576,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3601,7 +3601,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3630,7 +3630,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3649,7 +3649,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3678,7 +3678,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3697,7 +3697,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3726,7 +3726,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3747,7 +3747,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3776,7 +3776,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3797,7 +3797,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3826,7 +3826,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3845,7 +3845,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3874,7 +3874,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3893,7 +3893,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3922,7 +3922,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3941,7 +3941,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3970,7 +3970,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3989,7 +3989,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -4018,7 +4018,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4037,7 +4037,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -4066,7 +4066,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4085,7 +4085,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -4114,7 +4114,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4133,7 +4133,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -4162,7 +4162,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4181,7 +4181,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -4210,7 +4210,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4229,7 +4229,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -4258,7 +4258,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4277,7 +4277,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -4306,7 +4306,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4325,7 +4325,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -4354,7 +4354,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4373,7 +4373,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -4402,7 +4402,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4421,7 +4421,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -4450,7 +4450,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4469,7 +4469,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -4498,7 +4498,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4517,7 +4517,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -4546,7 +4546,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4565,7 +4565,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -4594,7 +4594,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4613,7 +4613,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -4642,7 +4642,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4661,7 +4661,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -4690,7 +4690,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4709,7 +4709,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -4738,7 +4738,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4757,7 +4757,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -4786,7 +4786,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4806,7 +4806,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -4835,7 +4835,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4855,7 +4855,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -4884,7 +4884,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4903,7 +4903,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -4932,7 +4932,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4951,7 +4951,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -4980,7 +4980,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4999,7 +4999,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -5028,7 +5028,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5047,7 +5047,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -5076,7 +5076,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5095,7 +5095,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -5124,7 +5124,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5143,7 +5143,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -5172,7 +5172,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5194,7 +5194,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -5223,7 +5223,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5245,7 +5245,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -5274,7 +5274,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5293,7 +5293,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -5322,7 +5322,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5341,7 +5341,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -5370,7 +5370,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5389,7 +5389,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -5418,7 +5418,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5437,7 +5437,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -5466,7 +5466,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ],
diff --git a/infra/config/generated/builders/ci/ios-catalyst/properties.json b/infra/config/generated/builders/ci/ios-catalyst/properties.json index cae5dbe..1939913 100644 --- a/infra/config/generated/builders/ci/ios-catalyst/properties.json +++ b/infra/config/generated/builders/ci/ios-catalyst/properties.json
@@ -82,5 +82,5 @@ "chromium", "ios" ], - "xcode_build_version": "16b40" + "xcode_build_version": "16c5032a" } \ No newline at end of file
diff --git a/infra/config/generated/builders/ci/ios-device/properties.json b/infra/config/generated/builders/ci/ios-device/properties.json index b2082cd31..801c5e11 100644 --- a/infra/config/generated/builders/ci/ios-device/properties.json +++ b/infra/config/generated/builders/ci/ios-device/properties.json
@@ -82,5 +82,5 @@ "chromium", "ios" ], - "xcode_build_version": "16b40" + "xcode_build_version": "16c5032a" } \ No newline at end of file
diff --git a/infra/config/generated/builders/ci/ios-fieldtrial-rel/properties.json b/infra/config/generated/builders/ci/ios-fieldtrial-rel/properties.json index 197bb92..c0e639a 100644 --- a/infra/config/generated/builders/ci/ios-fieldtrial-rel/properties.json +++ b/infra/config/generated/builders/ci/ios-fieldtrial-rel/properties.json
@@ -72,5 +72,5 @@ }, "builder_group": "chromium.fyi", "recipe": "chromium", - "xcode_build_version": "16b40" + "xcode_build_version": "16c5032a" } \ No newline at end of file
diff --git a/infra/config/generated/builders/ci/ios-fieldtrial-rel/targets/chromium.fyi.json b/infra/config/generated/builders/ci/ios-fieldtrial-rel/targets/chromium.fyi.json index 526bd326..1e09e3e8 100644 --- a/infra/config/generated/builders/ci/ios-fieldtrial-rel/targets/chromium.fyi.json +++ b/infra/config/generated/builders/ci/ios-fieldtrial-rel/targets/chromium.fyi.json
@@ -12,7 +12,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -42,7 +42,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -64,7 +64,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -94,7 +94,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -118,7 +118,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -148,7 +148,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -172,7 +172,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -202,7 +202,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -226,7 +226,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -256,7 +256,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -280,7 +280,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -310,7 +310,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -332,7 +332,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -362,7 +362,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -384,7 +384,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -414,7 +414,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -436,7 +436,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -466,7 +466,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -487,7 +487,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -517,7 +517,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -540,7 +540,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -570,7 +570,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -594,7 +594,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -624,7 +624,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -646,7 +646,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -676,7 +676,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -698,7 +698,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -728,7 +728,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -750,7 +750,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -780,7 +780,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -801,7 +801,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -831,7 +831,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ],
diff --git a/infra/config/generated/builders/ci/ios-simulator-code-coverage/properties.json b/infra/config/generated/builders/ci/ios-simulator-code-coverage/properties.json index 43c8429..b2195b0a 100644 --- a/infra/config/generated/builders/ci/ios-simulator-code-coverage/properties.json +++ b/infra/config/generated/builders/ci/ios-simulator-code-coverage/properties.json
@@ -85,5 +85,5 @@ }, "builder_group": "chromium.coverage", "recipe": "chromium", - "xcode_build_version": "16b40" + "xcode_build_version": "16c5032a" } \ No newline at end of file
diff --git a/infra/config/generated/builders/ci/ios-simulator-code-coverage/targets/chromium.coverage.json b/infra/config/generated/builders/ci/ios-simulator-code-coverage/targets/chromium.coverage.json index 70030528..a3e2a8b 100644 --- a/infra/config/generated/builders/ci/ios-simulator-code-coverage/targets/chromium.coverage.json +++ b/infra/config/generated/builders/ci/ios-simulator-code-coverage/targets/chromium.coverage.json
@@ -11,7 +11,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -41,7 +41,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -61,7 +61,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -91,7 +91,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -111,7 +111,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -141,7 +141,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -161,7 +161,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -191,7 +191,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -211,7 +211,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -241,7 +241,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -261,7 +261,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -291,7 +291,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -311,7 +311,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -341,7 +341,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -361,7 +361,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -391,7 +391,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -411,7 +411,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -441,7 +441,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -461,7 +461,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -491,7 +491,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -511,7 +511,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -541,7 +541,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -561,7 +561,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -591,7 +591,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -611,7 +611,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -641,7 +641,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -661,7 +661,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -691,7 +691,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -711,7 +711,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -741,7 +741,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -761,7 +761,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -791,7 +791,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -811,7 +811,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -841,7 +841,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -861,7 +861,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -891,7 +891,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -911,7 +911,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -941,7 +941,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -961,7 +961,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -991,7 +991,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1011,7 +1011,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -1041,7 +1041,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1061,7 +1061,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -1091,7 +1091,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1111,7 +1111,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -1141,7 +1141,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1161,7 +1161,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -1191,7 +1191,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1211,7 +1211,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -1241,7 +1241,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1261,7 +1261,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -1291,7 +1291,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1311,7 +1311,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -1341,7 +1341,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1361,7 +1361,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -1391,7 +1391,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1411,7 +1411,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -1441,7 +1441,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1461,7 +1461,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -1491,7 +1491,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1511,7 +1511,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -1541,7 +1541,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1561,7 +1561,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -1591,7 +1591,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1611,7 +1611,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -1641,7 +1641,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1661,7 +1661,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -1691,7 +1691,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1711,7 +1711,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -1741,7 +1741,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1761,7 +1761,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -1791,7 +1791,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1812,7 +1812,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -1842,7 +1842,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1864,7 +1864,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -1894,7 +1894,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1916,7 +1916,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -1946,7 +1946,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1968,7 +1968,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -1998,7 +1998,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2020,7 +2020,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -2050,7 +2050,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2072,7 +2072,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -2102,7 +2102,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2126,7 +2126,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -2156,7 +2156,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2180,7 +2180,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -2210,7 +2210,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2234,7 +2234,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -2264,7 +2264,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2288,7 +2288,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -2318,7 +2318,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2342,7 +2342,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -2372,7 +2372,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2396,7 +2396,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -2426,7 +2426,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2450,7 +2450,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -2480,7 +2480,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2504,7 +2504,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -2534,7 +2534,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2558,7 +2558,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -2588,7 +2588,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2612,7 +2612,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -2642,7 +2642,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2666,7 +2666,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -2696,7 +2696,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2720,7 +2720,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -2750,7 +2750,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2774,7 +2774,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -2804,7 +2804,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2828,7 +2828,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -2858,7 +2858,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2882,7 +2882,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -2912,7 +2912,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2934,7 +2934,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -2964,7 +2964,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2986,7 +2986,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -3016,7 +3016,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3038,7 +3038,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -3068,7 +3068,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3090,7 +3090,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -3120,7 +3120,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3142,7 +3142,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -3172,7 +3172,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3194,7 +3194,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -3224,7 +3224,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3246,7 +3246,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -3276,7 +3276,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3297,7 +3297,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -3327,7 +3327,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3348,7 +3348,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -3378,7 +3378,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3399,7 +3399,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -3429,7 +3429,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3450,7 +3450,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -3480,7 +3480,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3501,7 +3501,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -3531,7 +3531,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3554,7 +3554,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -3584,7 +3584,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3608,7 +3608,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -3638,7 +3638,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3662,7 +3662,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -3692,7 +3692,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3716,7 +3716,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -3746,7 +3746,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3770,7 +3770,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -3800,7 +3800,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3824,7 +3824,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -3854,7 +3854,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3875,7 +3875,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -3905,7 +3905,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3925,7 +3925,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -3955,7 +3955,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3975,7 +3975,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -4005,7 +4005,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4025,7 +4025,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -4055,7 +4055,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4075,7 +4075,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -4105,7 +4105,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4125,7 +4125,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -4155,7 +4155,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4176,7 +4176,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -4206,7 +4206,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4228,7 +4228,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -4258,7 +4258,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4280,7 +4280,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -4310,7 +4310,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4332,7 +4332,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -4362,7 +4362,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4384,7 +4384,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -4414,7 +4414,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4436,7 +4436,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -4466,7 +4466,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4487,7 +4487,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -4517,7 +4517,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4537,7 +4537,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -4567,7 +4567,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4587,7 +4587,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -4617,7 +4617,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4637,7 +4637,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -4667,7 +4667,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4688,7 +4688,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -4718,7 +4718,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4739,7 +4739,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -4769,7 +4769,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4790,7 +4790,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -4820,7 +4820,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4840,7 +4840,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -4870,7 +4870,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4890,7 +4890,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -4920,7 +4920,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4940,7 +4940,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -4970,7 +4970,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4990,7 +4990,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -5020,7 +5020,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5040,7 +5040,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -5070,7 +5070,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5090,7 +5090,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -5120,7 +5120,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5140,7 +5140,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -5170,7 +5170,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5190,7 +5190,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -5220,7 +5220,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5241,7 +5241,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -5271,7 +5271,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5292,7 +5292,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -5322,7 +5322,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5343,7 +5343,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -5373,7 +5373,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5394,7 +5394,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -5424,7 +5424,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5445,7 +5445,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -5475,7 +5475,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5496,7 +5496,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -5526,7 +5526,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5547,7 +5547,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -5577,7 +5577,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5598,7 +5598,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -5628,7 +5628,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5649,7 +5649,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -5679,7 +5679,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5699,7 +5699,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -5729,7 +5729,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5749,7 +5749,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -5779,7 +5779,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5799,7 +5799,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -5829,7 +5829,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5849,7 +5849,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -5879,7 +5879,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5899,7 +5899,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -5929,7 +5929,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5949,7 +5949,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -5979,7 +5979,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5999,7 +5999,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -6029,7 +6029,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -6049,7 +6049,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -6079,7 +6079,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -6099,7 +6099,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -6129,7 +6129,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -6149,7 +6149,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -6179,7 +6179,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -6199,7 +6199,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -6229,7 +6229,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -6249,7 +6249,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -6279,7 +6279,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -6299,7 +6299,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -6329,7 +6329,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -6349,7 +6349,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -6379,7 +6379,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -6399,7 +6399,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -6429,7 +6429,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -6449,7 +6449,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -6479,7 +6479,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -6499,7 +6499,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -6529,7 +6529,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -6549,7 +6549,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -6579,7 +6579,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -6599,7 +6599,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -6629,7 +6629,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -6649,7 +6649,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -6679,7 +6679,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -6699,7 +6699,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -6729,7 +6729,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -6749,7 +6749,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -6779,7 +6779,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -6799,7 +6799,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -6829,7 +6829,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -6849,7 +6849,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -6879,7 +6879,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -6899,7 +6899,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -6929,7 +6929,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -6949,7 +6949,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -6979,7 +6979,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -6999,7 +6999,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -7029,7 +7029,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -7049,7 +7049,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -7079,7 +7079,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -7099,7 +7099,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -7129,7 +7129,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -7149,7 +7149,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -7179,7 +7179,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -7199,7 +7199,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -7229,7 +7229,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -7249,7 +7249,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -7279,7 +7279,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -7299,7 +7299,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -7329,7 +7329,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -7349,7 +7349,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -7379,7 +7379,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -7399,7 +7399,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -7429,7 +7429,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -7449,7 +7449,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -7479,7 +7479,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -7499,7 +7499,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -7529,7 +7529,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -7549,7 +7549,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -7579,7 +7579,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -7599,7 +7599,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -7629,7 +7629,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -7649,7 +7649,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -7679,7 +7679,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -7699,7 +7699,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -7729,7 +7729,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -7749,7 +7749,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -7779,7 +7779,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ],
diff --git a/infra/config/generated/builders/ci/ios-simulator-full-configs/properties.json b/infra/config/generated/builders/ci/ios-simulator-full-configs/properties.json index 1c335ca..c462d3e 100644 --- a/infra/config/generated/builders/ci/ios-simulator-full-configs/properties.json +++ b/infra/config/generated/builders/ci/ios-simulator-full-configs/properties.json
@@ -85,5 +85,5 @@ "chromium", "ios" ], - "xcode_build_version": "16b40" + "xcode_build_version": "16c5032a" } \ No newline at end of file
diff --git a/infra/config/generated/builders/ci/ios-simulator-full-configs/targets/chromium.mac.json b/infra/config/generated/builders/ci/ios-simulator-full-configs/targets/chromium.mac.json index ce45ba9..dca346c1f 100644 --- a/infra/config/generated/builders/ci/ios-simulator-full-configs/targets/chromium.mac.json +++ b/infra/config/generated/builders/ci/ios-simulator-full-configs/targets/chromium.mac.json
@@ -13,7 +13,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -43,7 +43,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -63,18 +63,18 @@ "--platform", "iPhone 14 Plus", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "absl_hardening_tests iPhone 14 Plus 18.1", + "name": "absl_hardening_tests iPhone 14 Plus 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -93,11 +93,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -110,7 +110,7 @@ }, "test": "absl_hardening_tests", "test_id_prefix": "ninja://third_party/abseil-cpp:absl_hardening_tests/", - "variant_id": "iPhone 14 Plus 18.1" + "variant_id": "iPhone 14 Plus 18.2" }, { "args": [ @@ -121,7 +121,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -151,7 +151,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -171,18 +171,18 @@ "--platform", "iPad Pro 13-inch (M4)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "base_unittests iPad Pro 13-inch (M4) 18.1", + "name": "base_unittests iPad Pro 13-inch (M4) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -201,11 +201,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -218,7 +218,7 @@ }, "test": "base_unittests", "test_id_prefix": "ninja://base:base_unittests/", - "variant_id": "iPad Pro 13-inch (M4) 18.1" + "variant_id": "iPad Pro 13-inch (M4) 18.2" }, { "args": [ @@ -229,7 +229,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -259,7 +259,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -279,18 +279,18 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "base_unittests iPhone 15 18.1", + "name": "base_unittests iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -309,11 +309,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -326,7 +326,7 @@ }, "test": "base_unittests", "test_id_prefix": "ninja://base:base_unittests/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" }, { "args": [ @@ -337,7 +337,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -367,7 +367,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -387,18 +387,18 @@ "--platform", "iPhone 14 Plus", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "boringssl_crypto_tests iPhone 14 Plus 18.1", + "name": "boringssl_crypto_tests iPhone 14 Plus 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -417,11 +417,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -434,7 +434,7 @@ }, "test": "boringssl_crypto_tests", "test_id_prefix": "ninja://third_party/boringssl:boringssl_crypto_tests/", - "variant_id": "iPhone 14 Plus 18.1" + "variant_id": "iPhone 14 Plus 18.2" }, { "args": [ @@ -445,7 +445,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -475,7 +475,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -495,18 +495,18 @@ "--platform", "iPhone 14 Plus", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "boringssl_ssl_tests iPhone 14 Plus 18.1", + "name": "boringssl_ssl_tests iPhone 14 Plus 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -525,11 +525,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -542,7 +542,7 @@ }, "test": "boringssl_ssl_tests", "test_id_prefix": "ninja://third_party/boringssl:boringssl_ssl_tests/", - "variant_id": "iPhone 14 Plus 18.1" + "variant_id": "iPhone 14 Plus 18.2" }, { "args": [ @@ -553,7 +553,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -583,7 +583,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -603,18 +603,18 @@ "--platform", "iPad Pro 13-inch (M4)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "components_unittests iPad Pro 13-inch (M4) 18.1", + "name": "components_unittests iPad Pro 13-inch (M4) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -633,11 +633,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -650,7 +650,7 @@ }, "test": "components_unittests", "test_id_prefix": "ninja://components:components_unittests/", - "variant_id": "iPad Pro 13-inch (M4) 18.1" + "variant_id": "iPad Pro 13-inch (M4) 18.2" }, { "args": [ @@ -661,7 +661,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -691,7 +691,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -711,18 +711,18 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "components_unittests iPhone 15 18.1", + "name": "components_unittests iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -741,11 +741,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -758,7 +758,7 @@ }, "test": "components_unittests", "test_id_prefix": "ninja://components:components_unittests/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" }, { "args": [ @@ -769,7 +769,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -799,7 +799,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -819,18 +819,18 @@ "--platform", "iPhone 14 Plus", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "crashpad_tests iPhone 14 Plus 18.1", + "name": "crashpad_tests iPhone 14 Plus 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -849,11 +849,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -866,7 +866,7 @@ }, "test": "crashpad_tests", "test_id_prefix": "ninja://third_party/crashpad/crashpad:crashpad_tests/", - "variant_id": "iPhone 14 Plus 18.1" + "variant_id": "iPhone 14 Plus 18.2" }, { "args": [ @@ -877,7 +877,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -907,7 +907,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -927,18 +927,18 @@ "--platform", "iPhone 14 Plus", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "crypto_unittests iPhone 14 Plus 18.1", + "name": "crypto_unittests iPhone 14 Plus 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -957,11 +957,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -974,7 +974,7 @@ }, "test": "crypto_unittests", "test_id_prefix": "ninja://crypto:crypto_unittests/", - "variant_id": "iPhone 14 Plus 18.1" + "variant_id": "iPhone 14 Plus 18.2" }, { "args": [ @@ -985,7 +985,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -1015,7 +1015,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1035,18 +1035,18 @@ "--platform", "iPad Pro 13-inch (M4)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "gfx_unittests iPad Pro 13-inch (M4) 18.1", + "name": "gfx_unittests iPad Pro 13-inch (M4) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -1065,11 +1065,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1082,7 +1082,7 @@ }, "test": "gfx_unittests", "test_id_prefix": "ninja://ui/gfx:gfx_unittests/", - "variant_id": "iPad Pro 13-inch (M4) 18.1" + "variant_id": "iPad Pro 13-inch (M4) 18.2" }, { "args": [ @@ -1093,7 +1093,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -1123,7 +1123,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1143,18 +1143,18 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "gfx_unittests iPhone 15 18.1", + "name": "gfx_unittests iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -1173,11 +1173,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1190,7 +1190,7 @@ }, "test": "gfx_unittests", "test_id_prefix": "ninja://ui/gfx:gfx_unittests/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" }, { "args": [ @@ -1201,7 +1201,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -1231,7 +1231,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1251,18 +1251,18 @@ "--platform", "iPhone 14 Plus", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "google_apis_unittests iPhone 14 Plus 18.1", + "name": "google_apis_unittests iPhone 14 Plus 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -1281,11 +1281,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1298,7 +1298,7 @@ }, "test": "google_apis_unittests", "test_id_prefix": "ninja://google_apis:google_apis_unittests/", - "variant_id": "iPhone 14 Plus 18.1" + "variant_id": "iPhone 14 Plus 18.2" }, { "args": [ @@ -1310,7 +1310,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -1340,7 +1340,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1356,19 +1356,19 @@ "--platform", "iPad Pro 13-inch (M4)", "--version", - "18.1", + "18.2", "--xcodebuild-sim-runner", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_bookmarks_eg2tests_module iPad Pro 13-inch (M4) 18.1", + "name": "ios_chrome_bookmarks_eg2tests_module iPad Pro 13-inch (M4) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -1387,11 +1387,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1400,7 +1400,7 @@ }, "test": "ios_chrome_bookmarks_eg2tests_module", "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/", - "variant_id": "iPad Pro 13-inch (M4) 18.1" + "variant_id": "iPad Pro 13-inch (M4) 18.2" }, { "args": [ @@ -1412,7 +1412,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -1442,7 +1442,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1458,19 +1458,19 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--xcodebuild-sim-runner", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_bookmarks_eg2tests_module iPhone 15 18.1", + "name": "ios_chrome_bookmarks_eg2tests_module iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -1489,11 +1489,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1502,7 +1502,7 @@ }, "test": "ios_chrome_bookmarks_eg2tests_module", "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" }, { "args": [ @@ -1516,7 +1516,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -1546,7 +1546,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1564,19 +1564,19 @@ "--platform", "iPad Air 11-inch (M2)", "--version", - "18.1", + "18.2", "--xcodebuild-sim-runner", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_integration_eg2tests_module iPad Air (6th generation) 18.1", + "name": "ios_chrome_integration_eg2tests_module iPad Air (6th generation) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -1595,11 +1595,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1608,7 +1608,7 @@ }, "test": "ios_chrome_integration_eg2tests_module", "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/", - "variant_id": "iPad Air (6th generation) 18.1" + "variant_id": "iPad Air (6th generation) 18.2" }, { "args": [ @@ -1622,7 +1622,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -1652,7 +1652,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1670,19 +1670,19 @@ "--platform", "iPad Pro 13-inch (M4)", "--version", - "18.1", + "18.2", "--xcodebuild-sim-runner", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_integration_eg2tests_module iPad Pro 13-inch (M4) 18.1", + "name": "ios_chrome_integration_eg2tests_module iPad Pro 13-inch (M4) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -1701,11 +1701,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1714,7 +1714,7 @@ }, "test": "ios_chrome_integration_eg2tests_module", "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/", - "variant_id": "iPad Pro 13-inch (M4) 18.1" + "variant_id": "iPad Pro 13-inch (M4) 18.2" }, { "args": [ @@ -1728,7 +1728,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -1758,7 +1758,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1776,19 +1776,19 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--xcodebuild-sim-runner", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_integration_eg2tests_module iPhone 15 18.1", + "name": "ios_chrome_integration_eg2tests_module iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -1807,11 +1807,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1820,7 +1820,7 @@ }, "test": "ios_chrome_integration_eg2tests_module", "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" }, { "args": [ @@ -1834,7 +1834,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -1864,7 +1864,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1882,19 +1882,19 @@ "--platform", "iPad Pro 13-inch (M4)", "--version", - "18.1", + "18.2", "--xcodebuild-sim-runner", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_settings_eg2tests_module iPad Pro 13-inch (M4) 18.1", + "name": "ios_chrome_settings_eg2tests_module iPad Pro 13-inch (M4) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -1913,11 +1913,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1926,7 +1926,7 @@ }, "test": "ios_chrome_settings_eg2tests_module", "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/", - "variant_id": "iPad Pro 13-inch (M4) 18.1" + "variant_id": "iPad Pro 13-inch (M4) 18.2" }, { "args": [ @@ -1940,7 +1940,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -1970,7 +1970,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1988,19 +1988,19 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--xcodebuild-sim-runner", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_settings_eg2tests_module iPhone 15 18.1", + "name": "ios_chrome_settings_eg2tests_module iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -2019,11 +2019,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2032,7 +2032,7 @@ }, "test": "ios_chrome_settings_eg2tests_module", "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" }, { "args": [ @@ -2044,7 +2044,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -2074,7 +2074,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2090,19 +2090,19 @@ "--platform", "iPad Pro 13-inch (M4)", "--version", - "18.1", + "18.2", "--xcodebuild-sim-runner", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_signin_eg2tests_module iPad Pro 13-inch (M4) 18.1", + "name": "ios_chrome_signin_eg2tests_module iPad Pro 13-inch (M4) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -2121,11 +2121,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2134,7 +2134,7 @@ }, "test": "ios_chrome_signin_eg2tests_module", "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/", - "variant_id": "iPad Pro 13-inch (M4) 18.1" + "variant_id": "iPad Pro 13-inch (M4) 18.2" }, { "args": [ @@ -2146,7 +2146,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -2176,7 +2176,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2192,19 +2192,19 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--xcodebuild-sim-runner", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_signin_eg2tests_module iPhone 15 18.1", + "name": "ios_chrome_signin_eg2tests_module iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -2223,11 +2223,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2236,7 +2236,7 @@ }, "test": "ios_chrome_signin_eg2tests_module", "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" }, { "args": [ @@ -2248,7 +2248,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -2278,7 +2278,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2293,19 +2293,19 @@ "--platform", "iPad Pro 13-inch (M4)", "--version", - "18.1", + "18.2", "--xcodebuild-sim-runner", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_smoke_eg2tests_module iPad Pro 13-inch (M4) 18.1", + "name": "ios_chrome_smoke_eg2tests_module iPad Pro 13-inch (M4) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -2324,11 +2324,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2336,7 +2336,7 @@ }, "test": "ios_chrome_smoke_eg2tests_module", "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/", - "variant_id": "iPad Pro 13-inch (M4) 18.1" + "variant_id": "iPad Pro 13-inch (M4) 18.2" }, { "args": [ @@ -2348,7 +2348,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -2378,7 +2378,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2393,19 +2393,19 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--xcodebuild-sim-runner", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_smoke_eg2tests_module iPhone 15 18.1", + "name": "ios_chrome_smoke_eg2tests_module iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -2424,11 +2424,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2436,7 +2436,7 @@ }, "test": "ios_chrome_smoke_eg2tests_module", "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" }, { "args": [ @@ -2450,7 +2450,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -2480,7 +2480,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2498,19 +2498,19 @@ "--platform", "iPad Pro 13-inch (M4)", "--version", - "18.1", + "18.2", "--xcodebuild-sim-runner", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_ui_eg2tests_module iPad Pro 13-inch (M4) 18.1", + "name": "ios_chrome_ui_eg2tests_module iPad Pro 13-inch (M4) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -2529,11 +2529,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2542,7 +2542,7 @@ }, "test": "ios_chrome_ui_eg2tests_module", "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/", - "variant_id": "iPad Pro 13-inch (M4) 18.1" + "variant_id": "iPad Pro 13-inch (M4) 18.2" }, { "args": [ @@ -2556,7 +2556,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -2586,7 +2586,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2604,19 +2604,19 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--xcodebuild-sim-runner", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_ui_eg2tests_module iPhone 15 18.1", + "name": "ios_chrome_ui_eg2tests_module iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -2635,11 +2635,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2648,7 +2648,7 @@ }, "test": "ios_chrome_ui_eg2tests_module", "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" }, { "args": [ @@ -2659,7 +2659,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -2689,7 +2689,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2709,18 +2709,18 @@ "--platform", "iPad Pro 13-inch (M4)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_unittests iPad Pro 13-inch (M4) 18.1", + "name": "ios_chrome_unittests iPad Pro 13-inch (M4) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -2739,11 +2739,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2756,7 +2756,7 @@ }, "test": "ios_chrome_unittests", "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/", - "variant_id": "iPad Pro 13-inch (M4) 18.1" + "variant_id": "iPad Pro 13-inch (M4) 18.2" }, { "args": [ @@ -2767,7 +2767,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -2797,7 +2797,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2817,18 +2817,18 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_unittests iPhone 15 18.1", + "name": "ios_chrome_unittests iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -2847,11 +2847,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2864,7 +2864,7 @@ }, "test": "ios_chrome_unittests", "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" }, { "args": [ @@ -2876,7 +2876,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -2906,7 +2906,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2922,19 +2922,19 @@ "--platform", "iPad Pro 13-inch (M4)", "--version", - "18.1", + "18.2", "--xcodebuild-sim-runner", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_web_eg2tests_module iPad Pro 13-inch (M4) 18.1", + "name": "ios_chrome_web_eg2tests_module iPad Pro 13-inch (M4) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -2953,11 +2953,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2966,7 +2966,7 @@ }, "test": "ios_chrome_web_eg2tests_module", "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/", - "variant_id": "iPad Pro 13-inch (M4) 18.1" + "variant_id": "iPad Pro 13-inch (M4) 18.2" }, { "args": [ @@ -2978,7 +2978,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -3008,7 +3008,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3024,19 +3024,19 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--xcodebuild-sim-runner", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_web_eg2tests_module iPhone 15 18.1", + "name": "ios_chrome_web_eg2tests_module iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -3055,11 +3055,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3068,7 +3068,7 @@ }, "test": "ios_chrome_web_eg2tests_module", "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" }, { "args": [ @@ -3079,7 +3079,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -3109,7 +3109,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3129,18 +3129,18 @@ "--platform", "iPhone 14 Plus", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_components_unittests iPhone 14 Plus 18.1", + "name": "ios_components_unittests iPhone 14 Plus 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -3159,11 +3159,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3176,7 +3176,7 @@ }, "test": "ios_components_unittests", "test_id_prefix": "ninja://ios/components:ios_components_unittests/", - "variant_id": "iPhone 14 Plus 18.1" + "variant_id": "iPhone 14 Plus 18.2" }, { "args": [ @@ -3187,7 +3187,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -3217,7 +3217,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3238,18 +3238,18 @@ "--platform", "iPhone 14 Plus", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_net_unittests iPhone 14 Plus 18.1", + "name": "ios_net_unittests iPhone 14 Plus 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -3268,11 +3268,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3286,7 +3286,7 @@ }, "test": "ios_net_unittests", "test_id_prefix": "ninja://ios/net:ios_net_unittests/", - "variant_id": "iPhone 14 Plus 18.1" + "variant_id": "iPhone 14 Plus 18.2" }, { "args": [ @@ -3297,7 +3297,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -3327,7 +3327,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3347,18 +3347,18 @@ "--platform", "iPhone 14 Plus", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_testing_unittests iPhone 14 Plus 18.1", + "name": "ios_testing_unittests iPhone 14 Plus 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -3377,11 +3377,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3394,7 +3394,7 @@ }, "test": "ios_testing_unittests", "test_id_prefix": "ninja://ios/testing:ios_testing_unittests/", - "variant_id": "iPhone 14 Plus 18.1" + "variant_id": "iPhone 14 Plus 18.2" }, { "args": [ @@ -3405,7 +3405,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -3435,7 +3435,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3455,18 +3455,18 @@ "--platform", "iPad Pro 13-inch (M4)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_inttests iPad Pro 13-inch (M4) 18.1", + "name": "ios_web_inttests iPad Pro 13-inch (M4) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -3485,11 +3485,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3502,7 +3502,7 @@ }, "test": "ios_web_inttests", "test_id_prefix": "ninja://ios/web:ios_web_inttests/", - "variant_id": "iPad Pro 13-inch (M4) 18.1" + "variant_id": "iPad Pro 13-inch (M4) 18.2" }, { "args": [ @@ -3513,7 +3513,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -3543,7 +3543,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3563,18 +3563,18 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_inttests iPhone 15 18.1", + "name": "ios_web_inttests iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -3593,11 +3593,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3610,7 +3610,7 @@ }, "test": "ios_web_inttests", "test_id_prefix": "ninja://ios/web:ios_web_inttests/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" }, { "args": [ @@ -3622,7 +3622,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -3652,7 +3652,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3667,19 +3667,19 @@ "--platform", "iPad Air 11-inch (M2)", "--version", - "18.1", + "18.2", "--xcodebuild-sim-runner", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_shell_eg2tests_module iPad Air (6th generation) 18.1", + "name": "ios_web_shell_eg2tests_module iPad Air (6th generation) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -3698,11 +3698,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3710,7 +3710,7 @@ }, "test": "ios_web_shell_eg2tests_module", "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/", - "variant_id": "iPad Air (6th generation) 18.1" + "variant_id": "iPad Air (6th generation) 18.2" }, { "args": [ @@ -3722,7 +3722,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -3752,7 +3752,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3767,19 +3767,19 @@ "--platform", "iPad Pro 13-inch (M4)", "--version", - "18.1", + "18.2", "--xcodebuild-sim-runner", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_shell_eg2tests_module iPad Pro 13-inch (M4) 18.1", + "name": "ios_web_shell_eg2tests_module iPad Pro 13-inch (M4) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -3798,11 +3798,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3810,7 +3810,7 @@ }, "test": "ios_web_shell_eg2tests_module", "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/", - "variant_id": "iPad Pro 13-inch (M4) 18.1" + "variant_id": "iPad Pro 13-inch (M4) 18.2" }, { "args": [ @@ -3822,7 +3822,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -3852,7 +3852,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3867,19 +3867,19 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--xcodebuild-sim-runner", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_shell_eg2tests_module iPhone 15 18.1", + "name": "ios_web_shell_eg2tests_module iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -3898,11 +3898,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3910,7 +3910,7 @@ }, "test": "ios_web_shell_eg2tests_module", "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" }, { "args": [ @@ -3921,7 +3921,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -3951,7 +3951,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3971,18 +3971,18 @@ "--platform", "iPad Pro 13-inch (M4)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_unittests iPad Pro 13-inch (M4) 18.1", + "name": "ios_web_unittests iPad Pro 13-inch (M4) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -4001,11 +4001,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4018,7 +4018,7 @@ }, "test": "ios_web_unittests", "test_id_prefix": "ninja://ios/web:ios_web_unittests/", - "variant_id": "iPad Pro 13-inch (M4) 18.1" + "variant_id": "iPad Pro 13-inch (M4) 18.2" }, { "args": [ @@ -4029,7 +4029,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -4059,7 +4059,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4079,18 +4079,18 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_unittests iPhone 15 18.1", + "name": "ios_web_unittests iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -4109,11 +4109,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4126,7 +4126,7 @@ }, "test": "ios_web_unittests", "test_id_prefix": "ninja://ios/web:ios_web_unittests/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" }, { "args": [ @@ -4137,7 +4137,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -4167,7 +4167,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4187,18 +4187,18 @@ "--platform", "iPad Pro 13-inch (M4)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_view_inttests iPad Pro 13-inch (M4) 18.1", + "name": "ios_web_view_inttests iPad Pro 13-inch (M4) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -4217,11 +4217,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4234,7 +4234,7 @@ }, "test": "ios_web_view_inttests", "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/", - "variant_id": "iPad Pro 13-inch (M4) 18.1" + "variant_id": "iPad Pro 13-inch (M4) 18.2" }, { "args": [ @@ -4245,7 +4245,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -4275,7 +4275,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4295,18 +4295,18 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_view_inttests iPhone 15 18.1", + "name": "ios_web_view_inttests iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -4325,11 +4325,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4342,7 +4342,7 @@ }, "test": "ios_web_view_inttests", "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" }, { "args": [ @@ -4353,7 +4353,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -4383,7 +4383,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4403,18 +4403,18 @@ "--platform", "iPad Pro 13-inch (M4)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_view_unittests iPad Pro 13-inch (M4) 18.1", + "name": "ios_web_view_unittests iPad Pro 13-inch (M4) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -4433,11 +4433,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4450,7 +4450,7 @@ }, "test": "ios_web_view_unittests", "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/", - "variant_id": "iPad Pro 13-inch (M4) 18.1" + "variant_id": "iPad Pro 13-inch (M4) 18.2" }, { "args": [ @@ -4461,7 +4461,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -4491,7 +4491,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4511,18 +4511,18 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_view_unittests iPhone 15 18.1", + "name": "ios_web_view_unittests iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -4541,11 +4541,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4558,7 +4558,7 @@ }, "test": "ios_web_view_unittests", "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" }, { "args": [ @@ -4569,7 +4569,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -4599,7 +4599,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4619,18 +4619,18 @@ "--platform", "iPhone 14 Plus", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "net_unittests iPhone 14 Plus 18.1", + "name": "net_unittests iPhone 14 Plus 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -4649,11 +4649,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4666,7 +4666,7 @@ }, "test": "net_unittests", "test_id_prefix": "ninja://net:net_unittests/", - "variant_id": "iPhone 14 Plus 18.1" + "variant_id": "iPhone 14 Plus 18.2" }, { "args": [ @@ -4677,7 +4677,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -4707,7 +4707,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4727,18 +4727,18 @@ "--platform", "iPhone 14 Plus", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "services_unittests iPhone 14 Plus 18.1", + "name": "services_unittests iPhone 14 Plus 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -4757,11 +4757,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4774,7 +4774,7 @@ }, "test": "services_unittests", "test_id_prefix": "ninja://services:services_unittests/", - "variant_id": "iPhone 14 Plus 18.1" + "variant_id": "iPhone 14 Plus 18.2" }, { "args": [ @@ -4785,7 +4785,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -4815,7 +4815,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4835,18 +4835,18 @@ "--platform", "iPad Pro 13-inch (M4)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "skia_unittests iPad Pro 13-inch (M4) 18.1", + "name": "skia_unittests iPad Pro 13-inch (M4) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -4865,11 +4865,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4882,7 +4882,7 @@ }, "test": "skia_unittests", "test_id_prefix": "ninja://skia:skia_unittests/", - "variant_id": "iPad Pro 13-inch (M4) 18.1" + "variant_id": "iPad Pro 13-inch (M4) 18.2" }, { "args": [ @@ -4893,7 +4893,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -4923,7 +4923,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4943,18 +4943,18 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "skia_unittests iPhone 15 18.1", + "name": "skia_unittests iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -4973,11 +4973,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4990,7 +4990,7 @@ }, "test": "skia_unittests", "test_id_prefix": "ninja://skia:skia_unittests/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" }, { "args": [ @@ -5001,7 +5001,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -5031,7 +5031,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5051,18 +5051,18 @@ "--platform", "iPhone 14 Plus", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "sql_unittests iPhone 14 Plus 18.1", + "name": "sql_unittests iPhone 14 Plus 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -5081,11 +5081,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5098,7 +5098,7 @@ }, "test": "sql_unittests", "test_id_prefix": "ninja://sql:sql_unittests/", - "variant_id": "iPhone 14 Plus 18.1" + "variant_id": "iPhone 14 Plus 18.2" }, { "args": [ @@ -5109,7 +5109,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -5139,7 +5139,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5159,18 +5159,18 @@ "--platform", "iPad Pro 13-inch (M4)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ui_base_unittests iPad Pro 13-inch (M4) 18.1", + "name": "ui_base_unittests iPad Pro 13-inch (M4) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -5189,11 +5189,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5206,7 +5206,7 @@ }, "test": "ui_base_unittests", "test_id_prefix": "ninja://ui/base:ui_base_unittests/", - "variant_id": "iPad Pro 13-inch (M4) 18.1" + "variant_id": "iPad Pro 13-inch (M4) 18.2" }, { "args": [ @@ -5217,7 +5217,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -5247,7 +5247,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5267,18 +5267,18 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ui_base_unittests iPhone 15 18.1", + "name": "ui_base_unittests iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -5297,11 +5297,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5314,7 +5314,7 @@ }, "test": "ui_base_unittests", "test_id_prefix": "ninja://ui/base:ui_base_unittests/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" }, { "args": [ @@ -5325,7 +5325,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -5355,7 +5355,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5375,18 +5375,18 @@ "--platform", "iPhone 14 Plus", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "url_unittests iPhone 14 Plus 18.1", + "name": "url_unittests iPhone 14 Plus 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -5405,11 +5405,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5422,7 +5422,7 @@ }, "test": "url_unittests", "test_id_prefix": "ninja://url:url_unittests/", - "variant_id": "iPhone 14 Plus 18.1" + "variant_id": "iPhone 14 Plus 18.2" } ] }
diff --git a/infra/config/generated/builders/ci/ios-simulator-noncq/properties.json b/infra/config/generated/builders/ci/ios-simulator-noncq/properties.json index b5c59eda..f394181 100644 --- a/infra/config/generated/builders/ci/ios-simulator-noncq/properties.json +++ b/infra/config/generated/builders/ci/ios-simulator-noncq/properties.json
@@ -82,5 +82,5 @@ "chromium", "ios" ], - "xcode_build_version": "16b40" + "xcode_build_version": "16c5032a" } \ No newline at end of file
diff --git a/infra/config/generated/builders/ci/ios-simulator-noncq/targets/chromium.mac.json b/infra/config/generated/builders/ci/ios-simulator-noncq/targets/chromium.mac.json index e2ad14a..a70abbe 100644 --- a/infra/config/generated/builders/ci/ios-simulator-noncq/targets/chromium.mac.json +++ b/infra/config/generated/builders/ci/ios-simulator-noncq/targets/chromium.mac.json
@@ -13,7 +13,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -42,7 +42,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -66,7 +66,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -95,7 +95,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -115,17 +115,17 @@ "--platform", "iPad Air 11-inch (M2)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "base_unittests iPad Air (6th generation) 18.1", + "name": "base_unittests iPad Air (6th generation) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -144,11 +144,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -161,7 +161,7 @@ }, "test": "base_unittests", "test_id_prefix": "ninja://base:base_unittests/", - "variant_id": "iPad Air (6th generation) 18.1" + "variant_id": "iPad Air (6th generation) 18.2" }, { "args": [ @@ -172,7 +172,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -201,7 +201,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -225,7 +225,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -254,7 +254,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -274,17 +274,17 @@ "--platform", "iPad Pro 13-inch (M4)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "base_unittests iPad Pro 13-inch (M4) 18.1", + "name": "base_unittests iPad Pro 13-inch (M4) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -303,11 +303,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -320,7 +320,7 @@ }, "test": "base_unittests", "test_id_prefix": "ninja://base:base_unittests/", - "variant_id": "iPad Pro 13-inch (M4) 18.1" + "variant_id": "iPad Pro 13-inch (M4) 18.2" }, { "args": [ @@ -331,7 +331,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -360,7 +360,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -384,7 +384,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -413,7 +413,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -433,17 +433,17 @@ "--platform", "iPhone 14 Plus", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "base_unittests iPhone 14 Plus 18.1", + "name": "base_unittests iPhone 14 Plus 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -462,11 +462,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -479,7 +479,7 @@ }, "test": "base_unittests", "test_id_prefix": "ninja://base:base_unittests/", - "variant_id": "iPhone 14 Plus 18.1" + "variant_id": "iPhone 14 Plus 18.2" }, { "args": [ @@ -490,7 +490,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -519,7 +519,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -543,7 +543,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -572,7 +572,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -592,17 +592,17 @@ "--platform", "iPhone SE (3rd generation)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "base_unittests iPhone SE (3rd generation) 18.1", + "name": "base_unittests iPhone SE (3rd generation) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -621,11 +621,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -638,7 +638,7 @@ }, "test": "base_unittests", "test_id_prefix": "ninja://base:base_unittests/", - "variant_id": "iPhone SE (3rd generation) 18.1" + "variant_id": "iPhone SE (3rd generation) 18.2" }, { "args": [ @@ -649,7 +649,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -678,7 +678,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -702,7 +702,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -731,7 +731,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -751,17 +751,17 @@ "--platform", "iPad Air 11-inch (M2)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "components_unittests iPad Air (6th generation) 18.1", + "name": "components_unittests iPad Air (6th generation) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -780,11 +780,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -797,7 +797,7 @@ }, "test": "components_unittests", "test_id_prefix": "ninja://components:components_unittests/", - "variant_id": "iPad Air (6th generation) 18.1" + "variant_id": "iPad Air (6th generation) 18.2" }, { "args": [ @@ -808,7 +808,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -837,7 +837,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -861,7 +861,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -890,7 +890,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -910,17 +910,17 @@ "--platform", "iPad Pro 13-inch (M4)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "components_unittests iPad Pro 13-inch (M4) 18.1", + "name": "components_unittests iPad Pro 13-inch (M4) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -939,11 +939,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -956,7 +956,7 @@ }, "test": "components_unittests", "test_id_prefix": "ninja://components:components_unittests/", - "variant_id": "iPad Pro 13-inch (M4) 18.1" + "variant_id": "iPad Pro 13-inch (M4) 18.2" }, { "args": [ @@ -967,7 +967,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -996,7 +996,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1020,7 +1020,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1049,7 +1049,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1069,17 +1069,17 @@ "--platform", "iPhone 14 Plus", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "components_unittests iPhone 14 Plus 18.1", + "name": "components_unittests iPhone 14 Plus 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -1098,11 +1098,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1115,7 +1115,7 @@ }, "test": "components_unittests", "test_id_prefix": "ninja://components:components_unittests/", - "variant_id": "iPhone 14 Plus 18.1" + "variant_id": "iPhone 14 Plus 18.2" }, { "args": [ @@ -1126,7 +1126,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1155,7 +1155,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1179,7 +1179,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1208,7 +1208,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1228,17 +1228,17 @@ "--platform", "iPhone SE (3rd generation)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "components_unittests iPhone SE (3rd generation) 18.1", + "name": "components_unittests iPhone SE (3rd generation) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -1257,11 +1257,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1274,7 +1274,7 @@ }, "test": "components_unittests", "test_id_prefix": "ninja://components:components_unittests/", - "variant_id": "iPhone SE (3rd generation) 18.1" + "variant_id": "iPhone SE (3rd generation) 18.2" }, { "args": [ @@ -1285,7 +1285,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1314,7 +1314,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1338,7 +1338,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1367,7 +1367,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1387,17 +1387,17 @@ "--platform", "iPad Air 11-inch (M2)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "gfx_unittests iPad Air (6th generation) 18.1", + "name": "gfx_unittests iPad Air (6th generation) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -1416,11 +1416,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1433,7 +1433,7 @@ }, "test": "gfx_unittests", "test_id_prefix": "ninja://ui/gfx:gfx_unittests/", - "variant_id": "iPad Air (6th generation) 18.1" + "variant_id": "iPad Air (6th generation) 18.2" }, { "args": [ @@ -1444,7 +1444,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1473,7 +1473,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1497,7 +1497,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1526,7 +1526,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1546,17 +1546,17 @@ "--platform", "iPad Pro 13-inch (M4)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "gfx_unittests iPad Pro 13-inch (M4) 18.1", + "name": "gfx_unittests iPad Pro 13-inch (M4) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -1575,11 +1575,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1592,7 +1592,7 @@ }, "test": "gfx_unittests", "test_id_prefix": "ninja://ui/gfx:gfx_unittests/", - "variant_id": "iPad Pro 13-inch (M4) 18.1" + "variant_id": "iPad Pro 13-inch (M4) 18.2" }, { "args": [ @@ -1603,7 +1603,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1632,7 +1632,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1656,7 +1656,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1685,7 +1685,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1705,17 +1705,17 @@ "--platform", "iPhone 14 Plus", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "gfx_unittests iPhone 14 Plus 18.1", + "name": "gfx_unittests iPhone 14 Plus 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -1734,11 +1734,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1751,7 +1751,7 @@ }, "test": "gfx_unittests", "test_id_prefix": "ninja://ui/gfx:gfx_unittests/", - "variant_id": "iPhone 14 Plus 18.1" + "variant_id": "iPhone 14 Plus 18.2" }, { "args": [ @@ -1762,7 +1762,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1791,7 +1791,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1815,7 +1815,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1844,7 +1844,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1864,17 +1864,17 @@ "--platform", "iPhone SE (3rd generation)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "gfx_unittests iPhone SE (3rd generation) 18.1", + "name": "gfx_unittests iPhone SE (3rd generation) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -1893,11 +1893,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1910,7 +1910,7 @@ }, "test": "gfx_unittests", "test_id_prefix": "ninja://ui/gfx:gfx_unittests/", - "variant_id": "iPhone SE (3rd generation) 18.1" + "variant_id": "iPhone SE (3rd generation) 18.2" }, { "args": [ @@ -1924,7 +1924,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1953,7 +1953,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1976,7 +1976,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2005,7 +2005,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2021,20 +2021,20 @@ "--platform", "iPad Pro 13-inch (M4)", "--version", - "18.1", + "18.2", "--xcodebuild-sim-runner", "--record-video", "failed_only", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_bookmarks_eg2tests_module iPad Pro 13-inch (M4) 18.1", + "name": "ios_chrome_bookmarks_eg2tests_module iPad Pro 13-inch (M4) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -2053,11 +2053,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2066,7 +2066,7 @@ }, "test": "ios_chrome_bookmarks_eg2tests_module", "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/", - "variant_id": "iPad Pro 13-inch (M4) 18.1" + "variant_id": "iPad Pro 13-inch (M4) 18.2" }, { "args": [ @@ -2082,7 +2082,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2111,7 +2111,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2136,7 +2136,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2165,7 +2165,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2183,20 +2183,20 @@ "--platform", "iPad Air 11-inch (M2)", "--version", - "18.1", + "18.2", "--xcodebuild-sim-runner", "--record-video", "failed_only", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_integration_eg2tests_module iPad Air (6th generation) 18.1", + "name": "ios_chrome_integration_eg2tests_module iPad Air (6th generation) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -2215,11 +2215,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2228,7 +2228,7 @@ }, "test": "ios_chrome_integration_eg2tests_module", "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/", - "variant_id": "iPad Air (6th generation) 18.1" + "variant_id": "iPad Air (6th generation) 18.2" }, { "args": [ @@ -2244,7 +2244,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2273,7 +2273,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2298,7 +2298,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2327,7 +2327,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2345,20 +2345,20 @@ "--platform", "iPad Pro 13-inch (M4)", "--version", - "18.1", + "18.2", "--xcodebuild-sim-runner", "--record-video", "failed_only", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_settings_eg2tests_module iPad Pro 13-inch (M4) 18.1", + "name": "ios_chrome_settings_eg2tests_module iPad Pro 13-inch (M4) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -2377,11 +2377,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2390,7 +2390,7 @@ }, "test": "ios_chrome_settings_eg2tests_module", "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/", - "variant_id": "iPad Pro 13-inch (M4) 18.1" + "variant_id": "iPad Pro 13-inch (M4) 18.2" }, { "args": [ @@ -2404,7 +2404,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2433,7 +2433,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2456,7 +2456,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2485,7 +2485,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2501,20 +2501,20 @@ "--platform", "iPad Pro 13-inch (M4)", "--version", - "18.1", + "18.2", "--xcodebuild-sim-runner", "--record-video", "failed_only", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_signin_eg2tests_module iPad Pro 13-inch (M4) 18.1", + "name": "ios_chrome_signin_eg2tests_module iPad Pro 13-inch (M4) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -2533,11 +2533,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2546,7 +2546,7 @@ }, "test": "ios_chrome_signin_eg2tests_module", "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/", - "variant_id": "iPad Pro 13-inch (M4) 18.1" + "variant_id": "iPad Pro 13-inch (M4) 18.2" }, { "args": [ @@ -2560,7 +2560,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2589,7 +2589,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2611,7 +2611,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2640,7 +2640,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2655,20 +2655,20 @@ "--platform", "iPad Pro 13-inch (M4)", "--version", - "18.1", + "18.2", "--xcodebuild-sim-runner", "--record-video", "failed_only", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_smoke_eg2tests_module iPad Pro 13-inch (M4) 18.1", + "name": "ios_chrome_smoke_eg2tests_module iPad Pro 13-inch (M4) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -2687,11 +2687,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2699,7 +2699,7 @@ }, "test": "ios_chrome_smoke_eg2tests_module", "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/", - "variant_id": "iPad Pro 13-inch (M4) 18.1" + "variant_id": "iPad Pro 13-inch (M4) 18.2" }, { "args": [ @@ -2715,7 +2715,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2744,7 +2744,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2769,7 +2769,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2798,7 +2798,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2816,20 +2816,20 @@ "--platform", "iPad Pro 13-inch (M4)", "--version", - "18.1", + "18.2", "--xcodebuild-sim-runner", "--record-video", "failed_only", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_ui_eg2tests_module iPad Pro 13-inch (M4) 18.1", + "name": "ios_chrome_ui_eg2tests_module iPad Pro 13-inch (M4) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -2848,11 +2848,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2861,7 +2861,7 @@ }, "test": "ios_chrome_ui_eg2tests_module", "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/", - "variant_id": "iPad Pro 13-inch (M4) 18.1" + "variant_id": "iPad Pro 13-inch (M4) 18.2" }, { "args": [ @@ -2872,7 +2872,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2901,7 +2901,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2925,7 +2925,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2954,7 +2954,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2974,17 +2974,17 @@ "--platform", "iPad Air 11-inch (M2)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_unittests iPad Air (6th generation) 18.1", + "name": "ios_chrome_unittests iPad Air (6th generation) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -3003,11 +3003,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3020,7 +3020,7 @@ }, "test": "ios_chrome_unittests", "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/", - "variant_id": "iPad Air (6th generation) 18.1" + "variant_id": "iPad Air (6th generation) 18.2" }, { "args": [ @@ -3031,7 +3031,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3060,7 +3060,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3084,7 +3084,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3113,7 +3113,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3133,17 +3133,17 @@ "--platform", "iPad Pro 13-inch (M4)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_unittests iPad Pro 13-inch (M4) 18.1", + "name": "ios_chrome_unittests iPad Pro 13-inch (M4) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -3162,11 +3162,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3179,7 +3179,7 @@ }, "test": "ios_chrome_unittests", "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/", - "variant_id": "iPad Pro 13-inch (M4) 18.1" + "variant_id": "iPad Pro 13-inch (M4) 18.2" }, { "args": [ @@ -3190,7 +3190,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3219,7 +3219,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3243,7 +3243,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3272,7 +3272,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3292,17 +3292,17 @@ "--platform", "iPhone 14 Plus", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_unittests iPhone 14 Plus 18.1", + "name": "ios_chrome_unittests iPhone 14 Plus 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -3321,11 +3321,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3338,7 +3338,7 @@ }, "test": "ios_chrome_unittests", "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/", - "variant_id": "iPhone 14 Plus 18.1" + "variant_id": "iPhone 14 Plus 18.2" }, { "args": [ @@ -3349,7 +3349,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3378,7 +3378,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3402,7 +3402,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3431,7 +3431,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3451,17 +3451,17 @@ "--platform", "iPhone SE (3rd generation)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_unittests iPhone SE (3rd generation) 18.1", + "name": "ios_chrome_unittests iPhone SE (3rd generation) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -3480,11 +3480,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3497,7 +3497,7 @@ }, "test": "ios_chrome_unittests", "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/", - "variant_id": "iPhone SE (3rd generation) 18.1" + "variant_id": "iPhone SE (3rd generation) 18.2" }, { "args": [ @@ -3511,7 +3511,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3540,7 +3540,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3563,7 +3563,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3592,7 +3592,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3608,20 +3608,20 @@ "--platform", "iPad Pro 13-inch (M4)", "--version", - "18.1", + "18.2", "--xcodebuild-sim-runner", "--record-video", "failed_only", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_web_eg2tests_module iPad Pro 13-inch (M4) 18.1", + "name": "ios_chrome_web_eg2tests_module iPad Pro 13-inch (M4) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -3640,11 +3640,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3653,7 +3653,7 @@ }, "test": "ios_chrome_web_eg2tests_module", "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/", - "variant_id": "iPad Pro 13-inch (M4) 18.1" + "variant_id": "iPad Pro 13-inch (M4) 18.2" }, { "args": [ @@ -3665,7 +3665,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3694,7 +3694,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3714,7 +3714,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3743,7 +3743,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3758,18 +3758,18 @@ "--platform", "iPhone SE (3rd generation)", "--version", - "18.1", + "18.2", "--xcodebuild-sim-runner", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_crash_xcuitests_module iPhone SE (3rd generation) 18.1", + "name": "ios_crash_xcuitests_module iPhone SE (3rd generation) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -3788,11 +3788,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3800,7 +3800,7 @@ }, "test": "ios_crash_xcuitests_module", "test_id_prefix": "ninja://third_party/crashpad/crashpad/test/ios:ios_crash_xcuitests_module/", - "variant_id": "iPhone SE (3rd generation) 18.1" + "variant_id": "iPhone SE (3rd generation) 18.2" }, { "args": [ @@ -3811,7 +3811,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3840,7 +3840,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3864,7 +3864,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3893,7 +3893,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3913,17 +3913,17 @@ "--platform", "iPad Air 11-inch (M2)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_inttests iPad Air (6th generation) 18.1", + "name": "ios_web_inttests iPad Air (6th generation) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -3942,11 +3942,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3959,7 +3959,7 @@ }, "test": "ios_web_inttests", "test_id_prefix": "ninja://ios/web:ios_web_inttests/", - "variant_id": "iPad Air (6th generation) 18.1" + "variant_id": "iPad Air (6th generation) 18.2" }, { "args": [ @@ -3970,7 +3970,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3999,7 +3999,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4023,7 +4023,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -4052,7 +4052,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4072,17 +4072,17 @@ "--platform", "iPad Pro 13-inch (M4)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_inttests iPad Pro 13-inch (M4) 18.1", + "name": "ios_web_inttests iPad Pro 13-inch (M4) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -4101,11 +4101,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4118,7 +4118,7 @@ }, "test": "ios_web_inttests", "test_id_prefix": "ninja://ios/web:ios_web_inttests/", - "variant_id": "iPad Pro 13-inch (M4) 18.1" + "variant_id": "iPad Pro 13-inch (M4) 18.2" }, { "args": [ @@ -4129,7 +4129,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -4158,7 +4158,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4182,7 +4182,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -4211,7 +4211,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4231,17 +4231,17 @@ "--platform", "iPhone 14 Plus", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_inttests iPhone 14 Plus 18.1", + "name": "ios_web_inttests iPhone 14 Plus 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -4260,11 +4260,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4277,7 +4277,7 @@ }, "test": "ios_web_inttests", "test_id_prefix": "ninja://ios/web:ios_web_inttests/", - "variant_id": "iPhone 14 Plus 18.1" + "variant_id": "iPhone 14 Plus 18.2" }, { "args": [ @@ -4288,7 +4288,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -4317,7 +4317,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4341,7 +4341,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -4370,7 +4370,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4390,17 +4390,17 @@ "--platform", "iPhone SE (3rd generation)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_inttests iPhone SE (3rd generation) 18.1", + "name": "ios_web_inttests iPhone SE (3rd generation) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -4419,11 +4419,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4436,7 +4436,7 @@ }, "test": "ios_web_inttests", "test_id_prefix": "ninja://ios/web:ios_web_inttests/", - "variant_id": "iPhone SE (3rd generation) 18.1" + "variant_id": "iPhone SE (3rd generation) 18.2" }, { "args": [ @@ -4450,7 +4450,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -4479,7 +4479,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4501,7 +4501,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -4530,7 +4530,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4545,20 +4545,20 @@ "--platform", "iPad Air 11-inch (M2)", "--version", - "18.1", + "18.2", "--xcodebuild-sim-runner", "--record-video", "failed_only", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_shell_eg2tests_module iPad Air (6th generation) 18.1", + "name": "ios_web_shell_eg2tests_module iPad Air (6th generation) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -4577,11 +4577,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4589,7 +4589,7 @@ }, "test": "ios_web_shell_eg2tests_module", "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/", - "variant_id": "iPad Air (6th generation) 18.1" + "variant_id": "iPad Air (6th generation) 18.2" }, { "args": [ @@ -4600,7 +4600,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -4629,7 +4629,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4653,7 +4653,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -4682,7 +4682,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4702,17 +4702,17 @@ "--platform", "iPad Air 11-inch (M2)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_unittests iPad Air (6th generation) 18.1", + "name": "ios_web_unittests iPad Air (6th generation) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -4731,11 +4731,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4748,7 +4748,7 @@ }, "test": "ios_web_unittests", "test_id_prefix": "ninja://ios/web:ios_web_unittests/", - "variant_id": "iPad Air (6th generation) 18.1" + "variant_id": "iPad Air (6th generation) 18.2" }, { "args": [ @@ -4759,7 +4759,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -4788,7 +4788,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4812,7 +4812,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -4841,7 +4841,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4861,17 +4861,17 @@ "--platform", "iPad Pro 13-inch (M4)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_unittests iPad Pro 13-inch (M4) 18.1", + "name": "ios_web_unittests iPad Pro 13-inch (M4) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -4890,11 +4890,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4907,7 +4907,7 @@ }, "test": "ios_web_unittests", "test_id_prefix": "ninja://ios/web:ios_web_unittests/", - "variant_id": "iPad Pro 13-inch (M4) 18.1" + "variant_id": "iPad Pro 13-inch (M4) 18.2" }, { "args": [ @@ -4918,7 +4918,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -4947,7 +4947,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4971,7 +4971,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -5000,7 +5000,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5020,17 +5020,17 @@ "--platform", "iPhone 14 Plus", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_unittests iPhone 14 Plus 18.1", + "name": "ios_web_unittests iPhone 14 Plus 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -5049,11 +5049,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5066,7 +5066,7 @@ }, "test": "ios_web_unittests", "test_id_prefix": "ninja://ios/web:ios_web_unittests/", - "variant_id": "iPhone 14 Plus 18.1" + "variant_id": "iPhone 14 Plus 18.2" }, { "args": [ @@ -5077,7 +5077,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -5106,7 +5106,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5130,7 +5130,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -5159,7 +5159,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5179,17 +5179,17 @@ "--platform", "iPhone SE (3rd generation)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_unittests iPhone SE (3rd generation) 18.1", + "name": "ios_web_unittests iPhone SE (3rd generation) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -5208,11 +5208,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5225,7 +5225,7 @@ }, "test": "ios_web_unittests", "test_id_prefix": "ninja://ios/web:ios_web_unittests/", - "variant_id": "iPhone SE (3rd generation) 18.1" + "variant_id": "iPhone SE (3rd generation) 18.2" }, { "args": [ @@ -5236,7 +5236,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -5265,7 +5265,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5289,7 +5289,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -5318,7 +5318,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5338,17 +5338,17 @@ "--platform", "iPad Air 11-inch (M2)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_view_inttests iPad Air (6th generation) 18.1", + "name": "ios_web_view_inttests iPad Air (6th generation) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -5367,11 +5367,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5384,7 +5384,7 @@ }, "test": "ios_web_view_inttests", "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/", - "variant_id": "iPad Air (6th generation) 18.1" + "variant_id": "iPad Air (6th generation) 18.2" }, { "args": [ @@ -5395,7 +5395,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -5424,7 +5424,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5448,7 +5448,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -5477,7 +5477,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5497,17 +5497,17 @@ "--platform", "iPad Pro 13-inch (M4)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_view_inttests iPad Pro 13-inch (M4) 18.1", + "name": "ios_web_view_inttests iPad Pro 13-inch (M4) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -5526,11 +5526,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5543,7 +5543,7 @@ }, "test": "ios_web_view_inttests", "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/", - "variant_id": "iPad Pro 13-inch (M4) 18.1" + "variant_id": "iPad Pro 13-inch (M4) 18.2" }, { "args": [ @@ -5554,7 +5554,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -5583,7 +5583,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5607,7 +5607,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -5636,7 +5636,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5656,17 +5656,17 @@ "--platform", "iPhone 14 Plus", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_view_inttests iPhone 14 Plus 18.1", + "name": "ios_web_view_inttests iPhone 14 Plus 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -5685,11 +5685,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5702,7 +5702,7 @@ }, "test": "ios_web_view_inttests", "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/", - "variant_id": "iPhone 14 Plus 18.1" + "variant_id": "iPhone 14 Plus 18.2" }, { "args": [ @@ -5713,7 +5713,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -5742,7 +5742,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5766,7 +5766,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -5795,7 +5795,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5815,17 +5815,17 @@ "--platform", "iPhone SE (3rd generation)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_view_inttests iPhone SE (3rd generation) 18.1", + "name": "ios_web_view_inttests iPhone SE (3rd generation) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -5844,11 +5844,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5861,7 +5861,7 @@ }, "test": "ios_web_view_inttests", "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/", - "variant_id": "iPhone SE (3rd generation) 18.1" + "variant_id": "iPhone SE (3rd generation) 18.2" }, { "args": [ @@ -5872,7 +5872,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -5901,7 +5901,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5925,7 +5925,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -5954,7 +5954,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5974,17 +5974,17 @@ "--platform", "iPad Air 11-inch (M2)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_view_unittests iPad Air (6th generation) 18.1", + "name": "ios_web_view_unittests iPad Air (6th generation) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -6003,11 +6003,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -6020,7 +6020,7 @@ }, "test": "ios_web_view_unittests", "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/", - "variant_id": "iPad Air (6th generation) 18.1" + "variant_id": "iPad Air (6th generation) 18.2" }, { "args": [ @@ -6031,7 +6031,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -6060,7 +6060,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -6084,7 +6084,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -6113,7 +6113,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -6133,17 +6133,17 @@ "--platform", "iPad Pro 13-inch (M4)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_view_unittests iPad Pro 13-inch (M4) 18.1", + "name": "ios_web_view_unittests iPad Pro 13-inch (M4) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -6162,11 +6162,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -6179,7 +6179,7 @@ }, "test": "ios_web_view_unittests", "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/", - "variant_id": "iPad Pro 13-inch (M4) 18.1" + "variant_id": "iPad Pro 13-inch (M4) 18.2" }, { "args": [ @@ -6190,7 +6190,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -6219,7 +6219,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -6243,7 +6243,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -6272,7 +6272,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -6292,17 +6292,17 @@ "--platform", "iPhone 14 Plus", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_view_unittests iPhone 14 Plus 18.1", + "name": "ios_web_view_unittests iPhone 14 Plus 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -6321,11 +6321,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -6338,7 +6338,7 @@ }, "test": "ios_web_view_unittests", "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/", - "variant_id": "iPhone 14 Plus 18.1" + "variant_id": "iPhone 14 Plus 18.2" }, { "args": [ @@ -6349,7 +6349,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -6378,7 +6378,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -6402,7 +6402,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -6431,7 +6431,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -6451,17 +6451,17 @@ "--platform", "iPhone SE (3rd generation)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_view_unittests iPhone SE (3rd generation) 18.1", + "name": "ios_web_view_unittests iPhone SE (3rd generation) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -6480,11 +6480,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -6497,7 +6497,7 @@ }, "test": "ios_web_view_unittests", "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/", - "variant_id": "iPhone SE (3rd generation) 18.1" + "variant_id": "iPhone SE (3rd generation) 18.2" }, { "args": [ @@ -6508,7 +6508,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -6537,7 +6537,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -6561,7 +6561,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -6590,7 +6590,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -6610,17 +6610,17 @@ "--platform", "iPad Air 11-inch (M2)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "skia_unittests iPad Air (6th generation) 18.1", + "name": "skia_unittests iPad Air (6th generation) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -6639,11 +6639,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -6656,7 +6656,7 @@ }, "test": "skia_unittests", "test_id_prefix": "ninja://skia:skia_unittests/", - "variant_id": "iPad Air (6th generation) 18.1" + "variant_id": "iPad Air (6th generation) 18.2" }, { "args": [ @@ -6667,7 +6667,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -6696,7 +6696,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -6720,7 +6720,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -6749,7 +6749,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -6769,17 +6769,17 @@ "--platform", "iPad Pro 13-inch (M4)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "skia_unittests iPad Pro 13-inch (M4) 18.1", + "name": "skia_unittests iPad Pro 13-inch (M4) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -6798,11 +6798,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -6815,7 +6815,7 @@ }, "test": "skia_unittests", "test_id_prefix": "ninja://skia:skia_unittests/", - "variant_id": "iPad Pro 13-inch (M4) 18.1" + "variant_id": "iPad Pro 13-inch (M4) 18.2" }, { "args": [ @@ -6826,7 +6826,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -6855,7 +6855,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -6879,7 +6879,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -6908,7 +6908,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -6928,17 +6928,17 @@ "--platform", "iPhone 14 Plus", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "skia_unittests iPhone 14 Plus 18.1", + "name": "skia_unittests iPhone 14 Plus 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -6957,11 +6957,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -6974,7 +6974,7 @@ }, "test": "skia_unittests", "test_id_prefix": "ninja://skia:skia_unittests/", - "variant_id": "iPhone 14 Plus 18.1" + "variant_id": "iPhone 14 Plus 18.2" }, { "args": [ @@ -6985,7 +6985,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -7014,7 +7014,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -7038,7 +7038,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -7067,7 +7067,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -7087,17 +7087,17 @@ "--platform", "iPhone SE (3rd generation)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "skia_unittests iPhone SE (3rd generation) 18.1", + "name": "skia_unittests iPhone SE (3rd generation) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -7116,11 +7116,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -7133,7 +7133,7 @@ }, "test": "skia_unittests", "test_id_prefix": "ninja://skia:skia_unittests/", - "variant_id": "iPhone SE (3rd generation) 18.1" + "variant_id": "iPhone SE (3rd generation) 18.2" }, { "args": [ @@ -7144,7 +7144,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -7173,7 +7173,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -7197,7 +7197,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -7226,7 +7226,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -7246,17 +7246,17 @@ "--platform", "iPad Air 11-inch (M2)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ui_base_unittests iPad Air (6th generation) 18.1", + "name": "ui_base_unittests iPad Air (6th generation) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -7275,11 +7275,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -7292,7 +7292,7 @@ }, "test": "ui_base_unittests", "test_id_prefix": "ninja://ui/base:ui_base_unittests/", - "variant_id": "iPad Air (6th generation) 18.1" + "variant_id": "iPad Air (6th generation) 18.2" }, { "args": [ @@ -7303,7 +7303,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -7332,7 +7332,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -7356,7 +7356,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -7385,7 +7385,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -7405,17 +7405,17 @@ "--platform", "iPad Pro 13-inch (M4)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ui_base_unittests iPad Pro 13-inch (M4) 18.1", + "name": "ui_base_unittests iPad Pro 13-inch (M4) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -7434,11 +7434,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -7451,7 +7451,7 @@ }, "test": "ui_base_unittests", "test_id_prefix": "ninja://ui/base:ui_base_unittests/", - "variant_id": "iPad Pro 13-inch (M4) 18.1" + "variant_id": "iPad Pro 13-inch (M4) 18.2" }, { "args": [ @@ -7462,7 +7462,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -7491,7 +7491,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -7515,7 +7515,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -7544,7 +7544,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -7564,17 +7564,17 @@ "--platform", "iPhone 14 Plus", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ui_base_unittests iPhone 14 Plus 18.1", + "name": "ui_base_unittests iPhone 14 Plus 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -7593,11 +7593,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -7610,7 +7610,7 @@ }, "test": "ui_base_unittests", "test_id_prefix": "ninja://ui/base:ui_base_unittests/", - "variant_id": "iPhone 14 Plus 18.1" + "variant_id": "iPhone 14 Plus 18.2" }, { "args": [ @@ -7621,7 +7621,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -7650,7 +7650,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -7674,7 +7674,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -7703,7 +7703,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -7723,17 +7723,17 @@ "--platform", "iPhone SE (3rd generation)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ui_base_unittests iPhone SE (3rd generation) 18.1", + "name": "ui_base_unittests iPhone SE (3rd generation) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -7752,11 +7752,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -7769,7 +7769,7 @@ }, "test": "ui_base_unittests", "test_id_prefix": "ninja://ui/base:ui_base_unittests/", - "variant_id": "iPhone SE (3rd generation) 18.1" + "variant_id": "iPhone SE (3rd generation) 18.2" } ] }
diff --git a/infra/config/generated/builders/ci/ios-simulator/properties.json b/infra/config/generated/builders/ci/ios-simulator/properties.json index 4a90d567..bd965f6 100644 --- a/infra/config/generated/builders/ci/ios-simulator/properties.json +++ b/infra/config/generated/builders/ci/ios-simulator/properties.json
@@ -89,5 +89,5 @@ "chromium", "ios" ], - "xcode_build_version": "16b40" + "xcode_build_version": "16c5032a" } \ No newline at end of file
diff --git a/infra/config/generated/builders/ci/ios-simulator/targets/chromium.mac.json b/infra/config/generated/builders/ci/ios-simulator/targets/chromium.mac.json index c14a637..0671cf9 100644 --- a/infra/config/generated/builders/ci/ios-simulator/targets/chromium.mac.json +++ b/infra/config/generated/builders/ci/ios-simulator/targets/chromium.mac.json
@@ -13,7 +13,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -43,7 +43,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -58,18 +58,18 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "absl_hardening_tests iPhone 15 18.1", + "name": "absl_hardening_tests iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -88,11 +88,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -100,7 +100,7 @@ }, "test": "absl_hardening_tests", "test_id_prefix": "ninja://third_party/abseil-cpp:absl_hardening_tests/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" }, { "args": [ @@ -111,7 +111,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -141,7 +141,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -156,18 +156,18 @@ "--platform", "iPad Pro 13-inch (M4)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "base_unittests iPad Pro 13-inch (M4) 18.1", + "name": "base_unittests iPad Pro 13-inch (M4) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -186,11 +186,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -198,7 +198,7 @@ }, "test": "base_unittests", "test_id_prefix": "ninja://base:base_unittests/", - "variant_id": "iPad Pro 13-inch (M4) 18.1" + "variant_id": "iPad Pro 13-inch (M4) 18.2" }, { "args": [ @@ -209,7 +209,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -239,7 +239,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -254,18 +254,18 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "base_unittests iPhone 15 18.1", + "name": "base_unittests iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -284,11 +284,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -296,7 +296,7 @@ }, "test": "base_unittests", "test_id_prefix": "ninja://base:base_unittests/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" }, { "args": [ @@ -307,7 +307,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -337,7 +337,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -352,18 +352,18 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "boringssl_crypto_tests iPhone 15 18.1", + "name": "boringssl_crypto_tests iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -382,11 +382,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -394,7 +394,7 @@ }, "test": "boringssl_crypto_tests", "test_id_prefix": "ninja://third_party/boringssl:boringssl_crypto_tests/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" }, { "args": [ @@ -405,7 +405,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -435,7 +435,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -450,18 +450,18 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "boringssl_ssl_tests iPhone 15 18.1", + "name": "boringssl_ssl_tests iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -480,11 +480,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -492,7 +492,7 @@ }, "test": "boringssl_ssl_tests", "test_id_prefix": "ninja://third_party/boringssl:boringssl_ssl_tests/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" }, { "args": [ @@ -503,7 +503,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -533,7 +533,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -548,18 +548,18 @@ "--platform", "iPad Pro 13-inch (M4)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "components_unittests iPad Pro 13-inch (M4) 18.1", + "name": "components_unittests iPad Pro 13-inch (M4) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -578,11 +578,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -590,7 +590,7 @@ }, "test": "components_unittests", "test_id_prefix": "ninja://components:components_unittests/", - "variant_id": "iPad Pro 13-inch (M4) 18.1" + "variant_id": "iPad Pro 13-inch (M4) 18.2" }, { "args": [ @@ -601,7 +601,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -631,7 +631,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -646,18 +646,18 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "components_unittests iPhone 15 18.1", + "name": "components_unittests iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -676,11 +676,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -688,7 +688,7 @@ }, "test": "components_unittests", "test_id_prefix": "ninja://components:components_unittests/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" }, { "args": [ @@ -699,7 +699,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -729,7 +729,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -744,18 +744,18 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "crashpad_tests iPhone 15 18.1", + "name": "crashpad_tests iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -774,11 +774,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -786,7 +786,7 @@ }, "test": "crashpad_tests", "test_id_prefix": "ninja://third_party/crashpad/crashpad:crashpad_tests/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" }, { "args": [ @@ -797,7 +797,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -827,7 +827,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -842,18 +842,18 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "crypto_unittests iPhone 15 18.1", + "name": "crypto_unittests iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -872,11 +872,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -884,7 +884,7 @@ }, "test": "crypto_unittests", "test_id_prefix": "ninja://crypto:crypto_unittests/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" }, { "args": [ @@ -895,7 +895,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -925,7 +925,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -940,18 +940,18 @@ "--platform", "iPad Pro 13-inch (M4)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "gfx_unittests iPad Pro 13-inch (M4) 18.1", + "name": "gfx_unittests iPad Pro 13-inch (M4) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -970,11 +970,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -982,7 +982,7 @@ }, "test": "gfx_unittests", "test_id_prefix": "ninja://ui/gfx:gfx_unittests/", - "variant_id": "iPad Pro 13-inch (M4) 18.1" + "variant_id": "iPad Pro 13-inch (M4) 18.2" }, { "args": [ @@ -993,7 +993,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -1023,7 +1023,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1038,18 +1038,18 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "gfx_unittests iPhone 15 18.1", + "name": "gfx_unittests iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -1068,11 +1068,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1080,7 +1080,7 @@ }, "test": "gfx_unittests", "test_id_prefix": "ninja://ui/gfx:gfx_unittests/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" }, { "args": [ @@ -1091,7 +1091,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -1121,7 +1121,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1136,18 +1136,18 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "google_apis_unittests iPhone 15 18.1", + "name": "google_apis_unittests iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -1166,11 +1166,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1178,7 +1178,7 @@ }, "test": "google_apis_unittests", "test_id_prefix": "ninja://google_apis:google_apis_unittests/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" }, { "args": [ @@ -1192,7 +1192,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -1222,7 +1222,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1240,19 +1240,19 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--xcodebuild-sim-runner", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_integration_eg2tests_module iPhone 15 18.1", + "name": "ios_chrome_integration_eg2tests_module iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -1271,11 +1271,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1284,7 +1284,7 @@ }, "test": "ios_chrome_integration_eg2tests_module", "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" }, { "args": [ @@ -1295,7 +1295,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -1325,7 +1325,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1340,18 +1340,18 @@ "--platform", "iPad Pro 13-inch (M4)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_unittests iPad Pro 13-inch (M4) 18.1", + "name": "ios_chrome_unittests iPad Pro 13-inch (M4) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -1370,11 +1370,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1382,7 +1382,7 @@ }, "test": "ios_chrome_unittests", "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/", - "variant_id": "iPad Pro 13-inch (M4) 18.1" + "variant_id": "iPad Pro 13-inch (M4) 18.2" }, { "args": [ @@ -1393,7 +1393,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -1423,7 +1423,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1438,18 +1438,18 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_unittests iPhone 15 18.1", + "name": "ios_chrome_unittests iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -1468,11 +1468,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1480,7 +1480,7 @@ }, "test": "ios_chrome_unittests", "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" }, { "args": [ @@ -1491,7 +1491,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -1521,7 +1521,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1536,18 +1536,18 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_components_unittests iPhone 15 18.1", + "name": "ios_components_unittests iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -1566,11 +1566,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1578,7 +1578,7 @@ }, "test": "ios_components_unittests", "test_id_prefix": "ninja://ios/components:ios_components_unittests/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" }, { "args": [ @@ -1589,7 +1589,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -1619,7 +1619,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1635,18 +1635,18 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_net_unittests iPhone 15 18.1", + "name": "ios_net_unittests iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -1665,11 +1665,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1678,7 +1678,7 @@ }, "test": "ios_net_unittests", "test_id_prefix": "ninja://ios/net:ios_net_unittests/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" }, { "args": [ @@ -1689,7 +1689,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -1719,7 +1719,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1734,18 +1734,18 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_testing_unittests iPhone 15 18.1", + "name": "ios_testing_unittests iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -1764,11 +1764,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1776,7 +1776,7 @@ }, "test": "ios_testing_unittests", "test_id_prefix": "ninja://ios/testing:ios_testing_unittests/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" }, { "args": [ @@ -1787,7 +1787,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -1817,7 +1817,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1832,18 +1832,18 @@ "--platform", "iPad Pro 13-inch (M4)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_inttests iPad Pro 13-inch (M4) 18.1", + "name": "ios_web_inttests iPad Pro 13-inch (M4) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -1862,11 +1862,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1874,7 +1874,7 @@ }, "test": "ios_web_inttests", "test_id_prefix": "ninja://ios/web:ios_web_inttests/", - "variant_id": "iPad Pro 13-inch (M4) 18.1" + "variant_id": "iPad Pro 13-inch (M4) 18.2" }, { "args": [ @@ -1885,7 +1885,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -1915,7 +1915,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1930,18 +1930,18 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_inttests iPhone 15 18.1", + "name": "ios_web_inttests iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -1960,11 +1960,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1972,7 +1972,7 @@ }, "test": "ios_web_inttests", "test_id_prefix": "ninja://ios/web:ios_web_inttests/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" }, { "args": [ @@ -1984,7 +1984,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -2014,7 +2014,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2029,19 +2029,19 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--xcodebuild-sim-runner", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_shell_eg2tests_module iPhone 15 18.1", + "name": "ios_web_shell_eg2tests_module iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -2060,11 +2060,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2072,7 +2072,7 @@ }, "test": "ios_web_shell_eg2tests_module", "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" }, { "args": [ @@ -2083,7 +2083,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -2113,7 +2113,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2128,18 +2128,18 @@ "--platform", "iPad Pro 13-inch (M4)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_unittests iPad Pro 13-inch (M4) 18.1", + "name": "ios_web_unittests iPad Pro 13-inch (M4) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -2158,11 +2158,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2170,7 +2170,7 @@ }, "test": "ios_web_unittests", "test_id_prefix": "ninja://ios/web:ios_web_unittests/", - "variant_id": "iPad Pro 13-inch (M4) 18.1" + "variant_id": "iPad Pro 13-inch (M4) 18.2" }, { "args": [ @@ -2181,7 +2181,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -2211,7 +2211,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2226,18 +2226,18 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_unittests iPhone 15 18.1", + "name": "ios_web_unittests iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -2256,11 +2256,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2268,7 +2268,7 @@ }, "test": "ios_web_unittests", "test_id_prefix": "ninja://ios/web:ios_web_unittests/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" }, { "args": [ @@ -2279,7 +2279,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -2309,7 +2309,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2324,18 +2324,18 @@ "--platform", "iPad Pro 13-inch (M4)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_view_inttests iPad Pro 13-inch (M4) 18.1", + "name": "ios_web_view_inttests iPad Pro 13-inch (M4) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -2354,11 +2354,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2366,7 +2366,7 @@ }, "test": "ios_web_view_inttests", "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/", - "variant_id": "iPad Pro 13-inch (M4) 18.1" + "variant_id": "iPad Pro 13-inch (M4) 18.2" }, { "args": [ @@ -2377,7 +2377,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -2407,7 +2407,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2422,18 +2422,18 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_view_inttests iPhone 15 18.1", + "name": "ios_web_view_inttests iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -2452,11 +2452,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2464,7 +2464,7 @@ }, "test": "ios_web_view_inttests", "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" }, { "args": [ @@ -2475,7 +2475,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -2505,7 +2505,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2520,18 +2520,18 @@ "--platform", "iPad Pro 13-inch (M4)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_view_unittests iPad Pro 13-inch (M4) 18.1", + "name": "ios_web_view_unittests iPad Pro 13-inch (M4) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -2550,11 +2550,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2562,7 +2562,7 @@ }, "test": "ios_web_view_unittests", "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/", - "variant_id": "iPad Pro 13-inch (M4) 18.1" + "variant_id": "iPad Pro 13-inch (M4) 18.2" }, { "args": [ @@ -2573,7 +2573,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -2603,7 +2603,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2618,18 +2618,18 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_view_unittests iPhone 15 18.1", + "name": "ios_web_view_unittests iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -2648,11 +2648,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2660,7 +2660,7 @@ }, "test": "ios_web_view_unittests", "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" }, { "args": [ @@ -2671,7 +2671,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -2701,7 +2701,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2716,18 +2716,18 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "net_unittests iPhone 15 18.1", + "name": "net_unittests iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -2746,11 +2746,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2758,7 +2758,7 @@ }, "test": "net_unittests", "test_id_prefix": "ninja://net:net_unittests/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" }, { "args": [ @@ -2769,7 +2769,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -2799,7 +2799,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2814,18 +2814,18 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "services_unittests iPhone 15 18.1", + "name": "services_unittests iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -2844,11 +2844,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2856,7 +2856,7 @@ }, "test": "services_unittests", "test_id_prefix": "ninja://services:services_unittests/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" }, { "args": [ @@ -2867,7 +2867,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -2897,7 +2897,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2912,18 +2912,18 @@ "--platform", "iPad Pro 13-inch (M4)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "skia_unittests iPad Pro 13-inch (M4) 18.1", + "name": "skia_unittests iPad Pro 13-inch (M4) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -2942,11 +2942,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2954,7 +2954,7 @@ }, "test": "skia_unittests", "test_id_prefix": "ninja://skia:skia_unittests/", - "variant_id": "iPad Pro 13-inch (M4) 18.1" + "variant_id": "iPad Pro 13-inch (M4) 18.2" }, { "args": [ @@ -2965,7 +2965,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -2995,7 +2995,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3010,18 +3010,18 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "skia_unittests iPhone 15 18.1", + "name": "skia_unittests iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -3040,11 +3040,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3052,7 +3052,7 @@ }, "test": "skia_unittests", "test_id_prefix": "ninja://skia:skia_unittests/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" }, { "args": [ @@ -3063,7 +3063,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -3093,7 +3093,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3108,18 +3108,18 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "sql_unittests iPhone 15 18.1", + "name": "sql_unittests iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -3138,11 +3138,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3150,7 +3150,7 @@ }, "test": "sql_unittests", "test_id_prefix": "ninja://sql:sql_unittests/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" }, { "args": [ @@ -3161,7 +3161,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -3191,7 +3191,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3206,18 +3206,18 @@ "--platform", "iPad Pro 13-inch (M4)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ui_base_unittests iPad Pro 13-inch (M4) 18.1", + "name": "ui_base_unittests iPad Pro 13-inch (M4) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -3236,11 +3236,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3248,7 +3248,7 @@ }, "test": "ui_base_unittests", "test_id_prefix": "ninja://ui/base:ui_base_unittests/", - "variant_id": "iPad Pro 13-inch (M4) 18.1" + "variant_id": "iPad Pro 13-inch (M4) 18.2" }, { "args": [ @@ -3259,7 +3259,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -3289,7 +3289,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3304,18 +3304,18 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ui_base_unittests iPhone 15 18.1", + "name": "ui_base_unittests iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -3334,11 +3334,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3346,7 +3346,7 @@ }, "test": "ui_base_unittests", "test_id_prefix": "ninja://ui/base:ui_base_unittests/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" }, { "args": [ @@ -3357,7 +3357,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -3387,7 +3387,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3402,18 +3402,18 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "url_unittests iPhone 15 18.1", + "name": "url_unittests iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -3432,11 +3432,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3444,7 +3444,7 @@ }, "test": "url_unittests", "test_id_prefix": "ninja://url:url_unittests/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" } ] }
diff --git a/infra/config/generated/builders/ci/ios-vm/properties.json b/infra/config/generated/builders/ci/ios-vm/properties.json index 303ce66..e5e5af5f7 100644 --- a/infra/config/generated/builders/ci/ios-vm/properties.json +++ b/infra/config/generated/builders/ci/ios-vm/properties.json
@@ -72,5 +72,5 @@ }, "builder_group": "chromium.fyi", "recipe": "chromium", - "xcode_build_version": "16b40" + "xcode_build_version": "16c5032a" } \ No newline at end of file
diff --git a/infra/config/generated/builders/ci/ios-vm/targets/chromium.fyi.json b/infra/config/generated/builders/ci/ios-vm/targets/chromium.fyi.json index f9e2d9edc..fe0df5b 100644 --- a/infra/config/generated/builders/ci/ios-vm/targets/chromium.fyi.json +++ b/infra/config/generated/builders/ci/ios-vm/targets/chromium.fyi.json
@@ -14,7 +14,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -44,7 +44,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -64,7 +64,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -94,7 +94,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -114,7 +114,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -144,7 +144,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -164,7 +164,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -194,7 +194,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -213,7 +213,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -243,7 +243,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -262,7 +262,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -292,7 +292,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -311,7 +311,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -341,7 +341,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -360,7 +360,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -390,7 +390,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ],
diff --git a/infra/config/generated/builders/ci/ios-webkit-tot/targets/chromium.fyi.json b/infra/config/generated/builders/ci/ios-webkit-tot/targets/chromium.fyi.json index 589c5493..7c26e22 100644 --- a/infra/config/generated/builders/ci/ios-webkit-tot/targets/chromium.fyi.json +++ b/infra/config/generated/builders/ci/ios-webkit-tot/targets/chromium.fyi.json
@@ -12,7 +12,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -41,7 +41,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -62,7 +62,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -91,7 +91,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -112,7 +112,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -141,7 +141,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -162,7 +162,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -191,7 +191,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -212,7 +212,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -241,7 +241,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -262,7 +262,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -291,7 +291,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -312,7 +312,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -341,7 +341,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -362,7 +362,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -391,7 +391,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -412,7 +412,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -441,7 +441,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -462,7 +462,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -491,7 +491,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -512,7 +512,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -541,7 +541,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -562,7 +562,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -591,7 +591,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -612,7 +612,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -641,7 +641,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -662,7 +662,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -691,7 +691,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -712,7 +712,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -741,7 +741,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -762,7 +762,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -791,7 +791,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -812,7 +812,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -841,7 +841,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -862,7 +862,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -891,7 +891,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -912,7 +912,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -941,7 +941,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -962,7 +962,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -991,7 +991,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1012,7 +1012,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1041,7 +1041,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1062,7 +1062,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1091,7 +1091,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1112,7 +1112,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1141,7 +1141,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1162,7 +1162,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1191,7 +1191,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1212,7 +1212,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1241,7 +1241,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1262,7 +1262,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1291,7 +1291,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1312,7 +1312,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1341,7 +1341,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1362,7 +1362,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1391,7 +1391,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1412,7 +1412,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1441,7 +1441,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1462,7 +1462,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1491,7 +1491,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1512,7 +1512,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1541,7 +1541,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1562,7 +1562,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1591,7 +1591,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1612,7 +1612,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1641,7 +1641,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1662,7 +1662,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1691,7 +1691,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1712,7 +1712,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1741,7 +1741,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1762,7 +1762,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1791,7 +1791,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1813,7 +1813,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1842,7 +1842,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1865,7 +1865,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1894,7 +1894,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1917,7 +1917,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1946,7 +1946,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1969,7 +1969,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1998,7 +1998,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2023,7 +2023,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2052,7 +2052,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2077,7 +2077,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2106,7 +2106,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2131,7 +2131,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2160,7 +2160,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2185,7 +2185,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2214,7 +2214,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2239,7 +2239,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2268,7 +2268,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2293,7 +2293,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2322,7 +2322,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2347,7 +2347,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2376,7 +2376,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2401,7 +2401,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2430,7 +2430,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2453,7 +2453,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2482,7 +2482,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2505,7 +2505,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2534,7 +2534,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2557,7 +2557,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2586,7 +2586,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2609,7 +2609,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2638,7 +2638,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2661,7 +2661,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2690,7 +2690,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2712,7 +2712,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2741,7 +2741,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2763,7 +2763,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2792,7 +2792,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2814,7 +2814,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2843,7 +2843,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2867,7 +2867,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2896,7 +2896,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2921,7 +2921,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2950,7 +2950,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2975,7 +2975,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3004,7 +3004,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3029,7 +3029,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3058,7 +3058,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3080,7 +3080,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3109,7 +3109,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3130,7 +3130,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3159,7 +3159,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3180,7 +3180,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3209,7 +3209,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3230,7 +3230,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3259,7 +3259,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3281,7 +3281,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3310,7 +3310,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3333,7 +3333,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3362,7 +3362,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3385,7 +3385,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3414,7 +3414,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3437,7 +3437,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3466,7 +3466,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3488,7 +3488,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3517,7 +3517,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3538,7 +3538,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3567,7 +3567,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3588,7 +3588,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3617,7 +3617,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3638,7 +3638,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3667,7 +3667,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3688,7 +3688,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3717,7 +3717,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3739,7 +3739,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3768,7 +3768,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3790,7 +3790,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3819,7 +3819,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3841,7 +3841,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3870,7 +3870,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3892,7 +3892,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3921,7 +3921,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3942,7 +3942,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3971,7 +3971,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3992,7 +3992,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -4021,7 +4021,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4042,7 +4042,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -4071,7 +4071,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4092,7 +4092,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -4121,7 +4121,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4142,7 +4142,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -4171,7 +4171,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4192,7 +4192,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -4221,7 +4221,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4242,7 +4242,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -4271,7 +4271,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4293,7 +4293,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -4322,7 +4322,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4344,7 +4344,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -4373,7 +4373,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4395,7 +4395,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -4424,7 +4424,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4446,7 +4446,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -4475,7 +4475,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4496,7 +4496,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -4525,7 +4525,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4546,7 +4546,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -4575,7 +4575,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4596,7 +4596,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -4625,7 +4625,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4646,7 +4646,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -4675,7 +4675,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4696,7 +4696,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -4725,7 +4725,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4746,7 +4746,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -4775,7 +4775,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4796,7 +4796,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -4825,7 +4825,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4846,7 +4846,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -4875,7 +4875,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4896,7 +4896,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -4925,7 +4925,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4946,7 +4946,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -4975,7 +4975,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4996,7 +4996,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -5025,7 +5025,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5046,7 +5046,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -5075,7 +5075,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5096,7 +5096,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -5125,7 +5125,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5146,7 +5146,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -5175,7 +5175,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5196,7 +5196,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -5225,7 +5225,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5246,7 +5246,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -5275,7 +5275,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5296,7 +5296,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -5325,7 +5325,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5346,7 +5346,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -5375,7 +5375,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5396,7 +5396,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -5425,7 +5425,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5446,7 +5446,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -5475,7 +5475,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5496,7 +5496,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -5525,7 +5525,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5546,7 +5546,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -5575,7 +5575,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5596,7 +5596,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -5625,7 +5625,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5646,7 +5646,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -5675,7 +5675,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5696,7 +5696,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -5725,7 +5725,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5746,7 +5746,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -5775,7 +5775,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5796,7 +5796,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -5825,7 +5825,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5846,7 +5846,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -5875,7 +5875,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5896,7 +5896,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -5925,7 +5925,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5946,7 +5946,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -5975,7 +5975,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5996,7 +5996,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -6025,7 +6025,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -6046,7 +6046,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -6075,7 +6075,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -6096,7 +6096,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -6125,7 +6125,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -6146,7 +6146,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -6175,7 +6175,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -6196,7 +6196,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -6225,7 +6225,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -6246,7 +6246,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -6275,7 +6275,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ],
diff --git a/infra/config/generated/builders/ci/ios-wpt-fyi-rel/properties.json b/infra/config/generated/builders/ci/ios-wpt-fyi-rel/properties.json index 9d6c669..800d7f1e 100644 --- a/infra/config/generated/builders/ci/ios-wpt-fyi-rel/properties.json +++ b/infra/config/generated/builders/ci/ios-wpt-fyi-rel/properties.json
@@ -72,5 +72,5 @@ }, "builder_group": "chromium.fyi", "recipe": "chromium", - "xcode_build_version": "16b40" + "xcode_build_version": "16c5032a" } \ No newline at end of file
diff --git a/infra/config/generated/builders/ci/ios-wpt-fyi-rel/targets/chromium.fyi.json b/infra/config/generated/builders/ci/ios-wpt-fyi-rel/targets/chromium.fyi.json index 5eda596..d6b05e0 100644 --- a/infra/config/generated/builders/ci/ios-wpt-fyi-rel/targets/chromium.fyi.json +++ b/infra/config/generated/builders/ci/ios-wpt-fyi-rel/targets/chromium.fyi.json
@@ -5,7 +5,7 @@ "args": [ "--no-wpt-internal", "--xcode-build-version", - "16b40" + "16c5032a" ], "merge": { "args": [ @@ -36,7 +36,7 @@ "hard_timeout": 14400, "named_caches": [ { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ],
diff --git a/infra/config/generated/builders/ci/ios17-beta-simulator/properties.json b/infra/config/generated/builders/ci/ios17-beta-simulator/properties.json index 132736b..9f1093b 100644 --- a/infra/config/generated/builders/ci/ios17-beta-simulator/properties.json +++ b/infra/config/generated/builders/ci/ios17-beta-simulator/properties.json
@@ -73,5 +73,5 @@ }, "builder_group": "chromium.fyi", "recipe": "chromium", - "xcode_build_version": "16b40" + "xcode_build_version": "16c5032a" } \ No newline at end of file
diff --git a/infra/config/generated/builders/ci/ios18-beta-simulator/properties.json b/infra/config/generated/builders/ci/ios18-beta-simulator/properties.json index e2015603..462ce11f 100644 --- a/infra/config/generated/builders/ci/ios18-beta-simulator/properties.json +++ b/infra/config/generated/builders/ci/ios18-beta-simulator/properties.json
@@ -73,5 +73,5 @@ }, "builder_group": "chromium.fyi", "recipe": "chromium", - "xcode_build_version": "16b40" + "xcode_build_version": "16c5032a" } \ No newline at end of file
diff --git a/infra/config/generated/builders/reclient/ios-simulator reclient staging untrusted/properties.json b/infra/config/generated/builders/reclient/ios-simulator reclient staging untrusted/properties.json index b73bbe9..c738afd 100644 --- a/infra/config/generated/builders/reclient/ios-simulator reclient staging untrusted/properties.json +++ b/infra/config/generated/builders/reclient/ios-simulator reclient staging untrusted/properties.json
@@ -80,5 +80,5 @@ }, "builder_group": "chromium.reclient.fyi", "recipe": "chromium", - "xcode_build_version": "16b40" + "xcode_build_version": "16c5032a" } \ No newline at end of file
diff --git a/infra/config/generated/builders/reclient/ios-simulator reclient staging/properties.json b/infra/config/generated/builders/reclient/ios-simulator reclient staging/properties.json index 093c6e2a..1204021 100644 --- a/infra/config/generated/builders/reclient/ios-simulator reclient staging/properties.json +++ b/infra/config/generated/builders/reclient/ios-simulator reclient staging/properties.json
@@ -80,5 +80,5 @@ }, "builder_group": "chromium.reclient.fyi", "recipe": "chromium", - "xcode_build_version": "16b40" + "xcode_build_version": "16c5032a" } \ No newline at end of file
diff --git a/infra/config/generated/builders/try/ios-angle-try-intel/targets/chromium.angle.json b/infra/config/generated/builders/try/ios-angle-try-intel/targets/chromium.angle.json index 20c84f5..6661f4e9 100644 --- a/infra/config/generated/builders/try/ios-angle-try-intel/targets/chromium.angle.json +++ b/infra/config/generated/builders/try/ios-angle-try-intel/targets/chromium.angle.json
@@ -12,7 +12,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -45,7 +45,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -66,7 +66,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -99,7 +99,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -120,7 +120,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -153,7 +153,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -174,7 +174,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -207,7 +207,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ],
diff --git a/infra/config/generated/builders/try/ios-asan/properties.json b/infra/config/generated/builders/try/ios-asan/properties.json index 1683754..2966e33 100644 --- a/infra/config/generated/builders/try/ios-asan/properties.json +++ b/infra/config/generated/builders/try/ios-asan/properties.json
@@ -71,5 +71,5 @@ }, "builder_group": "tryserver.chromium.mac", "recipe": "chromium_trybot", - "xcode_build_version": "16b40" + "xcode_build_version": "16c5032a" } \ No newline at end of file
diff --git a/infra/config/generated/builders/try/ios-asan/targets/chromium.memory.json b/infra/config/generated/builders/try/ios-asan/targets/chromium.memory.json index adb64f6..34c7d516 100644 --- a/infra/config/generated/builders/try/ios-asan/targets/chromium.memory.json +++ b/infra/config/generated/builders/try/ios-asan/targets/chromium.memory.json
@@ -13,7 +13,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -42,7 +42,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -61,7 +61,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -90,7 +90,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -109,7 +109,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -138,7 +138,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -157,7 +157,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -186,7 +186,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -205,7 +205,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -234,7 +234,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -253,7 +253,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -282,7 +282,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -301,7 +301,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -330,7 +330,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -349,7 +349,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -378,7 +378,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -397,7 +397,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -426,7 +426,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -445,7 +445,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -474,7 +474,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -493,7 +493,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -522,7 +522,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -541,7 +541,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -570,7 +570,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -589,7 +589,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -618,7 +618,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -637,7 +637,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -666,7 +666,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -685,7 +685,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -714,7 +714,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -733,7 +733,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -762,7 +762,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -781,7 +781,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -810,7 +810,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -829,7 +829,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -858,7 +858,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -878,7 +878,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -907,7 +907,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -928,7 +928,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -957,7 +957,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -978,7 +978,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1007,7 +1007,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1028,7 +1028,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1057,7 +1057,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1080,7 +1080,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1109,7 +1109,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1132,7 +1132,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1161,7 +1161,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1184,7 +1184,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1213,7 +1213,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1236,7 +1236,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1265,7 +1265,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1288,7 +1288,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1317,7 +1317,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1340,7 +1340,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1369,7 +1369,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1392,7 +1392,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1421,7 +1421,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1444,7 +1444,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1473,7 +1473,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1494,7 +1494,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1523,7 +1523,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1544,7 +1544,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1573,7 +1573,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1594,7 +1594,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1623,7 +1623,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1644,7 +1644,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1673,7 +1673,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1694,7 +1694,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1723,7 +1723,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1743,7 +1743,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1772,7 +1772,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1792,7 +1792,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1821,7 +1821,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1841,7 +1841,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1870,7 +1870,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1892,7 +1892,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1921,7 +1921,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1944,7 +1944,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1973,7 +1973,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1996,7 +1996,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2025,7 +2025,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2048,7 +2048,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2077,7 +2077,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2097,7 +2097,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2126,7 +2126,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2145,7 +2145,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2174,7 +2174,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2194,7 +2194,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2223,7 +2223,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2244,7 +2244,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2273,7 +2273,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2294,7 +2294,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2323,7 +2323,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2344,7 +2344,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2373,7 +2373,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2393,7 +2393,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2422,7 +2422,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2441,7 +2441,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2470,7 +2470,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2489,7 +2489,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2518,7 +2518,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2538,7 +2538,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2567,7 +2567,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2587,7 +2587,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2616,7 +2616,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2635,7 +2635,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2664,7 +2664,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2683,7 +2683,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2712,7 +2712,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2731,7 +2731,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2760,7 +2760,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2780,7 +2780,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2809,7 +2809,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2829,7 +2829,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2858,7 +2858,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2878,7 +2878,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2907,7 +2907,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2927,7 +2927,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2956,7 +2956,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2975,7 +2975,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3004,7 +3004,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3023,7 +3023,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3052,7 +3052,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3071,7 +3071,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3100,7 +3100,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3119,7 +3119,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3148,7 +3148,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3167,7 +3167,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3196,7 +3196,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3215,7 +3215,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3244,7 +3244,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3263,7 +3263,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3292,7 +3292,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3311,7 +3311,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3340,7 +3340,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3359,7 +3359,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3388,7 +3388,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3407,7 +3407,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3436,7 +3436,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3455,7 +3455,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3484,7 +3484,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3503,7 +3503,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3532,7 +3532,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3551,7 +3551,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3580,7 +3580,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3599,7 +3599,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3628,7 +3628,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3647,7 +3647,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3676,7 +3676,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3695,7 +3695,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3724,7 +3724,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3743,7 +3743,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3772,7 +3772,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3791,7 +3791,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3820,7 +3820,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ],
diff --git a/infra/config/generated/builders/try/ios-blink-dbg-fyi/targets/chromium.fyi.json b/infra/config/generated/builders/try/ios-blink-dbg-fyi/targets/chromium.fyi.json index 35764137..7bc72d0e 100644 --- a/infra/config/generated/builders/try/ios-blink-dbg-fyi/targets/chromium.fyi.json +++ b/infra/config/generated/builders/try/ios-blink-dbg-fyi/targets/chromium.fyi.json
@@ -13,7 +13,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -42,7 +42,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -61,7 +61,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -90,7 +90,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -109,7 +109,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -138,7 +138,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -158,7 +158,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -187,7 +187,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -209,7 +209,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -238,7 +238,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -259,7 +259,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -288,7 +288,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -307,7 +307,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -336,7 +336,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -355,7 +355,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -384,7 +384,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -403,7 +403,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -432,7 +432,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -451,7 +451,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -480,7 +480,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -499,7 +499,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -528,7 +528,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -547,7 +547,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -576,7 +576,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -598,7 +598,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -632,7 +632,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -654,7 +654,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -688,7 +688,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -707,7 +707,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -736,7 +736,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -755,7 +755,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -784,7 +784,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -803,7 +803,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -832,7 +832,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -851,7 +851,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -880,7 +880,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -899,7 +899,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -928,7 +928,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -947,7 +947,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -976,7 +976,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -995,7 +995,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1024,7 +1024,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1043,7 +1043,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1072,7 +1072,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1094,7 +1094,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1123,7 +1123,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1145,7 +1145,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1174,7 +1174,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1195,7 +1195,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1224,7 +1224,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1245,7 +1245,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1274,7 +1274,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1295,7 +1295,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1324,7 +1324,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1345,7 +1345,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1374,7 +1374,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1395,7 +1395,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1424,7 +1424,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1445,7 +1445,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1474,7 +1474,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1495,7 +1495,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1524,7 +1524,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1545,7 +1545,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1574,7 +1574,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1595,7 +1595,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1624,7 +1624,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1645,7 +1645,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1674,7 +1674,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1693,7 +1693,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1722,7 +1722,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1741,7 +1741,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1770,7 +1770,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1789,7 +1789,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1818,7 +1818,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1837,7 +1837,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1866,7 +1866,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1885,7 +1885,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1914,7 +1914,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1933,7 +1933,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1962,7 +1962,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1981,7 +1981,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2010,7 +2010,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2029,7 +2029,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2058,7 +2058,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2077,7 +2077,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2106,7 +2106,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2125,7 +2125,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2154,7 +2154,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2173,7 +2173,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2202,7 +2202,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2221,7 +2221,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2250,7 +2250,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2269,7 +2269,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2298,7 +2298,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2317,7 +2317,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2346,7 +2346,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2367,7 +2367,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2396,7 +2396,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2417,7 +2417,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2446,7 +2446,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2465,7 +2465,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2494,7 +2494,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2513,7 +2513,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2542,7 +2542,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2561,7 +2561,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2590,7 +2590,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2609,7 +2609,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2638,7 +2638,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2657,7 +2657,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2686,7 +2686,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2705,7 +2705,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2734,7 +2734,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2755,7 +2755,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2784,7 +2784,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2805,7 +2805,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2834,7 +2834,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2853,7 +2853,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2882,7 +2882,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2901,7 +2901,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2930,7 +2930,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2949,7 +2949,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2978,7 +2978,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2997,7 +2997,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3026,7 +3026,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3045,7 +3045,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3074,7 +3074,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3093,7 +3093,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3122,7 +3122,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3141,7 +3141,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3170,7 +3170,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3189,7 +3189,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3218,7 +3218,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3237,7 +3237,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3266,7 +3266,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3285,7 +3285,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3314,7 +3314,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3335,7 +3335,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3364,7 +3364,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3385,7 +3385,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3414,7 +3414,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3439,7 +3439,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3468,7 +3468,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3493,7 +3493,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3522,7 +3522,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3547,7 +3547,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3576,7 +3576,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3601,7 +3601,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3630,7 +3630,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3649,7 +3649,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3678,7 +3678,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3697,7 +3697,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3726,7 +3726,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3747,7 +3747,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3776,7 +3776,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3797,7 +3797,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3826,7 +3826,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3845,7 +3845,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3874,7 +3874,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3893,7 +3893,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3922,7 +3922,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3941,7 +3941,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3970,7 +3970,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3989,7 +3989,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -4018,7 +4018,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4037,7 +4037,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -4066,7 +4066,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4085,7 +4085,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -4114,7 +4114,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4133,7 +4133,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -4162,7 +4162,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4181,7 +4181,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -4210,7 +4210,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4229,7 +4229,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -4258,7 +4258,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4277,7 +4277,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -4306,7 +4306,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4325,7 +4325,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -4354,7 +4354,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4373,7 +4373,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -4402,7 +4402,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4421,7 +4421,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -4450,7 +4450,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4469,7 +4469,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -4498,7 +4498,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4517,7 +4517,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -4546,7 +4546,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4565,7 +4565,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -4594,7 +4594,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4613,7 +4613,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -4642,7 +4642,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4661,7 +4661,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -4690,7 +4690,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4709,7 +4709,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -4738,7 +4738,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4757,7 +4757,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -4786,7 +4786,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4806,7 +4806,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -4835,7 +4835,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4855,7 +4855,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -4884,7 +4884,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4903,7 +4903,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -4932,7 +4932,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4951,7 +4951,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -4980,7 +4980,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4999,7 +4999,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -5028,7 +5028,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5047,7 +5047,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -5076,7 +5076,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5095,7 +5095,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -5124,7 +5124,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5143,7 +5143,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -5172,7 +5172,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5194,7 +5194,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -5223,7 +5223,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5245,7 +5245,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -5274,7 +5274,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5293,7 +5293,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -5322,7 +5322,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5341,7 +5341,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -5370,7 +5370,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5389,7 +5389,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -5418,7 +5418,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5437,7 +5437,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -5466,7 +5466,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ],
diff --git a/infra/config/generated/builders/try/ios-catalyst/properties.json b/infra/config/generated/builders/try/ios-catalyst/properties.json index 8769625..fad10e5 100644 --- a/infra/config/generated/builders/try/ios-catalyst/properties.json +++ b/infra/config/generated/builders/try/ios-catalyst/properties.json
@@ -67,5 +67,5 @@ }, "builder_group": "tryserver.chromium.mac", "recipe": "chromium_trybot", - "xcode_build_version": "16b40" + "xcode_build_version": "16c5032a" } \ No newline at end of file
diff --git a/infra/config/generated/builders/try/ios-device/properties.json b/infra/config/generated/builders/try/ios-device/properties.json index 5074ebb..095a255 100644 --- a/infra/config/generated/builders/try/ios-device/properties.json +++ b/infra/config/generated/builders/try/ios-device/properties.json
@@ -67,5 +67,5 @@ }, "builder_group": "tryserver.chromium.mac", "recipe": "chromium_trybot", - "xcode_build_version": "16b40" + "xcode_build_version": "16c5032a" } \ No newline at end of file
diff --git a/infra/config/generated/builders/try/ios-fieldtrial-rel/properties.json b/infra/config/generated/builders/try/ios-fieldtrial-rel/properties.json index e3151246..ddb38e02 100644 --- a/infra/config/generated/builders/try/ios-fieldtrial-rel/properties.json +++ b/infra/config/generated/builders/try/ios-fieldtrial-rel/properties.json
@@ -65,5 +65,5 @@ }, "builder_group": "tryserver.chromium.mac", "recipe": "chromium_trybot", - "xcode_build_version": "16b40" + "xcode_build_version": "16c5032a" } \ No newline at end of file
diff --git a/infra/config/generated/builders/try/ios-fieldtrial-rel/targets/chromium.fyi.json b/infra/config/generated/builders/try/ios-fieldtrial-rel/targets/chromium.fyi.json index 526bd326..1e09e3e8 100644 --- a/infra/config/generated/builders/try/ios-fieldtrial-rel/targets/chromium.fyi.json +++ b/infra/config/generated/builders/try/ios-fieldtrial-rel/targets/chromium.fyi.json
@@ -12,7 +12,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -42,7 +42,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -64,7 +64,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -94,7 +94,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -118,7 +118,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -148,7 +148,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -172,7 +172,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -202,7 +202,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -226,7 +226,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -256,7 +256,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -280,7 +280,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -310,7 +310,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -332,7 +332,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -362,7 +362,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -384,7 +384,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -414,7 +414,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -436,7 +436,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -466,7 +466,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -487,7 +487,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -517,7 +517,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -540,7 +540,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -570,7 +570,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -594,7 +594,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -624,7 +624,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -646,7 +646,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -676,7 +676,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -698,7 +698,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -728,7 +728,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -750,7 +750,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -780,7 +780,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -801,7 +801,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -831,7 +831,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ],
diff --git a/infra/config/generated/builders/try/ios-simulator-code-coverage/properties.json b/infra/config/generated/builders/try/ios-simulator-code-coverage/properties.json index 9147dfad3..123c8e3 100644 --- a/infra/config/generated/builders/try/ios-simulator-code-coverage/properties.json +++ b/infra/config/generated/builders/try/ios-simulator-code-coverage/properties.json
@@ -69,5 +69,5 @@ }, "builder_group": "tryserver.chromium.mac", "recipe": "chromium_trybot", - "xcode_build_version": "16b40" + "xcode_build_version": "16c5032a" } \ No newline at end of file
diff --git a/infra/config/generated/builders/try/ios-simulator-code-coverage/targets/chromium.coverage.json b/infra/config/generated/builders/try/ios-simulator-code-coverage/targets/chromium.coverage.json index 70030528..a3e2a8b 100644 --- a/infra/config/generated/builders/try/ios-simulator-code-coverage/targets/chromium.coverage.json +++ b/infra/config/generated/builders/try/ios-simulator-code-coverage/targets/chromium.coverage.json
@@ -11,7 +11,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -41,7 +41,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -61,7 +61,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -91,7 +91,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -111,7 +111,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -141,7 +141,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -161,7 +161,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -191,7 +191,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -211,7 +211,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -241,7 +241,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -261,7 +261,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -291,7 +291,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -311,7 +311,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -341,7 +341,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -361,7 +361,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -391,7 +391,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -411,7 +411,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -441,7 +441,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -461,7 +461,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -491,7 +491,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -511,7 +511,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -541,7 +541,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -561,7 +561,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -591,7 +591,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -611,7 +611,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -641,7 +641,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -661,7 +661,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -691,7 +691,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -711,7 +711,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -741,7 +741,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -761,7 +761,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -791,7 +791,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -811,7 +811,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -841,7 +841,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -861,7 +861,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -891,7 +891,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -911,7 +911,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -941,7 +941,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -961,7 +961,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -991,7 +991,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1011,7 +1011,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -1041,7 +1041,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1061,7 +1061,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -1091,7 +1091,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1111,7 +1111,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -1141,7 +1141,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1161,7 +1161,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -1191,7 +1191,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1211,7 +1211,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -1241,7 +1241,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1261,7 +1261,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -1291,7 +1291,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1311,7 +1311,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -1341,7 +1341,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1361,7 +1361,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -1391,7 +1391,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1411,7 +1411,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -1441,7 +1441,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1461,7 +1461,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -1491,7 +1491,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1511,7 +1511,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -1541,7 +1541,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1561,7 +1561,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -1591,7 +1591,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1611,7 +1611,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -1641,7 +1641,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1661,7 +1661,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -1691,7 +1691,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1711,7 +1711,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -1741,7 +1741,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1761,7 +1761,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -1791,7 +1791,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1812,7 +1812,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -1842,7 +1842,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1864,7 +1864,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -1894,7 +1894,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1916,7 +1916,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -1946,7 +1946,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1968,7 +1968,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -1998,7 +1998,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2020,7 +2020,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -2050,7 +2050,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2072,7 +2072,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -2102,7 +2102,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2126,7 +2126,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -2156,7 +2156,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2180,7 +2180,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -2210,7 +2210,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2234,7 +2234,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -2264,7 +2264,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2288,7 +2288,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -2318,7 +2318,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2342,7 +2342,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -2372,7 +2372,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2396,7 +2396,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -2426,7 +2426,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2450,7 +2450,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -2480,7 +2480,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2504,7 +2504,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -2534,7 +2534,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2558,7 +2558,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -2588,7 +2588,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2612,7 +2612,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -2642,7 +2642,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2666,7 +2666,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -2696,7 +2696,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2720,7 +2720,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -2750,7 +2750,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2774,7 +2774,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -2804,7 +2804,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2828,7 +2828,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -2858,7 +2858,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2882,7 +2882,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -2912,7 +2912,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2934,7 +2934,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -2964,7 +2964,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2986,7 +2986,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -3016,7 +3016,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3038,7 +3038,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -3068,7 +3068,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3090,7 +3090,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -3120,7 +3120,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3142,7 +3142,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -3172,7 +3172,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3194,7 +3194,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -3224,7 +3224,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3246,7 +3246,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -3276,7 +3276,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3297,7 +3297,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -3327,7 +3327,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3348,7 +3348,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -3378,7 +3378,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3399,7 +3399,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -3429,7 +3429,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3450,7 +3450,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -3480,7 +3480,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3501,7 +3501,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -3531,7 +3531,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3554,7 +3554,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -3584,7 +3584,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3608,7 +3608,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -3638,7 +3638,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3662,7 +3662,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -3692,7 +3692,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3716,7 +3716,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -3746,7 +3746,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3770,7 +3770,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -3800,7 +3800,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3824,7 +3824,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -3854,7 +3854,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3875,7 +3875,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -3905,7 +3905,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3925,7 +3925,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -3955,7 +3955,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3975,7 +3975,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -4005,7 +4005,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4025,7 +4025,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -4055,7 +4055,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4075,7 +4075,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -4105,7 +4105,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4125,7 +4125,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -4155,7 +4155,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4176,7 +4176,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -4206,7 +4206,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4228,7 +4228,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -4258,7 +4258,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4280,7 +4280,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -4310,7 +4310,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4332,7 +4332,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -4362,7 +4362,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4384,7 +4384,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -4414,7 +4414,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4436,7 +4436,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -4466,7 +4466,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4487,7 +4487,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -4517,7 +4517,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4537,7 +4537,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -4567,7 +4567,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4587,7 +4587,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -4617,7 +4617,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4637,7 +4637,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -4667,7 +4667,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4688,7 +4688,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -4718,7 +4718,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4739,7 +4739,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -4769,7 +4769,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4790,7 +4790,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -4820,7 +4820,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4840,7 +4840,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -4870,7 +4870,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4890,7 +4890,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -4920,7 +4920,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4940,7 +4940,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -4970,7 +4970,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4990,7 +4990,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -5020,7 +5020,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5040,7 +5040,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -5070,7 +5070,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5090,7 +5090,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -5120,7 +5120,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5140,7 +5140,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -5170,7 +5170,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5190,7 +5190,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -5220,7 +5220,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5241,7 +5241,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -5271,7 +5271,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5292,7 +5292,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -5322,7 +5322,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5343,7 +5343,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -5373,7 +5373,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5394,7 +5394,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -5424,7 +5424,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5445,7 +5445,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -5475,7 +5475,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5496,7 +5496,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -5526,7 +5526,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5547,7 +5547,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -5577,7 +5577,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5598,7 +5598,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -5628,7 +5628,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5649,7 +5649,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -5679,7 +5679,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5699,7 +5699,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -5729,7 +5729,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5749,7 +5749,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -5779,7 +5779,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5799,7 +5799,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -5829,7 +5829,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5849,7 +5849,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -5879,7 +5879,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5899,7 +5899,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -5929,7 +5929,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5949,7 +5949,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -5979,7 +5979,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5999,7 +5999,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -6029,7 +6029,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -6049,7 +6049,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -6079,7 +6079,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -6099,7 +6099,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -6129,7 +6129,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -6149,7 +6149,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -6179,7 +6179,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -6199,7 +6199,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -6229,7 +6229,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -6249,7 +6249,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -6279,7 +6279,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -6299,7 +6299,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -6329,7 +6329,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -6349,7 +6349,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -6379,7 +6379,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -6399,7 +6399,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -6429,7 +6429,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -6449,7 +6449,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -6479,7 +6479,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -6499,7 +6499,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -6529,7 +6529,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -6549,7 +6549,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -6579,7 +6579,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -6599,7 +6599,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -6629,7 +6629,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -6649,7 +6649,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -6679,7 +6679,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -6699,7 +6699,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -6729,7 +6729,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -6749,7 +6749,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -6779,7 +6779,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -6799,7 +6799,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -6829,7 +6829,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -6849,7 +6849,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -6879,7 +6879,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -6899,7 +6899,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -6929,7 +6929,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -6949,7 +6949,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -6979,7 +6979,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -6999,7 +6999,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -7029,7 +7029,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -7049,7 +7049,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -7079,7 +7079,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -7099,7 +7099,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -7129,7 +7129,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -7149,7 +7149,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -7179,7 +7179,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -7199,7 +7199,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -7229,7 +7229,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -7249,7 +7249,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -7279,7 +7279,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -7299,7 +7299,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -7329,7 +7329,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -7349,7 +7349,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -7379,7 +7379,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -7399,7 +7399,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -7429,7 +7429,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -7449,7 +7449,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -7479,7 +7479,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -7499,7 +7499,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -7529,7 +7529,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -7549,7 +7549,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -7579,7 +7579,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -7599,7 +7599,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -7629,7 +7629,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -7649,7 +7649,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -7679,7 +7679,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -7699,7 +7699,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -7729,7 +7729,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -7749,7 +7749,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -7779,7 +7779,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ],
diff --git a/infra/config/generated/builders/try/ios-simulator-exp/properties.json b/infra/config/generated/builders/try/ios-simulator-exp/properties.json index 42382ee..cb35355 100644 --- a/infra/config/generated/builders/try/ios-simulator-exp/properties.json +++ b/infra/config/generated/builders/try/ios-simulator-exp/properties.json
@@ -83,5 +83,5 @@ "builder_group": "tryserver.chromium.mac", "cq": "required", "recipe": "chromium_trybot", - "xcode_build_version": "16b40" + "xcode_build_version": "16c5032a" } \ No newline at end of file
diff --git a/infra/config/generated/builders/try/ios-simulator-exp/targets/chromium.mac.json b/infra/config/generated/builders/try/ios-simulator-exp/targets/chromium.mac.json index c14a637..0671cf9 100644 --- a/infra/config/generated/builders/try/ios-simulator-exp/targets/chromium.mac.json +++ b/infra/config/generated/builders/try/ios-simulator-exp/targets/chromium.mac.json
@@ -13,7 +13,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -43,7 +43,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -58,18 +58,18 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "absl_hardening_tests iPhone 15 18.1", + "name": "absl_hardening_tests iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -88,11 +88,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -100,7 +100,7 @@ }, "test": "absl_hardening_tests", "test_id_prefix": "ninja://third_party/abseil-cpp:absl_hardening_tests/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" }, { "args": [ @@ -111,7 +111,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -141,7 +141,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -156,18 +156,18 @@ "--platform", "iPad Pro 13-inch (M4)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "base_unittests iPad Pro 13-inch (M4) 18.1", + "name": "base_unittests iPad Pro 13-inch (M4) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -186,11 +186,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -198,7 +198,7 @@ }, "test": "base_unittests", "test_id_prefix": "ninja://base:base_unittests/", - "variant_id": "iPad Pro 13-inch (M4) 18.1" + "variant_id": "iPad Pro 13-inch (M4) 18.2" }, { "args": [ @@ -209,7 +209,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -239,7 +239,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -254,18 +254,18 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "base_unittests iPhone 15 18.1", + "name": "base_unittests iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -284,11 +284,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -296,7 +296,7 @@ }, "test": "base_unittests", "test_id_prefix": "ninja://base:base_unittests/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" }, { "args": [ @@ -307,7 +307,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -337,7 +337,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -352,18 +352,18 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "boringssl_crypto_tests iPhone 15 18.1", + "name": "boringssl_crypto_tests iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -382,11 +382,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -394,7 +394,7 @@ }, "test": "boringssl_crypto_tests", "test_id_prefix": "ninja://third_party/boringssl:boringssl_crypto_tests/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" }, { "args": [ @@ -405,7 +405,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -435,7 +435,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -450,18 +450,18 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "boringssl_ssl_tests iPhone 15 18.1", + "name": "boringssl_ssl_tests iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -480,11 +480,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -492,7 +492,7 @@ }, "test": "boringssl_ssl_tests", "test_id_prefix": "ninja://third_party/boringssl:boringssl_ssl_tests/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" }, { "args": [ @@ -503,7 +503,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -533,7 +533,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -548,18 +548,18 @@ "--platform", "iPad Pro 13-inch (M4)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "components_unittests iPad Pro 13-inch (M4) 18.1", + "name": "components_unittests iPad Pro 13-inch (M4) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -578,11 +578,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -590,7 +590,7 @@ }, "test": "components_unittests", "test_id_prefix": "ninja://components:components_unittests/", - "variant_id": "iPad Pro 13-inch (M4) 18.1" + "variant_id": "iPad Pro 13-inch (M4) 18.2" }, { "args": [ @@ -601,7 +601,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -631,7 +631,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -646,18 +646,18 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "components_unittests iPhone 15 18.1", + "name": "components_unittests iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -676,11 +676,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -688,7 +688,7 @@ }, "test": "components_unittests", "test_id_prefix": "ninja://components:components_unittests/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" }, { "args": [ @@ -699,7 +699,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -729,7 +729,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -744,18 +744,18 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "crashpad_tests iPhone 15 18.1", + "name": "crashpad_tests iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -774,11 +774,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -786,7 +786,7 @@ }, "test": "crashpad_tests", "test_id_prefix": "ninja://third_party/crashpad/crashpad:crashpad_tests/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" }, { "args": [ @@ -797,7 +797,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -827,7 +827,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -842,18 +842,18 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "crypto_unittests iPhone 15 18.1", + "name": "crypto_unittests iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -872,11 +872,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -884,7 +884,7 @@ }, "test": "crypto_unittests", "test_id_prefix": "ninja://crypto:crypto_unittests/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" }, { "args": [ @@ -895,7 +895,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -925,7 +925,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -940,18 +940,18 @@ "--platform", "iPad Pro 13-inch (M4)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "gfx_unittests iPad Pro 13-inch (M4) 18.1", + "name": "gfx_unittests iPad Pro 13-inch (M4) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -970,11 +970,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -982,7 +982,7 @@ }, "test": "gfx_unittests", "test_id_prefix": "ninja://ui/gfx:gfx_unittests/", - "variant_id": "iPad Pro 13-inch (M4) 18.1" + "variant_id": "iPad Pro 13-inch (M4) 18.2" }, { "args": [ @@ -993,7 +993,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -1023,7 +1023,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1038,18 +1038,18 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "gfx_unittests iPhone 15 18.1", + "name": "gfx_unittests iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -1068,11 +1068,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1080,7 +1080,7 @@ }, "test": "gfx_unittests", "test_id_prefix": "ninja://ui/gfx:gfx_unittests/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" }, { "args": [ @@ -1091,7 +1091,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -1121,7 +1121,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1136,18 +1136,18 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "google_apis_unittests iPhone 15 18.1", + "name": "google_apis_unittests iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -1166,11 +1166,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1178,7 +1178,7 @@ }, "test": "google_apis_unittests", "test_id_prefix": "ninja://google_apis:google_apis_unittests/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" }, { "args": [ @@ -1192,7 +1192,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -1222,7 +1222,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1240,19 +1240,19 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--xcodebuild-sim-runner", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_integration_eg2tests_module iPhone 15 18.1", + "name": "ios_chrome_integration_eg2tests_module iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -1271,11 +1271,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1284,7 +1284,7 @@ }, "test": "ios_chrome_integration_eg2tests_module", "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" }, { "args": [ @@ -1295,7 +1295,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -1325,7 +1325,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1340,18 +1340,18 @@ "--platform", "iPad Pro 13-inch (M4)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_unittests iPad Pro 13-inch (M4) 18.1", + "name": "ios_chrome_unittests iPad Pro 13-inch (M4) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -1370,11 +1370,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1382,7 +1382,7 @@ }, "test": "ios_chrome_unittests", "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/", - "variant_id": "iPad Pro 13-inch (M4) 18.1" + "variant_id": "iPad Pro 13-inch (M4) 18.2" }, { "args": [ @@ -1393,7 +1393,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -1423,7 +1423,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1438,18 +1438,18 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_unittests iPhone 15 18.1", + "name": "ios_chrome_unittests iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -1468,11 +1468,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1480,7 +1480,7 @@ }, "test": "ios_chrome_unittests", "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" }, { "args": [ @@ -1491,7 +1491,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -1521,7 +1521,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1536,18 +1536,18 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_components_unittests iPhone 15 18.1", + "name": "ios_components_unittests iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -1566,11 +1566,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1578,7 +1578,7 @@ }, "test": "ios_components_unittests", "test_id_prefix": "ninja://ios/components:ios_components_unittests/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" }, { "args": [ @@ -1589,7 +1589,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -1619,7 +1619,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1635,18 +1635,18 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_net_unittests iPhone 15 18.1", + "name": "ios_net_unittests iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -1665,11 +1665,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1678,7 +1678,7 @@ }, "test": "ios_net_unittests", "test_id_prefix": "ninja://ios/net:ios_net_unittests/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" }, { "args": [ @@ -1689,7 +1689,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -1719,7 +1719,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1734,18 +1734,18 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_testing_unittests iPhone 15 18.1", + "name": "ios_testing_unittests iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -1764,11 +1764,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1776,7 +1776,7 @@ }, "test": "ios_testing_unittests", "test_id_prefix": "ninja://ios/testing:ios_testing_unittests/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" }, { "args": [ @@ -1787,7 +1787,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -1817,7 +1817,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1832,18 +1832,18 @@ "--platform", "iPad Pro 13-inch (M4)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_inttests iPad Pro 13-inch (M4) 18.1", + "name": "ios_web_inttests iPad Pro 13-inch (M4) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -1862,11 +1862,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1874,7 +1874,7 @@ }, "test": "ios_web_inttests", "test_id_prefix": "ninja://ios/web:ios_web_inttests/", - "variant_id": "iPad Pro 13-inch (M4) 18.1" + "variant_id": "iPad Pro 13-inch (M4) 18.2" }, { "args": [ @@ -1885,7 +1885,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -1915,7 +1915,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1930,18 +1930,18 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_inttests iPhone 15 18.1", + "name": "ios_web_inttests iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -1960,11 +1960,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1972,7 +1972,7 @@ }, "test": "ios_web_inttests", "test_id_prefix": "ninja://ios/web:ios_web_inttests/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" }, { "args": [ @@ -1984,7 +1984,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -2014,7 +2014,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2029,19 +2029,19 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--xcodebuild-sim-runner", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_shell_eg2tests_module iPhone 15 18.1", + "name": "ios_web_shell_eg2tests_module iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -2060,11 +2060,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2072,7 +2072,7 @@ }, "test": "ios_web_shell_eg2tests_module", "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" }, { "args": [ @@ -2083,7 +2083,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -2113,7 +2113,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2128,18 +2128,18 @@ "--platform", "iPad Pro 13-inch (M4)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_unittests iPad Pro 13-inch (M4) 18.1", + "name": "ios_web_unittests iPad Pro 13-inch (M4) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -2158,11 +2158,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2170,7 +2170,7 @@ }, "test": "ios_web_unittests", "test_id_prefix": "ninja://ios/web:ios_web_unittests/", - "variant_id": "iPad Pro 13-inch (M4) 18.1" + "variant_id": "iPad Pro 13-inch (M4) 18.2" }, { "args": [ @@ -2181,7 +2181,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -2211,7 +2211,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2226,18 +2226,18 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_unittests iPhone 15 18.1", + "name": "ios_web_unittests iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -2256,11 +2256,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2268,7 +2268,7 @@ }, "test": "ios_web_unittests", "test_id_prefix": "ninja://ios/web:ios_web_unittests/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" }, { "args": [ @@ -2279,7 +2279,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -2309,7 +2309,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2324,18 +2324,18 @@ "--platform", "iPad Pro 13-inch (M4)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_view_inttests iPad Pro 13-inch (M4) 18.1", + "name": "ios_web_view_inttests iPad Pro 13-inch (M4) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -2354,11 +2354,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2366,7 +2366,7 @@ }, "test": "ios_web_view_inttests", "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/", - "variant_id": "iPad Pro 13-inch (M4) 18.1" + "variant_id": "iPad Pro 13-inch (M4) 18.2" }, { "args": [ @@ -2377,7 +2377,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -2407,7 +2407,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2422,18 +2422,18 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_view_inttests iPhone 15 18.1", + "name": "ios_web_view_inttests iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -2452,11 +2452,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2464,7 +2464,7 @@ }, "test": "ios_web_view_inttests", "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" }, { "args": [ @@ -2475,7 +2475,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -2505,7 +2505,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2520,18 +2520,18 @@ "--platform", "iPad Pro 13-inch (M4)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_view_unittests iPad Pro 13-inch (M4) 18.1", + "name": "ios_web_view_unittests iPad Pro 13-inch (M4) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -2550,11 +2550,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2562,7 +2562,7 @@ }, "test": "ios_web_view_unittests", "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/", - "variant_id": "iPad Pro 13-inch (M4) 18.1" + "variant_id": "iPad Pro 13-inch (M4) 18.2" }, { "args": [ @@ -2573,7 +2573,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -2603,7 +2603,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2618,18 +2618,18 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_view_unittests iPhone 15 18.1", + "name": "ios_web_view_unittests iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -2648,11 +2648,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2660,7 +2660,7 @@ }, "test": "ios_web_view_unittests", "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" }, { "args": [ @@ -2671,7 +2671,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -2701,7 +2701,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2716,18 +2716,18 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "net_unittests iPhone 15 18.1", + "name": "net_unittests iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -2746,11 +2746,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2758,7 +2758,7 @@ }, "test": "net_unittests", "test_id_prefix": "ninja://net:net_unittests/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" }, { "args": [ @@ -2769,7 +2769,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -2799,7 +2799,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2814,18 +2814,18 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "services_unittests iPhone 15 18.1", + "name": "services_unittests iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -2844,11 +2844,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2856,7 +2856,7 @@ }, "test": "services_unittests", "test_id_prefix": "ninja://services:services_unittests/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" }, { "args": [ @@ -2867,7 +2867,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -2897,7 +2897,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2912,18 +2912,18 @@ "--platform", "iPad Pro 13-inch (M4)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "skia_unittests iPad Pro 13-inch (M4) 18.1", + "name": "skia_unittests iPad Pro 13-inch (M4) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -2942,11 +2942,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2954,7 +2954,7 @@ }, "test": "skia_unittests", "test_id_prefix": "ninja://skia:skia_unittests/", - "variant_id": "iPad Pro 13-inch (M4) 18.1" + "variant_id": "iPad Pro 13-inch (M4) 18.2" }, { "args": [ @@ -2965,7 +2965,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -2995,7 +2995,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3010,18 +3010,18 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "skia_unittests iPhone 15 18.1", + "name": "skia_unittests iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -3040,11 +3040,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3052,7 +3052,7 @@ }, "test": "skia_unittests", "test_id_prefix": "ninja://skia:skia_unittests/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" }, { "args": [ @@ -3063,7 +3063,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -3093,7 +3093,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3108,18 +3108,18 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "sql_unittests iPhone 15 18.1", + "name": "sql_unittests iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -3138,11 +3138,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3150,7 +3150,7 @@ }, "test": "sql_unittests", "test_id_prefix": "ninja://sql:sql_unittests/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" }, { "args": [ @@ -3161,7 +3161,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -3191,7 +3191,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3206,18 +3206,18 @@ "--platform", "iPad Pro 13-inch (M4)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ui_base_unittests iPad Pro 13-inch (M4) 18.1", + "name": "ui_base_unittests iPad Pro 13-inch (M4) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -3236,11 +3236,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3248,7 +3248,7 @@ }, "test": "ui_base_unittests", "test_id_prefix": "ninja://ui/base:ui_base_unittests/", - "variant_id": "iPad Pro 13-inch (M4) 18.1" + "variant_id": "iPad Pro 13-inch (M4) 18.2" }, { "args": [ @@ -3259,7 +3259,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -3289,7 +3289,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3304,18 +3304,18 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ui_base_unittests iPhone 15 18.1", + "name": "ui_base_unittests iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -3334,11 +3334,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3346,7 +3346,7 @@ }, "test": "ui_base_unittests", "test_id_prefix": "ninja://ui/base:ui_base_unittests/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" }, { "args": [ @@ -3357,7 +3357,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -3387,7 +3387,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3402,18 +3402,18 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "url_unittests iPhone 15 18.1", + "name": "url_unittests iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -3432,11 +3432,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3444,7 +3444,7 @@ }, "test": "url_unittests", "test_id_prefix": "ninja://url:url_unittests/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" } ] }
diff --git a/infra/config/generated/builders/try/ios-simulator-full-configs/properties.json b/infra/config/generated/builders/try/ios-simulator-full-configs/properties.json index f3d2f86c..2e652ca 100644 --- a/infra/config/generated/builders/try/ios-simulator-full-configs/properties.json +++ b/infra/config/generated/builders/try/ios-simulator-full-configs/properties.json
@@ -83,5 +83,5 @@ "builder_group": "tryserver.chromium.mac", "cq": "path-based", "recipe": "chromium_trybot", - "xcode_build_version": "16b40" + "xcode_build_version": "16c5032a" } \ No newline at end of file
diff --git a/infra/config/generated/builders/try/ios-simulator-full-configs/targets/chromium.mac.json b/infra/config/generated/builders/try/ios-simulator-full-configs/targets/chromium.mac.json index ce45ba9..dca346c1f 100644 --- a/infra/config/generated/builders/try/ios-simulator-full-configs/targets/chromium.mac.json +++ b/infra/config/generated/builders/try/ios-simulator-full-configs/targets/chromium.mac.json
@@ -13,7 +13,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -43,7 +43,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -63,18 +63,18 @@ "--platform", "iPhone 14 Plus", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "absl_hardening_tests iPhone 14 Plus 18.1", + "name": "absl_hardening_tests iPhone 14 Plus 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -93,11 +93,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -110,7 +110,7 @@ }, "test": "absl_hardening_tests", "test_id_prefix": "ninja://third_party/abseil-cpp:absl_hardening_tests/", - "variant_id": "iPhone 14 Plus 18.1" + "variant_id": "iPhone 14 Plus 18.2" }, { "args": [ @@ -121,7 +121,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -151,7 +151,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -171,18 +171,18 @@ "--platform", "iPad Pro 13-inch (M4)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "base_unittests iPad Pro 13-inch (M4) 18.1", + "name": "base_unittests iPad Pro 13-inch (M4) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -201,11 +201,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -218,7 +218,7 @@ }, "test": "base_unittests", "test_id_prefix": "ninja://base:base_unittests/", - "variant_id": "iPad Pro 13-inch (M4) 18.1" + "variant_id": "iPad Pro 13-inch (M4) 18.2" }, { "args": [ @@ -229,7 +229,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -259,7 +259,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -279,18 +279,18 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "base_unittests iPhone 15 18.1", + "name": "base_unittests iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -309,11 +309,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -326,7 +326,7 @@ }, "test": "base_unittests", "test_id_prefix": "ninja://base:base_unittests/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" }, { "args": [ @@ -337,7 +337,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -367,7 +367,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -387,18 +387,18 @@ "--platform", "iPhone 14 Plus", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "boringssl_crypto_tests iPhone 14 Plus 18.1", + "name": "boringssl_crypto_tests iPhone 14 Plus 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -417,11 +417,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -434,7 +434,7 @@ }, "test": "boringssl_crypto_tests", "test_id_prefix": "ninja://third_party/boringssl:boringssl_crypto_tests/", - "variant_id": "iPhone 14 Plus 18.1" + "variant_id": "iPhone 14 Plus 18.2" }, { "args": [ @@ -445,7 +445,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -475,7 +475,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -495,18 +495,18 @@ "--platform", "iPhone 14 Plus", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "boringssl_ssl_tests iPhone 14 Plus 18.1", + "name": "boringssl_ssl_tests iPhone 14 Plus 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -525,11 +525,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -542,7 +542,7 @@ }, "test": "boringssl_ssl_tests", "test_id_prefix": "ninja://third_party/boringssl:boringssl_ssl_tests/", - "variant_id": "iPhone 14 Plus 18.1" + "variant_id": "iPhone 14 Plus 18.2" }, { "args": [ @@ -553,7 +553,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -583,7 +583,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -603,18 +603,18 @@ "--platform", "iPad Pro 13-inch (M4)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "components_unittests iPad Pro 13-inch (M4) 18.1", + "name": "components_unittests iPad Pro 13-inch (M4) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -633,11 +633,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -650,7 +650,7 @@ }, "test": "components_unittests", "test_id_prefix": "ninja://components:components_unittests/", - "variant_id": "iPad Pro 13-inch (M4) 18.1" + "variant_id": "iPad Pro 13-inch (M4) 18.2" }, { "args": [ @@ -661,7 +661,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -691,7 +691,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -711,18 +711,18 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "components_unittests iPhone 15 18.1", + "name": "components_unittests iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -741,11 +741,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -758,7 +758,7 @@ }, "test": "components_unittests", "test_id_prefix": "ninja://components:components_unittests/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" }, { "args": [ @@ -769,7 +769,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -799,7 +799,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -819,18 +819,18 @@ "--platform", "iPhone 14 Plus", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "crashpad_tests iPhone 14 Plus 18.1", + "name": "crashpad_tests iPhone 14 Plus 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -849,11 +849,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -866,7 +866,7 @@ }, "test": "crashpad_tests", "test_id_prefix": "ninja://third_party/crashpad/crashpad:crashpad_tests/", - "variant_id": "iPhone 14 Plus 18.1" + "variant_id": "iPhone 14 Plus 18.2" }, { "args": [ @@ -877,7 +877,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -907,7 +907,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -927,18 +927,18 @@ "--platform", "iPhone 14 Plus", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "crypto_unittests iPhone 14 Plus 18.1", + "name": "crypto_unittests iPhone 14 Plus 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -957,11 +957,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -974,7 +974,7 @@ }, "test": "crypto_unittests", "test_id_prefix": "ninja://crypto:crypto_unittests/", - "variant_id": "iPhone 14 Plus 18.1" + "variant_id": "iPhone 14 Plus 18.2" }, { "args": [ @@ -985,7 +985,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -1015,7 +1015,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1035,18 +1035,18 @@ "--platform", "iPad Pro 13-inch (M4)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "gfx_unittests iPad Pro 13-inch (M4) 18.1", + "name": "gfx_unittests iPad Pro 13-inch (M4) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -1065,11 +1065,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1082,7 +1082,7 @@ }, "test": "gfx_unittests", "test_id_prefix": "ninja://ui/gfx:gfx_unittests/", - "variant_id": "iPad Pro 13-inch (M4) 18.1" + "variant_id": "iPad Pro 13-inch (M4) 18.2" }, { "args": [ @@ -1093,7 +1093,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -1123,7 +1123,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1143,18 +1143,18 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "gfx_unittests iPhone 15 18.1", + "name": "gfx_unittests iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -1173,11 +1173,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1190,7 +1190,7 @@ }, "test": "gfx_unittests", "test_id_prefix": "ninja://ui/gfx:gfx_unittests/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" }, { "args": [ @@ -1201,7 +1201,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -1231,7 +1231,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1251,18 +1251,18 @@ "--platform", "iPhone 14 Plus", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "google_apis_unittests iPhone 14 Plus 18.1", + "name": "google_apis_unittests iPhone 14 Plus 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -1281,11 +1281,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1298,7 +1298,7 @@ }, "test": "google_apis_unittests", "test_id_prefix": "ninja://google_apis:google_apis_unittests/", - "variant_id": "iPhone 14 Plus 18.1" + "variant_id": "iPhone 14 Plus 18.2" }, { "args": [ @@ -1310,7 +1310,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -1340,7 +1340,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1356,19 +1356,19 @@ "--platform", "iPad Pro 13-inch (M4)", "--version", - "18.1", + "18.2", "--xcodebuild-sim-runner", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_bookmarks_eg2tests_module iPad Pro 13-inch (M4) 18.1", + "name": "ios_chrome_bookmarks_eg2tests_module iPad Pro 13-inch (M4) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -1387,11 +1387,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1400,7 +1400,7 @@ }, "test": "ios_chrome_bookmarks_eg2tests_module", "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/", - "variant_id": "iPad Pro 13-inch (M4) 18.1" + "variant_id": "iPad Pro 13-inch (M4) 18.2" }, { "args": [ @@ -1412,7 +1412,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -1442,7 +1442,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1458,19 +1458,19 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--xcodebuild-sim-runner", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_bookmarks_eg2tests_module iPhone 15 18.1", + "name": "ios_chrome_bookmarks_eg2tests_module iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -1489,11 +1489,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1502,7 +1502,7 @@ }, "test": "ios_chrome_bookmarks_eg2tests_module", "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" }, { "args": [ @@ -1516,7 +1516,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -1546,7 +1546,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1564,19 +1564,19 @@ "--platform", "iPad Air 11-inch (M2)", "--version", - "18.1", + "18.2", "--xcodebuild-sim-runner", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_integration_eg2tests_module iPad Air (6th generation) 18.1", + "name": "ios_chrome_integration_eg2tests_module iPad Air (6th generation) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -1595,11 +1595,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1608,7 +1608,7 @@ }, "test": "ios_chrome_integration_eg2tests_module", "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/", - "variant_id": "iPad Air (6th generation) 18.1" + "variant_id": "iPad Air (6th generation) 18.2" }, { "args": [ @@ -1622,7 +1622,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -1652,7 +1652,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1670,19 +1670,19 @@ "--platform", "iPad Pro 13-inch (M4)", "--version", - "18.1", + "18.2", "--xcodebuild-sim-runner", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_integration_eg2tests_module iPad Pro 13-inch (M4) 18.1", + "name": "ios_chrome_integration_eg2tests_module iPad Pro 13-inch (M4) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -1701,11 +1701,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1714,7 +1714,7 @@ }, "test": "ios_chrome_integration_eg2tests_module", "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/", - "variant_id": "iPad Pro 13-inch (M4) 18.1" + "variant_id": "iPad Pro 13-inch (M4) 18.2" }, { "args": [ @@ -1728,7 +1728,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -1758,7 +1758,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1776,19 +1776,19 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--xcodebuild-sim-runner", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_integration_eg2tests_module iPhone 15 18.1", + "name": "ios_chrome_integration_eg2tests_module iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -1807,11 +1807,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1820,7 +1820,7 @@ }, "test": "ios_chrome_integration_eg2tests_module", "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" }, { "args": [ @@ -1834,7 +1834,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -1864,7 +1864,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1882,19 +1882,19 @@ "--platform", "iPad Pro 13-inch (M4)", "--version", - "18.1", + "18.2", "--xcodebuild-sim-runner", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_settings_eg2tests_module iPad Pro 13-inch (M4) 18.1", + "name": "ios_chrome_settings_eg2tests_module iPad Pro 13-inch (M4) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -1913,11 +1913,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1926,7 +1926,7 @@ }, "test": "ios_chrome_settings_eg2tests_module", "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/", - "variant_id": "iPad Pro 13-inch (M4) 18.1" + "variant_id": "iPad Pro 13-inch (M4) 18.2" }, { "args": [ @@ -1940,7 +1940,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -1970,7 +1970,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1988,19 +1988,19 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--xcodebuild-sim-runner", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_settings_eg2tests_module iPhone 15 18.1", + "name": "ios_chrome_settings_eg2tests_module iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -2019,11 +2019,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2032,7 +2032,7 @@ }, "test": "ios_chrome_settings_eg2tests_module", "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" }, { "args": [ @@ -2044,7 +2044,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -2074,7 +2074,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2090,19 +2090,19 @@ "--platform", "iPad Pro 13-inch (M4)", "--version", - "18.1", + "18.2", "--xcodebuild-sim-runner", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_signin_eg2tests_module iPad Pro 13-inch (M4) 18.1", + "name": "ios_chrome_signin_eg2tests_module iPad Pro 13-inch (M4) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -2121,11 +2121,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2134,7 +2134,7 @@ }, "test": "ios_chrome_signin_eg2tests_module", "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/", - "variant_id": "iPad Pro 13-inch (M4) 18.1" + "variant_id": "iPad Pro 13-inch (M4) 18.2" }, { "args": [ @@ -2146,7 +2146,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -2176,7 +2176,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2192,19 +2192,19 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--xcodebuild-sim-runner", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_signin_eg2tests_module iPhone 15 18.1", + "name": "ios_chrome_signin_eg2tests_module iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -2223,11 +2223,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2236,7 +2236,7 @@ }, "test": "ios_chrome_signin_eg2tests_module", "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" }, { "args": [ @@ -2248,7 +2248,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -2278,7 +2278,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2293,19 +2293,19 @@ "--platform", "iPad Pro 13-inch (M4)", "--version", - "18.1", + "18.2", "--xcodebuild-sim-runner", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_smoke_eg2tests_module iPad Pro 13-inch (M4) 18.1", + "name": "ios_chrome_smoke_eg2tests_module iPad Pro 13-inch (M4) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -2324,11 +2324,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2336,7 +2336,7 @@ }, "test": "ios_chrome_smoke_eg2tests_module", "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/", - "variant_id": "iPad Pro 13-inch (M4) 18.1" + "variant_id": "iPad Pro 13-inch (M4) 18.2" }, { "args": [ @@ -2348,7 +2348,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -2378,7 +2378,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2393,19 +2393,19 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--xcodebuild-sim-runner", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_smoke_eg2tests_module iPhone 15 18.1", + "name": "ios_chrome_smoke_eg2tests_module iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -2424,11 +2424,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2436,7 +2436,7 @@ }, "test": "ios_chrome_smoke_eg2tests_module", "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" }, { "args": [ @@ -2450,7 +2450,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -2480,7 +2480,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2498,19 +2498,19 @@ "--platform", "iPad Pro 13-inch (M4)", "--version", - "18.1", + "18.2", "--xcodebuild-sim-runner", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_ui_eg2tests_module iPad Pro 13-inch (M4) 18.1", + "name": "ios_chrome_ui_eg2tests_module iPad Pro 13-inch (M4) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -2529,11 +2529,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2542,7 +2542,7 @@ }, "test": "ios_chrome_ui_eg2tests_module", "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/", - "variant_id": "iPad Pro 13-inch (M4) 18.1" + "variant_id": "iPad Pro 13-inch (M4) 18.2" }, { "args": [ @@ -2556,7 +2556,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -2586,7 +2586,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2604,19 +2604,19 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--xcodebuild-sim-runner", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_ui_eg2tests_module iPhone 15 18.1", + "name": "ios_chrome_ui_eg2tests_module iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -2635,11 +2635,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2648,7 +2648,7 @@ }, "test": "ios_chrome_ui_eg2tests_module", "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" }, { "args": [ @@ -2659,7 +2659,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -2689,7 +2689,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2709,18 +2709,18 @@ "--platform", "iPad Pro 13-inch (M4)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_unittests iPad Pro 13-inch (M4) 18.1", + "name": "ios_chrome_unittests iPad Pro 13-inch (M4) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -2739,11 +2739,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2756,7 +2756,7 @@ }, "test": "ios_chrome_unittests", "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/", - "variant_id": "iPad Pro 13-inch (M4) 18.1" + "variant_id": "iPad Pro 13-inch (M4) 18.2" }, { "args": [ @@ -2767,7 +2767,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -2797,7 +2797,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2817,18 +2817,18 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_unittests iPhone 15 18.1", + "name": "ios_chrome_unittests iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -2847,11 +2847,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2864,7 +2864,7 @@ }, "test": "ios_chrome_unittests", "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" }, { "args": [ @@ -2876,7 +2876,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -2906,7 +2906,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2922,19 +2922,19 @@ "--platform", "iPad Pro 13-inch (M4)", "--version", - "18.1", + "18.2", "--xcodebuild-sim-runner", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_web_eg2tests_module iPad Pro 13-inch (M4) 18.1", + "name": "ios_chrome_web_eg2tests_module iPad Pro 13-inch (M4) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -2953,11 +2953,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2966,7 +2966,7 @@ }, "test": "ios_chrome_web_eg2tests_module", "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/", - "variant_id": "iPad Pro 13-inch (M4) 18.1" + "variant_id": "iPad Pro 13-inch (M4) 18.2" }, { "args": [ @@ -2978,7 +2978,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -3008,7 +3008,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3024,19 +3024,19 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--xcodebuild-sim-runner", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_web_eg2tests_module iPhone 15 18.1", + "name": "ios_chrome_web_eg2tests_module iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -3055,11 +3055,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3068,7 +3068,7 @@ }, "test": "ios_chrome_web_eg2tests_module", "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" }, { "args": [ @@ -3079,7 +3079,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -3109,7 +3109,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3129,18 +3129,18 @@ "--platform", "iPhone 14 Plus", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_components_unittests iPhone 14 Plus 18.1", + "name": "ios_components_unittests iPhone 14 Plus 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -3159,11 +3159,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3176,7 +3176,7 @@ }, "test": "ios_components_unittests", "test_id_prefix": "ninja://ios/components:ios_components_unittests/", - "variant_id": "iPhone 14 Plus 18.1" + "variant_id": "iPhone 14 Plus 18.2" }, { "args": [ @@ -3187,7 +3187,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -3217,7 +3217,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3238,18 +3238,18 @@ "--platform", "iPhone 14 Plus", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_net_unittests iPhone 14 Plus 18.1", + "name": "ios_net_unittests iPhone 14 Plus 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -3268,11 +3268,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3286,7 +3286,7 @@ }, "test": "ios_net_unittests", "test_id_prefix": "ninja://ios/net:ios_net_unittests/", - "variant_id": "iPhone 14 Plus 18.1" + "variant_id": "iPhone 14 Plus 18.2" }, { "args": [ @@ -3297,7 +3297,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -3327,7 +3327,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3347,18 +3347,18 @@ "--platform", "iPhone 14 Plus", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_testing_unittests iPhone 14 Plus 18.1", + "name": "ios_testing_unittests iPhone 14 Plus 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -3377,11 +3377,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3394,7 +3394,7 @@ }, "test": "ios_testing_unittests", "test_id_prefix": "ninja://ios/testing:ios_testing_unittests/", - "variant_id": "iPhone 14 Plus 18.1" + "variant_id": "iPhone 14 Plus 18.2" }, { "args": [ @@ -3405,7 +3405,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -3435,7 +3435,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3455,18 +3455,18 @@ "--platform", "iPad Pro 13-inch (M4)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_inttests iPad Pro 13-inch (M4) 18.1", + "name": "ios_web_inttests iPad Pro 13-inch (M4) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -3485,11 +3485,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3502,7 +3502,7 @@ }, "test": "ios_web_inttests", "test_id_prefix": "ninja://ios/web:ios_web_inttests/", - "variant_id": "iPad Pro 13-inch (M4) 18.1" + "variant_id": "iPad Pro 13-inch (M4) 18.2" }, { "args": [ @@ -3513,7 +3513,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -3543,7 +3543,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3563,18 +3563,18 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_inttests iPhone 15 18.1", + "name": "ios_web_inttests iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -3593,11 +3593,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3610,7 +3610,7 @@ }, "test": "ios_web_inttests", "test_id_prefix": "ninja://ios/web:ios_web_inttests/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" }, { "args": [ @@ -3622,7 +3622,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -3652,7 +3652,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3667,19 +3667,19 @@ "--platform", "iPad Air 11-inch (M2)", "--version", - "18.1", + "18.2", "--xcodebuild-sim-runner", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_shell_eg2tests_module iPad Air (6th generation) 18.1", + "name": "ios_web_shell_eg2tests_module iPad Air (6th generation) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -3698,11 +3698,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3710,7 +3710,7 @@ }, "test": "ios_web_shell_eg2tests_module", "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/", - "variant_id": "iPad Air (6th generation) 18.1" + "variant_id": "iPad Air (6th generation) 18.2" }, { "args": [ @@ -3722,7 +3722,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -3752,7 +3752,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3767,19 +3767,19 @@ "--platform", "iPad Pro 13-inch (M4)", "--version", - "18.1", + "18.2", "--xcodebuild-sim-runner", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_shell_eg2tests_module iPad Pro 13-inch (M4) 18.1", + "name": "ios_web_shell_eg2tests_module iPad Pro 13-inch (M4) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -3798,11 +3798,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3810,7 +3810,7 @@ }, "test": "ios_web_shell_eg2tests_module", "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/", - "variant_id": "iPad Pro 13-inch (M4) 18.1" + "variant_id": "iPad Pro 13-inch (M4) 18.2" }, { "args": [ @@ -3822,7 +3822,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -3852,7 +3852,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3867,19 +3867,19 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--xcodebuild-sim-runner", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_shell_eg2tests_module iPhone 15 18.1", + "name": "ios_web_shell_eg2tests_module iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -3898,11 +3898,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3910,7 +3910,7 @@ }, "test": "ios_web_shell_eg2tests_module", "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" }, { "args": [ @@ -3921,7 +3921,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -3951,7 +3951,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3971,18 +3971,18 @@ "--platform", "iPad Pro 13-inch (M4)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_unittests iPad Pro 13-inch (M4) 18.1", + "name": "ios_web_unittests iPad Pro 13-inch (M4) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -4001,11 +4001,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4018,7 +4018,7 @@ }, "test": "ios_web_unittests", "test_id_prefix": "ninja://ios/web:ios_web_unittests/", - "variant_id": "iPad Pro 13-inch (M4) 18.1" + "variant_id": "iPad Pro 13-inch (M4) 18.2" }, { "args": [ @@ -4029,7 +4029,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -4059,7 +4059,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4079,18 +4079,18 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_unittests iPhone 15 18.1", + "name": "ios_web_unittests iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -4109,11 +4109,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4126,7 +4126,7 @@ }, "test": "ios_web_unittests", "test_id_prefix": "ninja://ios/web:ios_web_unittests/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" }, { "args": [ @@ -4137,7 +4137,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -4167,7 +4167,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4187,18 +4187,18 @@ "--platform", "iPad Pro 13-inch (M4)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_view_inttests iPad Pro 13-inch (M4) 18.1", + "name": "ios_web_view_inttests iPad Pro 13-inch (M4) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -4217,11 +4217,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4234,7 +4234,7 @@ }, "test": "ios_web_view_inttests", "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/", - "variant_id": "iPad Pro 13-inch (M4) 18.1" + "variant_id": "iPad Pro 13-inch (M4) 18.2" }, { "args": [ @@ -4245,7 +4245,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -4275,7 +4275,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4295,18 +4295,18 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_view_inttests iPhone 15 18.1", + "name": "ios_web_view_inttests iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -4325,11 +4325,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4342,7 +4342,7 @@ }, "test": "ios_web_view_inttests", "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" }, { "args": [ @@ -4353,7 +4353,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -4383,7 +4383,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4403,18 +4403,18 @@ "--platform", "iPad Pro 13-inch (M4)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_view_unittests iPad Pro 13-inch (M4) 18.1", + "name": "ios_web_view_unittests iPad Pro 13-inch (M4) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -4433,11 +4433,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4450,7 +4450,7 @@ }, "test": "ios_web_view_unittests", "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/", - "variant_id": "iPad Pro 13-inch (M4) 18.1" + "variant_id": "iPad Pro 13-inch (M4) 18.2" }, { "args": [ @@ -4461,7 +4461,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -4491,7 +4491,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4511,18 +4511,18 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_view_unittests iPhone 15 18.1", + "name": "ios_web_view_unittests iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -4541,11 +4541,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4558,7 +4558,7 @@ }, "test": "ios_web_view_unittests", "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" }, { "args": [ @@ -4569,7 +4569,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -4599,7 +4599,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4619,18 +4619,18 @@ "--platform", "iPhone 14 Plus", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "net_unittests iPhone 14 Plus 18.1", + "name": "net_unittests iPhone 14 Plus 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -4649,11 +4649,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4666,7 +4666,7 @@ }, "test": "net_unittests", "test_id_prefix": "ninja://net:net_unittests/", - "variant_id": "iPhone 14 Plus 18.1" + "variant_id": "iPhone 14 Plus 18.2" }, { "args": [ @@ -4677,7 +4677,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -4707,7 +4707,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4727,18 +4727,18 @@ "--platform", "iPhone 14 Plus", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "services_unittests iPhone 14 Plus 18.1", + "name": "services_unittests iPhone 14 Plus 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -4757,11 +4757,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4774,7 +4774,7 @@ }, "test": "services_unittests", "test_id_prefix": "ninja://services:services_unittests/", - "variant_id": "iPhone 14 Plus 18.1" + "variant_id": "iPhone 14 Plus 18.2" }, { "args": [ @@ -4785,7 +4785,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -4815,7 +4815,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4835,18 +4835,18 @@ "--platform", "iPad Pro 13-inch (M4)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "skia_unittests iPad Pro 13-inch (M4) 18.1", + "name": "skia_unittests iPad Pro 13-inch (M4) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -4865,11 +4865,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4882,7 +4882,7 @@ }, "test": "skia_unittests", "test_id_prefix": "ninja://skia:skia_unittests/", - "variant_id": "iPad Pro 13-inch (M4) 18.1" + "variant_id": "iPad Pro 13-inch (M4) 18.2" }, { "args": [ @@ -4893,7 +4893,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -4923,7 +4923,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4943,18 +4943,18 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "skia_unittests iPhone 15 18.1", + "name": "skia_unittests iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -4973,11 +4973,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4990,7 +4990,7 @@ }, "test": "skia_unittests", "test_id_prefix": "ninja://skia:skia_unittests/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" }, { "args": [ @@ -5001,7 +5001,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -5031,7 +5031,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5051,18 +5051,18 @@ "--platform", "iPhone 14 Plus", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "sql_unittests iPhone 14 Plus 18.1", + "name": "sql_unittests iPhone 14 Plus 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -5081,11 +5081,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5098,7 +5098,7 @@ }, "test": "sql_unittests", "test_id_prefix": "ninja://sql:sql_unittests/", - "variant_id": "iPhone 14 Plus 18.1" + "variant_id": "iPhone 14 Plus 18.2" }, { "args": [ @@ -5109,7 +5109,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -5139,7 +5139,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5159,18 +5159,18 @@ "--platform", "iPad Pro 13-inch (M4)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ui_base_unittests iPad Pro 13-inch (M4) 18.1", + "name": "ui_base_unittests iPad Pro 13-inch (M4) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -5189,11 +5189,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5206,7 +5206,7 @@ }, "test": "ui_base_unittests", "test_id_prefix": "ninja://ui/base:ui_base_unittests/", - "variant_id": "iPad Pro 13-inch (M4) 18.1" + "variant_id": "iPad Pro 13-inch (M4) 18.2" }, { "args": [ @@ -5217,7 +5217,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -5247,7 +5247,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5267,18 +5267,18 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ui_base_unittests iPhone 15 18.1", + "name": "ui_base_unittests iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -5297,11 +5297,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5314,7 +5314,7 @@ }, "test": "ui_base_unittests", "test_id_prefix": "ninja://ui/base:ui_base_unittests/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" }, { "args": [ @@ -5325,7 +5325,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -5355,7 +5355,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5375,18 +5375,18 @@ "--platform", "iPhone 14 Plus", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "url_unittests iPhone 14 Plus 18.1", + "name": "url_unittests iPhone 14 Plus 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -5405,11 +5405,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5422,7 +5422,7 @@ }, "test": "url_unittests", "test_id_prefix": "ninja://url:url_unittests/", - "variant_id": "iPhone 14 Plus 18.1" + "variant_id": "iPhone 14 Plus 18.2" } ] }
diff --git a/infra/config/generated/builders/try/ios-simulator-noncq/properties.json b/infra/config/generated/builders/try/ios-simulator-noncq/properties.json index d95814d..903653a 100644 --- a/infra/config/generated/builders/try/ios-simulator-noncq/properties.json +++ b/infra/config/generated/builders/try/ios-simulator-noncq/properties.json
@@ -72,5 +72,5 @@ "builder_group": "tryserver.chromium.mac", "cq": "path-based", "recipe": "chromium_trybot", - "xcode_build_version": "16b40" + "xcode_build_version": "16c5032a" } \ No newline at end of file
diff --git a/infra/config/generated/builders/try/ios-simulator-noncq/targets/chromium.mac.json b/infra/config/generated/builders/try/ios-simulator-noncq/targets/chromium.mac.json index e2ad14a..a70abbe 100644 --- a/infra/config/generated/builders/try/ios-simulator-noncq/targets/chromium.mac.json +++ b/infra/config/generated/builders/try/ios-simulator-noncq/targets/chromium.mac.json
@@ -13,7 +13,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -42,7 +42,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -66,7 +66,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -95,7 +95,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -115,17 +115,17 @@ "--platform", "iPad Air 11-inch (M2)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "base_unittests iPad Air (6th generation) 18.1", + "name": "base_unittests iPad Air (6th generation) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -144,11 +144,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -161,7 +161,7 @@ }, "test": "base_unittests", "test_id_prefix": "ninja://base:base_unittests/", - "variant_id": "iPad Air (6th generation) 18.1" + "variant_id": "iPad Air (6th generation) 18.2" }, { "args": [ @@ -172,7 +172,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -201,7 +201,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -225,7 +225,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -254,7 +254,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -274,17 +274,17 @@ "--platform", "iPad Pro 13-inch (M4)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "base_unittests iPad Pro 13-inch (M4) 18.1", + "name": "base_unittests iPad Pro 13-inch (M4) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -303,11 +303,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -320,7 +320,7 @@ }, "test": "base_unittests", "test_id_prefix": "ninja://base:base_unittests/", - "variant_id": "iPad Pro 13-inch (M4) 18.1" + "variant_id": "iPad Pro 13-inch (M4) 18.2" }, { "args": [ @@ -331,7 +331,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -360,7 +360,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -384,7 +384,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -413,7 +413,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -433,17 +433,17 @@ "--platform", "iPhone 14 Plus", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "base_unittests iPhone 14 Plus 18.1", + "name": "base_unittests iPhone 14 Plus 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -462,11 +462,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -479,7 +479,7 @@ }, "test": "base_unittests", "test_id_prefix": "ninja://base:base_unittests/", - "variant_id": "iPhone 14 Plus 18.1" + "variant_id": "iPhone 14 Plus 18.2" }, { "args": [ @@ -490,7 +490,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -519,7 +519,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -543,7 +543,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -572,7 +572,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -592,17 +592,17 @@ "--platform", "iPhone SE (3rd generation)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "base_unittests iPhone SE (3rd generation) 18.1", + "name": "base_unittests iPhone SE (3rd generation) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -621,11 +621,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -638,7 +638,7 @@ }, "test": "base_unittests", "test_id_prefix": "ninja://base:base_unittests/", - "variant_id": "iPhone SE (3rd generation) 18.1" + "variant_id": "iPhone SE (3rd generation) 18.2" }, { "args": [ @@ -649,7 +649,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -678,7 +678,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -702,7 +702,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -731,7 +731,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -751,17 +751,17 @@ "--platform", "iPad Air 11-inch (M2)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "components_unittests iPad Air (6th generation) 18.1", + "name": "components_unittests iPad Air (6th generation) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -780,11 +780,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -797,7 +797,7 @@ }, "test": "components_unittests", "test_id_prefix": "ninja://components:components_unittests/", - "variant_id": "iPad Air (6th generation) 18.1" + "variant_id": "iPad Air (6th generation) 18.2" }, { "args": [ @@ -808,7 +808,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -837,7 +837,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -861,7 +861,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -890,7 +890,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -910,17 +910,17 @@ "--platform", "iPad Pro 13-inch (M4)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "components_unittests iPad Pro 13-inch (M4) 18.1", + "name": "components_unittests iPad Pro 13-inch (M4) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -939,11 +939,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -956,7 +956,7 @@ }, "test": "components_unittests", "test_id_prefix": "ninja://components:components_unittests/", - "variant_id": "iPad Pro 13-inch (M4) 18.1" + "variant_id": "iPad Pro 13-inch (M4) 18.2" }, { "args": [ @@ -967,7 +967,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -996,7 +996,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1020,7 +1020,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1049,7 +1049,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1069,17 +1069,17 @@ "--platform", "iPhone 14 Plus", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "components_unittests iPhone 14 Plus 18.1", + "name": "components_unittests iPhone 14 Plus 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -1098,11 +1098,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1115,7 +1115,7 @@ }, "test": "components_unittests", "test_id_prefix": "ninja://components:components_unittests/", - "variant_id": "iPhone 14 Plus 18.1" + "variant_id": "iPhone 14 Plus 18.2" }, { "args": [ @@ -1126,7 +1126,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1155,7 +1155,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1179,7 +1179,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1208,7 +1208,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1228,17 +1228,17 @@ "--platform", "iPhone SE (3rd generation)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "components_unittests iPhone SE (3rd generation) 18.1", + "name": "components_unittests iPhone SE (3rd generation) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -1257,11 +1257,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1274,7 +1274,7 @@ }, "test": "components_unittests", "test_id_prefix": "ninja://components:components_unittests/", - "variant_id": "iPhone SE (3rd generation) 18.1" + "variant_id": "iPhone SE (3rd generation) 18.2" }, { "args": [ @@ -1285,7 +1285,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1314,7 +1314,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1338,7 +1338,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1367,7 +1367,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1387,17 +1387,17 @@ "--platform", "iPad Air 11-inch (M2)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "gfx_unittests iPad Air (6th generation) 18.1", + "name": "gfx_unittests iPad Air (6th generation) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -1416,11 +1416,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1433,7 +1433,7 @@ }, "test": "gfx_unittests", "test_id_prefix": "ninja://ui/gfx:gfx_unittests/", - "variant_id": "iPad Air (6th generation) 18.1" + "variant_id": "iPad Air (6th generation) 18.2" }, { "args": [ @@ -1444,7 +1444,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1473,7 +1473,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1497,7 +1497,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1526,7 +1526,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1546,17 +1546,17 @@ "--platform", "iPad Pro 13-inch (M4)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "gfx_unittests iPad Pro 13-inch (M4) 18.1", + "name": "gfx_unittests iPad Pro 13-inch (M4) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -1575,11 +1575,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1592,7 +1592,7 @@ }, "test": "gfx_unittests", "test_id_prefix": "ninja://ui/gfx:gfx_unittests/", - "variant_id": "iPad Pro 13-inch (M4) 18.1" + "variant_id": "iPad Pro 13-inch (M4) 18.2" }, { "args": [ @@ -1603,7 +1603,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1632,7 +1632,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1656,7 +1656,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1685,7 +1685,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1705,17 +1705,17 @@ "--platform", "iPhone 14 Plus", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "gfx_unittests iPhone 14 Plus 18.1", + "name": "gfx_unittests iPhone 14 Plus 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -1734,11 +1734,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1751,7 +1751,7 @@ }, "test": "gfx_unittests", "test_id_prefix": "ninja://ui/gfx:gfx_unittests/", - "variant_id": "iPhone 14 Plus 18.1" + "variant_id": "iPhone 14 Plus 18.2" }, { "args": [ @@ -1762,7 +1762,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1791,7 +1791,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1815,7 +1815,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1844,7 +1844,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1864,17 +1864,17 @@ "--platform", "iPhone SE (3rd generation)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "gfx_unittests iPhone SE (3rd generation) 18.1", + "name": "gfx_unittests iPhone SE (3rd generation) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -1893,11 +1893,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1910,7 +1910,7 @@ }, "test": "gfx_unittests", "test_id_prefix": "ninja://ui/gfx:gfx_unittests/", - "variant_id": "iPhone SE (3rd generation) 18.1" + "variant_id": "iPhone SE (3rd generation) 18.2" }, { "args": [ @@ -1924,7 +1924,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -1953,7 +1953,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1976,7 +1976,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2005,7 +2005,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2021,20 +2021,20 @@ "--platform", "iPad Pro 13-inch (M4)", "--version", - "18.1", + "18.2", "--xcodebuild-sim-runner", "--record-video", "failed_only", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_bookmarks_eg2tests_module iPad Pro 13-inch (M4) 18.1", + "name": "ios_chrome_bookmarks_eg2tests_module iPad Pro 13-inch (M4) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -2053,11 +2053,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2066,7 +2066,7 @@ }, "test": "ios_chrome_bookmarks_eg2tests_module", "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/", - "variant_id": "iPad Pro 13-inch (M4) 18.1" + "variant_id": "iPad Pro 13-inch (M4) 18.2" }, { "args": [ @@ -2082,7 +2082,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2111,7 +2111,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2136,7 +2136,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2165,7 +2165,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2183,20 +2183,20 @@ "--platform", "iPad Air 11-inch (M2)", "--version", - "18.1", + "18.2", "--xcodebuild-sim-runner", "--record-video", "failed_only", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_integration_eg2tests_module iPad Air (6th generation) 18.1", + "name": "ios_chrome_integration_eg2tests_module iPad Air (6th generation) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -2215,11 +2215,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2228,7 +2228,7 @@ }, "test": "ios_chrome_integration_eg2tests_module", "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/", - "variant_id": "iPad Air (6th generation) 18.1" + "variant_id": "iPad Air (6th generation) 18.2" }, { "args": [ @@ -2244,7 +2244,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2273,7 +2273,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2298,7 +2298,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2327,7 +2327,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2345,20 +2345,20 @@ "--platform", "iPad Pro 13-inch (M4)", "--version", - "18.1", + "18.2", "--xcodebuild-sim-runner", "--record-video", "failed_only", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_settings_eg2tests_module iPad Pro 13-inch (M4) 18.1", + "name": "ios_chrome_settings_eg2tests_module iPad Pro 13-inch (M4) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -2377,11 +2377,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2390,7 +2390,7 @@ }, "test": "ios_chrome_settings_eg2tests_module", "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/", - "variant_id": "iPad Pro 13-inch (M4) 18.1" + "variant_id": "iPad Pro 13-inch (M4) 18.2" }, { "args": [ @@ -2404,7 +2404,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2433,7 +2433,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2456,7 +2456,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2485,7 +2485,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2501,20 +2501,20 @@ "--platform", "iPad Pro 13-inch (M4)", "--version", - "18.1", + "18.2", "--xcodebuild-sim-runner", "--record-video", "failed_only", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_signin_eg2tests_module iPad Pro 13-inch (M4) 18.1", + "name": "ios_chrome_signin_eg2tests_module iPad Pro 13-inch (M4) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -2533,11 +2533,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2546,7 +2546,7 @@ }, "test": "ios_chrome_signin_eg2tests_module", "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/", - "variant_id": "iPad Pro 13-inch (M4) 18.1" + "variant_id": "iPad Pro 13-inch (M4) 18.2" }, { "args": [ @@ -2560,7 +2560,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2589,7 +2589,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2611,7 +2611,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2640,7 +2640,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2655,20 +2655,20 @@ "--platform", "iPad Pro 13-inch (M4)", "--version", - "18.1", + "18.2", "--xcodebuild-sim-runner", "--record-video", "failed_only", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_smoke_eg2tests_module iPad Pro 13-inch (M4) 18.1", + "name": "ios_chrome_smoke_eg2tests_module iPad Pro 13-inch (M4) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -2687,11 +2687,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2699,7 +2699,7 @@ }, "test": "ios_chrome_smoke_eg2tests_module", "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/", - "variant_id": "iPad Pro 13-inch (M4) 18.1" + "variant_id": "iPad Pro 13-inch (M4) 18.2" }, { "args": [ @@ -2715,7 +2715,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2744,7 +2744,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2769,7 +2769,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2798,7 +2798,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2816,20 +2816,20 @@ "--platform", "iPad Pro 13-inch (M4)", "--version", - "18.1", + "18.2", "--xcodebuild-sim-runner", "--record-video", "failed_only", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_ui_eg2tests_module iPad Pro 13-inch (M4) 18.1", + "name": "ios_chrome_ui_eg2tests_module iPad Pro 13-inch (M4) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -2848,11 +2848,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2861,7 +2861,7 @@ }, "test": "ios_chrome_ui_eg2tests_module", "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/", - "variant_id": "iPad Pro 13-inch (M4) 18.1" + "variant_id": "iPad Pro 13-inch (M4) 18.2" }, { "args": [ @@ -2872,7 +2872,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2901,7 +2901,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2925,7 +2925,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -2954,7 +2954,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2974,17 +2974,17 @@ "--platform", "iPad Air 11-inch (M2)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_unittests iPad Air (6th generation) 18.1", + "name": "ios_chrome_unittests iPad Air (6th generation) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -3003,11 +3003,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3020,7 +3020,7 @@ }, "test": "ios_chrome_unittests", "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/", - "variant_id": "iPad Air (6th generation) 18.1" + "variant_id": "iPad Air (6th generation) 18.2" }, { "args": [ @@ -3031,7 +3031,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3060,7 +3060,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3084,7 +3084,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3113,7 +3113,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3133,17 +3133,17 @@ "--platform", "iPad Pro 13-inch (M4)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_unittests iPad Pro 13-inch (M4) 18.1", + "name": "ios_chrome_unittests iPad Pro 13-inch (M4) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -3162,11 +3162,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3179,7 +3179,7 @@ }, "test": "ios_chrome_unittests", "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/", - "variant_id": "iPad Pro 13-inch (M4) 18.1" + "variant_id": "iPad Pro 13-inch (M4) 18.2" }, { "args": [ @@ -3190,7 +3190,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3219,7 +3219,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3243,7 +3243,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3272,7 +3272,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3292,17 +3292,17 @@ "--platform", "iPhone 14 Plus", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_unittests iPhone 14 Plus 18.1", + "name": "ios_chrome_unittests iPhone 14 Plus 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -3321,11 +3321,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3338,7 +3338,7 @@ }, "test": "ios_chrome_unittests", "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/", - "variant_id": "iPhone 14 Plus 18.1" + "variant_id": "iPhone 14 Plus 18.2" }, { "args": [ @@ -3349,7 +3349,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3378,7 +3378,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3402,7 +3402,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3431,7 +3431,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3451,17 +3451,17 @@ "--platform", "iPhone SE (3rd generation)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_unittests iPhone SE (3rd generation) 18.1", + "name": "ios_chrome_unittests iPhone SE (3rd generation) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -3480,11 +3480,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3497,7 +3497,7 @@ }, "test": "ios_chrome_unittests", "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/", - "variant_id": "iPhone SE (3rd generation) 18.1" + "variant_id": "iPhone SE (3rd generation) 18.2" }, { "args": [ @@ -3511,7 +3511,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3540,7 +3540,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3563,7 +3563,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3592,7 +3592,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3608,20 +3608,20 @@ "--platform", "iPad Pro 13-inch (M4)", "--version", - "18.1", + "18.2", "--xcodebuild-sim-runner", "--record-video", "failed_only", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_web_eg2tests_module iPad Pro 13-inch (M4) 18.1", + "name": "ios_chrome_web_eg2tests_module iPad Pro 13-inch (M4) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -3640,11 +3640,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3653,7 +3653,7 @@ }, "test": "ios_chrome_web_eg2tests_module", "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/", - "variant_id": "iPad Pro 13-inch (M4) 18.1" + "variant_id": "iPad Pro 13-inch (M4) 18.2" }, { "args": [ @@ -3665,7 +3665,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3694,7 +3694,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3714,7 +3714,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3743,7 +3743,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3758,18 +3758,18 @@ "--platform", "iPhone SE (3rd generation)", "--version", - "18.1", + "18.2", "--xcodebuild-sim-runner", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_crash_xcuitests_module iPhone SE (3rd generation) 18.1", + "name": "ios_crash_xcuitests_module iPhone SE (3rd generation) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -3788,11 +3788,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3800,7 +3800,7 @@ }, "test": "ios_crash_xcuitests_module", "test_id_prefix": "ninja://third_party/crashpad/crashpad/test/ios:ios_crash_xcuitests_module/", - "variant_id": "iPhone SE (3rd generation) 18.1" + "variant_id": "iPhone SE (3rd generation) 18.2" }, { "args": [ @@ -3811,7 +3811,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3840,7 +3840,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3864,7 +3864,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3893,7 +3893,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3913,17 +3913,17 @@ "--platform", "iPad Air 11-inch (M2)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_inttests iPad Air (6th generation) 18.1", + "name": "ios_web_inttests iPad Air (6th generation) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -3942,11 +3942,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3959,7 +3959,7 @@ }, "test": "ios_web_inttests", "test_id_prefix": "ninja://ios/web:ios_web_inttests/", - "variant_id": "iPad Air (6th generation) 18.1" + "variant_id": "iPad Air (6th generation) 18.2" }, { "args": [ @@ -3970,7 +3970,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -3999,7 +3999,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4023,7 +4023,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -4052,7 +4052,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4072,17 +4072,17 @@ "--platform", "iPad Pro 13-inch (M4)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_inttests iPad Pro 13-inch (M4) 18.1", + "name": "ios_web_inttests iPad Pro 13-inch (M4) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -4101,11 +4101,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4118,7 +4118,7 @@ }, "test": "ios_web_inttests", "test_id_prefix": "ninja://ios/web:ios_web_inttests/", - "variant_id": "iPad Pro 13-inch (M4) 18.1" + "variant_id": "iPad Pro 13-inch (M4) 18.2" }, { "args": [ @@ -4129,7 +4129,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -4158,7 +4158,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4182,7 +4182,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -4211,7 +4211,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4231,17 +4231,17 @@ "--platform", "iPhone 14 Plus", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_inttests iPhone 14 Plus 18.1", + "name": "ios_web_inttests iPhone 14 Plus 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -4260,11 +4260,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4277,7 +4277,7 @@ }, "test": "ios_web_inttests", "test_id_prefix": "ninja://ios/web:ios_web_inttests/", - "variant_id": "iPhone 14 Plus 18.1" + "variant_id": "iPhone 14 Plus 18.2" }, { "args": [ @@ -4288,7 +4288,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -4317,7 +4317,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4341,7 +4341,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -4370,7 +4370,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4390,17 +4390,17 @@ "--platform", "iPhone SE (3rd generation)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_inttests iPhone SE (3rd generation) 18.1", + "name": "ios_web_inttests iPhone SE (3rd generation) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -4419,11 +4419,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4436,7 +4436,7 @@ }, "test": "ios_web_inttests", "test_id_prefix": "ninja://ios/web:ios_web_inttests/", - "variant_id": "iPhone SE (3rd generation) 18.1" + "variant_id": "iPhone SE (3rd generation) 18.2" }, { "args": [ @@ -4450,7 +4450,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -4479,7 +4479,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4501,7 +4501,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -4530,7 +4530,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4545,20 +4545,20 @@ "--platform", "iPad Air 11-inch (M2)", "--version", - "18.1", + "18.2", "--xcodebuild-sim-runner", "--record-video", "failed_only", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_shell_eg2tests_module iPad Air (6th generation) 18.1", + "name": "ios_web_shell_eg2tests_module iPad Air (6th generation) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -4577,11 +4577,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4589,7 +4589,7 @@ }, "test": "ios_web_shell_eg2tests_module", "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/", - "variant_id": "iPad Air (6th generation) 18.1" + "variant_id": "iPad Air (6th generation) 18.2" }, { "args": [ @@ -4600,7 +4600,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -4629,7 +4629,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4653,7 +4653,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -4682,7 +4682,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4702,17 +4702,17 @@ "--platform", "iPad Air 11-inch (M2)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_unittests iPad Air (6th generation) 18.1", + "name": "ios_web_unittests iPad Air (6th generation) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -4731,11 +4731,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4748,7 +4748,7 @@ }, "test": "ios_web_unittests", "test_id_prefix": "ninja://ios/web:ios_web_unittests/", - "variant_id": "iPad Air (6th generation) 18.1" + "variant_id": "iPad Air (6th generation) 18.2" }, { "args": [ @@ -4759,7 +4759,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -4788,7 +4788,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4812,7 +4812,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -4841,7 +4841,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4861,17 +4861,17 @@ "--platform", "iPad Pro 13-inch (M4)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_unittests iPad Pro 13-inch (M4) 18.1", + "name": "ios_web_unittests iPad Pro 13-inch (M4) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -4890,11 +4890,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4907,7 +4907,7 @@ }, "test": "ios_web_unittests", "test_id_prefix": "ninja://ios/web:ios_web_unittests/", - "variant_id": "iPad Pro 13-inch (M4) 18.1" + "variant_id": "iPad Pro 13-inch (M4) 18.2" }, { "args": [ @@ -4918,7 +4918,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -4947,7 +4947,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -4971,7 +4971,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -5000,7 +5000,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5020,17 +5020,17 @@ "--platform", "iPhone 14 Plus", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_unittests iPhone 14 Plus 18.1", + "name": "ios_web_unittests iPhone 14 Plus 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -5049,11 +5049,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5066,7 +5066,7 @@ }, "test": "ios_web_unittests", "test_id_prefix": "ninja://ios/web:ios_web_unittests/", - "variant_id": "iPhone 14 Plus 18.1" + "variant_id": "iPhone 14 Plus 18.2" }, { "args": [ @@ -5077,7 +5077,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -5106,7 +5106,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5130,7 +5130,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -5159,7 +5159,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5179,17 +5179,17 @@ "--platform", "iPhone SE (3rd generation)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_unittests iPhone SE (3rd generation) 18.1", + "name": "ios_web_unittests iPhone SE (3rd generation) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -5208,11 +5208,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5225,7 +5225,7 @@ }, "test": "ios_web_unittests", "test_id_prefix": "ninja://ios/web:ios_web_unittests/", - "variant_id": "iPhone SE (3rd generation) 18.1" + "variant_id": "iPhone SE (3rd generation) 18.2" }, { "args": [ @@ -5236,7 +5236,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -5265,7 +5265,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5289,7 +5289,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -5318,7 +5318,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5338,17 +5338,17 @@ "--platform", "iPad Air 11-inch (M2)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_view_inttests iPad Air (6th generation) 18.1", + "name": "ios_web_view_inttests iPad Air (6th generation) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -5367,11 +5367,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5384,7 +5384,7 @@ }, "test": "ios_web_view_inttests", "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/", - "variant_id": "iPad Air (6th generation) 18.1" + "variant_id": "iPad Air (6th generation) 18.2" }, { "args": [ @@ -5395,7 +5395,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -5424,7 +5424,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5448,7 +5448,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -5477,7 +5477,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5497,17 +5497,17 @@ "--platform", "iPad Pro 13-inch (M4)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_view_inttests iPad Pro 13-inch (M4) 18.1", + "name": "ios_web_view_inttests iPad Pro 13-inch (M4) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -5526,11 +5526,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5543,7 +5543,7 @@ }, "test": "ios_web_view_inttests", "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/", - "variant_id": "iPad Pro 13-inch (M4) 18.1" + "variant_id": "iPad Pro 13-inch (M4) 18.2" }, { "args": [ @@ -5554,7 +5554,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -5583,7 +5583,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5607,7 +5607,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -5636,7 +5636,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5656,17 +5656,17 @@ "--platform", "iPhone 14 Plus", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_view_inttests iPhone 14 Plus 18.1", + "name": "ios_web_view_inttests iPhone 14 Plus 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -5685,11 +5685,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5702,7 +5702,7 @@ }, "test": "ios_web_view_inttests", "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/", - "variant_id": "iPhone 14 Plus 18.1" + "variant_id": "iPhone 14 Plus 18.2" }, { "args": [ @@ -5713,7 +5713,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -5742,7 +5742,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5766,7 +5766,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -5795,7 +5795,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5815,17 +5815,17 @@ "--platform", "iPhone SE (3rd generation)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_view_inttests iPhone SE (3rd generation) 18.1", + "name": "ios_web_view_inttests iPhone SE (3rd generation) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -5844,11 +5844,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5861,7 +5861,7 @@ }, "test": "ios_web_view_inttests", "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/", - "variant_id": "iPhone SE (3rd generation) 18.1" + "variant_id": "iPhone SE (3rd generation) 18.2" }, { "args": [ @@ -5872,7 +5872,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -5901,7 +5901,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5925,7 +5925,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -5954,7 +5954,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -5974,17 +5974,17 @@ "--platform", "iPad Air 11-inch (M2)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_view_unittests iPad Air (6th generation) 18.1", + "name": "ios_web_view_unittests iPad Air (6th generation) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -6003,11 +6003,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -6020,7 +6020,7 @@ }, "test": "ios_web_view_unittests", "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/", - "variant_id": "iPad Air (6th generation) 18.1" + "variant_id": "iPad Air (6th generation) 18.2" }, { "args": [ @@ -6031,7 +6031,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -6060,7 +6060,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -6084,7 +6084,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -6113,7 +6113,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -6133,17 +6133,17 @@ "--platform", "iPad Pro 13-inch (M4)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_view_unittests iPad Pro 13-inch (M4) 18.1", + "name": "ios_web_view_unittests iPad Pro 13-inch (M4) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -6162,11 +6162,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -6179,7 +6179,7 @@ }, "test": "ios_web_view_unittests", "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/", - "variant_id": "iPad Pro 13-inch (M4) 18.1" + "variant_id": "iPad Pro 13-inch (M4) 18.2" }, { "args": [ @@ -6190,7 +6190,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -6219,7 +6219,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -6243,7 +6243,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -6272,7 +6272,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -6292,17 +6292,17 @@ "--platform", "iPhone 14 Plus", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_view_unittests iPhone 14 Plus 18.1", + "name": "ios_web_view_unittests iPhone 14 Plus 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -6321,11 +6321,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -6338,7 +6338,7 @@ }, "test": "ios_web_view_unittests", "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/", - "variant_id": "iPhone 14 Plus 18.1" + "variant_id": "iPhone 14 Plus 18.2" }, { "args": [ @@ -6349,7 +6349,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -6378,7 +6378,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -6402,7 +6402,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -6431,7 +6431,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -6451,17 +6451,17 @@ "--platform", "iPhone SE (3rd generation)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_view_unittests iPhone SE (3rd generation) 18.1", + "name": "ios_web_view_unittests iPhone SE (3rd generation) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -6480,11 +6480,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -6497,7 +6497,7 @@ }, "test": "ios_web_view_unittests", "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/", - "variant_id": "iPhone SE (3rd generation) 18.1" + "variant_id": "iPhone SE (3rd generation) 18.2" }, { "args": [ @@ -6508,7 +6508,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -6537,7 +6537,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -6561,7 +6561,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -6590,7 +6590,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -6610,17 +6610,17 @@ "--platform", "iPad Air 11-inch (M2)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "skia_unittests iPad Air (6th generation) 18.1", + "name": "skia_unittests iPad Air (6th generation) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -6639,11 +6639,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -6656,7 +6656,7 @@ }, "test": "skia_unittests", "test_id_prefix": "ninja://skia:skia_unittests/", - "variant_id": "iPad Air (6th generation) 18.1" + "variant_id": "iPad Air (6th generation) 18.2" }, { "args": [ @@ -6667,7 +6667,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -6696,7 +6696,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -6720,7 +6720,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -6749,7 +6749,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -6769,17 +6769,17 @@ "--platform", "iPad Pro 13-inch (M4)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "skia_unittests iPad Pro 13-inch (M4) 18.1", + "name": "skia_unittests iPad Pro 13-inch (M4) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -6798,11 +6798,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -6815,7 +6815,7 @@ }, "test": "skia_unittests", "test_id_prefix": "ninja://skia:skia_unittests/", - "variant_id": "iPad Pro 13-inch (M4) 18.1" + "variant_id": "iPad Pro 13-inch (M4) 18.2" }, { "args": [ @@ -6826,7 +6826,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -6855,7 +6855,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -6879,7 +6879,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -6908,7 +6908,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -6928,17 +6928,17 @@ "--platform", "iPhone 14 Plus", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "skia_unittests iPhone 14 Plus 18.1", + "name": "skia_unittests iPhone 14 Plus 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -6957,11 +6957,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -6974,7 +6974,7 @@ }, "test": "skia_unittests", "test_id_prefix": "ninja://skia:skia_unittests/", - "variant_id": "iPhone 14 Plus 18.1" + "variant_id": "iPhone 14 Plus 18.2" }, { "args": [ @@ -6985,7 +6985,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -7014,7 +7014,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -7038,7 +7038,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -7067,7 +7067,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -7087,17 +7087,17 @@ "--platform", "iPhone SE (3rd generation)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "skia_unittests iPhone SE (3rd generation) 18.1", + "name": "skia_unittests iPhone SE (3rd generation) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -7116,11 +7116,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -7133,7 +7133,7 @@ }, "test": "skia_unittests", "test_id_prefix": "ninja://skia:skia_unittests/", - "variant_id": "iPhone SE (3rd generation) 18.1" + "variant_id": "iPhone SE (3rd generation) 18.2" }, { "args": [ @@ -7144,7 +7144,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -7173,7 +7173,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -7197,7 +7197,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -7226,7 +7226,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -7246,17 +7246,17 @@ "--platform", "iPad Air 11-inch (M2)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ui_base_unittests iPad Air (6th generation) 18.1", + "name": "ui_base_unittests iPad Air (6th generation) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -7275,11 +7275,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -7292,7 +7292,7 @@ }, "test": "ui_base_unittests", "test_id_prefix": "ninja://ui/base:ui_base_unittests/", - "variant_id": "iPad Air (6th generation) 18.1" + "variant_id": "iPad Air (6th generation) 18.2" }, { "args": [ @@ -7303,7 +7303,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -7332,7 +7332,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -7356,7 +7356,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -7385,7 +7385,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -7405,17 +7405,17 @@ "--platform", "iPad Pro 13-inch (M4)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ui_base_unittests iPad Pro 13-inch (M4) 18.1", + "name": "ui_base_unittests iPad Pro 13-inch (M4) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -7434,11 +7434,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -7451,7 +7451,7 @@ }, "test": "ui_base_unittests", "test_id_prefix": "ninja://ui/base:ui_base_unittests/", - "variant_id": "iPad Pro 13-inch (M4) 18.1" + "variant_id": "iPad Pro 13-inch (M4) 18.2" }, { "args": [ @@ -7462,7 +7462,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -7491,7 +7491,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -7515,7 +7515,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -7544,7 +7544,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -7564,17 +7564,17 @@ "--platform", "iPhone 14 Plus", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ui_base_unittests iPhone 14 Plus 18.1", + "name": "ui_base_unittests iPhone 14 Plus 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -7593,11 +7593,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -7610,7 +7610,7 @@ }, "test": "ui_base_unittests", "test_id_prefix": "ninja://ui/base:ui_base_unittests/", - "variant_id": "iPhone 14 Plus 18.1" + "variant_id": "iPhone 14 Plus 18.2" }, { "args": [ @@ -7621,7 +7621,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -7650,7 +7650,7 @@ "path": "Runtime-ios-16.4" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -7674,7 +7674,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -7703,7 +7703,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -7723,17 +7723,17 @@ "--platform", "iPhone SE (3rd generation)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ui_base_unittests iPhone SE (3rd generation) 18.1", + "name": "ui_base_unittests iPhone SE (3rd generation) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -7752,11 +7752,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -7769,7 +7769,7 @@ }, "test": "ui_base_unittests", "test_id_prefix": "ninja://ui/base:ui_base_unittests/", - "variant_id": "iPhone SE (3rd generation) 18.1" + "variant_id": "iPhone SE (3rd generation) 18.2" } ] }
diff --git a/infra/config/generated/builders/try/ios-simulator/properties.json b/infra/config/generated/builders/try/ios-simulator/properties.json index 0ccbc670..4be44140 100644 --- a/infra/config/generated/builders/try/ios-simulator/properties.json +++ b/infra/config/generated/builders/try/ios-simulator/properties.json
@@ -87,5 +87,5 @@ "builder_group": "tryserver.chromium.mac", "cq": "required", "recipe": "chromium/orchestrator", - "xcode_build_version": "16b40" + "xcode_build_version": "16c5032a" } \ No newline at end of file
diff --git a/infra/config/generated/builders/try/ios-simulator/targets/chromium.mac.json b/infra/config/generated/builders/try/ios-simulator/targets/chromium.mac.json index c14a637..0671cf9 100644 --- a/infra/config/generated/builders/try/ios-simulator/targets/chromium.mac.json +++ b/infra/config/generated/builders/try/ios-simulator/targets/chromium.mac.json
@@ -13,7 +13,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -43,7 +43,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -58,18 +58,18 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "absl_hardening_tests iPhone 15 18.1", + "name": "absl_hardening_tests iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -88,11 +88,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -100,7 +100,7 @@ }, "test": "absl_hardening_tests", "test_id_prefix": "ninja://third_party/abseil-cpp:absl_hardening_tests/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" }, { "args": [ @@ -111,7 +111,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -141,7 +141,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -156,18 +156,18 @@ "--platform", "iPad Pro 13-inch (M4)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "base_unittests iPad Pro 13-inch (M4) 18.1", + "name": "base_unittests iPad Pro 13-inch (M4) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -186,11 +186,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -198,7 +198,7 @@ }, "test": "base_unittests", "test_id_prefix": "ninja://base:base_unittests/", - "variant_id": "iPad Pro 13-inch (M4) 18.1" + "variant_id": "iPad Pro 13-inch (M4) 18.2" }, { "args": [ @@ -209,7 +209,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -239,7 +239,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -254,18 +254,18 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "base_unittests iPhone 15 18.1", + "name": "base_unittests iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -284,11 +284,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -296,7 +296,7 @@ }, "test": "base_unittests", "test_id_prefix": "ninja://base:base_unittests/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" }, { "args": [ @@ -307,7 +307,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -337,7 +337,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -352,18 +352,18 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "boringssl_crypto_tests iPhone 15 18.1", + "name": "boringssl_crypto_tests iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -382,11 +382,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -394,7 +394,7 @@ }, "test": "boringssl_crypto_tests", "test_id_prefix": "ninja://third_party/boringssl:boringssl_crypto_tests/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" }, { "args": [ @@ -405,7 +405,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -435,7 +435,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -450,18 +450,18 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "boringssl_ssl_tests iPhone 15 18.1", + "name": "boringssl_ssl_tests iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -480,11 +480,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -492,7 +492,7 @@ }, "test": "boringssl_ssl_tests", "test_id_prefix": "ninja://third_party/boringssl:boringssl_ssl_tests/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" }, { "args": [ @@ -503,7 +503,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -533,7 +533,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -548,18 +548,18 @@ "--platform", "iPad Pro 13-inch (M4)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "components_unittests iPad Pro 13-inch (M4) 18.1", + "name": "components_unittests iPad Pro 13-inch (M4) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -578,11 +578,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -590,7 +590,7 @@ }, "test": "components_unittests", "test_id_prefix": "ninja://components:components_unittests/", - "variant_id": "iPad Pro 13-inch (M4) 18.1" + "variant_id": "iPad Pro 13-inch (M4) 18.2" }, { "args": [ @@ -601,7 +601,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -631,7 +631,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -646,18 +646,18 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "components_unittests iPhone 15 18.1", + "name": "components_unittests iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -676,11 +676,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -688,7 +688,7 @@ }, "test": "components_unittests", "test_id_prefix": "ninja://components:components_unittests/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" }, { "args": [ @@ -699,7 +699,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -729,7 +729,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -744,18 +744,18 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "crashpad_tests iPhone 15 18.1", + "name": "crashpad_tests iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -774,11 +774,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -786,7 +786,7 @@ }, "test": "crashpad_tests", "test_id_prefix": "ninja://third_party/crashpad/crashpad:crashpad_tests/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" }, { "args": [ @@ -797,7 +797,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -827,7 +827,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -842,18 +842,18 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "crypto_unittests iPhone 15 18.1", + "name": "crypto_unittests iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -872,11 +872,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -884,7 +884,7 @@ }, "test": "crypto_unittests", "test_id_prefix": "ninja://crypto:crypto_unittests/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" }, { "args": [ @@ -895,7 +895,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -925,7 +925,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -940,18 +940,18 @@ "--platform", "iPad Pro 13-inch (M4)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "gfx_unittests iPad Pro 13-inch (M4) 18.1", + "name": "gfx_unittests iPad Pro 13-inch (M4) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -970,11 +970,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -982,7 +982,7 @@ }, "test": "gfx_unittests", "test_id_prefix": "ninja://ui/gfx:gfx_unittests/", - "variant_id": "iPad Pro 13-inch (M4) 18.1" + "variant_id": "iPad Pro 13-inch (M4) 18.2" }, { "args": [ @@ -993,7 +993,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -1023,7 +1023,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1038,18 +1038,18 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "gfx_unittests iPhone 15 18.1", + "name": "gfx_unittests iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -1068,11 +1068,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1080,7 +1080,7 @@ }, "test": "gfx_unittests", "test_id_prefix": "ninja://ui/gfx:gfx_unittests/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" }, { "args": [ @@ -1091,7 +1091,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -1121,7 +1121,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1136,18 +1136,18 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "google_apis_unittests iPhone 15 18.1", + "name": "google_apis_unittests iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -1166,11 +1166,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1178,7 +1178,7 @@ }, "test": "google_apis_unittests", "test_id_prefix": "ninja://google_apis:google_apis_unittests/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" }, { "args": [ @@ -1192,7 +1192,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -1222,7 +1222,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1240,19 +1240,19 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--xcodebuild-sim-runner", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_integration_eg2tests_module iPhone 15 18.1", + "name": "ios_chrome_integration_eg2tests_module iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -1271,11 +1271,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1284,7 +1284,7 @@ }, "test": "ios_chrome_integration_eg2tests_module", "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" }, { "args": [ @@ -1295,7 +1295,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -1325,7 +1325,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1340,18 +1340,18 @@ "--platform", "iPad Pro 13-inch (M4)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_unittests iPad Pro 13-inch (M4) 18.1", + "name": "ios_chrome_unittests iPad Pro 13-inch (M4) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -1370,11 +1370,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1382,7 +1382,7 @@ }, "test": "ios_chrome_unittests", "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/", - "variant_id": "iPad Pro 13-inch (M4) 18.1" + "variant_id": "iPad Pro 13-inch (M4) 18.2" }, { "args": [ @@ -1393,7 +1393,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -1423,7 +1423,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1438,18 +1438,18 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_unittests iPhone 15 18.1", + "name": "ios_chrome_unittests iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -1468,11 +1468,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1480,7 +1480,7 @@ }, "test": "ios_chrome_unittests", "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" }, { "args": [ @@ -1491,7 +1491,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -1521,7 +1521,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1536,18 +1536,18 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_components_unittests iPhone 15 18.1", + "name": "ios_components_unittests iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -1566,11 +1566,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1578,7 +1578,7 @@ }, "test": "ios_components_unittests", "test_id_prefix": "ninja://ios/components:ios_components_unittests/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" }, { "args": [ @@ -1589,7 +1589,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -1619,7 +1619,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1635,18 +1635,18 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_net_unittests iPhone 15 18.1", + "name": "ios_net_unittests iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -1665,11 +1665,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1678,7 +1678,7 @@ }, "test": "ios_net_unittests", "test_id_prefix": "ninja://ios/net:ios_net_unittests/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" }, { "args": [ @@ -1689,7 +1689,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -1719,7 +1719,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1734,18 +1734,18 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_testing_unittests iPhone 15 18.1", + "name": "ios_testing_unittests iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -1764,11 +1764,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1776,7 +1776,7 @@ }, "test": "ios_testing_unittests", "test_id_prefix": "ninja://ios/testing:ios_testing_unittests/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" }, { "args": [ @@ -1787,7 +1787,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -1817,7 +1817,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1832,18 +1832,18 @@ "--platform", "iPad Pro 13-inch (M4)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_inttests iPad Pro 13-inch (M4) 18.1", + "name": "ios_web_inttests iPad Pro 13-inch (M4) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -1862,11 +1862,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1874,7 +1874,7 @@ }, "test": "ios_web_inttests", "test_id_prefix": "ninja://ios/web:ios_web_inttests/", - "variant_id": "iPad Pro 13-inch (M4) 18.1" + "variant_id": "iPad Pro 13-inch (M4) 18.2" }, { "args": [ @@ -1885,7 +1885,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -1915,7 +1915,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1930,18 +1930,18 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_inttests iPhone 15 18.1", + "name": "ios_web_inttests iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -1960,11 +1960,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1972,7 +1972,7 @@ }, "test": "ios_web_inttests", "test_id_prefix": "ninja://ios/web:ios_web_inttests/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" }, { "args": [ @@ -1984,7 +1984,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -2014,7 +2014,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2029,19 +2029,19 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--xcodebuild-sim-runner", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_shell_eg2tests_module iPhone 15 18.1", + "name": "ios_web_shell_eg2tests_module iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -2060,11 +2060,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2072,7 +2072,7 @@ }, "test": "ios_web_shell_eg2tests_module", "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" }, { "args": [ @@ -2083,7 +2083,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -2113,7 +2113,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2128,18 +2128,18 @@ "--platform", "iPad Pro 13-inch (M4)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_unittests iPad Pro 13-inch (M4) 18.1", + "name": "ios_web_unittests iPad Pro 13-inch (M4) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -2158,11 +2158,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2170,7 +2170,7 @@ }, "test": "ios_web_unittests", "test_id_prefix": "ninja://ios/web:ios_web_unittests/", - "variant_id": "iPad Pro 13-inch (M4) 18.1" + "variant_id": "iPad Pro 13-inch (M4) 18.2" }, { "args": [ @@ -2181,7 +2181,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -2211,7 +2211,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2226,18 +2226,18 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_unittests iPhone 15 18.1", + "name": "ios_web_unittests iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -2256,11 +2256,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2268,7 +2268,7 @@ }, "test": "ios_web_unittests", "test_id_prefix": "ninja://ios/web:ios_web_unittests/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" }, { "args": [ @@ -2279,7 +2279,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -2309,7 +2309,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2324,18 +2324,18 @@ "--platform", "iPad Pro 13-inch (M4)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_view_inttests iPad Pro 13-inch (M4) 18.1", + "name": "ios_web_view_inttests iPad Pro 13-inch (M4) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -2354,11 +2354,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2366,7 +2366,7 @@ }, "test": "ios_web_view_inttests", "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/", - "variant_id": "iPad Pro 13-inch (M4) 18.1" + "variant_id": "iPad Pro 13-inch (M4) 18.2" }, { "args": [ @@ -2377,7 +2377,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -2407,7 +2407,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2422,18 +2422,18 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_view_inttests iPhone 15 18.1", + "name": "ios_web_view_inttests iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -2452,11 +2452,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2464,7 +2464,7 @@ }, "test": "ios_web_view_inttests", "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" }, { "args": [ @@ -2475,7 +2475,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -2505,7 +2505,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2520,18 +2520,18 @@ "--platform", "iPad Pro 13-inch (M4)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_view_unittests iPad Pro 13-inch (M4) 18.1", + "name": "ios_web_view_unittests iPad Pro 13-inch (M4) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -2550,11 +2550,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2562,7 +2562,7 @@ }, "test": "ios_web_view_unittests", "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/", - "variant_id": "iPad Pro 13-inch (M4) 18.1" + "variant_id": "iPad Pro 13-inch (M4) 18.2" }, { "args": [ @@ -2573,7 +2573,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -2603,7 +2603,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2618,18 +2618,18 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_view_unittests iPhone 15 18.1", + "name": "ios_web_view_unittests iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -2648,11 +2648,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2660,7 +2660,7 @@ }, "test": "ios_web_view_unittests", "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" }, { "args": [ @@ -2671,7 +2671,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -2701,7 +2701,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2716,18 +2716,18 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "net_unittests iPhone 15 18.1", + "name": "net_unittests iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -2746,11 +2746,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2758,7 +2758,7 @@ }, "test": "net_unittests", "test_id_prefix": "ninja://net:net_unittests/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" }, { "args": [ @@ -2769,7 +2769,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -2799,7 +2799,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2814,18 +2814,18 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "services_unittests iPhone 15 18.1", + "name": "services_unittests iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -2844,11 +2844,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2856,7 +2856,7 @@ }, "test": "services_unittests", "test_id_prefix": "ninja://services:services_unittests/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" }, { "args": [ @@ -2867,7 +2867,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -2897,7 +2897,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2912,18 +2912,18 @@ "--platform", "iPad Pro 13-inch (M4)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "skia_unittests iPad Pro 13-inch (M4) 18.1", + "name": "skia_unittests iPad Pro 13-inch (M4) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -2942,11 +2942,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -2954,7 +2954,7 @@ }, "test": "skia_unittests", "test_id_prefix": "ninja://skia:skia_unittests/", - "variant_id": "iPad Pro 13-inch (M4) 18.1" + "variant_id": "iPad Pro 13-inch (M4) 18.2" }, { "args": [ @@ -2965,7 +2965,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -2995,7 +2995,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3010,18 +3010,18 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "skia_unittests iPhone 15 18.1", + "name": "skia_unittests iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -3040,11 +3040,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3052,7 +3052,7 @@ }, "test": "skia_unittests", "test_id_prefix": "ninja://skia:skia_unittests/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" }, { "args": [ @@ -3063,7 +3063,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -3093,7 +3093,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3108,18 +3108,18 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "sql_unittests iPhone 15 18.1", + "name": "sql_unittests iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -3138,11 +3138,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3150,7 +3150,7 @@ }, "test": "sql_unittests", "test_id_prefix": "ninja://sql:sql_unittests/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" }, { "args": [ @@ -3161,7 +3161,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -3191,7 +3191,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3206,18 +3206,18 @@ "--platform", "iPad Pro 13-inch (M4)", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ui_base_unittests iPad Pro 13-inch (M4) 18.1", + "name": "ui_base_unittests iPad Pro 13-inch (M4) 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -3236,11 +3236,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3248,7 +3248,7 @@ }, "test": "ui_base_unittests", "test_id_prefix": "ninja://ui/base:ui_base_unittests/", - "variant_id": "iPad Pro 13-inch (M4) 18.1" + "variant_id": "iPad Pro 13-inch (M4) 18.2" }, { "args": [ @@ -3259,7 +3259,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -3289,7 +3289,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3304,18 +3304,18 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ui_base_unittests iPhone 15 18.1", + "name": "ui_base_unittests iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -3334,11 +3334,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3346,7 +3346,7 @@ }, "test": "ui_base_unittests", "test_id_prefix": "ninja://ui/base:ui_base_unittests/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" }, { "args": [ @@ -3357,7 +3357,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, @@ -3387,7 +3387,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3402,18 +3402,18 @@ "--platform", "iPhone 15", "--version", - "18.1", + "18.2", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "url_unittests iPhone 15 18.1", + "name": "url_unittests iPhone 15 18.2", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -3432,11 +3432,11 @@ }, "named_caches": [ { - "name": "runtime_ios_18_1", - "path": "Runtime-ios-18.1" + "name": "runtime_ios_18_2", + "path": "Runtime-ios-18.2" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -3444,7 +3444,7 @@ }, "test": "url_unittests", "test_id_prefix": "ninja://url:url_unittests/", - "variant_id": "iPhone 15 18.1" + "variant_id": "iPhone 15 18.2" } ] }
diff --git a/infra/config/generated/builders/try/ios-vm/properties.json b/infra/config/generated/builders/try/ios-vm/properties.json index 3f841c8..a1d88207 100644 --- a/infra/config/generated/builders/try/ios-vm/properties.json +++ b/infra/config/generated/builders/try/ios-vm/properties.json
@@ -65,5 +65,5 @@ }, "builder_group": "tryserver.chromium.mac", "recipe": "chromium_trybot", - "xcode_build_version": "16b40" + "xcode_build_version": "16c5032a" } \ No newline at end of file
diff --git a/infra/config/generated/builders/try/ios-vm/targets/chromium.fyi.json b/infra/config/generated/builders/try/ios-vm/targets/chromium.fyi.json index f9e2d9edc..fe0df5b 100644 --- a/infra/config/generated/builders/try/ios-vm/targets/chromium.fyi.json +++ b/infra/config/generated/builders/try/ios-vm/targets/chromium.fyi.json
@@ -14,7 +14,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -44,7 +44,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -64,7 +64,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -94,7 +94,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -114,7 +114,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -144,7 +144,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -164,7 +164,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -194,7 +194,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -213,7 +213,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -243,7 +243,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -262,7 +262,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -292,7 +292,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -311,7 +311,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -341,7 +341,7 @@ "path": "Runtime-ios-17.5" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -360,7 +360,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "16b40", + "16c5032a", "--xctest" ], "merge": { @@ -390,7 +390,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ],
diff --git a/infra/config/generated/builders/try/ios-wpt-fyi-rel/properties.json b/infra/config/generated/builders/try/ios-wpt-fyi-rel/properties.json index 44511394..ec26706 100644 --- a/infra/config/generated/builders/try/ios-wpt-fyi-rel/properties.json +++ b/infra/config/generated/builders/try/ios-wpt-fyi-rel/properties.json
@@ -65,5 +65,5 @@ }, "builder_group": "tryserver.chromium.mac", "recipe": "chromium_trybot", - "xcode_build_version": "16b40" + "xcode_build_version": "16c5032a" } \ No newline at end of file
diff --git a/infra/config/generated/builders/try/ios-wpt-fyi-rel/targets/chromium.fyi.json b/infra/config/generated/builders/try/ios-wpt-fyi-rel/targets/chromium.fyi.json index 5eda596..d6b05e0 100644 --- a/infra/config/generated/builders/try/ios-wpt-fyi-rel/targets/chromium.fyi.json +++ b/infra/config/generated/builders/try/ios-wpt-fyi-rel/targets/chromium.fyi.json
@@ -5,7 +5,7 @@ "args": [ "--no-wpt-internal", "--xcode-build-version", - "16b40" + "16c5032a" ], "merge": { "args": [ @@ -36,7 +36,7 @@ "hard_timeout": 14400, "named_caches": [ { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ],
diff --git a/infra/config/generated/builders/try/ios17-beta-simulator/properties.json b/infra/config/generated/builders/try/ios17-beta-simulator/properties.json index d95282d..9e95970 100644 --- a/infra/config/generated/builders/try/ios17-beta-simulator/properties.json +++ b/infra/config/generated/builders/try/ios17-beta-simulator/properties.json
@@ -66,5 +66,5 @@ }, "builder_group": "tryserver.chromium.mac", "recipe": "chromium_trybot", - "xcode_build_version": "16b40" + "xcode_build_version": "16c5032a" } \ No newline at end of file
diff --git a/infra/config/generated/builders/try/ios18-beta-simulator/properties.json b/infra/config/generated/builders/try/ios18-beta-simulator/properties.json index 1d6be8ff..2da78d66 100644 --- a/infra/config/generated/builders/try/ios18-beta-simulator/properties.json +++ b/infra/config/generated/builders/try/ios18-beta-simulator/properties.json
@@ -67,5 +67,5 @@ }, "builder_group": "tryserver.chromium.mac", "recipe": "chromium_trybot", - "xcode_build_version": "16b40" + "xcode_build_version": "16c5032a" } \ No newline at end of file
diff --git a/infra/config/generated/builders/webrtc.fyi/WebRTC Chromium FYI ios-device/properties.json b/infra/config/generated/builders/webrtc.fyi/WebRTC Chromium FYI ios-device/properties.json index 578996a..42794d6 100644 --- a/infra/config/generated/builders/webrtc.fyi/WebRTC Chromium FYI ios-device/properties.json +++ b/infra/config/generated/builders/webrtc.fyi/WebRTC Chromium FYI ios-device/properties.json
@@ -67,5 +67,5 @@ }, "builder_group": "chromium.webrtc.fyi", "recipe": "chromium", - "xcode_build_version": "16b40" + "xcode_build_version": "16c5032a" } \ No newline at end of file
diff --git a/infra/config/generated/builders/webrtc.fyi/WebRTC Chromium FYI ios-simulator/properties.json b/infra/config/generated/builders/webrtc.fyi/WebRTC Chromium FYI ios-simulator/properties.json index 350d70b..d160e3f9 100644 --- a/infra/config/generated/builders/webrtc.fyi/WebRTC Chromium FYI ios-simulator/properties.json +++ b/infra/config/generated/builders/webrtc.fyi/WebRTC Chromium FYI ios-simulator/properties.json
@@ -67,5 +67,5 @@ }, "builder_group": "chromium.webrtc.fyi", "recipe": "chromium", - "xcode_build_version": "16b40" + "xcode_build_version": "16c5032a" } \ No newline at end of file
diff --git a/infra/config/generated/luci/cr-buildbucket.cfg b/infra/config/generated/luci/cr-buildbucket.cfg index 563649cd..3967313 100644 --- a/infra/config/generated/luci/cr-buildbucket.cfg +++ b/infra/config/generated/luci/cr-buildbucket.cfg
@@ -465,8 +465,8 @@ priority: 35 execution_timeout_secs: 36000 caches { - name: "xcode_ios_16b40" - path: "xcode_ios_16b40.app" + name: "xcode_ios_16c5032a" + path: "xcode_ios_16c5032a.app" } build_numbers: YES service_account: "chromium-build-perf-ci-builder@chops-service-accounts.iam.gserviceaccount.com" @@ -539,8 +539,8 @@ priority: 35 execution_timeout_secs: 36000 caches { - name: "xcode_ios_16b40" - path: "xcode_ios_16b40.app" + name: "xcode_ios_16c5032a" + path: "xcode_ios_16c5032a.app" } build_numbers: YES service_account: "chromium-build-perf-ci-builder@chops-service-accounts.iam.gserviceaccount.com" @@ -613,8 +613,8 @@ priority: 35 execution_timeout_secs: 36000 caches { - name: "xcode_ios_16b40" - path: "xcode_ios_16b40.app" + name: "xcode_ios_16c5032a" + path: "xcode_ios_16c5032a.app" } build_numbers: YES service_account: "chromium-build-perf-ci-builder@chops-service-accounts.iam.gserviceaccount.com" @@ -7526,13 +7526,13 @@ ' },' ' "builder_group": "chromium.fyi",' ' "recipe": "reclient_reclient_comparison",' - ' "xcode_build_version": "16b40"' + ' "xcode_build_version": "16c5032a"' '}' priority: 35 execution_timeout_secs: 36000 caches { - name: "xcode_ios_16b40" - path: "xcode_ios_16b40.app" + name: "xcode_ios_16c5032a" + path: "xcode_ios_16c5032a.app" } build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" @@ -7669,13 +7669,13 @@ ' },' ' "builder_group": "chromium.fyi",' ' "recipe": "reclient_reclient_comparison",' - ' "xcode_build_version": "16b40"' + ' "xcode_build_version": "16c5032a"' '}' priority: 35 execution_timeout_secs: 36000 caches { - name: "xcode_ios_16b40" - path: "xcode_ios_16b40.app" + name: "xcode_ios_16c5032a" + path: "xcode_ios_16c5032a.app" } build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" @@ -19727,8 +19727,8 @@ '}' execution_timeout_secs: 14400 caches { - name: "xcode_ios_16b40" - path: "xcode_ios_16b40.app" + name: "xcode_ios_16c5032a" + path: "xcode_ios_16c5032a.app" } build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" @@ -32314,8 +32314,8 @@ '}' execution_timeout_secs: 50400 caches { - name: "xcode_ios_16b40" - path: "xcode_ios_16b40.app" + name: "xcode_ios_16c5032a" + path: "xcode_ios_16c5032a.app" } build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" @@ -32433,8 +32433,8 @@ '}' execution_timeout_secs: 50400 caches { - name: "xcode_ios_16b40" - path: "xcode_ios_16b40.app" + name: "xcode_ios_16c5032a" + path: "xcode_ios_16c5032a.app" } build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" @@ -51373,12 +51373,12 @@ ' "sheriff_rotations": [' ' "angle"' ' ],' - ' "xcode_build_version": "16b40"' + ' "xcode_build_version": "16c5032a"' '}' execution_timeout_secs: 10800 caches { - name: "xcode_ios_16b40" - path: "xcode_ios_16b40.app" + name: "xcode_ios_16c5032a" + path: "xcode_ios_16c5032a.app" } build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" @@ -51701,8 +51701,8 @@ '}' execution_timeout_secs: 10800 caches { - name: "xcode_ios_16b40" - path: "xcode_ios_16b40.app" + name: "xcode_ios_16c5032a" + path: "xcode_ios_16c5032a.app" } build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" @@ -51816,8 +51816,8 @@ priority: 35 execution_timeout_secs: 10800 caches { - name: "xcode_ios_16b40" - path: "xcode_ios_16b40.app" + name: "xcode_ios_16c5032a" + path: "xcode_ios_16c5032a.app" } build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" @@ -51935,8 +51935,8 @@ '}' execution_timeout_secs: 10800 caches { - name: "xcode_ios_16b40" - path: "xcode_ios_16b40.app" + name: "xcode_ios_16c5032a" + path: "xcode_ios_16c5032a.app" } build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" @@ -52055,8 +52055,8 @@ '}' execution_timeout_secs: 10800 caches { - name: "xcode_ios_16b40" - path: "xcode_ios_16b40.app" + name: "xcode_ios_16c5032a" + path: "xcode_ios_16c5032a.app" } build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" @@ -52169,8 +52169,8 @@ priority: 35 execution_timeout_secs: 36000 caches { - name: "xcode_ios_16b40" - path: "xcode_ios_16b40.app" + name: "xcode_ios_16c5032a" + path: "xcode_ios_16c5032a.app" } build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" @@ -52288,8 +52288,8 @@ '}' execution_timeout_secs: 10800 caches { - name: "xcode_ios_16b40" - path: "xcode_ios_16b40.app" + name: "xcode_ios_16c5032a" + path: "xcode_ios_16c5032a.app" } build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" @@ -52403,8 +52403,8 @@ priority: 35 execution_timeout_secs: 72000 caches { - name: "xcode_ios_16b40" - path: "xcode_ios_16b40.app" + name: "xcode_ios_16c5032a" + path: "xcode_ios_16c5032a.app" } build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" @@ -52522,8 +52522,8 @@ '}' execution_timeout_secs: 10800 caches { - name: "xcode_ios_16b40" - path: "xcode_ios_16b40.app" + name: "xcode_ios_16c5032a" + path: "xcode_ios_16c5032a.app" } build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" @@ -52642,8 +52642,8 @@ '}' execution_timeout_secs: 10800 caches { - name: "xcode_ios_16b40" - path: "xcode_ios_16b40.app" + name: "xcode_ios_16c5032a" + path: "xcode_ios_16c5032a.app" } build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" @@ -52756,8 +52756,8 @@ priority: 35 execution_timeout_secs: 36000 caches { - name: "xcode_ios_16b40" - path: "xcode_ios_16b40.app" + name: "xcode_ios_16c5032a" + path: "xcode_ios_16c5032a.app" } build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" @@ -52981,8 +52981,8 @@ priority: 35 execution_timeout_secs: 36000 caches { - name: "xcode_ios_16b40" - path: "xcode_ios_16b40.app" + name: "xcode_ios_16c5032a" + path: "xcode_ios_16c5032a.app" } build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" @@ -53093,8 +53093,8 @@ priority: 35 execution_timeout_secs: 36000 caches { - name: "xcode_ios_16b40" - path: "xcode_ios_16b40.app" + name: "xcode_ios_16c5032a" + path: "xcode_ios_16c5032a.app" } build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" @@ -53429,8 +53429,8 @@ priority: 35 execution_timeout_secs: 36000 caches { - name: "xcode_ios_16b40" - path: "xcode_ios_16b40.app" + name: "xcode_ios_16c5032a" + path: "xcode_ios_16c5032a.app" } build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" @@ -77798,8 +77798,8 @@ priority: 35 execution_timeout_secs: 10800 caches { - name: "xcode_ios_16b40" - path: "xcode_ios_16b40.app" + name: "xcode_ios_16c5032a" + path: "xcode_ios_16c5032a.app" } build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" @@ -77911,8 +77911,8 @@ priority: 35 execution_timeout_secs: 10800 caches { - name: "xcode_ios_16b40" - path: "xcode_ios_16b40.app" + name: "xcode_ios_16c5032a" + path: "xcode_ios_16c5032a.app" } build_numbers: YES service_account: "chromium-cq-staging-builder@chops-service-accounts.iam.gserviceaccount.com" @@ -104066,13 +104066,13 @@ ' },' ' "builder_group": "tryserver.chromium.angle",' ' "recipe": "angle_chromium_trybot",' - ' "xcode_build_version": "16b40"' + ' "xcode_build_version": "16c5032a"' '}' execution_timeout_secs: 7200 expiration_secs: 7200 caches { - name: "xcode_ios_16b40" - path: "xcode_ios_16b40.app" + name: "xcode_ios_16c5032a" + path: "xcode_ios_16c5032a.app" } build_numbers: YES service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" @@ -104183,8 +104183,8 @@ seconds: 120 } caches { - name: "xcode_ios_16b40" - path: "xcode_ios_16b40.app" + name: "xcode_ios_16c5032a" + path: "xcode_ios_16c5032a.app" } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" @@ -104408,8 +104408,8 @@ seconds: 120 } caches { - name: "xcode_ios_16b40" - path: "xcode_ios_16b40.app" + name: "xcode_ios_16c5032a" + path: "xcode_ios_16c5032a.app" } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" @@ -104520,8 +104520,8 @@ seconds: 120 } caches { - name: "xcode_ios_16b40" - path: "xcode_ios_16b40.app" + name: "xcode_ios_16c5032a" + path: "xcode_ios_16c5032a.app" } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" @@ -104633,8 +104633,8 @@ seconds: 120 } caches { - name: "xcode_ios_16b40" - path: "xcode_ios_16b40.app" + name: "xcode_ios_16c5032a" + path: "xcode_ios_16c5032a.app" } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" @@ -104868,8 +104868,8 @@ seconds: 120 } caches { - name: "xcode_ios_16b40" - path: "xcode_ios_16b40.app" + name: "xcode_ios_16c5032a" + path: "xcode_ios_16c5032a.app" } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" @@ -104980,8 +104980,8 @@ seconds: 120 } caches { - name: "xcode_ios_16b40" - path: "xcode_ios_16b40.app" + name: "xcode_ios_16c5032a" + path: "xcode_ios_16c5032a.app" } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" @@ -105093,8 +105093,8 @@ seconds: 120 } caches { - name: "xcode_ios_16b40" - path: "xcode_ios_16b40.app" + name: "xcode_ios_16c5032a" + path: "xcode_ios_16c5032a.app" } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" @@ -105215,8 +105215,8 @@ seconds: 120 } caches { - name: "xcode_ios_16b40" - path: "xcode_ios_16b40.app" + name: "xcode_ios_16c5032a" + path: "xcode_ios_16c5032a.app" } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" @@ -105328,8 +105328,8 @@ seconds: 120 } caches { - name: "xcode_ios_16b40" - path: "xcode_ios_16b40.app" + name: "xcode_ios_16c5032a" + path: "xcode_ios_16c5032a.app" } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" @@ -105441,8 +105441,8 @@ seconds: 120 } caches { - name: "xcode_ios_16b40" - path: "xcode_ios_16b40.app" + name: "xcode_ios_16c5032a" + path: "xcode_ios_16c5032a.app" } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" @@ -105554,8 +105554,8 @@ seconds: 120 } caches { - name: "xcode_ios_16b40" - path: "xcode_ios_16b40.app" + name: "xcode_ios_16c5032a" + path: "xcode_ios_16c5032a.app" } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" @@ -105666,8 +105666,8 @@ seconds: 120 } caches { - name: "xcode_ios_16b40" - path: "xcode_ios_16b40.app" + name: "xcode_ios_16c5032a" + path: "xcode_ios_16c5032a.app" } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" @@ -105890,8 +105890,8 @@ seconds: 120 } caches { - name: "xcode_ios_16b40" - path: "xcode_ios_16b40.app" + name: "xcode_ios_16c5032a" + path: "xcode_ios_16c5032a.app" } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" @@ -131998,8 +131998,8 @@ '}' execution_timeout_secs: 7200 caches { - name: "xcode_ios_16b40" - path: "xcode_ios_16b40.app" + name: "xcode_ios_16c5032a" + path: "xcode_ios_16c5032a.app" } build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" @@ -132071,8 +132071,8 @@ '}' execution_timeout_secs: 7200 caches { - name: "xcode_ios_16b40" - path: "xcode_ios_16b40.app" + name: "xcode_ios_16c5032a" + path: "xcode_ios_16c5032a.app" } build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
diff --git a/infra/config/generated/testing/mixins.pyl b/infra/config/generated/testing/mixins.pyl index ca11fb9..8f2b09f5 100644 --- a/infra/config/generated/testing/mixins.pyl +++ b/infra/config/generated/testing/mixins.pyl
@@ -821,12 +821,12 @@ 'xcode_16_main': { 'args': [ '--xcode-build-version', - '16b40', + '16c5032a', ], 'swarming': { 'named_caches': [ { - 'name': 'xcode_ios_16b40', + 'name': 'xcode_ios_16c5032a', 'path': 'Xcode.app', }, ],
diff --git a/infra/config/lib/xcode.star b/infra/config/lib/xcode.star index 1542932..c9fdea1 100644 --- a/infra/config/lib/xcode.star +++ b/infra/config/lib/xcode.star
@@ -14,7 +14,7 @@ # Keep this in-sync with the versions of bots in //ios/build/bots/. xcode = struct( # Default Xcode Version - xcode_default = xcode_enum("16b40"), + xcode_default = xcode_enum("16c5032a"), # Default Xcode 13 for chromium iOS. x13main = xcode_enum("13c100"),
diff --git a/infra/config/targets/bundles.star b/infra/config/targets/bundles.star index b953223f..a9dd6380 100644 --- a/infra/config/targets/bundles.star +++ b/infra/config/targets/bundles.star
@@ -4717,7 +4717,7 @@ targets = "ios_common_tests", variants = [ "SIM_IPHONE_14_17_5", - "SIM_IPHONE_15_18_1", + "SIM_IPHONE_15_18_2", ], ), targets.bundle( @@ -4728,9 +4728,9 @@ ], variants = [ "SIM_IPAD_PRO_6TH_GEN_17_5", - "SIM_IPAD_PRO_7TH_GEN_18_1", + "SIM_IPAD_PRO_7TH_GEN_18_2", "SIM_IPHONE_14_17_5", - "SIM_IPHONE_15_18_1", + "SIM_IPHONE_15_18_2", ], ), targets.bundle( @@ -4741,20 +4741,20 @@ ], variants = [ "SIM_IPAD_AIR_5TH_GEN_17_5", - "SIM_IPAD_AIR_6TH_GEN_18_1", + "SIM_IPAD_AIR_6TH_GEN_18_2", "SIM_IPHONE_14_17_5", - "SIM_IPHONE_15_18_1", + "SIM_IPHONE_15_18_2", ], ), targets.bundle( targets = "ios_screen_size_dependent_tests", variants = [ "SIM_IPAD_AIR_5TH_GEN_17_5", - "SIM_IPAD_AIR_6TH_GEN_18_1", + "SIM_IPAD_AIR_6TH_GEN_18_2", "SIM_IPHONE_14_17_5", "SIM_IPHONE_14_PRO_MAX_17_5", - "SIM_IPHONE_15_18_1", - "SIM_IPHONE_15_PRO_MAX_18_1", + "SIM_IPHONE_15_18_2", + "SIM_IPHONE_15_PRO_MAX_18_2", ], ), ], @@ -4787,7 +4787,7 @@ ], variants = [ "SIM_IPHONE_14_PLUS_17_5", - "SIM_IPHONE_14_PLUS_18_1", + "SIM_IPHONE_14_PLUS_18_2", ], ), targets.bundle( @@ -4797,11 +4797,11 @@ ], variants = [ "SIM_IPAD_AIR_5TH_GEN_17_5", - "SIM_IPAD_AIR_6TH_GEN_18_1", + "SIM_IPAD_AIR_6TH_GEN_18_2", "SIM_IPAD_PRO_6TH_GEN_17_5", - "SIM_IPAD_PRO_7TH_GEN_18_1", + "SIM_IPAD_PRO_7TH_GEN_18_2", "SIM_IPHONE_14_17_5", - "SIM_IPHONE_15_18_1", + "SIM_IPHONE_15_18_2", ], ), targets.bundle( @@ -4811,9 +4811,9 @@ ], variants = [ "SIM_IPAD_PRO_6TH_GEN_17_5", - "SIM_IPAD_PRO_7TH_GEN_18_1", + "SIM_IPAD_PRO_7TH_GEN_18_2", "SIM_IPHONE_14_17_5", - "SIM_IPHONE_15_18_1", + "SIM_IPHONE_15_18_2", ], ), targets.bundle( @@ -4823,9 +4823,9 @@ ], variants = [ "SIM_IPAD_PRO_6TH_GEN_17_5", - "SIM_IPAD_PRO_7TH_GEN_18_1", + "SIM_IPAD_PRO_7TH_GEN_18_2", "SIM_IPHONE_14_17_5", - "SIM_IPHONE_15_18_1", + "SIM_IPHONE_15_18_2", ], ), ], @@ -4842,7 +4842,7 @@ variants = [ "SIM_IPHONE_SE_3RD_GEN_16_4", "SIM_IPHONE_SE_3RD_GEN_17_5", - "SIM_IPHONE_SE_3RD_GEN_18_1", + "SIM_IPHONE_SE_3RD_GEN_18_2", ], ), targets.bundle( @@ -4854,7 +4854,7 @@ variants = [ "SIM_IPAD_AIR_5TH_GEN_16_4", "SIM_IPAD_AIR_5TH_GEN_17_5", - "SIM_IPAD_AIR_6TH_GEN_18_1", + "SIM_IPAD_AIR_6TH_GEN_18_2", ], ), targets.bundle( @@ -4866,7 +4866,7 @@ variants = [ "SIM_IPAD_PRO_6TH_GEN_16_4", "SIM_IPAD_PRO_6TH_GEN_17_5", - "SIM_IPAD_PRO_7TH_GEN_18_1", + "SIM_IPAD_PRO_7TH_GEN_18_2", ], ), targets.bundle( @@ -4877,16 +4877,16 @@ variants = [ "SIM_IPAD_AIR_5TH_GEN_16_4", "SIM_IPAD_AIR_5TH_GEN_17_5", - "SIM_IPAD_AIR_6TH_GEN_18_1", + "SIM_IPAD_AIR_6TH_GEN_18_2", "SIM_IPAD_PRO_6TH_GEN_16_4", "SIM_IPAD_PRO_6TH_GEN_17_5", - "SIM_IPAD_PRO_7TH_GEN_18_1", + "SIM_IPAD_PRO_7TH_GEN_18_2", "SIM_IPHONE_14_PLUS_16_4", "SIM_IPHONE_14_PLUS_17_5", - "SIM_IPHONE_14_PLUS_18_1", + "SIM_IPHONE_14_PLUS_18_2", "SIM_IPHONE_SE_3RD_GEN_16_4", "SIM_IPHONE_SE_3RD_GEN_17_5", - "SIM_IPHONE_SE_3RD_GEN_18_1", + "SIM_IPHONE_SE_3RD_GEN_18_2", ], ), ], @@ -4900,7 +4900,7 @@ targets = "ios_common_tests", variants = [ "SIM_IPHONE_14_17_5", - "SIM_IPHONE_15_18_1", + "SIM_IPHONE_15_18_2", ], ), targets.bundle( @@ -4910,7 +4910,7 @@ ], variants = [ "SIM_IPHONE_14_17_5", - "SIM_IPHONE_15_18_1", + "SIM_IPHONE_15_18_2", ], ), targets.bundle( @@ -4918,8 +4918,8 @@ variants = [ "SIM_IPHONE_14_17_5", "SIM_IPAD_PRO_6TH_GEN_17_5", - "SIM_IPHONE_15_18_1", - "SIM_IPAD_PRO_7TH_GEN_18_1", + "SIM_IPHONE_15_18_2", + "SIM_IPAD_PRO_7TH_GEN_18_2", ], ), ],
diff --git a/infra/config/targets/mixins.star b/infra/config/targets/mixins.star index 7af9600..13c4d61 100644 --- a/infra/config/targets/mixins.star +++ b/infra/config/targets/mixins.star
@@ -2299,12 +2299,12 @@ name = "xcode_16_main", args = [ "--xcode-build-version", - "16b40", + "16c5032a", ], swarming = targets.swarming( named_caches = [ swarming.cache( - name = "xcode_ios_16b40", + name = "xcode_ios_16c5032a", path = "Xcode.app", ), ],
diff --git a/infra/config/targets/variants.star b/infra/config/targets/variants.star index b4a3501e..ea5b5ba9 100644 --- a/infra/config/targets/variants.star +++ b/infra/config/targets/variants.star
@@ -295,21 +295,6 @@ ) targets.variant( - name = "SIM_IPAD_AIR_5TH_GEN_18_1", - identifier = "iPad Air (5th generation) 18.1", - generate_pyl_entry = False, - mixins = [ - "ios_runtime_cache_18_1", - ], - args = [ - "--platform", - "iPad Air (5th generation)", - "--version", - "18.1", - ], -) - -targets.variant( name = "SIM_IPAD_AIR_5TH_GEN_18_2", identifier = "iPad Air (5th generation) 18.2", generate_pyl_entry = False, @@ -340,21 +325,6 @@ ) targets.variant( - name = "SIM_IPAD_AIR_6TH_GEN_18_1", - identifier = "iPad Air (6th generation) 18.1", - generate_pyl_entry = False, - mixins = [ - "ios_runtime_cache_18_1", - ], - args = [ - "--platform", - "iPad Air 11-inch (M2)", - "--version", - "18.1", - ], -) - -targets.variant( name = "SIM_IPAD_AIR_6TH_GEN_18_2", identifier = "iPad Air (6th generation) 18.2", generate_pyl_entry = False, @@ -415,21 +385,6 @@ ) targets.variant( - name = "SIM_IPAD_PRO_7TH_GEN_18_1", - identifier = "iPad Pro 13-inch (M4) 18.1", - generate_pyl_entry = False, - mixins = [ - "ios_runtime_cache_18_1", - ], - args = [ - "--platform", - "iPad Pro 13-inch (M4)", - "--version", - "18.1", - ], -) - -targets.variant( name = "SIM_IPAD_PRO_7TH_GEN_18_2", identifier = "iPad Pro 13-inch (M4) 18.2", generate_pyl_entry = False, @@ -475,21 +430,6 @@ ) targets.variant( - name = "SIM_IPAD_10TH_GEN_18_1", - identifier = "iPad (10th generation) 18.1", - generate_pyl_entry = False, - mixins = [ - "ios_runtime_cache_18_1", - ], - args = [ - "--platform", - "iPad (10th generation)", - "--version", - "18.1", - ], -) - -targets.variant( name = "SIM_IPAD_10TH_GEN_18_2", identifier = "iPad (10th generation) 18.2", generate_pyl_entry = False, @@ -549,21 +489,6 @@ ) targets.variant( - name = "SIM_IPHONE_14_18_1", - identifier = "iPhone 14 18.1", - generate_pyl_entry = False, - mixins = [ - "ios_runtime_cache_18_1", - ], - args = [ - "--platform", - "iPhone 14", - "--version", - "18.1", - ], -) - -targets.variant( name = "SIM_IPHONE_14_18_2", identifier = "iPhone 14 18.2", generate_pyl_entry = False, @@ -594,21 +519,6 @@ ) targets.variant( - name = "SIM_IPHONE_15_18_1", - identifier = "iPhone 15 18.1", - generate_pyl_entry = False, - mixins = [ - "ios_runtime_cache_18_1", - ], - args = [ - "--platform", - "iPhone 15", - "--version", - "18.1", - ], -) - -targets.variant( name = "SIM_IPHONE_15_18_2", identifier = "iPhone 15 18.2", generate_pyl_entry = False, @@ -654,17 +564,17 @@ ) targets.variant( - name = "SIM_IPHONE_14_PLUS_18_1", - identifier = "iPhone 14 Plus 18.1", + name = "SIM_IPHONE_14_PLUS_18_2", + identifier = "iPhone 14 Plus 18.2", generate_pyl_entry = False, mixins = [ - "ios_runtime_cache_18_1", + "ios_runtime_cache_18_2", ], args = [ "--platform", "iPhone 14 Plus", "--version", - "18.1", + "18.2", ], ) @@ -699,21 +609,6 @@ ) targets.variant( - name = "SIM_IPHONE_15_PRO_MAX_18_1", - identifier = "iPhone 15 Pro Max 18.1", - generate_pyl_entry = False, - mixins = [ - "ios_runtime_cache_18_1", - ], - args = [ - "--platform", - "iPhone 15 Pro Max", - "--version", - "18.1", - ], -) - -targets.variant( name = "SIM_IPHONE_15_PRO_MAX_18_2", identifier = "iPhone 15 Pro Max 18.2", generate_pyl_entry = False, @@ -774,21 +669,6 @@ ) targets.variant( - name = "SIM_IPHONE_SE_3RD_GEN_18_1", - identifier = "iPhone SE (3rd generation) 18.1", - generate_pyl_entry = False, - mixins = [ - "ios_runtime_cache_18_1", - ], - args = [ - "--platform", - "iPhone SE (3rd generation)", - "--version", - "18.1", - ], -) - -targets.variant( name = "SIM_IPHONE_SE_3RD_GEN_18_2", identifier = "iPhone SE (3rd generation) 18.2", generate_pyl_entry = False,
diff --git a/infra/inclusive_language_presubmit_exempt_dirs.txt b/infra/inclusive_language_presubmit_exempt_dirs.txt index b6925f2c..8577202 100644 --- a/infra/inclusive_language_presubmit_exempt_dirs.txt +++ b/infra/inclusive_language_presubmit_exempt_dirs.txt
@@ -580,6 +580,8 @@ third_party/mediapipe/src/mediapipe/tasks/cc/text/custom_ops/sentencepiece 2 1 third_party/mediapipe/src/mediapipe/util/tflite/operations 8 2 third_party/mediapipe/src/third_party 1 1 +third_party/mediapipe/src/third_party/com_google_audio_tools/audio/dsp/portable 1 1 +third_party/mediapipe/src/third_party/com_google_audio_tools/external 1 1 third_party/metrics_proto 2 1 third_party/microsoft_webauthn 1 1 third_party/ocmock/OCMock 2 1
diff --git a/ios/build/chrome_build.gni b/ios/build/chrome_build.gni index c9310f3..0089f71 100644 --- a/ios/build/chrome_build.gni +++ b/ios/build/chrome_build.gni
@@ -112,7 +112,8 @@ ios_enable_memory_debugging = !is_chrome_branded # The iOS app bundle id. - ios_chromium_bundle_id = "$ios_app_bundle_id_prefix.chrome.ios.dev" + ios_chromium_bundle_id = + "$ios_app_bundle_id_prefix.chrome.ios$apple_mobile_app_bundle_id_suffix" # Path to a PrivacyInfo.xcprivacy file to be included in app extensions. ios_app_extension_privacy_manifest = ""
diff --git a/ios/chrome/browser/authentication/ui_bundled/authentication_flow/BUILD.gn b/ios/chrome/browser/authentication/ui_bundled/authentication_flow/BUILD.gn index f3a9440..b870c3d4e 100644 --- a/ios/chrome/browser/authentication/ui_bundled/authentication_flow/BUILD.gn +++ b/ios/chrome/browser/authentication/ui_bundled/authentication_flow/BUILD.gn
@@ -31,6 +31,7 @@ "//ios/chrome/browser/authentication/ui_bundled/enterprise/managed_profile_creation", "//ios/chrome/browser/authentication/ui_bundled/history_sync:capabilities_fetcher", "//ios/chrome/browser/authentication/ui_bundled/signin:constants", + "//ios/chrome/browser/authentication/ui_bundled/signin:signin_headers", "//ios/chrome/browser/flags", "//ios/chrome/browser/ntp/ui_bundled:feature_flags", "//ios/chrome/browser/policy/model",
diff --git a/ios/chrome/browser/authentication/ui_bundled/authentication_flow/authentication_flow_performer.mm b/ios/chrome/browser/authentication/ui_bundled/authentication_flow/authentication_flow_performer.mm index dda72e46..ccf4205 100644 --- a/ios/chrome/browser/authentication/ui_bundled/authentication_flow/authentication_flow_performer.mm +++ b/ios/chrome/browser/authentication/ui_bundled/authentication_flow/authentication_flow_performer.mm
@@ -30,6 +30,7 @@ #import "ios/chrome/browser/authentication/ui_bundled/authentication_constants.h" #import "ios/chrome/browser/authentication/ui_bundled/authentication_ui_util.h" #import "ios/chrome/browser/authentication/ui_bundled/enterprise/managed_profile_creation/managed_profile_creation_coordinator.h" +#import "ios/chrome/browser/authentication/ui_bundled/signin/signin_utils.h" #import "ios/chrome/browser/policy/model/cloud/user_policy_signin_service.h" #import "ios/chrome/browser/policy/model/cloud/user_policy_signin_service_factory.h" #import "ios/chrome/browser/policy/model/cloud/user_policy_switch.h" @@ -287,9 +288,11 @@ syncService->GetUserSettings()->SetSelectedType( syncer::UserSelectableType::kReadingList, false); } - authService->SignOut( + signin::MultiProfileSignOut( + browser, signin_metrics::ProfileSignout::kUserTappedUndoRightAfterSignIn, - /*force_clear_browsing_data=*/false, nil); + /*force_clear_data=*/false, /*force_snackbar_over_toolbar=*/false, + /*snackbar_message=*/nil, /*signout_completion=*/nil); } }; action.title = l10n_util::GetNSString(IDS_IOS_SIGNIN_SNACKBAR_UNDO);
diff --git a/ios/chrome/browser/authentication/ui_bundled/change_profile/BUILD.gn b/ios/chrome/browser/authentication/ui_bundled/change_profile/BUILD.gn index 972a316..5a447756 100644 --- a/ios/chrome/browser/authentication/ui_bundled/change_profile/BUILD.gn +++ b/ios/chrome/browser/authentication/ui_bundled/change_profile/BUILD.gn
@@ -6,6 +6,8 @@ source_set("change_profile") { sources = [ + "change_profile_bookmarks_continuation.h", + "change_profile_bookmarks_continuation.mm", "change_profile_recent_tabs_continuation.h", "change_profile_recent_tabs_continuation.mm", "change_profile_signout_continuation.h",
diff --git a/ios/chrome/browser/authentication/ui_bundled/change_profile/change_profile_bookmarks_continuation.h b/ios/chrome/browser/authentication/ui_bundled/change_profile/change_profile_bookmarks_continuation.h new file mode 100644 index 0000000..8a5f4f9 --- /dev/null +++ b/ios/chrome/browser/authentication/ui_bundled/change_profile/change_profile_bookmarks_continuation.h
@@ -0,0 +1,13 @@ +// 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_AUTHENTICATION_UI_BUNDLED_CHANGE_PROFILE_CHANGE_PROFILE_BOOKMARKS_CONTINUATION_H_ +#define IOS_CHROME_BROWSER_AUTHENTICATION_UI_BUNDLED_CHANGE_PROFILE_CHANGE_PROFILE_BOOKMARKS_CONTINUATION_H_ + +#import "ios/chrome/app/change_profile_continuation.h" + +// Returns a ChangeProfileContinuation that opens the bookmarks view. +ChangeProfileContinuation CreateChangeProfileBookmarksContinuation(); + +#endif // IOS_CHROME_BROWSER_AUTHENTICATION_UI_BUNDLED_CHANGE_PROFILE_CHANGE_PROFILE_BOOKMARKS_CONTINUATION_H_
diff --git a/ios/chrome/browser/authentication/ui_bundled/change_profile/change_profile_bookmarks_continuation.mm b/ios/chrome/browser/authentication/ui_bundled/change_profile/change_profile_bookmarks_continuation.mm new file mode 100644 index 0000000..91e2a15e --- /dev/null +++ b/ios/chrome/browser/authentication/ui_bundled/change_profile/change_profile_bookmarks_continuation.mm
@@ -0,0 +1,36 @@ +// 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/authentication/ui_bundled/change_profile/change_profile_bookmarks_continuation.h" + +#import "base/functional/callback_helpers.h" +#import "ios/chrome/browser/shared/coordinator/scene/scene_state.h" +#import "ios/chrome/browser/shared/model/browser/browser.h" +#import "ios/chrome/browser/shared/model/browser/browser_provider.h" +#import "ios/chrome/browser/shared/model/browser/browser_provider_interface.h" +#import "ios/chrome/browser/shared/public/commands/browser_coordinator_commands.h" +#import "ios/chrome/browser/shared/public/commands/command_dispatcher.h" + +namespace { + +// Implementation of the continuation opening the bookmarks view. +void ChangeProfileBookmarksContinuation(SceneState* scene_state, + base::OnceClosure closure) { + Browser* browser = + scene_state.browserProviderInterface.mainBrowserProvider.browser; + CHECK(browser); + + CommandDispatcher* dispatcher = browser->GetCommandDispatcher(); + id<BrowserCoordinatorCommands> browserCoordinatorHandler = + HandlerForProtocol(dispatcher, BrowserCoordinatorCommands); + [browserCoordinatorHandler showBookmarksManager]; + + std::move(closure).Run(); +} + +} // namespace + +ChangeProfileContinuation CreateChangeProfileBookmarksContinuation() { + return base::BindOnce(&ChangeProfileBookmarksContinuation); +}
diff --git a/ios/chrome/browser/authentication/ui_bundled/history_sync/BUILD.gn b/ios/chrome/browser/authentication/ui_bundled/history_sync/BUILD.gn index ebe2445f..2131132 100644 --- a/ios/chrome/browser/authentication/ui_bundled/history_sync/BUILD.gn +++ b/ios/chrome/browser/authentication/ui_bundled/history_sync/BUILD.gn
@@ -32,6 +32,7 @@ "//ios/chrome/browser/authentication/ui_bundled/enterprise:enterprise_utils", "//ios/chrome/browser/authentication/ui_bundled/history_sync/resources", "//ios/chrome/browser/authentication/ui_bundled/signin:constants", + "//ios/chrome/browser/authentication/ui_bundled/signin:signin_headers", "//ios/chrome/browser/first_run/model", "//ios/chrome/browser/shared/model/browser", "//ios/chrome/browser/shared/model/profile",
diff --git a/ios/chrome/browser/authentication/ui_bundled/history_sync/history_sync_popup_coordinator.mm b/ios/chrome/browser/authentication/ui_bundled/history_sync/history_sync_popup_coordinator.mm index 62d73bd..4ca6bde6 100644 --- a/ios/chrome/browser/authentication/ui_bundled/history_sync/history_sync_popup_coordinator.mm +++ b/ios/chrome/browser/authentication/ui_bundled/history_sync/history_sync_popup_coordinator.mm
@@ -14,6 +14,7 @@ #import "ios/chrome/browser/authentication/ui_bundled/history_sync/history_sync_coordinator.h" #import "ios/chrome/browser/authentication/ui_bundled/history_sync/history_sync_utils.h" #import "ios/chrome/browser/authentication/ui_bundled/signin/interruptible_chrome_coordinator.h" +#import "ios/chrome/browser/authentication/ui_bundled/signin/signin_utils.h" #import "ios/chrome/browser/shared/model/browser/browser.h" #import "ios/chrome/browser/shared/model/profile/profile_ios.h" #import "ios/chrome/browser/signin/model/authentication_service.h" @@ -163,10 +164,13 @@ _navigationController = nil; if (result != SigninCoordinatorResultSuccess && _signOutIfDeclined) { - _authenticationService->SignOut( + signin::MultiProfileSignOut( + self.browser, signin_metrics::ProfileSignout:: kUserDeclinedHistorySyncAfterDedicatedSignIn, - /*force_clear_browsing_data=*/false, nil); + /*force_clear_data=*/false, /*force_snackbar_over_toolbar=*/false, + /*snackbar_message=*/nil, + /*signout_completion=*/nil); } [self.delegate historySyncPopupCoordinator:self didFinishWithResult:result]; }
diff --git a/ios/chrome/browser/autofill/model/autofill_controller_unittest.mm b/ios/chrome/browser/autofill/model/autofill_controller_unittest.mm index 2f889fc..f8f617c 100644 --- a/ios/chrome/browser/autofill/model/autofill_controller_unittest.mm +++ b/ios/chrome/browser/autofill/model/autofill_controller_unittest.mm
@@ -183,8 +183,12 @@ using ::testing::AssertionResult; using ::testing::AssertionSuccess; using ::testing::ElementsAre; +using ::testing::Eq; +using ::testing::IsEmpty; using ::testing::IsTrue; using ::testing::Property; +using ::testing::SizeIs; +using ::testing::UnorderedElementsAre; // FAIL if a field with the supplied `name` and `fieldType` is not present on // the `form`. @@ -580,6 +584,264 @@ ChildFrameMatcher(0), ChildFrameMatcher(2)))))); } +// Checks that with autofill across iframes and throttling enabled, the child +// frames will stop being extracted for forms once the limit of frames is +// reached. +TEST_F(AutofillControllerTest, + ReadForm_WithChildFrames_Throttling_AcrossForms) { + ScopedFeatureList feature_list; + feature_list.InitWithFeatures( + /*enabled_features=*/{features::kAutofillAcrossIframesIos, + features::kAutofillAcrossIframesIosThrottling}, + /*disabled_features=*/{}); + + // A form with iframes and inputs where some of the iframes have predecessors. + NSString* const test_page = + @"<form id='form1'>" + "<!-- 20 frames, just a the limit -->" + "<iframe></iframe>" + "<iframe></iframe>" + "<iframe></iframe>" + "<iframe></iframe>" + "<iframe></iframe>" + "<iframe></iframe>" + "<iframe></iframe>" + "<iframe></iframe>" + "<iframe></iframe>" + "<iframe></iframe>" + "<iframe></iframe>" + "<iframe></iframe>" + "<iframe></iframe>" + "<iframe></iframe>" + "<iframe></iframe>" + "<iframe></iframe>" + "<iframe></iframe>" + "<iframe></iframe>" + "<iframe></iframe>" + "<iframe></iframe>" + "Name <input id='name' type='text' name='name' />" + "Address <input type='text' name='address'>" + "City <input type='text' name='city'>" + "State <input type='text' name='state'>" + "</form>" + "<form id='form2'>" + "<!-- Frame limit busted -->" + "<iframe></iframe>" + "Name <input id='name' type='text' name='name' />" + "Address <input type='text' name='address'>" + "City <input type='text' name='city'>" + "State <input type='text' name='state'>" + "</form>" + "<form id='form3'>" + "<!-- Frame limit busted -->" + "<iframe></iframe>" + "Name <input id='name' type='text' name='name' />" + "Address <input type='text' name='address'>" + "City <input type='text' name='city'>" + "State <input type='text' name='state'>" + "</form>"; + + ASSERT_TRUE(LoadHtmlAndWaitForFormFetched(test_page, + /*expected_number_of_forms=*/3)); + + // Verify that the form data is correctly filled with the child frames data + // by respecting the child frames limit, where the first form has its 20 child + // frames then the follow up forms don't have any child frames. + std::vector<FormData> form_data; + for (const auto& [_, form] : + autofill_manager_for_main_frame()->form_structures()) { + form_data.push_back(form->ToFormData()); + } + auto form1_matcher = AllOf(Property(&FormData::renderer_id, IsTrue()), + Property(&FormData::child_frames, SizeIs(20))); + auto following_forms_matcher = + AllOf(Property(&FormData::renderer_id, IsTrue()), + Property(&FormData::child_frames, IsEmpty())); + EXPECT_THAT(form_data, ElementsAre(form1_matcher, following_forms_matcher, + following_forms_matcher)); +} + +// Checks that with autofill across iframes and throttling enabled, the child +// frames won't be extracted for the syntethic forms once the limit of frames is +// reached. +TEST_F(AutofillControllerTest, + ReadForm_WithChildFrames_Throttling_AcrossForms_Synthetic) { + ScopedFeatureList feature_list; + feature_list.InitWithFeatures( + /*enabled_features=*/{features::kAutofillAcrossIframesIos, + features::kAutofillAcrossIframesIosThrottling}, + /*disabled_features=*/{}); + + // A form with iframes and inputs where some of the iframes have predecessors. + NSString* const test_page = + @"<form id='form1'>" + "<!-- 4 iframes, below the per-form limit -->" + "<iframe></iframe>" + "<iframe></iframe>" + "<iframe></iframe>" + "<iframe></iframe>" + "Name <input id='name' type='text' name='name' />" + "Address <input type='text' name='address'>" + "City <input type='text' name='city'>" + "State <input type='text' name='state'>" + "</form>" + "<!-- 17 frames in the synthetic form, just above the xform limit -->" + "<iframe></iframe>" + "<iframe></iframe>" + "<iframe></iframe>" + "<iframe></iframe>" + "<iframe></iframe>" + "<iframe></iframe>" + "<iframe></iframe>" + "<iframe></iframe>" + "<iframe></iframe>" + "<iframe></iframe>" + "<iframe></iframe>" + "<iframe></iframe>" + "<iframe></iframe>" + "<iframe></iframe>" + "<iframe></iframe>" + "<iframe></iframe>" + "<iframe></iframe>" + "Name <input id='name' type='text' name='name' />" + "Address <input type='text' name='address'>" + "City <input type='text' name='city'>" + "State <input type='text' name='state'>"; + + ASSERT_TRUE(LoadHtmlAndWaitForFormFetched(test_page, + /*expected_number_of_forms=*/2)); + + // Verify that the form data is correctly filled with the child frames data + // by respecting the child frames limit, where the first form has its 4 child + // frames then the follow up synthetic form hasn't any child frame because it + // busted the xform limit. + std::vector<FormData> form_data; + for (const auto& [_, form] : + autofill_manager_for_main_frame()->form_structures()) { + form_data.push_back(form->ToFormData()); + } + auto form1_matcher = AllOf(Property(&FormData::renderer_id, IsTrue()), + Property(&FormData::child_frames, SizeIs(4))); + auto synthetic_form_matcher = + AllOf(Property(&FormData::renderer_id, testing::Eq(FormRendererId(0))), + Property(&FormData::child_frames, IsEmpty())); + EXPECT_THAT(form_data, ElementsAre(synthetic_form_matcher, form1_matcher)); +} + +// Checks that with autofill across iframes and throttling enabled, the child +// frames will not be extracted on a form that exceeds the limit of child +// frames. +TEST_F(AutofillControllerTest, ReadForm_WithChildFrames_Throttling_SingleForm) { + ScopedFeatureList feature_list; + feature_list.InitWithFeatures( + /*enabled_features=*/{features::kAutofillAcrossIframesIos, + features::kAutofillAcrossIframesIosThrottling}, + /*disabled_features=*/{}); + + // A form with iframes and inputs where some of the iframes have predecessors. + NSString* const test_page = + @"<form id='form1'>" + "<!-- 21 frames, just above the limit -->" + "<iframe></iframe>" + "<iframe></iframe>" + "<iframe></iframe>" + "<iframe></iframe>" + "<iframe></iframe>" + "<iframe></iframe>" + "<iframe></iframe>" + "<iframe></iframe>" + "<iframe></iframe>" + "<iframe></iframe>" + "<iframe></iframe>" + "<iframe></iframe>" + "<iframe></iframe>" + "<iframe></iframe>" + "<iframe></iframe>" + "<iframe></iframe>" + "<iframe></iframe>" + "<iframe></iframe>" + "<iframe></iframe>" + "<iframe></iframe>" + "<iframe></iframe>" + "Name <input id='name' type='text' name='name' />" + "Address <input type='text' name='address'>" + "City <input type='text' name='city'>" + "State <input type='text' name='state'>" + "</form>"; + + ASSERT_TRUE(LoadHtmlAndWaitForFormFetched(test_page, + /*expected_number_of_forms=*/1)); + + // Verify that the form data doesn't have child frames when the form exceeds + // the child frame limit. + std::vector<FormData> form_data; + for (const auto& [_, form] : + autofill_manager_for_main_frame()->form_structures()) { + form_data.push_back(form->ToFormData()); + } + auto form_matcher = AllOf(Property(&FormData::renderer_id, IsTrue()), + Property(&FormData::child_frames, IsEmpty())); + EXPECT_THAT(form_data, ElementsAre(form_matcher)); +} + +// Checks that with autofill across iframes and throttling enabled, the child +// frames will not be extracted on a synthetic form that exceeds the limit of +// child frames. +TEST_F(AutofillControllerTest, + ReadForm_WithChildFrames_Throttling_SingleForm_Synthetic) { + ScopedFeatureList feature_list; + feature_list.InitWithFeatures( + /*enabled_features=*/{features::kAutofillAcrossIframesIos, + features::kAutofillAcrossIframesIosThrottling}, + /*disabled_features=*/{}); + + // A synthetic form with too many child frames exceeding the limit. + NSString* const test_page = + @"<html><body><div id='div'>" + "<!-- 21 frames in synthetic form, just above the limit -->" + "<iframe></iframe>" + "<iframe></iframe>" + "<iframe></iframe>" + "<iframe></iframe>" + "<iframe></iframe>" + "<iframe></iframe>" + "<iframe></iframe>" + "<iframe></iframe>" + "<iframe></iframe>" + "<iframe></iframe>" + "<iframe></iframe>" + "<iframe></iframe>" + "<iframe></iframe>" + "<iframe></iframe>" + "<iframe></iframe>" + "<iframe></iframe>" + "<iframe></iframe>" + "<iframe></iframe>" + "<iframe></iframe>" + "<iframe></iframe>" + "<iframe></iframe>" + "Name <input id='name' type='text' name='name' />" + "Address <input type='text' name='address'>" + "City <input type='text' name='city'>" + "State <input type='text' name='state'>" + "</div></html></body>"; + + ASSERT_TRUE(LoadHtmlAndWaitForFormFetched(test_page, + /*expected_number_of_forms=*/1)); + + // Verify that the synthetic form data doesn't have child frames when the form + // exceeds the child frame limit. + std::vector<FormData> form_data; + for (const auto& [_, form] : + autofill_manager_for_main_frame()->form_structures()) { + form_data.push_back(form->ToFormData()); + } + auto form_matcher = + AllOf(Property(&FormData::renderer_id, Eq(FormRendererId(0))), + Property(&FormData::child_frames, IsEmpty())); + EXPECT_THAT(form_data, UnorderedElementsAre(form_matcher)); +} + // Checks that viewing an HTML page containing a form with an 'id' results in // the form being registered as a FormStructure by the BrowserAutofillManager, // and the name is correctly set.
diff --git a/ios/chrome/browser/autofill/ui_bundled/form_input_accessory/form_input_accessory_egtest.mm b/ios/chrome/browser/autofill/ui_bundled/form_input_accessory/form_input_accessory_egtest.mm index b65eb85..84bd8c6 100644 --- a/ios/chrome/browser/autofill/ui_bundled/form_input_accessory/form_input_accessory_egtest.mm +++ b/ios/chrome/browser/autofill/ui_bundled/form_input_accessory/form_input_accessory_egtest.mm
@@ -177,10 +177,15 @@ if ([self isRunningTest:@selector(testOpenExpandedManualFillView)]) { config.features_enabled.push_back(kIOSKeyboardAccessoryUpgrade); } - if ([self isRunningTest:@selector(testFillXframeCreditCardForm)]) { + if ([self isRunningTest:@selector(testFillXframeCreditCardForm)] || + [self isRunningTest:@selector(testFillXframeCreditCardFormThrottled)]) { config.features_enabled.push_back( autofill::features::kAutofillAcrossIframesIos); } + if ([self isRunningTest:@selector(testFillXframeCreditCardFormThrottled)]) { + config.features_enabled.push_back( + autofill::features::kAutofillAcrossIframesIosThrottling); + } return config; } @@ -211,6 +216,19 @@ [AutofillAppInterface considerCreditCardFormSecureForTesting]; } +// Loads a page with a xframe credit card that busts the limit of frames. +- (void)loadThrottledXframePaymentPage { + // Loads page with xframe credit card from. + [ChromeEarlGrey + loadURL:self.testServer->GetURL("/xframe_credit_card_throttled.html")]; + [ChromeEarlGrey + waitForWebStateContainingText: + "Autofill Test - Xframe Credit Card - Frame Limit Exceeded"]; + + // Allow filling credit card data on the non-https localhost. + [AutofillAppInterface considerCreditCardFormSecureForTesting]; +} + // Loads simple credit card page on localhost. - (void)loadPaymentsPage { // Loads simple page. @@ -537,6 +555,69 @@ [AutofillAppInterface clearMockReauthenticationModule]; } +// Tests that child frame throttling can be enforced for xframe credit card +// form. +- (void)testFillXframeCreditCardFormThrottled { + // Mock reauth so it allows filling sensitive information without the need for + // real authentication. + [AutofillAppInterface setUpMockReauthenticationModule]; + [AutofillAppInterface mockReauthenticationModuleCanAttempt:YES]; + [AutofillAppInterface mockReauthenticationModuleExpectedResult: + ReauthenticationResult::kSuccess]; + + // Load the xframe payment page. + [self loadThrottledXframePaymentPage]; + + // Tap a credit card field to open the KA. The bottom sheet isn't triggered + // where there is only a name field in the credit card form. + [[EarlGrey selectElementWithMatcher:chrome_test_util::WebViewMatcher()] + performAction:chrome_test_util::TapWebElementWithId(kFormCardName)]; + + autofill::CreditCard card = autofill::test::GetCreditCard(); + + // Tap on the credit card chip. + id<GREYMatcher> cc_chip = grey_text(base::SysUTF16ToNSString(card.GetInfo( + autofill::CREDIT_CARD_NAME_FULL, l10n_util::GetLocaleOverride()))); + [ChromeEarlGrey waitForUIElementToAppearWithMatcher:cc_chip]; + [[EarlGrey selectElementWithMatcher:cc_chip] performAction:grey_tap()]; + + // Verify that the credit card fields were filled correctly across frames, + // where the name field should be filled but the other fields should remain + // unfilled because the limit of child frames was busted which results in not + // building the frame tree for the form. + + std::string locale = l10n_util::GetLocaleOverride(); + + // Verify that the cardholder name field on the main frame was filled which + // doesn't require the frame tree. + [self verifyFieldWithIdHasBeenFilled:kFormCardName + iframeId:"" + value:base::SysUTF16ToNSString(card.GetInfo( + autofill::CREDIT_CARD_NAME_FULL, + locale))]; + + // Verify that the fields on other frames weren't filled as they require the + // frame tree which wasn't constructed because the limit of frames was busted. + std::vector<std::tuple<autofill::FieldType, std::string, std::string>> + empty_fields_to_verify = { + std::make_tuple(autofill::CREDIT_CARD_NUMBER, "cc-number-frame", + kFormCardNumber), + std::make_tuple(autofill::CREDIT_CARD_EXP_MONTH, "cc-exp-frame", + kFormCardExpirationMonth), + std::make_tuple(autofill::CREDIT_CARD_EXP_4_DIGIT_YEAR, + "cc-exp-frame", kFormCardExpirationYear), + }; + for (const auto& [field_type, frame_id_attr, field_id_attr] : + empty_fields_to_verify) { + [self verifyFieldWithIdHasBeenFilled:field_id_attr + iframeId:frame_id_attr + value:@""]; + } + + // Cleanup. + [AutofillAppInterface clearMockReauthenticationModule]; +} + // Tests that tapping on an address related field opens the keyboard // accessory with the proper suggestion visible and that tapping on that // suggestion properly fills the related fields on the form.
diff --git a/ios/chrome/browser/browser_view/ui_bundled/browser_coordinator.mm b/ios/chrome/browser/browser_view/ui_bundled/browser_coordinator.mm index 71e93f26..a71bfb80 100644 --- a/ios/chrome/browser/browser_view/ui_bundled/browser_coordinator.mm +++ b/ios/chrome/browser/browser_view/ui_bundled/browser_coordinator.mm
@@ -219,6 +219,7 @@ #import "ios/chrome/browser/shared/ui/elements/activity_overlay_coordinator.h" #import "ios/chrome/browser/shared/ui/util/layout_guide_names.h" #import "ios/chrome/browser/shared/ui/util/page_animation_util.h" +#import "ios/chrome/browser/shared/ui/util/rtl_geometry.h" #import "ios/chrome/browser/shared/ui/util/top_view_controller.h" #import "ios/chrome/browser/shared/ui/util/uikit_ui_util.h" #import "ios/chrome/browser/shared/ui/util/util_swift.h" @@ -2221,6 +2222,26 @@ _enhancedSafeBrowsingPromoCoordinator = nil; } +- (BOOL)navigateBackWithAnimationIfNeeded { + if (!IsLensOverlaySameTabNavigationEnabled()) { + return NO; + } + + LensOverlayTabHelper* lensOverlayTabHelper = + LensOverlayTabHelper::FromWebState(self.activeWebState); + + if (lensOverlayTabHelper && + lensOverlayTabHelper->IsLensOverlayInvokedOnMostRecentBackItem()) { + [_sideSwipeMediator + animateSwipe:SwipeType::CHANGE_PAGE + inDirection:UseRTLLayout() ? UISwipeGestureRecognizerDirectionLeft + : UISwipeGestureRecognizerDirectionRight]; + return YES; + } + + return NO; +} + #pragma mark - BrowserViewVisibilityConsumer - (void)browserViewDidChangeVisibility {
diff --git a/ios/chrome/browser/lens_overlay/coordinator/lens_overlay_mediator.mm b/ios/chrome/browser/lens_overlay/coordinator/lens_overlay_mediator.mm index a4a2fbe..b2cecd5 100644 --- a/ios/chrome/browser/lens_overlay/coordinator/lens_overlay_mediator.mm +++ b/ios/chrome/browser/lens_overlay/coordinator/lens_overlay_mediator.mm
@@ -248,6 +248,13 @@ [self.toolbarConsumer setCanGoBack:canGoBack]; } +- (void)onRelatedSearchLoaded:(NSString*)omniboxText { + [self.omniboxCoordinator setThumbnailImage:nil]; + _thumbnailRemoved = YES; + [self.lensHandler hideUserSelection]; + [self updateOmniboxText:omniboxText]; +} + #pragma mark - LensResultPageMediatorDelegate - (void)lensResultPageWebStateDestroyed {
diff --git a/ios/chrome/browser/lens_overlay/model/lens_overlay_navigation_manager.h b/ios/chrome/browser/lens_overlay/model/lens_overlay_navigation_manager.h index c61542c..d2b6ada 100644 --- a/ios/chrome/browser/lens_overlay/model/lens_overlay_navigation_manager.h +++ b/ios/chrome/browser/lens_overlay/model/lens_overlay_navigation_manager.h
@@ -103,6 +103,11 @@ /// Go back to the previous lens navigation. void GoToPreviousLensNavigation(); + /// Whether the navigation from `current_url` to `destination_url` is a + /// related search navigation. Dependent of the latest + /// ChromeLensOverlayResult. + BOOL IsNavigationRelatedSearch(GURL current_url, GURL destination_url); + /// Adds the sub navigation to the current `LensResultItem` if it's not a /// reload. void RegisterSubNavigation(GURL url, const std::u16string& omnibox_text);
diff --git a/ios/chrome/browser/lens_overlay/model/lens_overlay_navigation_manager.mm b/ios/chrome/browser/lens_overlay/model/lens_overlay_navigation_manager.mm index cac010fc..1fd6661e 100644 --- a/ios/chrome/browser/lens_overlay/model/lens_overlay_navigation_manager.mm +++ b/ios/chrome/browser/lens_overlay/model/lens_overlay_navigation_manager.mm
@@ -6,6 +6,7 @@ #import "base/notreached.h" #import "base/strings/sys_string_conversions.h" +#import "components/lens/lens_url_utils.h" #import "ios/chrome/browser/lens_overlay/model/lens_overlay_navigation_mutator.h" #import "ios/chrome/browser/shared/public/features/features.h" #import "ios/public/provider/chrome/browser/lens/lens_overlay_result.h" @@ -13,6 +14,32 @@ #import "ios/web/public/web_state.h" #import "net/base/url_util.h" +namespace { + +/// Extracts the search query from the SRP `url`. +std::string ExtractQueryFromSRP(const GURL& url) { + std::string search_term = ""; + net::GetValueForKeyInQuery(url, "q", &search_term); + return search_term; +} + +/// Returns whether the `url` is a lens overlay SRP. +BOOL IsLensOverlaySRP(GURL url) { + std::string search_term; + BOOL hasSearchTerms = net::GetValueForKeyInQuery(url, "q", &search_term); + std::string lens_surface; + BOOL hasLensSurface = net::GetValueForKeyInQuery( + url, lens::kLensSurfaceQueryParameter, &lens_surface); + std::string request_id; + BOOL hasLensParam = net::GetValueForKeyInQuery( + url, lens::kLensRequestQueryParameter, &request_id); + + return hasSearchTerms && hasLensSurface && !hasLensParam && + lens_surface == "4"; +} + +} // namespace + #pragma mark - LensResultItem LensOverlayNavigationManager::LensResultItem::LensResultItem( @@ -119,7 +146,17 @@ web::WebState* web_state, web::NavigationContext* navigation_context) { if (navigation_context && !navigation_context->IsSameDocument()) { - RegisterSubNavigation(navigation_context->GetUrl(), PreviousOmniboxText()); + GURL navigation_url = navigation_context->GetUrl(); + + if (IsNavigationRelatedSearch(web_state->GetVisibleURL(), navigation_url)) { + NSString* omnibox_text = + base::SysUTF8ToNSString(ExtractQueryFromSRP(navigation_url)); + [mutator_ onRelatedSearchLoaded:omnibox_text]; + RegisterSubNavigation(navigation_url, + base::SysNSStringToUTF16(omnibox_text)); + } else { + RegisterSubNavigation(navigation_url, PreviousOmniboxText()); + } } } @@ -129,6 +166,19 @@ #pragma mark - Private +BOOL LensOverlayNavigationManager::IsNavigationRelatedSearch( + GURL current_url, + GURL destination_url) { + if (lens_navigation_items_.empty()) { + return NO; + } + id<ChromeLensOverlayResult> result = + lens_navigation_items_.back()->lens_result(); + + return !result.isTextSelection && !IsLensOverlaySRP(current_url) && + IsLensOverlaySRP(destination_url); +} + void LensOverlayNavigationManager::RegisterSubNavigation( GURL url, const std::u16string& omnibox_text) {
diff --git a/ios/chrome/browser/lens_overlay/model/lens_overlay_navigation_mutator.h b/ios/chrome/browser/lens_overlay/model/lens_overlay_navigation_mutator.h index 43bb0e7..70f89f5a 100644 --- a/ios/chrome/browser/lens_overlay/model/lens_overlay_navigation_mutator.h +++ b/ios/chrome/browser/lens_overlay/model/lens_overlay_navigation_mutator.h
@@ -30,6 +30,9 @@ /// availability of navigating to previous entry. - (void)onBackNavigationAvailabilityMaybeChanged:(BOOL)canGoBack; +/// Called when a related search URL is loaded from LRP. +- (void)onRelatedSearchLoaded:(NSString*)omniboxText; + @end #endif // IOS_CHROME_BROWSER_LENS_OVERLAY_MODEL_LENS_OVERLAY_NAVIGATION_MUTATOR_H_
diff --git a/ios/chrome/browser/lens_overlay/ui/lens_overlay_container_egtest.mm b/ios/chrome/browser/lens_overlay/ui/lens_overlay_container_egtest.mm index a65f4118..1cfccbb7 100644 --- a/ios/chrome/browser/lens_overlay/ui/lens_overlay_container_egtest.mm +++ b/ios/chrome/browser/lens_overlay/ui/lens_overlay_container_egtest.mm
@@ -21,11 +21,6 @@ return config; } -- (void)testShowAndHideLensOverlayContainer { - // TODO(crbug.com/359195500): Rewrite `testShowAndHideLensOverlayContainer` - // after accesibility label is added to the button in Lens integration -} - // Tests that when pressing the escape keyboard button, closes the overlay // container. - (void)testPressEscapeHidesLensOverlayContainer {
diff --git a/ios/chrome/browser/saved_tab_groups/model/tab_group_local_update_observer.mm b/ios/chrome/browser/saved_tab_groups/model/tab_group_local_update_observer.mm index 4e2bb02..d791a3d 100644 --- a/ios/chrome/browser/saved_tab_groups/model/tab_group_local_update_observer.mm +++ b/ios/chrome/browser/saved_tab_groups/model/tab_group_local_update_observer.mm
@@ -177,11 +177,11 @@ if (status.active_web_state_change() && web_state) { const TabGroup* tab_group = web_state_list->GetGroupOfWebStateAt(web_state_list->active_index()); - if (tab_group) { - sync_service_->OnTabSelected( - tab_group->tab_group_id(), - web_state->GetUniqueIdentifier().identifier()); - } + std::optional<LocalTabGroupID> local_tab_group_id = + tab_group ? std::make_optional<>(tab_group->tab_group_id()) + : std::nullopt; + sync_service_->OnTabSelected(local_tab_group_id, + web_state->GetUniqueIdentifier().identifier()); } }
diff --git a/ios/chrome/browser/saved_tab_groups/model/tab_group_local_update_observer_unittest.mm b/ios/chrome/browser/saved_tab_groups/model/tab_group_local_update_observer_unittest.mm index 3503a315..d216131 100644 --- a/ios/chrome/browser/saved_tab_groups/model/tab_group_local_update_observer_unittest.mm +++ b/ios/chrome/browser/saved_tab_groups/model/tab_group_local_update_observer_unittest.mm
@@ -791,14 +791,23 @@ WebStateListBuilderFromDescription builder(web_state_list); ASSERT_TRUE(builder.BuildWebStateListFromDescription("| [0 a b] c* d e f")); + // Focus a tab in a group. const TabGroup* group = builder.GetTabGroupForIdentifier('0'); web::WebState* web_state_a = builder.GetWebStateForIdentifier('a'); + web::WebState* web_state_e = builder.GetWebStateForIdentifier('e'); EXPECT_CALL( *mock_service_, OnTabSelected(Eq(group->tab_group_id()), Eq(web_state_a->GetUniqueIdentifier().identifier()))); web_state_list->ActivateWebStateAt(0); + + // Focus a tab not in any group. + EXPECT_CALL( + *mock_service_, + OnTabSelected(Eq(std::nullopt), + Eq(web_state_e->GetUniqueIdentifier().identifier()))); + web_state_list->ActivateWebStateAt(4); } } // namespace tab_groups
diff --git a/ios/chrome/browser/shared/public/commands/browser_coordinator_commands.h b/ios/chrome/browser/shared/public/commands/browser_coordinator_commands.h index eff5d1b2..54c4e24 100644 --- a/ios/chrome/browser/shared/public/commands/browser_coordinator_commands.h +++ b/ios/chrome/browser/shared/public/commands/browser_coordinator_commands.h
@@ -110,6 +110,10 @@ - (void)showEnhancedSafeBrowsingPromo; - (void)dismissEnhancedSafeBrowsingPromo; +// If an animation for navigating back is necessary, animates, navigate +// back and return YES. Otherwise, do nothing and return NO. +- (BOOL)navigateBackWithAnimationIfNeeded; + @end #endif // IOS_CHROME_BROWSER_SHARED_PUBLIC_COMMANDS_BROWSER_COORDINATOR_COMMANDS_H_
diff --git a/ios/chrome/browser/tab_switcher/ui_bundled/tab_grid/tab_groups/shared_tab_groups_egtest.mm b/ios/chrome/browser/tab_switcher/ui_bundled/tab_grid/tab_groups/shared_tab_groups_egtest.mm index 00a4680..3245ce9 100644 --- a/ios/chrome/browser/tab_switcher/ui_bundled/tab_grid/tab_groups/shared_tab_groups_egtest.mm +++ b/ios/chrome/browser/tab_switcher/ui_bundled/tab_grid/tab_groups/shared_tab_groups_egtest.mm
@@ -305,7 +305,8 @@ } // Checks that the user with JoinOnly can trigger the Join flow. -- (void)testJoinGroup { +// TODO(crbug.com/380113830): Re-enable this test. +- (void)DISABLED_testJoinGroup { GURL joinGroupURL = GURL(data_sharing::features::kDataSharingURL.Get() + "?group_id=resources%2F3bebf45000000000%2Fe%2F50cc3ac28e000000&" @@ -408,7 +409,8 @@ } // Checks that the user with JoinOnly can trigger the Join flow. -- (void)testJoinGroup { +// TODO(crbug.com/380113830): Re-enable this test. +- (void)DISABLED_testJoinGroup { GURL joinGroupURL = GURL(data_sharing::features::kDataSharingURL.Get() + "?group_id=resources%2F3bebf45000000000%2Fe%2F50cc3ac28e000000&"
diff --git a/ios/chrome/browser/web/model/BUILD.gn b/ios/chrome/browser/web/model/BUILD.gn index a272d5c7..dbc34b21 100644 --- a/ios/chrome/browser/web/model/BUILD.gn +++ b/ios/chrome/browser/web/model/BUILD.gn
@@ -48,6 +48,7 @@ "//ios/chrome/browser/infobars/model", "//ios/chrome/browser/infobars/model:public", "//ios/chrome/browser/lens/model", + "//ios/chrome/browser/lens_overlay/coordinator:lens_overlay_availability", "//ios/chrome/browser/ntp/model", "//ios/chrome/browser/shared/model/application_context", "//ios/chrome/browser/shared/model/browser",
diff --git a/ios/chrome/browser/web/model/DEPS b/ios/chrome/browser/web/model/DEPS index 0e20c92..95ed1542 100644 --- a/ios/chrome/browser/web/model/DEPS +++ b/ios/chrome/browser/web/model/DEPS
@@ -43,6 +43,7 @@ "+ios/chrome/browser/translate/model", "+ios/chrome/browser/url_loading/model", "+ios/chrome/browser/web_selection/model", + "+ios/chrome/browser/lens_overlay/coordinator/lens_overlay_availability.h", ] specific_include_rules = {
diff --git a/ios/chrome/browser/web/model/web_navigation_browser_agent.mm b/ios/chrome/browser/web/model/web_navigation_browser_agent.mm index 9837fa8c..983e261 100644 --- a/ios/chrome/browser/web/model/web_navigation_browser_agent.mm +++ b/ios/chrome/browser/web/model/web_navigation_browser_agent.mm
@@ -8,8 +8,10 @@ #import "components/feature_engagement/public/tracker.h" #import "ios/chrome/browser/feature_engagement/model/tracker_factory.h" #import "ios/chrome/browser/lens/model/lens_browser_agent.h" +#import "ios/chrome/browser/lens_overlay/coordinator/lens_overlay_availability.h" #import "ios/chrome/browser/shared/model/browser/browser.h" #import "ios/chrome/browser/shared/model/web_state_list/web_state_list.h" +#import "ios/chrome/browser/shared/public/commands/browser_coordinator_commands.h" #import "ios/chrome/browser/shared/public/commands/command_dispatcher.h" #import "ios/chrome/browser/shared/public/commands/lens_commands.h" #import "ios/chrome/browser/web/model/web_navigation_ntp_delegate.h" @@ -74,6 +76,14 @@ return; } + if (IsLensOverlaySameTabNavigationEnabled()) { + CommandDispatcher* dispatcher = browser_->GetCommandDispatcher(); + if ([HandlerForProtocol(dispatcher, BrowserCoordinatorCommands) + navigateBackWithAnimationIfNeeded]) { + return; + } + } + web_navigation_util::GoBack(active_web_state); // If the previous page was an eligible Lens Web Page, then display the LVF.
diff --git a/ios/chrome/credential_provider_extension/ui/credential_list_mediator+Testing.h b/ios/chrome/credential_provider_extension/ui/credential_list_mediator+Testing.h index 110c2e3..c593d8d6 100644 --- a/ios/chrome/credential_provider_extension/ui/credential_list_mediator+Testing.h +++ b/ios/chrome/credential_provider_extension/ui/credential_list_mediator+Testing.h
@@ -20,11 +20,9 @@ // and sorted by service name. - (NSArray<id<Credential>>*)fetchAllCredentials; -// Returns the list of allowed passkey credentials for the relying party. -- (NSArray<id<Credential>>*)filterPasskeyCredentials; - -// Returns the list of allowed password credentials for the service identifier. -- (NSArray<id<Credential>>*)filterPasswordCredentials; +// Returns the list of allowed credentials that are related to the relying +// party/service identifiers. +- (NSArray<id<Credential>>*)filterCredentials; // Tells the consumer to show the passed in suggested and all credentials. - (void)presentCredentials;
diff --git a/ios/chrome/credential_provider_extension/ui/credential_list_mediator.mm b/ios/chrome/credential_provider_extension/ui/credential_list_mediator.mm index a392bcc..0bfbad4c4 100644 --- a/ios/chrome/credential_provider_extension/ui/credential_list_mediator.mm +++ b/ios/chrome/credential_provider_extension/ui/credential_list_mediator.mm
@@ -65,18 +65,11 @@ [self.consumer setTopPrompt:PromptForServiceIdentifiers(self.serviceIdentifiers)]; + __weak __typeof(self) weakSelf = self; dispatch_queue_t priorityQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul); dispatch_async(priorityQueue, ^{ - self.allCredentials = [self fetchAllCredentials]; - - self.suggestedCredentials = [self.UIHandler relyingPartyIdentifier] - ? [self filterPasskeyCredentials] - : [self filterPasswordCredentials]; - - dispatch_async(dispatch_get_main_queue(), ^{ - [self presentCredentials]; - }); + [weakSelf fetchAndPresentRelevantCredentials]; }); } @@ -136,71 +129,115 @@ #pragma mark - Private +// Fetches and presents credentials that are relavent to the service the user is +// trying to log into. +- (void)fetchAndPresentRelevantCredentials { + self.allCredentials = [self fetchAllCredentials]; + self.suggestedCredentials = [self filterCredentials]; + + __weak __typeof(self) weakSelf = self; + dispatch_async(dispatch_get_main_queue(), ^{ + [weakSelf presentCredentials]; + }); +} + // Returns all credentials from the credential store, filtered by request type // and sorted by service name. - (NSArray<id<Credential>>*)fetchAllCredentials { NSString* relyingPartyIdentifier = [self.UIHandler relyingPartyIdentifier]; - // Only use passwords or passkeys, depending on what's requested. + + // Figure out which type(s) of credentials to keep. + BOOL includePasswords = NO; + BOOL includePasskeys = NO; + if (relyingPartyIdentifier) { + // When showing passkeys, only include passwords if there's at least one + // that matches the service identifiers. + includePasswords = [self hasPasswordThatMatchesServiceIdentifiers]; + includePasskeys = YES; + } else { + includePasswords = YES; + } + NSArray<id<Credential>>* credentials = [self.credentialStore.credentials filteredArrayUsingPredicate:[NSPredicate predicateWithBlock:^BOOL( id<Credential> credential, NSDictionary* bindings) { - if (relyingPartyIdentifier) { - return credential.isPasskey && - [credential.rpId isEqualToString:relyingPartyIdentifier]; - } else { - return !credential.isPasskey; - } + BOOL isPassword = !credential.isPasskey; + BOOL isValidPasskey = + credential.isPasskey && + [credential.rpId isEqualToString:relyingPartyIdentifier]; + + return (includePasswords && isPassword) || + (includePasskeys && isValidPasskey); }]]; - if (!relyingPartyIdentifier) { - credentials = [credentials sortedArrayUsingComparator:^NSComparisonResult( - id<Credential> obj1, id<Credential> obj2) { - return [obj1.serviceName compare:obj2.serviceName]; - }]; - } + credentials = [credentials sortedArrayUsingComparator:^NSComparisonResult( + id<Credential> obj1, id<Credential> obj2) { + NSString* firstIdentifier = obj1.isPasskey ? obj1.rpId : obj1.serviceName; + NSString* secondIdentifier = obj2.isPasskey ? obj2.rpId : obj2.serviceName; + return [firstIdentifier compare:secondIdentifier]; + }]; return credentials; } -// Returns the list of allowed passkey credentials for the relying party. -- (NSArray<id<Credential>>*)filterPasskeyCredentials { - // If the allowedCredentials array is empty, then the relying party accepts - // any passkey credential. - NSArray<NSData*>* allowedCredentials = [self.UIHandler allowedCredentials]; - if (allowedCredentials.count == 0) { - return self.allCredentials; - } - +// Returns the list of allowed credentials that are related to the relying +// party/service identifiers. +- (NSArray<id<Credential>>*)filterCredentials { NSMutableArray* filteredCredentials = [[NSMutableArray alloc] init]; + NSArray<NSData*>* allowedCredentials = [self.UIHandler allowedCredentials]; + // If the `allowedCredentials` array is empty, then the relying party accepts + // any passkey credential. + BOOL isAnyPasskeyAllowed = allowedCredentials.count == 0; for (id<Credential> credential in self.allCredentials) { - if ([allowedCredentials containsObject:credential.credentialId]) { + if (credential.isPasskey) { + if (isAnyPasskeyAllowed || + [allowedCredentials containsObject:credential.credentialId]) { + [filteredCredentials addObject:credential]; + } + } else if (!credential.isPasskey && + [self passwordCredential:credential + matchesServiceIdentifiers:self.serviceIdentifiers]) { [filteredCredentials addObject:credential]; } } + return filteredCredentials; } -// Returns the list of allowed password credentials for the service identifier. -- (NSArray<id<Credential>>*)filterPasswordCredentials { - NSMutableArray* filteredCredentials = [[NSMutableArray alloc] init]; - for (id<Credential> credential in self.allCredentials) { - for (ASCredentialServiceIdentifier* identifier in self.serviceIdentifiers) { - if (credential.serviceName && - [identifier.identifier - localizedStandardContainsString:credential.serviceName]) { - [filteredCredentials addObject:credential]; - break; - } - if (credential.serviceIdentifier && - [identifier.identifier - localizedStandardContainsString:credential.serviceIdentifier]) { - [filteredCredentials addObject:credential]; - break; - } +// Returns `YES` if the provided `credential` matches at least one of the +// `serviceIdentifiers`. +- (BOOL)passwordCredential:(id<Credential>)credential + matchesServiceIdentifiers: + (NSArray<ASCredentialServiceIdentifier*>*)serviceIdentifiers { + for (ASCredentialServiceIdentifier* identifier in serviceIdentifiers) { + BOOL serviceNameMatches = + credential.serviceName && + [identifier.identifier + localizedStandardContainsString:credential.serviceName]; + BOOL serviceIdentifierMatches = + credential.serviceIdentifier && + [identifier.identifier + localizedStandardContainsString:credential.serviceIdentifier]; + if (serviceNameMatches || serviceIdentifierMatches) { + return YES; } } - return filteredCredentials; + return NO; +} + +// Returns `YES` if at least one of the saved password credentials matches the +// `serviceIdentifiers`. +- (BOOL)hasPasswordThatMatchesServiceIdentifiers { + __weak __typeof(self) weakSelf = self; + NSUInteger indexOfMatchingPassword = [self.credentialStore.credentials + indexOfObjectPassingTest:^BOOL(id<Credential> credential, NSUInteger, + BOOL*) { + return !credential.isPasskey && + [weakSelf passwordCredential:credential + matchesServiceIdentifiers:weakSelf.serviceIdentifiers]; + }]; + return indexOfMatchingPassword != NSNotFound; } // Tells the consumer to show the passed in suggested and all credentials.
diff --git a/ios/chrome/credential_provider_extension/ui/credential_list_mediator_unittest.mm b/ios/chrome/credential_provider_extension/ui/credential_list_mediator_unittest.mm index e5e6cd66..829fee1 100644 --- a/ios/chrome/credential_provider_extension/ui/credential_list_mediator_unittest.mm +++ b/ios/chrome/credential_provider_extension/ui/credential_list_mediator_unittest.mm
@@ -245,6 +245,74 @@ } } +// Tests that fetching all credentials works properly on iOS 17+ when there are +// both passkeys and passwords available for the relying party/service +// identifiers. +TEST_F(CredentialListMediatorTest, FetchAllCredentialsPasskeysAndPasswords) { + if (@available(iOS 17.0, *)) { + ArchivableCredential* password_credential_1 = TestPasswordCredential(); + ArchivableCredential* password_credential_2 = TestPasswordCredential2(); + ArchivableCredential* passkey_credential = TestPasskeyCredential(); + + NSMutableArray<id<Credential>>* credentials = [NSMutableArray array]; + [credentials addObject:password_credential_1]; + [credentials addObject:password_credential_2]; + [credentials addObject:passkey_credential]; + id<CredentialStore> credential_store = + [[MockCredentialStore alloc] initWithCredentials:credentials]; + + id<CredentialListUIHandler> ui_handler = + UIHandlerWithCredential(passkey_credential); + + CredentialListMediator* credential_list_mediator = + [[CredentialListMediator alloc] + initWithConsumer:nil + UIHandler:ui_handler + credentialStore:credential_store + serviceIdentifiers:ServiceIdentifierWithName( + password_credential_1.serviceName) + credentialResponseHandler:nil]; + + NSArray<id<Credential>>* all_credentials = + [credential_list_mediator fetchAllCredentials]; + ASSERT_EQ(all_credentials.count, 3u); + EXPECT_NSEQ(all_credentials[0], password_credential_1); + EXPECT_NSEQ(all_credentials[1], password_credential_2); + EXPECT_NSEQ(all_credentials[2], passkey_credential); + } +} + +// Tests that fetching all credentials works properly on iOS 17+ when there +// there are only passkeys available for the relying party (and no passwords +// matching the service identifiers). +TEST_F(CredentialListMediatorTest, FetchAllCredentialsPasskeysOnly) { + if (@available(iOS 17.0, *)) { + ArchivableCredential* password_credential = TestPasswordCredential(); + ArchivableCredential* passkey_credential = TestPasskeyCredential(); + + NSMutableArray<id<Credential>>* credentials = [NSMutableArray array]; + [credentials addObject:password_credential]; + [credentials addObject:passkey_credential]; + id<CredentialStore> credential_store = + [[MockCredentialStore alloc] initWithCredentials:credentials]; + + id<CredentialListUIHandler> ui_handler = + UIHandlerWithCredential(passkey_credential); + + CredentialListMediator* credential_list_mediator = + [[CredentialListMediator alloc] initWithConsumer:nil + UIHandler:ui_handler + credentialStore:credential_store + serviceIdentifiers:nil + credentialResponseHandler:nil]; + + NSArray<id<Credential>>* all_credentials = + [credential_list_mediator fetchAllCredentials]; + ASSERT_EQ(all_credentials.count, 1u); + EXPECT_NSEQ(all_credentials[0], passkey_credential); + } +} + // Tests that filtering passkey credentials works properly. TEST_F(CredentialListMediatorTest, FilterPasskeyCredentials) { if (@available(iOS 17.0, *)) { @@ -271,7 +339,7 @@ [credentialListMediator fetchAllCredentials]; NSArray<id<Credential>>* filteredCredentials = - [credentialListMediator filterPasskeyCredentials]; + [credentialListMediator filterCredentials]; ASSERT_EQ(filteredCredentials.count, 1u); EXPECT_NSEQ(filteredCredentials[0], credential2); } @@ -301,9 +369,47 @@ [credentialListMediator fetchAllCredentials]; NSArray<id<Credential>>* filteredCredentials = - [credentialListMediator filterPasswordCredentials]; + [credentialListMediator filterCredentials]; ASSERT_EQ(filteredCredentials.count, 1u); EXPECT_NSEQ(filteredCredentials[0], credential2); } +// Tests that filtering credentials works properly when both passkeys and +// passwords are available. +TEST_F(CredentialListMediatorTest, FilterPasskeyAndPasswordCredentials) { + if (@available(iOS 17.0, *)) { + ArchivableCredential* password_credential_1 = TestPasswordCredential(); + ArchivableCredential* password_credential_2 = TestPasswordCredential2(); + ArchivableCredential* passkey_credential = TestPasskeyCredential(); + + id<CredentialListUIHandler> ui_handler = + UIHandlerWithCredential(passkey_credential); + + NSMutableArray<id<Credential>>* credentials = [NSMutableArray array]; + [credentials addObject:password_credential_1]; + [credentials addObject:password_credential_2]; + [credentials addObject:passkey_credential]; + id<CredentialStore> credentialStore = + [[MockCredentialStore alloc] initWithCredentials:credentials]; + + CredentialListMediator* credential_list_mediator = + [[CredentialListMediator alloc] + initWithConsumer:nil + UIHandler:ui_handler + credentialStore:credentialStore + serviceIdentifiers:ServiceIdentifierWithName( + password_credential_1.serviceName) + credentialResponseHandler:nil]; + + credential_list_mediator.allCredentials = + [credential_list_mediator fetchAllCredentials]; + + NSArray<id<Credential>>* filtered_credentials = + [credential_list_mediator filterCredentials]; + ASSERT_EQ(filtered_credentials.count, 2u); + EXPECT_NSEQ(filtered_credentials[0], password_credential_1); + EXPECT_NSEQ(filtered_credentials[1], passkey_credential); + } +} + } // namespace credential_provider_extension
diff --git a/ios/chrome/widget_kit_extension/quick_actions_widget.swift b/ios/chrome/widget_kit_extension/quick_actions_widget.swift index be449ab..8190ffc 100644 --- a/ios/chrome/widget_kit_extension/quick_actions_widget.swift +++ b/ios/chrome/widget_kit_extension/quick_actions_widget.swift
@@ -10,11 +10,14 @@ let date: Date let useLens: Bool let useColorLensAndVoiceIcons: Bool + let isPreview: Bool + let avatar: Image? } struct ConfigureQuickActionsWidgetEntryProvider: TimelineProvider { func placeholder(in context: Context) -> ConfigureQuickActionsWidgetEntry { - ConfigureQuickActionsWidgetEntry(date: Date(), useLens: false, useColorLensAndVoiceIcons: false) + ConfigureQuickActionsWidgetEntry( + date: Date(), useLens: false, useColorLensAndVoiceIcons: false, isPreview: true, avatar: nil) } func getSnapshot( @@ -24,7 +27,9 @@ let entry = ConfigureQuickActionsWidgetEntry( date: Date(), useLens: shouldUseLens(), - useColorLensAndVoiceIcons: shouldUseColorLensAndVoiceIcons() + useColorLensAndVoiceIcons: shouldUseColorLensAndVoiceIcons(), + isPreview: context.isPreview, + avatar: nil ) completion(entry) } @@ -36,7 +41,9 @@ let entry = ConfigureQuickActionsWidgetEntry( date: Date(), useLens: shouldUseLens(), - useColorLensAndVoiceIcons: shouldUseColorLensAndVoiceIcons() + useColorLensAndVoiceIcons: shouldUseColorLensAndVoiceIcons(), + isPreview: context.isPreview, + avatar: nil ) let entries: [ConfigureQuickActionsWidgetEntry] = [entry] let timeline: Timeline = Timeline(entries: entries, policy: .never) @@ -99,16 +106,20 @@ func placeholder(in context: Context) -> ConfigureQuickActionsWidgetEntry { ConfigureQuickActionsWidgetEntry( - date: Date(), useLens: false, useColorLensAndVoiceIcons: false) + date: Date(), useLens: false, useColorLensAndVoiceIcons: false, isPreview: true, avatar: nil + ) } func snapshot(for configuration: SelectProfileIntent, in context: Context) async -> ConfigureQuickActionsWidgetEntry { + let avatar: Image? = configuration.avatarForProfile(profile: configuration.profile) let entry = ConfigureQuickActionsWidgetEntry( date: Date(), useLens: shouldUseLens(), - useColorLensAndVoiceIcons: shouldUseColorLensAndVoiceIcons() + useColorLensAndVoiceIcons: shouldUseColorLensAndVoiceIcons(), + isPreview: context.isPreview, + avatar: avatar ) return entry } @@ -116,10 +127,13 @@ func timeline(for configuration: SelectProfileIntent, in context: Context) async -> Timeline< ConfigureQuickActionsWidgetEntry > { + let avatar: Image? = configuration.avatarForProfile(profile: configuration.profile) let entry = ConfigureQuickActionsWidgetEntry( date: Date(), useLens: shouldUseLens(), - useColorLensAndVoiceIcons: shouldUseColorLensAndVoiceIcons() + useColorLensAndVoiceIcons: shouldUseColorLensAndVoiceIcons(), + isPreview: context.isPreview, + avatar: avatar ) let entries: [ConfigureQuickActionsWidgetEntry] = [entry] let timeline: Timeline = Timeline(entries: entries, policy: .never) @@ -193,6 +207,9 @@ .font(.subheadline) .foregroundColor(Color("widget_text_color")) Spacer() + #if IOS_ENABLE_WIDGETS_FOR_MIM + Avatar(entry: entry) + #endif } } .frame(minWidth: 0, maxWidth: .infinity) @@ -287,3 +304,24 @@ }.frame(minWidth: 0, maxWidth: .infinity) } } + +struct Avatar: View { + var entry: ConfigureQuickActionsWidgetEntry + var body: some View { + if entry.isPreview { + Circle() + .foregroundColor(Color("widget_text_color")) + .opacity(0.2) + .frame(width: 35, height: 35) + .padding(.trailing, 8) + } else if let avatar = entry.avatar { + avatar + .resizable() + .clipShape(Circle()) + .unredacted() + .scaledToFill() + .frame(width: 35, height: 35) + .padding(.trailing, 8) + } + } +}
diff --git a/ios/chrome/widget_kit_extension/select_profile_intent.swift b/ios/chrome/widget_kit_extension/select_profile_intent.swift index 7382453..9f3d034 100644 --- a/ios/chrome/widget_kit_extension/select_profile_intent.swift +++ b/ios/chrome/widget_kit_extension/select_profile_intent.swift
@@ -67,13 +67,15 @@ } // Returns the avatar linked to the profile. - func avatarForProfile(profile: ProfileDetail) -> Image? { + func avatarForProfile(profile: ProfileDetail?) -> Image? { guard let sharedDefaults: UserDefaults = AppGroupHelper.groupUserDefaults() else { return nil } - let avatarFileName = "\(profile.gaia).png" + guard let gaia = profile?.gaia + else { return nil } + let avatarFilePath = - AppGroupHelper.widgetsAvatarFolder().appendingPathComponent(avatarFileName) + AppGroupHelper.widgetsAvatarFolder().appendingPathComponent("\(gaia).png") guard let uiImage = UIImage(contentsOfFile: avatarFilePath.path) else { return nil
diff --git a/ios/chrome/widget_kit_extension/shortcuts_widget.swift b/ios/chrome/widget_kit_extension/shortcuts_widget.swift index 229da3f..5b95967 100644 --- a/ios/chrome/widget_kit_extension/shortcuts_widget.swift +++ b/ios/chrome/widget_kit_extension/shortcuts_widget.swift
@@ -143,7 +143,7 @@ // Provides a timeline entry that represents the current time and state of a widget. func snapshot(for configuration: SelectProfileIntent, in context: Context) async -> Entry { - let avatar: Image = configuration.avatarForProfile(profile: configuration.profile!)! + let avatar: Image? = configuration.avatarForProfile(profile: configuration.profile) let entry = loadMostVisitedSitesEntry(isPreview: context.isPreview, avatar: avatar) return entry } @@ -152,7 +152,7 @@ func timeline(for configuration: SelectProfileIntent, in context: Context) async -> Timeline< Entry > { - let avatar: Image = configuration.avatarForProfile(profile: configuration.profile!)! + let avatar: Image? = configuration.avatarForProfile(profile: configuration.profile) let entry = loadMostVisitedSitesEntry(isPreview: context.isPreview, avatar: avatar) let entries = [entry] let timeline = Timeline(
diff --git a/ios/testing/data/http_server_files/xframe_credit_card_throttled.html b/ios/testing/data/http_server_files/xframe_credit_card_throttled.html new file mode 100644 index 0000000..dd61e02 --- /dev/null +++ b/ios/testing/data/http_server_files/xframe_credit_card_throttled.html
@@ -0,0 +1,69 @@ +<!-- +Copyright 2024 The Chromium Authors +Use of this source code is governed by a BSD-style license that can be +found in the LICENSE file. +--> + +<!DOCTYPE html> + +<html> + +<!-- +Page for testing Autofill Across Iframes with throttling. +--> + +<body> + Autofill Test - Xframe Credit Card - Frame Limit Exceeded<br> + + <h3>Credit Card Info</h3> + <form name="cc1.1" + id="cc1" + action="destination.html" + method="POST"> + <!-- Credit Card Fields --> + + Name on card: <input type="text" + autocomplete="cc-name" + name="CCName" + id="CCName"><br><br> + Credit card number: <iframe id='cc-number-frame' + srcdoc='<input type="text" name="CCNo" id="CCNo" autocomplete="cc-number">'></iframe><br> + Expiry Date: <iframe id='cc-exp-frame' + srcdoc='<input type="text" name="CCExpiresMonth" id="CCExpiresMonth" autocomplete="cc-month-exp"> / <input type="text" name="CCExpiresYear" id="CCExpiresYear" autocomplete="cc-year-exp">'></iframe><br> + CVC: <iframe id='cc-cvc' + srcdoc='<input type="text" name="cvc" id="cvc" autocomplete="cc-csc">'></iframe><br><br> + <input type="reset" + value="Reset" + id="cc-form-reset"> + <input type="submit" + value="Submit" + id="cc-form-submit"> + + <!-- Add up iframes to 21 to bust the limit and have iframes ignored --> + <iframe></iframe> + <iframe></iframe> + <iframe></iframe> + <iframe></iframe> + <iframe></iframe> + + <iframe></iframe> + <iframe></iframe> + <iframe></iframe> + <iframe></iframe> + <iframe></iframe> + + <iframe></iframe> + <iframe></iframe> + <iframe></iframe> + <iframe></iframe> + <iframe></iframe> + + <iframe></iframe> + <iframe></iframe> + <iframe></iframe> + + </form><br> + +</body> + +</html>
diff --git a/ios/testing/http_server_bundle_data.filelist b/ios/testing/http_server_bundle_data.filelist index 8421564..f92b5dc 100644 --- a/ios/testing/http_server_bundle_data.filelist +++ b/ios/testing/http_server_bundle_data.filelist
@@ -68,3 +68,4 @@ data/http_server_files/window_open.html data/http_server_files/window_proxy.html data/http_server_files/xframe_credit_card.html +data/http_server_files/xframe_credit_card_throttled.html
diff --git a/ios/web/browser_state_utils.mm b/ios/web/browser_state_utils.mm index 41190cb3..750de20 100644 --- a/ios/web/browser_state_utils.mm +++ b/ios/web/browser_state_utils.mm
@@ -21,4 +21,11 @@ return data_store; } +void RemoveDataStorageForIdentifier( + const base::Uuid& uuid, + base::OnceCallback<void(NSError*)> callback) { + WKWebViewConfigurationProvider::DeleteDataStorageForIdentifier( + uuid, std::move(callback)); +} + } // namespace web
diff --git a/ios/web/public/browser_state_utils.h b/ios/web/public/browser_state_utils.h index 5144f9fe..8d34d6f 100644 --- a/ios/web/public/browser_state_utils.h +++ b/ios/web/public/browser_state_utils.h
@@ -5,8 +5,16 @@ #ifndef IOS_WEB_PUBLIC_BROWSER_STATE_UTILS_H_ #define IOS_WEB_PUBLIC_BROWSER_STATE_UTILS_H_ +#import <Foundation/Foundation.h> + +#import "base/functional/callback_forward.h" + @class WKWebsiteDataStore; +namespace base { +class Uuid; +} + namespace web { class BrowserState; @@ -14,6 +22,12 @@ // Returns a data store associated with BrowserState. WKWebsiteDataStore* GetDataStoreForBrowserState(BrowserState* browser_state); +// Delete the storage associated with uuid. This must only be called if no +// storage is created for that identifier. +void RemoveDataStorageForIdentifier( + const base::Uuid& uuid, + base::OnceCallback<void(NSError*)> callback); + } // namespace web #endif // IOS_WEB_PUBLIC_BROWSER_STATE_UTILS_H_
diff --git a/ios/web/web_state/ui/wk_web_view_configuration_provider.h b/ios/web/web_state/ui/wk_web_view_configuration_provider.h index e46a2c1b..6526f1c7 100644 --- a/ios/web/web_state/ui/wk_web_view_configuration_provider.h +++ b/ios/web/web_state/ui/wk_web_view_configuration_provider.h
@@ -16,6 +16,10 @@ @class CRWWebUISchemeHandler; @class WKWebViewConfiguration; +namespace base { +class Uuid; +} + namespace web { class BrowserState; @@ -37,6 +41,12 @@ static web::WKWebViewConfigurationProvider& FromBrowserState( web::BrowserState* browser_state); + // Delete the storage associated with uuid. This must only be called if no + // storage is created for that identifier. + static void DeleteDataStorageForIdentifier( + const base::Uuid& uuid, + base::OnceCallback<void(NSError*)> callback); + // Returns a WeakPtr to the current instance. base::WeakPtr<WKWebViewConfigurationProvider> AsWeakPtr();
diff --git a/ios/web/web_state/ui/wk_web_view_configuration_provider.mm b/ios/web/web_state/ui/wk_web_view_configuration_provider.mm index 9842bd8..c1e169b 100644 --- a/ios/web/web_state/ui/wk_web_view_configuration_provider.mm +++ b/ios/web/web_state/ui/wk_web_view_configuration_provider.mm
@@ -10,11 +10,13 @@ #import <vector> #import "base/check.h" +#import "base/functional/callback_helpers.h" #import "base/ios/ios_util.h" #import "base/memory/ptr_util.h" #import "base/notreached.h" #import "base/strings/string_util.h" #import "base/strings/sys_string_conversions.h" +#import "base/uuid.h" #import "components/safe_browsing/core/common/features.h" #import "ios/web/common/features.h" #import "ios/web/js_features/window_error/catch_gcrweb_script_errors_java_script_feature.h" @@ -60,6 +62,19 @@ browser_state->GetUserData(kWKWebViewConfigProviderKeyName))); } +// static +void WKWebViewConfigurationProvider::DeleteDataStorageForIdentifier( + const base::Uuid& uuid, + base::OnceCallback<void(NSError*)> callback) { + if (@available(iOS 17.0, *)) { + [WKWebsiteDataStore removeDataStoreForIdentifier:ToNSUUID(uuid) + completionHandler:base::CallbackToBlock( + std::move(callback))]; + } else { + NOTREACHED(); + } +} + base::WeakPtr<WKWebViewConfigurationProvider> WKWebViewConfigurationProvider::AsWeakPtr() { DCHECK_CALLED_ON_VALID_SEQUENCE(_sequence_checker_);
diff --git a/ios_internal b/ios_internal index ae4eac6..fa89054 160000 --- a/ios_internal +++ b/ios_internal
@@ -1 +1 @@ -Subproject commit ae4eac69b182afea8eeb44148e709b4338bbb276 +Subproject commit fa89054d303701d661169f5d7cf4e8473dd3fe98
diff --git a/media/gpu/chromeos/generic_dmabuf_video_frame_mapper.cc b/media/gpu/chromeos/generic_dmabuf_video_frame_mapper.cc index 82371fab7..a6ecf114 100644 --- a/media/gpu/chromeos/generic_dmabuf_video_frame_mapper.cc +++ b/media/gpu/chromeos/generic_dmabuf_video_frame_mapper.cc
@@ -67,6 +67,8 @@ return nullptr; } + video_frame->set_color_space(src_video_frame->ColorSpace()); + // Pass org_video_frame so that it outlives video_frame. video_frame->AddDestructionObserver( base::BindOnce(MunmapBuffers, chunks, std::move(src_video_frame)));
diff --git a/media/renderers/paint_canvas_video_renderer.cc b/media/renderers/paint_canvas_video_renderer.cc index 953aaa862..7bb844e 100644 --- a/media/renderers/paint_canvas_video_renderer.cc +++ b/media/renderers/paint_canvas_video_renderer.cc
@@ -1457,20 +1457,60 @@ return false; } GrDirectContext* gr_context = raster_context_provider->GrContext(); - if (!gr_context && - !raster_context_provider->ContextCapabilities().gpu_rasterization) { + const bool gpu_rasterization = + raster_context_provider->ContextCapabilities().gpu_rasterization; + if (!gr_context && !gpu_rasterization) { return false; } - - // Take the two-copy path. - if (!UpdateLastImage(video_frame, raster_context_provider)) { - return false; - } - - DCHECK(cache_); - DCHECK(cache_->texture_backing); gpu::raster::RasterInterface* canvas_ri = raster_context_provider->RasterInterface(); + DCHECK(canvas_ri); + + // Take the two-copy path. + // Create the intermediate rgb shared image cache if not already present. + if (!yuv_cache_.rgb_shared_image_cache) { + yuv_cache_.rgb_shared_image_cache = + std::make_unique<VideoFrameSharedImageCache>(); + } + + // This SI is used to cache the VideoFrame. We will eventually read out + // its contents into a destination GL texture via the GLES2 interface. + gpu::SharedImageUsageSet src_usage = + gpu::SHARED_IMAGE_USAGE_GLES2_READ | gpu::SHARED_IMAGE_USAGE_RASTER_WRITE; + // We copy the contents of the source VideoFrame *into* the cached SI over the + // raster interface - the usage bits depend on whether OOP-Raster is enabled. + // TODO(crbug.com/40194377): Always use OOP_RASTERIZATION usage once OOP-C is + // fully launched. + if (gpu_rasterization) { + src_usage |= gpu::SHARED_IMAGE_USAGE_OOP_RASTERIZATION; + } else { + src_usage |= gpu::SHARED_IMAGE_USAGE_GLES2_WRITE; + } + auto [rgb_shared_image, rgb_sync_token, status] = + yuv_cache_.rgb_shared_image_cache->GetOrCreateSharedImage( + video_frame.get(), raster_context_provider, src_usage, + SHARED_IMAGE_FORMAT, video_frame->CompatRGBColorSpace()); + yuv_cache_.raster_context_provider = raster_context_provider; + CHECK(rgb_shared_image); + + // Wait on the `rgb_sync_token` passed from the cache that may have been + // updated from the previous frame. + canvas_ri->WaitSyncTokenCHROMIUM(rgb_sync_token.GetConstData()); + + // If there's no cache hit, perform a copy. + if (status != VideoFrameSharedImageCache::Status::kMatchedVideoFrameId) { + // Copy into the shared image backing of the cached copy. + canvas_ri->WaitSyncTokenCHROMIUM( + video_frame->acquire_sync_token().GetConstData()); + canvas_ri->CopySharedImage( + shared_image->mailbox(), rgb_shared_image->mailbox(), 0, 0, 0, 0, + video_frame->coded_size().width(), video_frame->coded_size().height()); + + // Ensure that |video_frame| not be deleted until the above copy is + // completed. + SynchronizeVideoFrameRead(video_frame, canvas_ri, + raster_context_provider->ContextSupport()); + } gpu::SyncToken sync_token; // Wait for mailbox creation on canvas context before consuming it and @@ -1478,16 +1518,18 @@ canvas_ri->GenUnverifiedSyncTokenCHROMIUM(sync_token.GetData()); gpu::SyncToken dest_sync_token = CopySharedImageToTexture( - destination_gl, cache_->coded_size, cache_->visible_rect, - cache_->texture_backing->GetSharedImage().get(), sync_token, target, - texture, internal_format, format, type, level, premultiply_alpha, flip_y); + destination_gl, video_frame->coded_size(), video_frame->visible_rect(), + rgb_shared_image.get(), sync_token, target, texture, internal_format, + format, type, level, premultiply_alpha, flip_y); - // Wait for destination context to consume mailbox before deleting it in - // canvas context. - canvas_ri->WaitSyncTokenCHROMIUM(dest_sync_token.GetConstData()); + // Update the `rgb_sync_token` to be waited upon based on gles tasks performed + // earlier. + yuv_cache_.rgb_shared_image_cache->UpdateSyncToken(dest_sync_token); // We do not need to synchronize video frame read here since it's already - // taken care of in UpdateLastImage(). + // taken care of earlier. + // Kick off a timer to release the cache. + cache_deleting_timer_.Reset(); return true; }
diff --git a/net/cookies/canonical_cookie.cc b/net/cookies/canonical_cookie.cc index a866602..7bcdf41 100644 --- a/net/cookies/canonical_cookie.cc +++ b/net/cookies/canonical_cookie.cc
@@ -84,15 +84,13 @@ static constexpr int kMinutesInTwentyFourHours = 24 * 60; // Determine the cookie domain to use for setting the specified cookie. -bool GetCookieDomain(const GURL& url, - const ParsedCookie& pc, - CookieInclusionStatus& status, - std::string* result) { +std::optional<std::string> GetCookieDomain(const GURL& url, + const ParsedCookie& pc, + CookieInclusionStatus& status) { std::string domain_string; if (pc.HasDomain()) domain_string = pc.Domain(); - return cookie_util::GetCookieDomainWithString(url, domain_string, status, - result); + return cookie_util::GetCookieDomainWithString(url, domain_string, status); } // Compares cookies using name, domain and path, so that "equivalent" cookies @@ -350,8 +348,9 @@ parsed_cookie.HasDomain() && !base::IsStringASCII(parsed_cookie.Domain())); - std::string cookie_domain; - if (!GetCookieDomain(url, parsed_cookie, *status, &cookie_domain)) { + std::optional<std::string> cookie_domain = + GetCookieDomain(url, parsed_cookie, *status); + if (!cookie_domain) { DVLOG(net::cookie_util::kVlogSetCookies) << "Create() failed to get a valid cookie domain"; status->AddExclusionReason(CookieInclusionStatus::EXCLUDE_INVALID_DOMAIN); @@ -453,8 +452,8 @@ auto cc = std::make_unique<CanonicalCookie>( base::PassKey<CanonicalCookie>(), parsed_cookie.Name(), - parsed_cookie.Value(), std::move(cookie_domain), std::move(cookie_path), - creation_time, cookie_expires, creation_time, + parsed_cookie.Value(), std::move(cookie_domain).value_or(std::string()), + std::move(cookie_path), creation_time, cookie_expires, creation_time, /*last_update=*/base::Time::Now(), parsed_cookie.IsSecure(), parsed_cookie.IsHttpOnly(), samesite, parsed_cookie.Priority(), cookie_partition_key, source_scheme, source_port, source_type); @@ -567,14 +566,15 @@ const std::string& domain_attribute = domain_is_valid ? domain : std::string(); - std::string cookie_domain; + std::optional<std::string> cookie_domain; // This validation step must happen before GetCookieDomainWithString, so it // doesn't fail DCHECKs. if (!cookie_util::DomainIsHostOnly(url.host())) { status->AddExclusionReason( net::CookieInclusionStatus::EXCLUDE_INVALID_DOMAIN); - } else if (!cookie_util::GetCookieDomainWithString(url, domain_attribute, - *status, &cookie_domain)) { + } else if (cookie_domain = cookie_util::GetCookieDomainWithString( + url, domain_attribute, *status); + !cookie_domain) { status->AddExclusionReason( net::CookieInclusionStatus::EXCLUDE_INVALID_DOMAIN); } @@ -683,7 +683,8 @@ return nullptr; auto cc = std::make_unique<CanonicalCookie>( - base::PassKey<CanonicalCookie>(), name, value, std::move(cookie_domain), + base::PassKey<CanonicalCookie>(), name, value, + std::move(cookie_domain).value_or(std::string()), std::move(encoded_cookie_path), creation_time, expiration_time, last_access_time, /*last_update=*/base::Time::Now(), secure, http_only, same_site, priority,
diff --git a/net/cookies/cookie_util.cc b/net/cookies/cookie_util.cc index 7e3bf9b..942a808 100644 --- a/net/cookies/cookie_util.cc +++ b/net/cookies/cookie_util.cc
@@ -13,6 +13,7 @@ #include "base/check.h" #include "base/command_line.h" #include "base/compiler_specific.h" +#include "base/containers/contains.h" #include "base/feature_list.h" #include "base/functional/bind.h" #include "base/functional/callback.h" @@ -344,16 +345,16 @@ return CookieDomainAsHost(host); } -bool GetCookieDomainWithString(const GURL& url, - const std::string& domain_string, - CookieInclusionStatus& status, - std::string* result) { +std::optional<std::string> GetCookieDomainWithString( + const GURL& url, + const std::string& domain_string, + CookieInclusionStatus& status) { // Disallow non-ASCII domain names. if (!base::IsStringASCII(domain_string)) { if (base::FeatureList::IsEnabled(features::kCookieDomainRejectNonASCII)) { status.AddExclusionReason( CookieInclusionStatus::EXCLUDE_DOMAIN_NON_ASCII); - return false; + return std::nullopt; } status.AddWarningReason(CookieInclusionStatus::WARN_DOMAIN_NON_ASCII); } @@ -366,7 +367,7 @@ // it is the last label in the name, but a name ending in `..` would have an // empty label in the penultimate position and is thus invalid. if (url_host.ends_with("..")) { - return false; + return std::nullopt; } // If no domain was specified in the domain string, default to a host cookie. // We match IE/Firefox in allowing a domain=IPADDR if it matches (case @@ -376,34 +377,36 @@ (url.HostIsIPAddress() && (base::EqualsCaseInsensitiveASCII(url_host, domain_string) || base::EqualsCaseInsensitiveASCII("." + url_host, domain_string)))) { + std::string result; if (url.SchemeIsHTTPOrHTTPS() || url.SchemeIsWSOrWSS()) { - *result = url_host; + result = url_host; } else { // If the URL uses an unknown scheme, we should ensure the host has been // canonicalized. url::CanonHostInfo ignored; - *result = CanonicalizeHost(url_host, &ignored); + result = CanonicalizeHost(url_host, &ignored); } // TODO(crbug.com/40271909): Once empty label support is implemented we can // CHECK our assumptions here. For now, we DCHECK as DUMP_WILL_BE_CHECK is // generating too many crash reports and already know why this is failing. - DCHECK(DomainIsHostOnly(*result)); - return true; + DCHECK(DomainIsHostOnly(result)); + return result; } // Disallow domain names with %-escaped characters. - for (char c : domain_string) { - if (c == '%') - return false; + if (base::Contains(domain_string, '%')) { + return std::nullopt; } url::CanonHostInfo ignored; std::string cookie_domain(CanonicalizeHost(domain_string, &ignored)); // Get the normalized domain specified in cookie line. - if (cookie_domain.empty()) - return false; - if (cookie_domain[0] != '.') + if (cookie_domain.empty()) { + return std::nullopt; + } + if (cookie_domain[0] != '.') { cookie_domain = "." + cookie_domain; + } // Ensure |url| and |cookie_domain| have the same domain+registry. const std::string url_scheme(url.scheme()); @@ -416,19 +419,20 @@ domain_string[0] == '.' ? domain_string.substr(1) : domain_string); if (url_host == normalized_domain_string) { - *result = url_host; - DCHECK(DomainIsHostOnly(*result)); - return true; + DCHECK(DomainIsHostOnly(normalized_domain_string)); + return normalized_domain_string; } // Otherwise, IP addresses/intranet hosts/public suffixes can't set // domain cookies. - return false; + return std::nullopt; } const std::string cookie_domain_and_registry( GetEffectiveDomain(url_scheme, cookie_domain)); - if (url_domain_and_registry != cookie_domain_and_registry) - return false; // Can't set a cookie on a different domain + registry. + if (url_domain_and_registry != cookie_domain_and_registry) { + // Can't set a cookie on a different domain + registry. + return std::nullopt; + } // Ensure |url_host| is |cookie_domain| or one of its subdomains. Given that // we know the domain+registry are the same from the above checks, this is @@ -437,11 +441,11 @@ (cookie_domain != ("." + url_host)) : (url_host.compare(url_host.length() - cookie_domain.length(), cookie_domain.length(), cookie_domain) != 0); - if (is_suffix) - return false; + if (is_suffix) { + return std::nullopt; + } - *result = cookie_domain; - return true; + return cookie_domain; } // Parse a cookie expiration time. We try to be lenient, but we need to
diff --git a/net/cookies/cookie_util.h b/net/cookies/cookie_util.h index e21618e..2db270c 100644 --- a/net/cookies/cookie_util.h +++ b/net/cookies/cookie_util.h
@@ -171,15 +171,15 @@ // Determine the actual cookie domain based on the domain string passed // (if any) and the URL from which the cookie came. -// On success returns true, and sets cookie_domain to either a +// On success returns either a // -host cookie domain (ex: "google.com") // -domain cookie domain (ex: ".google.com") // On success, DomainIsHostOnly(url.host()) is DCHECKed. The URL's host must not // begin with a '.' character. -NET_EXPORT bool GetCookieDomainWithString(const GURL& url, - const std::string& domain_string, - CookieInclusionStatus& status, - std::string* result); +NET_EXPORT std::optional<std::string> GetCookieDomainWithString( + const GURL& url, + const std::string& domain_string, + CookieInclusionStatus& status); // Returns true if a domain string represents a host-only cookie, // i.e. it doesn't begin with a leading '.' character.
diff --git a/net/cookies/cookie_util_unittest.cc b/net/cookies/cookie_util_unittest.cc index 85a26b5..9eaefc2 100644 --- a/net/cookies/cookie_util_unittest.cc +++ b/net/cookies/cookie_util_unittest.cc
@@ -67,9 +67,8 @@ feature_list.InitAndEnableFeature(features::kCookieDomainRejectNonASCII); CookieInclusionStatus status; - std::string result; EXPECT_FALSE(cookie_util::GetCookieDomainWithString( - GURL("http://éxample.com"), "éxample.com", status, &result)); + GURL("http://éxample.com"), "éxample.com", status)); EXPECT_TRUE(status.HasExactlyExclusionReasonsForTesting( {CookieInclusionStatus::EXCLUDE_DOMAIN_NON_ASCII})); } @@ -77,11 +76,10 @@ // An empty domain string results in the domain from the URL. TEST(CookieUtilTest, GetCookieDomainWithString_Empty) { CookieInclusionStatus status; - std::string result; - EXPECT_TRUE(cookie_util::GetCookieDomainWithString(GURL("http://example.com"), - "", status, &result)); + EXPECT_EQ(cookie_util::GetCookieDomainWithString(GURL("http://example.com"), + "", status), + "example.com"); EXPECT_TRUE(status.IsInclude()); - EXPECT_EQ(result, "example.com"); } // An empty domain string results in the domain from the URL, which has been @@ -90,50 +88,45 @@ // `GURL` doesn't canonicalize the below URL, since it doesn't recognize the // scheme. So we ensure that `GetCookieDomainWithString` recanonicalizes it. CookieInclusionStatus status; - std::string result; - EXPECT_TRUE(cookie_util::GetCookieDomainWithString(GURL("foo://LOCALhost"), - "", status, &result)); + EXPECT_EQ(cookie_util::GetCookieDomainWithString(GURL("foo://LOCALhost"), "", + status), + "localhost"); EXPECT_TRUE(status.IsInclude()); - EXPECT_EQ(result, "localhost"); } // A cookie domain string equal to the URL host, when that is an IP, results in // the IP. TEST(CookieUtilTest, GetCookieDomainWithString_IP) { CookieInclusionStatus status; - std::string result; - EXPECT_TRUE(cookie_util::GetCookieDomainWithString( - GURL("http://192.0.2.3"), "192.0.2.3", status, &result)); + EXPECT_EQ(cookie_util::GetCookieDomainWithString(GURL("http://192.0.2.3"), + "192.0.2.3", status), + "192.0.2.3"); EXPECT_TRUE(status.IsInclude()); - EXPECT_EQ(result, "192.0.2.3"); } // A cookie domain string equal to a dot prefixed to the URL host, when that is // an IP, results in the IP, without the dot. TEST(CookieUtilTest, GetCookieDomainWithString_DotIP) { CookieInclusionStatus status; - std::string result; - EXPECT_TRUE(cookie_util::GetCookieDomainWithString( - GURL("http://192.0.2.3"), ".192.0.2.3", status, &result)); + EXPECT_EQ(cookie_util::GetCookieDomainWithString(GURL("http://192.0.2.3"), + ".192.0.2.3", status), + "192.0.2.3"); EXPECT_TRUE(status.IsInclude()); - EXPECT_EQ(result, "192.0.2.3"); } // A cookie domain string containing %-encoding is not allowed. TEST(CookieUtilTest, GetCookieDomainWithString_PercentEncoded) { CookieInclusionStatus status; - std::string result; - EXPECT_FALSE(cookie_util::GetCookieDomainWithString( - GURL("http://a.test"), "a%2Etest", status, &result)); + EXPECT_FALSE(cookie_util::GetCookieDomainWithString(GURL("http://a.test"), + "a%2Etest", status)); EXPECT_TRUE(status.HasExactlyExclusionReasonsForTesting({})); } // A cookie domain string that cannot be canonicalized is not allowed. TEST(CookieUtilTest, GetCookieDomainWithString_UnCanonicalizable) { CookieInclusionStatus status; - std::string result; - EXPECT_FALSE(cookie_util::GetCookieDomainWithString( - GURL("http://a.test"), "a^test", status, &result)); + EXPECT_FALSE(cookie_util::GetCookieDomainWithString(GURL("http://a.test"), + "a^test", status)); EXPECT_TRUE(status.HasExactlyExclusionReasonsForTesting({})); } @@ -141,41 +134,37 @@ // domain. TEST(CookieUtilTest, GetCookieDomainWithString_ETldMatchesUrl) { CookieInclusionStatus status; - std::string result; - EXPECT_TRUE(cookie_util::GetCookieDomainWithString( - GURL("http://gov.uk"), "gov.uk", status, &result)); + EXPECT_EQ(cookie_util::GetCookieDomainWithString(GURL("http://gov.uk"), + "gov.uk", status), + "gov.uk"); EXPECT_TRUE(status.IsInclude()); - EXPECT_EQ(result, "gov.uk"); } // A cookie domain that is an eTLD but matches the URL results in a host cookie // domain, even if it is given with a dot prefix. TEST(CookieUtilTest, GetCookieDomainWithString_ETldMatchesUrl_DotPrefix) { CookieInclusionStatus status; - std::string result; - EXPECT_TRUE(cookie_util::GetCookieDomainWithString( - GURL("http://gov.uk"), ".gov.uk", status, &result)); + EXPECT_EQ(cookie_util::GetCookieDomainWithString(GURL("http://gov.uk"), + ".gov.uk", status), + "gov.uk"); EXPECT_TRUE(status.IsInclude()); - EXPECT_EQ(result, "gov.uk"); } // A cookie domain that is an eTLD but matches the URL results in a host cookie // domain, even if its capitalization is non-canonical. TEST(CookieUtilTest, GetCookieDomainWithString_ETldMatchesUrl_NonCanonical) { CookieInclusionStatus status; - std::string result; - EXPECT_TRUE(cookie_util::GetCookieDomainWithString( - GURL("http://gov.uk"), "GoV.Uk", status, &result)); + EXPECT_EQ(cookie_util::GetCookieDomainWithString(GURL("http://gov.uk"), + "GoV.Uk", status), + "gov.uk"); EXPECT_TRUE(status.IsInclude()); - EXPECT_EQ(result, "gov.uk"); } // A cookie domain that is an eTLD but does not match the URL is not allowed. TEST(CookieUtilTest, GetCookieDomainWithString_ETldDifferentUrl) { CookieInclusionStatus status; - std::string result; - EXPECT_FALSE(cookie_util::GetCookieDomainWithString( - GURL("http://nhs.gov.uk"), "gov.uk", status, &result)); + EXPECT_FALSE(cookie_util::GetCookieDomainWithString(GURL("http://nhs.gov.uk"), + "gov.uk", status)); EXPECT_TRUE(status.HasExactlyExclusionReasonsForTesting({})); } @@ -183,50 +172,45 @@ // from the URL is not allowed. TEST(CookieUtilTest, GetCookieDomainWithString_DifferentOrgHost) { CookieInclusionStatus status; - std::string result; EXPECT_FALSE(cookie_util::GetCookieDomainWithString( - GURL("http://portal.globex.com"), "portal.initech.com", status, &result)); + GURL("http://portal.globex.com"), "portal.initech.com", status)); EXPECT_TRUE(status.HasExactlyExclusionReasonsForTesting({})); } // A cookie domain that matches the URL results in a domain cookie domain. TEST(CookieUtilTest, GetCookieDomainWithString_MatchesUrl) { CookieInclusionStatus status; - std::string result; - EXPECT_TRUE(cookie_util::GetCookieDomainWithString( - GURL("http://globex.com"), "globex.com", status, &result)); + EXPECT_EQ(cookie_util::GetCookieDomainWithString(GURL("http://globex.com"), + "globex.com", status), + ".globex.com"); EXPECT_TRUE(status.IsInclude()); - EXPECT_EQ(result, ".globex.com"); } // A cookie domain that matches the URL but has a `.` prefix results in a domain // cookie domain. TEST(CookieUtilTest, GetCookieDomainWithString_MatchesUrlWithDot) { CookieInclusionStatus status; - std::string result; - EXPECT_TRUE(cookie_util::GetCookieDomainWithString( - GURL("http://globex.com"), ".globex.com", status, &result)); + EXPECT_EQ(cookie_util::GetCookieDomainWithString(GURL("http://globex.com"), + ".globex.com", status), + ".globex.com"); EXPECT_TRUE(status.IsInclude()); - EXPECT_EQ(result, ".globex.com"); } // A cookie domain that is a subdomain of the URL host is not allowed. TEST(CookieUtilTest, GetCookieDomainWithString_Subdomain) { CookieInclusionStatus status; - std::string result; EXPECT_FALSE(cookie_util::GetCookieDomainWithString( - GURL("http://globex.com"), "mail.globex.com", status, &result)); + GURL("http://globex.com"), "mail.globex.com", status)); EXPECT_TRUE(status.HasExactlyExclusionReasonsForTesting({})); } // A URL that is a subdomain of the cookie domain results in a domain cookie. TEST(CookieUtilTest, GetCookieDomainWithString_UrlSubdomain) { CookieInclusionStatus status; - std::string result; - EXPECT_TRUE(cookie_util::GetCookieDomainWithString( - GURL("http://mail.globex.com"), "globex.com", status, &result)); + EXPECT_EQ(cookie_util::GetCookieDomainWithString( + GURL("http://mail.globex.com"), "globex.com", status), + ".globex.com"); EXPECT_TRUE(status.IsInclude()); - EXPECT_EQ(result, ".globex.com"); } // A URL of which the cookie domain is a substring, but not a dotted suffix, @@ -235,7 +219,7 @@ CookieInclusionStatus status; std::string result; EXPECT_FALSE(cookie_util::GetCookieDomainWithString( - GURL("http://myglobex.com"), "globex.com", status, &result)); + GURL("http://myglobex.com"), "globex.com", status)); EXPECT_TRUE(status.HasExactlyExclusionReasonsForTesting({})); } @@ -243,22 +227,20 @@ // not allowed, regardless of which hostname is longer. TEST(CookieUtilTest, GetCookieDomainWithString_DifferentSubdomain) { CookieInclusionStatus status; - std::string result; EXPECT_FALSE(cookie_util::GetCookieDomainWithString( - GURL("http://l.globex.com"), "portal.globex.com", status, &result)); + GURL("http://l.globex.com"), "portal.globex.com", status)); EXPECT_TRUE(status.HasExactlyExclusionReasonsForTesting({})); EXPECT_FALSE(cookie_util::GetCookieDomainWithString( - GURL("http://portal.globex.com"), "l.globex.com", status, &result)); + GURL("http://portal.globex.com"), "l.globex.com", status)); EXPECT_TRUE(status.HasExactlyExclusionReasonsForTesting({})); } // A URL without a host can set a "host" cookie with no cookie domain. TEST(CookieUtilTest, GetCookieDomainWithString_NoUrlHost) { CookieInclusionStatus status; - std::string result; - EXPECT_TRUE(cookie_util::GetCookieDomainWithString( - GURL("file:///C:/bar.html"), "", status, &result)); - EXPECT_EQ(result, ""); + EXPECT_EQ(cookie_util::GetCookieDomainWithString(GURL("file:///C:/bar.html"), + "", status), + ""); } // A URL with two trailing dots (which is an invalid hostname per @@ -266,9 +248,8 @@ // string) is not allowed. TEST(CookieUtilTest, GetCookieDomainWithString_TrailingDots) { CookieInclusionStatus status; - std::string result; - EXPECT_FALSE(cookie_util::GetCookieDomainWithString( - GURL("http://foo.com../"), "foo.com..", status, &result)); + EXPECT_FALSE(cookie_util::GetCookieDomainWithString(GURL("http://foo.com../"), + "foo.com..", status)); EXPECT_TRUE(status.HasExactlyExclusionReasonsForTesting({})); } @@ -277,12 +258,11 @@ TEST(CookieUtilTest, GetCookieDomainWithString_TrailingDots_NotMatchingUrlHost) { CookieInclusionStatus status; - std::string result; - EXPECT_FALSE(cookie_util::GetCookieDomainWithString( - GURL("http://foo.com/"), ".foo.com..", status, &result)); + EXPECT_FALSE(cookie_util::GetCookieDomainWithString(GURL("http://foo.com/"), + ".foo.com..", status)); EXPECT_TRUE(status.HasExactlyExclusionReasonsForTesting({})); - EXPECT_FALSE(cookie_util::GetCookieDomainWithString( - GURL("http://foo.com/"), ".foo.com.", status, &result)); + EXPECT_FALSE(cookie_util::GetCookieDomainWithString(GURL("http://foo.com/"), + ".foo.com.", status)); EXPECT_TRUE(status.HasExactlyExclusionReasonsForTesting({})); } @@ -290,30 +270,27 @@ // domain. TEST(CookieUtilTest, GetCookieDomainWithString_UrlHostIP) { CookieInclusionStatus status; - std::string result; - EXPECT_TRUE(cookie_util::GetCookieDomainWithString( - GURL("http://192.0.2.3/"), "192.0.2.3", status, &result)); - EXPECT_EQ(result, "192.0.2.3"); + EXPECT_EQ(cookie_util::GetCookieDomainWithString(GURL("http://192.0.2.3/"), + "192.0.2.3", status), + "192.0.2.3"); } // A cookie domain with a dot-prefixed IP is allowed, if the IP matches // the URL, but is transformed to a host cookie domain. TEST(CookieUtilTest, GetCookieDomainWithString_UrlHostIP_DomainCookie) { CookieInclusionStatus status; - std::string result; - EXPECT_TRUE(cookie_util::GetCookieDomainWithString( - GURL("http://192.0.2.3/"), ".192.0.2.3", status, &result)); - EXPECT_EQ(result, "192.0.2.3"); // No dot. + EXPECT_EQ(cookie_util::GetCookieDomainWithString(GURL("http://192.0.2.3/"), + ".192.0.2.3", status), + "192.0.2.3"); // No dot. } // A URL containing a TLD that is unknown as a registry is allowed, if it // matches the cookie domain. TEST(CookieUtilTest, GetCookieDomainWithString_UnknownRegistry) { CookieInclusionStatus status; - std::string result; - EXPECT_TRUE(cookie_util::GetCookieDomainWithString(GURL("http://bar/"), "bar", - status, &result)); - EXPECT_EQ(result, "bar"); + EXPECT_EQ(cookie_util::GetCookieDomainWithString(GURL("http://bar/"), "bar", + status), + "bar"); } TEST(CookieUtilTest, TestCookieDateParsing) {
diff --git a/net/device_bound_sessions/cookie_craving.cc b/net/device_bound_sessions/cookie_craving.cc index 854943a..99061a0 100644 --- a/net/device_bound_sessions/cookie_craving.cc +++ b/net/device_bound_sessions/cookie_craving.cc
@@ -114,14 +114,13 @@ if (parsed_cookie.HasDomain()) { domain_attribute_value = parsed_cookie.Domain(); } - std::string domain; CookieInclusionStatus ignored_status; + std::optional<std::string> domain = cookie_util::GetCookieDomainWithString( + url, domain_attribute_value, ignored_status); // Note: This is a deviation from CanonicalCookie. Here, we also require that // domain is non-empty, which CanonicalCookie does not. See comment below in // IsValid(). - if (!cookie_util::GetCookieDomainWithString(url, domain_attribute_value, - ignored_status, &domain) || - domain.empty()) { + if (!domain || domain->empty()) { return std::nullopt; } @@ -155,7 +154,7 @@ int source_port = url.EffectiveIntPort(); CookieCraving cookie_craving{parsed_cookie.Name(), - std::move(domain), + std::move(domain).value(), std::move(path), creation_time, parsed_cookie.IsSecure(),
diff --git a/net/http/transport_security_state_static.pins b/net/http/transport_security_state_static.pins index bf8ada9..9c21242 100644 --- a/net/http/transport_security_state_static.pins +++ b/net/http/transport_security_state_static.pins
@@ -43,9 +43,9 @@ # hash function for preloaded entries again (we have already done so once). # -# Last updated: 2025-01-09 12:55 UTC +# Last updated: 2025-01-10 12:59 UTC PinsListTimestamp -1736427341 +1736513969 TestSPKI sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
diff --git a/net/http/transport_security_state_static_pins.json b/net/http/transport_security_state_static_pins.json index 413688f..40cebaa2 100644 --- a/net/http/transport_security_state_static_pins.json +++ b/net/http/transport_security_state_static_pins.json
@@ -31,7 +31,7 @@ // the 'static_spki_hashes' and 'bad_static_spki_hashes' fields in 'pinsets' // refer to, and the timestamp at which the pins list was last updated. // -// Last updated: 2025-01-09 12:55 UTC +// Last updated: 2025-01-10 12:59 UTC // { "pinsets": [
diff --git a/services/network/cors/cors_url_loader.cc b/services/network/cors/cors_url_loader.cc index 7c93ab8c..e34930e 100644 --- a/services/network/cors/cors_url_loader.cc +++ b/services/network/cors/cors_url_loader.cc
@@ -506,6 +506,11 @@ // instead of being handled in `network::URLLoader`. // // See also: https://crbug.com/1293891 + // + // Note that this is also needed to prevent a compromised renderer from using + // `new_url` to access arbitrary same-origin urls on a more private network, + // if it ever gets Private Network Access permissions to access a URL that is + // redirected. request_.target_ip_address_space = mojom::IPAddressSpace::kUnknown; // Similarly, when we follow a redirect, we may make a different decision as
diff --git a/services/network/public/cpp/cors/cors_error_status.h b/services/network/public/cpp/cors/cors_error_status.h index 7e73fb6..80dc8577 100644 --- a/services/network/public/cpp/cors/cors_error_status.h +++ b/services/network/public/cpp/cors/cors_error_status.h
@@ -17,6 +17,9 @@ namespace network { // Type-mapped to `network::mojom::CorsErrorStatus`. +// See +// https://source.chromium.org/chromium/chromium/src/+/main:services/network/public/mojom/cors.mojom +// for documentation on individual fields. struct COMPONENT_EXPORT(NETWORK_CPP_BASE) CorsErrorStatus { // Instances of this type are copyable and efficiently movable. CorsErrorStatus(const CorsErrorStatus&);
diff --git a/services/network/public/cpp/resource_request.h b/services/network/public/cpp/resource_request.h index 51cd9e4f..76e4130d 100644 --- a/services/network/public/cpp/resource_request.h +++ b/services/network/public/cpp/resource_request.h
@@ -220,8 +220,18 @@ devtools_accepted_stream_types; std::optional<net::NetLogSource> net_log_create_info; std::optional<net::NetLogSource> net_log_reference_info; + + // Used internally by the network service. Should not be modified by external + // callers, which should pass in address space of the request initiator via + // the ClientSecurityState includde either in URLLoaderFactoryParams or + // ResourceRequest::TrustedParams. + // + // See + // https://source.chromium.org/chromium/chromium/src/+/main:services/network/public/mojom/url_request.mojom + // for more details. mojom::IPAddressSpace target_ip_address_space = mojom::IPAddressSpace::kUnknown; + net::StorageAccessApiStatus storage_access_api_status = net::StorageAccessApiStatus::kNone; network::mojom::AttributionSupport attribution_reporting_support =
diff --git a/services/network/public/mojom/url_request.mojom b/services/network/public/mojom/url_request.mojom index e0a7a63..1741c2c 100644 --- a/services/network/public/mojom/url_request.mojom +++ b/services/network/public/mojom/url_request.mojom
@@ -511,11 +511,35 @@ NetLogSource? net_log_reference_info; // The IP address space to which the target endpoint of this request should - // belong, or `kUnknown` if there is no such requirement. - // If the target endpoint of the network socket does not belong to this - // address space, the request is failed with a CORS error. + // belong, or `kUnknown` if there is no such requirement. Used to implement + // the Private Network Access API. If the target endpoint of the network + // socket does not belong to this address space, the request is failed with + // a CORS error. + // // Clients outside the network service must not set this field to a value // other than `kUnknown`. + // + // If the ClientSecurityState::private_network_request_policy for the + // request is kPreflightBlock, then the behavior is as follows: + // + // CorsURLLoader will send requests (both preflights and non-preflights) + // with the default value of `kUnknown`. If URLLoader gets a connection to + // a private network, it will fail the request with + // `ERR_BLOCKED_BY_PRIVATE_NETWORK_ACCESS_CHECKS` and populate + // `URLLoaderCompletionStatus::cors_error_status` with information about the + // address space that was returned. + // + // Then, regardless of whether that was a preflight request or not, + // CorsURLLoader will create a new preflight URLLoader with + // `target_ip_address_space` set to the value of the connection that was made, + // which will let the preflight request through the checks that blocked the + // original one (assume a connection on the same network was returned). + // + // Then CorsURLLoader will check the headers of the preflight, and if they + // allow access to the more private network (and, if other CORS permissions + // are needed, those pass as well), the actual request will be made, with the + // same `target_ip_address_space` value, which will again bypass the checks, + // if a connection on the same network is received. IPAddressSpace target_ip_address_space; // The target address space to which a given fetch operation is expected to
diff --git a/services/screen_ai/proto/visual_annotator_proto_convertor.cc b/services/screen_ai/proto/visual_annotator_proto_convertor.cc index debef4c..d3481b5b9 100644 --- a/services/screen_ai/proto/visual_annotator_proto_convertor.cc +++ b/services/screen_ai/proto/visual_annotator_proto_convertor.cc
@@ -586,14 +586,14 @@ // Filter out invalid / unrecognized / unused nodes from the update. update.nodes.resize(nodes.size()); - const auto end_node_iter = ranges::copy_if( + const auto end_nodes = std::ranges::copy_if( nodes, std::ranges::begin(update.nodes), [](const ui::AXNodeData& node_data) { return node_data.role != ax::mojom::Role::kUnknown && node_data.id != ui::kInvalidAXNodeID; }); update.nodes.resize( - std::distance(std::ranges::begin(update.nodes), end_node_iter)); + std::distance(std::ranges::begin(update.nodes), end_nodes.out)); return update; }
diff --git a/services/video_effects/public/mojom/video_effects_service.mojom b/services/video_effects/public/mojom/video_effects_service.mojom index b154018..9b5006f 100644 --- a/services/video_effects/public/mojom/video_effects_service.mojom +++ b/services/video_effects/public/mojom/video_effects_service.mojom
@@ -44,5 +44,8 @@ // Passes a file containing the background segmentation model to be used by // all Video Effects Processors created by this service. - SetBackgroundSegmentationModel(mojo_base.mojom.ReadOnlyFile model_file); + // If the file is not set, it signifies that the model file is currently not + // available, and that the service should stop using previously passed in + // model file (if any). + SetBackgroundSegmentationModel(mojo_base.mojom.ReadOnlyFile? model_file); };
diff --git a/services/video_effects/video_effects_processor_impl.cc b/services/video_effects/video_effects_processor_impl.cc index 5362b13..a544f4ee 100644 --- a/services/video_effects/video_effects_processor_impl.cc +++ b/services/video_effects/video_effects_processor_impl.cc
@@ -60,8 +60,7 @@ base::span<const uint8_t> model_blob) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - background_segmentation_model_blob_.resize(model_blob.size()); - base::span(background_segmentation_model_blob_).copy_from(model_blob); + processor_webgpu_->SetBackgroundSegmentationModel(model_blob); } bool VideoEffectsProcessorImpl::InitializeGpuState() {
diff --git a/services/video_effects/video_effects_processor_impl.h b/services/video_effects/video_effects_processor_impl.h index 40b89117..d120e5d 100644 --- a/services/video_effects/video_effects_processor_impl.h +++ b/services/video_effects/video_effects_processor_impl.h
@@ -105,7 +105,6 @@ scoped_refptr<gpu::ClientSharedImageInterface> shared_image_interface_; std::unique_ptr<VideoEffectsProcessorWebGpu> processor_webgpu_; - std::vector<uint8_t> background_segmentation_model_blob_; SEQUENCE_CHECKER(sequence_checker_);
diff --git a/services/video_effects/video_effects_processor_webgpu.cc b/services/video_effects/video_effects_processor_webgpu.cc index 9f7b5fe3..f988f43 100644 --- a/services/video_effects/video_effects_processor_webgpu.cc +++ b/services/video_effects/video_effects_processor_webgpu.cc
@@ -98,6 +98,14 @@ return true; } +void VideoEffectsProcessorWebGpu::SetBackgroundSegmentationModel( + base::span<const uint8_t> model_blob) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + + background_segmentation_model_.resize(model_blob.size()); + base::span(background_segmentation_model_).copy_from(model_blob); +} + // `VideoEffectsProcessorWebGpu::PostProcess()` runs the simple shader on top of // video frame provided to us from Video Capture Service. We use 3 different IPC // interfaces to talk to GPU service, hence we need to rely on sync tokens for
diff --git a/services/video_effects/video_effects_processor_webgpu.h b/services/video_effects/video_effects_processor_webgpu.h index 3596456..5bae6de 100644 --- a/services/video_effects/video_effects_processor_webgpu.h +++ b/services/video_effects/video_effects_processor_webgpu.h
@@ -50,6 +50,8 @@ media::VideoPixelFormat result_pixel_format, mojom::VideoEffectsProcessor::PostProcessCallback post_process_cb); + void SetBackgroundSegmentationModel(base::span<const uint8_t> model_blob); + private: // Ensures that awaiting WebGPUInterface commands are flushed. void EnsureFlush(); @@ -70,6 +72,11 @@ scoped_refptr<viz::RasterContextProvider> raster_interface_context_provider_; scoped_refptr<gpu::ClientSharedImageInterface> shared_image_interface_; + // Model to be used for background segmentation. It will be empty if the model + // is unavailable. This can happen either when we have not received the model + // yet, or if we have been told to stop using an existing model. + std::vector<uint8_t> background_segmentation_model_; + // Compute pipeline executing basic compute shader on a video frame. wgpu::ComputePipeline compute_pipeline_;
diff --git a/services/video_effects/video_effects_service_impl.cc b/services/video_effects/video_effects_service_impl.cc index 49b8f01..1342bc6 100644 --- a/services/video_effects/video_effects_service_impl.cc +++ b/services/video_effects/video_effects_service_impl.cc
@@ -185,26 +185,38 @@ return; } - auto [_, inserted] = processors_.insert( + auto [processor_it, inserted] = processors_.insert( std::make_pair(device_id, std::move(effects_processor))); CHECK(inserted); + + // If we already have the model file, we need to inform the newly created + // processor about it so it could finish its initialization: + if (model_) { + processor_it->second->SetBackgroundSegmentationModel(model_->bytes()); + } } void VideoEffectsServiceImpl::SetBackgroundSegmentationModel( base::File model_file) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - // TODO(bialpio): make a copy of the model blob to serve it every time new - // processor gets created. - base::MemoryMappedFile memory_mapped_model_file; - if (!memory_mapped_model_file.Initialize(std::move(model_file))) { - return; - } + // If we have received an invalid model file, we should stop using the model + // we previously got as this is how the caller informs us that the old model + // is not supposed to be used anymore but there is no new model to use. + + // Throw out old model and attempt to initialize the memory mapping with the + // new one: + model_ = std::make_unique<base::MemoryMappedFile>(); + // It doesn't matter if the initialization of the memory mapping succeeded + // or not. In case of a failure, the memory mapping will return empty span + // in `bytes()`, which we then will propagate to the lower layer that should + // handle it appropriately. + std::ignore = model_->Initialize(std::move(model_file)); // Propagate the model to all already existing processors: for (auto& device_id_and_processor : processors_) { device_id_and_processor.second->SetBackgroundSegmentationModel( - memory_mapped_model_file.bytes()); + model_->bytes()); } }
diff --git a/services/video_effects/video_effects_service_impl.h b/services/video_effects/video_effects_service_impl.h index 76cbd0c..911cc69d 100644 --- a/services/video_effects/video_effects_service_impl.h +++ b/services/video_effects/video_effects_service_impl.h
@@ -9,6 +9,7 @@ #include <vector> #include "base/containers/flat_map.h" +#include "base/files/memory_mapped_file.h" #include "base/memory/scoped_refptr.h" #include "base/memory/weak_ptr.h" #include "base/sequence_checker.h" @@ -83,6 +84,8 @@ // Destroy all processors (pending and live). void Cleanup(); + std::unique_ptr<base::MemoryMappedFile> model_; + // Holder of wgpu::Device instance. std::unique_ptr<WebGpuDevice> webgpu_device_;
diff --git a/skia/ext/platform_canvas.cc b/skia/ext/platform_canvas.cc index b323e59..5c949cd 100644 --- a/skia/ext/platform_canvas.cc +++ b/skia/ext/platform_canvas.cc
@@ -36,18 +36,18 @@ return true; } -#if !defined(WIN32) - std::unique_ptr<SkCanvas> CreatePlatformCanvasWithPixels( int width, int height, bool is_opaque, uint8_t* data, + size_t bytes_per_row, OnFailureType failureType) { - SkBitmap bitmap; - bitmap.setInfo(SkImageInfo::MakeN32(width, height, - is_opaque ? kOpaque_SkAlphaType : kPremul_SkAlphaType)); + bitmap.setInfo( + SkImageInfo::MakeN32( + width, height, is_opaque ? kOpaque_SkAlphaType : kPremul_SkAlphaType), + bytes_per_row); if (data) { bitmap.setPixels(data); @@ -66,6 +66,4 @@ return std::make_unique<SkCanvas>(bitmap); } -#endif - } // namespace skia
diff --git a/skia/ext/platform_canvas.h b/skia/ext/platform_canvas.h index 34d8b85..27979a4 100644 --- a/skia/ext/platform_canvas.h +++ b/skia/ext/platform_canvas.h
@@ -56,18 +56,18 @@ // Returns the NativeDrawingContext to use for native platform drawing calls. SK_API HDC GetNativeDrawingContext(SkCanvas* canvas); -#elif defined(__linux__) || defined(__FreeBSD__) || defined(__OpenBSD__) || \ - defined(__sun) || defined(ANDROID) || defined(__APPLE__) || \ - defined(__Fuchsia__) +#endif // Construct a canvas from the given memory region. The memory is not cleared -// first. @data must be, at least, @height * StrideForWidth(@width) bytes. +// first. `data` must be, at least, `height` * StrideForWidth(`width`) bytes if +// `bytes_per_row` is 0. If `bytes_per_row` is non-zero, then `data` must be at +// least `height` * `bytes_per_row`. SK_API std::unique_ptr<SkCanvas> CreatePlatformCanvasWithPixels( int width, int height, bool is_opaque, uint8_t* data, + size_t bytes_per_row, OnFailureType failure_type); -#endif inline std::unique_ptr<SkCanvas> CreatePlatformCanvas(int width, int height, @@ -76,7 +76,7 @@ return CreatePlatformCanvasWithSharedSection(width, height, is_opaque, 0, CRASH_ON_FAILURE); #else - return CreatePlatformCanvasWithPixels(width, height, is_opaque, nullptr, + return CreatePlatformCanvasWithPixels(width, height, is_opaque, nullptr, 0u, CRASH_ON_FAILURE); #endif } @@ -88,7 +88,7 @@ return CreatePlatformCanvasWithSharedSection(width, height, is_opaque, 0, RETURN_NULL_ON_FAILURE); #else - return CreatePlatformCanvasWithPixels(width, height, is_opaque, nullptr, + return CreatePlatformCanvasWithPixels(width, height, is_opaque, nullptr, 0u, RETURN_NULL_ON_FAILURE); #endif }
diff --git a/testing/buildbot/filters/android.device_14_tablet.chrome_public_test_apk.filter b/testing/buildbot/filters/android.device_14_tablet.chrome_public_test_apk.filter index 799864f..55a27bec 100644 --- a/testing/buildbot/filters/android.device_14_tablet.chrome_public_test_apk.filter +++ b/testing/buildbot/filters/android.device_14_tablet.chrome_public_test_apk.filter
@@ -78,6 +78,3 @@ -org.chromium.chrome.browser.contextualsearch.ContextualSearchInstrumentationTest.testNonResolveGesture -org.chromium.chrome.browser.contextualsearch.ContextualSearchInstrumentationTest.testResolveGesture -org.chromium.chrome.browser.contextualsearch.ContextualSearchSystemTest.testAppMenuSuppressedWhenMaximized - -# crbug.com/385183438 --org.chromium.chrome.browser.privacy_guide.PrivacyGuideFragmentTest.testHistorySyncCard_backButtonInitialSyncStateIsSet
diff --git a/testing/buildbot/internal.optimization_guide.json b/testing/buildbot/internal.optimization_guide.json index 2822c7fca..5cd74d8b 100644 --- a/testing/buildbot/internal.optimization_guide.json +++ b/testing/buildbot/internal.optimization_guide.json
@@ -966,7 +966,7 @@ "${ISOLATED_OUTDIR}", "--xctest", "--xcode-build-version", - "16b40" + "16c5032a" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" @@ -989,7 +989,7 @@ }, "named_caches": [ { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1005,7 +1005,7 @@ "${ISOLATED_OUTDIR}", "--xctest", "--xcode-build-version", - "16b40" + "16c5032a" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" @@ -1028,7 +1028,7 @@ }, "named_caches": [ { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1053,7 +1053,7 @@ "${ISOLATED_OUTDIR}", "--xctest", "--xcode-build-version", - "16b40" + "16c5032a" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" @@ -1078,7 +1078,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ], @@ -1098,7 +1098,7 @@ "${ISOLATED_OUTDIR}", "--xctest", "--xcode-build-version", - "16b40" + "16c5032a" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" @@ -1123,7 +1123,7 @@ "path": "Runtime-ios-18.0" }, { - "name": "xcode_ios_16b40", + "name": "xcode_ios_16c5032a", "path": "Xcode.app" } ],
diff --git a/testing/buildbot/mixins.pyl b/testing/buildbot/mixins.pyl index ca11fb9..8f2b09f5 100644 --- a/testing/buildbot/mixins.pyl +++ b/testing/buildbot/mixins.pyl
@@ -821,12 +821,12 @@ 'xcode_16_main': { 'args': [ '--xcode-build-version', - '16b40', + '16c5032a', ], 'swarming': { 'named_caches': [ { - 'name': 'xcode_ios_16b40', + 'name': 'xcode_ios_16c5032a', 'path': 'Xcode.app', }, ],
diff --git a/testing/unexpected_passes_common/expectations.py b/testing/unexpected_passes_common/expectations.py index a563514..20cbf81 100644 --- a/testing/unexpected_passes_common/expectations.py +++ b/testing/unexpected_passes_common/expectations.py
@@ -188,16 +188,15 @@ expectation_file_name, data_types.ExpectationBuilderMap()) logging.debug('Parsed %d expectations', len(list_parser.expectations)) for e in list_parser.expectations: - if 'Skip' in e.raw_results: + if _RawResultsContainUnhandledValue(e): continue - # Expectations that only have a Pass expectation (usually used to - # override a broader, failing expectation) are not handled by the - # unexpected pass finder, so ignore those. - if e.raw_results == ['Pass']: - continue + expectation = data_types.Expectation(e.test, e.tags, e.raw_results, e.reason) if expectation in expectations_for_file: + # In practice this should never be hit unless the file was somehow + # modified, as _RemoveDuplicateExpectations() should have removed all + # duplicates already. raise RuntimeError( f'Duplicate expectation {expectation.AsExpectationFileString()}') expectations_for_file[expectation] = data_types.BuilderStepMap() @@ -212,6 +211,9 @@ if not isinstance(expectation_files, list): expectation_files = [expectation_files] for ef in expectation_files: + # Remove any duplicate expectations now so that we know for sure which + # expectations to modify/remove later. + self._RemoveDuplicateExpectations(ef) # Normalize to '/' as the path separator. expectation_file_name = os.path.normpath(ef).replace(os.path.sep, '/') content = _GetNonRecentExpectationContent(expectation_file_name, @@ -322,6 +324,61 @@ return removed_urls + def _RemoveDuplicateExpectations(self, expectation_file_path: str) -> None: + """Removes cases of fully duplicate expectations from a file. + + Note that this ignores annotations such as finder:disable since handling + those properly here would increase complexity and the likelihood of + getting a duplicate expectation affected by an annotation is very low. + + Args: + expectation_file_path: A string containing a filepath pointing to an + expectation file. + """ + with open(expectation_file_path, encoding='utf-8') as infile: + content = infile.read() + list_parser = expectations_parser.TaggedTestListParser(content) + + seen_expectations = set() + lines_to_remove = set() + for e in list_parser.expectations: + if _RawResultsContainUnhandledValue(e): + continue + expectation = data_types.Expectation(e.test, e.tags, e.raw_results, + e.reason) + if expectation in seen_expectations: + lines_to_remove.add(e.lineno) + else: + seen_expectations.add(expectation) + + if not lines_to_remove: + return + + trimmed_lines = [] + for i, line_content in enumerate(content.splitlines(keepends=True)): + if i + 1 in lines_to_remove: + continue + trimmed_lines.append(line_content) + + # Calculate which lines in the new content correspond to where content was + # removed. The additional -1 is due to the difference between the 0-based + # line numbers used here and the 1-based line numbers provided by the + # expectation parser. + removed_lines = set() + for offset, rl in enumerate(sorted(lines_to_remove)): + removed_lines.add(rl - offset - 1) + + # While it's unlikely that an entire block consisted of duplicate + # expectations, remove any stale comments now just in case. + header_length = len( + self._GetExpectationFileTagHeader(expectation_file_path).splitlines( + True)) + output_contents = _RemoveStaleComments(''.join(trimmed_lines), + removed_lines, header_length) + + with open(expectation_file_path, 'w', encoding='utf-8') as outfile: + outfile.write(output_contents) + def _GetDisableAnnotatedExpectationsFromFile( self, expectation_file: str, content: str) -> Dict[data_types.Expectation, Tuple[str, str]]: @@ -906,6 +963,23 @@ return not group_removable +def _RawResultsContainUnhandledValue( + expectation: expectations_parser.Expectation) -> bool: + """Determines if a typ expectation contains an unhandled raw result.""" + # Skip expectations are unhandled since there is no historical data for + # skipped tests. + if 'Skip' in expectation.raw_results: + return True + + # Expectations that only have a Pass expectation (usually used to + # override a broader, failing expectation) are not handled by the + # unexpected pass finder, so ignore those. + if expectation.raw_results == ['Pass']: + return True + + return False + + def _GetNonRecentExpectationContent(expectation_file_path: str, num_days: datetime.timedelta) -> str: """Gets content from |expectation_file_path| older than |num_days| days.
diff --git a/testing/unexpected_passes_common/expectations_unittest.py b/testing/unexpected_passes_common/expectations_unittest.py index d095eb42..81cd4023 100755 --- a/testing/unexpected_passes_common/expectations_unittest.py +++ b/testing/unexpected_passes_common/expectations_unittest.py
@@ -80,9 +80,31 @@ [ linux ] foo/test [ Failure ] """ +FAKE_EXPECTATION_FILE_CONTENTS_WITH_MULTIPLE_DUPLICATES = """\ +# tags: [ win linux ] +# results: [ Failure RetryOnFailure Skip Pass ] +crbug.com/1234 [ win ] foo/test [ Failure ] +crbug.com/5678 crbug.com/6789 [ win ] foo/another/test [ RetryOnFailure ] -class CreateTestExpectationMapUnittest(unittest.TestCase): +[ linux ] foo/test [ Failure ] + +crbug.com/2345 [ linux ] bar/* [ RetryOnFailure ] +[ linux ] foo/test [ Failure ] +crbug.com/3456 [ linux ] some/bad/test [ Skip ] +[ linux ] foo/test [ Failure ] +crbug.com/4567 [ linux ] some/good/test [ Pass ] + +# Stale comment to remove +[ linux ] foo/test [ Failure ] +crbug.com/1234 [ win ] foo/test [ Failure ] +crbug.com/5678 crbug.com/6789 [ win ] foo/another/test [ RetryOnFailure ] +""" + + +class CreateTestExpectationMapUnittest(fake_filesystem_unittest.TestCase): + def setUp(self) -> None: + self.setUpPyfakefs() self.instance = expectations.Expectations() self._expectation_content = {} @@ -90,11 +112,28 @@ 'unexpected_passes_common.expectations._GetNonRecentExpectationContent') self._content_mock = self._content_patcher.start() self.addCleanup(self._content_patcher.stop) + self._header_patcher = mock.patch.object(self.instance, + '_GetExpectationFileTagHeader') + self._header_mock = self._header_patcher.start() + self.addCleanup(self._header_patcher.stop) - def SideEffect(filepath, _): + def ContentSideEffect(filepath, _): return self._expectation_content[filepath] - self._content_mock.side_effect = SideEffect + self._content_mock.side_effect = ContentSideEffect + + def HeaderSideEffect(filepath: str) -> str: + header_lines = [] + with open(filepath, encoding='utf-8') as infile: + content = infile.read() + for line in content.splitlines(keepends=True): + if line.startswith('#'): + header_lines.append(line) + else: + break + return ''.join(header_lines) + + self._header_mock.side_effect = HeaderSideEffect def testExclusiveOr(self) -> None: """Tests that only one input can be specified.""" @@ -107,8 +146,11 @@ def testExpectationFile(self) -> None: """Tests reading expectations from an expectation file.""" - filename = '/tmp/foo' + filename = '/foo' self._expectation_content[filename] = FAKE_EXPECTATION_FILE_CONTENTS + with open(filename, 'w', encoding='utf-8') as outfile: + outfile.write(FAKE_EXPECTATION_FILE_CONTENTS) + expectation_map = self.instance.CreateTestExpectationMap( filename, None, datetime.timedelta(days=0)) # Skip expectations should be omitted, but everything else should be @@ -132,12 +174,16 @@ def testMultipleExpectationFiles(self) -> None: """Tests reading expectations from multiple files.""" - filename1 = '/tmp/foo' - filename2 = '/tmp/bar' + filename1 = '/foo' + filename2 = '/bar' expectation_files = [filename1, filename2] self._expectation_content[filename1] = FAKE_EXPECTATION_FILE_CONTENTS self._expectation_content[ filename2] = SECONDARY_FAKE_EXPECTATION_FILE_CONTENTS + with open(filename1, 'w', encoding='utf-8') as outfile: + outfile.write(FAKE_EXPECTATION_FILE_CONTENTS) + with open(filename2, 'w', encoding='utf-8') as outfile: + outfile.write(SECONDARY_FAKE_EXPECTATION_FILE_CONTENTS) expectation_map = self.instance.CreateTestExpectationMap( expectation_files, None, datetime.timedelta(days=0)) @@ -175,11 +221,52 @@ self.assertEqual(expectation_map, expected_expectation_map) self.assertIsInstance(expectation_map, data_types.TestExpectationMap) - def testDuplicateExpectation(self): - """Tests behavior when duplicate expectations exist.""" - filename = '/tmp/foo' + def testDuplicateExpectationRemoved(self): + """Tests behavior when duplicate expectations exist but are removed.""" + filename = '/foo' + with open(filename, 'w', encoding='utf-8') as outfile: + outfile.write(FAKE_EXPECTATION_FILE_CONTENTS_WITH_DUPLICATE) + + def ContentSideEffect(_, __) -> str: + with open(filename, encoding='utf-8') as infile: + return infile.read() + + self._content_mock.side_effect = ContentSideEffect + + expectation_map = self.instance.CreateTestExpectationMap( + filename, None, datetime.timedelta(days=0)) + # Skip expectations should be omitted, but everything else should be + # present. + # yapf: disable + expected_expectation_map = { + filename: { + data_types.Expectation( + 'foo/test', ['win'], ['Failure'], 'crbug.com/1234'): {}, + data_types.Expectation( + 'foo/another/test', ['win'], ['RetryOnFailure'], + 'crbug.com/5678 crbug.com/6789'): {}, + data_types.Expectation('foo/test', ['linux'], ['Failure']): {}, + data_types.Expectation( + 'bar/*', ['linux'], ['RetryOnFailure'], 'crbug.com/2345'): {}, + }, + } + # yapf: enable + self.assertEqual(expectation_map, expected_expectation_map) + self.assertIsInstance(expectation_map, data_types.TestExpectationMap) + + with open(filename, encoding='utf-8') as infile: + content = infile.read() + + self.assertEqual(content, FAKE_EXPECTATION_FILE_CONTENTS + '\n') + + def testDuplicateExpectationNotRemoved(self): + """Tests behavior when duplicate expectations still exist.""" + filename = '/foo' self._expectation_content[filename] = ( FAKE_EXPECTATION_FILE_CONTENTS_WITH_DUPLICATE) + with open(filename, 'w', encoding='utf-8') as outfile: + outfile.write(FAKE_EXPECTATION_FILE_CONTENTS_WITH_DUPLICATE) + with self.assertRaisesRegex( RuntimeError, 'Duplicate expectation \\[ linux \\] foo/test \\[ Failure \\]'): @@ -188,6 +275,64 @@ +class RemoveDuplicateExpectationsUnittest(fake_filesystem_unittest.TestCase): + + def setUp(self): + self.setUpPyfakefs() + self.instance = expectations.Expectations() + + self._header_patcher = mock.patch.object(self.instance, + '_GetExpectationFileTagHeader') + self._header_mock = self._header_patcher.start() + self.addCleanup(self._header_mock.stop) + + def SideEffect(filepath: str) -> str: + header_lines = [] + with open(filepath, encoding='utf-8') as infile: + content = infile.read() + for line in content.splitlines(keepends=True): + if line.startswith('#'): + header_lines.append(line) + else: + break + return ''.join(header_lines) + + self._header_mock.side_effect = SideEffect + + def testNoDuplicates(self): + """Tests that the file is left unchanged if no duplicates exist.""" + filename = '/foo' + with open(filename, 'w', encoding='utf-8') as outfile: + outfile.write(FAKE_EXPECTATION_FILE_CONTENTS) + + self.instance._RemoveDuplicateExpectations(filename) + + with open(filename, encoding='utf-8') as infile: + self.assertEqual(infile.read(), FAKE_EXPECTATION_FILE_CONTENTS) + + def testSingleDuplicate(self): + """Tests that a single duplicate is removed properly.""" + filename = '/foo' + with open(filename, 'w', encoding='utf-8') as outfile: + outfile.write(FAKE_EXPECTATION_FILE_CONTENTS_WITH_DUPLICATE) + + self.instance._RemoveDuplicateExpectations(filename) + + with open(filename, encoding='utf-8') as infile: + self.assertEqual(infile.read(), FAKE_EXPECTATION_FILE_CONTENTS + '\n') + + def testMultipleDuplicates(self): + """Tests that multiple duplicate are removed properly.""" + filename = '/foo' + with open(filename, 'w', encoding='utf-8') as outfile: + outfile.write(FAKE_EXPECTATION_FILE_CONTENTS_WITH_MULTIPLE_DUPLICATES) + + self.instance._RemoveDuplicateExpectations(filename) + + with open(filename, encoding='utf-8') as infile: + self.assertEqual(infile.read(), FAKE_EXPECTATION_FILE_CONTENTS + '\n') + + class GetNonRecentExpectationContentUnittest(unittest.TestCase): def setUp(self) -> None:
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json index 0ee033d..b8dc1a5 100644 --- a/testing/variations/fieldtrial_testing_config.json +++ b/testing/variations/fieldtrial_testing_config.json
@@ -6205,7 +6205,7 @@ ], "experiments": [ { - "name": "Enabled_Teamfood", + "name": "Enabled", "params": { "file-upload-limit-bytes": "200000000", "send-page-url-for-contextualization": "true", @@ -12184,6 +12184,25 @@ ] } ], + "IOSStartTimeBrowserBackgroundRemediations": [ + { + "platforms": [ + "ios" + ], + "experiments": [ + { + "name": "EnabledWithUpdateFeedRefresh", + "params": { + "ios-startup-remediations-avoid-ntp-cleanup": "false", + "ios-startup-remediations-update-feed-refresh": "true" + }, + "enable_features": [ + "IOSStartTimeBrowserBackgroundRemediations" + ] + } + ] + } + ], "IOSStartTimeStartupRemediations": [ { "platforms": [ @@ -18672,30 +18691,6 @@ ] } ], - "ReactivePrefetchDesktop": [ - { - "platforms": [ - "chromeos", - "linux", - "mac", - "windows" - ], - "experiments": [ - { - "name": "EnabledWithPreconnect_20240916", - "params": { - "use_predictions": "true" - }, - "enable_features": [ - "LoadingPredictorUseOptimizationGuide" - ], - "disable_features": [ - "LoadingPredictorPrefetch" - ] - } - ] - } - ], "ReadAloudAppMenuIPH": [ { "platforms": [ @@ -22160,6 +22155,21 @@ ] } ], + "SkipIsolatedSplitPreload": [ + { + "platforms": [ + "android" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "SkipIsolatedSplitPreload" + ] + } + ] + } + ], "SkipPagehideInCommitForDSENavigation": [ { "platforms": [ @@ -22668,6 +22678,23 @@ ] } ], + "SyncMinimizeDeletionsDuringBookmarkBatchUpload": [ + { + "platforms": [ + "android", + "ios" + ], + "experiments": [ + { + "name": "Enabled_WithFastDeletions", + "enable_features": [ + "SyncFastDeletionsDuringBookmarkBatchUpload", + "SyncMinimizeDeletionsDuringBookmarkBatchUpload" + ] + } + ] + } + ], "SysUiHoldbackStudy": [ { "platforms": [
diff --git a/third_party/angle b/third_party/angle index d4a3dbe..c10f5e3 160000 --- a/third_party/angle +++ b/third_party/angle
@@ -1 +1 @@ -Subproject commit d4a3dbee0da44da98eea4d36bbfa769221583a23 +Subproject commit c10f5e3fbf61e024ed298700dbc0b5faf888ec5f
diff --git a/third_party/blink/manual_tests/webaudio/audiocontext-setsinkid.html b/third_party/blink/manual_tests/webaudio/audiocontext-setsinkid.html index 422c49b1..85683c75 100644 --- a/third_party/blink/manual_tests/webaudio/audiocontext-setsinkid.html +++ b/third_party/blink/manual_tests/webaudio/audiocontext-setsinkid.html
@@ -65,9 +65,7 @@ // Handles the button click to activate `setSinkId()` method. const onDeviceChange = async (event, audioContext, appView) => { const deviceId = appView.dropdown.value; - if (deviceId === 'default') { - audioContext.setSinkId(''); - } else if (deviceId === 'silent') { + if (deviceId === 'silent') { audioContext.setSinkId({type: 'none'}); } else { audioContext.setSinkId(deviceId); @@ -145,4 +143,4 @@ window.addEventListener('load', startManuaTestApp); </script> </body> -</html> \ No newline at end of file +</html>
diff --git a/third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom b/third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom index ece7ee6..c1a58f6 100644 --- a/third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom +++ b/third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom
@@ -3936,7 +3936,7 @@ kFedCmRpContext = 4580, kEventTimingArtificialPointerupOrClick = 4581, kAbortSignalAny = 4582, - kFedCmIdpSigninStatusApi = 4583, + kOBSOLETE_FedCmIdpSigninStatusApi = 4583, kFedCmIdpSigninStatusJsApi = 4584, kExecCommand = 4585, kWebGPUQueueSubmit = 4586,
diff --git a/third_party/blink/public/mojom/webauthn/authenticator.mojom b/third_party/blink/public/mojom/webauthn/authenticator.mojom index 9964c9e..f996220b 100644 --- a/third_party/blink/public/mojom/webauthn/authenticator.mojom +++ b/third_party/blink/public/mojom/webauthn/authenticator.mojom
@@ -452,6 +452,10 @@ // If present, reflects the contents of the "supplementalPubKeys" extension. // https://github.com/w3c/webauthn/pull/1663 SupplementalPubKeysRequest? supplemental_pub_keys; + + // Parameters defining the type of browser bound keys that the relying party + // would accept. + array<PublicKeyCredentialParameters>? payment_browser_bound_key_parameters; }; // https://w3c.github.io/webauthn/#enum-residentKeyRequirement
diff --git a/third_party/blink/public/platform/DEPS b/third_party/blink/public/platform/DEPS index 9283eaa..9e87b73 100644 --- a/third_party/blink/public/platform/DEPS +++ b/third_party/blink/public/platform/DEPS
@@ -29,6 +29,7 @@ "+build/build_config.h", "+cc", "+components/viz/common", + "+media/audio/audio_device_description.h", "+media/base/audio_capturer_source.h", "+media/base/audio_latency.h", "+media/base/audio_renderer_sink.h",
diff --git a/third_party/blink/public/platform/web_audio_sink_descriptor.h b/third_party/blink/public/platform/web_audio_sink_descriptor.h index 43fb395da..546e7a2 100644 --- a/third_party/blink/public/platform/web_audio_sink_descriptor.h +++ b/third_party/blink/public/platform/web_audio_sink_descriptor.h
@@ -7,6 +7,7 @@ #include "base/check_op.h" #include "base/notreached.h" +#include "media/audio/audio_device_description.h" #include "third_party/blink/public/common/tokens/tokens.h" #include "third_party/blink/public/platform/web_string.h" @@ -41,7 +42,10 @@ const LocalFrameToken& Token() const { return token_; } AudioSinkType Type() const { return type_; } WebString SinkId() const { return sink_id_; } - + bool IsDefaultSinkId() const { + return SinkId().IsEmpty() || + (SinkId() == media::AudioDeviceDescription::kDefaultDeviceId); + } bool operator==(const WebAudioSinkDescriptor& rhs) const { return this->Type() == rhs.Type() && this->SinkId() == rhs.SinkId(); }
diff --git a/third_party/blink/renderer/bindings/core/v8/v8_compile_hints_producer.cc b/third_party/blink/renderer/bindings/core/v8/v8_compile_hints_producer.cc index dd17e3bd..6c46330 100644 --- a/third_party/blink/renderer/bindings/core/v8/v8_compile_hints_producer.cc +++ b/third_party/blink/renderer/bindings/core/v8/v8_compile_hints_producer.cc
@@ -141,7 +141,7 @@ constexpr int kDeletionDelaySeconds = 30; auto delay = base::Seconds(kDeletionDelaySeconds); - execution_context->GetTaskRunner(TaskType::kIdleTask) + execution_context->GetTaskRunner(TaskType::kInternalDefault) ->PostDelayedTask(FROM_HERE, WTF::BindOnce(&ClearDataTask, WrapWeakPersistent(this)), delay);
diff --git a/third_party/blink/renderer/core/css/invalidation/rule_invalidation_data_visitor.cc b/third_party/blink/renderer/core/css/invalidation/rule_invalidation_data_visitor.cc index b7d8f108..0cf6e2f 100644 --- a/third_party/blink/renderer/core/css/invalidation/rule_invalidation_data_visitor.cc +++ b/third_party/blink/renderer/core/css/invalidation/rule_invalidation_data_visitor.cc
@@ -1426,7 +1426,23 @@ combinator = CSSSelector::kIndirectAdjacent; break; default: - NOTREACHED(); + // Implicit combinators for pseudo elements (kUAShadow, kShadowSlot, + // kShadowPart) cannot be inside :has() because pseudo elements are + // not allowed inside :has(). + // Combinators for relative relations (kRelativeDescendant, + // kRelativeChild, kRelativeDirectAdjacent, kRelativeIndirectAdjacent) + // cannot be inside :has() because :has() is not allowed inside :has(). + // + // In simple cases (e.g. ':has(::part(foo))', ':has(:has(foo))'), + // selector parser treats the :has() as invalid at parsing time. + // + // But nesting can bypass the parsing time validation: + // (e.g. '::part(foo) {:has(&) {}}' -> both '::part(foo)' and ':has(&)' + // are valid selectors, but the :has() will not match any element) + // + // To avoid assertion for the nesting case, just return here instead + // of NOTREACHED(). + return; } UpdateFeaturesFromCombinator(combinator, last_compound_in_adjacent_chain,
diff --git a/third_party/blink/renderer/core/css/parser/css_parser.cc b/third_party/blink/renderer/core/css/parser/css_parser.cc index f25ff36..5d2c23fe 100644 --- a/third_party/blink/renderer/core/css/parser/css_parser.cc +++ b/third_party/blink/renderer/core/css/parser/css_parser.cc
@@ -210,6 +210,53 @@ context); } +// NOTE: This follows pretty much the exact same structure as ParseValue(), +// above.ParseValue(), above.ParseValue(), above.ParseValue(), above. +unsigned CSSParser::ParseForPresentationStyle( + HeapVector<CSSPropertyValue, 8>& result, + CSSPropertyID resolved_property, + StringView string, + CSSParserMode parser_mode, + StyleSheetContents* context_sheet, + const ExecutionContext* execution_context) { + DCHECK(ThreadState::Current()->IsAllocationAllowed()); + if (string.empty()) { + return 0; + } + + SecureContextMode secure_context_mode = + execution_context ? execution_context->GetSecureContextMode() + : SecureContextMode::kInsecureContext; + const CSSParserContext* context = GetParserContext( + secure_context_mode, context_sheet, execution_context, parser_mode); + + // Fast-path parser. + const CSSValue* value = + CSSParserFastPaths::MaybeParseValue(resolved_property, string, context); + if (value) { + result.emplace_back(CSSPropertyName(resolved_property), *value); + return 1; + } + + // Longhand parsing. + const CSSProperty& property = CSSProperty::Get(resolved_property); + if (parser_mode == kHTMLStandardMode && property.IsProperty() && + !property.IsShorthand()) { + CSSParserTokenStream stream(string); + value = + CSSPropertyParser::ParseSingleValue(resolved_property, stream, context); + if (value) { + result.emplace_back(CSSPropertyName(resolved_property), *value); + return 1; + } else { + return 0; + } + } + + // Full-blown parser, for shorthands and SVG. + return CSSParserImpl::ParseValue(result, resolved_property, string, context); +} + MutableCSSPropertyValueSet::SetResult CSSParser::ParseValueForCustomProperty( MutableCSSPropertyValueSet* declaration, const AtomicString& property_name,
diff --git a/third_party/blink/renderer/core/css/parser/css_parser.h b/third_party/blink/renderer/core/css/parser/css_parser.h index 640b7697..174efc4 100644 --- a/third_party/blink/renderer/core/css/parser/css_parser.h +++ b/third_party/blink/renderer/core/css/parser/css_parser.h
@@ -95,6 +95,18 @@ StyleSheetContents*, const ExecutionContext* execution_context = nullptr); + // Appends to a vector instead of to a property value set (so no deduplication + // etc.). Also note that this takes in the resolved property; there's no + // reason for internal code to ever use an alias here. Returns the number of + // properties that were added (0 for parse error). + static unsigned ParseForPresentationStyle( + HeapVector<CSSPropertyValue, 8>& result, + CSSPropertyID resolved_property, + StringView value, + CSSParserMode parser_mode, + StyleSheetContents* context_sheet, // Used for URL references. + const ExecutionContext* execution_context); + static MutableCSSPropertyValueSet::SetResult ParseValueForCustomProperty( MutableCSSPropertyValueSet*, const AtomicString& property_name,
diff --git a/third_party/blink/renderer/core/css/parser/css_parser_impl.cc b/third_party/blink/renderer/core/css/parser/css_parser_impl.cc index 30f8f0b..37862be5 100644 --- a/third_party/blink/renderer/core/css/parser/css_parser_impl.cc +++ b/third_party/blink/renderer/core/css/parser/css_parser_impl.cc
@@ -202,6 +202,19 @@ return declaration->AddParsedProperties(parser.parsed_properties_); } +unsigned CSSParserImpl::ParseValue(HeapVector<CSSPropertyValue, 8>& result, + CSSPropertyID unresolved_property, + StringView string, + const CSSParserContext* context) { + STACK_UNINITIALIZED CSSParserImpl parser(context); + CSSParserTokenStream stream(string); + parser.ConsumeDeclarationValue(stream, unresolved_property, + /*is_in_declaration_list=*/false, + StyleRule::kStyle); + result.AppendVector(parser.parsed_properties_); + return parser.parsed_properties_.size(); +} + MutableCSSPropertyValueSet::SetResult CSSParserImpl::ParseVariableValue( MutableCSSPropertyValueSet* declaration, const AtomicString& property_name,
diff --git a/third_party/blink/renderer/core/css/parser/css_parser_impl.h b/third_party/blink/renderer/core/css/parser/css_parser_impl.h index 0612f596..18be4ea 100644 --- a/third_party/blink/renderer/core/css/parser/css_parser_impl.h +++ b/third_party/blink/renderer/core/css/parser/css_parser_impl.h
@@ -106,6 +106,16 @@ StringView, bool important, const CSSParserContext*); + // Same as above, but always in a style rule, never !important, + // and ends in a vector instead of a MutableCSSPropertyValueSet + // (which means we don't do e.g. any deduplication). Returns + // the number of properties that were added (always 0 or 1 + // if the property is a longhand). This is used for parsing + // presentation style. + static unsigned ParseValue(HeapVector<CSSPropertyValue, 8>&, + CSSPropertyID, + StringView, + const CSSParserContext*); static MutableCSSPropertyValueSet::SetResult ParseVariableValue( MutableCSSPropertyValueSet*, const AtomicString& property_name,
diff --git a/third_party/blink/renderer/core/css/rule_feature_set_test.cc b/third_party/blink/renderer/core/css/rule_feature_set_test.cc index 4e0e811..664f6a858 100644 --- a/third_party/blink/renderer/core/css/rule_feature_set_test.cc +++ b/third_party/blink/renderer/core/css/rule_feature_set_test.cc
@@ -2961,6 +2961,18 @@ } } +TEST_F(RuleFeatureSetTest, NestingSelectorInsideHasPointingToPart) { + Document* document = + Document::CreateForTest(execution_context_.GetExecutionContext()); + auto* parent_rule = DynamicTo<StyleRule>( + css_test_helpers::ParseRule(*document, "::part(foo) {}")); + ASSERT_TRUE(parent_rule); + + EXPECT_EQ(SelectorPreMatch::kMayMatch, + CollectFeatures(":has(&)", CSSNestingType::kNesting, + /*parent_rule_for_nesting=*/parent_rule)); +} + TEST_F(RuleFeatureSetTest, PseudoElementInParentPseudoPreMatch) { Document* document = Document::CreateForTest(execution_context_.GetExecutionContext());
diff --git a/third_party/blink/renderer/core/dom/document.cc b/third_party/blink/renderer/core/dom/document.cc index 0290166..fc3d93c 100644 --- a/third_party/blink/renderer/core/dom/document.cc +++ b/third_party/blink/renderer/core/dom/document.cc
@@ -4593,9 +4593,9 @@ anchor.InvalidateCachedVisitedLinkHash(); } - for (Element* element : *scripts()) { - auto* script = To<HTMLScriptElement>(element); - script->Loader()->DocumentBaseURLChanged(); + for (HTMLScriptElement& script : + Traversal<HTMLScriptElement>::DescendantsOf(*this)) { + script.Loader()->DocumentBaseURLChanged(); } if (auto* document_rules = DocumentSpeculationRules::FromIfExists(*this)) {
diff --git a/third_party/blink/renderer/core/dom/element.cc b/third_party/blink/renderer/core/dom/element.cc index c69097d..b64fcd3 100644 --- a/third_party/blink/renderer/core/dom/element.cc +++ b/third_party/blink/renderer/core/dom/element.cc
@@ -9933,58 +9933,62 @@ } CSSPropertyValueSet* Element::CreatePresentationAttributeStyle() { - auto* style = MakeGarbageCollected<MutableCSSPropertyValueSet>( - IsSVGElement() ? kSVGAttributeMode : kHTMLStandardMode); + HeapVector<CSSPropertyValue, 8> values; AttributeCollection attributes = AttributesWithoutUpdate(); for (const Attribute& attr : attributes) { - CollectStyleForPresentationAttribute(attr.GetName(), attr.Value(), style); + CollectStyleForPresentationAttribute(attr.GetName(), attr.Value(), values); } - CollectExtraStyleForPresentationAttribute(style); - return style; + CollectExtraStyleForPresentationAttribute(values); + return ImmutableCSSPropertyValueSet::Create( + values, IsSVGElement() ? kSVGAttributeMode : kHTMLStandardMode); } void Element::AddPropertyToPresentationAttributeStyle( - MutableCSSPropertyValueSet* style, + HeapVector<CSSPropertyValue, 8>& values, CSSPropertyID property_id, CSSValueID identifier) { DCHECK(IsStyledElement()); DCHECK_NE(property_id, CSSPropertyID::kWhiteSpace); - style->SetLonghandProperty(property_id, - *CSSIdentifierValue::Create(identifier)); + DCHECK(!CSSProperty::Get(property_id).IsShorthand()); + values.emplace_back(CSSPropertyName(property_id), + *CSSIdentifierValue::Create(identifier)); } void Element::AddPropertyToPresentationAttributeStyle( - MutableCSSPropertyValueSet* style, + HeapVector<CSSPropertyValue, 8>& values, CSSPropertyID property_id, double value, CSSPrimitiveValue::UnitType unit) { DCHECK(IsStyledElement()); - style->SetLonghandProperty(property_id, - *CSSNumericLiteralValue::Create(value, unit)); + DCHECK(!CSSProperty::Get(property_id).IsShorthand()); + values.emplace_back(CSSPropertyName(property_id), + *CSSNumericLiteralValue::Create(value, unit)); } void Element::AddPropertyToPresentationAttributeStyle( - MutableCSSPropertyValueSet* style, + HeapVector<CSSPropertyValue, 8>& values, CSSPropertyID property_id, const String& value) { DCHECK(IsStyledElement()); - style->ParseAndSetProperty(property_id, value, false, - GetExecutionContext() - ? GetExecutionContext()->GetSecureContextMode() - : SecureContextMode::kInsecureContext, - GetDocument().ElementSheet().Contents()); + CSSParser::ParseForPresentationStyle( + values, property_id, value, + IsSVGElement() ? kSVGAttributeMode : kHTMLStandardMode, + GetDocument().ElementSheet().Contents(), + /*execution_context=*/nullptr); } void Element::AddPropertyToPresentationAttributeStyle( - MutableCSSPropertyValueSet* style, + HeapVector<CSSPropertyValue, 8>& values, CSSPropertyID property_id, const CSSValue& value) { DCHECK(IsStyledElement()); - style->SetLonghandProperty(property_id, value); + DCHECK(!CSSProperty::Get(property_id).IsShorthand()); + values.emplace_back(CSSPropertyName(property_id), value); } -void Element::MapLanguageAttributeToLocale(const AtomicString& value, - MutableCSSPropertyValueSet* style) { +void Element::MapLanguageAttributeToLocale( + const AtomicString& value, + HeapVector<CSSPropertyValue, 8>& style) { if (!value.empty()) { // Have to quote so the locale id is treated as a string instead of as a CSS // keyword.
diff --git a/third_party/blink/renderer/core/dom/element.h b/third_party/blink/renderer/core/dom/element.h index 795f58d..356ebee 100644 --- a/third_party/blink/renderer/core/dom/element.h +++ b/third_party/blink/renderer/core/dom/element.h
@@ -36,6 +36,7 @@ #include "third_party/blink/renderer/core/animation/animatable.h" #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/core/css/css_primitive_value.h" +#include "third_party/blink/renderer/core/css/css_property_value.h" #include "third_party/blink/renderer/core/css/css_selector.h" #include "third_party/blink/renderer/core/css/resolver/cascade_filter.h" #include "third_party/blink/renderer/core/css/style_recalc_change.h" @@ -654,12 +655,12 @@ virtual void CollectStyleForPresentationAttribute( const QualifiedName&, const AtomicString&, - MutableCSSPropertyValueSet*) {} + HeapVector<CSSPropertyValue, 8>&) {} // Subclasses can override these functions if there is extra style that needs // to be mapped like attributes. virtual bool HasExtraStyleForPresentationAttribute() const { return false; } virtual void CollectExtraStyleForPresentationAttribute( - MutableCSSPropertyValueSet*) {} + HeapVector<CSSPropertyValue, 8>&) {} // For exposing to DOM only. NamedNodeMap* attributesForBindings() const; @@ -1561,21 +1562,21 @@ bool is_width, bool is_offset); - void AddPropertyToPresentationAttributeStyle(MutableCSSPropertyValueSet*, + void AddPropertyToPresentationAttributeStyle(HeapVector<CSSPropertyValue, 8>&, CSSPropertyID, CSSValueID identifier); - void AddPropertyToPresentationAttributeStyle(MutableCSSPropertyValueSet*, + void AddPropertyToPresentationAttributeStyle(HeapVector<CSSPropertyValue, 8>&, CSSPropertyID, double value, CSSPrimitiveValue::UnitType); - void AddPropertyToPresentationAttributeStyle(MutableCSSPropertyValueSet*, + void AddPropertyToPresentationAttributeStyle(HeapVector<CSSPropertyValue, 8>&, CSSPropertyID, const String& value); - void AddPropertyToPresentationAttributeStyle(MutableCSSPropertyValueSet*, + void AddPropertyToPresentationAttributeStyle(HeapVector<CSSPropertyValue, 8>&, CSSPropertyID, const CSSValue&); void MapLanguageAttributeToLocale(const AtomicString&, - MutableCSSPropertyValueSet*); + HeapVector<CSSPropertyValue, 8>&); InsertionNotificationRequest InsertedInto(ContainerNode&) override; void RemovedFrom(ContainerNode&) override; @@ -2118,7 +2119,8 @@ } inline bool Element::HasClassName(const AtomicString& class_name) const { - return HasElementData() && GetElementData()->ClassNames().Contains(class_name); + return HasElementData() && + GetElementData()->ClassNames().Contains(class_name); } inline bool Element::HasID() const {
diff --git a/third_party/blink/renderer/core/dom/element_data.cc b/third_party/blink/renderer/core/dom/element_data.cc index 3015c74f..c1a8341e 100644 --- a/third_party/blink/renderer/core/dom/element_data.cc +++ b/third_party/blink/renderer/core/dom/element_data.cc
@@ -180,13 +180,11 @@ UniqueElementData::UniqueElementData(const ShareableElementData& other) : ElementData(other, true) { // An ShareableElementData should never have a mutable inline - // CSSPropertyValueSet attached. - // - // NOTE: The presentation attribute style should probably also have been - // immutable, but it currently isn't, since we use its mutability - // during building. + // CSSPropertyValueSet attached. Same for presentation attribute style. DCHECK(!other.inline_style_ || !other.inline_style_->IsMutable()); inline_style_ = other.inline_style_; + DCHECK(!other.presentation_attribute_style_ || + !other.presentation_attribute_style_->IsMutable()); presentation_attribute_style_ = other.presentation_attribute_style_; unsigned length = other.Attributes().size();
diff --git a/third_party/blink/renderer/core/html/canvas/html_canvas_element.cc b/third_party/blink/renderer/core/html/canvas/html_canvas_element.cc index fc40171..c113d78 100644 --- a/third_party/blink/renderer/core/html/canvas/html_canvas_element.cc +++ b/third_party/blink/renderer/core/html/canvas/html_canvas_element.cc
@@ -1393,7 +1393,7 @@ void HTMLCanvasElement::CollectStyleForPresentationAttribute( const QualifiedName& name, const AtomicString& value, - MutableCSSPropertyValueSet* style) { + HeapVector<CSSPropertyValue, 8>& style) { if (name == html_names::kWidthAttr) { const AtomicString& height = FastGetAttribute(html_names::kHeightAttr); if (!height.IsNull())
diff --git a/third_party/blink/renderer/core/html/canvas/html_canvas_element.h b/third_party/blink/renderer/core/html/canvas/html_canvas_element.h index 3b9d256..59aa570 100644 --- a/third_party/blink/renderer/core/html/canvas/html_canvas_element.h +++ b/third_party/blink/renderer/core/html/canvas/html_canvas_element.h
@@ -135,9 +135,10 @@ ExceptionState&); bool IsPresentationAttribute(const QualifiedName&) const final; - void CollectStyleForPresentationAttribute(const QualifiedName&, - const AtomicString&, - MutableCSSPropertyValueSet*) final; + void CollectStyleForPresentationAttribute( + const QualifiedName&, + const AtomicString&, + HeapVector<CSSPropertyValue, 8>&) final; // Used for canvas capture. void AddListener(CanvasDrawListener*);
diff --git a/third_party/blink/renderer/core/html/fenced_frame/html_fenced_frame_element.cc b/third_party/blink/renderer/core/html/fenced_frame/html_fenced_frame_element.cc index 76e1f28..ea656c9d 100644 --- a/third_party/blink/renderer/core/html/fenced_frame/html_fenced_frame_element.cc +++ b/third_party/blink/renderer/core/html/fenced_frame/html_fenced_frame_element.cc
@@ -372,7 +372,7 @@ void HTMLFencedFrameElement::CollectStyleForPresentationAttribute( const QualifiedName& name, const AtomicString& value, - MutableCSSPropertyValueSet* style) { + HeapVector<CSSPropertyValue, 8>& style) { if (name == html_names::kWidthAttr) { AddHTMLLengthToStyle(style, CSSPropertyID::kWidth, value); } else if (name == html_names::kHeightAttr) {
diff --git a/third_party/blink/renderer/core/html/fenced_frame/html_fenced_frame_element.h b/third_party/blink/renderer/core/html/fenced_frame/html_fenced_frame_element.h index ea918b7c..99ae1d5 100644 --- a/third_party/blink/renderer/core/html/fenced_frame/html_fenced_frame_element.h +++ b/third_party/blink/renderer/core/html/fenced_frame/html_fenced_frame_element.h
@@ -157,7 +157,7 @@ void CollectStyleForPresentationAttribute( const QualifiedName&, const AtomicString&, - MutableCSSPropertyValueSet*) override; + HeapVector<CSSPropertyValue, 8>&) override; bool LayoutObjectIsNeeded(const DisplayStyle&) const override; LayoutObject* CreateLayoutObject(const ComputedStyle&) override; void AttachLayoutTree(AttachContext& context) override;
diff --git a/third_party/blink/renderer/core/html/forms/html_form_control_element.cc b/third_party/blink/renderer/core/html/forms/html_form_control_element.cc index 92cc3590..22ee4d2 100644 --- a/third_party/blink/renderer/core/html/forms/html_form_control_element.cc +++ b/third_party/blink/renderer/core/html/forms/html_form_control_element.cc
@@ -29,6 +29,7 @@ #include "third_party/blink/public/web/web_form_related_change_type.h" #include "third_party/blink/renderer/core/accessibility/ax_object_cache.h" #include "third_party/blink/renderer/core/css/selector_checker.h" +#include "third_party/blink/renderer/core/dom/dom_node_ids.h" #include "third_party/blink/renderer/core/dom/element.h" #include "third_party/blink/renderer/core/dom/element_traversal.h" #include "third_party/blink/renderer/core/dom/events/event.h"
diff --git a/third_party/blink/renderer/core/html/forms/html_input_element.cc b/third_party/blink/renderer/core/html/forms/html_input_element.cc index fbc8a8e..11ecdfe 100644 --- a/third_party/blink/renderer/core/html/forms/html_input_element.cc +++ b/third_party/blink/renderer/core/html/forms/html_input_element.cc
@@ -780,7 +780,7 @@ void HTMLInputElement::CollectStyleForPresentationAttribute( const QualifiedName& name, const AtomicString& value, - MutableCSSPropertyValueSet* style) { + HeapVector<CSSPropertyValue, 8>& style) { if (name == html_names::kVspaceAttr) { AddHTMLLengthToStyle(style, CSSPropertyID::kMarginTop, value); AddHTMLLengthToStyle(style, CSSPropertyID::kMarginBottom, value);
diff --git a/third_party/blink/renderer/core/html/forms/html_input_element.h b/third_party/blink/renderer/core/html/forms/html_input_element.h index a5d5d0c..8df219e 100644 --- a/third_party/blink/renderer/core/html/forms/html_input_element.h +++ b/third_party/blink/renderer/core/html/forms/html_input_element.h
@@ -426,9 +426,10 @@ void DidRecalcStyle(const StyleRecalcChange) override; void ParseAttribute(const AttributeModificationParams&) override; bool IsPresentationAttribute(const QualifiedName&) const final; - void CollectStyleForPresentationAttribute(const QualifiedName&, - const AtomicString&, - MutableCSSPropertyValueSet*) final; + void CollectStyleForPresentationAttribute( + const QualifiedName&, + const AtomicString&, + HeapVector<CSSPropertyValue, 8>&) final; void FinishParsingChildren() final; void ParserDidSetAttributes() final;
diff --git a/third_party/blink/renderer/core/html/forms/html_text_area_element.cc b/third_party/blink/renderer/core/html/forms/html_text_area_element.cc index f1cf032..cfbeab7 100644 --- a/third_party/blink/renderer/core/html/forms/html_text_area_element.cc +++ b/third_party/blink/renderer/core/html/forms/html_text_area_element.cc
@@ -192,7 +192,7 @@ void HTMLTextAreaElement::CollectStyleForPresentationAttribute( const QualifiedName& name, const AtomicString& value, - MutableCSSPropertyValueSet* style) { + HeapVector<CSSPropertyValue, 8>& style) { if (name == html_names::kWrapAttr) { if (ShouldWrapText()) { // Longhands of `white-space: pre-wrap`.
diff --git a/third_party/blink/renderer/core/html/forms/html_text_area_element.h b/third_party/blink/renderer/core/html/forms/html_text_area_element.h index 3ea9beb5..28ad073 100644 --- a/third_party/blink/renderer/core/html/forms/html_text_area_element.h +++ b/third_party/blink/renderer/core/html/forms/html_text_area_element.h
@@ -131,7 +131,7 @@ void CollectStyleForPresentationAttribute( const QualifiedName&, const AtomicString&, - MutableCSSPropertyValueSet*) override; + HeapVector<CSSPropertyValue, 8>&) override; LayoutObject* CreateLayoutObject(const ComputedStyle&) override; void AppendToFormData(FormData&) override; void ResetImpl() override;
diff --git a/third_party/blink/renderer/core/html/html_body_element.cc b/third_party/blink/renderer/core/html/html_body_element.cc index 7176897..0df8f37 100644 --- a/third_party/blink/renderer/core/html/html_body_element.cc +++ b/third_party/blink/renderer/core/html/html_body_element.cc
@@ -62,7 +62,7 @@ void HTMLBodyElement::CollectStyleForPresentationAttribute( const QualifiedName& name, const AtomicString& value, - MutableCSSPropertyValueSet* style) { + HeapVector<CSSPropertyValue, 8>& style) { if (name == html_names::kBackgroundAttr) { AddHTMLBackgroundImageToStyle(style, value, localName()); } else if (name == html_names::kMarginwidthAttr ||
diff --git a/third_party/blink/renderer/core/html/html_body_element.h b/third_party/blink/renderer/core/html/html_body_element.h index b353999a..3b945fc 100644 --- a/third_party/blink/renderer/core/html/html_body_element.h +++ b/third_party/blink/renderer/core/html/html_body_element.h
@@ -58,7 +58,7 @@ void CollectStyleForPresentationAttribute( const QualifiedName&, const AtomicString&, - MutableCSSPropertyValueSet*) override; + HeapVector<CSSPropertyValue, 8>&) override; InsertionNotificationRequest InsertedInto(ContainerNode&) override; void RemovedFrom(ContainerNode&) override;
diff --git a/third_party/blink/renderer/core/html/html_br_element.cc b/third_party/blink/renderer/core/html/html_br_element.cc index adf7c2b..2ead476 100644 --- a/third_party/blink/renderer/core/html/html_br_element.cc +++ b/third_party/blink/renderer/core/html/html_br_element.cc
@@ -42,7 +42,7 @@ void HTMLBRElement::CollectStyleForPresentationAttribute( const QualifiedName& name, const AtomicString& value, - MutableCSSPropertyValueSet* style) { + HeapVector<CSSPropertyValue, 8>& style) { if (name == html_names::kClearAttr) { // If the string is empty, then don't add the clear property. // <br clear> and <br clear=""> are just treated like <br> by Gecko, Mac IE,
diff --git a/third_party/blink/renderer/core/html/html_br_element.h b/third_party/blink/renderer/core/html/html_br_element.h index 08e7f81..1b0ca37 100644 --- a/third_party/blink/renderer/core/html/html_br_element.h +++ b/third_party/blink/renderer/core/html/html_br_element.h
@@ -44,7 +44,7 @@ void CollectStyleForPresentationAttribute( const QualifiedName&, const AtomicString&, - MutableCSSPropertyValueSet*) override; + HeapVector<CSSPropertyValue, 8>&) override; LayoutObject* CreateLayoutObject(const ComputedStyle&) override; };
diff --git a/third_party/blink/renderer/core/html/html_div_element.cc b/third_party/blink/renderer/core/html/html_div_element.cc index 460efac..f0391aa 100644 --- a/third_party/blink/renderer/core/html/html_div_element.cc +++ b/third_party/blink/renderer/core/html/html_div_element.cc
@@ -34,7 +34,7 @@ void HTMLDivElement::CollectStyleForPresentationAttribute( const QualifiedName& name, const AtomicString& value, - MutableCSSPropertyValueSet* style) { + HeapVector<CSSPropertyValue, 8>& style) { if (name == html_names::kAlignAttr) { if (EqualIgnoringASCIICase(value, "middle") || EqualIgnoringASCIICase(value, "center")) {
diff --git a/third_party/blink/renderer/core/html/html_div_element.h b/third_party/blink/renderer/core/html/html_div_element.h index e67cf8a..191c390 100644 --- a/third_party/blink/renderer/core/html/html_div_element.h +++ b/third_party/blink/renderer/core/html/html_div_element.h
@@ -38,7 +38,7 @@ void CollectStyleForPresentationAttribute( const QualifiedName&, const AtomicString&, - MutableCSSPropertyValueSet*) override; + HeapVector<CSSPropertyValue, 8>&) override; }; } // namespace blink
diff --git a/third_party/blink/renderer/core/html/html_element.cc b/third_party/blink/renderer/core/html/html_element.cc index fe2fe8ae..c0250dd 100644 --- a/third_party/blink/renderer/core/html/html_element.cc +++ b/third_party/blink/renderer/core/html/html_element.cc
@@ -294,7 +294,7 @@ void HTMLElement::ApplyBorderAttributeToStyle( const AtomicString& value, - MutableCSSPropertyValueSet* style) { + HeapVector<CSSPropertyValue, 8>& style) { unsigned width = ParseBorderWidthAttribute(value); for (CSSPropertyID property_id : {CSSPropertyID::kBorderTopWidth, CSSPropertyID::kBorderBottomWidth, @@ -330,7 +330,7 @@ void HTMLElement::CollectStyleForPresentationAttribute( const QualifiedName& name, const AtomicString& value, - MutableCSSPropertyValueSet* style) { + HeapVector<CSSPropertyValue, 8>& style) { if (name == html_names::kAlignAttr) { if (EqualIgnoringASCIICase(value, "middle")) { AddPropertyToPresentationAttributeStyle(style, CSSPropertyID::kTextAlign, @@ -995,9 +995,10 @@ MergeWithNextTextNode(prev_text_node, exception_state); } -void HTMLElement::ApplyAspectRatioToStyle(const AtomicString& width, - const AtomicString& height, - MutableCSSPropertyValueSet* style) { +void HTMLElement::ApplyAspectRatioToStyle( + const AtomicString& width, + const AtomicString& height, + HeapVector<CSSPropertyValue, 8>& style) { HTMLDimension width_dim; if (!ParseDimensionValue(width, width_dim) || !width_dim.IsAbsolute()) return; @@ -1010,7 +1011,7 @@ void HTMLElement::ApplyIntegerAspectRatioToStyle( const AtomicString& width, const AtomicString& height, - MutableCSSPropertyValueSet* style) { + HeapVector<CSSPropertyValue, 8>& style) { unsigned width_val = 0; if (!ParseHTMLNonNegativeInteger(width, width_val)) return; @@ -1020,9 +1021,10 @@ ApplyAspectRatioToStyle(width_val, height_val, style); } -void HTMLElement::ApplyAspectRatioToStyle(double width, - double height, - MutableCSSPropertyValueSet* style) { +void HTMLElement::ApplyAspectRatioToStyle( + double width, + double height, + HeapVector<CSSPropertyValue, 8>& style) { auto* width_val = CSSNumericLiteralValue::Create( width, CSSPrimitiveValue::UnitType::kNumber); auto* height_val = CSSNumericLiteralValue::Create( @@ -1034,12 +1036,12 @@ list->Append(*CSSIdentifierValue::Create(CSSValueID::kAuto)); list->Append(*ratio_value); - style->SetProperty(CSSPropertyID::kAspectRatio, *list); + style.emplace_back(CSSPropertyName(CSSPropertyID::kAspectRatio), *list); } void HTMLElement::ApplyAlignmentAttributeToStyle( const AtomicString& alignment, - MutableCSSPropertyValueSet* style) { + HeapVector<CSSPropertyValue, 8>& style) { // Vertical alignment with respect to the current baseline of the text // right or left means floating images. CSSValueID float_value = CSSValueID::kInvalid; @@ -1458,7 +1460,8 @@ void HTMLElement::ShowPopoverInternal(Element* invoker, ExceptionState* exception_state) { if (!IsPopoverReady(PopoverTriggerAction::kShow, exception_state, - /*include_event_handler_text=*/false, /*document=*/nullptr)) { + /*include_event_handler_text=*/false, + /*document=*/nullptr)) { CHECK(exception_state) << " Callers which aren't supposed to throw exceptions should not call " "ShowPopoverInternal when the Popover isn't in a valid state to be " @@ -1789,7 +1792,8 @@ HidePopoverTransitionBehavior transition_behavior, ExceptionState* exception_state) { if (!IsPopoverReady(PopoverTriggerAction::kHide, exception_state, - /*include_event_handler_text=*/true, /*document=*/nullptr)) { + /*include_event_handler_text=*/true, + /*document=*/nullptr)) { return; } auto& document = GetDocument(); @@ -2747,7 +2751,7 @@ Element::DidMoveToNewDocument(old_document); } -void HTMLElement::AddHTMLLengthToStyle(MutableCSSPropertyValueSet* style, +void HTMLElement::AddHTMLLengthToStyle(HeapVector<CSSPropertyValue, 8>& style, CSSPropertyID property_id, const String& value, AllowPercentage allow_percentage, @@ -2876,18 +2880,20 @@ return success; } -void HTMLElement::AddHTMLColorToStyle(MutableCSSPropertyValueSet* style, +void HTMLElement::AddHTMLColorToStyle(HeapVector<CSSPropertyValue, 8>& style, CSSPropertyID property_id, const String& attribute_value) { Color parsed_color; if (!ParseColorWithLegacyRules(attribute_value, parsed_color)) return; - style->SetProperty(property_id, *cssvalue::CSSColor::Create(parsed_color)); + DCHECK(!CSSProperty::Get(property_id).IsShorthand()); + style.emplace_back(CSSPropertyName(property_id), + *cssvalue::CSSColor::Create(parsed_color)); } void HTMLElement::AddHTMLBackgroundImageToStyle( - MutableCSSPropertyValueSet* style, + HeapVector<CSSPropertyValue, 8>& style, const String& url_value, const AtomicString& initiator_name) { String url = StripLeadingAndTrailingHTMLSpaces(url_value); @@ -2902,7 +2908,7 @@ if (initiator_name) { image_value->SetInitiator(initiator_name); } - style->SetLonghandProperty(CSSPropertyValue( + style.emplace_back(CSSPropertyValue( CSSPropertyName(CSSPropertyID::kBackgroundImage), *image_value)); }
diff --git a/third_party/blink/renderer/core/html/html_element.h b/third_party/blink/renderer/core/html/html_element.h index 5002cbaf..9d6b4c7ff 100644 --- a/third_party/blink/renderer/core/html/html_element.h +++ b/third_party/blink/renderer/core/html/html_element.h
@@ -108,7 +108,6 @@ DEFINE_WRAPPERTYPEINFO(); public: - HTMLElement(const QualifiedName& tag_name, Document&, ConstructionType); bool HasTagName(const HTMLQualifiedName& name) const { @@ -338,16 +337,16 @@ enum AllowPercentage { kDontAllowPercentageValues, kAllowPercentageValues }; enum AllowZero { kDontAllowZeroValues, kAllowZeroValues }; - void AddHTMLLengthToStyle(MutableCSSPropertyValueSet*, + void AddHTMLLengthToStyle(HeapVector<CSSPropertyValue, 8>&, CSSPropertyID, const String& value, AllowPercentage = kAllowPercentageValues, AllowZero = kAllowZeroValues); - void AddHTMLColorToStyle(MutableCSSPropertyValueSet*, + void AddHTMLColorToStyle(HeapVector<CSSPropertyValue, 8>&, CSSPropertyID, const String& color); void AddHTMLBackgroundImageToStyle( - MutableCSSPropertyValueSet*, + HeapVector<CSSPropertyValue, 8>&, const String& url_value, const AtomicString& initiator_name = g_null_atom); @@ -357,18 +356,18 @@ // https://html.spec.whatwg.org/multipage/rendering.html#map-to-the-aspect-ratio-property-(using-dimension-rules) void ApplyAspectRatioToStyle(const AtomicString& width, const AtomicString& height, - MutableCSSPropertyValueSet*); + HeapVector<CSSPropertyValue, 8>&); // This corresponds to: // 'map to the aspect-ratio property' // described by: // https://html.spec.whatwg.org/multipage/rendering.html#map-to-the-aspect-ratio-property void ApplyIntegerAspectRatioToStyle(const AtomicString& width, const AtomicString& height, - MutableCSSPropertyValueSet*); + HeapVector<CSSPropertyValue, 8>&); void ApplyAlignmentAttributeToStyle(const AtomicString&, - MutableCSSPropertyValueSet*); + HeapVector<CSSPropertyValue, 8>&); void ApplyBorderAttributeToStyle(const AtomicString&, - MutableCSSPropertyValueSet*); + HeapVector<CSSPropertyValue, 8>&); void AttributeChanged(const AttributeModificationParams&) override; void ParseAttribute(const AttributeModificationParams&) override; @@ -378,7 +377,7 @@ void CollectStyleForPresentationAttribute( const QualifiedName&, const AtomicString&, - MutableCSSPropertyValueSet*) override; + HeapVector<CSSPropertyValue, 8>&) override; unsigned ParseBorderWidthAttribute(const AtomicString&) const; InsertionNotificationRequest InsertedInto(ContainerNode&) override; @@ -396,7 +395,7 @@ void ApplyAspectRatioToStyle(double width, double height, - MutableCSSPropertyValueSet* style); + HeapVector<CSSPropertyValue, 8>& style); DocumentFragment* TextToFragment(const String&, ExceptionState&);
diff --git a/third_party/blink/renderer/core/html/html_embed_element.cc b/third_party/blink/renderer/core/html/html_embed_element.cc index 52229869..97f0570 100644 --- a/third_party/blink/renderer/core/html/html_embed_element.cc +++ b/third_party/blink/renderer/core/html/html_embed_element.cc
@@ -76,7 +76,7 @@ void HTMLEmbedElement::CollectStyleForPresentationAttribute( const QualifiedName& name, const AtomicString& value, - MutableCSSPropertyValueSet* style) { + HeapVector<CSSPropertyValue, 8>& style) { if (name == html_names::kHiddenAttr) { AddPropertyToPresentationAttributeStyle( style, CSSPropertyID::kWidth, 0, CSSPrimitiveValue::UnitType::kPixels);
diff --git a/third_party/blink/renderer/core/html/html_embed_element.h b/third_party/blink/renderer/core/html/html_embed_element.h index 13fc41a..46e04410 100644 --- a/third_party/blink/renderer/core/html/html_embed_element.h +++ b/third_party/blink/renderer/core/html/html_embed_element.h
@@ -49,7 +49,7 @@ void CollectStyleForPresentationAttribute( const QualifiedName&, const AtomicString&, - MutableCSSPropertyValueSet*) override; + HeapVector<CSSPropertyValue, 8>&) override; bool LayoutObjectIsNeeded(const DisplayStyle&) const override;
diff --git a/third_party/blink/renderer/core/html/html_font_element.cc b/third_party/blink/renderer/core/html/html_font_element.cc index 52d5072..7ebee421 100644 --- a/third_party/blink/renderer/core/html/html_font_element.cc +++ b/third_party/blink/renderer/core/html/html_font_element.cc
@@ -166,7 +166,7 @@ void HTMLFontElement::CollectStyleForPresentationAttribute( const QualifiedName& name, const AtomicString& value, - MutableCSSPropertyValueSet* style) { + HeapVector<CSSPropertyValue, 8>& style) { if (name == html_names::kSizeAttr) { if (std::optional<CSSValueID> size_keyword = CssValueFromFontSizeNumber(value)) { @@ -178,8 +178,8 @@ } else if (name == html_names::kFaceAttr && !value.empty()) { if (const CSSValueList* font_face_value = CreateFontFaceValueWithPool( value, GetExecutionContext()->GetSecureContextMode())) { - style->SetLonghandProperty(CSSPropertyValue( - CSSPropertyName(CSSPropertyID::kFontFamily), *font_face_value)); + style.emplace_back(CSSPropertyName(CSSPropertyID::kFontFamily), + *font_face_value); } } else { HTMLElement::CollectStyleForPresentationAttribute(name, value, style);
diff --git a/third_party/blink/renderer/core/html/html_font_element.h b/third_party/blink/renderer/core/html/html_font_element.h index 91db38a..581dd7bf 100644 --- a/third_party/blink/renderer/core/html/html_font_element.h +++ b/third_party/blink/renderer/core/html/html_font_element.h
@@ -41,7 +41,7 @@ void CollectStyleForPresentationAttribute( const QualifiedName&, const AtomicString&, - MutableCSSPropertyValueSet*) override; + HeapVector<CSSPropertyValue, 8>&) override; }; } // namespace blink
diff --git a/third_party/blink/renderer/core/html/html_frame_set_element.cc b/third_party/blink/renderer/core/html/html_frame_set_element.cc index 2fcbe60..48f582e 100644 --- a/third_party/blink/renderer/core/html/html_frame_set_element.cc +++ b/third_party/blink/renderer/core/html/html_frame_set_element.cc
@@ -84,10 +84,13 @@ void HTMLFrameSetElement::CollectStyleForPresentationAttribute( const QualifiedName& name, const AtomicString& value, - MutableCSSPropertyValueSet* style) { - if (name == html_names::kBordercolorAttr) - AddHTMLColorToStyle(style, CSSPropertyID::kBorderColor, value); - else + HeapVector<CSSPropertyValue, 8>& style) { + if (name == html_names::kBordercolorAttr) { + AddHTMLColorToStyle(style, CSSPropertyID::kBorderLeftColor, value); + AddHTMLColorToStyle(style, CSSPropertyID::kBorderRightColor, value); + AddHTMLColorToStyle(style, CSSPropertyID::kBorderBottomColor, value); + AddHTMLColorToStyle(style, CSSPropertyID::kBorderTopColor, value); + } else HTMLElement::CollectStyleForPresentationAttribute(name, value, style); }
diff --git a/third_party/blink/renderer/core/html/html_frame_set_element.h b/third_party/blink/renderer/core/html/html_frame_set_element.h index 36d7033..22bb7f42 100644 --- a/third_party/blink/renderer/core/html/html_frame_set_element.h +++ b/third_party/blink/renderer/core/html/html_frame_set_element.h
@@ -89,7 +89,7 @@ void CollectStyleForPresentationAttribute( const QualifiedName&, const AtomicString&, - MutableCSSPropertyValueSet*) override; + HeapVector<CSSPropertyValue, 8>&) override; void AttachLayoutTree(AttachContext&) override; bool LayoutObjectIsNeeded(const DisplayStyle&) const override;
diff --git a/third_party/blink/renderer/core/html/html_hr_element.cc b/third_party/blink/renderer/core/html/html_hr_element.cc index 03a55b0..a7bf255 100644 --- a/third_party/blink/renderer/core/html/html_hr_element.cc +++ b/third_party/blink/renderer/core/html/html_hr_element.cc
@@ -46,7 +46,7 @@ void HTMLHRElement::CollectStyleForPresentationAttribute( const QualifiedName& name, const AtomicString& value, - MutableCSSPropertyValueSet* style) { + HeapVector<CSSPropertyValue, 8>& style) { if (name == html_names::kAlignAttr) { if (EqualIgnoringASCIICase(value, "left")) { AddPropertyToPresentationAttributeStyle( @@ -87,7 +87,10 @@ AddPropertyToPresentationAttributeStyle(style, property_id, CSSValueID::kSolid); } - AddHTMLColorToStyle(style, CSSPropertyID::kBorderColor, value); + AddHTMLColorToStyle(style, CSSPropertyID::kBorderLeftColor, value); + AddHTMLColorToStyle(style, CSSPropertyID::kBorderRightColor, value); + AddHTMLColorToStyle(style, CSSPropertyID::kBorderBottomColor, value); + AddHTMLColorToStyle(style, CSSPropertyID::kBorderTopColor, value); AddHTMLColorToStyle(style, CSSPropertyID::kBackgroundColor, value); } else if (name == html_names::kNoshadeAttr) { if (!FastHasAttribute(html_names::kColorAttr)) { @@ -101,8 +104,16 @@ const cssvalue::CSSColor& dark_gray_value = *cssvalue::CSSColor::Create(Color::kDarkGray); - style->SetProperty(CSSPropertyID::kBorderColor, dark_gray_value); - style->SetProperty(CSSPropertyID::kBackgroundColor, dark_gray_value); + style.emplace_back(CSSPropertyName(CSSPropertyID::kBorderLeftColor), + dark_gray_value); + style.emplace_back(CSSPropertyName(CSSPropertyID::kBorderRightColor), + dark_gray_value); + style.emplace_back(CSSPropertyName(CSSPropertyID::kBorderBottomColor), + dark_gray_value); + style.emplace_back(CSSPropertyName(CSSPropertyID::kBorderTopColor), + dark_gray_value); + style.emplace_back(CSSPropertyName(CSSPropertyID::kBackgroundColor), + dark_gray_value); } } else if (name == html_names::kSizeAttr) { int size = value.ToInt();
diff --git a/third_party/blink/renderer/core/html/html_hr_element.h b/third_party/blink/renderer/core/html/html_hr_element.h index 0dfac4b..b69d5c4c 100644 --- a/third_party/blink/renderer/core/html/html_hr_element.h +++ b/third_party/blink/renderer/core/html/html_hr_element.h
@@ -46,7 +46,7 @@ void CollectStyleForPresentationAttribute( const QualifiedName&, const AtomicString&, - MutableCSSPropertyValueSet*) override; + HeapVector<CSSPropertyValue, 8>&) override; InsertionNotificationRequest InsertedInto(ContainerNode&) override; void RemovedFrom(ContainerNode&) override; };
diff --git a/third_party/blink/renderer/core/html/html_iframe_element.cc b/third_party/blink/renderer/core/html/html_iframe_element.cc index 9c461739..59c1354 100644 --- a/third_party/blink/renderer/core/html/html_iframe_element.cc +++ b/third_party/blink/renderer/core/html/html_iframe_element.cc
@@ -136,7 +136,7 @@ void HTMLIFrameElement::CollectStyleForPresentationAttribute( const QualifiedName& name, const AtomicString& value, - MutableCSSPropertyValueSet* style) { + HeapVector<CSSPropertyValue, 8>& style) { if (name == html_names::kWidthAttr) { AddHTMLLengthToStyle(style, CSSPropertyID::kWidth, value); } else if (name == html_names::kHeightAttr) {
diff --git a/third_party/blink/renderer/core/html/html_iframe_element.h b/third_party/blink/renderer/core/html/html_iframe_element.h index 74af7e9c..3ff8625 100644 --- a/third_party/blink/renderer/core/html/html_iframe_element.h +++ b/third_party/blink/renderer/core/html/html_iframe_element.h
@@ -71,7 +71,7 @@ void CollectStyleForPresentationAttribute( const QualifiedName&, const AtomicString&, - MutableCSSPropertyValueSet*) override; + HeapVector<CSSPropertyValue, 8>&) override; InsertionNotificationRequest InsertedInto(ContainerNode&) override; void RemovedFrom(ContainerNode&) override;
diff --git a/third_party/blink/renderer/core/html/html_image_element.cc b/third_party/blink/renderer/core/html/html_image_element.cc index b7806141..72ca319 100644 --- a/third_party/blink/renderer/core/html/html_image_element.cc +++ b/third_party/blink/renderer/core/html/html_image_element.cc
@@ -179,7 +179,7 @@ void HTMLImageElement::CollectStyleForPresentationAttribute( const QualifiedName& name, const AtomicString& value, - MutableCSSPropertyValueSet* style) { + HeapVector<CSSPropertyValue, 8>& style) { if (name == html_names::kWidthAttr) { AddHTMLLengthToStyle(style, CSSPropertyID::kWidth, value); if (FastHasAttribute(html_names::kHeightAttr)) { @@ -211,7 +211,7 @@ } void HTMLImageElement::CollectExtraStyleForPresentationAttribute( - MutableCSSPropertyValueSet* style) { + HeapVector<CSSPropertyValue, 8>& style) { if (!source_) return;
diff --git a/third_party/blink/renderer/core/html/html_image_element.h b/third_party/blink/renderer/core/html/html_image_element.h index 4f44d3d..4987b0c 100644 --- a/third_party/blink/renderer/core/html/html_image_element.h +++ b/third_party/blink/renderer/core/html/html_image_element.h
@@ -226,13 +226,13 @@ void CollectStyleForPresentationAttribute( const QualifiedName&, const AtomicString&, - MutableCSSPropertyValueSet*) override; + HeapVector<CSSPropertyValue, 8>&) override; // For mapping attributes from the <source> element, if any. bool HasExtraStyleForPresentationAttribute() const override { return source_ != nullptr; } void CollectExtraStyleForPresentationAttribute( - MutableCSSPropertyValueSet*) override; + HeapVector<CSSPropertyValue, 8>&) override; void SetLayoutDisposition(LayoutDisposition, bool force_reattach = false); void AttachLayoutTree(AttachContext&) override;
diff --git a/third_party/blink/renderer/core/html/html_li_element.cc b/third_party/blink/renderer/core/html/html_li_element.cc index 1363583..c2f66f1d 100644 --- a/third_party/blink/renderer/core/html/html_li_element.cc +++ b/third_party/blink/renderer/core/html/html_li_element.cc
@@ -69,7 +69,7 @@ void HTMLLIElement::CollectStyleForPresentationAttribute( const QualifiedName& name, const AtomicString& value, - MutableCSSPropertyValueSet* style) { + HeapVector<CSSPropertyValue, 8>& style) { if (name == html_names::kTypeAttr) { if (EqualIgnoringASCIICase(value, "none")) { AddPropertyToPresentationAttributeStyle(
diff --git a/third_party/blink/renderer/core/html/html_li_element.h b/third_party/blink/renderer/core/html/html_li_element.h index 73eb214..b6b487d3 100644 --- a/third_party/blink/renderer/core/html/html_li_element.h +++ b/third_party/blink/renderer/core/html/html_li_element.h
@@ -41,7 +41,7 @@ void CollectStyleForPresentationAttribute( const QualifiedName&, const AtomicString&, - MutableCSSPropertyValueSet*) override; + HeapVector<CSSPropertyValue, 8>&) override; void AttachLayoutTree(AttachContext&) override;
diff --git a/third_party/blink/renderer/core/html/html_marquee_element.cc b/third_party/blink/renderer/core/html/html_marquee_element.cc index f5a3e420..55f5f0f 100644 --- a/third_party/blink/renderer/core/html/html_marquee_element.cc +++ b/third_party/blink/renderer/core/html/html_marquee_element.cc
@@ -219,7 +219,7 @@ void HTMLMarqueeElement::CollectStyleForPresentationAttribute( const QualifiedName& attr, const AtomicString& value, - MutableCSSPropertyValueSet* style) { + HeapVector<CSSPropertyValue, 8>& style) { if (attr == html_names::kBgcolorAttr) { AddHTMLColorToStyle(style, CSSPropertyID::kBackgroundColor, value); } else if (attr == html_names::kHeightAttr) {
diff --git a/third_party/blink/renderer/core/html/html_marquee_element.h b/third_party/blink/renderer/core/html/html_marquee_element.h index 87013d5..4fae128c2c 100644 --- a/third_party/blink/renderer/core/html/html_marquee_element.h +++ b/third_party/blink/renderer/core/html/html_marquee_element.h
@@ -61,7 +61,7 @@ void CollectStyleForPresentationAttribute( const QualifiedName&, const AtomicString&, - MutableCSSPropertyValueSet*) override; + HeapVector<CSSPropertyValue, 8>&) override; class RequestAnimationFrameCallback; class AnimationFinished;
diff --git a/third_party/blink/renderer/core/html/html_object_element.cc b/third_party/blink/renderer/core/html/html_object_element.cc index 77ee7434..462e4e2d 100644 --- a/third_party/blink/renderer/core/html/html_object_element.cc +++ b/third_party/blink/renderer/core/html/html_object_element.cc
@@ -83,7 +83,7 @@ void HTMLObjectElement::CollectStyleForPresentationAttribute( const QualifiedName& name, const AtomicString& value, - MutableCSSPropertyValueSet* style) { + HeapVector<CSSPropertyValue, 8>& style) { if (name == html_names::kBorderAttr) ApplyBorderAttributeToStyle(value, style); else
diff --git a/third_party/blink/renderer/core/html/html_object_element.h b/third_party/blink/renderer/core/html/html_object_element.h index fde9fcbb..3108e3c 100644 --- a/third_party/blink/renderer/core/html/html_object_element.h +++ b/third_party/blink/renderer/core/html/html_object_element.h
@@ -100,7 +100,7 @@ void CollectStyleForPresentationAttribute( const QualifiedName&, const AtomicString&, - MutableCSSPropertyValueSet*) override; + HeapVector<CSSPropertyValue, 8>&) override; InsertionNotificationRequest InsertedInto(ContainerNode&) override; void RemovedFrom(ContainerNode&) override;
diff --git a/third_party/blink/renderer/core/html/html_olist_element.cc b/third_party/blink/renderer/core/html/html_olist_element.cc index 1bb81305..f69a081 100644 --- a/third_party/blink/renderer/core/html/html_olist_element.cc +++ b/third_party/blink/renderer/core/html/html_olist_element.cc
@@ -50,7 +50,7 @@ void HTMLOListElement::CollectStyleForPresentationAttribute( const QualifiedName& name, const AtomicString& value, - MutableCSSPropertyValueSet* style) { + HeapVector<CSSPropertyValue, 8>& style) { if (name == html_names::kTypeAttr) { if (value == "a") { AddPropertyToPresentationAttributeStyle(
diff --git a/third_party/blink/renderer/core/html/html_olist_element.h b/third_party/blink/renderer/core/html/html_olist_element.h index a55fa7b1..7327ae9 100644 --- a/third_party/blink/renderer/core/html/html_olist_element.h +++ b/third_party/blink/renderer/core/html/html_olist_element.h
@@ -59,7 +59,7 @@ void CollectStyleForPresentationAttribute( const QualifiedName&, const AtomicString&, - MutableCSSPropertyValueSet*) override; + HeapVector<CSSPropertyValue, 8>&) override; int start_; unsigned item_count_;
diff --git a/third_party/blink/renderer/core/html/html_paragraph_element.cc b/third_party/blink/renderer/core/html/html_paragraph_element.cc index 938e28b..8265d54 100644 --- a/third_party/blink/renderer/core/html/html_paragraph_element.cc +++ b/third_party/blink/renderer/core/html/html_paragraph_element.cc
@@ -34,7 +34,7 @@ void HTMLParagraphElement::CollectStyleForPresentationAttribute( const QualifiedName& name, const AtomicString& value, - MutableCSSPropertyValueSet* style) { + HeapVector<CSSPropertyValue, 8>& style) { if (name == html_names::kAlignAttr) { if (EqualIgnoringASCIICase(value, "middle") || EqualIgnoringASCIICase(value, "center")) {
diff --git a/third_party/blink/renderer/core/html/html_paragraph_element.h b/third_party/blink/renderer/core/html/html_paragraph_element.h index c18a38a..48b98f9a 100644 --- a/third_party/blink/renderer/core/html/html_paragraph_element.h +++ b/third_party/blink/renderer/core/html/html_paragraph_element.h
@@ -38,7 +38,7 @@ void CollectStyleForPresentationAttribute( const QualifiedName&, const AtomicString&, - MutableCSSPropertyValueSet*) override; + HeapVector<CSSPropertyValue, 8>&) override; }; } // namespace blink
diff --git a/third_party/blink/renderer/core/html/html_permission_element.cc b/third_party/blink/renderer/core/html/html_permission_element.cc index 1a0fd37..7ef2c6b 100644 --- a/third_party/blink/renderer/core/html/html_permission_element.cc +++ b/third_party/blink/renderer/core/html/html_permission_element.cc
@@ -24,6 +24,7 @@ #include "third_party/blink/renderer/core/css/properties/longhands.h" #include "third_party/blink/renderer/core/css/resolver/style_resolver.h" #include "third_party/blink/renderer/core/css/style_change_reason.h" +#include "third_party/blink/renderer/core/dom/dom_node_ids.h" #include "third_party/blink/renderer/core/dom/element.h" #include "third_party/blink/renderer/core/dom/events/event.h" #include "third_party/blink/renderer/core/dom/focus_params.h"
diff --git a/third_party/blink/renderer/core/html/html_plugin_element.cc b/third_party/blink/renderer/core/html/html_plugin_element.cc index 450fc24..4ada671d 100644 --- a/third_party/blink/renderer/core/html/html_plugin_element.cc +++ b/third_party/blink/renderer/core/html/html_plugin_element.cc
@@ -476,8 +476,7 @@ v8::Local<v8::String> v8_name = V8AtomicString(script_state->GetIsolate(), name); v8::Local<v8::Object> this_wrapper = - ToV8Traits<HTMLPlugInElement>::ToV8(script_state, this) - .As<v8::Object>(); + ToV8Traits<HTMLPlugInElement>::ToV8(script_state, this).As<v8::Object>(); bool instance_has_property; bool holder_has_property; if (!instance->HasOwnProperty(context, v8_name).To(&instance_has_property) || @@ -529,7 +528,7 @@ void HTMLPlugInElement::CollectStyleForPresentationAttribute( const QualifiedName& name, const AtomicString& value, - MutableCSSPropertyValueSet* style) { + HeapVector<CSSPropertyValue, 8>& style) { if (name == html_names::kWidthAttr) { AddHTMLLengthToStyle(style, CSSPropertyID::kWidth, value); } else if (name == html_names::kHeightAttr) {
diff --git a/third_party/blink/renderer/core/html/html_plugin_element.h b/third_party/blink/renderer/core/html/html_plugin_element.h index 679f1cf..243bcf67 100644 --- a/third_party/blink/renderer/core/html/html_plugin_element.h +++ b/third_party/blink/renderer/core/html/html_plugin_element.h
@@ -108,7 +108,7 @@ void CollectStyleForPresentationAttribute( const QualifiedName&, const AtomicString&, - MutableCSSPropertyValueSet*) override; + HeapVector<CSSPropertyValue, 8>&) override; // HTMLFrameOwnerElement overrides: void DisconnectContentFrame() override; void IntrinsicSizingInfoChanged() final;
diff --git a/third_party/blink/renderer/core/html/html_pre_element.cc b/third_party/blink/renderer/core/html/html_pre_element.cc index 2ace1a4..03ef7020 100644 --- a/third_party/blink/renderer/core/html/html_pre_element.cc +++ b/third_party/blink/renderer/core/html/html_pre_element.cc
@@ -42,12 +42,13 @@ void HTMLPreElement::CollectStyleForPresentationAttribute( const QualifiedName& name, const AtomicString& value, - MutableCSSPropertyValueSet* style) { + HeapVector<CSSPropertyValue, 8>& style) { if (name == html_names::kWrapAttr) { // Longhands of `white-space: pre-wrap`. - style->SetLonghandProperty(CSSPropertyID::kWhiteSpaceCollapse, - CSSValueID::kPreserve); - style->SetLonghandProperty(CSSPropertyID::kTextWrapMode, CSSValueID::kWrap); + AddPropertyToPresentationAttributeStyle( + style, CSSPropertyID::kWhiteSpaceCollapse, CSSValueID::kPreserve); + AddPropertyToPresentationAttributeStyle(style, CSSPropertyID::kTextWrapMode, + CSSValueID::kWrap); } else { HTMLElement::CollectStyleForPresentationAttribute(name, value, style); }
diff --git a/third_party/blink/renderer/core/html/html_pre_element.h b/third_party/blink/renderer/core/html/html_pre_element.h index ff6b0ec..bb3e1dbf 100644 --- a/third_party/blink/renderer/core/html/html_pre_element.h +++ b/third_party/blink/renderer/core/html/html_pre_element.h
@@ -31,7 +31,6 @@ DEFINE_WRAPPERTYPEINFO(); public: - HTMLPreElement(const QualifiedName&, Document&); private: @@ -39,7 +38,7 @@ void CollectStyleForPresentationAttribute( const QualifiedName&, const AtomicString&, - MutableCSSPropertyValueSet*) override; + HeapVector<CSSPropertyValue, 8>&) override; }; } // namespace blink
diff --git a/third_party/blink/renderer/core/html/html_table_caption_element.cc b/third_party/blink/renderer/core/html/html_table_caption_element.cc index 5f6f235..442f76d 100644 --- a/third_party/blink/renderer/core/html/html_table_caption_element.cc +++ b/third_party/blink/renderer/core/html/html_table_caption_element.cc
@@ -35,7 +35,7 @@ void HTMLTableCaptionElement::CollectStyleForPresentationAttribute( const QualifiedName& name, const AtomicString& value, - MutableCSSPropertyValueSet* style) { + HeapVector<CSSPropertyValue, 8>& style) { if (name == html_names::kAlignAttr) { if (!value.empty()) { AddPropertyToPresentationAttributeStyle(
diff --git a/third_party/blink/renderer/core/html/html_table_caption_element.h b/third_party/blink/renderer/core/html/html_table_caption_element.h index 6e666ef4..b204cef 100644 --- a/third_party/blink/renderer/core/html/html_table_caption_element.h +++ b/third_party/blink/renderer/core/html/html_table_caption_element.h
@@ -42,7 +42,7 @@ void CollectStyleForPresentationAttribute( const QualifiedName&, const AtomicString&, - MutableCSSPropertyValueSet*) override; + HeapVector<CSSPropertyValue, 8>&) override; }; } // namespace blink
diff --git a/third_party/blink/renderer/core/html/html_table_cell_element.cc b/third_party/blink/renderer/core/html/html_table_cell_element.cc index 3f654d31e..ba513e7 100644 --- a/third_party/blink/renderer/core/html/html_table_cell_element.cc +++ b/third_party/blink/renderer/core/html/html_table_cell_element.cc
@@ -87,7 +87,7 @@ void HTMLTableCellElement::CollectStyleForPresentationAttribute( const QualifiedName& name, const AtomicString& value, - MutableCSSPropertyValueSet* style) { + HeapVector<CSSPropertyValue, 8>& style) { if (name == html_names::kNowrapAttr) { // Longhands of `white-space: nowrap`. AddPropertyToPresentationAttributeStyle(
diff --git a/third_party/blink/renderer/core/html/html_table_cell_element.h b/third_party/blink/renderer/core/html/html_table_cell_element.h index 72bc44c..a9da62a 100644 --- a/third_party/blink/renderer/core/html/html_table_cell_element.h +++ b/third_party/blink/renderer/core/html/html_table_cell_element.h
@@ -35,7 +35,6 @@ DEFINE_WRAPPERTYPEINFO(); public: - HTMLTableCellElement(const QualifiedName&, Document&); int cellIndex() const; @@ -59,7 +58,7 @@ void CollectStyleForPresentationAttribute( const QualifiedName&, const AtomicString&, - MutableCSSPropertyValueSet*) override; + HeapVector<CSSPropertyValue, 8>&) override; const CSSPropertyValueSet* AdditionalPresentationAttributeStyle() override; bool IsURLAttribute(const Attribute&) const override;
diff --git a/third_party/blink/renderer/core/html/html_table_col_element.cc b/third_party/blink/renderer/core/html/html_table_col_element.cc index c8da89f..8bc5cf53 100644 --- a/third_party/blink/renderer/core/html/html_table_col_element.cc +++ b/third_party/blink/renderer/core/html/html_table_col_element.cc
@@ -49,7 +49,7 @@ void HTMLTableColElement::CollectStyleForPresentationAttribute( const QualifiedName& name, const AtomicString& value, - MutableCSSPropertyValueSet* style) { + HeapVector<CSSPropertyValue, 8>& style) { if (name == html_names::kWidthAttr) AddHTMLLengthToStyle(style, CSSPropertyID::kWidth, value); else
diff --git a/third_party/blink/renderer/core/html/html_table_col_element.h b/third_party/blink/renderer/core/html/html_table_col_element.h index 3725943..d137879 100644 --- a/third_party/blink/renderer/core/html/html_table_col_element.h +++ b/third_party/blink/renderer/core/html/html_table_col_element.h
@@ -50,7 +50,7 @@ void CollectStyleForPresentationAttribute( const QualifiedName&, const AtomicString&, - MutableCSSPropertyValueSet*) override; + HeapVector<CSSPropertyValue, 8>&) override; const CSSPropertyValueSet* AdditionalPresentationAttributeStyle() override; unsigned span_;
diff --git a/third_party/blink/renderer/core/html/html_table_element.cc b/third_party/blink/renderer/core/html/html_table_element.cc index c90a4db..4d0bafa 100644 --- a/third_party/blink/renderer/core/html/html_table_element.cc +++ b/third_party/blink/renderer/core/html/html_table_element.cc
@@ -307,7 +307,7 @@ void HTMLTableElement::CollectStyleForPresentationAttribute( const QualifiedName& name, const AtomicString& value, - MutableCSSPropertyValueSet* style) { + HeapVector<CSSPropertyValue, 8>& style) { if (name == html_names::kWidthAttr) { AddHTMLLengthToStyle(style, CSSPropertyID::kWidth, value, kAllowPercentageValues, kDontAllowZeroValues); @@ -328,8 +328,12 @@ style, CSSPropertyID::kBorderRightWidth, width, CSSPrimitiveValue::UnitType::kPixels); } else if (name == html_names::kBordercolorAttr) { - if (!value.empty()) - AddHTMLColorToStyle(style, CSSPropertyID::kBorderColor, value); + if (!value.empty()) { + AddHTMLColorToStyle(style, CSSPropertyID::kBorderLeftColor, value); + AddHTMLColorToStyle(style, CSSPropertyID::kBorderRightColor, value); + AddHTMLColorToStyle(style, CSSPropertyID::kBorderBottomColor, value); + AddHTMLColorToStyle(style, CSSPropertyID::kBorderTopColor, value); + } } else if (name == html_names::kBgcolorAttr) { AddHTMLColorToStyle(style, CSSPropertyID::kBackgroundColor, value); } else if (name == html_names::kBackgroundAttr) {
diff --git a/third_party/blink/renderer/core/html/html_table_element.h b/third_party/blink/renderer/core/html/html_table_element.h index fbd46cdb..9b7d81c 100644 --- a/third_party/blink/renderer/core/html/html_table_element.h +++ b/third_party/blink/renderer/core/html/html_table_element.h
@@ -82,7 +82,7 @@ void CollectStyleForPresentationAttribute( const QualifiedName&, const AtomicString&, - MutableCSSPropertyValueSet*) override; + HeapVector<CSSPropertyValue, 8>&) override; bool IsURLAttribute(const Attribute&) const override; bool HasLegalLinkAttribute(const QualifiedName&) const override;
diff --git a/third_party/blink/renderer/core/html/html_table_part_element.cc b/third_party/blink/renderer/core/html/html_table_part_element.cc index 0cf0e2d..d68e039 100644 --- a/third_party/blink/renderer/core/html/html_table_part_element.cc +++ b/third_party/blink/renderer/core/html/html_table_part_element.cc
@@ -51,7 +51,7 @@ void HTMLTablePartElement::CollectStyleForPresentationAttribute( const QualifiedName& name, const AtomicString& value, - MutableCSSPropertyValueSet* style) { + HeapVector<CSSPropertyValue, 8>& style) { if (name == html_names::kBgcolorAttr) { AddHTMLColorToStyle(style, CSSPropertyID::kBackgroundColor, value); } else if (name == html_names::kBackgroundAttr) {
diff --git a/third_party/blink/renderer/core/html/html_table_part_element.h b/third_party/blink/renderer/core/html/html_table_part_element.h index b960cf5..6484809 100644 --- a/third_party/blink/renderer/core/html/html_table_part_element.h +++ b/third_party/blink/renderer/core/html/html_table_part_element.h
@@ -42,7 +42,7 @@ void CollectStyleForPresentationAttribute( const QualifiedName&, const AtomicString&, - MutableCSSPropertyValueSet*) override; + HeapVector<CSSPropertyValue, 8>&) override; HTMLTableElement* FindParentTable() const; };
diff --git a/third_party/blink/renderer/core/html/html_ulist_element.cc b/third_party/blink/renderer/core/html/html_ulist_element.cc index 17c26625..486d93a 100644 --- a/third_party/blink/renderer/core/html/html_ulist_element.cc +++ b/third_party/blink/renderer/core/html/html_ulist_element.cc
@@ -43,7 +43,7 @@ void HTMLUListElement::CollectStyleForPresentationAttribute( const QualifiedName& name, const AtomicString& value, - MutableCSSPropertyValueSet* style) { + HeapVector<CSSPropertyValue, 8>& style) { if (name == html_names::kTypeAttr) { if (EqualIgnoringASCIICase(value, keywords::kDisc)) { AddPropertyToPresentationAttributeStyle(
diff --git a/third_party/blink/renderer/core/html/html_ulist_element.h b/third_party/blink/renderer/core/html/html_ulist_element.h index 3f28111..bb18076e 100644 --- a/third_party/blink/renderer/core/html/html_ulist_element.h +++ b/third_party/blink/renderer/core/html/html_ulist_element.h
@@ -38,7 +38,7 @@ void CollectStyleForPresentationAttribute( const QualifiedName&, const AtomicString&, - MutableCSSPropertyValueSet*) override; + HeapVector<CSSPropertyValue, 8>&) override; }; } // namespace blink
diff --git a/third_party/blink/renderer/core/html/media/html_video_element.cc b/third_party/blink/renderer/core/html/media/html_video_element.cc index 0e2809ab..af6d1e7d 100644 --- a/third_party/blink/renderer/core/html/media/html_video_element.cc +++ b/third_party/blink/renderer/core/html/media/html_video_element.cc
@@ -186,7 +186,7 @@ void HTMLVideoElement::CollectStyleForPresentationAttribute( const QualifiedName& name, const AtomicString& value, - MutableCSSPropertyValueSet* style) { + HeapVector<CSSPropertyValue, 8>& style) { if (name == html_names::kWidthAttr) { AddHTMLLengthToStyle(style, CSSPropertyID::kWidth, value); const AtomicString& height = FastGetAttribute(html_names::kHeightAttr);
diff --git a/third_party/blink/renderer/core/html/media/html_video_element.h b/third_party/blink/renderer/core/html/media/html_video_element.h index b9443b05..4875caa 100644 --- a/third_party/blink/renderer/core/html/media/html_video_element.h +++ b/third_party/blink/renderer/core/html/media/html_video_element.h
@@ -200,7 +200,7 @@ void CollectStyleForPresentationAttribute( const QualifiedName&, const AtomicString&, - MutableCSSPropertyValueSet*) override; + HeapVector<CSSPropertyValue, 8>&) override; bool IsURLAttribute(const Attribute&) const override; const AtomicString ImageSourceURL() const override;
diff --git a/third_party/blink/renderer/core/inspector/inspector_css_agent.cc b/third_party/blink/renderer/core/inspector/inspector_css_agent.cc index eaa297c..3acb3bf 100644 --- a/third_party/blink/renderer/core/inspector/inspector_css_agent.cc +++ b/third_party/blink/renderer/core/inspector/inspector_css_agent.cc
@@ -3586,13 +3586,13 @@ return nullptr; // FIXME: Ugliness below. - auto* mutable_attribute_style = DynamicTo<MutableCSSPropertyValueSet>( - const_cast<CSSPropertyValueSet*>(element->PresentationAttributeStyle())); - if (!mutable_attribute_style) + const CSSPropertyValueSet* attribute_style = + element->PresentationAttributeStyle(); + if (!attribute_style) return nullptr; InspectorStyle* inspector_style = MakeGarbageCollected<InspectorStyle>( - mutable_attribute_style->EnsureCSSStyleDeclaration( + attribute_style->MutableCopy()->EnsureCSSStyleDeclaration( element->GetExecutionContext()), nullptr, nullptr); return inspector_style->BuildObjectForStyle();
diff --git a/third_party/blink/renderer/core/inspector/inspector_log_agent.cc b/third_party/blink/renderer/core/inspector/inspector_log_agent.cc index 9536bb4f..74754ec 100644 --- a/third_party/blink/renderer/core/inspector/inspector_log_agent.cc +++ b/third_party/blink/renderer/core/inspector/inspector_log_agent.cc
@@ -5,6 +5,7 @@ #include "third_party/blink/renderer/core/inspector/inspector_log_agent.h" #include "base/format_macros.h" +#include "third_party/blink/renderer/core/dom/dom_node_ids.h" #include "third_party/blink/renderer/core/frame/performance_monitor.h" #include "third_party/blink/renderer/core/inspector/console_message.h" #include "third_party/blink/renderer/core/inspector/console_message_storage.h"
diff --git a/third_party/blink/renderer/core/mathml/mathml_element.cc b/third_party/blink/renderer/core/mathml/mathml_element.cc index 962bb8c..ad0f0ad2 100644 --- a/third_party/blink/renderer/core/mathml/mathml_element.cc +++ b/third_party/blink/renderer/core/mathml/mathml_element.cc
@@ -75,7 +75,7 @@ void MathMLElement::CollectStyleForPresentationAttribute( const QualifiedName& name, const AtomicString& value, - MutableCSSPropertyValueSet* style) { + HeapVector<CSSPropertyValue, 8>& style) { if (name == html_names::kDirAttr) { if (IsValidDirAttribute(value)) { AddPropertyToPresentationAttributeStyle(style, CSSPropertyID::kDirection,
diff --git a/third_party/blink/renderer/core/mathml/mathml_element.h b/third_party/blink/renderer/core/mathml/mathml_element.h index 2bab5845..852204064 100644 --- a/third_party/blink/renderer/core/mathml/mathml_element.h +++ b/third_party/blink/renderer/core/mathml/mathml_element.h
@@ -44,7 +44,7 @@ void CollectStyleForPresentationAttribute( const QualifiedName&, const AtomicString&, - MutableCSSPropertyValueSet*) override; + HeapVector<CSSPropertyValue, 8>&) override; enum class AllowPercentages { kYes, kNo }; const CSSPrimitiveValue* ParseMathLength(
diff --git a/third_party/blink/renderer/core/mathml/mathml_padded_element.cc b/third_party/blink/renderer/core/mathml/mathml_padded_element.cc index c530564..beffdff 100644 --- a/third_party/blink/renderer/core/mathml/mathml_padded_element.cc +++ b/third_party/blink/renderer/core/mathml/mathml_padded_element.cc
@@ -72,7 +72,7 @@ void MathMLPaddedElement::CollectStyleForPresentationAttribute( const QualifiedName& name, const AtomicString& value, - MutableCSSPropertyValueSet* style) { + HeapVector<CSSPropertyValue, 8>& style) { if (name == mathml_names::kWidthAttr) { if (const CSSPrimitiveValue* width_value = ParseMathLength(name, AllowPercentages::kNo,
diff --git a/third_party/blink/renderer/core/mathml/mathml_padded_element.h b/third_party/blink/renderer/core/mathml/mathml_padded_element.h index 6f5bb29..a637c91 100644 --- a/third_party/blink/renderer/core/mathml/mathml_padded_element.h +++ b/third_party/blink/renderer/core/mathml/mathml_padded_element.h
@@ -30,9 +30,10 @@ private: void ParseAttribute(const AttributeModificationParams&) final; bool IsPresentationAttribute(const QualifiedName&) const final; - void CollectStyleForPresentationAttribute(const QualifiedName&, - const AtomicString&, - MutableCSSPropertyValueSet*) final; + void CollectStyleForPresentationAttribute( + const QualifiedName&, + const AtomicString&, + HeapVector<CSSPropertyValue, 8>&) final; LayoutObject* CreateLayoutObject(const ComputedStyle&) final; bool IsGroupingElement() const final { return false; }
diff --git a/third_party/blink/renderer/core/mathml/mathml_space_element.cc b/third_party/blink/renderer/core/mathml/mathml_space_element.cc index f586816b..de822ab 100644 --- a/third_party/blink/renderer/core/mathml/mathml_space_element.cc +++ b/third_party/blink/renderer/core/mathml/mathml_space_element.cc
@@ -32,7 +32,7 @@ void MathMLSpaceElement::CollectStyleForPresentationAttribute( const QualifiedName& name, const AtomicString& value, - MutableCSSPropertyValueSet* style) { + HeapVector<CSSPropertyValue, 8>& style) { if (name == mathml_names::kWidthAttr) { if (const CSSPrimitiveValue* width_value = ParseMathLength(name, AllowPercentages::kNo,
diff --git a/third_party/blink/renderer/core/mathml/mathml_space_element.h b/third_party/blink/renderer/core/mathml/mathml_space_element.h index a80bb379..4421e430 100644 --- a/third_party/blink/renderer/core/mathml/mathml_space_element.h +++ b/third_party/blink/renderer/core/mathml/mathml_space_element.h
@@ -24,7 +24,7 @@ void CollectStyleForPresentationAttribute( const QualifiedName&, const AtomicString&, - MutableCSSPropertyValueSet*) override; + HeapVector<CSSPropertyValue, 8>&) override; }; } // namespace blink
diff --git a/third_party/blink/renderer/core/mathml/mathml_token_element.cc b/third_party/blink/renderer/core/mathml/mathml_token_element.cc index daf26f7..ccd1c57 100644 --- a/third_party/blink/renderer/core/mathml/mathml_token_element.cc +++ b/third_party/blink/renderer/core/mathml/mathml_token_element.cc
@@ -48,7 +48,7 @@ void MathMLTokenElement::CollectStyleForPresentationAttribute( const QualifiedName& name, const AtomicString& value, - MutableCSSPropertyValueSet* style) { + HeapVector<CSSPropertyValue, 8>& style) { if (name == mathml_names::kMathvariantAttr && EqualIgnoringASCIICase(value, "normal")) { AddPropertyToPresentationAttributeStyle(
diff --git a/third_party/blink/renderer/core/mathml/mathml_token_element.h b/third_party/blink/renderer/core/mathml/mathml_token_element.h index cb80bd9..73107034d 100644 --- a/third_party/blink/renderer/core/mathml/mathml_token_element.h +++ b/third_party/blink/renderer/core/mathml/mathml_token_element.h
@@ -30,9 +30,10 @@ private: bool IsPresentationAttribute(const QualifiedName&) const final; - void CollectStyleForPresentationAttribute(const QualifiedName&, - const AtomicString&, - MutableCSSPropertyValueSet*) final; + void CollectStyleForPresentationAttribute( + const QualifiedName&, + const AtomicString&, + HeapVector<CSSPropertyValue, 8>&) final; TokenContent ParseTokenContent(); std::optional<TokenContent> token_content_; LayoutObject* CreateLayoutObject(const ComputedStyle&) final;
diff --git a/third_party/blink/renderer/core/paint/paint_property_tree_builder.cc b/third_party/blink/renderer/core/paint/paint_property_tree_builder.cc index d0e167c..c3a197c 100644 --- a/third_party/blink/renderer/core/paint/paint_property_tree_builder.cc +++ b/third_party/blink/renderer/core/paint/paint_property_tree_builder.cc
@@ -233,8 +233,10 @@ const std::optional<gfx::Vector2d>&); ALWAYS_INLINE void SetNeedsPaintPropertyUpdateIfNeeded(); ALWAYS_INLINE void UpdateForObjectLocation( - std::optional<gfx::Vector2d>& paint_offset_translation); - ALWAYS_INLINE void UpdateStickyTranslation(); + std::optional<gfx::Vector2d>& paint_offset_translation, + PhysicalOffset& extra_sticky_offset); + ALWAYS_INLINE void UpdateStickyTranslation( + const PhysicalOffset& extra_sticky_offset); ALWAYS_INLINE void UpdateAnchorPositionScrollTranslation(); void UpdateIndividualTransform( @@ -734,14 +736,17 @@ } } -void FragmentPaintPropertyTreeBuilder::UpdateStickyTranslation() { +void FragmentPaintPropertyTreeBuilder::UpdateStickyTranslation( + const PhysicalOffset& extra_sticky_offset) { DCHECK(properties_); if (NeedsPaintPropertyUpdate()) { if (NeedsStickyTranslation(object_)) { const auto& box_model = To<LayoutBoxModelObject>(object_); - TransformPaintPropertyNode::State state{{gfx::Transform::MakeTranslation( - gfx::Vector2dF(box_model.StickyPositionOffset()))}}; + auto total_offset = + extra_sticky_offset + box_model.StickyPositionOffset(); + TransformPaintPropertyNode::State state{ + {gfx::Transform::MakeTranslation(ToRoundedVector2d(total_offset))}}; state.direct_compositing_reasons = full_context_.direct_compositing_reasons & CompositingReason::kStickyPosition; @@ -798,6 +803,7 @@ constraint->scroll_container_relative_containing_block_rect = gfx::RectF(layout_constraint ->scroll_container_relative_containing_block_rect); + constraint->pixel_snap_offset = gfx::Vector2dF(extra_sticky_offset); if (const LayoutBoxModelObject* sticky_box_shifting_ancestor = layout_constraint->nearest_sticky_layer_shifting_sticky_box) { constraint->nearest_element_shifting_sticky_box = @@ -3171,11 +3177,17 @@ } void FragmentPaintPropertyTreeBuilder::UpdateForObjectLocation( - std::optional<gfx::Vector2d>& paint_offset_translation) { + std::optional<gfx::Vector2d>& paint_offset_translation, + PhysicalOffset& extra_sticky_offset) { context_.old_paint_offset = fragment_data_.PaintOffset(); UpdatePaintOffset(); UpdateForPaintOffsetTranslation(paint_offset_translation); + if (NeedsStickyTranslation(object_)) { + extra_sticky_offset = context_.current.paint_offset; + ResetPaintOffset(); + } + PhysicalOffset paint_offset_delta = fragment_data_.PaintOffset() - context_.current.paint_offset; if (!paint_offset_delta.IsZero() && @@ -3248,7 +3260,8 @@ // This is not in FindObjectPropertiesNeedingUpdateScope because paint offset // can change without NeedsPaintPropertyUpdate. std::optional<gfx::Vector2d> paint_offset_translation; - UpdateForObjectLocation(paint_offset_translation); + PhysicalOffset extra_sticky_offset; + UpdateForObjectLocation(paint_offset_translation, extra_sticky_offset); if (&fragment_data_ == &object_.FirstFragment()) SetNeedsPaintPropertyUpdateIfNeeded(); @@ -3268,7 +3281,7 @@ #endif if (properties_) { - UpdateStickyTranslation(); + UpdateStickyTranslation(extra_sticky_offset); UpdateAnchorPositionScrollTranslation(); if (object_.IsSVGChild()) { // TODO(crbug.com/1278452): Merge SVG handling into the primary codepath.
diff --git a/third_party/blink/renderer/core/paint/timing/image_paint_timing_detector.cc b/third_party/blink/renderer/core/paint/timing/image_paint_timing_detector.cc index 6cbb8ea1..d8e4b5c5 100644 --- a/third_party/blink/renderer/core/paint/timing/image_paint_timing_detector.cc +++ b/third_party/blink/renderer/core/paint/timing/image_paint_timing_detector.cc
@@ -8,6 +8,7 @@ #include "services/metrics/public/cpp/ukm_builders.h" #include "services/metrics/public/cpp/ukm_recorder.h" #include "third_party/blink/public/common/features.h" +#include "third_party/blink/renderer/core/dom/dom_node_ids.h" #include "third_party/blink/renderer/core/frame/local_frame.h" #include "third_party/blink/renderer/core/frame/local_frame_view.h" #include "third_party/blink/renderer/core/frame/visual_viewport.h"
diff --git a/third_party/blink/renderer/core/paint/timing/image_paint_timing_detector_test.cc b/third_party/blink/renderer/core/paint/timing/image_paint_timing_detector_test.cc index c7386824..96dd2d3 100644 --- a/third_party/blink/renderer/core/paint/timing/image_paint_timing_detector_test.cc +++ b/third_party/blink/renderer/core/paint/timing/image_paint_timing_detector_test.cc
@@ -14,6 +14,7 @@ #include "services/metrics/public/cpp/ukm_builders.h" #include "testing/gmock/include/gmock/gmock-matchers.h" #include "third_party/blink/renderer/core/dom/dom_high_res_time_stamp.h" +#include "third_party/blink/renderer/core/dom/dom_node_ids.h" #include "third_party/blink/renderer/core/frame/frame_test_helpers.h" #include "third_party/blink/renderer/core/frame/web_local_frame_impl.h" #include "third_party/blink/renderer/core/html/html_image_element.h"
diff --git a/third_party/blink/renderer/core/speculation_rules/speculation_rule_set_test.cc b/third_party/blink/renderer/core/speculation_rules/speculation_rule_set_test.cc index 1292558b..5bc9b08 100644 --- a/third_party/blink/renderer/core/speculation_rules/speculation_rule_set_test.cc +++ b/third_party/blink/renderer/core/speculation_rules/speculation_rule_set_test.cc
@@ -27,6 +27,7 @@ #include "third_party/blink/renderer/core/html/html_anchor_element.h" #include "third_party/blink/renderer/core/html/html_area_element.h" #include "third_party/blink/renderer/core/html/html_base_element.h" +#include "third_party/blink/renderer/core/html/html_collection.h" #include "third_party/blink/renderer/core/html/html_div_element.h" #include "third_party/blink/renderer/core/html/html_head_element.h" #include "third_party/blink/renderer/core/html/html_meta_element.h" @@ -4413,5 +4414,30 @@ MatchesListOfURLs("https://example.com/bar"))); } +// Regression test for crbug.com/386547460. +// This test will hit a DCHECK if we use document.scripts() when iterating +// through scripts in |Document::UpdateBaseURL()| as the HTMLCollection's cached +// node and count will not have been invalidated at that point, despite a +// <script> having been removed. +TEST_F(SpeculationRuleSetTest, Crbug386547460) { + base::HistogramTester histogram_tester; + DummyPageHolder page_holder; + Document& document = page_holder.GetDocument(); + page_holder.GetFrame().GetSettings()->SetScriptEnabled(true); + + document.documentElement()->setInnerHTML(R"html( + <head> + <script></script> + </head> + <body> + <script></script> + <base href="base.com"></base> + </body> + )html"); + + document.scripts()->item(2); + document.body()->setOuterHTML("<body>42</body>"); +} + } // namespace } // namespace blink
diff --git a/third_party/blink/renderer/core/svg/animation/svg_smil_element.cc b/third_party/blink/renderer/core/svg/animation/svg_smil_element.cc index 375cefb..807f6025 100644 --- a/third_party/blink/renderer/core/svg/animation/svg_smil_element.cc +++ b/third_party/blink/renderer/core/svg/animation/svg_smil_element.cc
@@ -589,7 +589,7 @@ void SVGSMILElement::CollectStyleForPresentationAttribute( const QualifiedName& attr_name, const AtomicString& value, - MutableCSSPropertyValueSet* style) { + HeapVector<CSSPropertyValue, 8>& style) { if (attr_name == svg_names::kFillAttr) return; SVGElement::CollectStyleForPresentationAttribute(attr_name, value, style);
diff --git a/third_party/blink/renderer/core/svg/animation/svg_smil_element.h b/third_party/blink/renderer/core/svg/animation/svg_smil_element.h index c883d5d..6e5d088 100644 --- a/third_party/blink/renderer/core/svg/animation/svg_smil_element.h +++ b/third_party/blink/renderer/core/svg/animation/svg_smil_element.h
@@ -156,7 +156,7 @@ void CollectStyleForPresentationAttribute( const QualifiedName&, const AtomicString&, - MutableCSSPropertyValueSet*) override; + HeapVector<CSSPropertyValue, 8>&) override; SVGAnimatedPropertyBase* PropertyFromAttribute( const QualifiedName& attribute_name) const override;
diff --git a/third_party/blink/renderer/core/svg/build.gni b/third_party/blink/renderer/core/svg/build.gni index 0b3c5efc..1aab660 100644 --- a/third_party/blink/renderer/core/svg/build.gni +++ b/third_party/blink/renderer/core/svg/build.gni
@@ -364,6 +364,7 @@ "svg_path_parser_test.cc", "svg_path_query_test.cc", "svg_resource_document_content_test.cc", + "svg_svg_element_test.cc", "svg_text_content_element_test.cc", "svg_use_element_test.cc", "unsafe_svg_attribute_sanitization_test.cc",
diff --git a/third_party/blink/renderer/core/svg/svg_circle_element.cc b/third_party/blink/renderer/core/svg/svg_circle_element.cc index 96a90e6c..563f2d8 100644 --- a/third_party/blink/renderer/core/svg/svg_circle_element.cc +++ b/third_party/blink/renderer/core/svg/svg_circle_element.cc
@@ -114,7 +114,7 @@ } void SVGCircleElement::CollectExtraStyleForPresentationAttribute( - MutableCSSPropertyValueSet* style) { + HeapVector<CSSPropertyValue, 8>& style) { auto pres_attrs = std::to_array<const SVGAnimatedPropertyBase*>( {cx_.Get(), cy_.Get(), r_.Get()}); AddAnimatedPropertiesToPresentationAttributeStyle(pres_attrs, style);
diff --git a/third_party/blink/renderer/core/svg/svg_circle_element.h b/third_party/blink/renderer/core/svg/svg_circle_element.h index 608313c7..5f0963e 100644 --- a/third_party/blink/renderer/core/svg/svg_circle_element.h +++ b/third_party/blink/renderer/core/svg/svg_circle_element.h
@@ -53,7 +53,7 @@ const QualifiedName& attribute_name) const override; void SynchronizeAllSVGAttributes() const override; void CollectExtraStyleForPresentationAttribute( - MutableCSSPropertyValueSet* style) override; + HeapVector<CSSPropertyValue, 8>& style) override; Member<SVGAnimatedLength> cx_; Member<SVGAnimatedLength> cy_;
diff --git a/third_party/blink/renderer/core/svg/svg_element.cc b/third_party/blink/renderer/core/svg/svg_element.cc index 175d0fb..fe43fc8 100644 --- a/third_party/blink/renderer/core/svg/svg_element.cc +++ b/third_party/blink/renderer/core/svg/svg_element.cc
@@ -782,7 +782,7 @@ } // namespace void SVGElement::AddPropertyToPresentationAttributeStyleWithCache( - MutableCSSPropertyValueSet* style, + HeapVector<CSSPropertyValue, 8>& style, CSSPropertyID property_id, const AtomicString& value) { if (UseCSSURIValueCacheForProperty(property_id) && @@ -799,9 +799,9 @@ *cached_value); } else { AddPropertyToPresentationAttributeStyle(style, property_id, value); - if (unsigned count = style->PropertyCount()) { + if (unsigned count = style.size()) { // Cache the value if it was added. - const CSSPropertyValue& last_decl = style->PropertyAt(--count); + const CSSPropertyValue& last_decl = style[--count]; if (last_decl.PropertyID() == property_id) { engine.AddCachedFillOrClipPathURIValue(value, last_decl.Value()); } @@ -815,7 +815,7 @@ void SVGElement::CollectStyleForPresentationAttribute( const QualifiedName& name, const AtomicString& value, - MutableCSSPropertyValueSet* style) { + HeapVector<CSSPropertyValue, 8>& style) { CSSPropertyID property_id = CssPropertyIdForSVGAttributeName(GetExecutionContext(), name); if (property_id > CSSPropertyID::kInvalid) { @@ -1075,6 +1075,11 @@ if (!element_data->PresentationAttributeStyle()) { return nullptr; } + if (!element_data->presentation_attribute_style_->IsMutable()) { + element_data = &EnsureUniqueElementData(); + element_data->presentation_attribute_style_ = + element_data->presentation_attribute_style_->MutableCopy(); + } return To<MutableCSSPropertyValueSet>( element_data->presentation_attribute_style_.Get()); } @@ -1131,7 +1136,7 @@ void SVGElement::AddAnimatedPropertyToPresentationAttributeStyle( const SVGAnimatedPropertyBase& property, - MutableCSSPropertyValueSet* style) { + HeapVector<CSSPropertyValue, 8>& style) { DCHECK(property.HasPresentationAttributeMapping()); // Apply values from animating attributes that are also presentation // attributes, but do not have a corresponding content attribute. @@ -1444,7 +1449,7 @@ void SVGElement::AddAnimatedPropertiesToPresentationAttributeStyle( const base::span<const SVGAnimatedPropertyBase*> properties, - MutableCSSPropertyValueSet* style) { + HeapVector<CSSPropertyValue, 8>& style) { for (const SVGAnimatedPropertyBase* property : properties) { AddAnimatedPropertyToPresentationAttributeStyle(*property, style); }
diff --git a/third_party/blink/renderer/core/svg/svg_element.h b/third_party/blink/renderer/core/svg/svg_element.h index e27c137..db665b5 100644 --- a/third_party/blink/renderer/core/svg/svg_element.h +++ b/third_party/blink/renderer/core/svg/svg_element.h
@@ -236,17 +236,17 @@ void CollectStyleForPresentationAttribute( const QualifiedName&, const AtomicString&, - MutableCSSPropertyValueSet*) override; + HeapVector<CSSPropertyValue, 8>&) override; void AddPropertyToPresentationAttributeStyleWithCache( - MutableCSSPropertyValueSet*, + HeapVector<CSSPropertyValue, 8>&, CSSPropertyID, const AtomicString& value); void AddAnimatedPropertyToPresentationAttributeStyle( const SVGAnimatedPropertyBase& property, - MutableCSSPropertyValueSet* style); + HeapVector<CSSPropertyValue, 8>&); void AddAnimatedPropertiesToPresentationAttributeStyle( const base::span<const SVGAnimatedPropertyBase*> properties, - MutableCSSPropertyValueSet* style); + HeapVector<CSSPropertyValue, 8>&); InsertionNotificationRequest InsertedInto(ContainerNode&) override; void RemovedFrom(ContainerNode&) override;
diff --git a/third_party/blink/renderer/core/svg/svg_ellipse_element.cc b/third_party/blink/renderer/core/svg/svg_ellipse_element.cc index 1e0395f..7513285 100644 --- a/third_party/blink/renderer/core/svg/svg_ellipse_element.cc +++ b/third_party/blink/renderer/core/svg/svg_ellipse_element.cc
@@ -129,7 +129,7 @@ } void SVGEllipseElement::CollectExtraStyleForPresentationAttribute( - MutableCSSPropertyValueSet* style) { + HeapVector<CSSPropertyValue, 8>& style) { auto pres_attrs = std::to_array<const SVGAnimatedPropertyBase*>( {cx_.Get(), cy_.Get(), rx_.Get(), ry_.Get()}); AddAnimatedPropertiesToPresentationAttributeStyle(pres_attrs, style);
diff --git a/third_party/blink/renderer/core/svg/svg_ellipse_element.h b/third_party/blink/renderer/core/svg/svg_ellipse_element.h index 2f5b2098..7d042e9 100644 --- a/third_party/blink/renderer/core/svg/svg_ellipse_element.h +++ b/third_party/blink/renderer/core/svg/svg_ellipse_element.h
@@ -54,7 +54,7 @@ const QualifiedName& attribute_name) const override; void SynchronizeAllSVGAttributes() const override; void CollectExtraStyleForPresentationAttribute( - MutableCSSPropertyValueSet* style) override; + HeapVector<CSSPropertyValue, 8>& style) override; Member<SVGAnimatedLength> cx_; Member<SVGAnimatedLength> cy_;
diff --git a/third_party/blink/renderer/core/svg/svg_foreign_object_element.cc b/third_party/blink/renderer/core/svg/svg_foreign_object_element.cc index 3dd9e6c4..ac5e71c 100644 --- a/third_party/blink/renderer/core/svg/svg_foreign_object_element.cc +++ b/third_party/blink/renderer/core/svg/svg_foreign_object_element.cc
@@ -136,7 +136,7 @@ } void SVGForeignObjectElement::CollectExtraStyleForPresentationAttribute( - MutableCSSPropertyValueSet* style) { + HeapVector<CSSPropertyValue, 8>& style) { auto pres_attrs = std::to_array<const SVGAnimatedPropertyBase*>( {x_.Get(), y_.Get(), width_.Get(), height_.Get()}); AddAnimatedPropertiesToPresentationAttributeStyle(pres_attrs, style);
diff --git a/third_party/blink/renderer/core/svg/svg_foreign_object_element.h b/third_party/blink/renderer/core/svg/svg_foreign_object_element.h index 81bdf80..86d8260 100644 --- a/third_party/blink/renderer/core/svg/svg_foreign_object_element.h +++ b/third_party/blink/renderer/core/svg/svg_foreign_object_element.h
@@ -51,7 +51,7 @@ const QualifiedName& attribute_name) const override; void SynchronizeAllSVGAttributes() const override; void CollectExtraStyleForPresentationAttribute( - MutableCSSPropertyValueSet* style) override; + HeapVector<CSSPropertyValue, 8>& style) override; Member<SVGAnimatedLength> x_; Member<SVGAnimatedLength> y_;
diff --git a/third_party/blink/renderer/core/svg/svg_gradient_element.cc b/third_party/blink/renderer/core/svg/svg_gradient_element.cc index 3071812..b4de3b8 100644 --- a/third_party/blink/renderer/core/svg/svg_gradient_element.cc +++ b/third_party/blink/renderer/core/svg/svg_gradient_element.cc
@@ -215,7 +215,7 @@ } void SVGGradientElement::CollectExtraStyleForPresentationAttribute( - MutableCSSPropertyValueSet* style) { + HeapVector<CSSPropertyValue, 8>& style) { AddAnimatedPropertyToPresentationAttributeStyle(*gradient_transform_, style); SVGElement::CollectExtraStyleForPresentationAttribute(style); }
diff --git a/third_party/blink/renderer/core/svg/svg_gradient_element.h b/third_party/blink/renderer/core/svg/svg_gradient_element.h index 3b9eecc..ae634cc 100644 --- a/third_party/blink/renderer/core/svg/svg_gradient_element.h +++ b/third_party/blink/renderer/core/svg/svg_gradient_element.h
@@ -77,7 +77,7 @@ const QualifiedName& attribute_name) const override; void SynchronizeAllSVGAttributes() const override; void CollectExtraStyleForPresentationAttribute( - MutableCSSPropertyValueSet* style) override; + HeapVector<CSSPropertyValue, 8>& style) override; private: InsertionNotificationRequest InsertedInto(ContainerNode&) final;
diff --git a/third_party/blink/renderer/core/svg/svg_image_element.cc b/third_party/blink/renderer/core/svg/svg_image_element.cc index 2ac32be7a..155f1001 100644 --- a/third_party/blink/renderer/core/svg/svg_image_element.cc +++ b/third_party/blink/renderer/core/svg/svg_image_element.cc
@@ -222,7 +222,7 @@ } void SVGImageElement::CollectExtraStyleForPresentationAttribute( - MutableCSSPropertyValueSet* style) { + HeapVector<CSSPropertyValue, 8>& style) { auto pres_attrs = std::to_array<const SVGAnimatedPropertyBase*>( {x_.Get(), y_.Get(), width_.Get(), height_.Get()}); AddAnimatedPropertiesToPresentationAttributeStyle(pres_attrs, style);
diff --git a/third_party/blink/renderer/core/svg/svg_image_element.h b/third_party/blink/renderer/core/svg/svg_image_element.h index 4134444..07f3fee 100644 --- a/third_party/blink/renderer/core/svg/svg_image_element.h +++ b/third_party/blink/renderer/core/svg/svg_image_element.h
@@ -95,7 +95,7 @@ const QualifiedName& attribute_name) const override; void SynchronizeAllSVGAttributes() const override; void CollectExtraStyleForPresentationAttribute( - MutableCSSPropertyValueSet* style) override; + HeapVector<CSSPropertyValue, 8>& style) override; Member<SVGAnimatedLength> x_; Member<SVGAnimatedLength> y_;
diff --git a/third_party/blink/renderer/core/svg/svg_mask_element.cc b/third_party/blink/renderer/core/svg/svg_mask_element.cc index ab6353e..da3bcb6 100644 --- a/third_party/blink/renderer/core/svg/svg_mask_element.cc +++ b/third_party/blink/renderer/core/svg/svg_mask_element.cc
@@ -162,7 +162,7 @@ } void SVGMaskElement::CollectExtraStyleForPresentationAttribute( - MutableCSSPropertyValueSet* style) { + HeapVector<CSSPropertyValue, 8>& style) { auto pres_attrs = std::to_array<const SVGAnimatedPropertyBase*>( {x_.Get(), y_.Get(), width_.Get(), height_.Get()}); AddAnimatedPropertiesToPresentationAttributeStyle(pres_attrs, style);
diff --git a/third_party/blink/renderer/core/svg/svg_mask_element.h b/third_party/blink/renderer/core/svg/svg_mask_element.h index 1cbb1b2..952e10568 100644 --- a/third_party/blink/renderer/core/svg/svg_mask_element.h +++ b/third_party/blink/renderer/core/svg/svg_mask_element.h
@@ -63,7 +63,7 @@ const QualifiedName& attribute_name) const override; void SynchronizeAllSVGAttributes() const override; void CollectExtraStyleForPresentationAttribute( - MutableCSSPropertyValueSet* style) override; + HeapVector<CSSPropertyValue, 8>& style) override; Member<SVGAnimatedLength> x_; Member<SVGAnimatedLength> y_;
diff --git a/third_party/blink/renderer/core/svg/svg_path_element.cc b/third_party/blink/renderer/core/svg/svg_path_element.cc index 39a1a21..8d22f006 100644 --- a/third_party/blink/renderer/core/svg/svg_path_element.cc +++ b/third_party/blink/renderer/core/svg/svg_path_element.cc
@@ -156,7 +156,7 @@ } void SVGPathElement::CollectExtraStyleForPresentationAttribute( - MutableCSSPropertyValueSet* style) { + HeapVector<CSSPropertyValue, 8>& style) { AddAnimatedPropertyToPresentationAttributeStyle(*path_, style); SVGGeometryElement::CollectExtraStyleForPresentationAttribute(style); }
diff --git a/third_party/blink/renderer/core/svg/svg_path_element.h b/third_party/blink/renderer/core/svg/svg_path_element.h index bc604282..d30a2a4 100644 --- a/third_party/blink/renderer/core/svg/svg_path_element.h +++ b/third_party/blink/renderer/core/svg/svg_path_element.h
@@ -65,7 +65,7 @@ const QualifiedName& attribute_name) const override; void SynchronizeAllSVGAttributes() const override; void CollectExtraStyleForPresentationAttribute( - MutableCSSPropertyValueSet* style) override; + HeapVector<CSSPropertyValue, 8>& style) override; Member<SVGAnimatedPath> path_; };
diff --git a/third_party/blink/renderer/core/svg/svg_pattern_element.cc b/third_party/blink/renderer/core/svg/svg_pattern_element.cc index 84d8c78..2349484 100644 --- a/third_party/blink/renderer/core/svg/svg_pattern_element.cc +++ b/third_party/blink/renderer/core/svg/svg_pattern_element.cc
@@ -328,7 +328,7 @@ } void SVGPatternElement::CollectExtraStyleForPresentationAttribute( - MutableCSSPropertyValueSet* style) { + HeapVector<CSSPropertyValue, 8>& style) { AddAnimatedPropertyToPresentationAttributeStyle(*pattern_transform_, style); SVGElement::CollectExtraStyleForPresentationAttribute(style); }
diff --git a/third_party/blink/renderer/core/svg/svg_pattern_element.h b/third_party/blink/renderer/core/svg/svg_pattern_element.h index c8b5232..310d96f 100644 --- a/third_party/blink/renderer/core/svg/svg_pattern_element.h +++ b/third_party/blink/renderer/core/svg/svg_pattern_element.h
@@ -97,7 +97,7 @@ const QualifiedName& attribute_name) const override; void SynchronizeAllSVGAttributes() const override; void CollectExtraStyleForPresentationAttribute( - MutableCSSPropertyValueSet* style) override; + HeapVector<CSSPropertyValue, 8>& style) override; Member<SVGAnimatedLength> x_; Member<SVGAnimatedLength> y_;
diff --git a/third_party/blink/renderer/core/svg/svg_rect_element.cc b/third_party/blink/renderer/core/svg/svg_rect_element.cc index cb2548a..223441d 100644 --- a/third_party/blink/renderer/core/svg/svg_rect_element.cc +++ b/third_party/blink/renderer/core/svg/svg_rect_element.cc
@@ -168,7 +168,7 @@ } void SVGRectElement::CollectExtraStyleForPresentationAttribute( - MutableCSSPropertyValueSet* style) { + HeapVector<CSSPropertyValue, 8>& style) { auto pres_attrs = std::to_array<const SVGAnimatedPropertyBase*>( {x_.Get(), y_.Get(), width_.Get(), height_.Get(), rx_.Get(), ry_.Get()}); AddAnimatedPropertiesToPresentationAttributeStyle(pres_attrs, style);
diff --git a/third_party/blink/renderer/core/svg/svg_rect_element.h b/third_party/blink/renderer/core/svg/svg_rect_element.h index 0a1f36d..f7893f3 100644 --- a/third_party/blink/renderer/core/svg/svg_rect_element.h +++ b/third_party/blink/renderer/core/svg/svg_rect_element.h
@@ -56,7 +56,7 @@ const QualifiedName& attribute_name) const override; void SynchronizeAllSVGAttributes() const override; void CollectExtraStyleForPresentationAttribute( - MutableCSSPropertyValueSet* style) override; + HeapVector<CSSPropertyValue, 8>& style) override; Member<SVGAnimatedLength> x_; Member<SVGAnimatedLength> y_;
diff --git a/third_party/blink/renderer/core/svg/svg_svg_element.cc b/third_party/blink/renderer/core/svg/svg_svg_element.cc index 06bdab751..ef2b132d 100644 --- a/third_party/blink/renderer/core/svg/svg_svg_element.cc +++ b/third_party/blink/renderer/core/svg/svg_svg_element.cc
@@ -212,7 +212,7 @@ void SVGSVGElement::CollectStyleForPresentationAttribute( const QualifiedName& name, const AtomicString& value, - MutableCSSPropertyValueSet* style) { + HeapVector<CSSPropertyValue, 8>& style) { // We shouldn't collect style for 'width' and 'height' on inner <svg>, so // bail here in that case to avoid having the generic logic in SVGElement // picking it up. @@ -734,8 +734,12 @@ if (!view_spec_ && !view_spec) return; view_spec_ = view_spec; - if (LayoutObject* layout_object = GetLayoutObject()) + if (LayoutObject* layout_object = GetLayoutObject()) { + if (auto* svg_root = DynamicTo<LayoutSVGRoot>(*layout_object)) { + svg_root->IntrinsicSizingInfoChanged(); + } MarkForLayoutAndParentResourceInvalidation(*layout_object); + } } const SVGViewSpec* SVGSVGElement::ParseViewSpec( @@ -821,7 +825,7 @@ } void SVGSVGElement::CollectExtraStyleForPresentationAttribute( - MutableCSSPropertyValueSet* style) { + HeapVector<CSSPropertyValue, 8>& style) { auto pres_attrs = std::to_array<const SVGAnimatedPropertyBase*>( {x_.Get(), y_.Get(), width_.Get(), height_.Get()}); AddAnimatedPropertiesToPresentationAttributeStyle(pres_attrs, style);
diff --git a/third_party/blink/renderer/core/svg/svg_svg_element.h b/third_party/blink/renderer/core/svg/svg_svg_element.h index dd5cf98a..3f291dd 100644 --- a/third_party/blink/renderer/core/svg/svg_svg_element.h +++ b/third_party/blink/renderer/core/svg/svg_svg_element.h
@@ -124,7 +124,7 @@ void CollectStyleForPresentationAttribute( const QualifiedName&, const AtomicString&, - MutableCSSPropertyValueSet*) override; + HeapVector<CSSPropertyValue, 8>&) override; void AttachLayoutTree(AttachContext&) override; bool LayoutObjectIsNeeded(const DisplayStyle&) const override; @@ -150,7 +150,7 @@ const QualifiedName& attribute_name) const override; void SynchronizeAllSVGAttributes() const override; void CollectExtraStyleForPresentationAttribute( - MutableCSSPropertyValueSet* style) override; + HeapVector<CSSPropertyValue, 8>& style) override; Member<SVGAnimatedLength> x_; Member<SVGAnimatedLength> y_;
diff --git a/third_party/blink/renderer/core/svg/svg_svg_element_test.cc b/third_party/blink/renderer/core/svg/svg_svg_element_test.cc new file mode 100644 index 0000000..e00ad2ca --- /dev/null +++ b/third_party/blink/renderer/core/svg/svg_svg_element_test.cc
@@ -0,0 +1,50 @@ +// 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 "third_party/blink/renderer/core/svg/svg_svg_element.h" + +#include "third_party/blink/renderer/core/dom/document.h" +#include "third_party/blink/renderer/core/dom/element.h" +#include "third_party/blink/renderer/core/html/html_body_element.h" +#include "third_party/blink/renderer/core/layout/geometry/physical_size.h" +#include "third_party/blink/renderer/core/layout/layout_box.h" +#include "third_party/blink/renderer/core/testing/core_unit_test_helper.h" +#include "third_party/blink/renderer/core/testing/sim/sim_request.h" +#include "third_party/blink/renderer/core/testing/sim/sim_test.h" + +namespace blink { + +class SVGSVGElementTest : public SimTest {}; + +TEST_F(SVGSVGElementTest, ViewSpecSetAfterFirstEmbeddeeLayout) { + SimRequest main_resource("https://example.com/test.html", "text/html"); + LoadURL("https://example.com/test.html"); + main_resource.Complete(R"HTML(<!doctype html> + <object style="height: 100px" data="test.svg#aspect"></object>)HTML"); + + SimRequest object_subresource("https://example.com/test.svg#aspect", + "image/svg+xml"); + object_subresource.Write(R"SVG( + <svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 200 100'> + <rect width='100' height='100' fill='green'/> + <view id='aspect' viewBox='0 0 100 100'/> + </svg>)SVG"); + + ASSERT_TRUE(Compositor().NeedsBeginFrame()); + Compositor().BeginFrame(); + + Document& document = GetDocument(); + Element* object_element = document.body()->firstElementChild(); + const LayoutBox* layout_box = object_element->GetLayoutBox(); + EXPECT_EQ(layout_box->Size(), PhysicalSize(200, 100)); + + object_subresource.Finish(); + + ASSERT_TRUE(Compositor().NeedsBeginFrame()); + Compositor().BeginFrame(); + + EXPECT_EQ(layout_box->Size(), PhysicalSize(100, 100)); +} + +} // namespace blink
diff --git a/third_party/blink/renderer/core/svg/svg_text_content_element.cc b/third_party/blink/renderer/core/svg/svg_text_content_element.cc index d7b23df..5a99fbc 100644 --- a/third_party/blink/renderer/core/svg/svg_text_content_element.cc +++ b/third_party/blink/renderer/core/svg/svg_text_content_element.cc
@@ -271,7 +271,7 @@ void SVGTextContentElement::CollectStyleForPresentationAttribute( const QualifiedName& name, const AtomicString& value, - MutableCSSPropertyValueSet* style) { + HeapVector<CSSPropertyValue, 8>& style) { if (name.Matches(xml_names::kSpaceAttr)) { DEFINE_STATIC_LOCAL(const AtomicString, preserve_string, ("preserve"));
diff --git a/third_party/blink/renderer/core/svg/svg_text_content_element.h b/third_party/blink/renderer/core/svg/svg_text_content_element.h index e50ea7f..9bc7854 100644 --- a/third_party/blink/renderer/core/svg/svg_text_content_element.h +++ b/third_party/blink/renderer/core/svg/svg_text_content_element.h
@@ -78,9 +78,10 @@ SVGTextContentElement(const QualifiedName&, Document&); bool IsPresentationAttribute(const QualifiedName&) const final; - void CollectStyleForPresentationAttribute(const QualifiedName&, - const AtomicString&, - MutableCSSPropertyValueSet*) final; + void CollectStyleForPresentationAttribute( + const QualifiedName&, + const AtomicString&, + HeapVector<CSSPropertyValue, 8>&) final; void SvgAttributeChanged(const SvgAttributeChangedParams&) override; bool SelfHasRelativeLengths() const override;
diff --git a/third_party/blink/renderer/core/svg/svg_transformable_element.cc b/third_party/blink/renderer/core/svg/svg_transformable_element.cc index c23d604..9d6ac085 100644 --- a/third_party/blink/renderer/core/svg/svg_transformable_element.cc +++ b/third_party/blink/renderer/core/svg/svg_transformable_element.cc
@@ -48,7 +48,7 @@ } void SVGTransformableElement::CollectExtraStyleForPresentationAttribute( - MutableCSSPropertyValueSet* style) { + HeapVector<CSSPropertyValue, 8>& style) { AddAnimatedPropertyToPresentationAttributeStyle(*transform_, style); SVGElement::CollectExtraStyleForPresentationAttribute(style); }
diff --git a/third_party/blink/renderer/core/svg/svg_transformable_element.h b/third_party/blink/renderer/core/svg/svg_transformable_element.h index 4d2ed04..3ee39b5 100644 --- a/third_party/blink/renderer/core/svg/svg_transformable_element.h +++ b/third_party/blink/renderer/core/svg/svg_transformable_element.h
@@ -49,7 +49,7 @@ ConstructionType = kCreateSVGElement); void CollectExtraStyleForPresentationAttribute( - MutableCSSPropertyValueSet* style) override; + HeapVector<CSSPropertyValue, 8>& style) override; void SvgAttributeChanged(const SvgAttributeChangedParams&) override; SVGAnimatedPropertyBase* PropertyFromAttribute(
diff --git a/third_party/blink/renderer/core/svg/svg_use_element.cc b/third_party/blink/renderer/core/svg/svg_use_element.cc index a67bd28..c218e49 100644 --- a/third_party/blink/renderer/core/svg/svg_use_element.cc +++ b/third_party/blink/renderer/core/svg/svg_use_element.cc
@@ -677,7 +677,7 @@ } void SVGUseElement::CollectExtraStyleForPresentationAttribute( - MutableCSSPropertyValueSet* style) { + HeapVector<CSSPropertyValue, 8>& style) { auto pres_attrs = std::to_array<const SVGAnimatedPropertyBase*>({x_.Get(), y_.Get()}); AddAnimatedPropertiesToPresentationAttributeStyle(pres_attrs, style);
diff --git a/third_party/blink/renderer/core/svg/svg_use_element.h b/third_party/blink/renderer/core/svg/svg_use_element.h index a89ea5c..9d274a48 100644 --- a/third_party/blink/renderer/core/svg/svg_use_element.h +++ b/third_party/blink/renderer/core/svg/svg_use_element.h
@@ -112,7 +112,7 @@ const QualifiedName& attribute_name) const override; void SynchronizeAllSVGAttributes() const override; void CollectExtraStyleForPresentationAttribute( - MutableCSSPropertyValueSet* style) override; + HeapVector<CSSPropertyValue, 8>& style) override; Member<SVGResourceDocumentContent> document_content_; Member<SVGResourceTarget> external_resource_target_;
diff --git a/third_party/blink/renderer/modules/credentialmanagement/DEPS b/third_party/blink/renderer/modules/credentialmanagement/DEPS index 9ec73f18..8b2c4eb 100644 --- a/third_party/blink/renderer/modules/credentialmanagement/DEPS +++ b/third_party/blink/renderer/modules/credentialmanagement/DEPS
@@ -13,6 +13,9 @@ "credential_manager_type_converters.cc": [ "+third_party/boringssl/src/include", ], + "credential_manager_type_converters_unittest.cc": [ + "+device/fido/fido_constants.h", + ], ".*test\.cc": [ "+components/ukm/test_ukm_recorder.h", ],
diff --git a/third_party/blink/renderer/modules/credentialmanagement/authentication_credentials_container.cc b/third_party/blink/renderer/modules/credentialmanagement/authentication_credentials_container.cc index b09f1d52..538505de 100644 --- a/third_party/blink/renderer/modules/credentialmanagement/authentication_credentials_container.cc +++ b/third_party/blink/renderer/modules/credentialmanagement/authentication_credentials_container.cc
@@ -2070,12 +2070,7 @@ UseCounter::Count(resolver->GetExecutionContext(), WebFeature::kFedCmIframe); } - // Track when websites use FedCM with the IDP sign-in status opt-in - if (RuntimeEnabledFeatures::FedCmIdpSigninStatusEnabled( - resolver->GetExecutionContext())) { - UseCounter::Count(resolver->GetExecutionContext(), - WebFeature::kFedCmIdpSigninStatusApi); - } + int provider_index = 0; Vector<mojom::blink::IdentityProviderRequestOptionsPtr> identity_provider_ptrs;
diff --git a/third_party/blink/renderer/modules/credentialmanagement/authentication_extensions_payment_inputs.idl b/third_party/blink/renderer/modules/credentialmanagement/authentication_extensions_payment_inputs.idl index 1cfaed9..61b236bb 100644 --- a/third_party/blink/renderer/modules/credentialmanagement/authentication_extensions_payment_inputs.idl +++ b/third_party/blink/renderer/modules/credentialmanagement/authentication_extensions_payment_inputs.idl
@@ -6,5 +6,8 @@ dictionary AuthenticationExtensionsPaymentInputs { boolean isPayment; + + // A sequence of public key credential creation parameters for the browser bound key. + [RuntimeEnabled=SecurePaymentConfirmationBrowserBoundKeys] sequence<PublicKeyCredentialParameters> browserBoundPubKeyCredParams; };
diff --git a/third_party/blink/renderer/modules/credentialmanagement/credential_manager_type_converters.cc b/third_party/blink/renderer/modules/credentialmanagement/credential_manager_type_converters.cc index 6e2811ec..7dd71164 100644 --- a/third_party/blink/renderer/modules/credentialmanagement/credential_manager_type_converters.cc +++ b/third_party/blink/renderer/modules/credentialmanagement/credential_manager_type_converters.cc
@@ -610,6 +610,30 @@ } // static +Vector<PublicKeyCredentialParametersPtr> TypeConverter< + WTF::Vector<PublicKeyCredentialParametersPtr>, + blink::HeapVector<blink::Member<blink::PublicKeyCredentialParameters>>>:: + Convert(const blink::HeapVector< + blink::Member<blink::PublicKeyCredentialParameters>>& + input_pub_key_cred_params) { + // Steps 9 and 10 of https://w3c.github.io/webauthn/#sctn-createCredential + Vector<PublicKeyCredentialParametersPtr> parameters; + if (input_pub_key_cred_params.size() == 0) { + parameters.push_back(CreatePublicKeyCredentialParameter(kCoseEs256)); + parameters.push_back(CreatePublicKeyCredentialParameter(kCoseRs256)); + } else { + for (auto& parameter : input_pub_key_cred_params) { + PublicKeyCredentialParametersPtr normalized_parameter = + PublicKeyCredentialParameters::From(*parameter); + if (normalized_parameter) { + parameters.push_back(std::move(normalized_parameter)); + } + } + } + return parameters; +} + +// static PublicKeyCredentialCreationOptionsPtr TypeConverter<PublicKeyCredentialCreationOptionsPtr, blink::PublicKeyCredentialCreationOptions>:: @@ -624,24 +648,12 @@ } mojo_options->challenge = ConvertTo<Vector<uint8_t>>(options.challenge()); - // Steps 7 and 8 of https://w3c.github.io/webauthn/#sctn-createCredential - Vector<PublicKeyCredentialParametersPtr> parameters; - if (options.pubKeyCredParams().size() == 0) { - parameters.push_back(CreatePublicKeyCredentialParameter(kCoseEs256)); - parameters.push_back(CreatePublicKeyCredentialParameter(kCoseRs256)); - } else { - for (auto& parameter : options.pubKeyCredParams()) { - PublicKeyCredentialParametersPtr normalized_parameter = - PublicKeyCredentialParameters::From(*parameter); - if (normalized_parameter) { - parameters.push_back(std::move(normalized_parameter)); - } - } - if (parameters.empty()) { - return nullptr; - } + mojo_options->public_key_parameters = + ConvertTo<WTF::Vector<PublicKeyCredentialParametersPtr>>( + options.pubKeyCredParams()); + if (mojo_options->public_key_parameters.empty()) { + return nullptr; } - mojo_options->public_key_parameters = std::move(parameters); if (options.hasTimeout()) { mojo_options->timeout = base::Milliseconds(options.timeout()); @@ -908,6 +920,12 @@ mojo_inputs->supplemental_pub_keys = std::move(*supplemental_pub_keys); } } + if (inputs.hasPayment() && + inputs.payment()->hasBrowserBoundPubKeyCredParams()) { + mojo_inputs->payment_browser_bound_key_parameters = + ConvertTo<WTF::Vector<PublicKeyCredentialParametersPtr>>( + inputs.payment()->browserBoundPubKeyCredParams()); + } if (inputs.hasPrf()) { mojo_inputs->prf = true; mojo_inputs->prf_inputs = ConvertTo<Vector<PRFValuesPtr>>(*inputs.prf());
diff --git a/third_party/blink/renderer/modules/credentialmanagement/credential_manager_type_converters.h b/third_party/blink/renderer/modules/credentialmanagement/credential_manager_type_converters.h index 0c7dd844..9b332416 100644 --- a/third_party/blink/renderer/modules/credentialmanagement/credential_manager_type_converters.h +++ b/third_party/blink/renderer/modules/credentialmanagement/credential_manager_type_converters.h
@@ -113,6 +113,16 @@ }; template <> +struct TypeConverter< + WTF::Vector<blink::mojom::blink::PublicKeyCredentialParametersPtr>, + blink::HeapVector<blink::Member<blink::PublicKeyCredentialParameters>>> { + static WTF::Vector<blink::mojom::blink::PublicKeyCredentialParametersPtr> + Convert(const blink::HeapVector< + blink::Member<blink::PublicKeyCredentialParameters>>& + input_pub_key_cred_params); +}; + +template <> struct TypeConverter<std::optional<blink::mojom::blink::AuthenticatorTransport>, String> { static std::optional<blink::mojom::blink::AuthenticatorTransport> Convert(
diff --git a/third_party/blink/renderer/modules/credentialmanagement/credential_manager_type_converters_unittest.cc b/third_party/blink/renderer/modules/credentialmanagement/credential_manager_type_converters_unittest.cc index 96ac2ce..b6f9b9c 100644 --- a/third_party/blink/renderer/modules/credentialmanagement/credential_manager_type_converters_unittest.cc +++ b/third_party/blink/renderer/modules/credentialmanagement/credential_manager_type_converters_unittest.cc
@@ -11,6 +11,7 @@ #include "base/compiler_specific.h" #include "base/containers/span.h" +#include "device/fido/fido_constants.h" #include "mojo/public/cpp/bindings/type_converter.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" @@ -24,6 +25,7 @@ #include "third_party/blink/renderer/bindings/modules/v8/v8_authentication_extensions_large_blob_inputs.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_authentication_extensions_large_blob_outputs.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_authentication_extensions_payment_browser_bound_signature.h" +#include "third_party/blink/renderer/bindings/modules/v8/v8_authentication_extensions_payment_inputs.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_authentication_extensions_payment_outputs.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_authentication_extensions_prf_inputs.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_authentication_extensions_prf_outputs.h" @@ -35,6 +37,7 @@ #include "third_party/blink/renderer/bindings/modules/v8/v8_identity_provider_account.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_identity_provider_request_options.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_login_status_options.h" +#include "third_party/blink/renderer/bindings/modules/v8/v8_public_key_credential_parameters.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_public_key_credential_request_options.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_remote_desktop_client_override.h" #include "third_party/blink/renderer/core/typed_arrays/dom_array_buffer.h" @@ -52,6 +55,11 @@ const uint8_t kSample[] = {1, 2, 3, 4, 5, 6}; +const int32_t kCoseAlgorithmEs256 = + base::strict_cast<int32_t>(device::CoseAlgorithmIdentifier::kEs256); +const int32_t kCoseAlgorithmRs256 = + base::strict_cast<int32_t>(device::CoseAlgorithmIdentifier::kRs256); + static blink::V8UnionArrayBufferOrArrayBufferView* arrayBufferOrView( const uint8_t* data, size_t size); @@ -435,6 +443,97 @@ ASSERT_EQ(*(mojo_type->supplemental_pub_keys), *expected); } +static ::testing::Matcher<const mojo::InlinedStructPtr< + blink::mojom::blink::PublicKeyCredentialParameters>> +EqPublicKeyCredentialParameters(blink::mojom::PublicKeyCredentialType type, + int32_t algorithm_identifier) { + return ::testing::Pointee(::testing::AllOf( + ::testing::Field( + "type", &blink::mojom::blink::PublicKeyCredentialParameters::type, + type), + ::testing::Field("algorithm_identifier", + &blink::mojom::blink::PublicKeyCredentialParameters:: + algorithm_identifier, + algorithm_identifier))); +} + +TEST(CredentialManagerTypeConvertersTest, + AuthenticationExtensionsClientInputsTest_browserBoundPublicKeyCredential) { + blink::AuthenticationExtensionsClientInputs* blink_type = + blink::AuthenticationExtensionsClientInputs::Create(); + blink::AuthenticationExtensionsPaymentInputs* blink_payment = + blink::AuthenticationExtensionsPaymentInputs::Create(); + auto blink_cred_params = + blink::HeapVector<blink::Member<blink::PublicKeyCredentialParameters>>(); + blink::PublicKeyCredentialParameters* blink_cred_params_1 = + blink::PublicKeyCredentialParameters::Create(); + blink_cred_params_1->setType("public-key"); + blink_cred_params_1->setAlg(kCoseAlgorithmEs256); + blink_cred_params.push_back(blink_cred_params_1); + blink_payment->setBrowserBoundPubKeyCredParams(std::move(blink_cred_params)); + blink_type->setPayment(blink_payment); + + blink::mojom::blink::AuthenticationExtensionsClientInputsPtr mojo_type = + ConvertTo<blink::mojom::blink::AuthenticationExtensionsClientInputsPtr>( + *blink_type); + + EXPECT_THAT(mojo_type->payment_browser_bound_key_parameters, + ::testing::Optional( + ::testing::ElementsAre(EqPublicKeyCredentialParameters( + blink::mojom::PublicKeyCredentialType::PUBLIC_KEY, + kCoseAlgorithmEs256)))); +} + +TEST( + CredentialManagerTypeConvertersTest, + AuthenticationExtensionsClientInputsTest_browserBoundPublicKeyCredentialWhenEmpty) { + blink::AuthenticationExtensionsClientInputs* blink_type = + blink::AuthenticationExtensionsClientInputs::Create(); + blink::AuthenticationExtensionsPaymentInputs* blink_payment = + blink::AuthenticationExtensionsPaymentInputs::Create(); + blink_payment->setBrowserBoundPubKeyCredParams( + blink::HeapVector<blink::Member<blink::PublicKeyCredentialParameters>>()); + blink_type->setPayment(blink_payment); + + blink::mojom::blink::AuthenticationExtensionsClientInputsPtr mojo_type = + ConvertTo<blink::mojom::blink::AuthenticationExtensionsClientInputsPtr>( + *blink_type); + + EXPECT_THAT(mojo_type->payment_browser_bound_key_parameters, + ::testing::Optional(::testing::ElementsAre( + EqPublicKeyCredentialParameters( + blink::mojom::PublicKeyCredentialType::PUBLIC_KEY, + kCoseAlgorithmEs256), + EqPublicKeyCredentialParameters( + blink::mojom::PublicKeyCredentialType::PUBLIC_KEY, + kCoseAlgorithmRs256)))); +} + +TEST( + CredentialManagerTypeConvertersTest, + AuthenticationExtensionsClientInputsTest_browserBoundPublicKeyCredentialWhenInvalidType) { + blink::AuthenticationExtensionsClientInputs* blink_type = + blink::AuthenticationExtensionsClientInputs::Create(); + blink::AuthenticationExtensionsPaymentInputs* blink_payment = + blink::AuthenticationExtensionsPaymentInputs::Create(); + auto blink_cred_params = + blink::HeapVector<blink::Member<blink::PublicKeyCredentialParameters>>(); + blink::PublicKeyCredentialParameters* blink_cred_params_1 = + blink::PublicKeyCredentialParameters::Create(); + blink_cred_params_1->setType("Not a valid public key credential type!"); + blink_cred_params_1->setAlg(kCoseAlgorithmEs256); + blink_cred_params.push_back(blink_cred_params_1); + blink_payment->setBrowserBoundPubKeyCredParams(std::move(blink_cred_params)); + blink_type->setPayment(blink_payment); + + blink::mojom::blink::AuthenticationExtensionsClientInputsPtr mojo_type = + ConvertTo<blink::mojom::blink::AuthenticationExtensionsClientInputsPtr>( + *blink_type); + + EXPECT_THAT(mojo_type->payment_browser_bound_key_parameters, + ::testing::Optional(::testing::IsEmpty())); +} + TEST(CredentialManagerTypeConvertersTest, AuthenticationExtensionsClientInputsTest_prfInputs) { blink::AuthenticationExtensionsClientInputs* blink_type =
diff --git a/third_party/blink/renderer/modules/credentialmanagement/identity_provider.idl b/third_party/blink/renderer/modules/credentialmanagement/identity_provider.idl index c7e9d1f..32a1a355 100644 --- a/third_party/blink/renderer/modules/credentialmanagement/identity_provider.idl +++ b/third_party/blink/renderer/modules/credentialmanagement/identity_provider.idl
@@ -27,7 +27,7 @@ [CallWith=ScriptState, RaisesException, MeasureAs=FedCmUserInfo] static Promise<sequence<IdentityUserInfo>> getUserInfo(IdentityProviderConfig config); - [RuntimeEnabled=FedCmIdpSigninStatus, CallWith=ScriptState] + [RuntimeEnabled=FedCm, CallWith=ScriptState] static void close(); [RuntimeEnabled=FedCmIdPRegistration, CallWith=ScriptState, ImplementedAs=registerIdentityProvider]
diff --git a/third_party/blink/renderer/modules/credentialmanagement/navigator_login.idl b/third_party/blink/renderer/modules/credentialmanagement/navigator_login.idl index c04e0b8..b02409c 100644 --- a/third_party/blink/renderer/modules/credentialmanagement/navigator_login.idl +++ b/third_party/blink/renderer/modules/credentialmanagement/navigator_login.idl
@@ -24,13 +24,13 @@ ImplementedAs=NavigatorLogin ] partial interface Navigator { - [SecureContext, RuntimeEnabled=FedCmIdpSigninStatus] readonly attribute NavigatorLogin login; + [SecureContext, RuntimeEnabled=FedCm] readonly attribute NavigatorLogin login; }; [ Exposed=Window, SecureContext, - RuntimeEnabled=FedCmIdpSigninStatus + RuntimeEnabled=FedCm ] interface NavigatorLogin { [CallWith=ScriptState, MeasureAs=FedCmIdpSigninStatusJsApi]
diff --git a/third_party/blink/renderer/modules/web_install/navigator_web_install.cc b/third_party/blink/renderer/modules/web_install/navigator_web_install.cc index 8f4a3c31..8c3acac 100644 --- a/third_party/blink/renderer/modules/web_install/navigator_web_install.cc +++ b/third_party/blink/renderer/modules/web_install/navigator_web_install.cc
@@ -12,6 +12,7 @@ #include "third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_web_install_result.h" #include "third_party/blink/renderer/core/dom/dom_exception.h" +#include "third_party/blink/renderer/core/execution_context/execution_context.h" #include "third_party/blink/renderer/core/frame/local_dom_window.h" #include "third_party/blink/renderer/core/page/page.h" #include "third_party/blink/renderer/platform/bindings/exception_code.h" @@ -165,8 +166,14 @@ bool NavigatorWebInstall::CheckPreconditionsMaybeThrow( ScriptState* script_state, ExceptionState& exception_state) { - // TODO(crbug.com/333795265): Verify that site has been granted web install - // permission once implemented. + if (!ExecutionContext::From(script_state) + ->IsFeatureEnabled( + mojom::blink::PermissionsPolicyFeature::kWebAppInstallation)) { + exception_state.ThrowSecurityError( + "Access to the feature \"web-app-installation\" is disallowed by " + "Permissions Policy."); + return false; + } Navigator* const navigator = GetSupplementable();
diff --git a/third_party/blink/renderer/modules/webaudio/DEPS b/third_party/blink/renderer/modules/webaudio/DEPS index 1ec448c..02c1426 100644 --- a/third_party/blink/renderer/modules/webaudio/DEPS +++ b/third_party/blink/renderer/modules/webaudio/DEPS
@@ -1,4 +1,5 @@ include_rules = [ + "+media/audio/audio_device_description.h", "+media/base", "+media/mojo", "+services/metrics/public/cpp/ukm_builders.h",
diff --git a/third_party/blink/renderer/modules/webaudio/audio_context.cc b/third_party/blink/renderer/modules/webaudio/audio_context.cc index 239f9f5..0c2823c 100644 --- a/third_party/blink/renderer/modules/webaudio/audio_context.cc +++ b/third_party/blink/renderer/modules/webaudio/audio_context.cc
@@ -7,6 +7,7 @@ #include "base/metrics/histogram_functions.h" #include "base/metrics/histogram_macros.h" #include "build/build_config.h" +#include "media/audio/audio_device_description.h" #include "services/metrics/public/cpp/ukm_builders.h" #include "services/metrics/public/cpp/ukm_recorder.h" #include "third_party/blink/public/common/associated_interfaces/associated_interface_provider.h" @@ -345,7 +346,7 @@ // device identifier that is not the default sink or a silent sink. if (sink_descriptor_.Type() == WebAudioSinkDescriptor::AudioSinkType::kAudible && - !sink_descriptor_.SinkId().IsEmpty()) { + !sink_descriptor_.IsDefaultSinkId()) { InitializeMediaDeviceService(); } @@ -1214,9 +1215,11 @@ if (device_type == mojom::blink::MediaDeviceType::kMediaAudioOutput) { output_device_ids_.clear(); for (auto device : devices) { - if (device.device_id == "default") { + if (device.device_id == media::AudioDeviceDescription::kDefaultDeviceId) { // Use the empty string to represent the default audio sink. output_device_ids_.insert(g_empty_string); + output_device_ids_.insert( + String(media::AudioDeviceDescription::kDefaultDeviceId)); } else { output_device_ids_.insert(String::FromUTF8(device.device_id)); }
diff --git a/third_party/blink/renderer/platform/graphics/canvas_resource_provider.cc b/third_party/blink/renderer/platform/graphics/canvas_resource_provider.cc index 3a2e27a0..acc82f1 100644 --- a/third_party/blink/renderer/platform/graphics/canvas_resource_provider.cc +++ b/third_party/blink/renderer/platform/graphics/canvas_resource_provider.cc
@@ -302,20 +302,19 @@ gfx::Size size, SkColorType sk_color_type, SkAlphaType alpha_type, - sk_sp<SkColorSpace> sk_color_space, + const gfx::ColorSpace& color_space, base::WeakPtr<WebGraphicsContext3DProviderWrapper> context_provider_wrapper, bool is_accelerated, gpu::SharedImageUsageSet shared_image_usage_flags, CanvasResourceHost* resource_host) - : CanvasResourceProvider( - kSharedImage, - size, - sk_color_type, - alpha_type, - SkColorSpaceToGfxColorSpace(std::move(sk_color_space)), - std::move(context_provider_wrapper), - resource_host), + : CanvasResourceProvider(kSharedImage, + size, + sk_color_type, + alpha_type, + color_space, + std::move(context_provider_wrapper), + resource_host), is_accelerated_(is_accelerated), shared_image_usage_flags_(shared_image_usage_flags), use_oop_rasterization_(is_accelerated && ContextProviderWrapper() @@ -1189,7 +1188,8 @@ #endif auto provider = std::make_unique<CanvasResourceProviderSharedImage>( - size, adjusted_color_type, alpha_type, std::move(sk_color_space), + size, adjusted_color_type, alpha_type, + SkColorSpaceToGfxColorSpace(std::move(sk_color_space)), context_provider_wrapper, is_accelerated, shared_image_usage_flags, resource_host); if (provider->IsValid()) {
diff --git a/third_party/blink/renderer/platform/graphics/gpu/drawing_buffer.cc b/third_party/blink/renderer/platform/graphics/gpu/drawing_buffer.cc index 23b0a2f..456177f3 100644 --- a/third_party/blink/renderer/platform/graphics/gpu/drawing_buffer.cc +++ b/third_party/blink/renderer/platform/graphics/gpu/drawing_buffer.cc
@@ -450,8 +450,38 @@ return true; } - return FinishPrepareTransferableResourceSoftware(out_resource, - out_release_callback); + // Populate the TransferableResource with a SharedImage for the software + // compositor. + RegisteredBitmap registered = CreateOrRecycleBitmap(); + if (!registered.bitmap) { + return false; + } + + ReadFramebufferIntoBitmapPixels( + static_cast<uint8_t*>(registered.bitmap->memory())); + + *out_resource = viz::TransferableResource::MakeSoftwareSharedImage( + registered.shared_image, registered.sync_token, size_, + viz::SinglePlaneFormat::kBGRA_8888, + viz::TransferableResource::ResourceSource::kImageLayerBridge); + out_resource->color_space = back_color_buffer_->shared_image->color_space(); + out_resource->hdr_metadata = hdr_metadata_; + + // ReadFramebufferIntoBitmapPixels always produced bottom-Left origin. + out_resource->origin = kBottomLeft_GrSurfaceOrigin; + + // This holds a ref on the DrawingBuffer that will keep it alive until the + // mailbox is released (and while the release callback is running). It also + // owns the SharedBitmap. + *out_release_callback = + base::BindOnce(&DrawingBuffer::MailboxReleasedSoftware, + weak_factory_.GetWeakPtr(), std::move(registered)); + + contents_changed_ = false; + if (preserve_drawing_buffer_ == kDiscard) { + SetBufferClearNeeded(true); + } + return true; } DrawingBuffer::CheckForDestructionResult @@ -528,42 +558,6 @@ kN32_SkColorType, op); } -bool DrawingBuffer::FinishPrepareTransferableResourceSoftware( - viz::TransferableResource* out_resource, - viz::ReleaseCallback* out_release_callback) { - DCHECK(state_restorer_); - RegisteredBitmap registered = CreateOrRecycleBitmap(); - if (!registered.bitmap) { - return false; - } - - ReadFramebufferIntoBitmapPixels( - static_cast<uint8_t*>(registered.bitmap->memory())); - - *out_resource = viz::TransferableResource::MakeSoftwareSharedImage( - registered.shared_image, registered.sync_token, size_, - viz::SinglePlaneFormat::kBGRA_8888, - viz::TransferableResource::ResourceSource::kImageLayerBridge); - out_resource->color_space = back_color_buffer_->shared_image->color_space(); - out_resource->hdr_metadata = hdr_metadata_; - - // ReadFramebufferIntoBitmapPixels always produced bottom-Left origin. - out_resource->origin = kBottomLeft_GrSurfaceOrigin; - - // This holds a ref on the DrawingBuffer that will keep it alive until the - // mailbox is released (and while the release callback is running). It also - // owns the SharedBitmap. - *out_release_callback = - base::BindOnce(&DrawingBuffer::MailboxReleasedSoftware, - weak_factory_.GetWeakPtr(), std::move(registered)); - - contents_changed_ = false; - if (preserve_drawing_buffer_ == kDiscard) { - SetBufferClearNeeded(true); - } - return true; -} - scoped_refptr<gpu::ClientSharedImage> DrawingBuffer::ExportSharedImageFromBackBuffer( gpu::SyncToken& sync_token,
diff --git a/third_party/blink/renderer/platform/graphics/gpu/drawing_buffer.h b/third_party/blink/renderer/platform/graphics/gpu/drawing_buffer.h index 8b0d1f91..6129746c 100644 --- a/third_party/blink/renderer/platform/graphics/gpu/drawing_buffer.h +++ b/third_party/blink/renderer/platform/graphics/gpu/drawing_buffer.h
@@ -513,9 +513,6 @@ CheckForDestructionResult CheckForDestructionAndChangeAndResolveIfNeeded( DiscardBehavior discardBehavior); - // Helper functions to be called when exporting the backbuffer's contents to - // other APIs/use cases. - // // Exports a SharedImage holding the backbuffer's contents for external // usage: // * Ensures that the backbuffer's contents are up-to-date. @@ -533,12 +530,9 @@ scoped_refptr<gpu::ClientSharedImage> ExportSharedImageFromBackBuffer( gpu::SyncToken& sync_token, viz::ReleaseCallback* out_release_callback); - bool FinishPrepareTransferableResourceSoftware( - viz::TransferableResource* out_resource, - viz::ReleaseCallback* out_release_callback); - // Callbacks for mailboxes given to the compositor from - // FinishPrepareTransferableResource{Gpu,Software}. + // Callbacks for SharedImages exported for external usage (e.g., by canvas/ + // compositor/static bitmap image). static void NotifyMailboxReleasedGpu(scoped_refptr<ColorBuffer>, const gpu::SyncToken&, bool lost_resource);
diff --git a/third_party/blink/renderer/platform/graphics/paint/cull_rect.cc b/third_party/blink/renderer/platform/graphics/paint/cull_rect.cc index 91d1646..4306452 100644 --- a/third_party/blink/renderer/platform/graphics/paint/cull_rect.cc +++ b/third_party/blink/renderer/platform/graphics/paint/cull_rect.cc
@@ -60,6 +60,10 @@ int local_pixel_distance_to_expand = pixel_distance_to_expand * expansion_ratio; + if (local_pixel_distance_to_expand == 0) { + // This can happen when the expansion_ratio is very small. + return min_expansion; + } float scale = GeometryMapper::SourceToDestinationApproximateMinimumScale( root_transform, local_transform); // A very big scale may be caused by non-invertable near non-invertable
diff --git a/third_party/blink/renderer/platform/graphics/paint/cull_rect_test.cc b/third_party/blink/renderer/platform/graphics/paint/cull_rect_test.cc index 5bc39d9..46e1bb2 100644 --- a/third_party/blink/renderer/platform/graphics/paint/cull_rect_test.cc +++ b/third_party/blink/renderer/platform/graphics/paint/cull_rect_test.cc
@@ -235,6 +235,26 @@ EXPECT_EQ(gfx::Rect(3020, 5010, 40, 50), cull_rect.Rect()); } +TEST_F(CullRectTest, + ApplyScrollTranslationPartialScrollingContentsWithTinyExpansionRatio) { + // Results should be the same as no expansion. + expansion_ratio_ = 0.00001; + auto state = CreateCompositedScrollTranslationState( + PropertyTreeState::Root(), -3000, -5000, gfx::Rect(20, 10, 40, 50), + gfx::Size(8000, 8000)); + auto& scroll_translation = state.Transform(); + + CullRect cull_rect(gfx::Rect(0, 0, 50, 100)); + EXPECT_EQ(std::make_pair(false, false), + ApplyScrollTranslation(cull_rect, scroll_translation)); + EXPECT_EQ(gfx::Rect(3020, 5010, 30, 50), cull_rect.Rect()); + + cull_rect = CullRect::Infinite(); + EXPECT_EQ(std::make_pair(false, false), + ApplyScrollTranslation(cull_rect, scroll_translation)); + EXPECT_EQ(gfx::Rect(3020, 5010, 40, 50), cull_rect.Rect()); +} + TEST_F(CullRectTest, ApplyScrollTranslationNoIntersectionWithContainerRect) { auto state = CreateCompositedScrollTranslationState( PropertyTreeState::Root(), -10, -15, gfx::Rect(200, 100, 40, 50),
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5 index 410d4b2..b838d68 100644 --- a/third_party/blink/renderer/platform/runtime_enabled_features.json5 +++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -1825,16 +1825,8 @@ base_feature: "none", }, { - name: "FedCmIdpSigninStatus", - depends_on: ["FedCm"], - public: true, - status: "stable", - base_feature: "none", - browser_process_read_access: true, - }, - { name: "FedCmLightweightMode", - depends_on: ["FedCmIdpSigninStatus"], + depends_on: ["FedCm"], status: "test", public: true, base_feature: "none",
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations index c6402dc6..be01deeb 100644 --- a/third_party/blink/web_tests/TestExpectations +++ b/third_party/blink/web_tests/TestExpectations
@@ -822,9 +822,6 @@ crbug.com/922249 virtual/android/fullscreen/compositor-touch-hit-rects-fullscreen-video-controls.html [ Failure Pass ] -# Fractional paint offsets lead to 1px bleed with position sticky. -crbug.com/1136079 external/wpt/css/css-position/sticky/position-sticky-fractional-offset.html [ Failure ] - # ====== Layout team owned tests from here ====== crbug.com/711704 external/wpt/css/CSS2/floats/floats-rule3-outside-left-002.xht [ Failure ] @@ -9072,3 +9069,9 @@ # Gardener 2025-01-10 crbug.com/389012014 [ Mac13 ] fast/peerconnection/RTCRtpSender-getParameters.html [ Pass Timeout ] + +# Flaky performance API tests +crbug.com/387096438 virtual/scalefactor200/external/wpt/largest-contentful-paint/animated/observe-video.tentative.html [ Failure Pass ] +crbug.com/385337582 external/wpt/paint-timing/fcp-only/fcp-document-opacity-image.html [ Failure Pass ] +crbug.com/383627707 [ Mac ] external/wpt/element-timing/image-carousel.html [ Failure Pass ] +crbug.com/379474211 external/wpt/paint-timing/fcp-only/fcp-document-opacity-text.html [ Failure Pass ]
diff --git a/third_party/blink/web_tests/TestLists/content_shell.filter b/third_party/blink/web_tests/TestLists/content_shell.filter index 007bcfb..e0e55adf 100644 --- a/third_party/blink/web_tests/TestLists/content_shell.filter +++ b/third_party/blink/web_tests/TestLists/content_shell.filter
@@ -52,7 +52,6 @@ external/wpt/background-fetch/fetch-uploads.https.window.html external/wpt/background-fetch/match.https.window.html external/wpt/background-fetch/update-ui.https.window.html -external/wpt/battery-status/page-visibility.https.html external/wpt/bluetooth/* external/wpt/client-hints/viewport-size/viewport-size-subresource.https.html external/wpt/client-hints/viewport-size/viewport-size-window-different-dimensions.https.html @@ -609,7 +608,6 @@ external/wpt/editing/plaintext-only/paste.https.html* external/wpt/element-timing/observe-multiple-images.html external/wpt/encoding/unsupported-labels.window.html -external/wpt/event-timing/event-click-visibilitychange.html external/wpt/event-timing/keyup.html external/wpt/event-timing/modal-dialog-interrupt-paint.html external/wpt/event-timing/selection-autoscroll.html @@ -829,7 +827,6 @@ external/wpt/html/webappapis/scripting/processing-model-2/runtime-error-in-setInterval.html external/wpt/html/webappapis/scripting/processing-model-2/runtime-error-in-setTimeout.html external/wpt/idle-detection/idle-detection-allowed-by-permissions-policy.https.sub.html -external/wpt/idle-detection/page-visibility.https.html external/wpt/import-maps/data-driven/resolving.html?scopes.json external/wpt/import-maps/multiple-import-maps/resolution-consistency-in-module-tree.html external/wpt/IndexedDB/idbindex_getAll.any.* @@ -846,7 +843,6 @@ external/wpt/largest-contentful-paint/video-data-uri.html external/wpt/layout-instability/video.html external/wpt/long-animation-frame/tentative/loaf-iframe-self.html -external/wpt/long-animation-frame/tentative/loaf-visibility.html external/wpt/mathml/presentation-markup/fractions/frac-parameters-gap-* external/wpt/mathml/presentation-markup/operators/mo-form-dynamic.html external/wpt/mathml/presentation-markup/operators/mo-form-minus-plus.html @@ -879,8 +875,6 @@ external/wpt/orientation-sensor/AbsoluteOrientationSensor-iframe-access.https.html external/wpt/orientation-sensor/RelativeOrientationSensor.https.html external/wpt/orientation-sensor/RelativeOrientationSensor-iframe-access.https.html -external/wpt/page-visibility/minimize.html -external/wpt/page-visibility/visibility-state-entry.tentative.html external/wpt/paint-timing/fcp-only/fcp-document-opacity-image.html external/wpt/paint-timing/fcp-only/fcp-document-opacity-text.html external/wpt/paint-timing/with-first-paint/first-contentful-canvas-webgl2.html
diff --git a/third_party/blink/web_tests/external/wpt/ua-client-hints/useragentdata.https.any.js b/third_party/blink/web_tests/external/wpt/ua-client-hints/useragentdata.https.any.js index fa58835..73059152b 100644 --- a/third_party/blink/web_tests/external/wpt/ua-client-hints/useragentdata.https.any.js +++ b/third_party/blink/web_tests/external/wpt/ua-client-hints/useragentdata.https.any.js
@@ -14,6 +14,46 @@ }, "test NavigatorUAData.toJSON() output"); promise_test(() => { + return navigator.userAgentData.getHighEntropyValues([]).then(hints => { + assert_own_property(hints, "brands", "brands is returned by default"); + assert_own_property(hints, "mobile", "mobile is returned by default"); + assert_own_property(hints, "platform", "platform is returned by default"); + }); +}, "getHighEntropyValues() should return low-entropy hints by default (1)."); + +promise_test(() => { + return navigator.userAgentData.getHighEntropyValues(["wow64"]).then(hints => { + assert_own_property( + hints, "wow64", "requested high-entropy hint is returned"); + assert_own_property(hints, "brands", "brands is returned by default"); + assert_own_property(hints, "mobile", "mobile is returned by default"); + assert_own_property(hints, "platform", "platform is returned by default"); + }); +}, "getHighEntropyValues() should return low-entropy hints by default (2)."); + +promise_test(() => { + return navigator.userAgentData.getHighEntropyValues(["brands", "mobile"]) + .then(hints => { + assert_own_property(hints, "brands", "requested brands is returned"); + assert_own_property( + hints, "mobile", "requested mobile is returned by default"); + assert_own_property( + hints, "platform", "platform is returned by default"); + }); +}, "getHighEntropyValues() should return low-entropy hints by default (3)."); + +promise_test(() => { + return navigator.userAgentData.getHighEntropyValues(["platform", "wow64"]) + .then(hints => { + assert_own_property(hints, "brands", "brands is returned by default"); + assert_own_property(hints, "mobile", "mobile is returned by default"); + assert_own_property( + hints, "platform", "requested platform is returned"); + assert_own_property(hints, "wow64", "requested wow64 is returned"); + }); +}, "getHighEntropyValues() should return low-entropy hints by default (4)."); + +promise_test(() => { return navigator.userAgentData.getHighEntropyValues(["architecture"]).then( hints => assert_true(["x86", "arm"].some(item => item == hints.architecture)) );
diff --git a/third_party/blink/web_tests/wpt_internal/webaudio/audiocontext-sinkid-setsinkid-default.https.window.js b/third_party/blink/web_tests/wpt_internal/webaudio/audiocontext-sinkid-setsinkid-default.https.window.js new file mode 100644 index 0000000..7cbf106b --- /dev/null +++ b/third_party/blink/web_tests/wpt_internal/webaudio/audiocontext-sinkid-setsinkid-default.https.window.js
@@ -0,0 +1,15 @@ +'use strict'; + +const audioContext = new AudioContext(); + +promise_test(async t => { + // Chromium enumerateDevices() returns 'default' as a deviceId for default + // device. So, it should be accepted as a sinkId parameter. + await audioContext.setSinkId('default'); + t.step(() => { + // If 'default' is set, its sinkId should be 'default'. + assert_equals(typeof audioContext.sinkId, 'string'); + assert_equals(audioContext.sinkId, 'default'); + }); + return audioContext.setSinkId('default'); +}, "setSinkId with 'default' should be retrieved as 'default' in sinkId.");
diff --git a/third_party/chromite b/third_party/chromite index 0998de1..a9fdaf0 160000 --- a/third_party/chromite +++ b/third_party/chromite
@@ -1 +1 @@ -Subproject commit 0998de1c990e33172ed27fdd13252e062cd2d4c7 +Subproject commit a9fdaf06401860211c818d7000208547d9de4b1b
diff --git a/third_party/dawn b/third_party/dawn index e2894d1..07cbbfb 160000 --- a/third_party/dawn +++ b/third_party/dawn
@@ -1 +1 @@ -Subproject commit e2894d1f5a19ec70b65828be0c2363f55e1a4327 +Subproject commit 07cbbfbf05a3b1e9f22b3d0ac3203a5a70c15689
diff --git a/third_party/devtools-frontend/src b/third_party/devtools-frontend/src index 32ab3025..ed19c1e 160000 --- a/third_party/devtools-frontend/src +++ b/third_party/devtools-frontend/src
@@ -1 +1 @@ -Subproject commit 32ab3025514394538797f79c89b2f0a02fed255f +Subproject commit ed19c1e8985293025be2e812b86ea7619185fcfd
diff --git a/third_party/fuzztest/src b/third_party/fuzztest/src index 70e24aa..032f0bd 160000 --- a/third_party/fuzztest/src +++ b/third_party/fuzztest/src
@@ -1 +1 @@ -Subproject commit 70e24aa9499f5563bb13ec9d0b8490ec2bf09510 +Subproject commit 032f0bdd8c0a3800eb49131d212142a61df81b0c
diff --git a/third_party/libunwindstack b/third_party/libunwindstack index c8ff202..e5061bb 160000 --- a/third_party/libunwindstack +++ b/third_party/libunwindstack
@@ -1 +1 @@ -Subproject commit c8ff202d9233cc0781715cb87f354045bb0dbee9 +Subproject commit e5061bbda4c2ba6438020669ed06b122032433dd
diff --git a/third_party/llvm-libc/src b/third_party/llvm-libc/src index 44258fc..9ee8901 160000 --- a/third_party/llvm-libc/src +++ b/third_party/llvm-libc/src
@@ -1 +1 @@ -Subproject commit 44258fc58f1db70b223625a1dbc9c1ceea184ecf +Subproject commit 9ee890194fe9d4f39b1d5114c6e291b72e6062dd
diff --git a/third_party/lzma_sdk/Asm/arm64/7zAsm.S b/third_party/lzma_sdk/Asm/arm64/7zAsm.S deleted file mode 100644 index aa30a9ef..0000000 --- a/third_party/lzma_sdk/Asm/arm64/7zAsm.S +++ /dev/null
@@ -1,194 +0,0 @@ -// 7zAsm.S -- ASM macros for arm64 -// 2021-04-25 : Igor Pavlov : Public domain - -#define r0 x0 -#define r1 x1 -#define r2 x2 -#define r3 x3 -#define r4 x4 -#define r5 x5 -#define r6 x6 -#define r7 x7 -#define r8 x8 -#define r9 x9 -#define r10 x10 -#define r11 x11 -#define r12 x12 -#define r13 x13 -#define r14 x14 -#define r15 x15 -#define r16 x16 -#define r17 x17 -#define r18 x18 -#define r19 x19 -#define r20 x20 -#define r21 x21 -#define r22 x22 -#define r23 x23 -#define r24 x24 -#define r25 x25 -#define r26 x26 -#define r27 x27 -#define r28 x28 -#define r29 x29 -#define r30 x30 - -#define REG_ABI_PARAM_0 r0 -#define REG_ABI_PARAM_1 r1 -#define REG_ABI_PARAM_2 r2 - -// The .note.gnu.property section is required because Chromium Android builds -// utilize the linker flag force-bti. -.pushsection .note.gnu.property, "a" -.balign 8 -.long 4 -.long 0x10 -.long 0x5 -.asciz "GNU" -.long 0xc0000000 -.long 4 -.long ((1 << 0 ) | (1 << 1)) -.long 0 -.popsection - -.macro p2_add reg:req, param:req - add \reg, \reg, \param -.endm - -.macro p2_sub reg:req, param:req - sub \reg, \reg, \param -.endm - -.macro p2_sub_s reg:req, param:req - subs \reg, \reg, \param -.endm - -.macro p2_and reg:req, param:req - and \reg, \reg, \param -.endm - -.macro xor reg:req, param:req - eor \reg, \reg, \param -.endm - -.macro or reg:req, param:req - orr \reg, \reg, \param -.endm - -.macro shl reg:req, param:req - lsl \reg, \reg, \param -.endm - -.macro shr reg:req, param:req - lsr \reg, \reg, \param -.endm - -.macro sar reg:req, param:req - asr \reg, \reg, \param -.endm - -.macro p1_neg reg:req - neg \reg, \reg -.endm - -.macro dec reg:req - sub \reg, \reg, 1 -.endm - -.macro dec_s reg:req - subs \reg, \reg, 1 -.endm - -.macro inc reg:req - add \reg, \reg, 1 -.endm - -.macro inc_s reg:req - adds \reg, \reg, 1 -.endm - - -.macro imul reg:req, param:req - mul \reg, \reg, \param -.endm - -/* -arm64 and arm use reverted c flag after subs/cmp instructions: - arm64-arm : x86 - b.lo / b.cc : jb / jc - b.hs / b.cs : jae / jnc -*/ - -.macro jmp lab:req - b \lab -.endm - -.macro je lab:req - b.eq \lab -.endm - -.macro jz lab:req - b.eq \lab -.endm - -.macro jnz lab:req - b.ne \lab -.endm - -.macro jne lab:req - b.ne \lab -.endm - -.macro jb lab:req - b.lo \lab -.endm - -.macro jbe lab:req - b.ls \lab -.endm - -.macro ja lab:req - b.hi \lab -.endm - -.macro jae lab:req - b.hs \lab -.endm - - -.macro cmove dest:req, srcTrue:req - csel \dest, \srcTrue, \dest, eq -.endm - -.macro cmovne dest:req, srcTrue:req - csel \dest, \srcTrue, \dest, ne -.endm - -.macro cmovs dest:req, srcTrue:req - csel \dest, \srcTrue, \dest, mi -.endm - -.macro cmovns dest:req, srcTrue:req - csel \dest, \srcTrue, \dest, pl -.endm - -.macro cmovb dest:req, srcTrue:req - csel \dest, \srcTrue, \dest, lo -.endm - -.macro cmovae dest:req, srcTrue:req - csel \dest, \srcTrue, \dest, hs -.endm - - -.macro MY_ALIGN_16 macro - .p2align 4,, (1 << 4) - 1 -.endm - -.macro MY_ALIGN_32 macro - .p2align 5,, (1 << 5) - 1 -.endm - -.macro MY_ALIGN_64 macro - .p2align 6,, (1 << 6) - 1 -.endm
diff --git a/third_party/lzma_sdk/Asm/x86/7zAsm.asm b/third_party/lzma_sdk/Asm/x86/7zAsm.asm index a77edf2..8b994a5e 100644 --- a/third_party/lzma_sdk/Asm/x86/7zAsm.asm +++ b/third_party/lzma_sdk/Asm/x86/7zAsm.asm
@@ -1,5 +1,5 @@ ; 7zAsm.asm -- ASM macros -; 2022-05-16 : Igor Pavlov : Public domain +; 2023-12-08 : Igor Pavlov : Public domain ; UASM can require these changes @@ -43,7 +43,7 @@ endif endif -OPTION PROLOGUE:NONE +OPTION PROLOGUE:NONE OPTION EPILOGUE:NONE MY_ASM_START macro @@ -52,7 +52,7 @@ else .386 .model flat - SEVENZ SEGMENT PARA PUBLIC 'CODE' + _TEXT$00 SEGMENT PARA PUBLIC 'CODE' endif endm @@ -121,10 +121,29 @@ x2_H equ DH x3_H equ BH +; r0_L equ AL +; r1_L equ CL +; r2_L equ DL +; r3_L equ BL + +; r0_H equ AH +; r1_H equ CH +; r2_H equ DH +; r3_H equ BH + + ifdef x64 x5_L equ BPL x6_L equ SIL x7_L equ DIL + x8_L equ r8b + x9_L equ r9b + x10_L equ r10b + x11_L equ r11b + x12_L equ r12b + x13_L equ r13b + x14_L equ r14b + x15_L equ r15b r0 equ RAX r1 equ RCX @@ -153,6 +172,22 @@ r7 equ x7 endif + x0_R equ r0 + x1_R equ r1 + x2_R equ r2 + x3_R equ r3 + x4_R equ r4 + x5_R equ r5 + x6_R equ r6 + x7_R equ r7 + x8_R equ r8 + x9_R equ r9 + x10_R equ r10 + x11_R equ r11 + x12_R equ r12 + x13_R equ r13 + x14_R equ r14 + x15_R equ r15 ifdef x64 ifdef ABI_LINUX @@ -200,6 +235,14 @@ REG_ABI_PARAM_1_x equ REG_PARAM_1_x REG_ABI_PARAM_1 equ REG_PARAM_1 +MY_PUSH_PRESERVED_ABI_REGS_UP_TO_INCLUDING_R11 macro + MY_PUSH_4_REGS +endm + +MY_POP_PRESERVED_ABI_REGS_UP_TO_INCLUDING_R11 macro + MY_POP_4_REGS +endm + else ; x64 @@ -261,12 +304,25 @@ endif ; IS_LINUX -MY_PUSH_PRESERVED_ABI_REGS macro +MY_PUSH_PRESERVED_ABI_REGS_UP_TO_INCLUDING_R11 macro if (IS_LINUX gt 0) MY_PUSH_2_REGS else MY_PUSH_4_REGS endif +endm + +MY_POP_PRESERVED_ABI_REGS_UP_TO_INCLUDING_R11 macro + if (IS_LINUX gt 0) + MY_POP_2_REGS + else + MY_POP_4_REGS + endif +endm + + +MY_PUSH_PRESERVED_ABI_REGS macro + MY_PUSH_PRESERVED_ABI_REGS_UP_TO_INCLUDING_R11 push r12 push r13 push r14 @@ -279,11 +335,7 @@ pop r14 pop r13 pop r12 - if (IS_LINUX gt 0) - MY_POP_2_REGS - else - MY_POP_4_REGS - endif + MY_POP_PRESERVED_ABI_REGS_UP_TO_INCLUDING_R11 endm endif ; x64
diff --git a/third_party/lzma_sdk/Asm/x86/7zCrcOpt.asm b/third_party/lzma_sdk/Asm/x86/7zCrcOpt.asm deleted file mode 100644 index 97a6b9a..0000000 --- a/third_party/lzma_sdk/Asm/x86/7zCrcOpt.asm +++ /dev/null
@@ -1,180 +0,0 @@ -; 7zCrcOpt.asm -- CRC32 calculation : optimized version -; 2021-02-07 : Igor Pavlov : Public domain - -include 7zAsm.asm - -MY_ASM_START - -rD equ r2 -rN equ r7 -rT equ r5 - -ifdef x64 - num_VAR equ r8 - table_VAR equ r9 -else - if (IS_CDECL gt 0) - crc_OFFS equ (REG_SIZE * 5) - data_OFFS equ (REG_SIZE + crc_OFFS) - size_OFFS equ (REG_SIZE + data_OFFS) - else - size_OFFS equ (REG_SIZE * 5) - endif - table_OFFS equ (REG_SIZE + size_OFFS) - num_VAR equ [r4 + size_OFFS] - table_VAR equ [r4 + table_OFFS] -endif - -SRCDAT equ rD + rN * 1 + 4 * - -CRC macro op:req, dest:req, src:req, t:req - op dest, DWORD PTR [rT + src * 4 + 0400h * t] -endm - -CRC_XOR macro dest:req, src:req, t:req - CRC xor, dest, src, t -endm - -CRC_MOV macro dest:req, src:req, t:req - CRC mov, dest, src, t -endm - -CRC1b macro - movzx x6, BYTE PTR [rD] - inc rD - movzx x3, x0_L - xor x6, x3 - shr x0, 8 - CRC xor, x0, r6, 0 - dec rN -endm - -MY_PROLOG macro crc_end:req - - ifdef x64 - if (IS_LINUX gt 0) - MY_PUSH_2_REGS - mov x0, REG_ABI_PARAM_0_x ; x0 = x7 - mov rT, REG_ABI_PARAM_3 ; r5 = r1 - mov rN, REG_ABI_PARAM_2 ; r7 = r2 - mov rD, REG_ABI_PARAM_1 ; r2 = r6 - else - MY_PUSH_4_REGS - mov x0, REG_ABI_PARAM_0_x ; x0 = x1 - mov rT, REG_ABI_PARAM_3 ; r5 = r9 - mov rN, REG_ABI_PARAM_2 ; r7 = r8 - ; mov rD, REG_ABI_PARAM_1 ; r2 = r2 - endif - else - MY_PUSH_4_REGS - if (IS_CDECL gt 0) - mov x0, [r4 + crc_OFFS] - mov rD, [r4 + data_OFFS] - else - mov x0, REG_ABI_PARAM_0_x - endif - mov rN, num_VAR - mov rT, table_VAR - endif - - test rN, rN - jz crc_end - @@: - test rD, 7 - jz @F - CRC1b - jnz @B - @@: - cmp rN, 16 - jb crc_end - add rN, rD - mov num_VAR, rN - sub rN, 8 - and rN, NOT 7 - sub rD, rN - xor x0, [SRCDAT 0] -endm - -MY_EPILOG macro crc_end:req - xor x0, [SRCDAT 0] - mov rD, rN - mov rN, num_VAR - sub rN, rD - crc_end: - test rN, rN - jz @F - CRC1b - jmp crc_end - @@: - if (IS_X64 gt 0) and (IS_LINUX gt 0) - MY_POP_2_REGS - else - MY_POP_4_REGS - endif -endm - -MY_PROC CrcUpdateT8, 4 - MY_PROLOG crc_end_8 - mov x1, [SRCDAT 1] - align 16 - main_loop_8: - mov x6, [SRCDAT 2] - movzx x3, x1_L - CRC_XOR x6, r3, 3 - movzx x3, x1_H - CRC_XOR x6, r3, 2 - shr x1, 16 - movzx x3, x1_L - movzx x1, x1_H - CRC_XOR x6, r3, 1 - movzx x3, x0_L - CRC_XOR x6, r1, 0 - - mov x1, [SRCDAT 3] - CRC_XOR x6, r3, 7 - movzx x3, x0_H - shr x0, 16 - CRC_XOR x6, r3, 6 - movzx x3, x0_L - CRC_XOR x6, r3, 5 - movzx x3, x0_H - CRC_MOV x0, r3, 4 - xor x0, x6 - add rD, 8 - jnz main_loop_8 - - MY_EPILOG crc_end_8 -MY_ENDP - -MY_PROC CrcUpdateT4, 4 - MY_PROLOG crc_end_4 - align 16 - main_loop_4: - movzx x1, x0_L - movzx x3, x0_H - shr x0, 16 - movzx x6, x0_H - and x0, 0FFh - CRC_MOV x1, r1, 3 - xor x1, [SRCDAT 1] - CRC_XOR x1, r3, 2 - CRC_XOR x1, r6, 0 - CRC_XOR x1, r0, 1 - - movzx x0, x1_L - movzx x3, x1_H - shr x1, 16 - movzx x6, x1_H - and x1, 0FFh - CRC_MOV x0, r0, 3 - xor x0, [SRCDAT 2] - CRC_XOR x0, r3, 2 - CRC_XOR x0, r6, 0 - CRC_XOR x0, r1, 1 - add rD, 8 - jnz main_loop_4 - - MY_EPILOG crc_end_4 -MY_ENDP - -end
diff --git a/third_party/lzma_sdk/Asm/x86/LzmaDecOpt.asm b/third_party/lzma_sdk/Asm/x86/LzmaDecOpt.asm index ddbd88f..f2dcceb 100644 --- a/third_party/lzma_sdk/Asm/x86/LzmaDecOpt.asm +++ b/third_party/lzma_sdk/Asm/x86/LzmaDecOpt.asm
@@ -1,5 +1,5 @@ ; LzmaDecOpt.asm -- ASM version of LzmaDec_DecodeReal_3() function -; 2021-02-23: Igor Pavlov : Public domain +; 2024-06-18: Igor Pavlov : Public domain ; ; 3 - is the code compatibility version of LzmaDec_DecodeReal_*() ; function for check at link time. @@ -17,11 +17,43 @@ MY_ASM_START -LZMADEC SEGMENT ALIGN(64) 'CODE' +; if Z7_LZMA_DEC_OPT_ASM_USE_SEGMENT is defined, we use additional SEGMENT with 64-byte alignment. +; if Z7_LZMA_DEC_OPT_ASM_USE_SEGMENT is not defined, we use default SEGMENT (where default 16-byte alignment of segment is expected). +; The performance is almost identical in our tests. +; But the performance can depend from position of lzmadec code inside instruction cache +; or micro-op cache line (depending from low address bits in 32-byte/64-byte cache lines). +; And 64-byte alignment provides a more consistent speed regardless +; of the code's position in the executable. +; But also it's possible that code without Z7_LZMA_DEC_OPT_ASM_USE_SEGMENT can be +; slightly faster than 64-bytes aligned code in some cases, if offset of lzmadec +; code in 64-byte block after compilation provides better speed by some reason. +; Note that Z7_LZMA_DEC_OPT_ASM_USE_SEGMENT adds an extra section to the ELF file. +; If you don't want to get that extra section, do not define Z7_LZMA_DEC_OPT_ASM_USE_SEGMENT. +ifndef Z7_LZMA_DEC_OPT_ASM_USE_SEGMENT +if (IS_LINUX gt 0) + Z7_LZMA_DEC_OPT_ASM_USE_SEGMENT equ 1 +else + Z7_LZMA_DEC_OPT_ASM_USE_SEGMENT equ 1 +endif +endif + +ifdef Z7_LZMA_DEC_OPT_ASM_USE_SEGMENT +; Make this deterministic +; _TEXT$LZMADECOPT SEGMENT ALIGN(64) 'CODE' +LZMADEC SEGMENT ALIGN(64) 'CODE' MY_ALIGN macro num:req align num + ; align 16 endm +else +MY_ALIGN macro num:req + ; We expect that ".text" is aligned for 16-bytes. + ; So we don't need large alignment inside out function. + align 16 +endm +endif + MY_ALIGN_16 macro MY_ALIGN 16 @@ -610,7 +642,11 @@ PARAM_limit equ REG_ABI_PARAM_1 PARAM_bufLimit equ REG_ABI_PARAM_2 +ifdef Z7_LZMA_DEC_OPT_ASM_USE_SEGMENT ; MY_ALIGN_64 +else + MY_ALIGN_16 +endif MY_PROC LzmaDec_DecodeReal_3, 3 MY_PUSH_PRESERVED_ABI_REGS @@ -1298,6 +1334,8 @@ MY_POP_PRESERVED_ABI_REGS MY_ENDP +ifdef Z7_LZMA_DEC_OPT_ASM_USE_SEGMENT LZMADEC ENDS +endif end
diff --git a/third_party/lzma_sdk/Asm/x86/Sha256Opt.asm b/third_party/lzma_sdk/Asm/x86/Sha256Opt.asm index 116153b..a079302 100644 --- a/third_party/lzma_sdk/Asm/x86/Sha256Opt.asm +++ b/third_party/lzma_sdk/Asm/x86/Sha256Opt.asm
@@ -1,5 +1,5 @@ ; Sha256Opt.asm -- SHA-256 optimized code for SHA-256 x86 hardware instructions -; 2022-04-17 : Igor Pavlov : Public domain +; 2024-06-16 : Igor Pavlov : Public domain include 7zAsm.asm @@ -20,7 +20,7 @@ EXTRN K_CONST:xmmword @ -CONST SEGMENT +CONST SEGMENT READONLY align 16 Reverse_Endian_Mask db 3,2,1,0, 7,6,5,4, 11,10,9,8, 15,14,13,12
diff --git a/third_party/lzma_sdk/Asm/x86/XzCrc64Opt.asm b/third_party/lzma_sdk/Asm/x86/XzCrc64Opt.asm index 1c67037b..de023f9f 100644 --- a/third_party/lzma_sdk/Asm/x86/XzCrc64Opt.asm +++ b/third_party/lzma_sdk/Asm/x86/XzCrc64Opt.asm
@@ -1,113 +1,231 @@ ; XzCrc64Opt.asm -- CRC64 calculation : optimized version -; 2021-02-06 : Igor Pavlov : Public domain +; 2023-12-08 : Igor Pavlov : Public domain include 7zAsm.asm MY_ASM_START +NUM_WORDS equ 3 + +if (NUM_WORDS lt 1) or (NUM_WORDS gt 64) +.err <num_words_IS_INCORRECT> +endif + +NUM_SKIP_BYTES equ ((NUM_WORDS - 2) * 4) + + +MOVZXLO macro dest:req, src:req + movzx dest, @CatStr(src, _L) +endm + +MOVZXHI macro dest:req, src:req + movzx dest, @CatStr(src, _H) +endm + + ifdef x64 -rD equ r9 +rD equ r11 rN equ r10 -rT equ r5 -num_VAR equ r8 - -SRCDAT4 equ dword ptr [rD + rN * 1] +rT equ r9 + +CRC_OP macro op:req, dest:req, src:req, t:req + op dest, QWORD PTR [rT + @CatStr(src, _R) * 8 + 0800h * (t)] +endm CRC_XOR macro dest:req, src:req, t:req - xor dest, QWORD PTR [rT + src * 8 + 0800h * t] + CRC_OP xor, dest, src, t +endm + +CRC_MOV macro dest:req, src:req, t:req + CRC_OP mov, dest, src, t endm CRC1b macro - movzx x6, BYTE PTR [rD] - inc rD - movzx x3, x0_L - xor x6, x3 - shr r0, 8 - CRC_XOR r0, r6, 0 - dec rN + movzx x6, BYTE PTR [rD] + inc rD + MOVZXLO x3, x0 + xor x6, x3 + shr r0, 8 + CRC_XOR r0, x6, 0 + dec rN endm -MY_PROLOG macro crc_end:req - ifdef ABI_LINUX - MY_PUSH_2_REGS - else - MY_PUSH_4_REGS - endif - mov r0, REG_ABI_PARAM_0 - mov rN, REG_ABI_PARAM_2 - mov rT, REG_ABI_PARAM_3 - mov rD, REG_ABI_PARAM_1 - test rN, rN - jz crc_end - @@: - test rD, 3 - jz @F - CRC1b - jnz @B - @@: - cmp rN, 8 - jb crc_end - add rN, rD - mov num_VAR, rN - sub rN, 4 - and rN, NOT 3 - sub rD, rN - mov x1, SRCDAT4 - xor r0, r1 - add rN, 4 + +; ALIGN_MASK is 3 or 7 bytes alignment: +ALIGN_MASK equ (7 - (NUM_WORDS and 1) * 4) + +if NUM_WORDS eq 1 + +src_rN_offset equ 4 +; + 4 for prefetching next 4-bytes after current iteration +NUM_BYTES_LIMIT equ (NUM_WORDS * 4 + 4) +SRCDAT4 equ DWORD PTR [rN + rD * 1] + +XOR_NEXT macro + mov x1, [rD] + xor r0, r1 endm -MY_EPILOG macro crc_end:req - sub rN, 4 - mov x1, SRCDAT4 - xor r0, r1 - mov rD, rN - mov rN, num_VAR - sub rN, rD - crc_end: - test rN, rN - jz @F - CRC1b - jmp crc_end - @@: - ifdef ABI_LINUX - MY_POP_2_REGS - else - MY_POP_4_REGS - endif +else ; NUM_WORDS > 1 + +src_rN_offset equ 8 +; + 8 for prefetching next 8-bytes after current iteration +NUM_BYTES_LIMIT equ (NUM_WORDS * 4 + 8) + +XOR_NEXT macro + xor r0, QWORD PTR [rD] ; 64-bit read, can be unaligned endm -MY_PROC XzCrc64UpdateT4, 4 - MY_PROLOG crc_end_4 - align 16 - main_loop_4: - mov x1, SRCDAT4 - movzx x2, x0_L - movzx x3, x0_H - shr r0, 16 - movzx x6, x0_L - movzx x7, x0_H - shr r0, 16 - CRC_XOR r1, r2, 3 - CRC_XOR r0, r3, 2 - CRC_XOR r1, r6, 1 - CRC_XOR r0, r7, 0 - xor r0, r1 +; 32-bit or 64-bit +LOAD_SRC_MULT4 macro dest:req, word_index:req + mov dest, [rN + rD * 1 + 4 * (word_index) - src_rN_offset]; +endm - add rD, 4 - jnz main_loop_4 +endif - MY_EPILOG crc_end_4 + + +MY_PROC @CatStr(XzCrc64UpdateT, %(NUM_WORDS * 4)), 4 + MY_PUSH_PRESERVED_ABI_REGS_UP_TO_INCLUDING_R11 + + mov r0, REG_ABI_PARAM_0 ; r0 <- r1 / r7 + mov rD, REG_ABI_PARAM_1 ; r11 <- r2 / r6 + mov rN, REG_ABI_PARAM_2 ; r10 <- r8 / r2 +if (IS_LINUX gt 0) + mov rT, REG_ABI_PARAM_3 ; r9 <- r9 / r1 +endif + + cmp rN, NUM_BYTES_LIMIT + ALIGN_MASK + jb crc_end +@@: + test rD, ALIGN_MASK + jz @F + CRC1b + jmp @B +@@: + XOR_NEXT + lea rN, [rD + rN * 1 - (NUM_BYTES_LIMIT - 1)] + sub rD, rN + add rN, src_rN_offset + +align 16 +@@: + +if NUM_WORDS eq 1 + + mov x1, x0 + shr x1, 8 + MOVZXLO x3, x1 + MOVZXLO x2, x0 + shr x1, 8 + shr r0, 32 + xor x0, SRCDAT4 + CRC_XOR r0, x2, 3 + CRC_XOR r0, x3, 2 + MOVZXLO x2, x1 + shr x1, 8 + CRC_XOR r0, x2, 1 + CRC_XOR r0, x1, 0 + +else ; NUM_WORDS > 1 + +if NUM_WORDS ne 2 + k = 2 + while k lt NUM_WORDS + + LOAD_SRC_MULT4 x1, k + crc_op1 textequ <xor> + + if k eq 2 + if (NUM_WORDS and 1) + LOAD_SRC_MULT4 x7, NUM_WORDS ; aligned 32-bit + LOAD_SRC_MULT4 x6, NUM_WORDS + 1 ; aligned 32-bit + shl r6, 32 + else + LOAD_SRC_MULT4 r6, NUM_WORDS ; aligned 64-bit + crc_op1 textequ <mov> + endif + endif + table = 4 * (NUM_WORDS - 1 - k) + MOVZXLO x3, x1 + CRC_OP crc_op1, r7, x3, 3 + table + MOVZXHI x3, x1 + shr x1, 16 + CRC_XOR r6, x3, 2 + table + MOVZXLO x3, x1 + shr x1, 8 + CRC_XOR r7, x3, 1 + table + CRC_XOR r6, x1, 0 + table + k = k + 1 + endm + crc_op2 textequ <xor> + +else ; NUM_WORDS == 2 + LOAD_SRC_MULT4 r6, NUM_WORDS ; aligned 64-bit + crc_op2 textequ <mov> +endif ; NUM_WORDS == 2 + + MOVZXHI x3, x0 + MOVZXLO x2, x0 + mov r1, r0 + shr r1, 32 + shr x0, 16 + CRC_XOR r6, x2, NUM_SKIP_BYTES + 7 + CRC_OP crc_op2, r7, x3, NUM_SKIP_BYTES + 6 + MOVZXLO x2, x0 + MOVZXHI x5, x1 + MOVZXLO x3, x1 + shr x0, 8 + shr x1, 16 + CRC_XOR r7, x2, NUM_SKIP_BYTES + 5 + CRC_XOR r6, x3, NUM_SKIP_BYTES + 3 + CRC_XOR r7, x0, NUM_SKIP_BYTES + 4 + CRC_XOR r6, x5, NUM_SKIP_BYTES + 2 + MOVZXLO x2, x1 + shr x1, 8 + CRC_XOR r7, x2, NUM_SKIP_BYTES + 1 + CRC_MOV r0, x1, NUM_SKIP_BYTES + 0 + xor r0, r6 + xor r0, r7 + +endif ; NUM_WORDS > 1 + add rD, NUM_WORDS * 4 + jnc @B + + sub rN, src_rN_offset + add rD, rN + XOR_NEXT + add rN, NUM_BYTES_LIMIT - 1 + sub rN, rD + +crc_end: + test rN, rN + jz func_end +@@: + CRC1b + jnz @B +func_end: + MY_POP_PRESERVED_ABI_REGS_UP_TO_INCLUDING_R11 MY_ENDP + + else +; ================================================================== ; x86 (32-bit) -rD equ r1 -rN equ r7 +rD equ r7 +rN equ r1 rT equ r5 +xA equ x6 +xA_R equ r6 + +ifdef x64 + num_VAR equ r8 +else + crc_OFFS equ (REG_SIZE * 5) if (IS_CDECL gt 0) or (IS_LINUX gt 0) @@ -133,107 +251,273 @@ table_VAR equ [r4 + table_OFFS] num_VAR equ table_VAR endif +endif ; x64 -SRCDAT4 equ dword ptr [rD + rN * 1] +SRCDAT4 equ DWORD PTR [rN + rD * 1] + +CRC_1 macro op:req, dest:req, src:req, t:req, word_index:req + op dest, DWORD PTR [rT + @CatStr(src, _R) * 8 + 0800h * (t) + (word_index) * 4] +endm CRC macro op0:req, op1:req, dest0:req, dest1:req, src:req, t:req - op0 dest0, DWORD PTR [rT + src * 8 + 0800h * t] - op1 dest1, DWORD PTR [rT + src * 8 + 0800h * t + 4] + CRC_1 op0, dest0, src, t, 0 + CRC_1 op1, dest1, src, t, 1 endm CRC_XOR macro dest0:req, dest1:req, src:req, t:req - CRC xor, xor, dest0, dest1, src, t + CRC xor, xor, dest0, dest1, src, t endm CRC1b macro - movzx x6, BYTE PTR [rD] - inc rD - movzx x3, x0_L - xor x6, x3 - shrd r0, r2, 8 - shr r2, 8 - CRC_XOR r0, r2, r6, 0 - dec rN + movzx xA, BYTE PTR [rD] + inc rD + MOVZXLO x3, x0 + xor xA, x3 + shrd x0, x2, 8 + shr x2, 8 + CRC_XOR x0, x2, xA, 0 + dec rN endm -MY_PROLOG macro crc_end:req - MY_PUSH_4_REGS - if (IS_CDECL gt 0) or (IS_LINUX gt 0) - proc_numParams = proc_numParams + 2 ; for ABI_LINUX - mov rN, [r4 + size_OFFS] - mov rD, [r4 + data_OFFS] - else - mov rN, r2 - endif - - mov x0, [r4 + crc_OFFS] - mov x2, [r4 + crc_OFFS + 4] - mov rT, table_VAR - test rN, rN - jz crc_end - @@: - test rD, 3 - jz @F - CRC1b - jnz @B - @@: - cmp rN, 8 - jb crc_end - add rN, rD - - mov num_VAR, rN - - sub rN, 4 - and rN, NOT 3 - sub rD, rN - xor r0, SRCDAT4 - add rN, 4 +MY_PROLOG_BASE macro + MY_PUSH_4_REGS +ifdef x64 + mov r0, REG_ABI_PARAM_0 ; r0 <- r1 / r7 + mov rT, REG_ABI_PARAM_3 ; r5 <- r9 / r1 + mov rN, REG_ABI_PARAM_2 ; r1 <- r8 / r2 + mov rD, REG_ABI_PARAM_1 ; r7 <- r2 / r6 + mov r2, r0 + shr r2, 32 + mov x0, x0 +else + if (IS_CDECL gt 0) or (IS_LINUX gt 0) + proc_numParams = proc_numParams + 2 ; for ABI_LINUX + mov rN, [r4 + size_OFFS] + mov rD, [r4 + data_OFFS] + else + mov rD, REG_ABI_PARAM_0 ; r7 <- r1 : (data) + mov rN, REG_ABI_PARAM_1 ; r1 <- r2 : (size) + endif + mov x0, [r4 + crc_OFFS] + mov x2, [r4 + crc_OFFS + 4] + mov rT, table_VAR +endif endm -MY_EPILOG macro crc_end:req - sub rN, 4 - xor r0, SRCDAT4 - mov rD, rN - mov rN, num_VAR - sub rN, rD - crc_end: - test rN, rN - jz @F - CRC1b - jmp crc_end - @@: - MY_POP_4_REGS +MY_EPILOG_BASE macro crc_end:req, func_end:req +crc_end: + test rN, rN + jz func_end +@@: + CRC1b + jnz @B +func_end: +ifdef x64 + shl r2, 32 + xor r0, r2 +endif + MY_POP_4_REGS endm -MY_PROC XzCrc64UpdateT4, 5 - MY_PROLOG crc_end_4 - movzx x6, x0_L - align 16 - main_loop_4: - mov r3, SRCDAT4 - xor r3, r2 - CRC xor, mov, r3, r2, r6, 3 - movzx x6, x0_H - shr r0, 16 - CRC_XOR r3, r2, r6, 2 +; ALIGN_MASK is 3 or 7 bytes alignment: +ALIGN_MASK equ (7 - (NUM_WORDS and 1) * 4) - movzx x6, x0_L - movzx x0, x0_H - CRC_XOR r3, r2, r6, 1 - CRC_XOR r3, r2, r0, 0 - movzx x6, x3_L - mov r0, r3 +if (NUM_WORDS eq 1) - add rD, 4 - jnz main_loop_4 +NUM_BYTES_LIMIT_T4 equ (NUM_WORDS * 4 + 4) - MY_EPILOG crc_end_4 +MY_PROC @CatStr(XzCrc64UpdateT, %(NUM_WORDS * 4)), 5 + MY_PROLOG_BASE + + cmp rN, NUM_BYTES_LIMIT_T4 + ALIGN_MASK + jb crc_end_4 +@@: + test rD, ALIGN_MASK + jz @F + CRC1b + jmp @B +@@: + xor x0, [rD] + lea rN, [rD + rN * 1 - (NUM_BYTES_LIMIT_T4 - 1)] + sub rD, rN + add rN, 4 + + MOVZXLO xA, x0 +align 16 +@@: + mov x3, SRCDAT4 + xor x3, x2 + shr x0, 8 + CRC xor, mov, x3, x2, xA, 3 + MOVZXLO xA, x0 + shr x0, 8 + ; MOVZXHI xA, x0 + ; shr x0, 16 + CRC_XOR x3, x2, xA, 2 + + MOVZXLO xA, x0 + shr x0, 8 + CRC_XOR x3, x2, xA, 1 + CRC_XOR x3, x2, x0, 0 + MOVZXLO xA, x3 + mov x0, x3 + + add rD, 4 + jnc @B + + sub rN, 4 + add rD, rN + xor x0, [rD] + add rN, NUM_BYTES_LIMIT_T4 - 1 + sub rN, rD + MY_EPILOG_BASE crc_end_4, func_end_4 MY_ENDP -endif ; ! x64 +else ; NUM_WORDS > 1 +SHR_X macro x, imm + shr x, imm +endm + + +ITER_1 macro v0, v1, a, off + MOVZXLO xA, a + SHR_X a, 8 + CRC_XOR v0, v1, xA, off +endm + + +ITER_4 macro v0, v1, a, off +if 0 eq 0 + ITER_1 v0, v1, a, off + 3 + ITER_1 v0, v1, a, off + 2 + ITER_1 v0, v1, a, off + 1 + CRC_XOR v0, v1, a, off +elseif 0 eq 0 + MOVZXLO xA, a + CRC_XOR v0, v1, xA, off + 3 + mov xA, a + ror a, 16 ; 32-bit ror + shr xA, 24 + CRC_XOR v0, v1, xA, off + MOVZXLO xA, a + SHR_X a, 24 + CRC_XOR v0, v1, xA, off + 1 + CRC_XOR v0, v1, a, off + 2 +else + ; MOVZXHI provides smaller code, but MOVZX_HI_BYTE is not fast instruction + MOVZXLO xA, a + CRC_XOR v0, v1, xA, off + 3 + MOVZXHI xA, a + SHR_X a, 16 + CRC_XOR v0, v1, xA, off + 2 + MOVZXLO xA, a + SHR_X a, 8 + CRC_XOR v0, v1, xA, off + 1 + CRC_XOR v0, v1, a, off +endif +endm + + + +ITER_1_PAIR macro v0, v1, a0, a1, off + ITER_1 v0, v1, a0, off + 4 + ITER_1 v0, v1, a1, off +endm + +src_rD_offset equ 8 +STEP_SIZE equ (NUM_WORDS * 4) + +ITER_12_NEXT macro op, index, v0, v1 + op v0, DWORD PTR [rD + (index + 1) * STEP_SIZE - src_rD_offset] + op v1, DWORD PTR [rD + (index + 1) * STEP_SIZE + 4 - src_rD_offset] +endm + +ITER_12 macro index, a0, a1, v0, v1 + + if NUM_SKIP_BYTES eq 0 + ITER_12_NEXT mov, index, v0, v1 + else + k = 0 + while k lt NUM_SKIP_BYTES + movzx xA, BYTE PTR [rD + (index) * STEP_SIZE + k + 8 - src_rD_offset] + if k eq 0 + CRC mov, mov, v0, v1, xA, NUM_SKIP_BYTES - 1 - k + else + CRC_XOR v0, v1, xA, NUM_SKIP_BYTES - 1 - k + endif + k = k + 1 + endm + ITER_12_NEXT xor, index, v0, v1 + endif + +if 0 eq 0 + ITER_4 v0, v1, a0, NUM_SKIP_BYTES + 4 + ITER_4 v0, v1, a1, NUM_SKIP_BYTES +else ; interleave version is faster/slower for different processors + ITER_1_PAIR v0, v1, a0, a1, NUM_SKIP_BYTES + 3 + ITER_1_PAIR v0, v1, a0, a1, NUM_SKIP_BYTES + 2 + ITER_1_PAIR v0, v1, a0, a1, NUM_SKIP_BYTES + 1 + CRC_XOR v0, v1, a0, NUM_SKIP_BYTES + 4 + CRC_XOR v0, v1, a1, NUM_SKIP_BYTES +endif +endm + +; we use (UNROLL_CNT > 1) to reduce read ports pressure (num_VAR reads) +UNROLL_CNT equ (2 * 1) +NUM_BYTES_LIMIT equ (STEP_SIZE * UNROLL_CNT + 8) + +MY_PROC @CatStr(XzCrc64UpdateT, %(NUM_WORDS * 4)), 5 + MY_PROLOG_BASE + + cmp rN, NUM_BYTES_LIMIT + ALIGN_MASK + jb crc_end_12 +@@: + test rD, ALIGN_MASK + jz @F + CRC1b + jmp @B +@@: + xor x0, [rD] + xor x2, [rD + 4] + add rD, src_rD_offset + lea rN, [rD + rN * 1 - (NUM_BYTES_LIMIT - 1)] + mov num_VAR, rN + +align 16 +@@: + i = 0 + rept UNROLL_CNT + if (i and 1) eq 0 + ITER_12 i, x0, x2, x1, x3 + else + ITER_12 i, x1, x3, x0, x2 + endif + i = i + 1 + endm + + if (UNROLL_CNT and 1) + mov x0, x1 + mov x2, x3 + endif + add rD, STEP_SIZE * UNROLL_CNT + cmp rD, num_VAR + jb @B + + mov rN, num_VAR + add rN, NUM_BYTES_LIMIT - 1 + sub rN, rD + sub rD, src_rD_offset + xor x0, [rD] + xor x2, [rD + 4] + + MY_EPILOG_BASE crc_end_12, func_end_12 +MY_ENDP + +endif ; (NUM_WORDS > 1) +endif ; ! x64 end
diff --git a/third_party/lzma_sdk/BUILD.gn b/third_party/lzma_sdk/BUILD.gn index 57923a6..39d8dc0 100644 --- a/third_party/lzma_sdk/BUILD.gn +++ b/third_party/lzma_sdk/BUILD.gn
@@ -36,13 +36,14 @@ # (otherwise -Wall will appear after this, and turn it back on). config("lzma_build_config") { defines = [ - "_7ZIP_ST", - "_7Z_NO_METHODS_FILTERS", + "Z7_LZMA_PROB32", + "Z7_NO_METHODS_FILTERS", + "Z7_ST", "_LZMA_PROB32", ] if (enable_lzma_opt) { - defines += [ "_LZMA_DEC_OPT" ] + defines += [ "Z7_LZMA_DEC_OPT" ] } cflags = [] @@ -52,10 +53,6 @@ } if (use_arm_neon_optimizations) { - if (is_fuchsia) { - defines += [ "ARMV8_OS_FUCHSIA" ] - } - if (target_cpu == "arm" && arm_version >= 8) { if (is_clang) { cflags += [ @@ -92,6 +89,7 @@ "C/7zFile.h", "C/7zStream.c", "C/7zTypes.h", + "C/7zWindows.h", "C/Alloc.c", "C/Alloc.h", "C/Bcj2.c", @@ -118,14 +116,13 @@ "C/LzmaLib.c", "C/LzmaLib.h", "C/Precomp.h", + "C/RotateDefs.h", ] if (enable_lzma_opt) { sources += [ - "Asm/x86/7zCrcOpt.asm", "Asm/x86/LzmaDecOpt.asm", ] - sources -= [ "C/7zCrcOpt.c" ] } configs -= [ "//build/config/compiler:chromium_code" ] @@ -141,9 +138,9 @@ static_library("lzma_sdk_xz") { sources = [ "C/BraIA64.c", - "C/RotateDefs.h", "C/Sha256.c", "C/Sha256.h", + "C/Sha256Opt.c", "C/Xz.c", "C/Xz.h", "C/XzCrc64.c", @@ -153,11 +150,6 @@ "C/XzIn.c", ] - # TODO(crbug.com/1338627): Enable ARM optimizations - if (target_cpu == "x86" || target_cpu == "x64") { - sources += [ "C/Sha256Opt.c" ] - } - if (enable_lzma_opt) { sources += [ "Asm/x86/Sha256Opt.asm",
diff --git a/third_party/lzma_sdk/C/7z.h b/third_party/lzma_sdk/C/7z.h index 304f75ff..9e27c0152 100644 --- a/third_party/lzma_sdk/C/7z.h +++ b/third_party/lzma_sdk/C/7z.h
@@ -1,8 +1,8 @@ /* 7z.h -- 7z interface -2018-07-02 : Igor Pavlov : Public domain */ +2023-04-02 : Igor Pavlov : Public domain */ -#ifndef __7Z_H -#define __7Z_H +#ifndef ZIP7_INC_7Z_H +#define ZIP7_INC_7Z_H #include "7zTypes.h" @@ -98,7 +98,7 @@ UInt64 SzAr_GetFolderUnpackSize(const CSzAr *p, UInt32 folderIndex); SRes SzAr_DecodeFolder(const CSzAr *p, UInt32 folderIndex, - ILookInStream *stream, UInt64 startPos, + ILookInStreamPtr stream, UInt64 startPos, Byte *outBuffer, size_t outSize, ISzAllocPtr allocMain); @@ -174,7 +174,7 @@ SRes SzArEx_Extract( const CSzArEx *db, - ILookInStream *inStream, + ILookInStreamPtr inStream, UInt32 fileIndex, /* index of file */ UInt32 *blockIndex, /* index of solid block */ Byte **outBuffer, /* pointer to pointer to output buffer (allocated with allocMain) */ @@ -196,7 +196,7 @@ SZ_ERROR_FAIL */ -SRes SzArEx_Open(CSzArEx *p, ILookInStream *inStream, +SRes SzArEx_Open(CSzArEx *p, ILookInStreamPtr inStream, ISzAllocPtr allocMain, ISzAllocPtr allocTemp); EXTERN_C_END
diff --git a/third_party/lzma_sdk/C/7zAlloc.c b/third_party/lzma_sdk/C/7zAlloc.c index c924a52..2f0659af6 100644 --- a/third_party/lzma_sdk/C/7zAlloc.c +++ b/third_party/lzma_sdk/C/7zAlloc.c
@@ -1,5 +1,5 @@ -/* 7zAlloc.c -- Allocation functions -2017-04-03 : Igor Pavlov : Public domain */ +/* 7zAlloc.c -- Allocation functions for 7z processing +2023-03-04 : Igor Pavlov : Public domain */ #include "Precomp.h" @@ -7,74 +7,83 @@ #include "7zAlloc.h" -/* #define _SZ_ALLOC_DEBUG */ -/* use _SZ_ALLOC_DEBUG to debug alloc/free operations */ +/* #define SZ_ALLOC_DEBUG */ +/* use SZ_ALLOC_DEBUG to debug alloc/free operations */ -#ifdef _SZ_ALLOC_DEBUG +#ifdef SZ_ALLOC_DEBUG +/* #ifdef _WIN32 -#include <windows.h> +#include "7zWindows.h" #endif +*/ #include <stdio.h> -int g_allocCount = 0; -int g_allocCountTemp = 0; +static int g_allocCount = 0; +static int g_allocCountTemp = 0; +static void Print_Alloc(const char *s, size_t size, int *counter) +{ + const unsigned size2 = (unsigned)size; + fprintf(stderr, "\n%s count = %10d : %10u bytes; ", s, *counter, size2); + (*counter)++; +} +static void Print_Free(const char *s, int *counter) +{ + (*counter)--; + fprintf(stderr, "\n%s count = %10d", s, *counter); +} #endif void *SzAlloc(ISzAllocPtr p, size_t size) { - UNUSED_VAR(p); + UNUSED_VAR(p) if (size == 0) return 0; - #ifdef _SZ_ALLOC_DEBUG - fprintf(stderr, "\nAlloc %10u bytes; count = %10d", (unsigned)size, g_allocCount); - g_allocCount++; + #ifdef SZ_ALLOC_DEBUG + Print_Alloc("Alloc", size, &g_allocCount); #endif return malloc(size); } void SzFree(ISzAllocPtr p, void *address) { - UNUSED_VAR(p); - #ifdef _SZ_ALLOC_DEBUG - if (address != 0) - { - g_allocCount--; - fprintf(stderr, "\nFree; count = %10d", g_allocCount); - } + UNUSED_VAR(p) + #ifdef SZ_ALLOC_DEBUG + if (address) + Print_Free("Free ", &g_allocCount); #endif free(address); } void *SzAllocTemp(ISzAllocPtr p, size_t size) { - UNUSED_VAR(p); + UNUSED_VAR(p) if (size == 0) return 0; - #ifdef _SZ_ALLOC_DEBUG - fprintf(stderr, "\nAlloc_temp %10u bytes; count = %10d", (unsigned)size, g_allocCountTemp); - g_allocCountTemp++; + #ifdef SZ_ALLOC_DEBUG + Print_Alloc("Alloc_temp", size, &g_allocCountTemp); + /* #ifdef _WIN32 return HeapAlloc(GetProcessHeap(), 0, size); #endif + */ #endif return malloc(size); } void SzFreeTemp(ISzAllocPtr p, void *address) { - UNUSED_VAR(p); - #ifdef _SZ_ALLOC_DEBUG - if (address != 0) - { - g_allocCountTemp--; - fprintf(stderr, "\nFree_temp; count = %10d", g_allocCountTemp); - } + UNUSED_VAR(p) + #ifdef SZ_ALLOC_DEBUG + if (address) + Print_Free("Free_temp ", &g_allocCountTemp); + /* #ifdef _WIN32 HeapFree(GetProcessHeap(), 0, address); return; #endif + */ #endif free(address); }
diff --git a/third_party/lzma_sdk/C/7zAlloc.h b/third_party/lzma_sdk/C/7zAlloc.h index 44778f9..b2b8b0cd 100644 --- a/third_party/lzma_sdk/C/7zAlloc.h +++ b/third_party/lzma_sdk/C/7zAlloc.h
@@ -1,8 +1,8 @@ /* 7zAlloc.h -- Allocation functions -2017-04-03 : Igor Pavlov : Public domain */ +2023-03-04 : Igor Pavlov : Public domain */ -#ifndef __7Z_ALLOC_H -#define __7Z_ALLOC_H +#ifndef ZIP7_INC_7Z_ALLOC_H +#define ZIP7_INC_7Z_ALLOC_H #include "7zTypes.h"
diff --git a/third_party/lzma_sdk/C/7zArcIn.c b/third_party/lzma_sdk/C/7zArcIn.c index 0d9dec4..23f2949 100644 --- a/third_party/lzma_sdk/C/7zArcIn.c +++ b/third_party/lzma_sdk/C/7zArcIn.c
@@ -1,5 +1,5 @@ /* 7zArcIn.c -- 7z Input functions -2021-02-09 : Igor Pavlov : Public domain */ +2023-09-07 : Igor Pavlov : Public domain */ #include "Precomp.h" @@ -10,10 +10,11 @@ #include "7zCrc.h" #include "CpuArch.h" -#define MY_ALLOC(T, p, size, alloc) { \ - if ((p = (T *)ISzAlloc_Alloc(alloc, (size) * sizeof(T))) == NULL) return SZ_ERROR_MEM; } +#define MY_ALLOC(T, p, size, alloc) \ + { if ((p = (T *)ISzAlloc_Alloc(alloc, (size) * sizeof(T))) == NULL) return SZ_ERROR_MEM; } -#define MY_ALLOC_ZE(T, p, size, alloc) { if ((size) == 0) p = NULL; else MY_ALLOC(T, p, size, alloc) } +#define MY_ALLOC_ZE(T, p, size, alloc) \ + { if ((size) == 0) p = NULL; else MY_ALLOC(T, p, size, alloc) } #define MY_ALLOC_AND_CPY(to, size, from, alloc) \ { MY_ALLOC(Byte, to, size, alloc); memcpy(to, from, size); } @@ -58,7 +59,7 @@ const Byte k7zSignature[k7zSignatureSize] = {'7', 'z', 0xBC, 0xAF, 0x27, 0x1C}; -#define SzBitUi32s_Init(p) { (p)->Defs = NULL; (p)->Vals = NULL; } +#define SzBitUi32s_INIT(p) { (p)->Defs = NULL; (p)->Vals = NULL; } static SRes SzBitUi32s_Alloc(CSzBitUi32s *p, size_t num, ISzAllocPtr alloc) { @@ -69,8 +70,8 @@ } else { - MY_ALLOC(Byte, p->Defs, (num + 7) >> 3, alloc); - MY_ALLOC(UInt32, p->Vals, num, alloc); + MY_ALLOC(Byte, p->Defs, (num + 7) >> 3, alloc) + MY_ALLOC(UInt32, p->Vals, num, alloc) } return SZ_OK; } @@ -81,7 +82,7 @@ ISzAlloc_Free(alloc, p->Vals); p->Vals = NULL; } -#define SzBitUi64s_Init(p) { (p)->Defs = NULL; (p)->Vals = NULL; } +#define SzBitUi64s_INIT(p) { (p)->Defs = NULL; (p)->Vals = NULL; } static void SzBitUi64s_Free(CSzBitUi64s *p, ISzAllocPtr alloc) { @@ -96,7 +97,7 @@ p->NumFolders = 0; p->PackPositions = NULL; - SzBitUi32s_Init(&p->FolderCRCs); + SzBitUi32s_INIT(&p->FolderCRCs) p->FoCodersOffsets = NULL; p->FoStartPackStreamIndex = NULL; @@ -142,11 +143,11 @@ p->FileNameOffsets = NULL; p->FileNames = NULL; - SzBitUi32s_Init(&p->CRCs); - SzBitUi32s_Init(&p->Attribs); - // SzBitUi32s_Init(&p->Parents); - SzBitUi64s_Init(&p->MTime); - SzBitUi64s_Init(&p->CTime); + SzBitUi32s_INIT(&p->CRCs) + SzBitUi32s_INIT(&p->Attribs) + // SzBitUi32s_INIT(&p->Parents) + SzBitUi64s_INIT(&p->MTime) + SzBitUi64s_INIT(&p->CTime) } void SzArEx_Free(CSzArEx *p, ISzAllocPtr alloc) @@ -180,11 +181,20 @@ return 1; } -#define SzData_Clear(p) { (p)->Data = NULL; (p)->Size = 0; } +#define SzData_CLEAR(p) { (p)->Data = NULL; (p)->Size = 0; } -#define SZ_READ_BYTE_SD(_sd_, dest) if ((_sd_)->Size == 0) return SZ_ERROR_ARCHIVE; (_sd_)->Size--; dest = *(_sd_)->Data++; +#define SZ_READ_BYTE_SD_NOCHECK(_sd_, dest) \ + (_sd_)->Size--; dest = *(_sd_)->Data++; + +#define SZ_READ_BYTE_SD(_sd_, dest) \ + if ((_sd_)->Size == 0) return SZ_ERROR_ARCHIVE; \ + SZ_READ_BYTE_SD_NOCHECK(_sd_, dest) + #define SZ_READ_BYTE(dest) SZ_READ_BYTE_SD(sd, dest) -#define SZ_READ_BYTE_2(dest) if (sd.Size == 0) return SZ_ERROR_ARCHIVE; sd.Size--; dest = *sd.Data++; + +#define SZ_READ_BYTE_2(dest) \ + if (sd.Size == 0) return SZ_ERROR_ARCHIVE; \ + sd.Size--; dest = *sd.Data++; #define SKIP_DATA(sd, size) { sd->Size -= (size_t)(size); sd->Data += (size_t)(size); } #define SKIP_DATA2(sd, size) { sd.Size -= (size_t)(size); sd.Data += (size_t)(size); } @@ -192,25 +202,25 @@ #define SZ_READ_32(dest) if (sd.Size < 4) return SZ_ERROR_ARCHIVE; \ dest = GetUi32(sd.Data); SKIP_DATA2(sd, 4); -static MY_NO_INLINE SRes ReadNumber(CSzData *sd, UInt64 *value) +static Z7_NO_INLINE SRes ReadNumber(CSzData *sd, UInt64 *value) { Byte firstByte, mask; unsigned i; UInt32 v; - SZ_READ_BYTE(firstByte); + SZ_READ_BYTE(firstByte) if ((firstByte & 0x80) == 0) { *value = firstByte; return SZ_OK; } - SZ_READ_BYTE(v); + SZ_READ_BYTE(v) if ((firstByte & 0x40) == 0) { *value = (((UInt32)firstByte & 0x3F) << 8) | v; return SZ_OK; } - SZ_READ_BYTE(mask); + SZ_READ_BYTE(mask) *value = v | ((UInt32)mask << 8); mask = 0x20; for (i = 2; i < 8; i++) @@ -218,11 +228,11 @@ Byte b; if ((firstByte & mask) == 0) { - UInt64 highPart = (unsigned)firstByte & (unsigned)(mask - 1); + const UInt64 highPart = (unsigned)firstByte & (unsigned)(mask - 1); *value |= (highPart << (8 * i)); return SZ_OK; } - SZ_READ_BYTE(b); + SZ_READ_BYTE(b) *value |= ((UInt64)b << (8 * i)); mask >>= 1; } @@ -230,7 +240,7 @@ } -static MY_NO_INLINE SRes SzReadNumber32(CSzData *sd, UInt32 *value) +static Z7_NO_INLINE SRes SzReadNumber32(CSzData *sd, UInt32 *value) { Byte firstByte; UInt64 value64; @@ -244,7 +254,7 @@ sd->Size--; return SZ_OK; } - RINOK(ReadNumber(sd, &value64)); + RINOK(ReadNumber(sd, &value64)) if (value64 >= (UInt32)0x80000000 - 1) return SZ_ERROR_UNSUPPORTED; if (value64 >= ((UInt64)(1) << ((sizeof(size_t) - 1) * 8 + 4))) @@ -258,10 +268,10 @@ static SRes SkipData(CSzData *sd) { UInt64 size; - RINOK(ReadNumber(sd, &size)); + RINOK(ReadNumber(sd, &size)) if (size > sd->Size) return SZ_ERROR_ARCHIVE; - SKIP_DATA(sd, size); + SKIP_DATA(sd, size) return SZ_OK; } @@ -270,28 +280,28 @@ for (;;) { UInt64 type; - RINOK(ReadID(sd, &type)); + RINOK(ReadID(sd, &type)) if (type == id) return SZ_OK; if (type == k7zIdEnd) return SZ_ERROR_ARCHIVE; - RINOK(SkipData(sd)); + RINOK(SkipData(sd)) } } static SRes RememberBitVector(CSzData *sd, UInt32 numItems, const Byte **v) { - UInt32 numBytes = (numItems + 7) >> 3; + const UInt32 numBytes = (numItems + 7) >> 3; if (numBytes > sd->Size) return SZ_ERROR_ARCHIVE; *v = sd->Data; - SKIP_DATA(sd, numBytes); + SKIP_DATA(sd, numBytes) return SZ_OK; } static UInt32 CountDefinedBits(const Byte *bits, UInt32 numItems) { - Byte b = 0; + unsigned b = 0; unsigned m = 0; UInt32 sum = 0; for (; numItems != 0; numItems--) @@ -302,53 +312,53 @@ m = 8; } m--; - sum += ((b >> m) & 1); + sum += (UInt32)((b >> m) & 1); } return sum; } -static MY_NO_INLINE SRes ReadBitVector(CSzData *sd, UInt32 numItems, Byte **v, ISzAllocPtr alloc) +static Z7_NO_INLINE SRes ReadBitVector(CSzData *sd, UInt32 numItems, Byte **v, ISzAllocPtr alloc) { Byte allAreDefined; Byte *v2; - UInt32 numBytes = (numItems + 7) >> 3; + const UInt32 numBytes = (numItems + 7) >> 3; *v = NULL; - SZ_READ_BYTE(allAreDefined); + SZ_READ_BYTE(allAreDefined) if (numBytes == 0) return SZ_OK; if (allAreDefined == 0) { if (numBytes > sd->Size) return SZ_ERROR_ARCHIVE; - MY_ALLOC_AND_CPY(*v, numBytes, sd->Data, alloc); - SKIP_DATA(sd, numBytes); + MY_ALLOC_AND_CPY(*v, numBytes, sd->Data, alloc) + SKIP_DATA(sd, numBytes) return SZ_OK; } - MY_ALLOC(Byte, *v, numBytes, alloc); + MY_ALLOC(Byte, *v, numBytes, alloc) v2 = *v; memset(v2, 0xFF, (size_t)numBytes); { - unsigned numBits = (unsigned)numItems & 7; + const unsigned numBits = (unsigned)numItems & 7; if (numBits != 0) v2[(size_t)numBytes - 1] = (Byte)((((UInt32)1 << numBits) - 1) << (8 - numBits)); } return SZ_OK; } -static MY_NO_INLINE SRes ReadUi32s(CSzData *sd2, UInt32 numItems, CSzBitUi32s *crcs, ISzAllocPtr alloc) +static Z7_NO_INLINE SRes ReadUi32s(CSzData *sd2, UInt32 numItems, CSzBitUi32s *crcs, ISzAllocPtr alloc) { UInt32 i; CSzData sd; UInt32 *vals; const Byte *defs; - MY_ALLOC_ZE(UInt32, crcs->Vals, numItems, alloc); + MY_ALLOC_ZE(UInt32, crcs->Vals, numItems, alloc) sd = *sd2; defs = crcs->Defs; vals = crcs->Vals; for (i = 0; i < numItems; i++) if (SzBitArray_Check(defs, i)) { - SZ_READ_32(vals[i]); + SZ_READ_32(vals[i]) } else vals[i] = 0; @@ -359,7 +369,7 @@ static SRes ReadBitUi32s(CSzData *sd, UInt32 numItems, CSzBitUi32s *crcs, ISzAllocPtr alloc) { SzBitUi32s_Free(crcs, alloc); - RINOK(ReadBitVector(sd, numItems, &crcs->Defs, alloc)); + RINOK(ReadBitVector(sd, numItems, &crcs->Defs, alloc)) return ReadUi32s(sd, numItems, crcs, alloc); } @@ -367,36 +377,36 @@ { Byte allAreDefined; UInt32 numDefined = numItems; - SZ_READ_BYTE(allAreDefined); + SZ_READ_BYTE(allAreDefined) if (!allAreDefined) { - size_t numBytes = (numItems + 7) >> 3; + const size_t numBytes = (numItems + 7) >> 3; if (numBytes > sd->Size) return SZ_ERROR_ARCHIVE; numDefined = CountDefinedBits(sd->Data, numItems); - SKIP_DATA(sd, numBytes); + SKIP_DATA(sd, numBytes) } if (numDefined > (sd->Size >> 2)) return SZ_ERROR_ARCHIVE; - SKIP_DATA(sd, (size_t)numDefined * 4); + SKIP_DATA(sd, (size_t)numDefined * 4) return SZ_OK; } static SRes ReadPackInfo(CSzAr *p, CSzData *sd, ISzAllocPtr alloc) { - RINOK(SzReadNumber32(sd, &p->NumPackStreams)); + RINOK(SzReadNumber32(sd, &p->NumPackStreams)) - RINOK(WaitId(sd, k7zIdSize)); - MY_ALLOC(UInt64, p->PackPositions, (size_t)p->NumPackStreams + 1, alloc); + RINOK(WaitId(sd, k7zIdSize)) + MY_ALLOC(UInt64, p->PackPositions, (size_t)p->NumPackStreams + 1, alloc) { UInt64 sum = 0; UInt32 i; - UInt32 numPackStreams = p->NumPackStreams; + const UInt32 numPackStreams = p->NumPackStreams; for (i = 0; i < numPackStreams; i++) { UInt64 packSize; p->PackPositions[i] = sum; - RINOK(ReadNumber(sd, &packSize)); + RINOK(ReadNumber(sd, &packSize)) sum += packSize; if (sum < packSize) return SZ_ERROR_ARCHIVE; @@ -407,16 +417,16 @@ for (;;) { UInt64 type; - RINOK(ReadID(sd, &type)); + RINOK(ReadID(sd, &type)) if (type == k7zIdEnd) return SZ_OK; if (type == k7zIdCRC) { /* CRC of packed streams is unused now */ - RINOK(SkipBitUi32s(sd, p->NumPackStreams)); + RINOK(SkipBitUi32s(sd, p->NumPackStreams)) continue; } - RINOK(SkipData(sd)); + RINOK(SkipData(sd)) } } @@ -442,7 +452,7 @@ f->NumPackStreams = 0; f->UnpackStream = 0; - RINOK(SzReadNumber32(sd, &numCoders)); + RINOK(SzReadNumber32(sd, &numCoders)) if (numCoders == 0 || numCoders > SZ_NUM_CODERS_IN_FOLDER_MAX) return SZ_ERROR_UNSUPPORTED; @@ -453,7 +463,7 @@ unsigned idSize, j; UInt64 id; - SZ_READ_BYTE(mainByte); + SZ_READ_BYTE(mainByte) if ((mainByte & 0xC0) != 0) return SZ_ERROR_UNSUPPORTED; @@ -481,12 +491,12 @@ { UInt32 numStreams; - RINOK(SzReadNumber32(sd, &numStreams)); + RINOK(SzReadNumber32(sd, &numStreams)) if (numStreams > k_NumCodersStreams_in_Folder_MAX) return SZ_ERROR_UNSUPPORTED; coder->NumStreams = (Byte)numStreams; - RINOK(SzReadNumber32(sd, &numStreams)); + RINOK(SzReadNumber32(sd, &numStreams)) if (numStreams != 1) return SZ_ERROR_UNSUPPORTED; } @@ -499,7 +509,7 @@ if ((mainByte & 0x20) != 0) { UInt32 propsSize = 0; - RINOK(SzReadNumber32(sd, &propsSize)); + RINOK(SzReadNumber32(sd, &propsSize)) if (propsSize > sd->Size) return SZ_ERROR_ARCHIVE; if (propsSize >= 0x80) @@ -549,12 +559,12 @@ { CSzBond *bp = f->Bonds + i; - RINOK(SzReadNumber32(sd, &bp->InIndex)); + RINOK(SzReadNumber32(sd, &bp->InIndex)) if (bp->InIndex >= numInStreams || streamUsed[bp->InIndex]) return SZ_ERROR_ARCHIVE; streamUsed[bp->InIndex] = True; - RINOK(SzReadNumber32(sd, &bp->OutIndex)); + RINOK(SzReadNumber32(sd, &bp->OutIndex)) if (bp->OutIndex >= numCoders || coderUsed[bp->OutIndex]) return SZ_ERROR_ARCHIVE; coderUsed[bp->OutIndex] = True; @@ -584,7 +594,7 @@ for (i = 0; i < numPackStreams; i++) { UInt32 index; - RINOK(SzReadNumber32(sd, &index)); + RINOK(SzReadNumber32(sd, &index)) if (index >= numInStreams || streamUsed[index]) return SZ_ERROR_ARCHIVE; streamUsed[index] = True; @@ -598,7 +608,7 @@ } -static MY_NO_INLINE SRes SkipNumbers(CSzData *sd2, UInt32 num) +static Z7_NO_INLINE SRes SkipNumbers(CSzData *sd2, UInt32 num) { CSzData sd; sd = *sd2; @@ -606,7 +616,7 @@ { Byte firstByte, mask; unsigned i; - SZ_READ_BYTE_2(firstByte); + SZ_READ_BYTE_2(firstByte) if ((firstByte & 0x80) == 0) continue; if ((firstByte & 0x40) == 0) @@ -622,7 +632,7 @@ mask >>= 1; if (i > sd.Size) return SZ_ERROR_ARCHIVE; - SKIP_DATA2(sd, i); + SKIP_DATA2(sd, i) } *sd2 = sd; return SZ_OK; @@ -645,30 +655,30 @@ const Byte *startBufPtr; Byte external; - RINOK(WaitId(sd2, k7zIdFolder)); + RINOK(WaitId(sd2, k7zIdFolder)) - RINOK(SzReadNumber32(sd2, &numFolders)); + RINOK(SzReadNumber32(sd2, &numFolders)) if (numFolders > numFoldersMax) return SZ_ERROR_UNSUPPORTED; p->NumFolders = numFolders; - SZ_READ_BYTE_SD(sd2, external); + SZ_READ_BYTE_SD(sd2, external) if (external == 0) sd = *sd2; else { UInt32 index; - RINOK(SzReadNumber32(sd2, &index)); + RINOK(SzReadNumber32(sd2, &index)) if (index >= numTempBufs) return SZ_ERROR_ARCHIVE; sd.Data = tempBufs[index].data; sd.Size = tempBufs[index].size; } - MY_ALLOC(size_t, p->FoCodersOffsets, (size_t)numFolders + 1, alloc); - MY_ALLOC(UInt32, p->FoStartPackStreamIndex, (size_t)numFolders + 1, alloc); - MY_ALLOC(UInt32, p->FoToCoderUnpackSizes, (size_t)numFolders + 1, alloc); - MY_ALLOC_ZE(Byte, p->FoToMainUnpackSizeIndex, (size_t)numFolders, alloc); + MY_ALLOC(size_t, p->FoCodersOffsets, (size_t)numFolders + 1, alloc) + MY_ALLOC(UInt32, p->FoStartPackStreamIndex, (size_t)numFolders + 1, alloc) + MY_ALLOC(UInt32, p->FoToCoderUnpackSizes, (size_t)numFolders + 1, alloc) + MY_ALLOC_ZE(Byte, p->FoToMainUnpackSizeIndex, (size_t)numFolders, alloc) startBufPtr = sd.Data; @@ -681,7 +691,7 @@ p->FoCodersOffsets[fo] = (size_t)(sd.Data - startBufPtr); - RINOK(SzReadNumber32(&sd, &numCoders)); + RINOK(SzReadNumber32(&sd, &numCoders)) if (numCoders == 0 || numCoders > k_Scan_NumCoders_MAX) return SZ_ERROR_UNSUPPORTED; @@ -691,7 +701,7 @@ unsigned idSize; UInt32 coderInStreams; - SZ_READ_BYTE_2(mainByte); + SZ_READ_BYTE_2(mainByte) if ((mainByte & 0xC0) != 0) return SZ_ERROR_UNSUPPORTED; idSize = (mainByte & 0xF); @@ -699,15 +709,15 @@ return SZ_ERROR_UNSUPPORTED; if (idSize > sd.Size) return SZ_ERROR_ARCHIVE; - SKIP_DATA2(sd, idSize); + SKIP_DATA2(sd, idSize) coderInStreams = 1; if ((mainByte & 0x10) != 0) { UInt32 coderOutStreams; - RINOK(SzReadNumber32(&sd, &coderInStreams)); - RINOK(SzReadNumber32(&sd, &coderOutStreams)); + RINOK(SzReadNumber32(&sd, &coderInStreams)) + RINOK(SzReadNumber32(&sd, &coderOutStreams)) if (coderInStreams > k_Scan_NumCodersStreams_in_Folder_MAX || coderOutStreams != 1) return SZ_ERROR_UNSUPPORTED; } @@ -717,10 +727,10 @@ if ((mainByte & 0x20) != 0) { UInt32 propsSize; - RINOK(SzReadNumber32(&sd, &propsSize)); + RINOK(SzReadNumber32(&sd, &propsSize)) if (propsSize > sd.Size) return SZ_ERROR_ARCHIVE; - SKIP_DATA2(sd, propsSize); + SKIP_DATA2(sd, propsSize) } } @@ -734,7 +744,7 @@ Byte coderUsed[k_Scan_NumCoders_MAX]; UInt32 i; - UInt32 numBonds = numCoders - 1; + const UInt32 numBonds = numCoders - 1; if (numInStreams < numBonds) return SZ_ERROR_ARCHIVE; @@ -750,12 +760,12 @@ { UInt32 index; - RINOK(SzReadNumber32(&sd, &index)); + RINOK(SzReadNumber32(&sd, &index)) if (index >= numInStreams || streamUsed[index]) return SZ_ERROR_ARCHIVE; streamUsed[index] = True; - RINOK(SzReadNumber32(&sd, &index)); + RINOK(SzReadNumber32(&sd, &index)) if (index >= numCoders || coderUsed[index]) return SZ_ERROR_ARCHIVE; coderUsed[index] = True; @@ -767,7 +777,7 @@ for (i = 0; i < numPackStreams; i++) { UInt32 index; - RINOK(SzReadNumber32(&sd, &index)); + RINOK(SzReadNumber32(&sd, &index)) if (index >= numInStreams || streamUsed[index]) return SZ_ERROR_ARCHIVE; streamUsed[index] = True; @@ -802,7 +812,7 @@ const size_t dataSize = (size_t)(sd.Data - startBufPtr); p->FoStartPackStreamIndex[fo] = packStreamIndex; p->FoCodersOffsets[fo] = dataSize; - MY_ALLOC_ZE_AND_CPY(p->CodersData, dataSize, startBufPtr, alloc); + MY_ALLOC_ZE_AND_CPY(p->CodersData, dataSize, startBufPtr, alloc) } if (external != 0) @@ -812,21 +822,21 @@ sd = *sd2; } - RINOK(WaitId(&sd, k7zIdCodersUnpackSize)); + RINOK(WaitId(&sd, k7zIdCodersUnpackSize)) - MY_ALLOC_ZE(UInt64, p->CoderUnpackSizes, (size_t)numCodersOutStreams, alloc); + MY_ALLOC_ZE(UInt64, p->CoderUnpackSizes, (size_t)numCodersOutStreams, alloc) { UInt32 i; for (i = 0; i < numCodersOutStreams; i++) { - RINOK(ReadNumber(&sd, p->CoderUnpackSizes + i)); + RINOK(ReadNumber(&sd, p->CoderUnpackSizes + i)) } } for (;;) { UInt64 type; - RINOK(ReadID(&sd, &type)); + RINOK(ReadID(&sd, &type)) if (type == k7zIdEnd) { *sd2 = sd; @@ -834,10 +844,10 @@ } if (type == k7zIdCRC) { - RINOK(ReadBitUi32s(&sd, numFolders, &p->FolderCRCs, alloc)); + RINOK(ReadBitUi32s(&sd, numFolders, &p->FolderCRCs, alloc)) continue; } - RINOK(SkipData(&sd)); + RINOK(SkipData(&sd)) } } @@ -862,13 +872,13 @@ { UInt64 type = 0; UInt32 numSubDigests = 0; - UInt32 numFolders = p->NumFolders; + const UInt32 numFolders = p->NumFolders; UInt32 numUnpackStreams = numFolders; UInt32 numUnpackSizesInData = 0; for (;;) { - RINOK(ReadID(sd, &type)); + RINOK(ReadID(sd, &type)) if (type == k7zIdNumUnpackStream) { UInt32 i; @@ -878,7 +888,7 @@ for (i = 0; i < numFolders; i++) { UInt32 numStreams; - RINOK(SzReadNumber32(sd, &numStreams)); + RINOK(SzReadNumber32(sd, &numStreams)) if (numUnpackStreams > numUnpackStreams + numStreams) return SZ_ERROR_UNSUPPORTED; numUnpackStreams += numStreams; @@ -892,7 +902,7 @@ } if (type == k7zIdCRC || type == k7zIdSize || type == k7zIdEnd) break; - RINOK(SkipData(sd)); + RINOK(SkipData(sd)) } if (!ssi->sdNumSubStreams.Data) @@ -908,9 +918,9 @@ if (type == k7zIdSize) { ssi->sdSizes.Data = sd->Data; - RINOK(SkipNumbers(sd, numUnpackSizesInData)); + RINOK(SkipNumbers(sd, numUnpackSizesInData)) ssi->sdSizes.Size = (size_t)(sd->Data - ssi->sdSizes.Data); - RINOK(ReadID(sd, &type)); + RINOK(ReadID(sd, &type)) } for (;;) @@ -920,14 +930,14 @@ if (type == k7zIdCRC) { ssi->sdCRCs.Data = sd->Data; - RINOK(SkipBitUi32s(sd, numSubDigests)); + RINOK(SkipBitUi32s(sd, numSubDigests)) ssi->sdCRCs.Size = (size_t)(sd->Data - ssi->sdCRCs.Data); } else { - RINOK(SkipData(sd)); + RINOK(SkipData(sd)) } - RINOK(ReadID(sd, &type)); + RINOK(ReadID(sd, &type)) } } @@ -940,31 +950,31 @@ { UInt64 type; - SzData_Clear(&ssi->sdSizes); - SzData_Clear(&ssi->sdCRCs); - SzData_Clear(&ssi->sdNumSubStreams); + SzData_CLEAR(&ssi->sdSizes) + SzData_CLEAR(&ssi->sdCRCs) + SzData_CLEAR(&ssi->sdNumSubStreams) *dataOffset = 0; - RINOK(ReadID(sd, &type)); + RINOK(ReadID(sd, &type)) if (type == k7zIdPackInfo) { - RINOK(ReadNumber(sd, dataOffset)); + RINOK(ReadNumber(sd, dataOffset)) if (*dataOffset > p->RangeLimit) return SZ_ERROR_ARCHIVE; - RINOK(ReadPackInfo(p, sd, alloc)); + RINOK(ReadPackInfo(p, sd, alloc)) if (p->PackPositions[p->NumPackStreams] > p->RangeLimit - *dataOffset) return SZ_ERROR_ARCHIVE; - RINOK(ReadID(sd, &type)); + RINOK(ReadID(sd, &type)) } if (type == k7zIdUnpackInfo) { - RINOK(ReadUnpackInfo(p, sd, numFoldersMax, tempBufs, numTempBufs, alloc)); - RINOK(ReadID(sd, &type)); + RINOK(ReadUnpackInfo(p, sd, numFoldersMax, tempBufs, numTempBufs, alloc)) + RINOK(ReadID(sd, &type)) } if (type == k7zIdSubStreamsInfo) { - RINOK(ReadSubStreamsInfo(p, sd, ssi)); - RINOK(ReadID(sd, &type)); + RINOK(ReadSubStreamsInfo(p, sd, ssi)) + RINOK(ReadID(sd, &type)) } else { @@ -976,7 +986,7 @@ } static SRes SzReadAndDecodePackedStreams( - ILookInStream *inStream, + ILookInStreamPtr inStream, CSzData *sd, CBuf *tempBufs, UInt32 numFoldersMax, @@ -988,7 +998,7 @@ UInt32 fo; CSubStreamInfo ssi; - RINOK(SzReadStreamsInfo(p, sd, numFoldersMax, NULL, 0, &dataStartPos, &ssi, allocTemp)); + RINOK(SzReadStreamsInfo(p, sd, numFoldersMax, NULL, 0, &dataStartPos, &ssi, allocTemp)) dataStartPos += baseOffset; if (p->NumFolders == 0) @@ -1000,7 +1010,7 @@ for (fo = 0; fo < p->NumFolders; fo++) { CBuf *tempBuf = tempBufs + fo; - UInt64 unpackSize = SzAr_GetFolderUnpackSize(p, fo); + const UInt64 unpackSize = SzAr_GetFolderUnpackSize(p, fo); if ((size_t)unpackSize != unpackSize) return SZ_ERROR_MEM; if (!Buf_Create(tempBuf, (size_t)unpackSize, allocTemp)) @@ -1010,8 +1020,8 @@ for (fo = 0; fo < p->NumFolders; fo++) { const CBuf *tempBuf = tempBufs + fo; - RINOK(LookInStream_SeekTo(inStream, dataStartPos)); - RINOK(SzAr_DecodeFolder(p, fo, inStream, dataStartPos, tempBuf->data, tempBuf->size, allocTemp)); + RINOK(LookInStream_SeekTo(inStream, dataStartPos)) + RINOK(SzAr_DecodeFolder(p, fo, inStream, dataStartPos, tempBuf->data, tempBuf->size, allocTemp)) } return SZ_OK; @@ -1046,7 +1056,7 @@ return (pos == size) ? SZ_OK : SZ_ERROR_ARCHIVE; } -static MY_NO_INLINE SRes ReadTime(CSzBitUi64s *p, UInt32 num, +static Z7_NO_INLINE SRes ReadTime(CSzBitUi64s *p, UInt32 num, CSzData *sd2, const CBuf *tempBufs, UInt32 numTempBufs, ISzAllocPtr alloc) @@ -1057,22 +1067,22 @@ Byte *defs; Byte external; - RINOK(ReadBitVector(sd2, num, &p->Defs, alloc)); + RINOK(ReadBitVector(sd2, num, &p->Defs, alloc)) - SZ_READ_BYTE_SD(sd2, external); + SZ_READ_BYTE_SD(sd2, external) if (external == 0) sd = *sd2; else { UInt32 index; - RINOK(SzReadNumber32(sd2, &index)); + RINOK(SzReadNumber32(sd2, &index)) if (index >= numTempBufs) return SZ_ERROR_ARCHIVE; sd.Data = tempBufs[index].data; sd.Size = tempBufs[index].size; } - MY_ALLOC_ZE(CNtfsFileTime, p->Vals, num, alloc); + MY_ALLOC_ZE(CNtfsFileTime, p->Vals, num, alloc) vals = p->Vals; defs = p->Defs; for (i = 0; i < num; i++) @@ -1082,7 +1092,7 @@ return SZ_ERROR_ARCHIVE; vals[i].Low = GetUi32(sd.Data); vals[i].High = GetUi32(sd.Data + 4); - SKIP_DATA2(sd, 8); + SKIP_DATA2(sd, 8) } else vals[i].High = vals[i].Low = 0; @@ -1100,7 +1110,7 @@ static SRes SzReadHeader2( CSzArEx *p, /* allocMain */ CSzData *sd, - ILookInStream *inStream, + ILookInStreamPtr inStream, CBuf *tempBufs, UInt32 *numTempBufs, ISzAllocPtr allocMain, ISzAllocPtr allocTemp @@ -1111,26 +1121,26 @@ { UInt64 type; - SzData_Clear(&ssi.sdSizes); - SzData_Clear(&ssi.sdCRCs); - SzData_Clear(&ssi.sdNumSubStreams); + SzData_CLEAR(&ssi.sdSizes) + SzData_CLEAR(&ssi.sdCRCs) + SzData_CLEAR(&ssi.sdNumSubStreams) ssi.NumSubDigests = 0; ssi.NumTotalSubStreams = 0; - RINOK(ReadID(sd, &type)); + RINOK(ReadID(sd, &type)) if (type == k7zIdArchiveProperties) { for (;;) { UInt64 type2; - RINOK(ReadID(sd, &type2)); + RINOK(ReadID(sd, &type2)) if (type2 == k7zIdEnd) break; - RINOK(SkipData(sd)); + RINOK(SkipData(sd)) } - RINOK(ReadID(sd, &type)); + RINOK(ReadID(sd, &type)) } if (type == k7zIdAdditionalStreamsInfo) @@ -1148,15 +1158,15 @@ if (res != SZ_OK) return res; - RINOK(ReadID(sd, &type)); + RINOK(ReadID(sd, &type)) } if (type == k7zIdMainStreamsInfo) { RINOK(SzReadStreamsInfo(&p->db, sd, (UInt32)1 << 30, tempBufs, *numTempBufs, - &p->dataPos, &ssi, allocMain)); + &p->dataPos, &ssi, allocMain)) p->dataPos += p->startPosAfterHeader; - RINOK(ReadID(sd, &type)); + RINOK(ReadID(sd, &type)) } if (type == k7zIdEnd) @@ -1174,23 +1184,23 @@ const Byte *emptyStreams = NULL; const Byte *emptyFiles = NULL; - RINOK(SzReadNumber32(sd, &numFiles)); + RINOK(SzReadNumber32(sd, &numFiles)) p->NumFiles = numFiles; for (;;) { UInt64 type; UInt64 size; - RINOK(ReadID(sd, &type)); + RINOK(ReadID(sd, &type)) if (type == k7zIdEnd) break; - RINOK(ReadNumber(sd, &size)); + RINOK(ReadNumber(sd, &size)) if (size > sd->Size) return SZ_ERROR_ARCHIVE; if (type >= ((UInt32)1 << 8)) { - SKIP_DATA(sd, size); + SKIP_DATA(sd, size) } else switch ((unsigned)type) { @@ -1200,7 +1210,7 @@ const Byte *namesData; Byte external; - SZ_READ_BYTE(external); + SZ_READ_BYTE(external) if (external == 0) { namesSize = (size_t)size - 1; @@ -1209,7 +1219,7 @@ else { UInt32 index; - RINOK(SzReadNumber32(sd, &index)); + RINOK(SzReadNumber32(sd, &index)) if (index >= *numTempBufs) return SZ_ERROR_ARCHIVE; namesData = (tempBufs)[index].data; @@ -1218,25 +1228,25 @@ if ((namesSize & 1) != 0) return SZ_ERROR_ARCHIVE; - MY_ALLOC(size_t, p->FileNameOffsets, numFiles + 1, allocMain); - MY_ALLOC_ZE_AND_CPY(p->FileNames, namesSize, namesData, allocMain); + MY_ALLOC(size_t, p->FileNameOffsets, numFiles + 1, allocMain) + MY_ALLOC_ZE_AND_CPY(p->FileNames, namesSize, namesData, allocMain) RINOK(SzReadFileNames(p->FileNames, namesSize, numFiles, p->FileNameOffsets)) if (external == 0) { - SKIP_DATA(sd, namesSize); + SKIP_DATA(sd, namesSize) } break; } case k7zIdEmptyStream: { - RINOK(RememberBitVector(sd, numFiles, &emptyStreams)); + RINOK(RememberBitVector(sd, numFiles, &emptyStreams)) numEmptyStreams = CountDefinedBits(emptyStreams, numFiles); emptyFiles = NULL; break; } case k7zIdEmptyFile: { - RINOK(RememberBitVector(sd, numEmptyStreams, &emptyFiles)); + RINOK(RememberBitVector(sd, numEmptyStreams, &emptyFiles)) break; } case k7zIdWinAttrib: @@ -1245,22 +1255,22 @@ CSzData sdSwitch; CSzData *sdPtr; SzBitUi32s_Free(&p->Attribs, allocMain); - RINOK(ReadBitVector(sd, numFiles, &p->Attribs.Defs, allocMain)); + RINOK(ReadBitVector(sd, numFiles, &p->Attribs.Defs, allocMain)) - SZ_READ_BYTE(external); + SZ_READ_BYTE(external) if (external == 0) sdPtr = sd; else { UInt32 index; - RINOK(SzReadNumber32(sd, &index)); + RINOK(SzReadNumber32(sd, &index)) if (index >= *numTempBufs) return SZ_ERROR_ARCHIVE; sdSwitch.Data = (tempBufs)[index].data; sdSwitch.Size = (tempBufs)[index].size; sdPtr = &sdSwitch; } - RINOK(ReadUi32s(sdPtr, numFiles, &p->Attribs, allocMain)); + RINOK(ReadUi32s(sdPtr, numFiles, &p->Attribs, allocMain)) break; } /* @@ -1273,11 +1283,11 @@ break; } */ - case k7zIdMTime: RINOK(ReadTime(&p->MTime, numFiles, sd, tempBufs, *numTempBufs, allocMain)); break; - case k7zIdCTime: RINOK(ReadTime(&p->CTime, numFiles, sd, tempBufs, *numTempBufs, allocMain)); break; + case k7zIdMTime: RINOK(ReadTime(&p->MTime, numFiles, sd, tempBufs, *numTempBufs, allocMain)) break; + case k7zIdCTime: RINOK(ReadTime(&p->CTime, numFiles, sd, tempBufs, *numTempBufs, allocMain)) break; default: { - SKIP_DATA(sd, size); + SKIP_DATA(sd, size) } } } @@ -1288,10 +1298,10 @@ for (;;) { UInt64 type; - RINOK(ReadID(sd, &type)); + RINOK(ReadID(sd, &type)) if (type == k7zIdEnd) break; - RINOK(SkipData(sd)); + RINOK(SkipData(sd)) } { @@ -1303,40 +1313,37 @@ UInt64 unpackPos = 0; const Byte *digestsDefs = NULL; const Byte *digestsVals = NULL; - UInt32 digestsValsIndex = 0; - UInt32 digestIndex; - Byte allDigestsDefined = 0; + UInt32 digestIndex = 0; Byte isDirMask = 0; Byte crcMask = 0; Byte mask = 0x80; - MY_ALLOC(UInt32, p->FolderToFile, p->db.NumFolders + 1, allocMain); - MY_ALLOC_ZE(UInt32, p->FileToFolder, p->NumFiles, allocMain); - MY_ALLOC(UInt64, p->UnpackPositions, p->NumFiles + 1, allocMain); - MY_ALLOC_ZE(Byte, p->IsDirs, (p->NumFiles + 7) >> 3, allocMain); + MY_ALLOC(UInt32, p->FolderToFile, p->db.NumFolders + 1, allocMain) + MY_ALLOC_ZE(UInt32, p->FileToFolder, p->NumFiles, allocMain) + MY_ALLOC(UInt64, p->UnpackPositions, p->NumFiles + 1, allocMain) + MY_ALLOC_ZE(Byte, p->IsDirs, (p->NumFiles + 7) >> 3, allocMain) - RINOK(SzBitUi32s_Alloc(&p->CRCs, p->NumFiles, allocMain)); + RINOK(SzBitUi32s_Alloc(&p->CRCs, p->NumFiles, allocMain)) if (ssi.sdCRCs.Size != 0) { - SZ_READ_BYTE_SD(&ssi.sdCRCs, allDigestsDefined); + Byte allDigestsDefined = 0; + SZ_READ_BYTE_SD_NOCHECK(&ssi.sdCRCs, allDigestsDefined) if (allDigestsDefined) digestsVals = ssi.sdCRCs.Data; else { - size_t numBytes = (ssi.NumSubDigests + 7) >> 3; + const size_t numBytes = (ssi.NumSubDigests + 7) >> 3; digestsDefs = ssi.sdCRCs.Data; digestsVals = digestsDefs + numBytes; } } - digestIndex = 0; - for (i = 0; i < numFiles; i++, mask >>= 1) { if (mask == 0) { - UInt32 byteIndex = (i - 1) >> 3; + const UInt32 byteIndex = (i - 1) >> 3; p->IsDirs[byteIndex] = isDirMask; p->CRCs.Defs[byteIndex] = crcMask; isDirMask = 0; @@ -1374,18 +1381,17 @@ numSubStreams = 1; if (ssi.sdNumSubStreams.Data) { - RINOK(SzReadNumber32(&ssi.sdNumSubStreams, &numSubStreams)); + RINOK(SzReadNumber32(&ssi.sdNumSubStreams, &numSubStreams)) } remSubStreams = numSubStreams; if (numSubStreams != 0) break; { - UInt64 folderUnpackSize = SzAr_GetFolderUnpackSize(&p->db, folderIndex); + const UInt64 folderUnpackSize = SzAr_GetFolderUnpackSize(&p->db, folderIndex); unpackPos += folderUnpackSize; if (unpackPos < folderUnpackSize) return SZ_ERROR_ARCHIVE; } - folderIndex++; } } @@ -1397,47 +1403,44 @@ if (--remSubStreams == 0) { - UInt64 folderUnpackSize = SzAr_GetFolderUnpackSize(&p->db, folderIndex); - UInt64 startFolderUnpackPos = p->UnpackPositions[p->FolderToFile[folderIndex]]; + const UInt64 folderUnpackSize = SzAr_GetFolderUnpackSize(&p->db, folderIndex); + const UInt64 startFolderUnpackPos = p->UnpackPositions[p->FolderToFile[folderIndex]]; if (folderUnpackSize < unpackPos - startFolderUnpackPos) return SZ_ERROR_ARCHIVE; unpackPos = startFolderUnpackPos + folderUnpackSize; if (unpackPos < folderUnpackSize) return SZ_ERROR_ARCHIVE; - if (numSubStreams == 1 && SzBitWithVals_Check(&p->db.FolderCRCs, i)) + if (numSubStreams == 1 && SzBitWithVals_Check(&p->db.FolderCRCs, folderIndex)) { p->CRCs.Vals[i] = p->db.FolderCRCs.Vals[folderIndex]; crcMask |= mask; } - else if (allDigestsDefined || (digestsDefs && SzBitArray_Check(digestsDefs, digestIndex))) - { - p->CRCs.Vals[i] = GetUi32(digestsVals + (size_t)digestsValsIndex * 4); - digestsValsIndex++; - crcMask |= mask; - } - folderIndex++; } else { UInt64 v; - RINOK(ReadNumber(&ssi.sdSizes, &v)); + RINOK(ReadNumber(&ssi.sdSizes, &v)) unpackPos += v; if (unpackPos < v) return SZ_ERROR_ARCHIVE; - if (allDigestsDefined || (digestsDefs && SzBitArray_Check(digestsDefs, digestIndex))) + } + if ((crcMask & mask) == 0 && digestsVals) + { + if (!digestsDefs || SzBitArray_Check(digestsDefs, digestIndex)) { - p->CRCs.Vals[i] = GetUi32(digestsVals + (size_t)digestsValsIndex * 4); - digestsValsIndex++; + p->CRCs.Vals[i] = GetUi32(digestsVals); + digestsVals += 4; crcMask |= mask; } + digestIndex++; } } if (mask != 0x80) { - UInt32 byteIndex = (i - 1) >> 3; + const UInt32 byteIndex = (i - 1) >> 3; p->IsDirs[byteIndex] = isDirMask; p->CRCs.Defs[byteIndex] = crcMask; } @@ -1454,7 +1457,7 @@ break; if (!ssi.sdNumSubStreams.Data) return SZ_ERROR_ARCHIVE; - RINOK(SzReadNumber32(&ssi.sdNumSubStreams, &numSubStreams)); + RINOK(SzReadNumber32(&ssi.sdNumSubStreams, &numSubStreams)) if (numSubStreams != 0) return SZ_ERROR_ARCHIVE; /* @@ -1479,7 +1482,7 @@ static SRes SzReadHeader( CSzArEx *p, CSzData *sd, - ILookInStream *inStream, + ILookInStreamPtr inStream, ISzAllocPtr allocMain, ISzAllocPtr allocTemp) { @@ -1498,7 +1501,7 @@ for (i = 0; i < NUM_ADDITIONAL_STREAMS_MAX; i++) Buf_Free(tempBufs + i, allocTemp); - RINOK(res); + RINOK(res) if (sd->Size != 0) return SZ_ERROR_FAIL; @@ -1508,7 +1511,7 @@ static SRes SzArEx_Open2( CSzArEx *p, - ILookInStream *inStream, + ILookInStreamPtr inStream, ISzAllocPtr allocMain, ISzAllocPtr allocTemp) { @@ -1521,9 +1524,9 @@ SRes res; startArcPos = 0; - RINOK(ILookInStream_Seek(inStream, &startArcPos, SZ_SEEK_CUR)); + RINOK(ILookInStream_Seek(inStream, &startArcPos, SZ_SEEK_CUR)) - RINOK(LookInStream_Read2(inStream, header, k7zStartHeaderSize, SZ_ERROR_NO_ARCHIVE)); + RINOK(LookInStream_Read2(inStream, header, k7zStartHeaderSize, SZ_ERROR_NO_ARCHIVE)) if (!TestSignatureCandidate(header)) return SZ_ERROR_NO_ARCHIVE; @@ -1552,14 +1555,14 @@ { Int64 pos = 0; - RINOK(ILookInStream_Seek(inStream, &pos, SZ_SEEK_END)); + RINOK(ILookInStream_Seek(inStream, &pos, SZ_SEEK_END)) if ((UInt64)pos < (UInt64)startArcPos + nextHeaderOffset || (UInt64)pos < (UInt64)startArcPos + k7zStartHeaderSize + nextHeaderOffset || (UInt64)pos < (UInt64)startArcPos + k7zStartHeaderSize + nextHeaderOffset + nextHeaderSize) return SZ_ERROR_INPUT_EOF; } - RINOK(LookInStream_SeekTo(inStream, (UInt64)startArcPos + k7zStartHeaderSize + nextHeaderOffset)); + RINOK(LookInStream_SeekTo(inStream, (UInt64)startArcPos + k7zStartHeaderSize + nextHeaderOffset)) if (!Buf_Create(&buf, nextHeaderSizeT, allocTemp)) return SZ_ERROR_MEM; @@ -1634,10 +1637,10 @@ } -SRes SzArEx_Open(CSzArEx *p, ILookInStream *inStream, +SRes SzArEx_Open(CSzArEx *p, ILookInStreamPtr inStream, ISzAllocPtr allocMain, ISzAllocPtr allocTemp) { - SRes res = SzArEx_Open2(p, inStream, allocMain, allocTemp); + const SRes res = SzArEx_Open2(p, inStream, allocMain, allocTemp); if (res != SZ_OK) SzArEx_Free(p, allocMain); return res; @@ -1646,7 +1649,7 @@ SRes SzArEx_Extract( const CSzArEx *p, - ILookInStream *inStream, + ILookInStreamPtr inStream, UInt32 fileIndex, UInt32 *blockIndex, Byte **tempBuf, @@ -1656,7 +1659,7 @@ ISzAllocPtr allocMain, ISzAllocPtr allocTemp) { - UInt32 folderIndex = p->FileToFolder[fileIndex]; + const UInt32 folderIndex = p->FileToFolder[fileIndex]; SRes res = SZ_OK; *offset = 0; @@ -1673,13 +1676,13 @@ if (*tempBuf == NULL || *blockIndex != folderIndex) { - UInt64 unpackSizeSpec = SzAr_GetFolderUnpackSize(&p->db, folderIndex); + const UInt64 unpackSizeSpec = SzAr_GetFolderUnpackSize(&p->db, folderIndex); /* UInt64 unpackSizeSpec = p->UnpackPositions[p->FolderToFile[(size_t)folderIndex + 1]] - p->UnpackPositions[p->FolderToFile[folderIndex]]; */ - size_t unpackSize = (size_t)unpackSizeSpec; + const size_t unpackSize = (size_t)unpackSizeSpec; if (unpackSize != unpackSizeSpec) return SZ_ERROR_MEM; @@ -1707,7 +1710,7 @@ if (res == SZ_OK) { - UInt64 unpackPos = p->UnpackPositions[fileIndex]; + const UInt64 unpackPos = p->UnpackPositions[fileIndex]; *offset = (size_t)(unpackPos - p->UnpackPositions[p->FolderToFile[folderIndex]]); *outSizeProcessed = (size_t)(p->UnpackPositions[(size_t)fileIndex + 1] - unpackPos); if (*offset + *outSizeProcessed > *outBufferSize) @@ -1723,8 +1726,8 @@ size_t SzArEx_GetFileNameUtf16(const CSzArEx *p, size_t fileIndex, UInt16 *dest) { - size_t offs = p->FileNameOffsets[fileIndex]; - size_t len = p->FileNameOffsets[fileIndex + 1] - offs; + const size_t offs = p->FileNameOffsets[fileIndex]; + const size_t len = p->FileNameOffsets[fileIndex + 1] - offs; if (dest != 0) { size_t i;
diff --git a/third_party/lzma_sdk/C/7zBuf.h b/third_party/lzma_sdk/C/7zBuf.h index 81d1b5b..c0ba8a7 100644 --- a/third_party/lzma_sdk/C/7zBuf.h +++ b/third_party/lzma_sdk/C/7zBuf.h
@@ -1,8 +1,8 @@ /* 7zBuf.h -- Byte Buffer -2017-04-03 : Igor Pavlov : Public domain */ +2023-03-04 : Igor Pavlov : Public domain */ -#ifndef __7Z_BUF_H -#define __7Z_BUF_H +#ifndef ZIP7_INC_7Z_BUF_H +#define ZIP7_INC_7Z_BUF_H #include "7zTypes.h"
diff --git a/third_party/lzma_sdk/C/7zCrc.c b/third_party/lzma_sdk/C/7zCrc.c index c0cc9bc..6e2db9ea 100644 --- a/third_party/lzma_sdk/C/7zCrc.c +++ b/third_party/lzma_sdk/C/7zCrc.c
@@ -1,182 +1,218 @@ -/* 7zCrc.c -- CRC32 init -2021-04-01 : Igor Pavlov : Public domain */ +/* 7zCrc.c -- CRC32 calculation and init +2024-03-01 : Igor Pavlov : Public domain */ #include "Precomp.h" #include "7zCrc.h" #include "CpuArch.h" -#define kCrcPoly 0xEDB88320 +// for debug: +// #define __ARM_FEATURE_CRC32 1 -#ifdef MY_CPU_LE - #define CRC_NUM_TABLES 8 +#ifdef __ARM_FEATURE_CRC32 +// #pragma message("__ARM_FEATURE_CRC32") +#define Z7_CRC_HW_FORCE +#endif + +// #define Z7_CRC_DEBUG_BE +#ifdef Z7_CRC_DEBUG_BE +#undef MY_CPU_LE +#define MY_CPU_BE +#endif + +#ifdef Z7_CRC_HW_FORCE + #define Z7_CRC_NUM_TABLES_USE 1 #else - #define CRC_NUM_TABLES 9 - - #define CRC_UINT32_SWAP(v) ((v >> 24) | ((v >> 8) & 0xFF00) | ((v << 8) & 0xFF0000) | (v << 24)) - - UInt32 MY_FAST_CALL CrcUpdateT1_BeT4(UInt32 v, const void *data, size_t size, const UInt32 *table); - UInt32 MY_FAST_CALL CrcUpdateT1_BeT8(UInt32 v, const void *data, size_t size, const UInt32 *table); +#ifdef Z7_CRC_NUM_TABLES + #define Z7_CRC_NUM_TABLES_USE Z7_CRC_NUM_TABLES +#else + #define Z7_CRC_NUM_TABLES_USE 12 +#endif #endif -#ifndef MY_CPU_BE - UInt32 MY_FAST_CALL CrcUpdateT4(UInt32 v, const void *data, size_t size, const UInt32 *table); - UInt32 MY_FAST_CALL CrcUpdateT8(UInt32 v, const void *data, size_t size, const UInt32 *table); +#if Z7_CRC_NUM_TABLES_USE < 1 + #error Stop_Compiling_Bad_Z7_CRC_NUM_TABLES #endif -typedef UInt32 (MY_FAST_CALL *CRC_FUNC)(UInt32 v, const void *data, size_t size, const UInt32 *table); +#if defined(MY_CPU_LE) || (Z7_CRC_NUM_TABLES_USE == 1) + #define Z7_CRC_NUM_TABLES_TOTAL Z7_CRC_NUM_TABLES_USE +#else + #define Z7_CRC_NUM_TABLES_TOTAL (Z7_CRC_NUM_TABLES_USE + 1) +#endif -extern -CRC_FUNC g_CrcUpdateT4; -CRC_FUNC g_CrcUpdateT4; -extern -CRC_FUNC g_CrcUpdateT8; -CRC_FUNC g_CrcUpdateT8; -extern -CRC_FUNC g_CrcUpdateT0_32; -CRC_FUNC g_CrcUpdateT0_32; -extern -CRC_FUNC g_CrcUpdateT0_64; -CRC_FUNC g_CrcUpdateT0_64; -extern -CRC_FUNC g_CrcUpdate; -CRC_FUNC g_CrcUpdate; +#ifndef Z7_CRC_HW_FORCE -UInt32 g_CrcTable[256 * CRC_NUM_TABLES]; - -UInt32 MY_FAST_CALL CrcUpdate(UInt32 v, const void *data, size_t size) +#if Z7_CRC_NUM_TABLES_USE == 1 \ + || (!defined(MY_CPU_LE) && !defined(MY_CPU_BE)) +#define CRC_UPDATE_BYTE_2(crc, b) (table[((crc) ^ (b)) & 0xFF] ^ ((crc) >> 8)) +#define Z7_CRC_UPDATE_T1_FUNC_NAME CrcUpdateGT1 +static UInt32 Z7_FASTCALL Z7_CRC_UPDATE_T1_FUNC_NAME(UInt32 v, const void *data, size_t size) { - return g_CrcUpdate(v, data, size, g_CrcTable); -} - -UInt32 MY_FAST_CALL CrcCalc(const void *data, size_t size) -{ - return g_CrcUpdate(CRC_INIT_VAL, data, size, g_CrcTable) ^ CRC_INIT_VAL; -} - -#define CRC_UPDATE_BYTE_2(crc, b) (table[((crc) ^ (b)) & 0xFF] ^ ((crc) >> 8)) - -UInt32 MY_FAST_CALL CrcUpdateT1(UInt32 v, const void *data, size_t size, const UInt32 *table); -UInt32 MY_FAST_CALL CrcUpdateT1(UInt32 v, const void *data, size_t size, const UInt32 *table) -{ + const UInt32 *table = g_CrcTable; const Byte *p = (const Byte *)data; - const Byte *pEnd = p + size; - for (; p != pEnd; p++) + const Byte *lim = p + size; + for (; p != lim; p++) v = CRC_UPDATE_BYTE_2(v, *p); return v; } +#endif +#if Z7_CRC_NUM_TABLES_USE != 1 +#ifndef MY_CPU_BE + #define FUNC_NAME_LE_2(s) CrcUpdateT ## s + #define FUNC_NAME_LE_1(s) FUNC_NAME_LE_2(s) + #define FUNC_NAME_LE FUNC_NAME_LE_1(Z7_CRC_NUM_TABLES_USE) + UInt32 Z7_FASTCALL FUNC_NAME_LE (UInt32 v, const void *data, size_t size, const UInt32 *table); +#endif +#ifndef MY_CPU_LE + #define FUNC_NAME_BE_2(s) CrcUpdateT1_BeT ## s + #define FUNC_NAME_BE_1(s) FUNC_NAME_BE_2(s) + #define FUNC_NAME_BE FUNC_NAME_BE_1(Z7_CRC_NUM_TABLES_USE) + UInt32 Z7_FASTCALL FUNC_NAME_BE (UInt32 v, const void *data, size_t size, const UInt32 *table); +#endif +#endif + +#endif // Z7_CRC_HW_FORCE + /* ---------- hardware CRC ---------- */ #ifdef MY_CPU_LE #if defined(MY_CPU_ARM_OR_ARM64) - // #pragma message("ARM*") - #if defined(_MSC_VER) - #if defined(MY_CPU_ARM64) - #if (_MSC_VER >= 1910) - // #define USE_ARM64_CRC - #endif - #endif - #elif (defined(__clang__) && (__clang_major__ >= 3)) \ - || (defined(__GNUC__) && (__GNUC__ > 4)) + #if (defined(__clang__) && (__clang_major__ >= 3)) \ + || defined(__GNUC__) && (__GNUC__ >= 6) && defined(MY_CPU_ARM64) \ + || defined(__GNUC__) && (__GNUC__ >= 8) #if !defined(__ARM_FEATURE_CRC32) - // #define __ARM_FEATURE_CRC32 1 - #if (!defined(__clang__) || (__clang_major__ > 3)) // fix these numbers - // #define ATTRIB_CRC __attribute__((__target__("arch=armv8-a+crc"))) +// #pragma message("!defined(__ARM_FEATURE_CRC32)") +Z7_DIAGNOSTIC_IGNORE_BEGIN_RESERVED_MACRO_IDENTIFIER + #define __ARM_FEATURE_CRC32 1 +Z7_DIAGNOSTIC_IGNORE_END_RESERVED_MACRO_IDENTIFIER + #define Z7_ARM_FEATURE_CRC32_WAS_SET + #if defined(__clang__) + #if defined(MY_CPU_ARM64) + #define ATTRIB_CRC __attribute__((__target__("crc"))) + #else + #define ATTRIB_CRC __attribute__((__target__("armv8-a,crc"))) #endif + #else + #if defined(MY_CPU_ARM64) +#if !defined(Z7_GCC_VERSION) || (Z7_GCC_VERSION >= 60000) + #define ATTRIB_CRC __attribute__((__target__("+crc"))) +#endif + #else +#if !defined(Z7_GCC_VERSION) || (__GNUC__ >= 8) +#if defined(__ARM_FP) && __GNUC__ >= 8 +// for -mfloat-abi=hard: similar to <arm_acle.h> + #define ATTRIB_CRC __attribute__((__target__("arch=armv8-a+crc+simd"))) +#else + #define ATTRIB_CRC __attribute__((__target__("arch=armv8-a+crc"))) +#endif +#endif + #endif + #endif #endif #if defined(__ARM_FEATURE_CRC32) - // #define USE_ARM64_CRC - // #include <arm_acle.h> + // #pragma message("<arm_acle.h>") +/* +arm_acle.h (GGC): + before Nov 17, 2017: +#ifdef __ARM_FEATURE_CRC32 + + Nov 17, 2017: gcc10.0 (gcc 9.2.0) checked" +#if __ARM_ARCH >= 8 +#pragma GCC target ("arch=armv8-a+crc") + + Aug 22, 2019: GCC 8.4?, 9.2.1, 10.1: +#ifdef __ARM_FEATURE_CRC32 +#ifdef __ARM_FP +#pragma GCC target ("arch=armv8-a+crc+simd") +#else +#pragma GCC target ("arch=armv8-a+crc") +#endif +*/ +#if defined(__ARM_ARCH) && __ARM_ARCH < 8 +#if defined(Z7_GCC_VERSION) && (__GNUC__ == 8) && (Z7_GCC_VERSION < 80400) \ + || defined(Z7_GCC_VERSION) && (__GNUC__ == 9) && (Z7_GCC_VERSION < 90201) \ + || defined(Z7_GCC_VERSION) && (__GNUC__ == 10) && (Z7_GCC_VERSION < 100100) +Z7_DIAGNOSTIC_IGNORE_BEGIN_RESERVED_MACRO_IDENTIFIER +// #pragma message("#define __ARM_ARCH 8") +#undef __ARM_ARCH +#define __ARM_ARCH 8 +Z7_DIAGNOSTIC_IGNORE_END_RESERVED_MACRO_IDENTIFIER +#endif +#endif + #define Z7_CRC_HW_USE + #include <arm_acle.h> #endif + #elif defined(_MSC_VER) + #if defined(MY_CPU_ARM64) + #if (_MSC_VER >= 1910) + #ifdef __clang__ + // #define Z7_CRC_HW_USE + // #include <arm_acle.h> + #else + #define Z7_CRC_HW_USE + #include <intrin.h> + #endif + #endif + #endif #endif -#else +#else // non-ARM* -// no hardware CRC - -// #define USE_CRC_EMU - -#ifdef USE_CRC_EMU - -#pragma message("ARM64 CRC emulation") - -MY_FORCE_INLINE -UInt32 __crc32b(UInt32 v, UInt32 data) -{ - const UInt32 *table = g_CrcTable; - v = CRC_UPDATE_BYTE_2(v, (Byte)data); - return v; -} - -MY_FORCE_INLINE -UInt32 __crc32w(UInt32 v, UInt32 data) -{ - const UInt32 *table = g_CrcTable; - v = CRC_UPDATE_BYTE_2(v, (Byte)data); data >>= 8; - v = CRC_UPDATE_BYTE_2(v, (Byte)data); data >>= 8; - v = CRC_UPDATE_BYTE_2(v, (Byte)data); data >>= 8; - v = CRC_UPDATE_BYTE_2(v, (Byte)data); data >>= 8; - return v; -} - -MY_FORCE_INLINE -UInt32 __crc32d(UInt32 v, UInt64 data) -{ - const UInt32 *table = g_CrcTable; - v = CRC_UPDATE_BYTE_2(v, (Byte)data); data >>= 8; - v = CRC_UPDATE_BYTE_2(v, (Byte)data); data >>= 8; - v = CRC_UPDATE_BYTE_2(v, (Byte)data); data >>= 8; - v = CRC_UPDATE_BYTE_2(v, (Byte)data); data >>= 8; - v = CRC_UPDATE_BYTE_2(v, (Byte)data); data >>= 8; - v = CRC_UPDATE_BYTE_2(v, (Byte)data); data >>= 8; - v = CRC_UPDATE_BYTE_2(v, (Byte)data); data >>= 8; - v = CRC_UPDATE_BYTE_2(v, (Byte)data); data >>= 8; - return v; -} - -#endif // USE_CRC_EMU - -#endif // defined(MY_CPU_ARM64) && defined(MY_CPU_LE) - - - -#if defined(USE_ARM64_CRC) || defined(USE_CRC_EMU) - -#define T0_32_UNROLL_BYTES (4 * 4) -#define T0_64_UNROLL_BYTES (4 * 8) - -#ifndef ATTRIB_CRC -#define ATTRIB_CRC +// #define Z7_CRC_HW_USE // for debug : we can test HW-branch of code +#ifdef Z7_CRC_HW_USE +#include "7zCrcEmu.h" #endif + +#endif // non-ARM* + + + +#if defined(Z7_CRC_HW_USE) + // #pragma message("USE ARM HW CRC") -ATTRIB_CRC -UInt32 MY_FAST_CALL CrcUpdateT0_32(UInt32 v, const void *data, size_t size, const UInt32 *table); -ATTRIB_CRC -UInt32 MY_FAST_CALL CrcUpdateT0_32(UInt32 v, const void *data, size_t size, const UInt32 *table) +#ifdef MY_CPU_64BIT + #define CRC_HW_WORD_TYPE UInt64 + #define CRC_HW_WORD_FUNC __crc32d +#else + #define CRC_HW_WORD_TYPE UInt32 + #define CRC_HW_WORD_FUNC __crc32w +#endif + +#define CRC_HW_UNROLL_BYTES (sizeof(CRC_HW_WORD_TYPE) * 4) + +#ifdef ATTRIB_CRC + ATTRIB_CRC +#endif +Z7_NO_INLINE +#ifdef Z7_CRC_HW_FORCE + UInt32 Z7_FASTCALL CrcUpdate +#else + static UInt32 Z7_FASTCALL CrcUpdate_HW +#endif + (UInt32 v, const void *data, size_t size) { const Byte *p = (const Byte *)data; - UNUSED_VAR(table); - - for (; size != 0 && ((unsigned)(ptrdiff_t)p & (T0_32_UNROLL_BYTES - 1)) != 0; size--) + for (; size != 0 && ((unsigned)(ptrdiff_t)p & (CRC_HW_UNROLL_BYTES - 1)) != 0; size--) v = __crc32b(v, *p++); - - if (size >= T0_32_UNROLL_BYTES) + if (size >= CRC_HW_UNROLL_BYTES) { const Byte *lim = p + size; - size &= (T0_32_UNROLL_BYTES - 1); + size &= CRC_HW_UNROLL_BYTES - 1; lim -= size; do { - v = __crc32w(v, *(const UInt32 *)(const void *)(p)); - v = __crc32w(v, *(const UInt32 *)(const void *)(p + 4)); p += 2 * 4; - v = __crc32w(v, *(const UInt32 *)(const void *)(p)); - v = __crc32w(v, *(const UInt32 *)(const void *)(p + 4)); p += 2 * 4; + v = CRC_HW_WORD_FUNC(v, *(const CRC_HW_WORD_TYPE *)(const void *)(p)); + v = CRC_HW_WORD_FUNC(v, *(const CRC_HW_WORD_TYPE *)(const void *)(p + sizeof(CRC_HW_WORD_TYPE))); + p += 2 * sizeof(CRC_HW_WORD_TYPE); + v = CRC_HW_WORD_FUNC(v, *(const CRC_HW_WORD_TYPE *)(const void *)(p)); + v = CRC_HW_WORD_FUNC(v, *(const CRC_HW_WORD_TYPE *)(const void *)(p + sizeof(CRC_HW_WORD_TYPE))); + p += 2 * sizeof(CRC_HW_WORD_TYPE); } while (p != lim); } @@ -187,136 +223,198 @@ return v; } -ATTRIB_CRC -UInt32 MY_FAST_CALL CrcUpdateT0_64(UInt32 v, const void *data, size_t size, const UInt32 *table); -ATTRIB_CRC -UInt32 MY_FAST_CALL CrcUpdateT0_64(UInt32 v, const void *data, size_t size, const UInt32 *table) -{ - const Byte *p = (const Byte *)data; - UNUSED_VAR(table); +#ifdef Z7_ARM_FEATURE_CRC32_WAS_SET +Z7_DIAGNOSTIC_IGNORE_BEGIN_RESERVED_MACRO_IDENTIFIER +#undef __ARM_FEATURE_CRC32 +Z7_DIAGNOSTIC_IGNORE_END_RESERVED_MACRO_IDENTIFIER +#undef Z7_ARM_FEATURE_CRC32_WAS_SET +#endif - for (; size != 0 && ((unsigned)(ptrdiff_t)p & (T0_64_UNROLL_BYTES - 1)) != 0; size--) - v = __crc32b(v, *p++); - - if (size >= T0_64_UNROLL_BYTES) - { - const Byte *lim = p + size; - size &= (T0_64_UNROLL_BYTES - 1); - lim -= size; - do - { - v = __crc32d(v, *(const UInt64 *)(const void *)(p)); - v = __crc32d(v, *(const UInt64 *)(const void *)(p + 8)); p += 2 * 8; - v = __crc32d(v, *(const UInt64 *)(const void *)(p)); - v = __crc32d(v, *(const UInt64 *)(const void *)(p + 8)); p += 2 * 8; - } - while (p != lim); - } - - for (; size != 0; size--) - v = __crc32b(v, *p++); - - return v; -} - -#endif // defined(USE_ARM64_CRC) || defined(USE_CRC_EMU) - +#endif // defined(Z7_CRC_HW_USE) #endif // MY_CPU_LE +#ifndef Z7_CRC_HW_FORCE -void MY_FAST_CALL CrcGenerateTable() +#if defined(Z7_CRC_HW_USE) || defined(Z7_CRC_UPDATE_T1_FUNC_NAME) +/* +typedef UInt32 (Z7_FASTCALL *Z7_CRC_UPDATE_WITH_TABLE_FUNC) + (UInt32 v, const void *data, size_t size, const UInt32 *table); +Z7_CRC_UPDATE_WITH_TABLE_FUNC g_CrcUpdate; +*/ +static unsigned g_Crc_Algo; +#if (!defined(MY_CPU_LE) && !defined(MY_CPU_BE)) +static unsigned g_Crc_Be; +#endif +#endif // defined(Z7_CRC_HW_USE) || defined(Z7_CRC_UPDATE_T1_FUNC_NAME) + + + +Z7_NO_INLINE +#ifdef Z7_CRC_HW_USE + static UInt32 Z7_FASTCALL CrcUpdate_Base +#else + UInt32 Z7_FASTCALL CrcUpdate +#endif + (UInt32 crc, const void *data, size_t size) +{ +#if Z7_CRC_NUM_TABLES_USE == 1 + return Z7_CRC_UPDATE_T1_FUNC_NAME(crc, data, size); +#else // Z7_CRC_NUM_TABLES_USE != 1 +#ifdef Z7_CRC_UPDATE_T1_FUNC_NAME + if (g_Crc_Algo == 1) + return Z7_CRC_UPDATE_T1_FUNC_NAME(crc, data, size); +#endif + +#ifdef MY_CPU_LE + return FUNC_NAME_LE(crc, data, size, g_CrcTable); +#elif defined(MY_CPU_BE) + return FUNC_NAME_BE(crc, data, size, g_CrcTable); +#else + if (g_Crc_Be) + return FUNC_NAME_BE(crc, data, size, g_CrcTable); + else + return FUNC_NAME_LE(crc, data, size, g_CrcTable); +#endif +#endif // Z7_CRC_NUM_TABLES_USE != 1 +} + + +#ifdef Z7_CRC_HW_USE +Z7_NO_INLINE +UInt32 Z7_FASTCALL CrcUpdate(UInt32 crc, const void *data, size_t size) +{ + if (g_Crc_Algo == 0) + return CrcUpdate_HW(crc, data, size); + return CrcUpdate_Base(crc, data, size); +} +#endif + +#endif // !defined(Z7_CRC_HW_FORCE) + + + +UInt32 Z7_FASTCALL CrcCalc(const void *data, size_t size) +{ + return CrcUpdate(CRC_INIT_VAL, data, size) ^ CRC_INIT_VAL; +} + + +MY_ALIGN(64) +UInt32 g_CrcTable[256 * Z7_CRC_NUM_TABLES_TOTAL]; + + +void Z7_FASTCALL CrcGenerateTable(void) { UInt32 i; for (i = 0; i < 256; i++) { +#if defined(Z7_CRC_HW_FORCE) + g_CrcTable[i] = __crc32b(i, 0); +#else + #define kCrcPoly 0xEDB88320 UInt32 r = i; unsigned j; for (j = 0; j < 8; j++) r = (r >> 1) ^ (kCrcPoly & ((UInt32)0 - (r & 1))); g_CrcTable[i] = r; +#endif } - for (i = 256; i < 256 * CRC_NUM_TABLES; i++) + for (i = 256; i < 256 * Z7_CRC_NUM_TABLES_USE; i++) { - UInt32 r = g_CrcTable[(size_t)i - 256]; + const UInt32 r = g_CrcTable[(size_t)i - 256]; g_CrcTable[i] = g_CrcTable[r & 0xFF] ^ (r >> 8); } - #if CRC_NUM_TABLES < 4 - - g_CrcUpdate = CrcUpdateT1; - - #else - - #ifdef MY_CPU_LE +#if !defined(Z7_CRC_HW_FORCE) && \ + (defined(Z7_CRC_HW_USE) || defined(Z7_CRC_UPDATE_T1_FUNC_NAME) || defined(MY_CPU_BE)) - g_CrcUpdateT4 = CrcUpdateT4; - g_CrcUpdate = CrcUpdateT4; +#if Z7_CRC_NUM_TABLES_USE <= 1 + g_Crc_Algo = 1; +#else // Z7_CRC_NUM_TABLES_USE <= 1 - #if CRC_NUM_TABLES >= 8 - g_CrcUpdateT8 = CrcUpdateT8; - - #ifdef MY_CPU_X86_OR_AMD64 - if (!CPU_Is_InOrder()) - #endif - g_CrcUpdate = CrcUpdateT8; - #endif - - #else +#if defined(MY_CPU_LE) + g_Crc_Algo = Z7_CRC_NUM_TABLES_USE; +#else // !defined(MY_CPU_LE) { - #ifndef MY_CPU_BE +#ifndef MY_CPU_BE UInt32 k = 0x01020304; const Byte *p = (const Byte *)&k; if (p[0] == 4 && p[1] == 3) - { - g_CrcUpdateT4 = CrcUpdateT4; - g_CrcUpdate = CrcUpdateT4; - #if CRC_NUM_TABLES >= 8 - g_CrcUpdateT8 = CrcUpdateT8; - g_CrcUpdate = CrcUpdateT8; - #endif - } + g_Crc_Algo = Z7_CRC_NUM_TABLES_USE; else if (p[0] != 1 || p[1] != 2) - g_CrcUpdate = CrcUpdateT1; + g_Crc_Algo = 1; else - #endif +#endif // MY_CPU_BE { - for (i = 256 * CRC_NUM_TABLES - 1; i >= 256; i--) + for (i = 256 * Z7_CRC_NUM_TABLES_TOTAL - 1; i >= 256; i--) { - UInt32 x = g_CrcTable[(size_t)i - 256]; - g_CrcTable[i] = CRC_UINT32_SWAP(x); + const UInt32 x = g_CrcTable[(size_t)i - 256]; + g_CrcTable[i] = Z7_BSWAP32(x); } - g_CrcUpdateT4 = CrcUpdateT1_BeT4; - g_CrcUpdate = CrcUpdateT1_BeT4; - #if CRC_NUM_TABLES >= 8 - g_CrcUpdateT8 = CrcUpdateT1_BeT8; - g_CrcUpdate = CrcUpdateT1_BeT8; - #endif +#if defined(Z7_CRC_UPDATE_T1_FUNC_NAME) + g_Crc_Algo = Z7_CRC_NUM_TABLES_USE; +#endif +#if (!defined(MY_CPU_LE) && !defined(MY_CPU_BE)) + g_Crc_Be = 1; +#endif } } - #endif - #endif +#endif // !defined(MY_CPU_LE) - #ifdef MY_CPU_LE - #ifdef USE_ARM64_CRC - if (CPU_IsSupported_CRC32()) - { - g_CrcUpdateT0_32 = CrcUpdateT0_32; - g_CrcUpdateT0_64 = CrcUpdateT0_64; - g_CrcUpdate = - #if defined(MY_CPU_ARM) - CrcUpdateT0_32; - #else - CrcUpdateT0_64; - #endif - } - #endif - - #ifdef USE_CRC_EMU - g_CrcUpdateT0_32 = CrcUpdateT0_32; - g_CrcUpdateT0_64 = CrcUpdateT0_64; - g_CrcUpdate = CrcUpdateT0_64; - #endif - #endif +#ifdef MY_CPU_LE +#ifdef Z7_CRC_HW_USE + if (CPU_IsSupported_CRC32()) + g_Crc_Algo = 0; +#endif // Z7_CRC_HW_USE +#endif // MY_CPU_LE + +#endif // Z7_CRC_NUM_TABLES_USE <= 1 +#endif // g_Crc_Algo was declared } + +Z7_CRC_UPDATE_FUNC z7_GetFunc_CrcUpdate(unsigned algo) +{ + if (algo == 0) + return &CrcUpdate; + +#if defined(Z7_CRC_HW_USE) + if (algo == sizeof(CRC_HW_WORD_TYPE) * 8) + { +#ifdef Z7_CRC_HW_FORCE + return &CrcUpdate; +#else + if (g_Crc_Algo == 0) + return &CrcUpdate_HW; +#endif + } +#endif + +#ifndef Z7_CRC_HW_FORCE + if (algo == Z7_CRC_NUM_TABLES_USE) + return + #ifdef Z7_CRC_HW_USE + &CrcUpdate_Base; + #else + &CrcUpdate; + #endif +#endif + + return NULL; +} + +#undef kCrcPoly +#undef Z7_CRC_NUM_TABLES_USE +#undef Z7_CRC_NUM_TABLES_TOTAL +#undef CRC_UPDATE_BYTE_2 +#undef FUNC_NAME_LE_2 +#undef FUNC_NAME_LE_1 +#undef FUNC_NAME_LE +#undef FUNC_NAME_BE_2 +#undef FUNC_NAME_BE_1 +#undef FUNC_NAME_BE + +#undef CRC_HW_UNROLL_BYTES +#undef CRC_HW_WORD_FUNC +#undef CRC_HW_WORD_TYPE
diff --git a/third_party/lzma_sdk/C/7zCrc.h b/third_party/lzma_sdk/C/7zCrc.h index 8fd57958..3e6d408b9 100644 --- a/third_party/lzma_sdk/C/7zCrc.h +++ b/third_party/lzma_sdk/C/7zCrc.h
@@ -1,8 +1,8 @@ /* 7zCrc.h -- CRC32 calculation -2013-01-18 : Igor Pavlov : Public domain */ +2024-01-22 : Igor Pavlov : Public domain */ -#ifndef __7Z_CRC_H -#define __7Z_CRC_H +#ifndef ZIP7_INC_7Z_CRC_H +#define ZIP7_INC_7Z_CRC_H #include "7zTypes.h" @@ -11,14 +11,17 @@ extern UInt32 g_CrcTable[]; /* Call CrcGenerateTable one time before other CRC functions */ -void MY_FAST_CALL CrcGenerateTable(void); +void Z7_FASTCALL CrcGenerateTable(void); #define CRC_INIT_VAL 0xFFFFFFFF #define CRC_GET_DIGEST(crc) ((crc) ^ CRC_INIT_VAL) #define CRC_UPDATE_BYTE(crc, b) (g_CrcTable[((crc) ^ (b)) & 0xFF] ^ ((crc) >> 8)) -UInt32 MY_FAST_CALL CrcUpdate(UInt32 crc, const void *data, size_t size); -UInt32 MY_FAST_CALL CrcCalc(const void *data, size_t size); +UInt32 Z7_FASTCALL CrcUpdate(UInt32 crc, const void *data, size_t size); +UInt32 Z7_FASTCALL CrcCalc(const void *data, size_t size); + +typedef UInt32 (Z7_FASTCALL *Z7_CRC_UPDATE_FUNC)(UInt32 v, const void *data, size_t size); +Z7_CRC_UPDATE_FUNC z7_GetFunc_CrcUpdate(unsigned algo); EXTERN_C_END
diff --git a/third_party/lzma_sdk/C/7zCrcOpt.c b/third_party/lzma_sdk/C/7zCrcOpt.c index 69fad9ca..9408017 100644 --- a/third_party/lzma_sdk/C/7zCrcOpt.c +++ b/third_party/lzma_sdk/C/7zCrcOpt.c
@@ -1,117 +1,199 @@ -/* 7zCrcOpt.c -- CRC32 calculation -2021-02-09 : Igor Pavlov : Public domain */ +/* 7zCrcOpt.c -- CRC32 calculation (optimized functions) +2023-12-07 : Igor Pavlov : Public domain */ #include "Precomp.h" #include "CpuArch.h" +#if !defined(Z7_CRC_NUM_TABLES) || Z7_CRC_NUM_TABLES > 1 + +// for debug only : define Z7_CRC_DEBUG_BE to test big-endian code in little-endian cpu +// #define Z7_CRC_DEBUG_BE +#ifdef Z7_CRC_DEBUG_BE +#undef MY_CPU_LE +#define MY_CPU_BE +#endif + +// the value Z7_CRC_NUM_TABLES_USE must be defined to same value as in 7zCrc.c +#ifdef Z7_CRC_NUM_TABLES +#define Z7_CRC_NUM_TABLES_USE Z7_CRC_NUM_TABLES +#else +#define Z7_CRC_NUM_TABLES_USE 12 +#endif + +#if Z7_CRC_NUM_TABLES_USE % 4 || \ + Z7_CRC_NUM_TABLES_USE < 4 * 1 || \ + Z7_CRC_NUM_TABLES_USE > 4 * 6 + #error Stop_Compiling_Bad_Z7_CRC_NUM_TABLES +#endif + + #ifndef MY_CPU_BE -#define CRC_UPDATE_BYTE_2(crc, b) (table[((crc) ^ (b)) & 0xFF] ^ ((crc) >> 8)) +#define CRC_UPDATE_BYTE_2(crc, b) (table[((crc) ^ (b)) & 0xFF] ^ ((crc) >> 8)) -UInt32 MY_FAST_CALL CrcUpdateT4(UInt32 v, const void *data, size_t size, const UInt32 *table); -UInt32 MY_FAST_CALL CrcUpdateT4(UInt32 v, const void *data, size_t size, const UInt32 *table) +#define Q(n, d) \ + ( (table + ((n) * 4 + 3) * 0x100)[(Byte)(d)] \ + ^ (table + ((n) * 4 + 2) * 0x100)[((d) >> 1 * 8) & 0xFF] \ + ^ (table + ((n) * 4 + 1) * 0x100)[((d) >> 2 * 8) & 0xFF] \ + ^ (table + ((n) * 4 + 0) * 0x100)[((d) >> 3 * 8)] ) + +#define R(a) *((const UInt32 *)(const void *)p + (a)) + +#define CRC_FUNC_PRE_LE2(step) \ +UInt32 Z7_FASTCALL CrcUpdateT ## step (UInt32 v, const void *data, size_t size, const UInt32 *table) + +#define CRC_FUNC_PRE_LE(step) \ + CRC_FUNC_PRE_LE2(step); \ + CRC_FUNC_PRE_LE2(step) + +CRC_FUNC_PRE_LE(Z7_CRC_NUM_TABLES_USE) { const Byte *p = (const Byte *)data; - for (; size > 0 && ((unsigned)(ptrdiff_t)p & 3) != 0; size--, p++) + const Byte *lim; + for (; size && ((unsigned)(ptrdiff_t)p & (7 - (Z7_CRC_NUM_TABLES_USE & 4))) != 0; size--, p++) v = CRC_UPDATE_BYTE_2(v, *p); - for (; size >= 4; size -= 4, p += 4) + lim = p + size; + if (size >= Z7_CRC_NUM_TABLES_USE) { - v ^= *(const UInt32 *)(const void *)p; - v = - (table + 0x300)[((v ) & 0xFF)] - ^ (table + 0x200)[((v >> 8) & 0xFF)] - ^ (table + 0x100)[((v >> 16) & 0xFF)] - ^ (table + 0x000)[((v >> 24))]; + lim -= Z7_CRC_NUM_TABLES_USE; + do + { + v ^= R(0); + { +#if Z7_CRC_NUM_TABLES_USE == 1 * 4 + v = Q(0, v); +#else +#define U2(r, op) \ + { d = R(r); x op Q(Z7_CRC_NUM_TABLES_USE / 4 - 1 - (r), d); } + UInt32 d, x; + U2(1, =) +#if Z7_CRC_NUM_TABLES_USE >= 3 * 4 +#define U(r) U2(r, ^=) + U(2) +#if Z7_CRC_NUM_TABLES_USE >= 4 * 4 + U(3) +#if Z7_CRC_NUM_TABLES_USE >= 5 * 4 + U(4) +#if Z7_CRC_NUM_TABLES_USE >= 6 * 4 + U(5) +#if Z7_CRC_NUM_TABLES_USE >= 7 * 4 +#error Stop_Compiling_Bad_Z7_CRC_NUM_TABLES +#endif +#endif +#endif +#endif +#endif +#undef U +#undef U2 + v = x ^ Q(Z7_CRC_NUM_TABLES_USE / 4 - 1, v); +#endif + } + p += Z7_CRC_NUM_TABLES_USE; + } + while (p <= lim); + lim += Z7_CRC_NUM_TABLES_USE; } - for (; size > 0; size--, p++) + for (; p < lim; p++) v = CRC_UPDATE_BYTE_2(v, *p); return v; } -UInt32 MY_FAST_CALL CrcUpdateT8(UInt32 v, const void *data, size_t size, const UInt32 *table); -UInt32 MY_FAST_CALL CrcUpdateT8(UInt32 v, const void *data, size_t size, const UInt32 *table) -{ - const Byte *p = (const Byte *)data; - for (; size > 0 && ((unsigned)(ptrdiff_t)p & 7) != 0; size--, p++) - v = CRC_UPDATE_BYTE_2(v, *p); - for (; size >= 8; size -= 8, p += 8) - { - UInt32 d; - v ^= *(const UInt32 *)(const void *)p; - v = - (table + 0x700)[((v ) & 0xFF)] - ^ (table + 0x600)[((v >> 8) & 0xFF)] - ^ (table + 0x500)[((v >> 16) & 0xFF)] - ^ (table + 0x400)[((v >> 24))]; - d = *((const UInt32 *)(const void *)p + 1); - v ^= - (table + 0x300)[((d ) & 0xFF)] - ^ (table + 0x200)[((d >> 8) & 0xFF)] - ^ (table + 0x100)[((d >> 16) & 0xFF)] - ^ (table + 0x000)[((d >> 24))]; - } - for (; size > 0; size--, p++) - v = CRC_UPDATE_BYTE_2(v, *p); - return v; -} +#undef CRC_UPDATE_BYTE_2 +#undef R +#undef Q +#undef CRC_FUNC_PRE_LE +#undef CRC_FUNC_PRE_LE2 #endif + + #ifndef MY_CPU_LE -#define CRC_UINT32_SWAP(v) ((v >> 24) | ((v >> 8) & 0xFF00) | ((v << 8) & 0xFF0000) | (v << 24)) +#define CRC_UPDATE_BYTE_2_BE(crc, b) (table[((crc) >> 24) ^ (b)] ^ ((crc) << 8)) -#define CRC_UPDATE_BYTE_2_BE(crc, b) (table[(((crc) >> 24) ^ (b))] ^ ((crc) << 8)) +#define Q(n, d) \ + ( (table + ((n) * 4 + 0) * 0x100)[((d)) & 0xFF] \ + ^ (table + ((n) * 4 + 1) * 0x100)[((d) >> 1 * 8) & 0xFF] \ + ^ (table + ((n) * 4 + 2) * 0x100)[((d) >> 2 * 8) & 0xFF] \ + ^ (table + ((n) * 4 + 3) * 0x100)[((d) >> 3 * 8)] ) -UInt32 MY_FAST_CALL CrcUpdateT1_BeT4(UInt32 v, const void *data, size_t size, const UInt32 *table) +#ifdef Z7_CRC_DEBUG_BE + #define R(a) GetBe32a((const UInt32 *)(const void *)p + (a)) +#else + #define R(a) *((const UInt32 *)(const void *)p + (a)) +#endif + + +#define CRC_FUNC_PRE_BE2(step) \ +UInt32 Z7_FASTCALL CrcUpdateT1_BeT ## step (UInt32 v, const void *data, size_t size, const UInt32 *table) + +#define CRC_FUNC_PRE_BE(step) \ + CRC_FUNC_PRE_BE2(step); \ + CRC_FUNC_PRE_BE2(step) + +CRC_FUNC_PRE_BE(Z7_CRC_NUM_TABLES_USE) { const Byte *p = (const Byte *)data; + const Byte *lim; table += 0x100; - v = CRC_UINT32_SWAP(v); - for (; size > 0 && ((unsigned)(ptrdiff_t)p & 3) != 0; size--, p++) + v = Z7_BSWAP32(v); + for (; size && ((unsigned)(ptrdiff_t)p & (7 - (Z7_CRC_NUM_TABLES_USE & 4))) != 0; size--, p++) v = CRC_UPDATE_BYTE_2_BE(v, *p); - for (; size >= 4; size -= 4, p += 4) + lim = p + size; + if (size >= Z7_CRC_NUM_TABLES_USE) { - v ^= *(const UInt32 *)(const void *)p; - v = - (table + 0x000)[((v ) & 0xFF)] - ^ (table + 0x100)[((v >> 8) & 0xFF)] - ^ (table + 0x200)[((v >> 16) & 0xFF)] - ^ (table + 0x300)[((v >> 24))]; + lim -= Z7_CRC_NUM_TABLES_USE; + do + { + v ^= R(0); + { +#if Z7_CRC_NUM_TABLES_USE == 1 * 4 + v = Q(0, v); +#else +#define U2(r, op) \ + { d = R(r); x op Q(Z7_CRC_NUM_TABLES_USE / 4 - 1 - (r), d); } + UInt32 d, x; + U2(1, =) +#if Z7_CRC_NUM_TABLES_USE >= 3 * 4 +#define U(r) U2(r, ^=) + U(2) +#if Z7_CRC_NUM_TABLES_USE >= 4 * 4 + U(3) +#if Z7_CRC_NUM_TABLES_USE >= 5 * 4 + U(4) +#if Z7_CRC_NUM_TABLES_USE >= 6 * 4 + U(5) +#if Z7_CRC_NUM_TABLES_USE >= 7 * 4 +#error Stop_Compiling_Bad_Z7_CRC_NUM_TABLES +#endif +#endif +#endif +#endif +#endif +#undef U +#undef U2 + v = x ^ Q(Z7_CRC_NUM_TABLES_USE / 4 - 1, v); +#endif + } + p += Z7_CRC_NUM_TABLES_USE; + } + while (p <= lim); + lim += Z7_CRC_NUM_TABLES_USE; } - for (; size > 0; size--, p++) + for (; p < lim; p++) v = CRC_UPDATE_BYTE_2_BE(v, *p); - return CRC_UINT32_SWAP(v); + return Z7_BSWAP32(v); } -UInt32 MY_FAST_CALL CrcUpdateT1_BeT8(UInt32 v, const void *data, size_t size, const UInt32 *table) -{ - const Byte *p = (const Byte *)data; - table += 0x100; - v = CRC_UINT32_SWAP(v); - for (; size > 0 && ((unsigned)(ptrdiff_t)p & 7) != 0; size--, p++) - v = CRC_UPDATE_BYTE_2_BE(v, *p); - for (; size >= 8; size -= 8, p += 8) - { - UInt32 d; - v ^= *(const UInt32 *)(const void *)p; - v = - (table + 0x400)[((v ) & 0xFF)] - ^ (table + 0x500)[((v >> 8) & 0xFF)] - ^ (table + 0x600)[((v >> 16) & 0xFF)] - ^ (table + 0x700)[((v >> 24))]; - d = *((const UInt32 *)(const void *)p + 1); - v ^= - (table + 0x000)[((d ) & 0xFF)] - ^ (table + 0x100)[((d >> 8) & 0xFF)] - ^ (table + 0x200)[((d >> 16) & 0xFF)] - ^ (table + 0x300)[((d >> 24))]; - } - for (; size > 0; size--, p++) - v = CRC_UPDATE_BYTE_2_BE(v, *p); - return CRC_UINT32_SWAP(v); -} +#undef CRC_UPDATE_BYTE_2_BE +#undef R +#undef Q +#undef CRC_FUNC_PRE_BE +#undef CRC_FUNC_PRE_BE2 #endif +#undef Z7_CRC_NUM_TABLES_USE +#endif
diff --git a/third_party/lzma_sdk/C/7zDec.c b/third_party/lzma_sdk/C/7zDec.c index fbfd016..520cbfd 100644 --- a/third_party/lzma_sdk/C/7zDec.c +++ b/third_party/lzma_sdk/C/7zDec.c
@@ -1,11 +1,11 @@ /* 7zDec.c -- Decoding from 7z folder -2021-02-09 : Igor Pavlov : Public domain */ +: Igor Pavlov : Public domain */ #include "Precomp.h" #include <string.h> -/* #define _7ZIP_PPMD_SUPPPORT */ +/* #define Z7_PPMD_SUPPORT */ #include "7z.h" #include "7zCrc.h" @@ -16,27 +16,50 @@ #include "Delta.h" #include "LzmaDec.h" #include "Lzma2Dec.h" -#ifdef _7ZIP_PPMD_SUPPPORT +#ifdef Z7_PPMD_SUPPORT #include "Ppmd7.h" #endif #define k_Copy 0 -#ifndef _7Z_NO_METHOD_LZMA2 +#ifndef Z7_NO_METHOD_LZMA2 #define k_LZMA2 0x21 #endif #define k_LZMA 0x30101 #define k_BCJ2 0x303011B -#ifndef _7Z_NO_METHODS_FILTERS + +#if !defined(Z7_NO_METHODS_FILTERS) +#define Z7_USE_BRANCH_FILTER +#endif + +#if !defined(Z7_NO_METHODS_FILTERS) || \ + defined(Z7_USE_NATIVE_BRANCH_FILTER) && defined(MY_CPU_ARM64) +#define Z7_USE_FILTER_ARM64 +#ifndef Z7_USE_BRANCH_FILTER +#define Z7_USE_BRANCH_FILTER +#endif +#define k_ARM64 0xa +#endif + +#if !defined(Z7_NO_METHODS_FILTERS) || \ + defined(Z7_USE_NATIVE_BRANCH_FILTER) && defined(MY_CPU_ARMT) +#define Z7_USE_FILTER_ARMT +#ifndef Z7_USE_BRANCH_FILTER +#define Z7_USE_BRANCH_FILTER +#endif +#define k_ARMT 0x3030701 +#endif + +#ifndef Z7_NO_METHODS_FILTERS #define k_Delta 3 +#define k_RISCV 0xb #define k_BCJ 0x3030103 #define k_PPC 0x3030205 #define k_IA64 0x3030401 #define k_ARM 0x3030501 -#define k_ARMT 0x3030701 #define k_SPARC 0x3030805 #endif -#ifdef _7ZIP_PPMD_SUPPPORT +#ifdef Z7_PPMD_SUPPORT #define k_PPMD 0x30401 @@ -49,12 +72,12 @@ UInt64 processed; BoolInt extra; SRes res; - const ILookInStream *inStream; + ILookInStreamPtr inStream; } CByteInToLook; -static Byte ReadByte(const IByteIn *pp) +static Byte ReadByte(IByteInPtr pp) { - CByteInToLook *p = CONTAINER_FROM_VTBL(pp, CByteInToLook, vt); + Z7_CONTAINER_FROM_VTBL_TO_DECL_VAR_pp_vt_p(CByteInToLook) if (p->cur != p->end) return *p->cur++; if (p->res == SZ_OK) @@ -67,13 +90,13 @@ p->cur = p->begin; p->end = p->begin + size; if (size != 0) - return *p->cur++;; + return *p->cur++; } p->extra = True; return 0; } -static SRes SzDecodePpmd(const Byte *props, unsigned propsSize, UInt64 inSize, const ILookInStream *inStream, +static SRes SzDecodePpmd(const Byte *props, unsigned propsSize, UInt64 inSize, ILookInStreamPtr inStream, Byte *outBuffer, SizeT outSize, ISzAllocPtr allocMain) { CPpmd7 ppmd; @@ -138,14 +161,14 @@ #endif -static SRes SzDecodeLzma(const Byte *props, unsigned propsSize, UInt64 inSize, ILookInStream *inStream, +static SRes SzDecodeLzma(const Byte *props, unsigned propsSize, UInt64 inSize, ILookInStreamPtr inStream, Byte *outBuffer, SizeT outSize, ISzAllocPtr allocMain) { CLzmaDec state; SRes res = SZ_OK; - LzmaDec_Construct(&state); - RINOK(LzmaDec_AllocateProbs(&state, props, propsSize, allocMain)); + LzmaDec_CONSTRUCT(&state) + RINOK(LzmaDec_AllocateProbs(&state, props, propsSize, allocMain)) state.dic = outBuffer; state.dicBufSize = outSize; LzmaDec_Init(&state); @@ -196,18 +219,18 @@ } -#ifndef _7Z_NO_METHOD_LZMA2 +#ifndef Z7_NO_METHOD_LZMA2 -static SRes SzDecodeLzma2(const Byte *props, unsigned propsSize, UInt64 inSize, ILookInStream *inStream, +static SRes SzDecodeLzma2(const Byte *props, unsigned propsSize, UInt64 inSize, ILookInStreamPtr inStream, Byte *outBuffer, SizeT outSize, ISzAllocPtr allocMain) { CLzma2Dec state; SRes res = SZ_OK; - Lzma2Dec_Construct(&state); + Lzma2Dec_CONSTRUCT(&state) if (propsSize != 1) return SZ_ERROR_DATA; - RINOK(Lzma2Dec_AllocateProbs(&state, props[0], allocMain)); + RINOK(Lzma2Dec_AllocateProbs(&state, props[0], allocMain)) state.decoder.dic = outBuffer; state.decoder.dicBufSize = outSize; Lzma2Dec_Init(&state); @@ -257,7 +280,7 @@ #endif -static SRes SzDecodeCopy(UInt64 inSize, ILookInStream *inStream, Byte *outBuffer) +static SRes SzDecodeCopy(UInt64 inSize, ILookInStreamPtr inStream, Byte *outBuffer) { while (inSize > 0) { @@ -265,13 +288,13 @@ size_t curSize = (1 << 18); if (curSize > inSize) curSize = (size_t)inSize; - RINOK(ILookInStream_Look(inStream, &inBuf, &curSize)); + RINOK(ILookInStream_Look(inStream, &inBuf, &curSize)) if (curSize == 0) return SZ_ERROR_INPUT_EOF; memcpy(outBuffer, inBuf, curSize); outBuffer += curSize; inSize -= curSize; - RINOK(ILookInStream_Skip(inStream, curSize)); + RINOK(ILookInStream_Skip(inStream, curSize)) } return SZ_OK; } @@ -282,15 +305,16 @@ { case k_Copy: case k_LZMA: - #ifndef _7Z_NO_METHOD_LZMA2 + #ifndef Z7_NO_METHOD_LZMA2 case k_LZMA2: - #endif - #ifdef _7ZIP_PPMD_SUPPPORT + #endif + #ifdef Z7_PPMD_SUPPORT case k_PPMD: - #endif + #endif return True; + default: + return False; } - return False; } static BoolInt IS_SUPPORTED_CODER(const CSzCoderInfo *c) @@ -317,7 +341,7 @@ } - #ifndef _7Z_NO_METHODS_FILTERS + #if defined(Z7_USE_BRANCH_FILTER) if (f->NumCoders == 2) { @@ -333,13 +357,21 @@ return SZ_ERROR_UNSUPPORTED; switch ((UInt32)c->MethodID) { + #if !defined(Z7_NO_METHODS_FILTERS) case k_Delta: case k_BCJ: case k_PPC: case k_IA64: case k_SPARC: case k_ARM: + case k_RISCV: + #endif + #ifdef Z7_USE_FILTER_ARM64 + case k_ARM64: + #endif + #ifdef Z7_USE_FILTER_ARMT case k_ARMT: + #endif break; default: return SZ_ERROR_UNSUPPORTED; @@ -372,15 +404,16 @@ return SZ_ERROR_UNSUPPORTED; } -#ifndef _7Z_NO_METHODS_FILTERS -#define CASE_BRA_CONV(isa) case k_ ## isa: isa ## _Convert(outBuffer, outSize, 0, 0); break; -#endif + + + + static SRes SzFolder_Decode2(const CSzFolder *folder, const Byte *propsData, const UInt64 *unpackSizes, const UInt64 *packPositions, - ILookInStream *inStream, UInt64 startPos, + ILookInStreamPtr inStream, UInt64 startPos, Byte *outBuffer, SizeT outSize, ISzAllocPtr allocMain, Byte *tempBuf[]) { @@ -389,7 +422,7 @@ SizeT tempSize3 = 0; Byte *tempBuf3 = 0; - RINOK(CheckSupportedFolder(folder)); + RINOK(CheckSupportedFolder(folder)) for (ci = 0; ci < folder->NumCoders; ci++) { @@ -404,8 +437,8 @@ SizeT outSizeCur = outSize; if (folder->NumCoders == 4) { - UInt32 indices[] = { 3, 2, 0 }; - UInt64 unpackSize = unpackSizes[ci]; + const UInt32 indices[] = { 3, 2, 0 }; + const UInt64 unpackSize = unpackSizes[ci]; si = indices[ci]; if (ci < 2) { @@ -431,37 +464,37 @@ } offset = packPositions[si]; inSize = packPositions[(size_t)si + 1] - offset; - RINOK(LookInStream_SeekTo(inStream, startPos + offset)); + RINOK(LookInStream_SeekTo(inStream, startPos + offset)) if (coder->MethodID == k_Copy) { if (inSize != outSizeCur) /* check it */ return SZ_ERROR_DATA; - RINOK(SzDecodeCopy(inSize, inStream, outBufCur)); + RINOK(SzDecodeCopy(inSize, inStream, outBufCur)) } else if (coder->MethodID == k_LZMA) { - RINOK(SzDecodeLzma(propsData + coder->PropsOffset, coder->PropsSize, inSize, inStream, outBufCur, outSizeCur, allocMain)); + RINOK(SzDecodeLzma(propsData + coder->PropsOffset, coder->PropsSize, inSize, inStream, outBufCur, outSizeCur, allocMain)) } - #ifndef _7Z_NO_METHOD_LZMA2 + #ifndef Z7_NO_METHOD_LZMA2 else if (coder->MethodID == k_LZMA2) { - RINOK(SzDecodeLzma2(propsData + coder->PropsOffset, coder->PropsSize, inSize, inStream, outBufCur, outSizeCur, allocMain)); + RINOK(SzDecodeLzma2(propsData + coder->PropsOffset, coder->PropsSize, inSize, inStream, outBufCur, outSizeCur, allocMain)) } - #endif - #ifdef _7ZIP_PPMD_SUPPPORT + #endif + #ifdef Z7_PPMD_SUPPORT else if (coder->MethodID == k_PPMD) { - RINOK(SzDecodePpmd(propsData + coder->PropsOffset, coder->PropsSize, inSize, inStream, outBufCur, outSizeCur, allocMain)); + RINOK(SzDecodePpmd(propsData + coder->PropsOffset, coder->PropsSize, inSize, inStream, outBufCur, outSizeCur, allocMain)) } - #endif + #endif else return SZ_ERROR_UNSUPPORTED; } else if (coder->MethodID == k_BCJ2) { - UInt64 offset = packPositions[1]; - UInt64 s3Size = packPositions[2] - offset; + const UInt64 offset = packPositions[1]; + const UInt64 s3Size = packPositions[2] - offset; if (ci != 3) return SZ_ERROR_UNSUPPORTED; @@ -473,8 +506,8 @@ if (!tempBuf[2] && tempSizes[2] != 0) return SZ_ERROR_MEM; - RINOK(LookInStream_SeekTo(inStream, startPos + offset)); - RINOK(SzDecodeCopy(s3Size, inStream, tempBuf[2])); + RINOK(LookInStream_SeekTo(inStream, startPos + offset)) + RINOK(SzDecodeCopy(s3Size, inStream, tempBuf[2])) if ((tempSizes[0] & 3) != 0 || (tempSizes[1] & 3) != 0 || @@ -493,26 +526,22 @@ p.destLim = outBuffer + outSize; Bcj2Dec_Init(&p); - RINOK(Bcj2Dec_Decode(&p)); + RINOK(Bcj2Dec_Decode(&p)) { unsigned i; for (i = 0; i < 4; i++) if (p.bufs[i] != p.lims[i]) return SZ_ERROR_DATA; - - if (!Bcj2Dec_IsFinished(&p)) - return SZ_ERROR_DATA; - - if (p.dest != p.destLim - || p.state != BCJ2_STREAM_MAIN) + if (p.dest != p.destLim || !Bcj2Dec_IsMaybeFinished(&p)) return SZ_ERROR_DATA; } } } - #ifndef _7Z_NO_METHODS_FILTERS +#if defined(Z7_USE_BRANCH_FILTER) else if (ci == 1) { +#if !defined(Z7_NO_METHODS_FILTERS) if (coder->MethodID == k_Delta) { if (coder->PropsSize != 1) @@ -522,31 +551,75 @@ Delta_Init(state); Delta_Decode(state, (unsigned)(propsData[coder->PropsOffset]) + 1, outBuffer, outSize); } + continue; } - else +#endif + +#ifdef Z7_USE_FILTER_ARM64 + if (coder->MethodID == k_ARM64) + { + UInt32 pc = 0; + if (coder->PropsSize == 4) + { + pc = GetUi32(propsData + coder->PropsOffset); + if (pc & 3) + return SZ_ERROR_UNSUPPORTED; + } + else if (coder->PropsSize != 0) + return SZ_ERROR_UNSUPPORTED; + z7_BranchConv_ARM64_Dec(outBuffer, outSize, pc); + continue; + } +#endif + +#if !defined(Z7_NO_METHODS_FILTERS) + if (coder->MethodID == k_RISCV) + { + UInt32 pc = 0; + if (coder->PropsSize == 4) + { + pc = GetUi32(propsData + coder->PropsOffset); + if (pc & 1) + return SZ_ERROR_UNSUPPORTED; + } + else if (coder->PropsSize != 0) + return SZ_ERROR_UNSUPPORTED; + z7_BranchConv_RISCV_Dec(outBuffer, outSize, pc); + continue; + } +#endif + +#if !defined(Z7_NO_METHODS_FILTERS) || defined(Z7_USE_FILTER_ARMT) { if (coder->PropsSize != 0) return SZ_ERROR_UNSUPPORTED; + #define CASE_BRA_CONV(isa) case k_ ## isa: Z7_BRANCH_CONV_DEC(isa)(outBuffer, outSize, 0); break; // pc = 0; switch (coder->MethodID) { + #if !defined(Z7_NO_METHODS_FILTERS) case k_BCJ: { - UInt32 state; - x86_Convert_Init(state); - x86_Convert(outBuffer, outSize, 0, &state, 0); + UInt32 state = Z7_BRANCH_CONV_ST_X86_STATE_INIT_VAL; + z7_BranchConvSt_X86_Dec(outBuffer, outSize, 0, &state); // pc = 0 break; } - CASE_BRA_CONV(PPC) + case k_PPC: Z7_BRANCH_CONV_DEC_2(BranchConv_PPC)(outBuffer, outSize, 0); break; // pc = 0; + // CASE_BRA_CONV(PPC) CASE_BRA_CONV(IA64) CASE_BRA_CONV(SPARC) CASE_BRA_CONV(ARM) + #endif + #if !defined(Z7_NO_METHODS_FILTERS) || defined(Z7_USE_FILTER_ARMT) CASE_BRA_CONV(ARMT) + #endif default: return SZ_ERROR_UNSUPPORTED; } + continue; } - } - #endif +#endif + } // (c == 1) +#endif // Z7_USE_BRANCH_FILTER else return SZ_ERROR_UNSUPPORTED; } @@ -556,7 +629,7 @@ SRes SzAr_DecodeFolder(const CSzAr *p, UInt32 folderIndex, - ILookInStream *inStream, UInt64 startPos, + ILookInStreamPtr inStream, UInt64 startPos, Byte *outBuffer, size_t outSize, ISzAllocPtr allocMain) {
diff --git a/third_party/lzma_sdk/C/7zFile.c b/third_party/lzma_sdk/C/7zFile.c index 13d2efa4..ba5daa13 100644 --- a/third_party/lzma_sdk/C/7zFile.c +++ b/third_party/lzma_sdk/C/7zFile.c
@@ -1,5 +1,5 @@ /* 7zFile.c -- File IO -2021-04-29 : Igor Pavlov : Public domain */ +2023-04-02 : Igor Pavlov : Public domain */ #include "Precomp.h" @@ -268,7 +268,7 @@ return errno; if (processed == 0) break; - data = (void *)((Byte *)data + (size_t)processed); + data = (const void *)((const Byte *)data + (size_t)processed); originalSize -= (size_t)processed; *size += (size_t)processed; } @@ -287,7 +287,8 @@ DWORD moveMethod; UInt32 low = (UInt32)*pos; LONG high = (LONG)((UInt64)*pos >> 16 >> 16); /* for case when UInt64 is 32-bit only */ - switch (origin) + // (int) to eliminate clang warning + switch ((int)origin) { case SZ_SEEK_SET: moveMethod = FILE_BEGIN; break; case SZ_SEEK_CUR: moveMethod = FILE_CURRENT; break; @@ -308,7 +309,7 @@ int moveMethod; // = origin; - switch (origin) + switch ((int)origin) { case SZ_SEEK_SET: moveMethod = SEEK_SET; break; case SZ_SEEK_CUR: moveMethod = SEEK_CUR; break; @@ -387,10 +388,10 @@ /* ---------- FileSeqInStream ---------- */ -static SRes FileSeqInStream_Read(const ISeqInStream *pp, void *buf, size_t *size) +static SRes FileSeqInStream_Read(ISeqInStreamPtr pp, void *buf, size_t *size) { - CFileSeqInStream *p = CONTAINER_FROM_VTBL(pp, CFileSeqInStream, vt); - WRes wres = File_Read(&p->file, buf, size); + Z7_CONTAINER_FROM_VTBL_TO_DECL_VAR_pp_vt_p(CFileSeqInStream) + const WRes wres = File_Read(&p->file, buf, size); p->wres = wres; return (wres == 0) ? SZ_OK : SZ_ERROR_READ; } @@ -403,18 +404,18 @@ /* ---------- FileInStream ---------- */ -static SRes FileInStream_Read(const ISeekInStream *pp, void *buf, size_t *size) +static SRes FileInStream_Read(ISeekInStreamPtr pp, void *buf, size_t *size) { - CFileInStream *p = CONTAINER_FROM_VTBL(pp, CFileInStream, vt); - WRes wres = File_Read(&p->file, buf, size); + Z7_CONTAINER_FROM_VTBL_TO_DECL_VAR_pp_vt_p(CFileInStream) + const WRes wres = File_Read(&p->file, buf, size); p->wres = wres; return (wres == 0) ? SZ_OK : SZ_ERROR_READ; } -static SRes FileInStream_Seek(const ISeekInStream *pp, Int64 *pos, ESzSeek origin) +static SRes FileInStream_Seek(ISeekInStreamPtr pp, Int64 *pos, ESzSeek origin) { - CFileInStream *p = CONTAINER_FROM_VTBL(pp, CFileInStream, vt); - WRes wres = File_Seek(&p->file, pos, origin); + Z7_CONTAINER_FROM_VTBL_TO_DECL_VAR_pp_vt_p(CFileInStream) + const WRes wres = File_Seek(&p->file, pos, origin); p->wres = wres; return (wres == 0) ? SZ_OK : SZ_ERROR_READ; } @@ -428,10 +429,10 @@ /* ---------- FileOutStream ---------- */ -static size_t FileOutStream_Write(const ISeqOutStream *pp, const void *data, size_t size) +static size_t FileOutStream_Write(ISeqOutStreamPtr pp, const void *data, size_t size) { - CFileOutStream *p = CONTAINER_FROM_VTBL(pp, CFileOutStream, vt); - WRes wres = File_Write(&p->file, data, &size); + Z7_CONTAINER_FROM_VTBL_TO_DECL_VAR_pp_vt_p(CFileOutStream) + const WRes wres = File_Write(&p->file, data, &size); p->wres = wres; return size; }
diff --git a/third_party/lzma_sdk/C/7zFile.h b/third_party/lzma_sdk/C/7zFile.h index 788abb6..f5069cd 100644 --- a/third_party/lzma_sdk/C/7zFile.h +++ b/third_party/lzma_sdk/C/7zFile.h
@@ -1,8 +1,8 @@ /* 7zFile.h -- File IO -2021-02-15 : Igor Pavlov : Public domain */ +2023-03-05 : Igor Pavlov : Public domain */ -#ifndef __7Z_FILE_H -#define __7Z_FILE_H +#ifndef ZIP7_INC_FILE_H +#define ZIP7_INC_FILE_H #ifdef _WIN32 #define USE_WINDOWS_FILE @@ -10,7 +10,8 @@ #endif #ifdef USE_WINDOWS_FILE -#include <windows.h> +#include "7zWindows.h" + #else // note: USE_FOPEN mode is limited to 32-bit file size // #define USE_FOPEN
diff --git a/third_party/lzma_sdk/C/7zStream.c b/third_party/lzma_sdk/C/7zStream.c index 28a1460..74e75b6 100644 --- a/third_party/lzma_sdk/C/7zStream.c +++ b/third_party/lzma_sdk/C/7zStream.c
@@ -1,5 +1,5 @@ /* 7zStream.c -- 7z Stream functions -2021-02-09 : Igor Pavlov : Public domain */ +2023-04-02 : Igor Pavlov : Public domain */ #include "Precomp.h" @@ -7,12 +7,33 @@ #include "7zTypes.h" -SRes SeqInStream_Read2(const ISeqInStream *stream, void *buf, size_t size, SRes errorType) + +SRes SeqInStream_ReadMax(ISeqInStreamPtr stream, void *buf, size_t *processedSize) +{ + size_t size = *processedSize; + *processedSize = 0; + while (size != 0) + { + size_t cur = size; + const SRes res = ISeqInStream_Read(stream, buf, &cur); + *processedSize += cur; + buf = (void *)((Byte *)buf + cur); + size -= cur; + if (res != SZ_OK) + return res; + if (cur == 0) + return SZ_OK; + } + return SZ_OK; +} + +/* +SRes SeqInStream_Read2(ISeqInStreamPtr stream, void *buf, size_t size, SRes errorType) { while (size != 0) { size_t processed = size; - RINOK(ISeqInStream_Read(stream, buf, &processed)); + RINOK(ISeqInStream_Read(stream, buf, &processed)) if (processed == 0) return errorType; buf = (void *)((Byte *)buf + processed); @@ -21,42 +42,44 @@ return SZ_OK; } -SRes SeqInStream_Read(const ISeqInStream *stream, void *buf, size_t size) +SRes SeqInStream_Read(ISeqInStreamPtr stream, void *buf, size_t size) { return SeqInStream_Read2(stream, buf, size, SZ_ERROR_INPUT_EOF); } +*/ -SRes SeqInStream_ReadByte(const ISeqInStream *stream, Byte *buf) + +SRes SeqInStream_ReadByte(ISeqInStreamPtr stream, Byte *buf) { size_t processed = 1; - RINOK(ISeqInStream_Read(stream, buf, &processed)); + RINOK(ISeqInStream_Read(stream, buf, &processed)) return (processed == 1) ? SZ_OK : SZ_ERROR_INPUT_EOF; } -SRes LookInStream_SeekTo(const ILookInStream *stream, UInt64 offset) +SRes LookInStream_SeekTo(ILookInStreamPtr stream, UInt64 offset) { Int64 t = (Int64)offset; return ILookInStream_Seek(stream, &t, SZ_SEEK_SET); } -SRes LookInStream_LookRead(const ILookInStream *stream, void *buf, size_t *size) +SRes LookInStream_LookRead(ILookInStreamPtr stream, void *buf, size_t *size) { const void *lookBuf; if (*size == 0) return SZ_OK; - RINOK(ILookInStream_Look(stream, &lookBuf, size)); + RINOK(ILookInStream_Look(stream, &lookBuf, size)) memcpy(buf, lookBuf, *size); return ILookInStream_Skip(stream, *size); } -SRes LookInStream_Read2(const ILookInStream *stream, void *buf, size_t size, SRes errorType) +SRes LookInStream_Read2(ILookInStreamPtr stream, void *buf, size_t size, SRes errorType) { while (size != 0) { size_t processed = size; - RINOK(ILookInStream_Read(stream, buf, &processed)); + RINOK(ILookInStream_Read(stream, buf, &processed)) if (processed == 0) return errorType; buf = (void *)((Byte *)buf + processed); @@ -65,16 +88,16 @@ return SZ_OK; } -SRes LookInStream_Read(const ILookInStream *stream, void *buf, size_t size) +SRes LookInStream_Read(ILookInStreamPtr stream, void *buf, size_t size) { return LookInStream_Read2(stream, buf, size, SZ_ERROR_INPUT_EOF); } -#define GET_LookToRead2 CLookToRead2 *p = CONTAINER_FROM_VTBL(pp, CLookToRead2, vt); +#define GET_LookToRead2 Z7_CONTAINER_FROM_VTBL_TO_DECL_VAR_pp_vt_p(CLookToRead2) -static SRes LookToRead2_Look_Lookahead(const ILookInStream *pp, const void **buf, size_t *size) +static SRes LookToRead2_Look_Lookahead(ILookInStreamPtr pp, const void **buf, size_t *size) { SRes res = SZ_OK; GET_LookToRead2 @@ -93,7 +116,7 @@ return res; } -static SRes LookToRead2_Look_Exact(const ILookInStream *pp, const void **buf, size_t *size) +static SRes LookToRead2_Look_Exact(ILookInStreamPtr pp, const void **buf, size_t *size) { SRes res = SZ_OK; GET_LookToRead2 @@ -113,14 +136,14 @@ return res; } -static SRes LookToRead2_Skip(const ILookInStream *pp, size_t offset) +static SRes LookToRead2_Skip(ILookInStreamPtr pp, size_t offset) { GET_LookToRead2 p->pos += offset; return SZ_OK; } -static SRes LookToRead2_Read(const ILookInStream *pp, void *buf, size_t *size) +static SRes LookToRead2_Read(ILookInStreamPtr pp, void *buf, size_t *size) { GET_LookToRead2 size_t rem = p->size - p->pos; @@ -134,7 +157,7 @@ return SZ_OK; } -static SRes LookToRead2_Seek(const ILookInStream *pp, Int64 *pos, ESzSeek origin) +static SRes LookToRead2_Seek(ILookInStreamPtr pp, Int64 *pos, ESzSeek origin) { GET_LookToRead2 p->pos = p->size = 0; @@ -153,9 +176,9 @@ -static SRes SecToLook_Read(const ISeqInStream *pp, void *buf, size_t *size) +static SRes SecToLook_Read(ISeqInStreamPtr pp, void *buf, size_t *size) { - CSecToLook *p = CONTAINER_FROM_VTBL(pp, CSecToLook, vt); + Z7_CONTAINER_FROM_VTBL_TO_DECL_VAR_pp_vt_p(CSecToLook) return LookInStream_LookRead(p->realStream, buf, size); } @@ -164,9 +187,9 @@ p->vt.Read = SecToLook_Read; } -static SRes SecToRead_Read(const ISeqInStream *pp, void *buf, size_t *size) +static SRes SecToRead_Read(ISeqInStreamPtr pp, void *buf, size_t *size) { - CSecToRead *p = CONTAINER_FROM_VTBL(pp, CSecToRead, vt); + Z7_CONTAINER_FROM_VTBL_TO_DECL_VAR_pp_vt_p(CSecToRead) return ILookInStream_Read(p->realStream, buf, size); }
diff --git a/third_party/lzma_sdk/C/7zTypes.h b/third_party/lzma_sdk/C/7zTypes.h index f7d70718..5b77420a 100644 --- a/third_party/lzma_sdk/C/7zTypes.h +++ b/third_party/lzma_sdk/C/7zTypes.h
@@ -1,8 +1,8 @@ /* 7zTypes.h -- Basic types -2022-04-01 : Igor Pavlov : Public domain */ +2024-01-24 : Igor Pavlov : Public domain */ -#ifndef __7Z_TYPES_H -#define __7Z_TYPES_H +#ifndef ZIP7_7Z_TYPES_H +#define ZIP7_7Z_TYPES_H #ifdef _WIN32 /* #include <windows.h> */ @@ -52,6 +52,11 @@ #define MY_ALIGN(n) #endif #else + /* + // C11/C++11: + #include <stdalign.h> + #define MY_ALIGN(n) alignas(n) + */ #define MY_ALIGN(n) __attribute__ ((aligned(n))) #endif @@ -62,7 +67,7 @@ typedef unsigned WRes; #define MY_SRes_HRESULT_FROM_WRes(x) HRESULT_FROM_WIN32(x) -// #define MY_HRES_ERROR__INTERNAL_ERROR MY_SRes_HRESULT_FROM_WRes(ERROR_INTERNAL_ERROR) +// #define MY_HRES_ERROR_INTERNAL_ERROR MY_SRes_HRESULT_FROM_WRes(ERROR_INTERNAL_ERROR) #else // _WIN32 @@ -70,13 +75,13 @@ typedef int WRes; // (FACILITY_ERRNO = 0x800) is 7zip's FACILITY constant to represent (errno) errors in HRESULT -#define MY__FACILITY_ERRNO 0x800 -#define MY__FACILITY_WIN32 7 -#define MY__FACILITY__WRes MY__FACILITY_ERRNO +#define MY_FACILITY_ERRNO 0x800 +#define MY_FACILITY_WIN32 7 +#define MY_FACILITY_WRes MY_FACILITY_ERRNO #define MY_HRESULT_FROM_errno_CONST_ERROR(x) ((HRESULT)( \ ( (HRESULT)(x) & 0x0000FFFF) \ - | (MY__FACILITY__WRes << 16) \ + | (MY_FACILITY_WRes << 16) \ | (HRESULT)0x80000000 )) #define MY_SRes_HRESULT_FROM_WRes(x) \ @@ -120,17 +125,17 @@ #define ERROR_INVALID_REPARSE_DATA ((HRESULT)0x80071128L) #define ERROR_REPARSE_TAG_INVALID ((HRESULT)0x80071129L) -// if (MY__FACILITY__WRes != FACILITY_WIN32), +// if (MY_FACILITY_WRes != FACILITY_WIN32), // we use FACILITY_WIN32 for COM errors: #define E_OUTOFMEMORY ((HRESULT)0x8007000EL) #define E_INVALIDARG ((HRESULT)0x80070057L) -#define MY__E_ERROR_NEGATIVE_SEEK ((HRESULT)0x80070083L) +#define MY_E_ERROR_NEGATIVE_SEEK ((HRESULT)0x80070083L) /* // we can use FACILITY_ERRNO for some COM errors, that have errno equivalents: #define E_OUTOFMEMORY MY_HRESULT_FROM_errno_CONST_ERROR(ENOMEM) #define E_INVALIDARG MY_HRESULT_FROM_errno_CONST_ERROR(EINVAL) -#define MY__E_ERROR_NEGATIVE_SEEK MY_HRESULT_FROM_errno_CONST_ERROR(EINVAL) +#define MY_E_ERROR_NEGATIVE_SEEK MY_HRESULT_FROM_errno_CONST_ERROR(EINVAL) */ #define TEXT(quote) quote @@ -156,18 +161,18 @@ #ifndef RINOK -#define RINOK(x) { int __result__ = (x); if (__result__ != 0) return __result__; } +#define RINOK(x) { const int _result_ = (x); if (_result_ != 0) return _result_; } #endif #ifndef RINOK_WRes -#define RINOK_WRes(x) { WRes __result__ = (x); if (__result__ != 0) return __result__; } +#define RINOK_WRes(x) { const WRes _result_ = (x); if (_result_ != 0) return _result_; } #endif typedef unsigned char Byte; typedef short Int16; typedef unsigned short UInt16; -#ifdef _LZMA_UINT32_IS_ULONG +#ifdef Z7_DECL_Int32_AS_long typedef long Int32; typedef unsigned long UInt32; #else @@ -206,37 +211,51 @@ #endif // _WIN32 -#define MY_HRES_ERROR__INTERNAL_ERROR ((HRESULT)0x8007054FL) +#define MY_HRES_ERROR_INTERNAL_ERROR ((HRESULT)0x8007054FL) -#ifdef _SZ_NO_INT_64 - -/* define _SZ_NO_INT_64, if your compiler doesn't support 64-bit integers. - NOTES: Some code will work incorrectly in that case! */ +#ifdef Z7_DECL_Int64_AS_long typedef long Int64; typedef unsigned long UInt64; #else -#if defined(_MSC_VER) || defined(__BORLANDC__) +#if (defined(_MSC_VER) || defined(__BORLANDC__)) && !defined(__clang__) typedef __int64 Int64; typedef unsigned __int64 UInt64; -#define UINT64_CONST(n) n +#else +#if defined(__clang__) || defined(__GNUC__) +#include <stdint.h> +typedef int64_t Int64; +typedef uint64_t UInt64; #else typedef long long int Int64; typedef unsigned long long int UInt64; -#define UINT64_CONST(n) n ## ULL +// #define UINT64_CONST(n) n ## ULL +#endif #endif #endif -#ifdef _LZMA_NO_SYSTEM_SIZE_T -typedef UInt32 SizeT; +#define UINT64_CONST(n) n + + +#ifdef Z7_DECL_SizeT_AS_unsigned_int +typedef unsigned int SizeT; #else typedef size_t SizeT; #endif +/* +#if (defined(_MSC_VER) && _MSC_VER <= 1200) +typedef size_t MY_uintptr_t; +#else +#include <stdint.h> +typedef uintptr_t MY_uintptr_t; +#endif +*/ + typedef int BoolInt; /* typedef BoolInt Bool; */ #define True 1 @@ -244,23 +263,23 @@ #ifdef _WIN32 -#define MY_STD_CALL __stdcall +#define Z7_STDCALL __stdcall #else -#define MY_STD_CALL +#define Z7_STDCALL #endif #ifdef _MSC_VER #if _MSC_VER >= 1300 -#define MY_NO_INLINE __declspec(noinline) +#define Z7_NO_INLINE __declspec(noinline) #else -#define MY_NO_INLINE +#define Z7_NO_INLINE #endif -#define MY_FORCE_INLINE __forceinline +#define Z7_FORCE_INLINE __forceinline -#define MY_CDECL __cdecl -#define MY_FAST_CALL __fastcall +#define Z7_CDECL __cdecl +#define Z7_FASTCALL __fastcall #else // _MSC_VER @@ -268,27 +287,25 @@ || (defined(__clang__) && (__clang_major__ >= 4)) \ || defined(__INTEL_COMPILER) \ || defined(__xlC__) -#define MY_NO_INLINE __attribute__((noinline)) -// #define MY_FORCE_INLINE __attribute__((always_inline)) inline +#define Z7_NO_INLINE __attribute__((noinline)) +#define Z7_FORCE_INLINE __attribute__((always_inline)) inline #else -#define MY_NO_INLINE +#define Z7_NO_INLINE +#define Z7_FORCE_INLINE #endif -#define MY_FORCE_INLINE - - -#define MY_CDECL +#define Z7_CDECL #if defined(_M_IX86) \ || defined(__i386__) -// #define MY_FAST_CALL __attribute__((fastcall)) -// #define MY_FAST_CALL __attribute__((cdecl)) -#define MY_FAST_CALL +// #define Z7_FASTCALL __attribute__((fastcall)) +// #define Z7_FASTCALL __attribute__((cdecl)) +#define Z7_FASTCALL #elif defined(MY_CPU_AMD64) -// #define MY_FAST_CALL __attribute__((ms_abi)) -#define MY_FAST_CALL +// #define Z7_FASTCALL __attribute__((ms_abi)) +#define Z7_FASTCALL #else -#define MY_FAST_CALL +#define Z7_FASTCALL #endif #endif // _MSC_VER @@ -296,41 +313,49 @@ /* The following interfaces use first parameter as pointer to structure */ -typedef struct IByteIn IByteIn; -struct IByteIn +// #define Z7_C_IFACE_CONST_QUAL +#define Z7_C_IFACE_CONST_QUAL const + +#define Z7_C_IFACE_DECL(a) \ + struct a ## _; \ + typedef Z7_C_IFACE_CONST_QUAL struct a ## _ * a ## Ptr; \ + typedef struct a ## _ a; \ + struct a ## _ + + +Z7_C_IFACE_DECL (IByteIn) { - Byte (*Read)(const IByteIn *p); /* reads one byte, returns 0 in case of EOF or error */ + Byte (*Read)(IByteInPtr p); /* reads one byte, returns 0 in case of EOF or error */ }; #define IByteIn_Read(p) (p)->Read(p) -typedef struct IByteOut IByteOut; -struct IByteOut +Z7_C_IFACE_DECL (IByteOut) { - void (*Write)(const IByteOut *p, Byte b); + void (*Write)(IByteOutPtr p, Byte b); }; #define IByteOut_Write(p, b) (p)->Write(p, b) -typedef struct ISeqInStream ISeqInStream; -struct ISeqInStream +Z7_C_IFACE_DECL (ISeqInStream) { - SRes (*Read)(const ISeqInStream *p, void *buf, size_t *size); + SRes (*Read)(ISeqInStreamPtr p, void *buf, size_t *size); /* if (input(*size) != 0 && output(*size) == 0) means end_of_stream. (output(*size) < input(*size)) is allowed */ }; #define ISeqInStream_Read(p, buf, size) (p)->Read(p, buf, size) +/* try to read as much as avail in stream and limited by (*processedSize) */ +SRes SeqInStream_ReadMax(ISeqInStreamPtr stream, void *buf, size_t *processedSize); /* it can return SZ_ERROR_INPUT_EOF */ -SRes SeqInStream_Read(const ISeqInStream *stream, void *buf, size_t size); -SRes SeqInStream_Read2(const ISeqInStream *stream, void *buf, size_t size, SRes errorType); -SRes SeqInStream_ReadByte(const ISeqInStream *stream, Byte *buf); +// SRes SeqInStream_Read(ISeqInStreamPtr stream, void *buf, size_t size); +// SRes SeqInStream_Read2(ISeqInStreamPtr stream, void *buf, size_t size, SRes errorType); +SRes SeqInStream_ReadByte(ISeqInStreamPtr stream, Byte *buf); -typedef struct ISeqOutStream ISeqOutStream; -struct ISeqOutStream +Z7_C_IFACE_DECL (ISeqOutStream) { - size_t (*Write)(const ISeqOutStream *p, const void *buf, size_t size); + size_t (*Write)(ISeqOutStreamPtr p, const void *buf, size_t size); /* Returns: result - the number of actually written bytes. (result < size) means error */ }; @@ -344,29 +369,26 @@ } ESzSeek; -typedef struct ISeekInStream ISeekInStream; -struct ISeekInStream +Z7_C_IFACE_DECL (ISeekInStream) { - SRes (*Read)(const ISeekInStream *p, void *buf, size_t *size); /* same as ISeqInStream::Read */ - SRes (*Seek)(const ISeekInStream *p, Int64 *pos, ESzSeek origin); + SRes (*Read)(ISeekInStreamPtr p, void *buf, size_t *size); /* same as ISeqInStream::Read */ + SRes (*Seek)(ISeekInStreamPtr p, Int64 *pos, ESzSeek origin); }; #define ISeekInStream_Read(p, buf, size) (p)->Read(p, buf, size) #define ISeekInStream_Seek(p, pos, origin) (p)->Seek(p, pos, origin) -typedef struct ILookInStream ILookInStream; -struct ILookInStream +Z7_C_IFACE_DECL (ILookInStream) { - SRes (*Look)(const ILookInStream *p, const void **buf, size_t *size); + SRes (*Look)(ILookInStreamPtr p, const void **buf, size_t *size); /* if (input(*size) != 0 && output(*size) == 0) means end_of_stream. (output(*size) > input(*size)) is not allowed (output(*size) < input(*size)) is allowed */ - SRes (*Skip)(const ILookInStream *p, size_t offset); + SRes (*Skip)(ILookInStreamPtr p, size_t offset); /* offset must be <= output(*size) of Look */ - - SRes (*Read)(const ILookInStream *p, void *buf, size_t *size); + SRes (*Read)(ILookInStreamPtr p, void *buf, size_t *size); /* reads directly (without buffer). It's same as ISeqInStream::Read */ - SRes (*Seek)(const ILookInStream *p, Int64 *pos, ESzSeek origin); + SRes (*Seek)(ILookInStreamPtr p, Int64 *pos, ESzSeek origin); }; #define ILookInStream_Look(p, buf, size) (p)->Look(p, buf, size) @@ -375,19 +397,18 @@ #define ILookInStream_Seek(p, pos, origin) (p)->Seek(p, pos, origin) -SRes LookInStream_LookRead(const ILookInStream *stream, void *buf, size_t *size); -SRes LookInStream_SeekTo(const ILookInStream *stream, UInt64 offset); +SRes LookInStream_LookRead(ILookInStreamPtr stream, void *buf, size_t *size); +SRes LookInStream_SeekTo(ILookInStreamPtr stream, UInt64 offset); /* reads via ILookInStream::Read */ -SRes LookInStream_Read2(const ILookInStream *stream, void *buf, size_t size, SRes errorType); -SRes LookInStream_Read(const ILookInStream *stream, void *buf, size_t size); - +SRes LookInStream_Read2(ILookInStreamPtr stream, void *buf, size_t size, SRes errorType); +SRes LookInStream_Read(ILookInStreamPtr stream, void *buf, size_t size); typedef struct { ILookInStream vt; - const ISeekInStream *realStream; + ISeekInStreamPtr realStream; size_t pos; size_t size; /* it's data size */ @@ -399,13 +420,13 @@ void LookToRead2_CreateVTable(CLookToRead2 *p, int lookahead); -#define LookToRead2_Init(p) { (p)->pos = (p)->size = 0; } +#define LookToRead2_INIT(p) { (p)->pos = (p)->size = 0; } typedef struct { ISeqInStream vt; - const ILookInStream *realStream; + ILookInStreamPtr realStream; } CSecToLook; void SecToLook_CreateVTable(CSecToLook *p); @@ -415,20 +436,19 @@ typedef struct { ISeqInStream vt; - const ILookInStream *realStream; + ILookInStreamPtr realStream; } CSecToRead; void SecToRead_CreateVTable(CSecToRead *p); -typedef struct ICompressProgress ICompressProgress; - -struct ICompressProgress +Z7_C_IFACE_DECL (ICompressProgress) { - SRes (*Progress)(const ICompressProgress *p, UInt64 inSize, UInt64 outSize); + SRes (*Progress)(ICompressProgressPtr p, UInt64 inSize, UInt64 outSize); /* Returns: result. (result != SZ_OK) means break. Value (UInt64)(Int64)-1 for size means unknown value. */ }; + #define ICompressProgress_Progress(p, inSize, outSize) (p)->Progress(p, inSize, outSize) @@ -466,13 +486,13 @@ -#ifndef MY_container_of +#ifndef Z7_container_of /* -#define MY_container_of(ptr, type, m) container_of(ptr, type, m) -#define MY_container_of(ptr, type, m) CONTAINING_RECORD(ptr, type, m) -#define MY_container_of(ptr, type, m) ((type *)((char *)(ptr) - offsetof(type, m))) -#define MY_container_of(ptr, type, m) (&((type *)0)->m == (ptr), ((type *)(((char *)(ptr)) - MY_offsetof(type, m)))) +#define Z7_container_of(ptr, type, m) container_of(ptr, type, m) +#define Z7_container_of(ptr, type, m) CONTAINING_RECORD(ptr, type, m) +#define Z7_container_of(ptr, type, m) ((type *)((char *)(ptr) - offsetof(type, m))) +#define Z7_container_of(ptr, type, m) (&((type *)0)->m == (ptr), ((type *)(((char *)(ptr)) - MY_offsetof(type, m)))) */ /* @@ -481,24 +501,64 @@ GCC 4.8.1 : classes with non-public variable members" */ -#define MY_container_of(ptr, type, m) ((type *)(void *)((char *)(void *)(1 ? (ptr) : &((type *)0)->m) - MY_offsetof(type, m))) +#define Z7_container_of(ptr, type, m) \ + ((type *)(void *)((char *)(void *) \ + (1 ? (ptr) : &((type *)NULL)->m) - MY_offsetof(type, m))) + +#define Z7_container_of_CONST(ptr, type, m) \ + ((const type *)(const void *)((const char *)(const void *) \ + (1 ? (ptr) : &((type *)NULL)->m) - MY_offsetof(type, m))) + +/* +#define Z7_container_of_NON_CONST_FROM_CONST(ptr, type, m) \ + ((type *)(void *)(const void *)((const char *)(const void *) \ + (1 ? (ptr) : &((type *)NULL)->m) - MY_offsetof(type, m))) +*/ #endif -#define CONTAINER_FROM_VTBL_SIMPLE(ptr, type, m) ((type *)(void *)(ptr)) +#define Z7_CONTAINER_FROM_VTBL_SIMPLE(ptr, type, m) ((type *)(void *)(ptr)) +// #define Z7_CONTAINER_FROM_VTBL(ptr, type, m) Z7_CONTAINER_FROM_VTBL_SIMPLE(ptr, type, m) +#define Z7_CONTAINER_FROM_VTBL(ptr, type, m) Z7_container_of(ptr, type, m) +// #define Z7_CONTAINER_FROM_VTBL(ptr, type, m) Z7_container_of_NON_CONST_FROM_CONST(ptr, type, m) + +#define Z7_CONTAINER_FROM_VTBL_CONST(ptr, type, m) Z7_container_of_CONST(ptr, type, m) + +#define Z7_CONTAINER_FROM_VTBL_CLS(ptr, type, m) Z7_CONTAINER_FROM_VTBL_SIMPLE(ptr, type, m) /* -#define CONTAINER_FROM_VTBL(ptr, type, m) CONTAINER_FROM_VTBL_SIMPLE(ptr, type, m) +#define Z7_CONTAINER_FROM_VTBL_CLS(ptr, type, m) Z7_CONTAINER_FROM_VTBL(ptr, type, m) */ -#define CONTAINER_FROM_VTBL(ptr, type, m) MY_container_of(ptr, type, m) +#if defined (__clang__) || defined(__GNUC__) +#define Z7_DIAGNOSTIC_IGNORE_BEGIN_CAST_QUAL \ + _Pragma("GCC diagnostic push") \ + _Pragma("GCC diagnostic ignored \"-Wcast-qual\"") +#define Z7_DIAGNOSTIC_IGNORE_END_CAST_QUAL \ + _Pragma("GCC diagnostic pop") +#else +#define Z7_DIAGNOSTIC_IGNORE_BEGIN_CAST_QUAL +#define Z7_DIAGNOSTIC_IGNORE_END_CAST_QUAL +#endif -#define CONTAINER_FROM_VTBL_CLS(ptr, type, m) CONTAINER_FROM_VTBL_SIMPLE(ptr, type, m) -/* -#define CONTAINER_FROM_VTBL_CLS(ptr, type, m) CONTAINER_FROM_VTBL(ptr, type, m) -*/ +#define Z7_CONTAINER_FROM_VTBL_TO_DECL_VAR(ptr, type, m, p) \ + Z7_DIAGNOSTIC_IGNORE_BEGIN_CAST_QUAL \ + type *p = Z7_CONTAINER_FROM_VTBL(ptr, type, m); \ + Z7_DIAGNOSTIC_IGNORE_END_CAST_QUAL + +#define Z7_CONTAINER_FROM_VTBL_TO_DECL_VAR_pp_vt_p(type) \ + Z7_CONTAINER_FROM_VTBL_TO_DECL_VAR(pp, type, vt, p) -#define MY_memset_0_ARRAY(a) memset((a), 0, sizeof(a)) +// #define ZIP7_DECLARE_HANDLE(name) typedef void *name; +#define Z7_DECLARE_HANDLE(name) struct name##_dummy{int unused;}; typedef struct name##_dummy *name; + + +#define Z7_memset_0_ARRAY(a) memset((a), 0, sizeof(a)) + +#ifndef Z7_ARRAY_SIZE +#define Z7_ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0])) +#endif + #ifdef _WIN32 @@ -527,3 +587,11 @@ EXTERN_C_END #endif + +/* +#ifndef Z7_ST +#ifdef _7ZIP_ST +#define Z7_ST +#endif +#endif +*/
diff --git a/third_party/lzma_sdk/C/7zVersion.h b/third_party/lzma_sdk/C/7zVersion.h deleted file mode 100644 index 49ea81dd..0000000 --- a/third_party/lzma_sdk/C/7zVersion.h +++ /dev/null
@@ -1,27 +0,0 @@ -#define MY_VER_MAJOR 22 -#define MY_VER_MINOR 01 -#define MY_VER_BUILD 0 -#define MY_VERSION_NUMBERS "22.01" -#define MY_VERSION MY_VERSION_NUMBERS - -#ifdef MY_CPU_NAME - #define MY_VERSION_CPU MY_VERSION " (" MY_CPU_NAME ")" -#else - #define MY_VERSION_CPU MY_VERSION -#endif - -#define MY_DATE "2022-07-15" -#undef MY_COPYRIGHT -#undef MY_VERSION_COPYRIGHT_DATE -#define MY_AUTHOR_NAME "Igor Pavlov" -#define MY_COPYRIGHT_PD "Igor Pavlov : Public domain" -#define MY_COPYRIGHT_CR "Copyright (c) 1999-2022 Igor Pavlov" - -#ifdef USE_COPYRIGHT_CR - #define MY_COPYRIGHT MY_COPYRIGHT_CR -#else - #define MY_COPYRIGHT MY_COPYRIGHT_PD -#endif - -#define MY_COPYRIGHT_DATE MY_COPYRIGHT " : " MY_DATE -#define MY_VERSION_COPYRIGHT_DATE MY_VERSION_CPU " : " MY_COPYRIGHT " : " MY_DATE
diff --git a/third_party/lzma_sdk/C/7zVersion.rc b/third_party/lzma_sdk/C/7zVersion.rc deleted file mode 100644 index 6ed26de7..0000000 --- a/third_party/lzma_sdk/C/7zVersion.rc +++ /dev/null
@@ -1,55 +0,0 @@ -#define MY_VS_FFI_FILEFLAGSMASK 0x0000003FL -#define MY_VOS_NT_WINDOWS32 0x00040004L -#define MY_VOS_CE_WINDOWS32 0x00050004L - -#define MY_VFT_APP 0x00000001L -#define MY_VFT_DLL 0x00000002L - -// #include <WinVer.h> - -#ifndef MY_VERSION -#include "7zVersion.h" -#endif - -#define MY_VER MY_VER_MAJOR,MY_VER_MINOR,MY_VER_BUILD,0 - -#ifdef DEBUG -#define DBG_FL VS_FF_DEBUG -#else -#define DBG_FL 0 -#endif - -#define MY_VERSION_INFO(fileType, descr, intName, origName) \ -LANGUAGE 9, 1 \ -1 VERSIONINFO \ - FILEVERSION MY_VER \ - PRODUCTVERSION MY_VER \ - FILEFLAGSMASK MY_VS_FFI_FILEFLAGSMASK \ - FILEFLAGS DBG_FL \ - FILEOS MY_VOS_NT_WINDOWS32 \ - FILETYPE fileType \ - FILESUBTYPE 0x0L \ -BEGIN \ - BLOCK "StringFileInfo" \ - BEGIN \ - BLOCK "040904b0" \ - BEGIN \ - VALUE "CompanyName", "Igor Pavlov" \ - VALUE "FileDescription", descr \ - VALUE "FileVersion", MY_VERSION \ - VALUE "InternalName", intName \ - VALUE "LegalCopyright", MY_COPYRIGHT \ - VALUE "OriginalFilename", origName \ - VALUE "ProductName", "7-Zip" \ - VALUE "ProductVersion", MY_VERSION \ - END \ - END \ - BLOCK "VarFileInfo" \ - BEGIN \ - VALUE "Translation", 0x409, 1200 \ - END \ -END - -#define MY_VERSION_INFO_APP(descr, intName) MY_VERSION_INFO(MY_VFT_APP, descr, intName, intName ".exe") - -#define MY_VERSION_INFO_DLL(descr, intName) MY_VERSION_INFO(MY_VFT_DLL, descr, intName, intName ".dll")
diff --git a/third_party/lzma_sdk/C/7zWindows.h b/third_party/lzma_sdk/C/7zWindows.h new file mode 100644 index 0000000..42c6db8 --- /dev/null +++ b/third_party/lzma_sdk/C/7zWindows.h
@@ -0,0 +1,101 @@ +/* 7zWindows.h -- StdAfx +2023-04-02 : Igor Pavlov : Public domain */ + +#ifndef ZIP7_INC_7Z_WINDOWS_H +#define ZIP7_INC_7Z_WINDOWS_H + +#ifdef _WIN32 + +#if defined(__clang__) +# pragma clang diagnostic push +#endif + +#if defined(_MSC_VER) + +#pragma warning(push) +#pragma warning(disable : 4668) // '_WIN32_WINNT' is not defined as a preprocessor macro, replacing with '0' for '#if/#elif' + +#if _MSC_VER == 1900 +// for old kit10 versions +// #pragma warning(disable : 4255) // winuser.h(13979): warning C4255: 'GetThreadDpiAwarenessContext': +#endif +// win10 Windows Kit: +#endif // _MSC_VER + +#if defined(_MSC_VER) && _MSC_VER <= 1200 && !defined(_WIN64) +// for msvc6 without sdk2003 +#define RPC_NO_WINDOWS_H +#endif + +#if defined(__MINGW32__) || defined(__MINGW64__) +// #if defined(__GNUC__) && !defined(__clang__) +#include <windows.h> +#else +#include <Windows.h> +#endif +// #include <basetsd.h> +// #include <wtypes.h> + +// but if precompiled with clang-cl then we need +// #include <windows.h> +#if defined(_MSC_VER) +#pragma warning(pop) +#endif + +#if defined(__clang__) +# pragma clang diagnostic pop +#endif + +#if defined(_MSC_VER) && _MSC_VER <= 1200 && !defined(_WIN64) +#ifndef _W64 + +typedef long LONG_PTR, *PLONG_PTR; +typedef unsigned long ULONG_PTR, *PULONG_PTR; +typedef ULONG_PTR DWORD_PTR, *PDWORD_PTR; + +#define Z7_OLD_WIN_SDK +#endif // _W64 +#endif // _MSC_VER == 1200 + +#ifdef Z7_OLD_WIN_SDK + +#ifndef INVALID_FILE_ATTRIBUTES +#define INVALID_FILE_ATTRIBUTES ((DWORD)-1) +#endif +#ifndef INVALID_SET_FILE_POINTER +#define INVALID_SET_FILE_POINTER ((DWORD)-1) +#endif +#ifndef FILE_SPECIAL_ACCESS +#define FILE_SPECIAL_ACCESS (FILE_ANY_ACCESS) +#endif + +// ShlObj.h: +// #define BIF_NEWDIALOGSTYLE 0x0040 + +#pragma warning(disable : 4201) +// #pragma warning(disable : 4115) + +#undef VARIANT_TRUE +#define VARIANT_TRUE ((VARIANT_BOOL)-1) +#endif + +#endif // Z7_OLD_WIN_SDK + +#ifdef UNDER_CE +#undef VARIANT_TRUE +#define VARIANT_TRUE ((VARIANT_BOOL)-1) +#endif + + +#if defined(_MSC_VER) +#if _MSC_VER >= 1400 && _MSC_VER <= 1600 + // BaseTsd.h(148) : 'HandleToULong' : unreferenced inline function has been removed + // string.h + // #pragma warning(disable : 4514) +#endif +#endif + + +/* #include "7zTypes.h" */ + +#endif
diff --git a/third_party/lzma_sdk/C/Alloc.c b/third_party/lzma_sdk/C/Alloc.c index d1af76c..63e1a12 100644 --- a/third_party/lzma_sdk/C/Alloc.c +++ b/third_party/lzma_sdk/C/Alloc.c
@@ -1,38 +1,53 @@ /* Alloc.c -- Memory allocation functions -2021-07-13 : Igor Pavlov : Public domain */ +2024-02-18 : Igor Pavlov : Public domain */ #include "Precomp.h" -#include <stdio.h> - #ifdef _WIN32 -#include <Windows.h> +#include "7zWindows.h" #endif #include <stdlib.h> #include "Alloc.h" -/* #define _SZ_ALLOC_DEBUG */ +#if defined(Z7_LARGE_PAGES) && defined(_WIN32) && \ + (!defined(Z7_WIN32_WINNT_MIN) || Z7_WIN32_WINNT_MIN < 0x0502) // < Win2003 (xp-64) + #define Z7_USE_DYN_GetLargePageMinimum +#endif -/* use _SZ_ALLOC_DEBUG to debug alloc/free operations */ -#ifdef _SZ_ALLOC_DEBUG +// for debug: +#if 0 +#if defined(__CHERI__) && defined(__SIZEOF_POINTER__) && (__SIZEOF_POINTER__ == 16) +// #pragma message("=== Z7_ALLOC_NO_OFFSET_ALLOCATOR === ") +#define Z7_ALLOC_NO_OFFSET_ALLOCATOR +#endif +#endif +// #define SZ_ALLOC_DEBUG +/* #define SZ_ALLOC_DEBUG */ + +/* use SZ_ALLOC_DEBUG to debug alloc/free operations */ +#ifdef SZ_ALLOC_DEBUG + +#include <string.h> #include <stdio.h> -int g_allocCount = 0; -int g_allocCountMid = 0; -int g_allocCountBig = 0; +static int g_allocCount = 0; +#ifdef _WIN32 +static int g_allocCountMid = 0; +static int g_allocCountBig = 0; +#endif #define CONVERT_INT_TO_STR(charType, tempSize) \ - unsigned char temp[tempSize]; unsigned i = 0; \ - while (val >= 10) { temp[i++] = (unsigned char)('0' + (unsigned)(val % 10)); val /= 10; } \ + char temp[tempSize]; unsigned i = 0; \ + while (val >= 10) { temp[i++] = (char)('0' + (unsigned)(val % 10)); val /= 10; } \ *s++ = (charType)('0' + (unsigned)val); \ while (i != 0) { i--; *s++ = temp[i]; } \ *s = 0; static void ConvertUInt64ToString(UInt64 val, char *s) { - CONVERT_INT_TO_STR(char, 24); + CONVERT_INT_TO_STR(char, 24) } #define GET_HEX_CHAR(t) ((char)(((t < 10) ? ('0' + t) : ('A' + (t - 10))))) @@ -77,7 +92,7 @@ Print(s); } -static void PrintLn() +static void PrintLn(void) { Print("\n"); } @@ -89,10 +104,10 @@ PrintAligned(s, align); } -static void PrintDec(UInt64 v, size_t align) +static void PrintDec(int v, size_t align) { char s[32]; - ConvertUInt64ToString(v, s); + ConvertUInt64ToString((unsigned)v, s); PrintAligned(s, align); } @@ -102,12 +117,19 @@ } -#define PRINT_ALLOC(name, cnt, size, ptr) \ +#define PRINT_REALLOC(name, cnt, size, ptr) { \ + Print(name " "); \ + if (!ptr) PrintDec(cnt++, 10); \ + PrintHex(size, 10); \ + PrintAddr(ptr); \ + PrintLn(); } + +#define PRINT_ALLOC(name, cnt, size, ptr) { \ Print(name " "); \ PrintDec(cnt++, 10); \ PrintHex(size, 10); \ PrintAddr(ptr); \ - PrintLn(); + PrintLn(); } #define PRINT_FREE(name, cnt, ptr) if (ptr) { \ Print(name " "); \ @@ -117,26 +139,45 @@ #else +#ifdef _WIN32 #define PRINT_ALLOC(name, cnt, size, ptr) +#endif #define PRINT_FREE(name, cnt, ptr) #define Print(s) #define PrintLn() +#ifndef Z7_ALLOC_NO_OFFSET_ALLOCATOR #define PrintHex(v, align) +#endif #define PrintAddr(p) #endif +/* +by specification: + malloc(non_NULL, 0) : returns NULL or a unique pointer value that can later be successfully passed to free() + realloc(NULL, size) : the call is equivalent to malloc(size) + realloc(non_NULL, 0) : the call is equivalent to free(ptr) + +in main compilers: + malloc(0) : returns non_NULL + realloc(NULL, 0) : returns non_NULL + realloc(non_NULL, 0) : returns NULL +*/ + void *MyAlloc(size_t size) { if (size == 0) return NULL; - PRINT_ALLOC("Alloc ", g_allocCount, size, NULL); - #ifdef _SZ_ALLOC_DEBUG + // PRINT_ALLOC("Alloc ", g_allocCount, size, NULL) + #ifdef SZ_ALLOC_DEBUG { void *p = malloc(size); - // PRINT_ALLOC("Alloc ", g_allocCount, size, p); + if (p) + { + PRINT_ALLOC("Alloc ", g_allocCount, size, p) + } return p; } #else @@ -146,71 +187,107 @@ void MyFree(void *address) { - PRINT_FREE("Free ", g_allocCount, address); + PRINT_FREE("Free ", g_allocCount, address) free(address); } +void *MyRealloc(void *address, size_t size) +{ + if (size == 0) + { + MyFree(address); + return NULL; + } + // PRINT_REALLOC("Realloc ", g_allocCount, size, address) + #ifdef SZ_ALLOC_DEBUG + { + void *p = realloc(address, size); + if (p) + { + PRINT_REALLOC("Realloc ", g_allocCount, size, address) + } + return p; + } + #else + return realloc(address, size); + #endif +} + + #ifdef _WIN32 void *MidAlloc(size_t size) { if (size == 0) return NULL; - - PRINT_ALLOC("Alloc-Mid", g_allocCountMid, size, NULL); - + #ifdef SZ_ALLOC_DEBUG + { + void *p = VirtualAlloc(NULL, size, MEM_COMMIT, PAGE_READWRITE); + if (p) + { + PRINT_ALLOC("Alloc-Mid", g_allocCountMid, size, p) + } + return p; + } + #else return VirtualAlloc(NULL, size, MEM_COMMIT, PAGE_READWRITE); + #endif } void MidFree(void *address) { - PRINT_FREE("Free-Mid", g_allocCountMid, address); + PRINT_FREE("Free-Mid", g_allocCountMid, address) if (!address) return; VirtualFree(address, 0, MEM_RELEASE); } -#ifdef _7ZIP_LARGE_PAGES +#ifdef Z7_LARGE_PAGES #ifdef MEM_LARGE_PAGES - #define MY__MEM_LARGE_PAGES MEM_LARGE_PAGES + #define MY_MEM_LARGE_PAGES MEM_LARGE_PAGES #else - #define MY__MEM_LARGE_PAGES 0x20000000 + #define MY_MEM_LARGE_PAGES 0x20000000 #endif extern SIZE_T g_LargePageSize; SIZE_T g_LargePageSize = 0; -typedef SIZE_T (WINAPI *GetLargePageMinimumP)(VOID); +typedef SIZE_T (WINAPI *Func_GetLargePageMinimum)(VOID); -#endif // _7ZIP_LARGE_PAGES - -void SetLargePageSize() +void SetLargePageSize(void) { - #ifdef _7ZIP_LARGE_PAGES SIZE_T size; - GetLargePageMinimumP largePageMinimum = (GetLargePageMinimumP) - GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")), "GetLargePageMinimum"); - if (!largePageMinimum) +#ifdef Z7_USE_DYN_GetLargePageMinimum +Z7_DIAGNOSTIC_IGNORE_CAST_FUNCTION + + const + Func_GetLargePageMinimum fn = + (Func_GetLargePageMinimum) Z7_CAST_FUNC_C GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")), + "GetLargePageMinimum"); + if (!fn) return; - size = largePageMinimum(); + size = fn(); +#else + size = GetLargePageMinimum(); +#endif if (size == 0 || (size & (size - 1)) != 0) return; g_LargePageSize = size; - #endif } +#endif // Z7_LARGE_PAGES void *BigAlloc(size_t size) { if (size == 0) return NULL; - PRINT_ALLOC("Alloc-Big", g_allocCountBig, size, NULL); - - #ifdef _7ZIP_LARGE_PAGES + PRINT_ALLOC("Alloc-Big", g_allocCountBig, size, NULL) + + #ifdef Z7_LARGE_PAGES { SIZE_T ps = g_LargePageSize; if (ps != 0 && ps <= (1 << 30) && size > (ps / 2)) @@ -220,56 +297,43 @@ size2 = (size + ps) & ~ps; if (size2 >= size) { - void *res = VirtualAlloc(NULL, size2, MEM_COMMIT | MY__MEM_LARGE_PAGES, PAGE_READWRITE); - if (res) - return res; + void *p = VirtualAlloc(NULL, size2, MEM_COMMIT | MY_MEM_LARGE_PAGES, PAGE_READWRITE); + if (p) + { + PRINT_ALLOC("Alloc-BM ", g_allocCountMid, size2, p) + return p; + } } } } #endif - return VirtualAlloc(NULL, size, MEM_COMMIT, PAGE_READWRITE); + return MidAlloc(size); } void BigFree(void *address) { - PRINT_FREE("Free-Big", g_allocCountBig, address); - - if (!address) - return; - VirtualFree(address, 0, MEM_RELEASE); + PRINT_FREE("Free-Big", g_allocCountBig, address) + MidFree(address); } -#endif +#endif // _WIN32 -static void *SzAlloc(ISzAllocPtr p, size_t size) { UNUSED_VAR(p); return MyAlloc(size); } -static void SzFree(ISzAllocPtr p, void *address) { UNUSED_VAR(p); MyFree(address); } +static void *SzAlloc(ISzAllocPtr p, size_t size) { UNUSED_VAR(p) return MyAlloc(size); } +static void SzFree(ISzAllocPtr p, void *address) { UNUSED_VAR(p) MyFree(address); } const ISzAlloc g_Alloc = { SzAlloc, SzFree }; #ifdef _WIN32 -static void *SzMidAlloc(ISzAllocPtr p, size_t size) { UNUSED_VAR(p); return MidAlloc(size); } -static void SzMidFree(ISzAllocPtr p, void *address) { UNUSED_VAR(p); MidFree(address); } -static void *SzBigAlloc(ISzAllocPtr p, size_t size) { UNUSED_VAR(p); return BigAlloc(size); } -static void SzBigFree(ISzAllocPtr p, void *address) { UNUSED_VAR(p); BigFree(address); } +static void *SzMidAlloc(ISzAllocPtr p, size_t size) { UNUSED_VAR(p) return MidAlloc(size); } +static void SzMidFree(ISzAllocPtr p, void *address) { UNUSED_VAR(p) MidFree(address); } +static void *SzBigAlloc(ISzAllocPtr p, size_t size) { UNUSED_VAR(p) return BigAlloc(size); } +static void SzBigFree(ISzAllocPtr p, void *address) { UNUSED_VAR(p) BigFree(address); } const ISzAlloc g_MidAlloc = { SzMidAlloc, SzMidFree }; const ISzAlloc g_BigAlloc = { SzBigAlloc, SzBigFree }; #endif -/* - uintptr_t : <stdint.h> C99 (optional) - : unsupported in VS6 -*/ - -#ifdef _WIN32 - typedef UINT_PTR UIntPtr; -#else - /* - typedef uintptr_t UIntPtr; - */ - typedef ptrdiff_t UIntPtr; -#endif - +#ifndef Z7_ALLOC_NO_OFFSET_ALLOCATOR #define ADJUST_ALLOC_SIZE 0 /* @@ -280,14 +344,36 @@ MyAlloc() can return address that is NOT multiple of sizeof(void *). */ - /* -#define MY_ALIGN_PTR_DOWN(p, align) ((void *)((char *)(p) - ((size_t)(UIntPtr)(p) & ((align) - 1)))) + uintptr_t : <stdint.h> C99 (optional) + : unsupported in VS6 */ -#define MY_ALIGN_PTR_DOWN(p, align) ((void *)((((UIntPtr)(p)) & ~((UIntPtr)(align) - 1)))) +typedef + #ifdef _WIN32 + UINT_PTR + #elif 1 + uintptr_t + #else + ptrdiff_t + #endif + MY_uintptr_t; +#if 0 \ + || (defined(__CHERI__) \ + || defined(__SIZEOF_POINTER__) && (__SIZEOF_POINTER__ > 8)) +// for 128-bit pointers (cheri): +#define MY_ALIGN_PTR_DOWN(p, align) \ + ((void *)((char *)(p) - ((size_t)(MY_uintptr_t)(p) & ((align) - 1)))) +#else +#define MY_ALIGN_PTR_DOWN(p, align) \ + ((void *)((((MY_uintptr_t)(p)) & ~((MY_uintptr_t)(align) - 1)))) +#endif -#if !defined(_WIN32) && defined(_POSIX_C_SOURCE) && (_POSIX_C_SOURCE >= 200112L) +#endif + +#if !defined(_WIN32) \ + && (defined(Z7_ALLOC_NO_OFFSET_ALLOCATOR) \ + || defined(_POSIX_C_SOURCE) && (_POSIX_C_SOURCE >= 200112L)) #define USE_posix_memalign #endif @@ -327,14 +413,13 @@ #define ALLOC_ALIGN_SIZE ((size_t)1 << 7) -static void *SzAlignedAlloc(ISzAllocPtr pp, size_t size) +void *z7_AlignedAlloc(size_t size) { - #ifndef USE_posix_memalign +#ifndef USE_posix_memalign void *p; void *pAligned; size_t newSize; - UNUSED_VAR(pp); /* also we can allocate additional dummy ALLOC_ALIGN_SIZE bytes after aligned block to prevent cache line sharing with another allocated blocks */ @@ -359,10 +444,9 @@ return pAligned; - #else +#else void *p; - UNUSED_VAR(pp); if (posix_memalign(&p, ALLOC_ALIGN_SIZE, size)) return NULL; @@ -371,19 +455,37 @@ return p; - #endif +#endif +} + + +void z7_AlignedFree(void *address) +{ +#ifndef USE_posix_memalign + if (address) + MyFree(((void **)address)[-1]); +#else + free(address); +#endif +} + + +static void *SzAlignedAlloc(ISzAllocPtr pp, size_t size) +{ + UNUSED_VAR(pp) + return z7_AlignedAlloc(size); } static void SzAlignedFree(ISzAllocPtr pp, void *address) { - UNUSED_VAR(pp); - #ifndef USE_posix_memalign + UNUSED_VAR(pp) +#ifndef USE_posix_memalign if (address) MyFree(((void **)address)[-1]); - #else +#else free(address); - #endif +#endif } @@ -391,17 +493,45 @@ -#define MY_ALIGN_PTR_DOWN_1(p) MY_ALIGN_PTR_DOWN(p, sizeof(void *)) - /* we align ptr to support cases where CAlignOffsetAlloc::offset is not multiply of sizeof(void *) */ -#define REAL_BLOCK_PTR_VAR(p) ((void **)MY_ALIGN_PTR_DOWN_1(p))[-1] -/* -#define REAL_BLOCK_PTR_VAR(p) ((void **)(p))[-1] -*/ +#ifndef Z7_ALLOC_NO_OFFSET_ALLOCATOR +#if 1 + #define MY_ALIGN_PTR_DOWN_1(p) MY_ALIGN_PTR_DOWN(p, sizeof(void *)) + #define REAL_BLOCK_PTR_VAR(p) ((void **)MY_ALIGN_PTR_DOWN_1(p))[-1] +#else + // we can use this simplified code, + // if (CAlignOffsetAlloc::offset == (k * sizeof(void *)) + #define REAL_BLOCK_PTR_VAR(p) (((void **)(p))[-1]) +#endif +#endif + + +#if 0 +#ifndef Z7_ALLOC_NO_OFFSET_ALLOCATOR +#include <stdio.h> +static void PrintPtr(const char *s, const void *p) +{ + const Byte *p2 = (const Byte *)&p; + unsigned i; + printf("%s %p ", s, p); + for (i = sizeof(p); i != 0;) + { + i--; + printf("%02x", p2[i]); + } + printf("\n"); +} +#endif +#endif + static void *AlignOffsetAlloc_Alloc(ISzAllocPtr pp, size_t size) { - CAlignOffsetAlloc *p = CONTAINER_FROM_VTBL(pp, CAlignOffsetAlloc, vt); +#if defined(Z7_ALLOC_NO_OFFSET_ALLOCATOR) + UNUSED_VAR(pp) + return z7_AlignedAlloc(size); +#else + const CAlignOffsetAlloc *p = Z7_CONTAINER_FROM_VTBL_CONST(pp, CAlignOffsetAlloc, vt); void *adr; void *pAligned; size_t newSize; @@ -429,6 +559,12 @@ pAligned = (char *)MY_ALIGN_PTR_DOWN((char *)adr + alignSize - p->offset + extra + ADJUST_ALLOC_SIZE, alignSize) + p->offset; +#if 0 + printf("\nalignSize = %6x, offset=%6x, size=%8x \n", (unsigned)alignSize, (unsigned)p->offset, (unsigned)size); + PrintPtr("base", adr); + PrintPtr("alig", pAligned); +#endif + PrintLn(); Print("- Aligned: "); Print(" size="); PrintHex(size, 8); @@ -440,19 +576,25 @@ REAL_BLOCK_PTR_VAR(pAligned) = adr; return pAligned; +#endif } static void AlignOffsetAlloc_Free(ISzAllocPtr pp, void *address) { +#if defined(Z7_ALLOC_NO_OFFSET_ALLOCATOR) + UNUSED_VAR(pp) + z7_AlignedFree(address); +#else if (address) { - CAlignOffsetAlloc *p = CONTAINER_FROM_VTBL(pp, CAlignOffsetAlloc, vt); + const CAlignOffsetAlloc *p = Z7_CONTAINER_FROM_VTBL_CONST(pp, CAlignOffsetAlloc, vt); PrintLn(); Print("- Aligned Free: "); PrintLn(); ISzAlloc_Free(p->baseAlloc, REAL_BLOCK_PTR_VAR(address)); } +#endif }
diff --git a/third_party/lzma_sdk/C/Alloc.h b/third_party/lzma_sdk/C/Alloc.h index 3be2041e..01bf6b7 100644 --- a/third_party/lzma_sdk/C/Alloc.h +++ b/third_party/lzma_sdk/C/Alloc.h
@@ -1,31 +1,49 @@ /* Alloc.h -- Memory allocation functions -2021-07-13 : Igor Pavlov : Public domain */ +2024-01-22 : Igor Pavlov : Public domain */ -#ifndef __COMMON_ALLOC_H -#define __COMMON_ALLOC_H +#ifndef ZIP7_INC_ALLOC_H +#define ZIP7_INC_ALLOC_H #include "7zTypes.h" EXTERN_C_BEGIN +/* + MyFree(NULL) : is allowed, as free(NULL) + MyAlloc(0) : returns NULL : but malloc(0) is allowed to return NULL or non_NULL + MyRealloc(NULL, 0) : returns NULL : but realloc(NULL, 0) is allowed to return NULL or non_NULL +MyRealloc() is similar to realloc() for the following cases: + MyRealloc(non_NULL, 0) : returns NULL and always calls MyFree(ptr) + MyRealloc(NULL, non_ZERO) : returns NULL, if allocation failed + MyRealloc(non_NULL, non_ZERO) : returns NULL, if reallocation failed +*/ + void *MyAlloc(size_t size); void MyFree(void *address); +void *MyRealloc(void *address, size_t size); + +void *z7_AlignedAlloc(size_t size); +void z7_AlignedFree(void *p); #ifdef _WIN32 +#ifdef Z7_LARGE_PAGES void SetLargePageSize(void); +#endif void *MidAlloc(size_t size); void MidFree(void *address); void *BigAlloc(size_t size); void BigFree(void *address); +/* #define Z7_BIG_ALLOC_IS_ZERO_FILLED */ + #else -#define MidAlloc(size) MyAlloc(size) -#define MidFree(address) MyFree(address) -#define BigAlloc(size) MyAlloc(size) -#define BigFree(address) MyFree(address) +#define MidAlloc(size) z7_AlignedAlloc(size) +#define MidFree(address) z7_AlignedFree(address) +#define BigAlloc(size) z7_AlignedAlloc(size) +#define BigFree(address) z7_AlignedFree(address) #endif
diff --git a/third_party/lzma_sdk/C/Bcj2.c b/third_party/lzma_sdk/C/Bcj2.c index c7b9567..7cb57ad6 100644 --- a/third_party/lzma_sdk/C/Bcj2.c +++ b/third_party/lzma_sdk/C/Bcj2.c
@@ -1,29 +1,24 @@ /* Bcj2.c -- BCJ2 Decoder (Converter for x86 code) -2021-02-09 : Igor Pavlov : Public domain */ +2023-03-01 : Igor Pavlov : Public domain */ #include "Precomp.h" #include "Bcj2.h" #include "CpuArch.h" -#define CProb UInt16 - #define kTopValue ((UInt32)1 << 24) -#define kNumModelBits 11 -#define kBitModelTotal (1 << kNumModelBits) +#define kNumBitModelTotalBits 11 +#define kBitModelTotal (1 << kNumBitModelTotalBits) #define kNumMoveBits 5 -#define _IF_BIT_0 ttt = *prob; bound = (p->range >> kNumModelBits) * ttt; if (p->code < bound) -#define _UPDATE_0 p->range = bound; *prob = (CProb)(ttt + ((kBitModelTotal - ttt) >> kNumMoveBits)); -#define _UPDATE_1 p->range -= bound; p->code -= bound; *prob = (CProb)(ttt - (ttt >> kNumMoveBits)); +// UInt32 bcj2_stats[256 + 2][2]; void Bcj2Dec_Init(CBcj2Dec *p) { unsigned i; - - p->state = BCJ2_DEC_STATE_OK; + p->state = BCJ2_STREAM_RC; // BCJ2_DEC_STATE_OK; p->ip = 0; - p->temp[3] = 0; + p->temp = 0; p->range = 0; p->code = 0; for (i = 0; i < sizeof(p->probs) / sizeof(p->probs[0]); i++) @@ -32,217 +27,248 @@ SRes Bcj2Dec_Decode(CBcj2Dec *p) { + UInt32 v = p->temp; + // const Byte *src; if (p->range <= 5) { - p->state = BCJ2_DEC_STATE_OK; + UInt32 code = p->code; + p->state = BCJ2_DEC_STATE_ERROR; /* for case if we return SZ_ERROR_DATA; */ for (; p->range != 5; p->range++) { - if (p->range == 1 && p->code != 0) + if (p->range == 1 && code != 0) return SZ_ERROR_DATA; - if (p->bufs[BCJ2_STREAM_RC] == p->lims[BCJ2_STREAM_RC]) { p->state = BCJ2_STREAM_RC; return SZ_OK; } - - p->code = (p->code << 8) | *(p->bufs[BCJ2_STREAM_RC])++; + code = (code << 8) | *(p->bufs[BCJ2_STREAM_RC])++; + p->code = code; } - - if (p->code == 0xFFFFFFFF) + if (code == 0xffffffff) return SZ_ERROR_DATA; - - p->range = 0xFFFFFFFF; + p->range = 0xffffffff; } - else if (p->state >= BCJ2_DEC_STATE_ORIG_0) + // else { - while (p->state <= BCJ2_DEC_STATE_ORIG_3) + unsigned state = p->state; + // we check BCJ2_IS_32BIT_STREAM() here instead of check in the main loop + if (BCJ2_IS_32BIT_STREAM(state)) + { + const Byte *cur = p->bufs[state]; + if (cur == p->lims[state]) + return SZ_OK; + p->bufs[state] = cur + 4; + { + const UInt32 ip = p->ip + 4; + v = GetBe32a(cur) - ip; + p->ip = ip; + } + state = BCJ2_DEC_STATE_ORIG_0; + } + if ((unsigned)(state - BCJ2_DEC_STATE_ORIG_0) < 4) { Byte *dest = p->dest; - if (dest == p->destLim) - return SZ_OK; - *dest = p->temp[(size_t)p->state - BCJ2_DEC_STATE_ORIG_0]; - p->state++; - p->dest = dest + 1; - } - } - - /* - if (BCJ2_IS_32BIT_STREAM(p->state)) - { - const Byte *cur = p->bufs[p->state]; - if (cur == p->lims[p->state]) - return SZ_OK; - p->bufs[p->state] = cur + 4; - - { - UInt32 val; - Byte *dest; - SizeT rem; - - p->ip += 4; - val = GetBe32(cur) - p->ip; - dest = p->dest; - rem = p->destLim - dest; - if (rem < 4) + for (;;) { - SizeT i; - SetUi32(p->temp, val); - for (i = 0; i < rem; i++) - dest[i] = p->temp[i]; - p->dest = dest + rem; - p->state = BCJ2_DEC_STATE_ORIG_0 + (unsigned)rem; - return SZ_OK; + if (dest == p->destLim) + { + p->state = state; + p->temp = v; + return SZ_OK; + } + *dest++ = (Byte)v; + p->dest = dest; + if (++state == BCJ2_DEC_STATE_ORIG_3 + 1) + break; + v >>= 8; } - SetUi32(dest, val); - p->temp[3] = (Byte)(val >> 24); - p->dest = dest + 4; - p->state = BCJ2_DEC_STATE_OK; } } - */ + // src = p->bufs[BCJ2_STREAM_MAIN]; for (;;) { + /* if (BCJ2_IS_32BIT_STREAM(p->state)) p->state = BCJ2_DEC_STATE_OK; else + */ { if (p->range < kTopValue) { if (p->bufs[BCJ2_STREAM_RC] == p->lims[BCJ2_STREAM_RC]) { p->state = BCJ2_STREAM_RC; + p->temp = v; return SZ_OK; } p->range <<= 8; p->code = (p->code << 8) | *(p->bufs[BCJ2_STREAM_RC])++; } - { const Byte *src = p->bufs[BCJ2_STREAM_MAIN]; const Byte *srcLim; - Byte *dest; - SizeT num = (SizeT)(p->lims[BCJ2_STREAM_MAIN] - src); - - if (num == 0) + Byte *dest = p->dest; { - p->state = BCJ2_STREAM_MAIN; - return SZ_OK; + const SizeT rem = (SizeT)(p->lims[BCJ2_STREAM_MAIN] - src); + SizeT num = (SizeT)(p->destLim - dest); + if (num >= rem) + num = rem; + #define NUM_ITERS 4 + #if (NUM_ITERS & (NUM_ITERS - 1)) == 0 + num &= ~((SizeT)NUM_ITERS - 1); // if (NUM_ITERS == (1 << x)) + #else + num -= num % NUM_ITERS; // if (NUM_ITERS != (1 << x)) + #endif + srcLim = src + num; } - - dest = p->dest; - if (num > (SizeT)(p->destLim - dest)) + + #define NUM_SHIFT_BITS 24 + #define ONE_ITER(indx) { \ + const unsigned b = src[indx]; \ + *dest++ = (Byte)b; \ + v = (v << NUM_SHIFT_BITS) | b; \ + if (((b + (0x100 - 0xe8)) & 0xfe) == 0) break; \ + if (((v - (((UInt32)0x0f << (NUM_SHIFT_BITS)) + 0x80)) & \ + ((((UInt32)1 << (4 + NUM_SHIFT_BITS)) - 0x1) << 4)) == 0) break; \ + /* ++dest */; /* v = b; */ } + + if (src != srcLim) + for (;;) { - num = (SizeT)(p->destLim - dest); - if (num == 0) + /* The dependency chain of 2-cycle for (v) calculation is not big problem here. + But we can remove dependency chain with v = b in the end of loop. */ + ONE_ITER(0) + #if (NUM_ITERS > 1) + ONE_ITER(1) + #if (NUM_ITERS > 2) + ONE_ITER(2) + #if (NUM_ITERS > 3) + ONE_ITER(3) + #if (NUM_ITERS > 4) + ONE_ITER(4) + #if (NUM_ITERS > 5) + ONE_ITER(5) + #if (NUM_ITERS > 6) + ONE_ITER(6) + #if (NUM_ITERS > 7) + ONE_ITER(7) + #endif + #endif + #endif + #endif + #endif + #endif + #endif + + src += NUM_ITERS; + if (src == srcLim) + break; + } + + if (src == srcLim) + #if (NUM_ITERS > 1) + for (;;) + #endif + { + #if (NUM_ITERS > 1) + if (src == p->lims[BCJ2_STREAM_MAIN] || dest == p->destLim) + #endif { - p->state = BCJ2_DEC_STATE_ORIG; + const SizeT num = (SizeT)(src - p->bufs[BCJ2_STREAM_MAIN]); + p->bufs[BCJ2_STREAM_MAIN] = src; + p->dest = dest; + p->ip += (UInt32)num; + /* state BCJ2_STREAM_MAIN has more priority than BCJ2_STATE_ORIG */ + p->state = + src == p->lims[BCJ2_STREAM_MAIN] ? + (unsigned)BCJ2_STREAM_MAIN : + (unsigned)BCJ2_DEC_STATE_ORIG; + p->temp = v; return SZ_OK; } + #if (NUM_ITERS > 1) + ONE_ITER(0) + src++; + #endif } - - srcLim = src + num; - if (p->temp[3] == 0x0F && (src[0] & 0xF0) == 0x80) - *dest = src[0]; - else for (;;) { - Byte b = *src; - *dest = b; - if (b != 0x0F) - { - if ((b & 0xFE) == 0xE8) - break; - dest++; - if (++src != srcLim) - continue; - break; - } - dest++; - if (++src == srcLim) - break; - if ((*src & 0xF0) != 0x80) - continue; - *dest = *src; - break; - } - - num = (SizeT)(src - p->bufs[BCJ2_STREAM_MAIN]); - - if (src == srcLim) - { - p->temp[3] = src[-1]; - p->bufs[BCJ2_STREAM_MAIN] = src; + const SizeT num = (SizeT)(dest - p->dest); + p->dest = dest; // p->dest += num; + p->bufs[BCJ2_STREAM_MAIN] += num; // = src; p->ip += (UInt32)num; - p->dest += num; - p->state = - p->bufs[BCJ2_STREAM_MAIN] == - p->lims[BCJ2_STREAM_MAIN] ? - (unsigned)BCJ2_STREAM_MAIN : - (unsigned)BCJ2_DEC_STATE_ORIG; - return SZ_OK; } - { UInt32 bound, ttt; - CProb *prob; - Byte b = src[0]; - Byte prev = (Byte)(num == 0 ? p->temp[3] : src[-1]); - - p->temp[3] = b; - p->bufs[BCJ2_STREAM_MAIN] = src + 1; - num++; - p->ip += (UInt32)num; - p->dest += num; - - prob = p->probs + (unsigned)(b == 0xE8 ? 2 + (unsigned)prev : (b == 0xE9 ? 1 : 0)); - - _IF_BIT_0 + CBcj2Prob *prob; // unsigned index; + /* + prob = p->probs + (unsigned)((Byte)v == 0xe8 ? + 2 + (Byte)(v >> 8) : + ((v >> 5) & 1)); // ((Byte)v < 0xe8 ? 0 : 1)); + */ { - _UPDATE_0 + const unsigned c = ((v + 0x17) >> 6) & 1; + prob = p->probs + (unsigned) + (((0 - c) & (Byte)(v >> NUM_SHIFT_BITS)) + c + ((v >> 5) & 1)); + // (Byte) + // 8x->0 : e9->1 : xxe8->xx+2 + // 8x->0x100 : e9->0x101 : xxe8->xx + // (((0x100 - (e & ~v)) & (0x100 | (v >> 8))) + (e & v)); + // (((0x101 + (~e | v)) & (0x100 | (v >> 8))) + (e & v)); + } + ttt = *prob; + bound = (p->range >> kNumBitModelTotalBits) * ttt; + if (p->code < bound) + { + // bcj2_stats[prob - p->probs][0]++; + p->range = bound; + *prob = (CBcj2Prob)(ttt + ((kBitModelTotal - ttt) >> kNumMoveBits)); continue; } - _UPDATE_1 - + { + // bcj2_stats[prob - p->probs][1]++; + p->range -= bound; + p->code -= bound; + *prob = (CBcj2Prob)(ttt - (ttt >> kNumMoveBits)); + } } } } - { - UInt32 val; - unsigned cj = (p->temp[3] == 0xE8) ? BCJ2_STREAM_CALL : BCJ2_STREAM_JUMP; + /* (v == 0xe8 ? 0 : 1) uses setcc instruction with additional zero register usage in x64 MSVC. */ + // const unsigned cj = ((Byte)v == 0xe8) ? BCJ2_STREAM_CALL : BCJ2_STREAM_JUMP; + const unsigned cj = (((v + 0x57) >> 6) & 1) + BCJ2_STREAM_CALL; const Byte *cur = p->bufs[cj]; Byte *dest; SizeT rem; - if (cur == p->lims[cj]) { p->state = cj; break; } - - val = GetBe32(cur); + v = GetBe32a(cur); p->bufs[cj] = cur + 4; - - p->ip += 4; - val -= p->ip; + { + const UInt32 ip = p->ip + 4; + v -= ip; + p->ip = ip; + } dest = p->dest; rem = (SizeT)(p->destLim - dest); - if (rem < 4) { - p->temp[0] = (Byte)val; if (rem > 0) dest[0] = (Byte)val; val >>= 8; - p->temp[1] = (Byte)val; if (rem > 1) dest[1] = (Byte)val; val >>= 8; - p->temp[2] = (Byte)val; if (rem > 2) dest[2] = (Byte)val; val >>= 8; - p->temp[3] = (Byte)val; + if ((unsigned)rem > 0) { dest[0] = (Byte)v; v >>= 8; + if ((unsigned)rem > 1) { dest[1] = (Byte)v; v >>= 8; + if ((unsigned)rem > 2) { dest[2] = (Byte)v; v >>= 8; }}} + p->temp = v; p->dest = dest + rem; p->state = BCJ2_DEC_STATE_ORIG_0 + (unsigned)rem; break; } - - SetUi32(dest, val); - p->temp[3] = (Byte)(val >> 24); + SetUi32(dest, v) + v >>= 24; p->dest = dest + 4; } } @@ -252,6 +278,13 @@ p->range <<= 8; p->code = (p->code << 8) | *(p->bufs[BCJ2_STREAM_RC])++; } - return SZ_OK; } + +#undef NUM_ITERS +#undef ONE_ITER +#undef NUM_SHIFT_BITS +#undef kTopValue +#undef kNumBitModelTotalBits +#undef kBitModelTotal +#undef kNumMoveBits
diff --git a/third_party/lzma_sdk/C/Bcj2.h b/third_party/lzma_sdk/C/Bcj2.h index 8824080..4575545 100644 --- a/third_party/lzma_sdk/C/Bcj2.h +++ b/third_party/lzma_sdk/C/Bcj2.h
@@ -1,8 +1,8 @@ -/* Bcj2.h -- BCJ2 Converter for x86 code -2014-11-10 : Igor Pavlov : Public domain */ +/* Bcj2.h -- BCJ2 converter for x86 code (Branch CALL/JUMP variant2) +2023-03-02 : Igor Pavlov : Public domain */ -#ifndef __BCJ2_H -#define __BCJ2_H +#ifndef ZIP7_INC_BCJ2_H +#define ZIP7_INC_BCJ2_H #include "7zTypes.h" @@ -26,37 +26,68 @@ BCJ2_DEC_STATE_ORIG_3, BCJ2_DEC_STATE_ORIG, - BCJ2_DEC_STATE_OK + BCJ2_DEC_STATE_ERROR /* after detected data error */ }; enum { BCJ2_ENC_STATE_ORIG = BCJ2_NUM_STREAMS, - BCJ2_ENC_STATE_OK + BCJ2_ENC_STATE_FINISHED /* it's state after fully encoded stream */ }; -#define BCJ2_IS_32BIT_STREAM(s) ((s) == BCJ2_STREAM_CALL || (s) == BCJ2_STREAM_JUMP) +/* #define BCJ2_IS_32BIT_STREAM(s) ((s) == BCJ2_STREAM_CALL || (s) == BCJ2_STREAM_JUMP) */ +#define BCJ2_IS_32BIT_STREAM(s) ((unsigned)((unsigned)(s) - (unsigned)BCJ2_STREAM_CALL) < 2) /* CBcj2Dec / CBcj2Enc bufs sizes: BUF_SIZE(n) = lims[n] - bufs[n] -bufs sizes for BCJ2_STREAM_CALL and BCJ2_STREAM_JUMP must be mutliply of 4: +bufs sizes for BCJ2_STREAM_CALL and BCJ2_STREAM_JUMP must be multiply of 4: (BUF_SIZE(BCJ2_STREAM_CALL) & 3) == 0 (BUF_SIZE(BCJ2_STREAM_JUMP) & 3) == 0 */ +// typedef UInt32 CBcj2Prob; +typedef UInt16 CBcj2Prob; + +/* +BCJ2 encoder / decoder internal requirements: + - If last bytes of stream contain marker (e8/e8/0f8x), then + there is also encoded symbol (0 : no conversion) in RC stream. + - One case of overlapped instructions is supported, + if last byte of converted instruction is (0f) and next byte is (8x): + marker [xx xx xx 0f] 8x + then the pair (0f 8x) is treated as marker. +*/ + +/* ---------- BCJ2 Decoder ---------- */ + /* CBcj2Dec: -dest is allowed to overlap with bufs[BCJ2_STREAM_MAIN], with the following conditions: +(dest) is allowed to overlap with bufs[BCJ2_STREAM_MAIN], with the following conditions: bufs[BCJ2_STREAM_MAIN] >= dest && - bufs[BCJ2_STREAM_MAIN] - dest >= tempReserv + + bufs[BCJ2_STREAM_MAIN] - dest >= BUF_SIZE(BCJ2_STREAM_CALL) + BUF_SIZE(BCJ2_STREAM_JUMP) - tempReserv = 0 : for first call of Bcj2Dec_Decode - tempReserv = 4 : for any other calls of Bcj2Dec_Decode - overlap with offset = 1 is not allowed + reserve = bufs[BCJ2_STREAM_MAIN] - dest - + ( BUF_SIZE(BCJ2_STREAM_CALL) + + BUF_SIZE(BCJ2_STREAM_JUMP) ) + and additional conditions: + if (it's first call of Bcj2Dec_Decode() after Bcj2Dec_Init()) + { + (reserve != 1) : if (ver < v23.00) + } + else // if there are more than one calls of Bcj2Dec_Decode() after Bcj2Dec_Init()) + { + (reserve >= 6) : if (ver < v23.00) + (reserve >= 4) : if (ver >= v23.00) + We need that (reserve) because after first call of Bcj2Dec_Decode(), + CBcj2Dec::temp can contain up to 4 bytes for writing to (dest). + } + (reserve == 0) is allowed, if we decode full stream via single call of Bcj2Dec_Decode(). + (reserve == 0) also is allowed in case of multi-call, if we use fixed buffers, + and (reserve) is calculated from full (final) sizes of all streams before first call. */ typedef struct @@ -68,22 +99,66 @@ unsigned state; /* BCJ2_STREAM_MAIN has more priority than BCJ2_STATE_ORIG */ - UInt32 ip; - Byte temp[4]; + UInt32 ip; /* property of starting base for decoding */ + UInt32 temp; /* Byte temp[4]; */ UInt32 range; UInt32 code; - UInt16 probs[2 + 256]; + CBcj2Prob probs[2 + 256]; } CBcj2Dec; + +/* Note: + Bcj2Dec_Init() sets (CBcj2Dec::ip = 0) + if (ip != 0) property is required, the caller must set CBcj2Dec::ip after Bcj2Dec_Init() +*/ void Bcj2Dec_Init(CBcj2Dec *p); -/* Returns: SZ_OK or SZ_ERROR_DATA */ + +/* Bcj2Dec_Decode(): + returns: + SZ_OK + SZ_ERROR_DATA : if data in 5 starting bytes of BCJ2_STREAM_RC stream are not correct +*/ SRes Bcj2Dec_Decode(CBcj2Dec *p); -#define Bcj2Dec_IsFinished(_p_) ((_p_)->code == 0) +/* To check that decoding was finished you can compare + sizes of processed streams with sizes known from another sources. + You must do at least one mandatory check from the two following options: + - the check for size of processed output (ORIG) stream. + - the check for size of processed input (MAIN) stream. + additional optional checks: + - the checks for processed sizes of all input streams (MAIN, CALL, JUMP, RC) + - the checks Bcj2Dec_IsMaybeFinished*() + also before actual decoding you can check that the + following condition is met for stream sizes: + ( size(ORIG) == size(MAIN) + size(CALL) + size(JUMP) ) +*/ + +/* (state == BCJ2_STREAM_MAIN) means that decoder is ready for + additional input data in BCJ2_STREAM_MAIN stream. + Note that (state == BCJ2_STREAM_MAIN) is allowed for non-finished decoding. +*/ +#define Bcj2Dec_IsMaybeFinished_state_MAIN(_p_) ((_p_)->state == BCJ2_STREAM_MAIN) + +/* if the stream decoding was finished correctly, then range decoder + part of CBcj2Dec also was finished, and then (CBcj2Dec::code == 0). + Note that (CBcj2Dec::code == 0) is allowed for non-finished decoding. +*/ +#define Bcj2Dec_IsMaybeFinished_code(_p_) ((_p_)->code == 0) + +/* use Bcj2Dec_IsMaybeFinished() only as additional check + after at least one mandatory check from the two following options: + - the check for size of processed output (ORIG) stream. + - the check for size of processed input (MAIN) stream. +*/ +#define Bcj2Dec_IsMaybeFinished(_p_) ( \ + Bcj2Dec_IsMaybeFinished_state_MAIN(_p_) && \ + Bcj2Dec_IsMaybeFinished_code(_p_)) +/* ---------- BCJ2 Encoder ---------- */ + typedef enum { BCJ2_ENC_FINISH_MODE_CONTINUE, @@ -91,6 +166,91 @@ BCJ2_ENC_FINISH_MODE_END_STREAM } EBcj2Enc_FinishMode; +/* + BCJ2_ENC_FINISH_MODE_CONTINUE: + process non finished encoding. + It notifies the encoder that additional further calls + can provide more input data (src) than provided by current call. + In that case the CBcj2Enc encoder still can move (src) pointer + up to (srcLim), but CBcj2Enc encoder can store some of the last + processed bytes (up to 4 bytes) from src to internal CBcj2Enc::temp[] buffer. + at return: + (CBcj2Enc::src will point to position that includes + processed data and data copied to (temp[]) buffer) + That data from (temp[]) buffer will be used in further calls. + + BCJ2_ENC_FINISH_MODE_END_BLOCK: + finish encoding of current block (ended at srcLim) without RC flushing. + at return: if (CBcj2Enc::state == BCJ2_ENC_STATE_ORIG) && + CBcj2Enc::src == CBcj2Enc::srcLim) + : it shows that block encoding was finished. And the encoder is + ready for new (src) data or for stream finish operation. + finished block means + { + CBcj2Enc has completed block encoding up to (srcLim). + (1 + 4 bytes) or (2 + 4 bytes) CALL/JUMP cortages will + not cross block boundary at (srcLim). + temporary CBcj2Enc buffer for (ORIG) src data is empty. + 3 output uncompressed streams (MAIN, CALL, JUMP) were flushed. + RC stream was not flushed. And RC stream will cross block boundary. + } + Note: some possible implementation of BCJ2 encoder could + write branch marker (e8/e8/0f8x) in one call of Bcj2Enc_Encode(), + and it could calculate symbol for RC in another call of Bcj2Enc_Encode(). + BCJ2 encoder uses ip/fileIp/fileSize/relatLimit values to calculate RC symbol. + And these CBcj2Enc variables can have different values in different Bcj2Enc_Encode() calls. + So caller must finish each block with BCJ2_ENC_FINISH_MODE_END_BLOCK + to ensure that RC symbol is calculated and written in proper block. + + BCJ2_ENC_FINISH_MODE_END_STREAM + finish encoding of stream (ended at srcLim) fully including RC flushing. + at return: if (CBcj2Enc::state == BCJ2_ENC_STATE_FINISHED) + : it shows that stream encoding was finished fully, + and all output streams were flushed fully. + also Bcj2Enc_IsFinished() can be called. +*/ + + +/* + 32-bit relative offset in JUMP/CALL commands is + - (mod 4 GiB) for 32-bit x86 code + - signed Int32 for 64-bit x86-64 code + BCJ2 encoder also does internal relative to absolute address conversions. + And there are 2 possible ways to do it: + before v23: we used 32-bit variables and (mod 4 GiB) conversion + since v23: we use 64-bit variables and (signed Int32 offset) conversion. + The absolute address condition for conversion in v23: + ((UInt64)((Int64)ip64 - (Int64)fileIp64 + 5 + (Int32)offset) < (UInt64)fileSize64) + note that if (fileSize64 > 2 GiB). there is difference between + old (mod 4 GiB) way (v22) and new (signed Int32 offset) way (v23). + And new (v23) way is more suitable to encode 64-bit x86-64 code for (fileSize64 > 2 GiB) cases. +*/ + +/* +// for old (v22) way for conversion: +typedef UInt32 CBcj2Enc_ip_unsigned; +typedef Int32 CBcj2Enc_ip_signed; +#define BCJ2_ENC_FileSize_MAX ((UInt32)1 << 31) +*/ +typedef UInt64 CBcj2Enc_ip_unsigned; +typedef Int64 CBcj2Enc_ip_signed; + +/* maximum size of file that can be used for conversion condition */ +#define BCJ2_ENC_FileSize_MAX ((CBcj2Enc_ip_unsigned)0 - 2) + +/* default value of fileSize64_minus1 variable that means + that absolute address limitation will not be used */ +#define BCJ2_ENC_FileSizeField_UNLIMITED ((CBcj2Enc_ip_unsigned)0 - 1) + +/* calculate value that later can be set to CBcj2Enc::fileSize64_minus1 */ +#define BCJ2_ENC_GET_FileSizeField_VAL_FROM_FileSize(fileSize) \ + ((CBcj2Enc_ip_unsigned)(fileSize) - 1) + +/* set CBcj2Enc::fileSize64_minus1 variable from size of file */ +#define Bcj2Enc_SET_FileSize(p, fileSize) \ + (p)->fileSize64_minus1 = BCJ2_ENC_GET_FileSizeField_VAL_FROM_FileSize(fileSize); + + typedef struct { Byte *bufs[BCJ2_NUM_STREAMS]; @@ -101,45 +261,71 @@ unsigned state; EBcj2Enc_FinishMode finishMode; - Byte prevByte; + Byte context; + Byte flushRem; + Byte isFlushState; Byte cache; UInt32 range; UInt64 low; UInt64 cacheSize; + + // UInt32 context; // for marker version, it can include marker flag. - UInt32 ip; - - /* 32-bit ralative offset in JUMP/CALL commands is - - (mod 4 GB) in 32-bit mode - - signed Int32 in 64-bit mode - We use (mod 4 GB) check for fileSize. - Use fileSize up to 2 GB, if you want to support 32-bit and 64-bit code conversion. */ - UInt32 fileIp; - UInt32 fileSize; /* (fileSize <= ((UInt32)1 << 31)), 0 means no_limit */ - UInt32 relatLimit; /* (relatLimit <= ((UInt32)1 << 31)), 0 means desable_conversion */ + /* (ip64) and (fileIp64) correspond to virtual source stream position + that doesn't include data in temp[] */ + CBcj2Enc_ip_unsigned ip64; /* current (ip) position */ + CBcj2Enc_ip_unsigned fileIp64; /* start (ip) position of current file */ + CBcj2Enc_ip_unsigned fileSize64_minus1; /* size of current file (for conversion limitation) */ + UInt32 relatLimit; /* (relatLimit <= ((UInt32)1 << 31)) : 0 means disable_conversion */ + // UInt32 relatExcludeBits; UInt32 tempTarget; - unsigned tempPos; - Byte temp[4 * 2]; - - unsigned flushPos; - - UInt16 probs[2 + 256]; + unsigned tempPos; /* the number of bytes that were copied to temp[] buffer + (tempPos <= 4) outside of Bcj2Enc_Encode() */ + // Byte temp[4]; // for marker version + Byte temp[8]; + CBcj2Prob probs[2 + 256]; } CBcj2Enc; void Bcj2Enc_Init(CBcj2Enc *p); + + +/* +Bcj2Enc_Encode(): at exit: + p->State < BCJ2_NUM_STREAMS : we need more buffer space for output stream + (bufs[p->State] == lims[p->State]) + p->State == BCJ2_ENC_STATE_ORIG : we need more data in input src stream + (src == srcLim) + p->State == BCJ2_ENC_STATE_FINISHED : after fully encoded stream +*/ void Bcj2Enc_Encode(CBcj2Enc *p); -#define Bcj2Enc_Get_InputData_Size(p) ((SizeT)((p)->srcLim - (p)->src) + (p)->tempPos) -#define Bcj2Enc_IsFinished(p) ((p)->flushPos == 5) +/* Bcj2Enc encoder can look ahead for up 4 bytes of source stream. + CBcj2Enc::tempPos : is the number of bytes that were copied from input stream to temp[] buffer. + (CBcj2Enc::src) after Bcj2Enc_Encode() is starting position after + fully processed data and after data copied to temp buffer. + So if the caller needs to get real number of fully processed input + bytes (without look ahead data in temp buffer), + the caller must subtruct (CBcj2Enc::tempPos) value from processed size + value that is calculated based on current (CBcj2Enc::src): + cur_processed_pos = Calc_Big_Processed_Pos(enc.src)) - + Bcj2Enc_Get_AvailInputSize_in_Temp(&enc); +*/ +/* get the size of input data that was stored in temp[] buffer: */ +#define Bcj2Enc_Get_AvailInputSize_in_Temp(p) ((p)->tempPos) +#define Bcj2Enc_IsFinished(p) ((p)->flushRem == 0) -#define BCJ2_RELAT_LIMIT_NUM_BITS 26 -#define BCJ2_RELAT_LIMIT ((UInt32)1 << BCJ2_RELAT_LIMIT_NUM_BITS) - -/* limit for CBcj2Enc::fileSize variable */ -#define BCJ2_FileSize_MAX ((UInt32)1 << 31) +/* Note : the decoder supports overlapping of marker (0f 80). + But we can eliminate such overlapping cases by setting + the limit for relative offset conversion as + CBcj2Enc::relatLimit <= (0x0f << 24) == (240 MiB) +*/ +/* default value for CBcj2Enc::relatLimit */ +#define BCJ2_ENC_RELAT_LIMIT_DEFAULT ((UInt32)0x0f << 24) +#define BCJ2_ENC_RELAT_LIMIT_MAX ((UInt32)1 << 31) +// #define BCJ2_RELAT_EXCLUDE_NUM_BITS 5 EXTERN_C_END
diff --git a/third_party/lzma_sdk/C/Bra.c b/third_party/lzma_sdk/C/Bra.c index 3b854d9c..e61edf8f 100644 --- a/third_party/lzma_sdk/C/Bra.c +++ b/third_party/lzma_sdk/C/Bra.c
@@ -1,230 +1,709 @@ -/* Bra.c -- Converters for RISC code -2021-02-09 : Igor Pavlov : Public domain */ +/* Bra.c -- Branch converters for RISC code +2024-01-20 : Igor Pavlov : Public domain */ #include "Precomp.h" -#include "CpuArch.h" #include "Bra.h" +#include "RotateDefs.h" +#include "CpuArch.h" -SizeT ARM_Convert(Byte *data, SizeT size, UInt32 ip, int encoding) +#if defined(MY_CPU_SIZEOF_POINTER) \ + && ( MY_CPU_SIZEOF_POINTER == 4 \ + || MY_CPU_SIZEOF_POINTER == 8) + #define BR_CONV_USE_OPT_PC_PTR +#endif + +#ifdef BR_CONV_USE_OPT_PC_PTR +#define BR_PC_INIT pc -= (UInt32)(SizeT)p; +#define BR_PC_GET (pc + (UInt32)(SizeT)p) +#else +#define BR_PC_INIT pc += (UInt32)size; +#define BR_PC_GET (pc - (UInt32)(SizeT)(lim - p)) +// #define BR_PC_INIT +// #define BR_PC_GET (pc + (UInt32)(SizeT)(p - data)) +#endif + +#define BR_CONVERT_VAL(v, c) if (encoding) v += c; else v -= c; +// #define BR_CONVERT_VAL(v, c) if (!encoding) c = (UInt32)0 - c; v += c; + +#define Z7_BRANCH_CONV(name) z7_ ## name + +#define Z7_BRANCH_FUNC_MAIN(name) \ +static \ +Z7_FORCE_INLINE \ +Z7_ATTRIB_NO_VECTOR \ +Byte *Z7_BRANCH_CONV(name)(Byte *p, SizeT size, UInt32 pc, int encoding) + +#define Z7_BRANCH_FUNC_IMP(name, m, encoding) \ +Z7_NO_INLINE \ +Z7_ATTRIB_NO_VECTOR \ +Byte *m(name)(Byte *data, SizeT size, UInt32 pc) \ + { return Z7_BRANCH_CONV(name)(data, size, pc, encoding); } \ + +#ifdef Z7_EXTRACT_ONLY +#define Z7_BRANCH_FUNCS_IMP(name) \ + Z7_BRANCH_FUNC_IMP(name, Z7_BRANCH_CONV_DEC_2, 0) +#else +#define Z7_BRANCH_FUNCS_IMP(name) \ + Z7_BRANCH_FUNC_IMP(name, Z7_BRANCH_CONV_DEC_2, 0) \ + Z7_BRANCH_FUNC_IMP(name, Z7_BRANCH_CONV_ENC_2, 1) +#endif + +#if defined(__clang__) +#define BR_EXTERNAL_FOR +#define BR_NEXT_ITERATION continue; +#else +#define BR_EXTERNAL_FOR for (;;) +#define BR_NEXT_ITERATION break; +#endif + +#if defined(__clang__) && (__clang_major__ >= 8) \ + || defined(__GNUC__) && (__GNUC__ >= 1000) \ + // GCC is not good for __builtin_expect() here + /* || defined(_MSC_VER) && (_MSC_VER >= 1920) */ + // #define Z7_unlikely [[unlikely]] + // #define Z7_LIKELY(x) (__builtin_expect((x), 1)) + #define Z7_UNLIKELY(x) (__builtin_expect((x), 0)) + // #define Z7_likely [[likely]] +#else + // #define Z7_LIKELY(x) (x) + #define Z7_UNLIKELY(x) (x) + // #define Z7_likely +#endif + + +Z7_BRANCH_FUNC_MAIN(BranchConv_ARM64) { - Byte *p; + // Byte *p = data; const Byte *lim; - size &= ~(size_t)3; - ip += 4; - p = data; - lim = data + size; - - if (encoding) - - for (;;) + const UInt32 flag = (UInt32)1 << (24 - 4); + const UInt32 mask = ((UInt32)1 << 24) - (flag << 1); + size &= ~(SizeT)3; + // if (size == 0) return p; + lim = p + size; + BR_PC_INIT + pc -= 4; // because (p) will point to next instruction + + BR_EXTERNAL_FOR { + // Z7_PRAGMA_OPT_DISABLE_LOOP_UNROLL_VECTORIZE for (;;) { - if (p >= lim) - return (SizeT)(p - data); + UInt32 v; + if Z7_UNLIKELY(p == lim) + return p; + v = GetUi32a(p); p += 4; - if (p[-1] == 0xEB) - break; - } - { - UInt32 v = GetUi32(p - 4); - v <<= 2; - v += ip + (UInt32)(p - data); - v >>= 2; - v &= 0x00FFFFFF; - v |= 0xEB000000; - SetUi32(p - 4, v); - } - } - - for (;;) - { - for (;;) - { - if (p >= lim) - return (SizeT)(p - data); - p += 4; - if (p[-1] == 0xEB) - break; - } - { - UInt32 v = GetUi32(p - 4); - v <<= 2; - v -= ip + (UInt32)(p - data); - v >>= 2; - v &= 0x00FFFFFF; - v |= 0xEB000000; - SetUi32(p - 4, v); + if Z7_UNLIKELY(((v - 0x94000000) & 0xfc000000) == 0) + { + UInt32 c = BR_PC_GET >> 2; + BR_CONVERT_VAL(v, c) + v &= 0x03ffffff; + v |= 0x94000000; + SetUi32a(p - 4, v) + BR_NEXT_ITERATION + } + // v = rotlFixed(v, 8); v += (flag << 8) - 0x90; if Z7_UNLIKELY((v & ((mask << 8) + 0x9f)) == 0) + v -= 0x90000000; if Z7_UNLIKELY((v & 0x9f000000) == 0) + { + UInt32 z, c; + // v = rotrFixed(v, 8); + v += flag; if Z7_UNLIKELY(v & mask) continue; + z = (v & 0xffffffe0) | (v >> 26); + c = (BR_PC_GET >> (12 - 3)) & ~(UInt32)7; + BR_CONVERT_VAL(z, c) + v &= 0x1f; + v |= 0x90000000; + v |= z << 26; + v |= 0x00ffffe0 & ((z & (((flag << 1) - 1))) - flag); + SetUi32a(p - 4, v) + } } } } +Z7_BRANCH_FUNCS_IMP(BranchConv_ARM64) -SizeT ARMT_Convert(Byte *data, SizeT size, UInt32 ip, int encoding) +Z7_BRANCH_FUNC_MAIN(BranchConv_ARM) { - Byte *p; + // Byte *p = data; const Byte *lim; - size &= ~(size_t)1; - p = data; - lim = data + size - 4; - - if (encoding) + size &= ~(SizeT)3; + lim = p + size; + BR_PC_INIT + /* in ARM: branch offset is relative to the +2 instructions from current instruction. + (p) will point to next instruction */ + pc += 8 - 4; for (;;) { - UInt32 b1; for (;;) { - UInt32 b3; - if (p > lim) - return (SizeT)(p - data); - b1 = p[1]; - b3 = p[3]; - p += 2; - b1 ^= 8; - if ((b3 & b1) >= 0xF8) - break; + if Z7_UNLIKELY(p >= lim) { return p; } p += 4; if Z7_UNLIKELY(p[-1] == 0xeb) break; + if Z7_UNLIKELY(p >= lim) { return p; } p += 4; if Z7_UNLIKELY(p[-1] == 0xeb) break; } { - UInt32 v = - ((UInt32)b1 << 19) - + (((UInt32)p[1] & 0x7) << 8) - + (((UInt32)p[-2] << 11)) - + (p[0]); - - p += 2; - { - UInt32 cur = (ip + (UInt32)(p - data)) >> 1; - v += cur; - } - - p[-4] = (Byte)(v >> 11); - p[-3] = (Byte)(0xF0 | ((v >> 19) & 0x7)); - p[-2] = (Byte)v; - p[-1] = (Byte)(0xF8 | (v >> 8)); - } - } - - for (;;) - { - UInt32 b1; - for (;;) - { - UInt32 b3; - if (p > lim) - return (SizeT)(p - data); - b1 = p[1]; - b3 = p[3]; - p += 2; - b1 ^= 8; - if ((b3 & b1) >= 0xF8) - break; - } - { - UInt32 v = - ((UInt32)b1 << 19) - + (((UInt32)p[1] & 0x7) << 8) - + (((UInt32)p[-2] << 11)) - + (p[0]); - - p += 2; - { - UInt32 cur = (ip + (UInt32)(p - data)) >> 1; - v -= cur; - } - - /* - SetUi16(p - 4, (UInt16)(((v >> 11) & 0x7FF) | 0xF000)); - SetUi16(p - 2, (UInt16)(v | 0xF800)); - */ - - p[-4] = (Byte)(v >> 11); - p[-3] = (Byte)(0xF0 | ((v >> 19) & 0x7)); - p[-2] = (Byte)v; - p[-1] = (Byte)(0xF8 | (v >> 8)); + UInt32 v = GetUi32a(p - 4); + UInt32 c = BR_PC_GET >> 2; + BR_CONVERT_VAL(v, c) + v &= 0x00ffffff; + v |= 0xeb000000; + SetUi32a(p - 4, v) } } } +Z7_BRANCH_FUNCS_IMP(BranchConv_ARM) -SizeT PPC_Convert(Byte *data, SizeT size, UInt32 ip, int encoding) +Z7_BRANCH_FUNC_MAIN(BranchConv_PPC) { - Byte *p; + // Byte *p = data; const Byte *lim; - size &= ~(size_t)3; - ip -= 4; - p = data; - lim = data + size; - + size &= ~(SizeT)3; + lim = p + size; + BR_PC_INIT + pc -= 4; // because (p) will point to next instruction + for (;;) { + UInt32 v; for (;;) { - if (p >= lim) - return (SizeT)(p - data); + if Z7_UNLIKELY(p == lim) + return p; + // v = GetBe32a(p); + v = *(UInt32 *)(void *)p; p += 4; - /* if ((v & 0xFC000003) == 0x48000001) */ - if ((p[-4] & 0xFC) == 0x48 && (p[-1] & 3) == 1) - break; + // if ((v & 0xfc000003) == 0x48000001) break; + // if ((p[-4] & 0xFC) == 0x48 && (p[-1] & 3) == 1) break; + if Z7_UNLIKELY( + ((v - Z7_CONV_BE_TO_NATIVE_CONST32(0x48000001)) + & Z7_CONV_BE_TO_NATIVE_CONST32(0xfc000003)) == 0) break; } { - UInt32 v = GetBe32(p - 4); - if (encoding) - v += ip + (UInt32)(p - data); - else - v -= ip + (UInt32)(p - data); - v &= 0x03FFFFFF; + v = Z7_CONV_NATIVE_TO_BE_32(v); + { + UInt32 c = BR_PC_GET; + BR_CONVERT_VAL(v, c) + } + v &= 0x03ffffff; v |= 0x48000000; - SetBe32(p - 4, v); + SetBe32a(p - 4, v) } } } +Z7_BRANCH_FUNCS_IMP(BranchConv_PPC) -SizeT SPARC_Convert(Byte *data, SizeT size, UInt32 ip, int encoding) +#ifdef Z7_CPU_FAST_ROTATE_SUPPORTED +#define BR_SPARC_USE_ROTATE +#endif + +Z7_BRANCH_FUNC_MAIN(BranchConv_SPARC) { - Byte *p; + // Byte *p = data; const Byte *lim; - size &= ~(size_t)3; - ip -= 4; - p = data; - lim = data + size; - + const UInt32 flag = (UInt32)1 << 22; + size &= ~(SizeT)3; + lim = p + size; + BR_PC_INIT + pc -= 4; // because (p) will point to next instruction for (;;) { + UInt32 v; for (;;) { - if (p >= lim) - return (SizeT)(p - data); - /* - v = GetBe32(p); - p += 4; - m = v + ((UInt32)5 << 29); - m ^= (UInt32)7 << 29; - m += (UInt32)1 << 22; - if ((m & ((UInt32)0x1FF << 23)) == 0) - break; + if Z7_UNLIKELY(p == lim) + return p; + /* // the code without GetBe32a(): + { const UInt32 v = GetUi16a(p) & 0xc0ff; p += 4; if (v == 0x40 || v == 0xc07f) break; } */ + v = GetBe32a(p); p += 4; - if ((p[-4] == 0x40 && (p[-3] & 0xC0) == 0) || - (p[-4] == 0x7F && (p[-3] >= 0xC0))) + #ifdef BR_SPARC_USE_ROTATE + v = rotlFixed(v, 2); + v += (flag << 2) - 1; + if Z7_UNLIKELY((v & (3 - (flag << 3))) == 0) + #else + v += (UInt32)5 << 29; + v ^= (UInt32)7 << 29; + v += flag; + if Z7_UNLIKELY((v & (0 - (flag << 1))) == 0) + #endif break; } { - UInt32 v = GetBe32(p - 4); + // UInt32 v = GetBe32a(p - 4); + #ifndef BR_SPARC_USE_ROTATE v <<= 2; - if (encoding) - v += ip + (UInt32)(p - data); - else - v -= ip + (UInt32)(p - data); - - v &= 0x01FFFFFF; - v -= (UInt32)1 << 24; - v ^= 0xFF000000; + #endif + { + UInt32 c = BR_PC_GET; + BR_CONVERT_VAL(v, c) + } + v &= (flag << 3) - 1; + #ifdef BR_SPARC_USE_ROTATE + v -= (flag << 2) - 1; + v = rotrFixed(v, 2); + #else + v -= (flag << 2); v >>= 2; - v |= 0x40000000; - SetBe32(p - 4, v); + v |= (UInt32)1 << 30; + #endif + SetBe32a(p - 4, v) } } } +Z7_BRANCH_FUNCS_IMP(BranchConv_SPARC) + + +Z7_BRANCH_FUNC_MAIN(BranchConv_ARMT) +{ + // Byte *p = data; + Byte *lim; + size &= ~(SizeT)1; + // if (size == 0) return p; + if (size <= 2) return p; + size -= 2; + lim = p + size; + BR_PC_INIT + /* in ARM: branch offset is relative to the +2 instructions from current instruction. + (p) will point to the +2 instructions from current instruction */ + // pc += 4 - 4; + // if (encoding) pc -= 0xf800 << 1; else pc += 0xf800 << 1; + // #define ARMT_TAIL_PROC { goto armt_tail; } + #define ARMT_TAIL_PROC { return p; } + + do + { + /* in MSVC 32-bit x86 compilers: + UInt32 version : it loads value from memory with movzx + Byte version : it loads value to 8-bit register (AL/CL) + movzx version is slightly faster in some cpus + */ + unsigned b1; + // Byte / unsigned + b1 = p[1]; + // optimized version to reduce one (p >= lim) check: + // unsigned a1 = p[1]; b1 = p[3]; p += 2; if Z7_LIKELY((b1 & (a1 ^ 8)) < 0xf8) + for (;;) + { + unsigned b3; // Byte / UInt32 + /* (Byte)(b3) normalization can use low byte computations in MSVC. + It gives smaller code, and no loss of speed in some compilers/cpus. + But new MSVC 32-bit x86 compilers use more slow load + from memory to low byte register in that case. + So we try to use full 32-bit computations for faster code. + */ + // if (p >= lim) { ARMT_TAIL_PROC } b3 = b1 + 8; b1 = p[3]; p += 2; if ((b3 & b1) >= 0xf8) break; + if Z7_UNLIKELY(p >= lim) { ARMT_TAIL_PROC } b3 = p[3]; p += 2; if Z7_UNLIKELY((b3 & (b1 ^ 8)) >= 0xf8) break; + if Z7_UNLIKELY(p >= lim) { ARMT_TAIL_PROC } b1 = p[3]; p += 2; if Z7_UNLIKELY((b1 & (b3 ^ 8)) >= 0xf8) break; + } + { + /* we can adjust pc for (0xf800) to rid of (& 0x7FF) operation. + But gcc/clang for arm64 can use bfi instruction for full code here */ + UInt32 v = + ((UInt32)GetUi16a(p - 2) << 11) | + ((UInt32)GetUi16a(p) & 0x7FF); + /* + UInt32 v = + ((UInt32)p[1 - 2] << 19) + + (((UInt32)p[1] & 0x7) << 8) + + (((UInt32)p[-2] << 11)) + + (p[0]); + */ + p += 2; + { + UInt32 c = BR_PC_GET >> 1; + BR_CONVERT_VAL(v, c) + } + SetUi16a(p - 4, (UInt16)(((v >> 11) & 0x7ff) | 0xf000)) + SetUi16a(p - 2, (UInt16)(v | 0xf800)) + /* + p[-4] = (Byte)(v >> 11); + p[-3] = (Byte)(0xf0 | ((v >> 19) & 0x7)); + p[-2] = (Byte)v; + p[-1] = (Byte)(0xf8 | (v >> 8)); + */ + } + } + while (p < lim); + return p; + // armt_tail: + // if ((Byte)((lim[1] & 0xf8)) != 0xf0) { lim += 2; } return lim; + // return (Byte *)(lim + ((Byte)((lim[1] ^ 0xf0) & 0xf8) == 0 ? 0 : 2)); + // return (Byte *)(lim + (((lim[1] ^ ~0xfu) & ~7u) == 0 ? 0 : 2)); + // return (Byte *)(lim + 2 - (((((unsigned)lim[1] ^ 8) + 8) >> 7) & 2)); +} +Z7_BRANCH_FUNCS_IMP(BranchConv_ARMT) + + +// #define BR_IA64_NO_INLINE + +Z7_BRANCH_FUNC_MAIN(BranchConv_IA64) +{ + // Byte *p = data; + const Byte *lim; + size &= ~(SizeT)15; + lim = p + size; + pc -= 1 << 4; + pc >>= 4 - 1; + // pc -= 1 << 1; + + for (;;) + { + unsigned m; + for (;;) + { + if Z7_UNLIKELY(p == lim) + return p; + m = (unsigned)((UInt32)0x334b0000 >> (*p & 0x1e)); + p += 16; + pc += 1 << 1; + if (m &= 3) + break; + } + { + p += (ptrdiff_t)m * 5 - 20; // negative value is expected here. + do + { + const UInt32 t = + #if defined(MY_CPU_X86_OR_AMD64) + // we use 32-bit load here to reduce code size on x86: + GetUi32(p); + #else + GetUi16(p); + #endif + UInt32 z = GetUi32(p + 1) >> m; + p += 5; + if (((t >> m) & (0x70 << 1)) == 0 + && ((z - (0x5000000 << 1)) & (0xf000000 << 1)) == 0) + { + UInt32 v = (UInt32)((0x8fffff << 1) | 1) & z; + z ^= v; + #ifdef BR_IA64_NO_INLINE + v |= (v & ((UInt32)1 << (23 + 1))) >> 3; + { + UInt32 c = pc; + BR_CONVERT_VAL(v, c) + } + v &= (0x1fffff << 1) | 1; + #else + { + if (encoding) + { + // pc &= ~(0xc00000 << 1); // we just need to clear at least 2 bits + pc &= (0x1fffff << 1) | 1; + v += pc; + } + else + { + // pc |= 0xc00000 << 1; // we need to set at least 2 bits + pc |= ~(UInt32)((0x1fffff << 1) | 1); + v -= pc; + } + } + v &= ~(UInt32)(0x600000 << 1); + #endif + v += (0x700000 << 1); + v &= (0x8fffff << 1) | 1; + z |= v; + z <<= m; + SetUi32(p + 1 - 5, z) + } + m++; + } + while (m &= 3); // while (m < 4); + } + } +} +Z7_BRANCH_FUNCS_IMP(BranchConv_IA64) + + +#define BR_CONVERT_VAL_ENC(v) v += BR_PC_GET; +#define BR_CONVERT_VAL_DEC(v) v -= BR_PC_GET; + +#if 1 && defined(MY_CPU_LE_UNALIGN) + #define RISCV_USE_UNALIGNED_LOAD +#endif + +#ifdef RISCV_USE_UNALIGNED_LOAD + #define RISCV_GET_UI32(p) GetUi32(p) + #define RISCV_SET_UI32(p, v) { SetUi32(p, v) } +#else + #define RISCV_GET_UI32(p) \ + ((UInt32)GetUi16a(p) + \ + ((UInt32)GetUi16a((p) + 2) << 16)) + #define RISCV_SET_UI32(p, v) { \ + SetUi16a(p, (UInt16)(v)) \ + SetUi16a((p) + 2, (UInt16)(v >> 16)) } +#endif + +#if 1 && defined(MY_CPU_LE) + #define RISCV_USE_16BIT_LOAD +#endif + +#ifdef RISCV_USE_16BIT_LOAD + #define RISCV_LOAD_VAL(p) GetUi16a(p) +#else + #define RISCV_LOAD_VAL(p) (*(p)) +#endif + +#define RISCV_INSTR_SIZE 2 +#define RISCV_STEP_1 (4 + RISCV_INSTR_SIZE) +#define RISCV_STEP_2 4 +#define RISCV_REG_VAL (2 << 7) +#define RISCV_CMD_VAL 3 +#if 1 + // for code size optimization: + #define RISCV_DELTA_7F 0x7f +#else + #define RISCV_DELTA_7F 0 +#endif + +#define RISCV_CHECK_1(v, b) \ + (((((b) - RISCV_CMD_VAL) ^ ((v) << 8)) & (0xf8000 + RISCV_CMD_VAL)) == 0) + +#if 1 + #define RISCV_CHECK_2(v, r) \ + ((((v) - ((RISCV_CMD_VAL << 12) | RISCV_REG_VAL | 8)) \ + << 18) \ + < ((r) & 0x1d)) +#else + // this branch gives larger code, because + // compilers generate larger code for big constants. + #define RISCV_CHECK_2(v, r) \ + ((((v) - ((RISCV_CMD_VAL << 12) | RISCV_REG_VAL)) \ + & ((RISCV_CMD_VAL << 12) | RISCV_REG_VAL)) \ + < ((r) & 0x1d)) +#endif + + +#define RISCV_SCAN_LOOP \ + Byte *lim; \ + size &= ~(SizeT)(RISCV_INSTR_SIZE - 1); \ + if (size <= 6) return p; \ + size -= 6; \ + lim = p + size; \ + BR_PC_INIT \ + for (;;) \ + { \ + UInt32 a, v; \ + /* Z7_PRAGMA_OPT_DISABLE_LOOP_UNROLL_VECTORIZE */ \ + for (;;) \ + { \ + if Z7_UNLIKELY(p >= lim) { return p; } \ + a = (RISCV_LOAD_VAL(p) ^ 0x10u) + 1; \ + if ((a & 0x77) == 0) break; \ + a = (RISCV_LOAD_VAL(p + RISCV_INSTR_SIZE) ^ 0x10u) + 1; \ + p += RISCV_INSTR_SIZE * 2; \ + if ((a & 0x77) == 0) \ + { \ + p -= RISCV_INSTR_SIZE; \ + if Z7_UNLIKELY(p >= lim) { return p; } \ + break; \ + } \ + } +// (xx6f ^ 10) + 1 = xx7f + 1 = xx80 : JAL +// (xxef ^ 10) + 1 = xxff + 1 = xx00 + 100 : JAL +// (xx17 ^ 10) + 1 = xx07 + 1 = xx08 : AUIPC +// (xx97 ^ 10) + 1 = xx87 + 1 = xx88 : AUIPC + +Byte * Z7_BRANCH_CONV_ENC(RISCV)(Byte *p, SizeT size, UInt32 pc) +{ + RISCV_SCAN_LOOP + v = a; + a = RISCV_GET_UI32(p); +#ifndef RISCV_USE_16BIT_LOAD + v += (UInt32)p[1] << 8; +#endif + + if ((v & 8) == 0) // JAL + { + if ((v - (0x100 /* - RISCV_DELTA_7F */)) & 0xd80) + { + p += RISCV_INSTR_SIZE; + continue; + } + { + v = ((a & 1u << 31) >> 11) + | ((a & 0x3ff << 21) >> 20) + | ((a & 1 << 20) >> 9) + | (a & 0xff << 12); + BR_CONVERT_VAL_ENC(v) + // ((v & 1) == 0) + // v: bits [1 : 20] contain offset bits +#if 0 && defined(RISCV_USE_UNALIGNED_LOAD) + a &= 0xfff; + a |= ((UInt32)(v << 23)) + | ((UInt32)(v << 7) & ((UInt32)0xff << 16)) + | ((UInt32)(v >> 5) & ((UInt32)0xf0 << 8)); + RISCV_SET_UI32(p, a) +#else // aligned +#if 0 + SetUi16a(p, (UInt16)(((v >> 5) & 0xf000) | (a & 0xfff))) +#else + p[1] = (Byte)(((v >> 13) & 0xf0) | ((a >> 8) & 0xf)); +#endif + +#if 1 && defined(Z7_CPU_FAST_BSWAP_SUPPORTED) && defined(MY_CPU_LE) + v <<= 15; + v = Z7_BSWAP32(v); + SetUi16a(p + 2, (UInt16)v) +#else + p[2] = (Byte)(v >> 9); + p[3] = (Byte)(v >> 1); +#endif +#endif // aligned + } + p += 4; + continue; + } // JAL + + { + // AUIPC + if (v & 0xe80) // (not x0) and (not x2) + { + const UInt32 b = RISCV_GET_UI32(p + 4); + if (RISCV_CHECK_1(v, b)) + { + { + const UInt32 temp = (b << 12) | (0x17 + RISCV_REG_VAL); + RISCV_SET_UI32(p, temp) + } + a &= 0xfffff000; + { +#if 1 + const int t = -1 >> 1; + if (t != -1) + a += (b >> 20) - ((b >> 19) & 0x1000); // arithmetic right shift emulation + else +#endif + a += (UInt32)((Int32)b >> 20); // arithmetic right shift (sign-extension). + } + BR_CONVERT_VAL_ENC(a) +#if 1 && defined(Z7_CPU_FAST_BSWAP_SUPPORTED) && defined(MY_CPU_LE) + a = Z7_BSWAP32(a); + RISCV_SET_UI32(p + 4, a) +#else + SetBe32(p + 4, a) +#endif + p += 8; + } + else + p += RISCV_STEP_1; + } + else + { + UInt32 r = a >> 27; + if (RISCV_CHECK_2(v, r)) + { + v = RISCV_GET_UI32(p + 4); + r = (r << 7) + 0x17 + (v & 0xfffff000); + a = (a >> 12) | (v << 20); + RISCV_SET_UI32(p, r) + RISCV_SET_UI32(p + 4, a) + p += 8; + } + else + p += RISCV_STEP_2; + } + } + } // for +} + + +Byte * Z7_BRANCH_CONV_DEC(RISCV)(Byte *p, SizeT size, UInt32 pc) +{ + RISCV_SCAN_LOOP +#ifdef RISCV_USE_16BIT_LOAD + if ((a & 8) == 0) + { +#else + v = a; + a += (UInt32)p[1] << 8; + if ((v & 8) == 0) + { +#endif + // JAL + a -= 0x100 - RISCV_DELTA_7F; + if (a & 0xd80) + { + p += RISCV_INSTR_SIZE; + continue; + } + { + const UInt32 a_old = (a + (0xef - RISCV_DELTA_7F)) & 0xfff; +#if 0 // unaligned + a = GetUi32(p); + v = (UInt32)(a >> 23) & ((UInt32)0xff << 1) + | (UInt32)(a >> 7) & ((UInt32)0xff << 9) +#elif 1 && defined(Z7_CPU_FAST_BSWAP_SUPPORTED) && defined(MY_CPU_LE) + v = GetUi16a(p + 2); + v = Z7_BSWAP32(v) >> 15 +#else + v = (UInt32)p[3] << 1 + | (UInt32)p[2] << 9 +#endif + | (UInt32)((a & 0xf000) << 5); + BR_CONVERT_VAL_DEC(v) + a = a_old + | (v << 11 & 1u << 31) + | (v << 20 & 0x3ff << 21) + | (v << 9 & 1 << 20) + | (v & 0xff << 12); + RISCV_SET_UI32(p, a) + } + p += 4; + continue; + } // JAL + + { + // AUIPC + v = a; +#if 1 && defined(RISCV_USE_UNALIGNED_LOAD) + a = GetUi32(p); +#else + a |= (UInt32)GetUi16a(p + 2) << 16; +#endif + if ((v & 0xe80) == 0) // x0/x2 + { + const UInt32 r = a >> 27; + if (RISCV_CHECK_2(v, r)) + { + UInt32 b; +#if 1 && defined(Z7_CPU_FAST_BSWAP_SUPPORTED) && defined(MY_CPU_LE) + b = RISCV_GET_UI32(p + 4); + b = Z7_BSWAP32(b); +#else + b = GetBe32(p + 4); +#endif + v = a >> 12; + BR_CONVERT_VAL_DEC(b) + a = (r << 7) + 0x17; + a += (b + 0x800) & 0xfffff000; + v |= b << 20; + RISCV_SET_UI32(p, a) + RISCV_SET_UI32(p + 4, v) + p += 8; + } + else + p += RISCV_STEP_2; + } + else + { + const UInt32 b = RISCV_GET_UI32(p + 4); + if (!RISCV_CHECK_1(v, b)) + p += RISCV_STEP_1; + else + { + v = (a & 0xfffff000) | (b >> 20); + a = (b << 12) | (0x17 + RISCV_REG_VAL); + RISCV_SET_UI32(p, a) + RISCV_SET_UI32(p + 4, v) + p += 8; + } + } + } + } // for +}
diff --git a/third_party/lzma_sdk/C/Bra.h b/third_party/lzma_sdk/C/Bra.h index 855e37a6b..b47112ce 100644 --- a/third_party/lzma_sdk/C/Bra.h +++ b/third_party/lzma_sdk/C/Bra.h
@@ -1,64 +1,105 @@ /* Bra.h -- Branch converters for executables -2013-01-18 : Igor Pavlov : Public domain */ +2024-01-20 : Igor Pavlov : Public domain */ -#ifndef __BRA_H -#define __BRA_H +#ifndef ZIP7_INC_BRA_H +#define ZIP7_INC_BRA_H #include "7zTypes.h" EXTERN_C_BEGIN -/* -These functions convert relative addresses to absolute addresses -in CALL instructions to increase the compression ratio. - - In: - data - data buffer - size - size of data - ip - current virtual Instruction Pinter (IP) value - state - state variable for x86 converter - encoding - 0 (for decoding), 1 (for encoding) - - Out: - state - state variable for x86 converter +/* #define PPC BAD_PPC_11 // for debug */ - Returns: - The number of processed bytes. If you call these functions with multiple calls, - you must start next call with first byte after block of processed bytes. +#define Z7_BRANCH_CONV_DEC_2(name) z7_ ## name ## _Dec +#define Z7_BRANCH_CONV_ENC_2(name) z7_ ## name ## _Enc +#define Z7_BRANCH_CONV_DEC(name) Z7_BRANCH_CONV_DEC_2(BranchConv_ ## name) +#define Z7_BRANCH_CONV_ENC(name) Z7_BRANCH_CONV_ENC_2(BranchConv_ ## name) +#define Z7_BRANCH_CONV_ST_DEC(name) z7_BranchConvSt_ ## name ## _Dec +#define Z7_BRANCH_CONV_ST_ENC(name) z7_BranchConvSt_ ## name ## _Enc + +#define Z7_BRANCH_CONV_DECL(name) Byte * name(Byte *data, SizeT size, UInt32 pc) +#define Z7_BRANCH_CONV_ST_DECL(name) Byte * name(Byte *data, SizeT size, UInt32 pc, UInt32 *state) + +typedef Z7_BRANCH_CONV_DECL( (*z7_Func_BranchConv)); +typedef Z7_BRANCH_CONV_ST_DECL((*z7_Func_BranchConvSt)); + +#define Z7_BRANCH_CONV_ST_X86_STATE_INIT_VAL 0 +Z7_BRANCH_CONV_ST_DECL (Z7_BRANCH_CONV_ST_DEC(X86)); +Z7_BRANCH_CONV_ST_DECL (Z7_BRANCH_CONV_ST_ENC(X86)); + +#define Z7_BRANCH_FUNCS_DECL(name) \ +Z7_BRANCH_CONV_DECL (Z7_BRANCH_CONV_DEC_2(name)); \ +Z7_BRANCH_CONV_DECL (Z7_BRANCH_CONV_ENC_2(name)); + +Z7_BRANCH_FUNCS_DECL (BranchConv_ARM64) +Z7_BRANCH_FUNCS_DECL (BranchConv_ARM) +Z7_BRANCH_FUNCS_DECL (BranchConv_ARMT) +Z7_BRANCH_FUNCS_DECL (BranchConv_PPC) +Z7_BRANCH_FUNCS_DECL (BranchConv_SPARC) +Z7_BRANCH_FUNCS_DECL (BranchConv_IA64) +Z7_BRANCH_FUNCS_DECL (BranchConv_RISCV) + +/* +These functions convert data that contain CPU instructions. +Each such function converts relative addresses to absolute addresses in some +branch instructions: CALL (in all converters) and JUMP (X86 converter only). +Such conversion allows to increase compression ratio, if we compress that data. + +There are 2 types of converters: + Byte * Conv_RISC (Byte *data, SizeT size, UInt32 pc); + Byte * ConvSt_X86(Byte *data, SizeT size, UInt32 pc, UInt32 *state); +Each Converter supports 2 versions: one for encoding +and one for decoding (_Enc/_Dec postfixes in function name). + +In params: + data : data buffer + size : size of data + pc : current virtual Program Counter (Instruction Pointer) value +In/Out param: + state : pointer to state variable (for X86 converter only) + +Return: + The pointer to position in (data) buffer after last byte that was processed. + If the caller calls converter again, it must call it starting with that position. + But the caller is allowed to move data in buffer. So pointer to + current processed position also will be changed for next call. + Also the caller must increase internal (pc) value for next call. +Each converter has some characteristics: Endian, Alignment, LookAhead. Type Endian Alignment LookAhead - x86 little 1 4 + X86 little 1 4 ARMT little 2 2 + RISCV little 2 6 ARM little 4 0 + ARM64 little 4 0 PPC big 4 0 SPARC big 4 0 IA64 little 16 0 - size must be >= Alignment + LookAhead, if it's not last block. - If (size < Alignment + LookAhead), converter returns 0. + (data) must be aligned for (Alignment). + processed size can be calculated as: + SizeT processed = Conv(data, size, pc) - data; + if (processed == 0) + it means that converter needs more data for processing. + If (size < Alignment + LookAhead) + then (processed == 0) is allowed. - Example: - - UInt32 ip = 0; - for () - { - ; size must be >= Alignment + LookAhead, if it's not last block - SizeT processed = Convert(data, size, ip, 1); - data += processed; - size -= processed; - ip += processed; - } +Example code for conversion in loop: + UInt32 pc = 0; + size = 0; + for (;;) + { + size += Load_more_input_data(data + size); + SizeT processed = Conv(data, size, pc) - data; + if (processed == 0 && no_more_input_data_after_size) + break; // we stop convert loop + data += processed; + size -= processed; + pc += processed; + } */ -#define x86_Convert_Init(state) { state = 0; } -SizeT x86_Convert(Byte *data, SizeT size, UInt32 ip, UInt32 *state, int encoding); -SizeT ARM_Convert(Byte *data, SizeT size, UInt32 ip, int encoding); -SizeT ARMT_Convert(Byte *data, SizeT size, UInt32 ip, int encoding); -SizeT PPC_Convert(Byte *data, SizeT size, UInt32 ip, int encoding); -SizeT SPARC_Convert(Byte *data, SizeT size, UInt32 ip, int encoding); -SizeT IA64_Convert(Byte *data, SizeT size, UInt32 ip, int encoding); - EXTERN_C_END #endif
diff --git a/third_party/lzma_sdk/C/Bra86.c b/third_party/lzma_sdk/C/Bra86.c index 10a0fbd1..d81f392 100644 --- a/third_party/lzma_sdk/C/Bra86.c +++ b/third_party/lzma_sdk/C/Bra86.c
@@ -1,82 +1,187 @@ -/* Bra86.c -- Converter for x86 code (BCJ) -2021-02-09 : Igor Pavlov : Public domain */ +/* Bra86.c -- Branch converter for X86 code (BCJ) +2023-04-02 : Igor Pavlov : Public domain */ #include "Precomp.h" #include "Bra.h" +#include "CpuArch.h" -#define Test86MSByte(b) ((((b) + 1) & 0xFE) == 0) -SizeT x86_Convert(Byte *data, SizeT size, UInt32 ip, UInt32 *state, int encoding) +#if defined(MY_CPU_SIZEOF_POINTER) \ + && ( MY_CPU_SIZEOF_POINTER == 4 \ + || MY_CPU_SIZEOF_POINTER == 8) + #define BR_CONV_USE_OPT_PC_PTR +#endif + +#ifdef BR_CONV_USE_OPT_PC_PTR +#define BR_PC_INIT pc -= (UInt32)(SizeT)p; // (MY_uintptr_t) +#define BR_PC_GET (pc + (UInt32)(SizeT)p) +#else +#define BR_PC_INIT pc += (UInt32)size; +#define BR_PC_GET (pc - (UInt32)(SizeT)(lim - p)) +// #define BR_PC_INIT +// #define BR_PC_GET (pc + (UInt32)(SizeT)(p - data)) +#endif + +#define BR_CONVERT_VAL(v, c) if (encoding) v += c; else v -= c; +// #define BR_CONVERT_VAL(v, c) if (!encoding) c = (UInt32)0 - c; v += c; + +#define Z7_BRANCH_CONV_ST(name) z7_BranchConvSt_ ## name + +#define BR86_NEED_CONV_FOR_MS_BYTE(b) ((((b) + 1) & 0xfe) == 0) + +#ifdef MY_CPU_LE_UNALIGN + #define BR86_PREPARE_BCJ_SCAN const UInt32 v = GetUi32(p) ^ 0xe8e8e8e8; + #define BR86_IS_BCJ_BYTE(n) ((v & ((UInt32)0xfe << (n) * 8)) == 0) +#else + #define BR86_PREPARE_BCJ_SCAN + // bad for MSVC X86 (partial write to byte reg): + #define BR86_IS_BCJ_BYTE(n) ((p[n - 4] & 0xfe) == 0xe8) + // bad for old MSVC (partial write to byte reg): + // #define BR86_IS_BCJ_BYTE(n) (((*p ^ 0xe8) & 0xfe) == 0) +#endif + +static +Z7_FORCE_INLINE +Z7_ATTRIB_NO_VECTOR +Byte *Z7_BRANCH_CONV_ST(X86)(Byte *p, SizeT size, UInt32 pc, UInt32 *state, int encoding) { - SizeT pos = 0; - UInt32 mask = *state & 7; if (size < 5) - return 0; - size -= 4; - ip += 5; + return p; + { + // Byte *p = data; + const Byte *lim = p + size - 4; + unsigned mask = (unsigned)*state; // & 7; +#ifdef BR_CONV_USE_OPT_PC_PTR + /* if BR_CONV_USE_OPT_PC_PTR is defined: we need to adjust (pc) for (+4), + because call/jump offset is relative to the next instruction. + if BR_CONV_USE_OPT_PC_PTR is not defined : we don't need to adjust (pc) for (+4), + because BR_PC_GET uses (pc - (lim - p)), and lim was adjusted for (-4) before. + */ + pc += 4; +#endif + BR_PC_INIT + goto start; - for (;;) + for (;; mask |= 4) { - Byte *p = data + pos; - const Byte *limit = data + size; - for (; p < limit; p++) - if ((*p & 0xFE) == 0xE8) - break; - + // cont: mask |= 4; + start: + if (p >= lim) + goto fin; { - SizeT d = (SizeT)(p - data) - pos; - pos = (SizeT)(p - data); - if (p >= limit) - { - *state = (d > 2 ? 0 : mask >> (unsigned)d); - return pos; - } - if (d > 2) - mask = 0; - else - { - mask >>= (unsigned)d; - if (mask != 0 && (mask > 4 || mask == 3 || Test86MSByte(p[(size_t)(mask >> 1) + 1]))) - { - mask = (mask >> 1) | 4; - pos++; - continue; - } - } + BR86_PREPARE_BCJ_SCAN + p += 4; + if (BR86_IS_BCJ_BYTE(0)) { goto m0; } mask >>= 1; + if (BR86_IS_BCJ_BYTE(1)) { goto m1; } mask >>= 1; + if (BR86_IS_BCJ_BYTE(2)) { goto m2; } mask = 0; + if (BR86_IS_BCJ_BYTE(3)) { goto a3; } } + goto main_loop; - if (Test86MSByte(p[4])) + m0: p--; + m1: p--; + m2: p--; + if (mask == 0) + goto a3; + if (p > lim) + goto fin_p; + + // if (((0x17u >> mask) & 1) == 0) + if (mask > 4 || mask == 3) { - UInt32 v = ((UInt32)p[4] << 24) | ((UInt32)p[3] << 16) | ((UInt32)p[2] << 8) | ((UInt32)p[1]); - UInt32 cur = ip + (UInt32)pos; - pos += 5; - if (encoding) - v += cur; - else - v -= cur; - if (mask != 0) + mask >>= 1; + continue; // goto cont; + } + mask >>= 1; + if (BR86_NEED_CONV_FOR_MS_BYTE(p[mask])) + continue; // goto cont; + // if (!BR86_NEED_CONV_FOR_MS_BYTE(p[3])) continue; // goto cont; + { + UInt32 v = GetUi32(p); + UInt32 c; + v += (1 << 24); if (v & 0xfe000000) continue; // goto cont; + c = BR_PC_GET; + BR_CONVERT_VAL(v, c) { - unsigned sh = (mask & 6) << 2; - if (Test86MSByte((Byte)(v >> sh))) + mask <<= 3; + if (BR86_NEED_CONV_FOR_MS_BYTE(v >> mask)) { - v ^= (((UInt32)0x100 << sh) - 1); - if (encoding) - v += cur; - else - v -= cur; + v ^= (((UInt32)0x100 << mask) - 1); + #ifdef MY_CPU_X86 + // for X86 : we can recalculate (c) to reduce register pressure + c = BR_PC_GET; + #endif + BR_CONVERT_VAL(v, c) } mask = 0; } - p[1] = (Byte)v; - p[2] = (Byte)(v >> 8); - p[3] = (Byte)(v >> 16); - p[4] = (Byte)(0 - ((v >> 24) & 1)); + // v = (v & ((1 << 24) - 1)) - (v & (1 << 24)); + v &= (1 << 25) - 1; v -= (1 << 24); + SetUi32(p, v) + p += 4; + goto main_loop; } - else + + main_loop: + if (p >= lim) + goto fin; + for (;;) { - mask = (mask >> 1) | 4; - pos++; + BR86_PREPARE_BCJ_SCAN + p += 4; + if (BR86_IS_BCJ_BYTE(0)) { goto a0; } + if (BR86_IS_BCJ_BYTE(1)) { goto a1; } + if (BR86_IS_BCJ_BYTE(2)) { goto a2; } + if (BR86_IS_BCJ_BYTE(3)) { goto a3; } + if (p >= lim) + goto fin; + } + + a0: p--; + a1: p--; + a2: p--; + a3: + if (p > lim) + goto fin_p; + // if (!BR86_NEED_CONV_FOR_MS_BYTE(p[3])) continue; // goto cont; + { + UInt32 v = GetUi32(p); + UInt32 c; + v += (1 << 24); if (v & 0xfe000000) continue; // goto cont; + c = BR_PC_GET; + BR_CONVERT_VAL(v, c) + // v = (v & ((1 << 24) - 1)) - (v & (1 << 24)); + v &= (1 << 25) - 1; v -= (1 << 24); + SetUi32(p, v) + p += 4; + goto main_loop; } } + +fin_p: + p--; +fin: + // the following processing for tail is optional and can be commented + /* + lim += 4; + for (; p < lim; p++, mask >>= 1) + if ((*p & 0xfe) == 0xe8) + break; + */ + *state = (UInt32)mask; + return p; + } } + + +#define Z7_BRANCH_CONV_ST_FUNC_IMP(name, m, encoding) \ +Z7_NO_INLINE \ +Z7_ATTRIB_NO_VECTOR \ +Byte *m(name)(Byte *data, SizeT size, UInt32 pc, UInt32 *state) \ + { return Z7_BRANCH_CONV_ST(name)(data, size, pc, state, encoding); } + +Z7_BRANCH_CONV_ST_FUNC_IMP(X86, Z7_BRANCH_CONV_ST_DEC, 0) +#ifndef Z7_EXTRACT_ONLY +Z7_BRANCH_CONV_ST_FUNC_IMP(X86, Z7_BRANCH_CONV_ST_ENC, 1) +#endif
diff --git a/third_party/lzma_sdk/C/BraIA64.c b/third_party/lzma_sdk/C/BraIA64.c index d1dbc62..9dfe3e28 100644 --- a/third_party/lzma_sdk/C/BraIA64.c +++ b/third_party/lzma_sdk/C/BraIA64.c
@@ -1,53 +1,14 @@ /* BraIA64.c -- Converter for IA-64 code -2017-01-26 : Igor Pavlov : Public domain */ +2023-02-20 : Igor Pavlov : Public domain */ #include "Precomp.h" -#include "CpuArch.h" -#include "Bra.h" +// the code was moved to Bra.c -SizeT IA64_Convert(Byte *data, SizeT size, UInt32 ip, int encoding) -{ - SizeT i; - if (size < 16) - return 0; - size -= 16; - i = 0; - do - { - unsigned m = ((UInt32)0x334B0000 >> (data[i] & 0x1E)) & 3; - if (m) - { - m++; - do - { - Byte *p = data + (i + (size_t)m * 5 - 8); - if (((p[3] >> m) & 15) == 5 - && (((p[-1] | ((UInt32)p[0] << 8)) >> m) & 0x70) == 0) - { - unsigned raw = GetUi32(p); - unsigned v = raw >> m; - v = (v & 0xFFFFF) | ((v & (1 << 23)) >> 3); - - v <<= 4; - if (encoding) - v += ip + (UInt32)i; - else - v -= ip + (UInt32)i; - v >>= 4; - - v &= 0x1FFFFF; - v += 0x700000; - v &= 0x8FFFFF; - raw &= ~((UInt32)0x8FFFFF << m); - raw |= (v << m); - SetUi32(p, raw); - } - } - while (++m <= 4); - } - i += 16; - } - while (i <= size); - return i; -} +#ifdef _MSC_VER +#pragma warning(disable : 4206) // nonstandard extension used : translation unit is empty +#endif + +#if defined(__clang__) +#pragma GCC diagnostic ignored "-Wempty-translation-unit" +#endif
diff --git a/third_party/lzma_sdk/C/Compiler.h b/third_party/lzma_sdk/C/Compiler.h index a9816fa..2a9c2b7a 100644 --- a/third_party/lzma_sdk/C/Compiler.h +++ b/third_party/lzma_sdk/C/Compiler.h
@@ -1,12 +1,105 @@ -/* Compiler.h -2021-01-05 : Igor Pavlov : Public domain */ +/* Compiler.h : Compiler specific defines and pragmas +2024-01-22 : Igor Pavlov : Public domain */ -#ifndef __7Z_COMPILER_H -#define __7Z_COMPILER_H +#ifndef ZIP7_INC_COMPILER_H +#define ZIP7_INC_COMPILER_H - #ifdef __clang__ - #pragma clang diagnostic ignored "-Wunused-private-field" +#if defined(__clang__) +# define Z7_CLANG_VERSION (__clang_major__ * 10000 + __clang_minor__ * 100 + __clang_patchlevel__) +#endif +#if defined(__clang__) && defined(__apple_build_version__) +# define Z7_APPLE_CLANG_VERSION Z7_CLANG_VERSION +#elif defined(__clang__) +# define Z7_LLVM_CLANG_VERSION Z7_CLANG_VERSION +#elif defined(__GNUC__) +# define Z7_GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) +#endif + +#ifdef _MSC_VER +#if !defined(__clang__) && !defined(__GNUC__) +#define Z7_MSC_VER_ORIGINAL _MSC_VER +#endif +#endif + +#if defined(__MINGW32__) || defined(__MINGW64__) +#define Z7_MINGW +#endif + +#if defined(__LCC__) && (defined(__MCST__) || defined(__e2k__)) +#define Z7_MCST_LCC +#define Z7_MCST_LCC_VERSION (__LCC__ * 100 + __LCC_MINOR__) +#endif + +/* +#if defined(__AVX2__) \ + || defined(Z7_GCC_VERSION) && (Z7_GCC_VERSION >= 40900) \ + || defined(Z7_APPLE_CLANG_VERSION) && (Z7_APPLE_CLANG_VERSION >= 40600) \ + || defined(Z7_LLVM_CLANG_VERSION) && (Z7_LLVM_CLANG_VERSION >= 30100) \ + || defined(Z7_MSC_VER_ORIGINAL) && (Z7_MSC_VER_ORIGINAL >= 1800) \ + || defined(__INTEL_COMPILER) && (__INTEL_COMPILER >= 1400) + #define Z7_COMPILER_AVX2_SUPPORTED #endif +#endif +*/ + +// #pragma GCC diagnostic ignored "-Wunknown-pragmas" + +#ifdef __clang__ +// padding size of '' with 4 bytes to alignment boundary +#pragma GCC diagnostic ignored "-Wpadded" + +#if defined(Z7_LLVM_CLANG_VERSION) && (__clang_major__ == 13) \ + && defined(__FreeBSD__) +// freebsd: +#pragma GCC diagnostic ignored "-Wexcess-padding" +#endif + +#if __clang_major__ >= 16 +#pragma GCC diagnostic ignored "-Wunsafe-buffer-usage" +#endif + +#if __clang_major__ == 13 +#if defined(__SIZEOF_POINTER__) && (__SIZEOF_POINTER__ == 16) +// cheri +#pragma GCC diagnostic ignored "-Wcapability-to-integer-cast" +#endif +#endif + +#if __clang_major__ == 13 + // for <arm_neon.h> + #pragma GCC diagnostic ignored "-Wreserved-identifier" +#endif + +#endif // __clang__ + +#if defined(_WIN32) && defined(__clang__) && __clang_major__ >= 16 +// #pragma GCC diagnostic ignored "-Wcast-function-type-strict" +#define Z7_DIAGNOSTIC_IGNORE_CAST_FUNCTION \ + _Pragma("GCC diagnostic ignored \"-Wcast-function-type-strict\"") +#else +#define Z7_DIAGNOSTIC_IGNORE_CAST_FUNCTION +#endif + +typedef void (*Z7_void_Function)(void); +#if defined(__clang__) || defined(__GNUC__) +#define Z7_CAST_FUNC_C (Z7_void_Function) +#elif defined(_MSC_VER) && _MSC_VER > 1920 +#define Z7_CAST_FUNC_C (void *) +// #pragma warning(disable : 4191) // 'type cast': unsafe conversion from 'FARPROC' to 'void (__cdecl *)()' +#else +#define Z7_CAST_FUNC_C +#endif +/* +#if (defined(__GNUC__) && (__GNUC__ >= 8)) || defined(__clang__) + // #pragma GCC diagnostic ignored "-Wcast-function-type" +#endif +*/ +#ifdef __GNUC__ +#if defined(Z7_GCC_VERSION) && (Z7_GCC_VERSION >= 40000) && (Z7_GCC_VERSION < 70000) +#pragma GCC diagnostic ignored "-Wstrict-aliasing" +#endif +#endif + #ifdef _MSC_VER @@ -17,24 +110,124 @@ #pragma warning(disable : 4214) // nonstandard extension used : bit field types other than int #endif - #if _MSC_VER >= 1300 - #pragma warning(disable : 4996) // This function or variable may be unsafe - #else - #pragma warning(disable : 4511) // copy constructor could not be generated - #pragma warning(disable : 4512) // assignment operator could not be generated - #pragma warning(disable : 4514) // unreferenced inline function has been removed - #pragma warning(disable : 4702) // unreachable code - #pragma warning(disable : 4710) // not inlined - #pragma warning(disable : 4714) // function marked as __forceinline not inlined - #pragma warning(disable : 4786) // identifier was truncated to '255' characters in the debug information - #endif +#if defined(_MSC_VER) && _MSC_VER >= 1800 +#pragma warning(disable : 4464) // relative include path contains '..' +#endif - #ifdef __clang__ - #pragma clang diagnostic ignored "-Wdeprecated-declarations" - #pragma clang diagnostic ignored "-Wmicrosoft-exception-spec" - // #pragma clang diagnostic ignored "-Wreserved-id-macro" - #endif +// == 1200 : -O1 : for __forceinline +// >= 1900 : -O1 : for printf +#pragma warning(disable : 4710) // function not inlined +#if _MSC_VER < 1900 +// winnt.h: 'Int64ShllMod32' +#pragma warning(disable : 4514) // unreferenced inline function has been removed +#endif + +#if _MSC_VER < 1300 +// #pragma warning(disable : 4702) // unreachable code +// Bra.c : -O1: +#pragma warning(disable : 4714) // function marked as __forceinline not inlined +#endif + +/* +#if _MSC_VER > 1400 && _MSC_VER <= 1900 +// strcat: This function or variable may be unsafe +// sysinfoapi.h: kit10: GetVersion was declared deprecated +#pragma warning(disable : 4996) +#endif +*/ + +#if _MSC_VER > 1200 +// -Wall warnings + +#pragma warning(disable : 4711) // function selected for automatic inline expansion +#pragma warning(disable : 4820) // '2' bytes padding added after data member + +#if _MSC_VER >= 1400 && _MSC_VER < 1920 +// 1400: string.h: _DBG_MEMCPY_INLINE_ +// 1600 - 191x : smmintrin.h __cplusplus' +// is not defined as a preprocessor macro, replacing with '0' for '#if/#elif' +#pragma warning(disable : 4668) + +// 1400 - 1600 : WinDef.h : 'FARPROC' : +// 1900 - 191x : immintrin.h: _readfsbase_u32 +// no function prototype given : converting '()' to '(void)' +#pragma warning(disable : 4255) +#endif + +#if _MSC_VER >= 1914 +// Compiler will insert Spectre mitigation for memory load if /Qspectre switch specified +#pragma warning(disable : 5045) +#endif + +#endif // _MSC_VER > 1200 +#endif // _MSC_VER + + +#if defined(__clang__) && (__clang_major__ >= 4) + #define Z7_PRAGMA_OPT_DISABLE_LOOP_UNROLL_VECTORIZE \ + _Pragma("clang loop unroll(disable)") \ + _Pragma("clang loop vectorize(disable)") + #define Z7_ATTRIB_NO_VECTORIZE +#elif defined(__GNUC__) && (__GNUC__ >= 5) \ + && (!defined(Z7_MCST_LCC_VERSION) || (Z7_MCST_LCC_VERSION >= 12610)) + #define Z7_ATTRIB_NO_VECTORIZE __attribute__((optimize("no-tree-vectorize"))) + // __attribute__((optimize("no-unroll-loops"))); + #define Z7_PRAGMA_OPT_DISABLE_LOOP_UNROLL_VECTORIZE +#elif defined(_MSC_VER) && (_MSC_VER >= 1920) + #define Z7_PRAGMA_OPT_DISABLE_LOOP_UNROLL_VECTORIZE \ + _Pragma("loop( no_vector )") + #define Z7_ATTRIB_NO_VECTORIZE +#else + #define Z7_PRAGMA_OPT_DISABLE_LOOP_UNROLL_VECTORIZE + #define Z7_ATTRIB_NO_VECTORIZE +#endif + +#if defined(MY_CPU_X86_OR_AMD64) && ( \ + defined(__clang__) && (__clang_major__ >= 4) \ + || defined(__GNUC__) && (__GNUC__ >= 5)) + #define Z7_ATTRIB_NO_SSE __attribute__((__target__("no-sse"))) +#else + #define Z7_ATTRIB_NO_SSE +#endif + +#define Z7_ATTRIB_NO_VECTOR \ + Z7_ATTRIB_NO_VECTORIZE \ + Z7_ATTRIB_NO_SSE + + +#if defined(__clang__) && (__clang_major__ >= 8) \ + || defined(__GNUC__) && (__GNUC__ >= 1000) \ + /* || defined(_MSC_VER) && (_MSC_VER >= 1920) */ + // GCC is not good for __builtin_expect() + #define Z7_LIKELY(x) (__builtin_expect((x), 1)) + #define Z7_UNLIKELY(x) (__builtin_expect((x), 0)) + // #define Z7_unlikely [[unlikely]] + // #define Z7_likely [[likely]] +#else + #define Z7_LIKELY(x) (x) + #define Z7_UNLIKELY(x) (x) + // #define Z7_likely +#endif + + +#if (defined(Z7_CLANG_VERSION) && (Z7_CLANG_VERSION >= 30600)) + +#if (Z7_CLANG_VERSION < 130000) +#define Z7_DIAGNOSTIC_IGNORE_BEGIN_RESERVED_MACRO_IDENTIFIER \ + _Pragma("GCC diagnostic push") \ + _Pragma("GCC diagnostic ignored \"-Wreserved-id-macro\"") +#else +#define Z7_DIAGNOSTIC_IGNORE_BEGIN_RESERVED_MACRO_IDENTIFIER \ + _Pragma("GCC diagnostic push") \ + _Pragma("GCC diagnostic ignored \"-Wreserved-macro-identifier\"") +#endif + +#define Z7_DIAGNOSTIC_IGNORE_END_RESERVED_MACRO_IDENTIFIER \ + _Pragma("GCC diagnostic pop") +#else +#define Z7_DIAGNOSTIC_IGNORE_BEGIN_RESERVED_MACRO_IDENTIFIER +#define Z7_DIAGNOSTIC_IGNORE_END_RESERVED_MACRO_IDENTIFIER #endif #define UNUSED_VAR(x) (void)x;
diff --git a/third_party/lzma_sdk/C/CpuArch.c b/third_party/lzma_sdk/C/CpuArch.c index 30451fba..6e02551 100644 --- a/third_party/lzma_sdk/C/CpuArch.c +++ b/third_party/lzma_sdk/C/CpuArch.c
@@ -1,187 +1,357 @@ /* CpuArch.c -- CPU specific code -2021-07-13 : Igor Pavlov : Public domain */ +Igor Pavlov : Public domain */ #include "Precomp.h" +// #include <stdio.h> + #include "CpuArch.h" #ifdef MY_CPU_X86_OR_AMD64 -#if (defined(_MSC_VER) && !defined(MY_CPU_AMD64)) || defined(__GNUC__) -#define USE_ASM +#undef NEED_CHECK_FOR_CPUID +#if !defined(MY_CPU_AMD64) +#define NEED_CHECK_FOR_CPUID #endif -#if !defined(USE_ASM) && _MSC_VER >= 1500 -#include <intrin.h> +/* + cpuid instruction supports (subFunction) parameter in ECX, + that is used only with some specific (function) parameter values. + most functions use only (subFunction==0). +*/ +/* + __cpuid(): MSVC and GCC/CLANG use same function/macro name + but parameters are different. + We use MSVC __cpuid() parameters style for our z7_x86_cpuid() function. +*/ + +#if defined(__GNUC__) /* && (__GNUC__ >= 10) */ \ + || defined(__clang__) /* && (__clang_major__ >= 10) */ + +/* there was some CLANG/GCC compilers that have issues with + rbx(ebx) handling in asm blocks in -fPIC mode (__PIC__ is defined). + compiler's <cpuid.h> contains the macro __cpuid() that is similar to our code. + The history of __cpuid() changes in CLANG/GCC: + GCC: + 2007: it preserved ebx for (__PIC__ && __i386__) + 2013: it preserved rbx and ebx for __PIC__ + 2014: it doesn't preserves rbx and ebx anymore + we suppose that (__GNUC__ >= 5) fixed that __PIC__ ebx/rbx problem. + CLANG: + 2014+: it preserves rbx, but only for 64-bit code. No __PIC__ check. + Why CLANG cares about 64-bit mode only, and doesn't care about ebx (in 32-bit)? + Do we need __PIC__ test for CLANG or we must care about rbx even if + __PIC__ is not defined? +*/ + +#define ASM_LN "\n" + +#if defined(MY_CPU_AMD64) && defined(__PIC__) \ + && ((defined (__GNUC__) && (__GNUC__ < 5)) || defined(__clang__)) + + /* "=&r" selects free register. It can select even rbx, if that register is free. + "=&D" for (RDI) also works, but the code can be larger with "=&D" + "2"(subFun) : 2 is (zero-based) index in the output constraint list "=c" (ECX). */ + +#define x86_cpuid_MACRO_2(p, func, subFunc) { \ + __asm__ __volatile__ ( \ + ASM_LN "mov %%rbx, %q1" \ + ASM_LN "cpuid" \ + ASM_LN "xchg %%rbx, %q1" \ + : "=a" ((p)[0]), "=&r" ((p)[1]), "=c" ((p)[2]), "=d" ((p)[3]) : "0" (func), "2"(subFunc)); } + +#elif defined(MY_CPU_X86) && defined(__PIC__) \ + && ((defined (__GNUC__) && (__GNUC__ < 5)) || defined(__clang__)) + +#define x86_cpuid_MACRO_2(p, func, subFunc) { \ + __asm__ __volatile__ ( \ + ASM_LN "mov %%ebx, %k1" \ + ASM_LN "cpuid" \ + ASM_LN "xchg %%ebx, %k1" \ + : "=a" ((p)[0]), "=&r" ((p)[1]), "=c" ((p)[2]), "=d" ((p)[3]) : "0" (func), "2"(subFunc)); } + +#else + +#define x86_cpuid_MACRO_2(p, func, subFunc) { \ + __asm__ __volatile__ ( \ + ASM_LN "cpuid" \ + : "=a" ((p)[0]), "=b" ((p)[1]), "=c" ((p)[2]), "=d" ((p)[3]) : "0" (func), "2"(subFunc)); } + #endif -#if defined(USE_ASM) && !defined(MY_CPU_AMD64) -static UInt32 CheckFlag(UInt32 flag) +#define x86_cpuid_MACRO(p, func) x86_cpuid_MACRO_2(p, func, 0) + +void Z7_FASTCALL z7_x86_cpuid(UInt32 p[4], UInt32 func) { - #ifdef _MSC_VER - __asm pushfd; - __asm pop EAX; - __asm mov EDX, EAX; - __asm xor EAX, flag; - __asm push EAX; - __asm popfd; - __asm pushfd; - __asm pop EAX; - __asm xor EAX, EDX; - __asm push EDX; - __asm popfd; - __asm and flag, EAX; - #else - __asm__ __volatile__ ( - "pushf\n\t" - "pop %%EAX\n\t" - "movl %%EAX,%%EDX\n\t" - "xorl %0,%%EAX\n\t" - "push %%EAX\n\t" - "popf\n\t" - "pushf\n\t" - "pop %%EAX\n\t" - "xorl %%EDX,%%EAX\n\t" - "push %%EDX\n\t" - "popf\n\t" - "andl %%EAX, %0\n\t": - "=c" (flag) : "c" (flag) : - "%eax", "%edx"); - #endif - return flag; + x86_cpuid_MACRO(p, func) } -#define CHECK_CPUID_IS_SUPPORTED if (CheckFlag(1 << 18) == 0 || CheckFlag(1 << 21) == 0) return False; + +static +void Z7_FASTCALL z7_x86_cpuid_subFunc(UInt32 p[4], UInt32 func, UInt32 subFunc) +{ + x86_cpuid_MACRO_2(p, func, subFunc) +} + + +Z7_NO_INLINE +UInt32 Z7_FASTCALL z7_x86_cpuid_GetMaxFunc(void) +{ + #if defined(NEED_CHECK_FOR_CPUID) + #define EFALGS_CPUID_BIT 21 + UInt32 a; + __asm__ __volatile__ ( + ASM_LN "pushf" + ASM_LN "pushf" + ASM_LN "pop %0" + // ASM_LN "movl %0, %1" + // ASM_LN "xorl $0x200000, %0" + ASM_LN "btc %1, %0" + ASM_LN "push %0" + ASM_LN "popf" + ASM_LN "pushf" + ASM_LN "pop %0" + ASM_LN "xorl (%%esp), %0" + + ASM_LN "popf" + ASM_LN + : "=&r" (a) // "=a" + : "i" (EFALGS_CPUID_BIT) + ); + if ((a & (1 << EFALGS_CPUID_BIT)) == 0) + return 0; + #endif + { + UInt32 p[4]; + x86_cpuid_MACRO(p, 0) + return p[0]; + } +} + +#undef ASM_LN + +#elif !defined(_MSC_VER) + +/* +// for gcc/clang and other: we can try to use __cpuid macro: +#include <cpuid.h> +void Z7_FASTCALL z7_x86_cpuid(UInt32 p[4], UInt32 func) +{ + __cpuid(func, p[0], p[1], p[2], p[3]); +} +UInt32 Z7_FASTCALL z7_x86_cpuid_GetMaxFunc(void) +{ + return (UInt32)__get_cpuid_max(0, NULL); +} +*/ +// for unsupported cpuid: +void Z7_FASTCALL z7_x86_cpuid(UInt32 p[4], UInt32 func) +{ + UNUSED_VAR(func) + p[0] = p[1] = p[2] = p[3] = 0; +} +UInt32 Z7_FASTCALL z7_x86_cpuid_GetMaxFunc(void) +{ + return 0; +} + +#else // _MSC_VER + +#if !defined(MY_CPU_AMD64) + +UInt32 __declspec(naked) Z7_FASTCALL z7_x86_cpuid_GetMaxFunc(void) +{ + #if defined(NEED_CHECK_FOR_CPUID) + #define EFALGS_CPUID_BIT 21 + __asm pushfd + __asm pushfd + /* + __asm pop eax + // __asm mov edx, eax + __asm btc eax, EFALGS_CPUID_BIT + __asm push eax + */ + __asm btc dword ptr [esp], EFALGS_CPUID_BIT + __asm popfd + __asm pushfd + __asm pop eax + // __asm xor eax, edx + __asm xor eax, [esp] + // __asm push edx + __asm popfd + __asm and eax, (1 shl EFALGS_CPUID_BIT) + __asm jz end_func + #endif + __asm push ebx + __asm xor eax, eax // func + __asm xor ecx, ecx // subFunction (optional) for (func == 0) + __asm cpuid + __asm pop ebx + #if defined(NEED_CHECK_FOR_CPUID) + end_func: + #endif + __asm ret 0 +} + +void __declspec(naked) Z7_FASTCALL z7_x86_cpuid(UInt32 p[4], UInt32 func) +{ + UNUSED_VAR(p) + UNUSED_VAR(func) + __asm push ebx + __asm push edi + __asm mov edi, ecx // p + __asm mov eax, edx // func + __asm xor ecx, ecx // subfunction (optional) for (func == 0) + __asm cpuid + __asm mov [edi ], eax + __asm mov [edi + 4], ebx + __asm mov [edi + 8], ecx + __asm mov [edi + 12], edx + __asm pop edi + __asm pop ebx + __asm ret 0 +} + +static +void __declspec(naked) Z7_FASTCALL z7_x86_cpuid_subFunc(UInt32 p[4], UInt32 func, UInt32 subFunc) +{ + UNUSED_VAR(p) + UNUSED_VAR(func) + UNUSED_VAR(subFunc) + __asm push ebx + __asm push edi + __asm mov edi, ecx // p + __asm mov eax, edx // func + __asm mov ecx, [esp + 12] // subFunc + __asm cpuid + __asm mov [edi ], eax + __asm mov [edi + 4], ebx + __asm mov [edi + 8], ecx + __asm mov [edi + 12], edx + __asm pop edi + __asm pop ebx + __asm ret 4 +} + +#else // MY_CPU_AMD64 + + #if _MSC_VER >= 1600 + #include <intrin.h> + #define MY_cpuidex __cpuidex + +static +void Z7_FASTCALL z7_x86_cpuid_subFunc(UInt32 p[4], UInt32 func, UInt32 subFunc) +{ + __cpuidex((int *)p, func, subFunc); +} + + #else +/* + __cpuid (func == (0 or 7)) requires subfunction number in ECX. + MSDN: The __cpuid intrinsic clears the ECX register before calling the cpuid instruction. + __cpuid() in new MSVC clears ECX. + __cpuid() in old MSVC (14.00) x64 doesn't clear ECX + We still can use __cpuid for low (func) values that don't require ECX, + but __cpuid() in old MSVC will be incorrect for some func values: (func == 7). + So here we use the hack for old MSVC to send (subFunction) in ECX register to cpuid instruction, + where ECX value is first parameter for FASTCALL / NO_INLINE func. + So the caller of MY_cpuidex_HACK() sets ECX as subFunction, and + old MSVC for __cpuid() doesn't change ECX and cpuid instruction gets (subFunction) value. + +DON'T remove Z7_NO_INLINE and Z7_FASTCALL for MY_cpuidex_HACK(): !!! +*/ +static +Z7_NO_INLINE void Z7_FASTCALL MY_cpuidex_HACK(Int32 subFunction, Int32 func, Int32 *CPUInfo) +{ + UNUSED_VAR(subFunction) + __cpuid(CPUInfo, func); +} + #define MY_cpuidex(info, func, func2) MY_cpuidex_HACK(func2, func, info) + #pragma message("======== MY_cpuidex_HACK WAS USED ========") +static +void Z7_FASTCALL z7_x86_cpuid_subFunc(UInt32 p[4], UInt32 func, UInt32 subFunc) +{ + MY_cpuidex_HACK(subFunc, func, (Int32 *)p); +} + #endif // _MSC_VER >= 1600 + +#if !defined(MY_CPU_AMD64) +/* inlining for __cpuid() in MSVC x86 (32-bit) produces big ineffective code, + so we disable inlining here */ +Z7_NO_INLINE +#endif +void Z7_FASTCALL z7_x86_cpuid(UInt32 p[4], UInt32 func) +{ + MY_cpuidex((Int32 *)p, (Int32)func, 0); +} + +Z7_NO_INLINE +UInt32 Z7_FASTCALL z7_x86_cpuid_GetMaxFunc(void) +{ + Int32 a[4]; + MY_cpuidex(a, 0, 0); + return a[0]; +} + +#endif // MY_CPU_AMD64 +#endif // _MSC_VER + +#if defined(NEED_CHECK_FOR_CPUID) +#define CHECK_CPUID_IS_SUPPORTED { if (z7_x86_cpuid_GetMaxFunc() == 0) return 0; } #else #define CHECK_CPUID_IS_SUPPORTED #endif +#undef NEED_CHECK_FOR_CPUID -#ifndef USE_ASM - #ifdef _MSC_VER - #if _MSC_VER >= 1600 - #define MY__cpuidex __cpuidex - #else - -/* - __cpuid (function == 4) requires subfunction number in ECX. - MSDN: The __cpuid intrinsic clears the ECX register before calling the cpuid instruction. - __cpuid() in new MSVC clears ECX. - __cpuid() in old MSVC (14.00) doesn't clear ECX - We still can use __cpuid for low (function) values that don't require ECX, - but __cpuid() in old MSVC will be incorrect for some function values: (function == 4). - So here we use the hack for old MSVC to send (subFunction) in ECX register to cpuid instruction, - where ECX value is first parameter for FAST_CALL / NO_INLINE function, - So the caller of MY__cpuidex_HACK() sets ECX as subFunction, and - old MSVC for __cpuid() doesn't change ECX and cpuid instruction gets (subFunction) value. - - DON'T remove MY_NO_INLINE and MY_FAST_CALL for MY__cpuidex_HACK() !!! -*/ static -MY_NO_INLINE -void MY_FAST_CALL MY__cpuidex_HACK(UInt32 subFunction, int *CPUInfo, UInt32 function) -{ - UNUSED_VAR(subFunction); - __cpuid(CPUInfo, function); -} - - #define MY__cpuidex(info, func, func2) MY__cpuidex_HACK(func2, info, func) - #pragma message("======== MY__cpuidex_HACK WAS USED ========") - #endif - #else - #define MY__cpuidex(info, func, func2) __cpuid(info, func) - #pragma message("======== (INCORRECT ?) cpuid WAS USED ========") - #endif -#endif - - - - -void MyCPUID(UInt32 function, UInt32 *a, UInt32 *b, UInt32 *c, UInt32 *d) -{ - #ifdef USE_ASM - - #ifdef _MSC_VER - - UInt32 a2, b2, c2, d2; - __asm xor EBX, EBX; - __asm xor ECX, ECX; - __asm xor EDX, EDX; - __asm mov EAX, function; - __asm cpuid; - __asm mov a2, EAX; - __asm mov b2, EBX; - __asm mov c2, ECX; - __asm mov d2, EDX; - - *a = a2; - *b = b2; - *c = c2; - *d = d2; - - #else - - __asm__ __volatile__ ( - #if defined(MY_CPU_AMD64) && defined(__PIC__) - "mov %%rbx, %%rdi;" - "cpuid;" - "xchg %%rbx, %%rdi;" - : "=a" (*a) , - "=D" (*b) , - #elif defined(MY_CPU_X86) && defined(__PIC__) - "mov %%ebx, %%edi;" - "cpuid;" - "xchgl %%ebx, %%edi;" - : "=a" (*a) , - "=D" (*b) , - #else - "cpuid" - : "=a" (*a) , - "=b" (*b) , - #endif - "=c" (*c) , - "=d" (*d) - : "0" (function), "c"(0) ) ; - - #endif - - #else - - int CPUInfo[4]; - - MY__cpuidex(CPUInfo, (int)function, 0); - - *a = (UInt32)CPUInfo[0]; - *b = (UInt32)CPUInfo[1]; - *c = (UInt32)CPUInfo[2]; - *d = (UInt32)CPUInfo[3]; - - #endif -} - -BoolInt x86cpuid_CheckAndRead(Cx86cpuid *p) +BoolInt x86cpuid_Func_1(UInt32 *p) { CHECK_CPUID_IS_SUPPORTED - MyCPUID(0, &p->maxFunc, &p->vendor[0], &p->vendor[2], &p->vendor[1]); - MyCPUID(1, &p->ver, &p->b, &p->c, &p->d); + z7_x86_cpuid(p, 1); return True; } -static const UInt32 kVendors[][3] = +/* +static const UInt32 kVendors[][1] = { - { 0x756E6547, 0x49656E69, 0x6C65746E}, - { 0x68747541, 0x69746E65, 0x444D4163}, - { 0x746E6543, 0x48727561, 0x736C7561} + { 0x756E6547 }, // , 0x49656E69, 0x6C65746E }, + { 0x68747541 }, // , 0x69746E65, 0x444D4163 }, + { 0x746E6543 } // , 0x48727561, 0x736C7561 } }; +*/ + +/* +typedef struct +{ + UInt32 maxFunc; + UInt32 vendor[3]; + UInt32 ver; + UInt32 b; + UInt32 c; + UInt32 d; +} Cx86cpuid; + +enum +{ + CPU_FIRM_INTEL, + CPU_FIRM_AMD, + CPU_FIRM_VIA +}; +int x86cpuid_GetFirm(const Cx86cpuid *p); +#define x86cpuid_ver_GetFamily(ver) (((ver >> 16) & 0xff0) | ((ver >> 8) & 0xf)) +#define x86cpuid_ver_GetModel(ver) (((ver >> 12) & 0xf0) | ((ver >> 4) & 0xf)) +#define x86cpuid_ver_GetStepping(ver) (ver & 0xf) int x86cpuid_GetFirm(const Cx86cpuid *p) { unsigned i; - for (i = 0; i < sizeof(kVendors) / sizeof(kVendors[i]); i++) + for (i = 0; i < sizeof(kVendors) / sizeof(kVendors[0]); i++) { const UInt32 *v = kVendors[i]; - if (v[0] == p->vendor[0] && - v[1] == p->vendor[1] && - v[2] == p->vendor[2]) + if (v[0] == p->vendor[0] + // && v[1] == p->vendor[1] + // && v[2] == p->vendor[2] + ) return (int)i; } return -1; @@ -190,41 +360,55 @@ BoolInt CPU_Is_InOrder() { Cx86cpuid p; - int firm; UInt32 family, model; if (!x86cpuid_CheckAndRead(&p)) return True; - family = x86cpuid_GetFamily(p.ver); - model = x86cpuid_GetModel(p.ver); - - firm = x86cpuid_GetFirm(&p); + family = x86cpuid_ver_GetFamily(p.ver); + model = x86cpuid_ver_GetModel(p.ver); - switch (firm) + switch (x86cpuid_GetFirm(&p)) { case CPU_FIRM_INTEL: return (family < 6 || (family == 6 && ( - /* In-Order Atom CPU */ - model == 0x1C /* 45 nm, N4xx, D4xx, N5xx, D5xx, 230, 330 */ - || model == 0x26 /* 45 nm, Z6xx */ - || model == 0x27 /* 32 nm, Z2460 */ - || model == 0x35 /* 32 nm, Z2760 */ - || model == 0x36 /* 32 nm, N2xxx, D2xxx */ + // In-Order Atom CPU + model == 0x1C // 45 nm, N4xx, D4xx, N5xx, D5xx, 230, 330 + || model == 0x26 // 45 nm, Z6xx + || model == 0x27 // 32 nm, Z2460 + || model == 0x35 // 32 nm, Z2760 + || model == 0x36 // 32 nm, N2xxx, D2xxx ))); case CPU_FIRM_AMD: return (family < 5 || (family == 5 && (model < 6 || model == 0xA))); case CPU_FIRM_VIA: return (family < 6 || (family == 6 && model < 0xF)); } - return True; + return False; // v23 : unknown processors are not In-Order } +*/ + +#ifdef _WIN32 +#include "7zWindows.h" +#endif #if !defined(MY_CPU_AMD64) && defined(_WIN32) -#include <Windows.h> -static BoolInt CPU_Sys_Is_SSE_Supported() + +/* for legacy SSE ia32: there is no user-space cpu instruction to check + that OS supports SSE register storing/restoring on context switches. + So we need some OS-specific function to check that it's safe to use SSE registers. +*/ + +Z7_FORCE_INLINE +static BoolInt CPU_Sys_Is_SSE_Supported(void) { - OSVERSIONINFO vi; - vi.dwOSVersionInfoSize = sizeof(vi); - if (!GetVersionEx(&vi)) - return False; - return (vi.dwMajorVersion >= 5); +#ifdef _MSC_VER + #pragma warning(push) + #pragma warning(disable : 4996) // `GetVersion': was declared deprecated +#endif + /* low byte is major version of Windows + We suppose that any Windows version since + Windows2000 (major == 5) supports SSE registers */ + return (Byte)GetVersion() >= 5; +#if defined(_MSC_VER) + #pragma warning(pop) +#endif } #define CHECK_SYS_SSE_SUPPORT if (!CPU_Sys_Is_SSE_Supported()) return False; #else @@ -232,117 +416,364 @@ #endif -static UInt32 X86_CPUID_ECX_Get_Flags() +#if !defined(MY_CPU_AMD64) + +BoolInt CPU_IsSupported_CMOV(void) { - Cx86cpuid p; - CHECK_SYS_SSE_SUPPORT - if (!x86cpuid_CheckAndRead(&p)) + UInt32 a[4]; + if (!x86cpuid_Func_1(&a[0])) return 0; - return p.c; + return (BoolInt)(a[3] >> 15) & 1; } -BoolInt CPU_IsSupported_AES() +BoolInt CPU_IsSupported_SSE(void) { - return (X86_CPUID_ECX_Get_Flags() >> 25) & 1; -} - -BoolInt CPU_IsSupported_SSSE3() -{ - return (X86_CPUID_ECX_Get_Flags() >> 9) & 1; -} - -BoolInt CPU_IsSupported_SSE41() -{ - return (X86_CPUID_ECX_Get_Flags() >> 19) & 1; -} - -BoolInt CPU_IsSupported_SHA() -{ - Cx86cpuid p; + UInt32 a[4]; CHECK_SYS_SSE_SUPPORT - if (!x86cpuid_CheckAndRead(&p)) - return False; - - if (p.maxFunc < 7) - return False; - { - UInt32 d[4] = { 0 }; - MyCPUID(7, &d[0], &d[1], &d[2], &d[3]); - return (d[1] >> 29) & 1; - } + if (!x86cpuid_Func_1(&a[0])) + return 0; + return (BoolInt)(a[3] >> 25) & 1; } -// #include <stdio.h> +BoolInt CPU_IsSupported_SSE2(void) +{ + UInt32 a[4]; + CHECK_SYS_SSE_SUPPORT + if (!x86cpuid_Func_1(&a[0])) + return 0; + return (BoolInt)(a[3] >> 26) & 1; +} -#ifdef _WIN32 -#include <Windows.h> #endif -BoolInt CPU_IsSupported_AVX2() + +static UInt32 x86cpuid_Func_1_ECX(void) { - Cx86cpuid p; + UInt32 a[4]; + CHECK_SYS_SSE_SUPPORT + if (!x86cpuid_Func_1(&a[0])) + return 0; + return a[2]; +} + +BoolInt CPU_IsSupported_AES(void) +{ + return (BoolInt)(x86cpuid_Func_1_ECX() >> 25) & 1; +} + +BoolInt CPU_IsSupported_SSSE3(void) +{ + return (BoolInt)(x86cpuid_Func_1_ECX() >> 9) & 1; +} + +BoolInt CPU_IsSupported_SSE41(void) +{ + return (BoolInt)(x86cpuid_Func_1_ECX() >> 19) & 1; +} + +BoolInt CPU_IsSupported_SHA(void) +{ CHECK_SYS_SSE_SUPPORT - #ifdef _WIN32 - #define MY__PF_XSAVE_ENABLED 17 - if (!IsProcessorFeaturePresent(MY__PF_XSAVE_ENABLED)) - return False; - #endif - - if (!x86cpuid_CheckAndRead(&p)) - return False; - if (p.maxFunc < 7) + if (z7_x86_cpuid_GetMaxFunc() < 7) return False; { - UInt32 d[4] = { 0 }; - MyCPUID(7, &d[0], &d[1], &d[2], &d[3]); - // printf("\ncpuid(7): ebx=%8x ecx=%8x\n", d[1], d[2]); - return 1 - & (d[1] >> 5); // avx2 + UInt32 d[4]; + z7_x86_cpuid(d, 7); + return (BoolInt)(d[1] >> 29) & 1; } } -BoolInt CPU_IsSupported_VAES_AVX2() + +BoolInt CPU_IsSupported_SHA512(void) { - Cx86cpuid p; - CHECK_SYS_SSE_SUPPORT + if (!CPU_IsSupported_AVX2()) return False; // maybe CPU_IsSupported_AVX() is enough here - #ifdef _WIN32 - #define MY__PF_XSAVE_ENABLED 17 - if (!IsProcessorFeaturePresent(MY__PF_XSAVE_ENABLED)) - return False; - #endif - - if (!x86cpuid_CheckAndRead(&p)) - return False; - if (p.maxFunc < 7) + if (z7_x86_cpuid_GetMaxFunc() < 7) return False; { - UInt32 d[4] = { 0 }; - MyCPUID(7, &d[0], &d[1], &d[2], &d[3]); - // printf("\ncpuid(7): ebx=%8x ecx=%8x\n", d[1], d[2]); - return 1 - & (d[1] >> 5) // avx2 - // & (d[1] >> 31) // avx512vl - & (d[2] >> 9); // vaes // VEX-256/EVEX + UInt32 d[4]; + z7_x86_cpuid_subFunc(d, 7, 0); + if (d[0] < 1) // d[0] - is max supported subleaf value + return False; + z7_x86_cpuid_subFunc(d, 7, 1); + return (BoolInt)(d[0]) & 1; } } -BoolInt CPU_IsSupported_PageGB() +/* +MSVC: _xgetbv() intrinsic is available since VS2010SP1. + MSVC also defines (_XCR_XFEATURE_ENABLED_MASK) macro in + <immintrin.h> that we can use or check. + For any 32-bit x86 we can use asm code in MSVC, + but MSVC asm code is huge after compilation. + So _xgetbv() is better + +ICC: _xgetbv() intrinsic is available (in what version of ICC?) + ICC defines (__GNUC___) and it supports gnu assembler + also ICC supports MASM style code with -use-msasm switch. + but ICC doesn't support __attribute__((__target__)) + +GCC/CLANG 9: + _xgetbv() is macro that works via __builtin_ia32_xgetbv() + and we need __attribute__((__target__("xsave")). + But with __target__("xsave") the function will be not + inlined to function that has no __target__("xsave") attribute. + If we want _xgetbv() call inlining, then we should use asm version + instead of calling _xgetbv(). + Note:intrinsic is broke before GCC 8.2: + https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85684 +*/ + +#if defined(__INTEL_COMPILER) && (__INTEL_COMPILER >= 1100) \ + || defined(_MSC_VER) && (_MSC_VER >= 1600) && (_MSC_FULL_VER >= 160040219) \ + || defined(__GNUC__) && (__GNUC__ >= 9) \ + || defined(__clang__) && (__clang_major__ >= 9) +// we define ATTRIB_XGETBV, if we want to use predefined _xgetbv() from compiler +#if defined(__INTEL_COMPILER) +#define ATTRIB_XGETBV +#elif defined(__GNUC__) || defined(__clang__) +// we don't define ATTRIB_XGETBV here, because asm version is better for inlining. +// #define ATTRIB_XGETBV __attribute__((__target__("xsave"))) +#else +#define ATTRIB_XGETBV +#endif +#endif + +#if defined(ATTRIB_XGETBV) +#include <immintrin.h> +#endif + + +// XFEATURE_ENABLED_MASK/XCR0 +#define MY_XCR_XFEATURE_ENABLED_MASK 0 + +#if defined(ATTRIB_XGETBV) +ATTRIB_XGETBV +#endif +static UInt64 x86_xgetbv_0(UInt32 num) { - Cx86cpuid cpuid; - if (!x86cpuid_CheckAndRead(&cpuid)) +#if defined(ATTRIB_XGETBV) + { + return + #if (defined(_MSC_VER)) + _xgetbv(num); + #else + __builtin_ia32_xgetbv( + #if !defined(__clang__) + (int) + #endif + num); + #endif + } + +#elif defined(__GNUC__) || defined(__clang__) || defined(__SUNPRO_CC) + + UInt32 a, d; + #if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)) + __asm__ + ( + "xgetbv" + : "=a"(a), "=d"(d) : "c"(num) : "cc" + ); + #else // is old gcc + __asm__ + ( + ".byte 0x0f, 0x01, 0xd0" "\n\t" + : "=a"(a), "=d"(d) : "c"(num) : "cc" + ); + #endif + return ((UInt64)d << 32) | a; + // return a; + +#elif defined(_MSC_VER) && !defined(MY_CPU_AMD64) + + UInt32 a, d; + __asm { + push eax + push edx + push ecx + mov ecx, num; + // xor ecx, ecx // = MY_XCR_XFEATURE_ENABLED_MASK + _emit 0x0f + _emit 0x01 + _emit 0xd0 + mov a, eax + mov d, edx + pop ecx + pop edx + pop eax + } + return ((UInt64)d << 32) | a; + // return a; + +#else // it's unknown compiler + // #error "Need xgetbv function" + UNUSED_VAR(num) + // for MSVC-X64 we could call external function from external file. + /* Actually we had checked OSXSAVE/AVX in cpuid before. + So it's expected that OS supports at least AVX and below. */ + // if (num != MY_XCR_XFEATURE_ENABLED_MASK) return 0; // if not XCR0 + return + // (1 << 0) | // x87 + (1 << 1) // SSE + | (1 << 2); // AVX + +#endif +} + +#ifdef _WIN32 +/* + Windows versions do not know about new ISA extensions that + can be introduced. But we still can use new extensions, + even if Windows doesn't report about supporting them, + But we can use new extensions, only if Windows knows about new ISA extension + that changes the number or size of registers: SSE, AVX/XSAVE, AVX512 + So it's enough to check + MY_PF_AVX_INSTRUCTIONS_AVAILABLE + instead of + MY_PF_AVX2_INSTRUCTIONS_AVAILABLE +*/ +#define MY_PF_XSAVE_ENABLED 17 +// #define MY_PF_SSSE3_INSTRUCTIONS_AVAILABLE 36 +// #define MY_PF_SSE4_1_INSTRUCTIONS_AVAILABLE 37 +// #define MY_PF_SSE4_2_INSTRUCTIONS_AVAILABLE 38 +// #define MY_PF_AVX_INSTRUCTIONS_AVAILABLE 39 +// #define MY_PF_AVX2_INSTRUCTIONS_AVAILABLE 40 +// #define MY_PF_AVX512F_INSTRUCTIONS_AVAILABLE 41 +#endif + +BoolInt CPU_IsSupported_AVX(void) +{ + #ifdef _WIN32 + if (!IsProcessorFeaturePresent(MY_PF_XSAVE_ENABLED)) + return False; + /* PF_AVX_INSTRUCTIONS_AVAILABLE probably is supported starting from + some latest Win10 revisions. But we need AVX in older Windows also. + So we don't use the following check: */ + /* + if (!IsProcessorFeaturePresent(MY_PF_AVX_INSTRUCTIONS_AVAILABLE)) + return False; + */ + #endif + + /* + OS must use new special XSAVE/XRSTOR instructions to save + AVX registers when it required for context switching. + At OS statring: + OS sets CR4.OSXSAVE flag to signal the processor that OS supports the XSAVE extensions. + Also OS sets bitmask in XCR0 register that defines what + registers will be processed by XSAVE instruction: + XCR0.SSE[bit 0] - x87 registers and state + XCR0.SSE[bit 1] - SSE registers and state + XCR0.AVX[bit 2] - AVX registers and state + CR4.OSXSAVE is reflected to CPUID.1:ECX.OSXSAVE[bit 27]. + So we can read that bit in user-space. + XCR0 is available for reading in user-space by new XGETBV instruction. + */ + { + const UInt32 c = x86cpuid_Func_1_ECX(); + if (0 == (1 + & (c >> 28) // AVX instructions are supported by hardware + & (c >> 27))) // OSXSAVE bit: XSAVE and related instructions are enabled by OS. + return False; + } + + /* also we can check + CPUID.1:ECX.XSAVE [bit 26] : that shows that + XSAVE, XRESTOR, XSETBV, XGETBV instructions are supported by hardware. + But that check is redundant, because if OSXSAVE bit is set, then XSAVE is also set */ + + /* If OS have enabled XSAVE extension instructions (OSXSAVE == 1), + in most cases we expect that OS also will support storing/restoring + for AVX and SSE states at least. + But to be ensure for that we call user-space instruction + XGETBV(0) to get XCR0 value that contains bitmask that defines + what exact states(registers) OS have enabled for storing/restoring. + */ + + { + const UInt32 bm = (UInt32)x86_xgetbv_0(MY_XCR_XFEATURE_ENABLED_MASK); + // printf("\n=== XGetBV=0x%x\n", bm); + return 1 + & (BoolInt)(bm >> 1) // SSE state is supported (set by OS) for storing/restoring + & (BoolInt)(bm >> 2); // AVX state is supported (set by OS) for storing/restoring + } + // since Win7SP1: we can use GetEnabledXStateFeatures(); +} + + +BoolInt CPU_IsSupported_AVX2(void) +{ + if (!CPU_IsSupported_AVX()) + return False; + if (z7_x86_cpuid_GetMaxFunc() < 7) return False; { - UInt32 d[4] = { 0 }; - MyCPUID(0x80000000, &d[0], &d[1], &d[2], &d[3]); - if (d[0] < 0x80000001) + UInt32 d[4]; + z7_x86_cpuid(d, 7); + // printf("\ncpuid(7): ebx=%8x ecx=%8x\n", d[1], d[2]); + return 1 + & (BoolInt)(d[1] >> 5); // avx2 + } +} + +#if 0 +BoolInt CPU_IsSupported_AVX512F_AVX512VL(void) +{ + if (!CPU_IsSupported_AVX()) + return False; + if (z7_x86_cpuid_GetMaxFunc() < 7) + return False; + { + UInt32 d[4]; + BoolInt v; + z7_x86_cpuid(d, 7); + // printf("\ncpuid(7): ebx=%8x ecx=%8x\n", d[1], d[2]); + v = 1 + & (BoolInt)(d[1] >> 16) // avx512f + & (BoolInt)(d[1] >> 31); // avx512vl + if (!v) return False; } { - UInt32 d[4] = { 0 }; - MyCPUID(0x80000001, &d[0], &d[1], &d[2], &d[3]); - return (d[3] >> 26) & 1; + const UInt32 bm = (UInt32)x86_xgetbv_0(MY_XCR_XFEATURE_ENABLED_MASK); + // printf("\n=== XGetBV=0x%x\n", bm); + return 1 + & (BoolInt)(bm >> 5) // OPMASK + & (BoolInt)(bm >> 6) // ZMM upper 256-bit + & (BoolInt)(bm >> 7); // ZMM16 ... ZMM31 + } +} +#endif + +BoolInt CPU_IsSupported_VAES_AVX2(void) +{ + if (!CPU_IsSupported_AVX()) + return False; + if (z7_x86_cpuid_GetMaxFunc() < 7) + return False; + { + UInt32 d[4]; + z7_x86_cpuid(d, 7); + // printf("\ncpuid(7): ebx=%8x ecx=%8x\n", d[1], d[2]); + return 1 + & (BoolInt)(d[1] >> 5) // avx2 + // & (d[1] >> 31) // avx512vl + & (BoolInt)(d[2] >> 9); // vaes // VEX-256/EVEX + } +} + +BoolInt CPU_IsSupported_PageGB(void) +{ + CHECK_CPUID_IS_SUPPORTED + { + UInt32 d[4]; + z7_x86_cpuid(d, 0x80000000); + if (d[0] < 0x80000001) + return False; + z7_x86_cpuid(d, 0x80000001); + return (BoolInt)(d[3] >> 26) & 1; } } @@ -351,11 +782,11 @@ #ifdef _WIN32 -#include <Windows.h> +#include "7zWindows.h" -BoolInt CPU_IsSupported_CRC32() { return IsProcessorFeaturePresent(PF_ARM_V8_CRC32_INSTRUCTIONS_AVAILABLE) ? 1 : 0; } -BoolInt CPU_IsSupported_CRYPTO() { return IsProcessorFeaturePresent(PF_ARM_V8_CRYPTO_INSTRUCTIONS_AVAILABLE) ? 1 : 0; } -BoolInt CPU_IsSupported_NEON() { return IsProcessorFeaturePresent(PF_ARM_NEON_INSTRUCTIONS_AVAILABLE) ? 1 : 0; } +BoolInt CPU_IsSupported_CRC32(void) { return IsProcessorFeaturePresent(PF_ARM_V8_CRC32_INSTRUCTIONS_AVAILABLE) ? 1 : 0; } +BoolInt CPU_IsSupported_CRYPTO(void) { return IsProcessorFeaturePresent(PF_ARM_V8_CRYPTO_INSTRUCTIONS_AVAILABLE) ? 1 : 0; } +BoolInt CPU_IsSupported_NEON(void) { return IsProcessorFeaturePresent(PF_ARM_NEON_INSTRUCTIONS_AVAILABLE) ? 1 : 0; } #else @@ -378,30 +809,41 @@ } } */ +/* + Print_sysctlbyname("hw.pagesize"); + Print_sysctlbyname("machdep.cpu.brand_string"); +*/ -static BoolInt My_sysctlbyname_Get_BoolInt(const char *name) +static BoolInt z7_sysctlbyname_Get_BoolInt(const char *name) { UInt32 val = 0; - if (My_sysctlbyname_Get_UInt32(name, &val) == 0 && val == 1) + if (z7_sysctlbyname_Get_UInt32(name, &val) == 0 && val == 1) return 1; return 0; } - /* - Print_sysctlbyname("hw.pagesize"); - Print_sysctlbyname("machdep.cpu.brand_string"); - */ - BoolInt CPU_IsSupported_CRC32(void) { - return My_sysctlbyname_Get_BoolInt("hw.optional.armv8_crc32"); + return z7_sysctlbyname_Get_BoolInt("hw.optional.armv8_crc32"); } BoolInt CPU_IsSupported_NEON(void) { - return My_sysctlbyname_Get_BoolInt("hw.optional.neon"); + return z7_sysctlbyname_Get_BoolInt("hw.optional.neon"); } +BoolInt CPU_IsSupported_SHA512(void) +{ + return z7_sysctlbyname_Get_BoolInt("hw.optional.armv8_2_sha512"); +} + +/* +BoolInt CPU_IsSupported_SHA3(void) +{ + return z7_sysctlbyname_Get_BoolInt("hw.optional.armv8_2_sha3"); +} +*/ + #ifdef MY_CPU_ARM64 #define APPLE_CRYPTO_SUPPORT_VAL 1 #else @@ -415,35 +857,70 @@ #else // __APPLE__ -#include <sys/auxv.h> +#if defined(__GLIBC__) && (__GLIBC__ * 100 + __GLIBC_MINOR__ >= 216) + #define Z7_GETAUXV_AVAILABLE +#else +// #pragma message("=== is not NEW GLIBC === ") + #if defined __has_include + #if __has_include (<sys/auxv.h>) +// #pragma message("=== sys/auxv.h is avail=== ") + #define Z7_GETAUXV_AVAILABLE + #endif + #endif +#endif -#if !defined(ARMV8_OS_FUCHSIA) +#ifdef Z7_GETAUXV_AVAILABLE +// #pragma message("=== Z7_GETAUXV_AVAILABLE === ") +#include <sys/auxv.h> #define USE_HWCAP -#endif // !defined(ARMV8_OS_FUCHSIA) +#endif #ifdef USE_HWCAP +#if defined(__FreeBSD__) +static unsigned long MY_getauxval(int aux) +{ + unsigned long val; + if (elf_aux_info(aux, &val, sizeof(val))) + return 0; + return val; +} +#else +#define MY_getauxval getauxval + #if defined __has_include + #if __has_include (<asm/hwcap.h>) #include <asm/hwcap.h> + #endif + #endif +#endif #define MY_HWCAP_CHECK_FUNC_2(name1, name2) \ - BoolInt CPU_IsSupported_ ## name1() { return (getauxval(AT_HWCAP) & (HWCAP_ ## name2)) ? 1 : 0; } + BoolInt CPU_IsSupported_ ## name1(void) { return (MY_getauxval(AT_HWCAP) & (HWCAP_ ## name2)); } #ifdef MY_CPU_ARM64 #define MY_HWCAP_CHECK_FUNC(name) \ MY_HWCAP_CHECK_FUNC_2(name, name) +#if 1 || defined(__ARM_NEON) + BoolInt CPU_IsSupported_NEON(void) { return True; } +#else MY_HWCAP_CHECK_FUNC_2(NEON, ASIMD) +#endif // MY_HWCAP_CHECK_FUNC (ASIMD) #elif defined(MY_CPU_ARM) #define MY_HWCAP_CHECK_FUNC(name) \ - BoolInt CPU_IsSupported_ ## name() { return (getauxval(AT_HWCAP2) & (HWCAP2_ ## name)) ? 1 : 0; } + BoolInt CPU_IsSupported_ ## name(void) { return (MY_getauxval(AT_HWCAP2) & (HWCAP2_ ## name)); } MY_HWCAP_CHECK_FUNC_2(NEON, NEON) #endif #else // USE_HWCAP #define MY_HWCAP_CHECK_FUNC(name) \ - BoolInt CPU_IsSupported_ ## name() { return 0; } + BoolInt CPU_IsSupported_ ## name(void) { return 0; } +#if defined(__ARM_NEON) + BoolInt CPU_IsSupported_NEON(void) { return True; } +#else MY_HWCAP_CHECK_FUNC(NEON) +#endif #endif // USE_HWCAP @@ -451,6 +928,19 @@ MY_HWCAP_CHECK_FUNC (SHA1) MY_HWCAP_CHECK_FUNC (SHA2) MY_HWCAP_CHECK_FUNC (AES) +#ifdef MY_CPU_ARM64 +// <hwcap.h> supports HWCAP_SHA512 and HWCAP_SHA3 since 2017. +// we define them here, if they are not defined +#ifndef HWCAP_SHA3 +// #define HWCAP_SHA3 (1 << 17) +#endif +#ifndef HWCAP_SHA512 +// #pragma message("=== HWCAP_SHA512 define === ") +#define HWCAP_SHA512 (1 << 21) +#endif +MY_HWCAP_CHECK_FUNC (SHA512) +// MY_HWCAP_CHECK_FUNC (SHA3) +#endif #endif // __APPLE__ #endif // _WIN32 @@ -463,15 +953,15 @@ #include <sys/sysctl.h> -int My_sysctlbyname_Get(const char *name, void *buf, size_t *bufSize) +int z7_sysctlbyname_Get(const char *name, void *buf, size_t *bufSize) { return sysctlbyname(name, buf, bufSize, NULL, 0); } -int My_sysctlbyname_Get_UInt32(const char *name, UInt32 *val) +int z7_sysctlbyname_Get_UInt32(const char *name, UInt32 *val) { size_t bufSize = sizeof(*val); - int res = My_sysctlbyname_Get(name, val, &bufSize); + const int res = z7_sysctlbyname_Get(name, val, &bufSize); if (res == 0 && bufSize != sizeof(*val)) return EFAULT; return res;
diff --git a/third_party/lzma_sdk/C/CpuArch.h b/third_party/lzma_sdk/C/CpuArch.h index 8cd55be..2843b45 100644 --- a/third_party/lzma_sdk/C/CpuArch.h +++ b/third_party/lzma_sdk/C/CpuArch.h
@@ -1,8 +1,8 @@ /* CpuArch.h -- CPU specific code -2022-07-15 : Igor Pavlov : Public domain */ +Igor Pavlov : Public domain */ -#ifndef __CPU_ARCH_H -#define __CPU_ARCH_H +#ifndef ZIP7_INC_CPU_ARCH_H +#define ZIP7_INC_CPU_ARCH_H #include "7zTypes.h" @@ -20,6 +20,7 @@ MY_CPU_64BIT doesn't mean that (sizeof(void *) == 8) */ +#if !defined(_M_ARM64EC) #if defined(_M_X64) \ || defined(_M_AMD64) \ || defined(__x86_64__) \ @@ -35,6 +36,7 @@ #endif #define MY_CPU_64BIT #endif +#endif #if defined(_M_IX86) \ @@ -47,11 +49,26 @@ #if defined(_M_ARM64) \ + || defined(_M_ARM64EC) \ || defined(__AARCH64EL__) \ || defined(__AARCH64EB__) \ || defined(__aarch64__) #define MY_CPU_ARM64 - #define MY_CPU_NAME "arm64" +#if defined(__ILP32__) \ + || defined(__SIZEOF_POINTER__) && (__SIZEOF_POINTER__ == 4) + #define MY_CPU_NAME "arm64-32" + #define MY_CPU_SIZEOF_POINTER 4 +#elif defined(__SIZEOF_POINTER__) && (__SIZEOF_POINTER__ == 16) + #define MY_CPU_NAME "arm64-128" + #define MY_CPU_SIZEOF_POINTER 16 +#else +#if defined(_M_ARM64EC) + #define MY_CPU_NAME "arm64ec" +#else + #define MY_CPU_NAME "arm64" +#endif + #define MY_CPU_SIZEOF_POINTER 8 +#endif #define MY_CPU_64BIT #endif @@ -68,8 +85,10 @@ #define MY_CPU_ARM #if defined(__thumb__) || defined(__THUMBEL__) || defined(_M_ARMT) + #define MY_CPU_ARMT #define MY_CPU_NAME "armt" #else + #define MY_CPU_ARM32 #define MY_CPU_NAME "arm" #endif /* #define MY_CPU_32BIT */ @@ -103,6 +122,8 @@ || defined(__PPC__) \ || defined(_POWER) +#define MY_CPU_PPC_OR_PPC64 + #if defined(__ppc64__) \ || defined(__powerpc64__) \ || defined(_LP64) \ @@ -123,8 +144,36 @@ #endif +#if defined(__sparc__) \ + || defined(__sparc) + #define MY_CPU_SPARC + #if defined(__LP64__) \ + || defined(_LP64) \ + || defined(__SIZEOF_POINTER__) && (__SIZEOF_POINTER__ == 8) + #define MY_CPU_NAME "sparcv9" + #define MY_CPU_SIZEOF_POINTER 8 + #define MY_CPU_64BIT + #elif defined(__sparc_v9__) \ + || defined(__sparcv9) + #define MY_CPU_64BIT + #if defined(__SIZEOF_POINTER__) && (__SIZEOF_POINTER__ == 4) + #define MY_CPU_NAME "sparcv9-32" + #else + #define MY_CPU_NAME "sparcv9m" + #endif + #elif defined(__sparc_v8__) \ + || defined(__sparcv8) + #define MY_CPU_NAME "sparcv8" + #define MY_CPU_SIZEOF_POINTER 4 + #else + #define MY_CPU_NAME "sparc" + #endif +#endif + + #if defined(__riscv) \ || defined(__riscv__) + #define MY_CPU_RISCV #if __riscv_xlen == 32 #define MY_CPU_NAME "riscv32" #elif __riscv_xlen == 64 @@ -135,6 +184,39 @@ #endif +#if defined(__loongarch__) + #define MY_CPU_LOONGARCH + #if defined(__loongarch64) || defined(__loongarch_grlen) && (__loongarch_grlen == 64) + #define MY_CPU_64BIT + #endif + #if defined(__loongarch64) + #define MY_CPU_NAME "loongarch64" + #define MY_CPU_LOONGARCH64 + #else + #define MY_CPU_NAME "loongarch" + #endif +#endif + + +// #undef MY_CPU_NAME +// #undef MY_CPU_SIZEOF_POINTER +// #define __e2k__ +// #define __SIZEOF_POINTER__ 4 +#if defined(__e2k__) + #define MY_CPU_E2K + #if defined(__ILP32__) || defined(__SIZEOF_POINTER__) && (__SIZEOF_POINTER__ == 4) + #define MY_CPU_NAME "e2k-32" + #define MY_CPU_SIZEOF_POINTER 4 + #else + #define MY_CPU_NAME "e2k" + #if defined(__LP64__) || defined(__SIZEOF_POINTER__) && (__SIZEOF_POINTER__ == 8) + #define MY_CPU_SIZEOF_POINTER 8 + #endif + #endif + #define MY_CPU_64BIT +#endif + + #if defined(MY_CPU_X86) || defined(MY_CPU_AMD64) #define MY_CPU_X86_OR_AMD64 #endif @@ -165,6 +247,7 @@ || defined(MY_CPU_ARM_LE) \ || defined(MY_CPU_ARM64_LE) \ || defined(MY_CPU_IA64_LE) \ + || defined(_LITTLE_ENDIAN) \ || defined(__LITTLE_ENDIAN__) \ || defined(__ARMEL__) \ || defined(__THUMBEL__) \ @@ -197,6 +280,9 @@ #error Stop_Compiling_Bad_Endian #endif +#if !defined(MY_CPU_LE) && !defined(MY_CPU_BE) + #error Stop_Compiling_CPU_ENDIAN_must_be_detected_at_compile_time +#endif #if defined(MY_CPU_32BIT) && defined(MY_CPU_64BIT) #error Stop_Compiling_Bad_32_64_BIT @@ -238,6 +324,7 @@ #ifndef MY_CPU_NAME + // #define MY_CPU_IS_UNKNOWN #ifdef MY_CPU_LE #define MY_CPU_NAME "LE" #elif defined(MY_CPU_BE) @@ -253,24 +340,127 @@ +#ifdef __has_builtin + #define Z7_has_builtin(x) __has_builtin(x) +#else + #define Z7_has_builtin(x) 0 +#endif + + +#define Z7_BSWAP32_CONST(v) \ + ( (((UInt32)(v) << 24) ) \ + | (((UInt32)(v) << 8) & (UInt32)0xff0000) \ + | (((UInt32)(v) >> 8) & (UInt32)0xff00 ) \ + | (((UInt32)(v) >> 24) )) + + +#if defined(_MSC_VER) && (_MSC_VER >= 1300) + +#include <stdlib.h> + +/* Note: these macros will use bswap instruction (486), that is unsupported in 386 cpu */ + +#pragma intrinsic(_byteswap_ushort) +#pragma intrinsic(_byteswap_ulong) +#pragma intrinsic(_byteswap_uint64) + +#define Z7_BSWAP16(v) _byteswap_ushort(v) +#define Z7_BSWAP32(v) _byteswap_ulong (v) +#define Z7_BSWAP64(v) _byteswap_uint64(v) +#define Z7_CPU_FAST_BSWAP_SUPPORTED + +/* GCC can generate slow code that calls function for __builtin_bswap32() for: + - GCC for RISCV, if Zbb/XTHeadBb extension is not used. + - GCC for SPARC. + The code from CLANG for SPARC also is not fastest. + So we don't define Z7_CPU_FAST_BSWAP_SUPPORTED in some cases. +*/ +#elif (!defined(MY_CPU_RISCV) || defined (__riscv_zbb) || defined(__riscv_xtheadbb)) \ + && !defined(MY_CPU_SPARC) \ + && ( \ + (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3))) \ + || (defined(__clang__) && Z7_has_builtin(__builtin_bswap16)) \ + ) + +#define Z7_BSWAP16(v) __builtin_bswap16(v) +#define Z7_BSWAP32(v) __builtin_bswap32(v) +#define Z7_BSWAP64(v) __builtin_bswap64(v) +#define Z7_CPU_FAST_BSWAP_SUPPORTED + +#else + +#define Z7_BSWAP16(v) ((UInt16) \ + ( ((UInt32)(v) << 8) \ + | ((UInt32)(v) >> 8) \ + )) + +#define Z7_BSWAP32(v) Z7_BSWAP32_CONST(v) + +#define Z7_BSWAP64(v) \ + ( ( ( (UInt64)(v) ) << 8 * 7 ) \ + | ( ( (UInt64)(v) & ((UInt32)0xff << 8 * 1) ) << 8 * 5 ) \ + | ( ( (UInt64)(v) & ((UInt32)0xff << 8 * 2) ) << 8 * 3 ) \ + | ( ( (UInt64)(v) & ((UInt32)0xff << 8 * 3) ) << 8 * 1 ) \ + | ( ( (UInt64)(v) >> 8 * 1 ) & ((UInt32)0xff << 8 * 3) ) \ + | ( ( (UInt64)(v) >> 8 * 3 ) & ((UInt32)0xff << 8 * 2) ) \ + | ( ( (UInt64)(v) >> 8 * 5 ) & ((UInt32)0xff << 8 * 1) ) \ + | ( ( (UInt64)(v) >> 8 * 7 ) ) \ + ) + +#endif + + // Disable MY_CPU_LE_UNALIGN. Although the underlying ISA may be able to load // unaligned words, doing so via pointer casts is undefined behavior in C and // C++, under both strict aliasing and because it is invalid to construct // unaligned pointers. Instead, load the bytes generically and leave optimizing // this to the compiler. -#if 0 #ifdef MY_CPU_LE #if defined(MY_CPU_X86_OR_AMD64) \ - || defined(MY_CPU_ARM64) - #define MY_CPU_LE_UNALIGN - #define MY_CPU_LE_UNALIGN_64 + || defined(MY_CPU_ARM64) \ + || defined(MY_CPU_RISCV) && defined(__riscv_misaligned_fast) \ + || defined(MY_CPU_E2K) && defined(__iset__) && (__iset__ >= 6) + // #define MY_CPU_LE_UNALIGN + // #define MY_CPU_LE_UNALIGN_64 #elif defined(__ARM_FEATURE_UNALIGNED) - /* gcc9 for 32-bit arm can use LDRD instruction that requires 32-bit alignment. - So we can't use unaligned 64-bit operations. */ - #define MY_CPU_LE_UNALIGN +/* === ALIGNMENT on 32-bit arm and LDRD/STRD/LDM/STM instructions. + Description of problems: +problem-1 : 32-bit ARM architecture: + multi-access (pair of 32-bit accesses) instructions (LDRD/STRD/LDM/STM) + require 32-bit (WORD) alignment (by 32-bit ARM architecture). + So there is "Alignment fault exception", if data is not aligned for 32-bit. + +problem-2 : 32-bit kernels and arm64 kernels: + 32-bit linux kernels provide fixup for these "paired" instruction "Alignment fault exception". + So unaligned paired-access instructions work via exception handler in kernel in 32-bit linux. + + But some arm64 kernels do not handle these faults in 32-bit programs. + So we have unhandled exception for such instructions. + Probably some new arm64 kernels have fixed it, and unaligned + paired-access instructions work in new kernels? + +problem-3 : compiler for 32-bit arm: + Compilers use LDRD/STRD/LDM/STM for UInt64 accesses + and for another cases where two 32-bit accesses are fused + to one multi-access instruction. + So UInt64 variables must be aligned for 32-bit, and each + 32-bit access must be aligned for 32-bit, if we want to + avoid "Alignment fault" exception (handled or unhandled). + +problem-4 : performace: + Even if unaligned access is handled by kernel, it will be slow. + So if we allow unaligned access, we can get fast unaligned + single-access, and slow unaligned paired-access. + + We don't allow unaligned access on 32-bit arm, because compiler + genarates paired-access instructions that require 32-bit alignment, + and some arm64 kernels have no handler for these instructions. + Also unaligned paired-access instructions will be slow, if kernel handles them. +*/ + // it must be disabled: + // #define MY_CPU_LE_UNALIGN #endif #endif -#endif #ifdef MY_CPU_LE_UNALIGN @@ -279,13 +469,11 @@ #define GetUi32(p) (*(const UInt32 *)(const void *)(p)) #ifdef MY_CPU_LE_UNALIGN_64 #define GetUi64(p) (*(const UInt64 *)(const void *)(p)) +#define SetUi64(p, v) { *(UInt64 *)(void *)(p) = (v); } #endif #define SetUi16(p, v) { *(UInt16 *)(void *)(p) = (v); } #define SetUi32(p, v) { *(UInt32 *)(void *)(p) = (v); } -#ifdef MY_CPU_LE_UNALIGN_64 -#define SetUi64(p, v) { *(UInt64 *)(void *)(p) = (v); } -#endif #else @@ -312,50 +500,33 @@ #endif -#ifndef MY_CPU_LE_UNALIGN_64 - +#ifndef GetUi64 #define GetUi64(p) (GetUi32(p) | ((UInt64)GetUi32(((const Byte *)(p)) + 4) << 32)) +#endif +#ifndef SetUi64 #define SetUi64(p, v) { Byte *_ppp2_ = (Byte *)(p); UInt64 _vvv2_ = (v); \ - SetUi32(_ppp2_ , (UInt32)_vvv2_); \ - SetUi32(_ppp2_ + 4, (UInt32)(_vvv2_ >> 32)); } - + SetUi32(_ppp2_ , (UInt32)_vvv2_) \ + SetUi32(_ppp2_ + 4, (UInt32)(_vvv2_ >> 32)) } #endif +#if defined(MY_CPU_LE_UNALIGN) && defined(Z7_CPU_FAST_BSWAP_SUPPORTED) - -#ifdef __has_builtin - #define MY__has_builtin(x) __has_builtin(x) +#if 0 +// Z7_BSWAP16 can be slow for x86-msvc +#define GetBe16_to32(p) (Z7_BSWAP16 (*(const UInt16 *)(const void *)(p))) #else - #define MY__has_builtin(x) 0 +#define GetBe16_to32(p) (Z7_BSWAP32 (*(const UInt16 *)(const void *)(p)) >> 16) #endif -#if defined(MY_CPU_LE_UNALIGN) && /* defined(_WIN64) && */ defined(_MSC_VER) && (_MSC_VER >= 1300) +#define GetBe32(p) Z7_BSWAP32 (*(const UInt32 *)(const void *)(p)) +#define SetBe32(p, v) { (*(UInt32 *)(void *)(p)) = Z7_BSWAP32(v); } -/* Note: we use bswap instruction, that is unsupported in 386 cpu */ - -#include <stdlib.h> - -#pragma intrinsic(_byteswap_ushort) -#pragma intrinsic(_byteswap_ulong) -#pragma intrinsic(_byteswap_uint64) - -/* #define GetBe16(p) _byteswap_ushort(*(const UInt16 *)(const Byte *)(p)) */ -#define GetBe32(p) _byteswap_ulong (*(const UInt32 *)(const void *)(p)) -#define GetBe64(p) _byteswap_uint64(*(const UInt64 *)(const void *)(p)) - -#define SetBe32(p, v) (*(UInt32 *)(void *)(p)) = _byteswap_ulong(v) - -#elif defined(MY_CPU_LE_UNALIGN) && ( \ - (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3))) \ - || (defined(__clang__) && MY__has_builtin(__builtin_bswap16)) ) - -/* #define GetBe16(p) __builtin_bswap16(*(const UInt16 *)(const void *)(p)) */ -#define GetBe32(p) __builtin_bswap32(*(const UInt32 *)(const void *)(p)) -#define GetBe64(p) __builtin_bswap64(*(const UInt64 *)(const void *)(p)) - -#define SetBe32(p, v) (*(UInt32 *)(void *)(p)) = __builtin_bswap32(v) +#if defined(MY_CPU_LE_UNALIGN_64) +#define GetBe64(p) Z7_BSWAP64 (*(const UInt64 *)(const void *)(p)) +#define SetBe64(p, v) { (*(UInt64 *)(void *)(p)) = Z7_BSWAP64(v); } +#endif #else @@ -365,8 +536,6 @@ ((UInt32)((const Byte *)(p))[2] << 8) | \ ((const Byte *)(p))[3] ) -#define GetBe64(p) (((UInt64)GetBe32(p) << 32) | GetBe32(((const Byte *)(p)) + 4)) - #define SetBe32(p, v) { Byte *_ppp_ = (Byte *)(p); UInt32 _vvv_ = (v); \ _ppp_[0] = (Byte)(_vvv_ >> 24); \ _ppp_[1] = (Byte)(_vvv_ >> 16); \ @@ -375,53 +544,113 @@ #endif +#ifndef GetBe64 +#define GetBe64(p) (((UInt64)GetBe32(p) << 32) | GetBe32(((const Byte *)(p)) + 4)) +#endif + +#ifndef SetBe64 +#define SetBe64(p, v) { Byte *_ppp_ = (Byte *)(p); UInt64 _vvv_ = (v); \ + _ppp_[0] = (Byte)(_vvv_ >> 56); \ + _ppp_[1] = (Byte)(_vvv_ >> 48); \ + _ppp_[2] = (Byte)(_vvv_ >> 40); \ + _ppp_[3] = (Byte)(_vvv_ >> 32); \ + _ppp_[4] = (Byte)(_vvv_ >> 24); \ + _ppp_[5] = (Byte)(_vvv_ >> 16); \ + _ppp_[6] = (Byte)(_vvv_ >> 8); \ + _ppp_[7] = (Byte)_vvv_; } +#endif #ifndef GetBe16 - +#ifdef GetBe16_to32 +#define GetBe16(p) ( (UInt16) GetBe16_to32(p)) +#else #define GetBe16(p) ( (UInt16) ( \ ((UInt16)((const Byte *)(p))[0] << 8) | \ ((const Byte *)(p))[1] )) - +#endif #endif +#if defined(MY_CPU_BE) +#define Z7_CONV_BE_TO_NATIVE_CONST32(v) (v) +#define Z7_CONV_LE_TO_NATIVE_CONST32(v) Z7_BSWAP32_CONST(v) +#define Z7_CONV_NATIVE_TO_BE_32(v) (v) +#elif defined(MY_CPU_LE) +#define Z7_CONV_BE_TO_NATIVE_CONST32(v) Z7_BSWAP32_CONST(v) +#define Z7_CONV_LE_TO_NATIVE_CONST32(v) (v) +#define Z7_CONV_NATIVE_TO_BE_32(v) Z7_BSWAP32(v) +#else +#error Stop_Compiling_Unknown_Endian_CONV +#endif + + +#if defined(MY_CPU_BE) + +#define GetBe64a(p) (*(const UInt64 *)(const void *)(p)) +#define GetBe32a(p) (*(const UInt32 *)(const void *)(p)) +#define GetBe16a(p) (*(const UInt16 *)(const void *)(p)) +#define SetBe32a(p, v) { *(UInt32 *)(void *)(p) = (v); } +#define SetBe16a(p, v) { *(UInt16 *)(void *)(p) = (v); } + +#define GetUi64a(p) GetUi64(p) +#define GetUi32a(p) GetUi32(p) +#define GetUi16a(p) GetUi16(p) +#define SetUi32a(p, v) SetUi32(p, v) +#define SetUi16a(p, v) SetUi16(p, v) + +#elif defined(MY_CPU_LE) + +#define GetUi64a(p) (*(const UInt64 *)(const void *)(p)) +#define GetUi32a(p) (*(const UInt32 *)(const void *)(p)) +#define GetUi16a(p) (*(const UInt16 *)(const void *)(p)) +#define SetUi32a(p, v) { *(UInt32 *)(void *)(p) = (v); } +#define SetUi16a(p, v) { *(UInt16 *)(void *)(p) = (v); } + +#define GetBe64a(p) GetBe64(p) +#define GetBe32a(p) GetBe32(p) +#define GetBe16a(p) GetBe16(p) +#define SetBe32a(p, v) SetBe32(p, v) +#define SetBe16a(p, v) SetBe16(p, v) + +#else +#error Stop_Compiling_Unknown_Endian_CPU_a +#endif + + +#ifndef GetBe16_to32 +#define GetBe16_to32(p) GetBe16(p) +#endif + + +#if defined(MY_CPU_X86_OR_AMD64) \ + || defined(MY_CPU_ARM_OR_ARM64) \ + || defined(MY_CPU_PPC_OR_PPC64) + #define Z7_CPU_FAST_ROTATE_SUPPORTED +#endif + #ifdef MY_CPU_X86_OR_AMD64 -typedef struct -{ - UInt32 maxFunc; - UInt32 vendor[3]; - UInt32 ver; - UInt32 b; - UInt32 c; - UInt32 d; -} Cx86cpuid; - -enum -{ - CPU_FIRM_INTEL, - CPU_FIRM_AMD, - CPU_FIRM_VIA -}; - -void MyCPUID(UInt32 function, UInt32 *a, UInt32 *b, UInt32 *c, UInt32 *d); - -BoolInt x86cpuid_CheckAndRead(Cx86cpuid *p); -int x86cpuid_GetFirm(const Cx86cpuid *p); - -#define x86cpuid_GetFamily(ver) (((ver >> 16) & 0xFF0) | ((ver >> 8) & 0xF)) -#define x86cpuid_GetModel(ver) (((ver >> 12) & 0xF0) | ((ver >> 4) & 0xF)) -#define x86cpuid_GetStepping(ver) (ver & 0xF) - -BoolInt CPU_Is_InOrder(void); +void Z7_FASTCALL z7_x86_cpuid(UInt32 a[4], UInt32 function); +UInt32 Z7_FASTCALL z7_x86_cpuid_GetMaxFunc(void); +#if defined(MY_CPU_AMD64) +#define Z7_IF_X86_CPUID_SUPPORTED +#else +#define Z7_IF_X86_CPUID_SUPPORTED if (z7_x86_cpuid_GetMaxFunc()) +#endif BoolInt CPU_IsSupported_AES(void); +BoolInt CPU_IsSupported_AVX(void); BoolInt CPU_IsSupported_AVX2(void); +BoolInt CPU_IsSupported_AVX512F_AVX512VL(void); BoolInt CPU_IsSupported_VAES_AVX2(void); +BoolInt CPU_IsSupported_CMOV(void); +BoolInt CPU_IsSupported_SSE(void); +BoolInt CPU_IsSupported_SSE2(void); BoolInt CPU_IsSupported_SSSE3(void); BoolInt CPU_IsSupported_SSE41(void); BoolInt CPU_IsSupported_SHA(void); +BoolInt CPU_IsSupported_SHA512(void); BoolInt CPU_IsSupported_PageGB(void); #elif defined(MY_CPU_ARM_OR_ARM64) @@ -439,12 +668,13 @@ BoolInt CPU_IsSupported_SHA2(void); BoolInt CPU_IsSupported_AES(void); #endif +BoolInt CPU_IsSupported_SHA512(void); #endif #if defined(__APPLE__) -int My_sysctlbyname_Get(const char *name, void *buf, size_t *bufSize); -int My_sysctlbyname_Get_UInt32(const char *name, UInt32 *val); +int z7_sysctlbyname_Get(const char *name, void *buf, size_t *bufSize); +int z7_sysctlbyname_Get_UInt32(const char *name, UInt32 *val); #endif EXTERN_C_END
diff --git a/third_party/lzma_sdk/C/Delta.h b/third_party/lzma_sdk/C/Delta.h index 2fa54ad6..7060954 100644 --- a/third_party/lzma_sdk/C/Delta.h +++ b/third_party/lzma_sdk/C/Delta.h
@@ -1,8 +1,8 @@ /* Delta.h -- Delta converter -2013-01-18 : Igor Pavlov : Public domain */ +2023-03-03 : Igor Pavlov : Public domain */ -#ifndef __DELTA_H -#define __DELTA_H +#ifndef ZIP7_INC_DELTA_H +#define ZIP7_INC_DELTA_H #include "7zTypes.h"
diff --git a/third_party/lzma_sdk/C/DllSecur.c b/third_party/lzma_sdk/C/DllSecur.c index dce0c96..bbbfc0a 100644 --- a/third_party/lzma_sdk/C/DllSecur.c +++ b/third_party/lzma_sdk/C/DllSecur.c
@@ -1,114 +1,99 @@ /* DllSecur.c -- DLL loading security -2022-07-15 : Igor Pavlov : Public domain */ +2023-12-03 : Igor Pavlov : Public domain */ #include "Precomp.h" #ifdef _WIN32 -#include <Windows.h> +#include "7zWindows.h" #include "DllSecur.h" #ifndef UNDER_CE -#if defined(__GNUC__) && (__GNUC__ >= 8) - #pragma GCC diagnostic ignored "-Wcast-function-type" -#endif +Z7_DIAGNOSTIC_IGNORE_CAST_FUNCTION typedef BOOL (WINAPI *Func_SetDefaultDllDirectories)(DWORD DirectoryFlags); #define MY_LOAD_LIBRARY_SEARCH_USER_DIRS 0x400 #define MY_LOAD_LIBRARY_SEARCH_SYSTEM32 0x800 +#define DELIM "\0" + static const char * const g_Dlls = + "userenv" + DELIM "setupapi" + DELIM "apphelp" + DELIM "propsys" + DELIM "dwmapi" + DELIM "cryptbase" + DELIM "oleacc" + DELIM "clbcatq" + DELIM "version" #ifndef _CONSOLE - "UXTHEME\0" + DELIM "uxtheme" #endif - "USERENV\0" - "SETUPAPI\0" - "APPHELP\0" - "PROPSYS\0" - "DWMAPI\0" - "CRYPTBASE\0" - "OLEACC\0" - "CLBCATQ\0" - "VERSION\0" - ; + DELIM; #endif -// #define MY_CAST_FUNC (void(*)()) -#define MY_CAST_FUNC +#ifdef __clang__ + #pragma GCC diagnostic ignored "-Wdeprecated-declarations" +#endif +#if defined (_MSC_VER) && _MSC_VER >= 1900 +// sysinfoapi.h: kit10: GetVersion was declared deprecated +#pragma warning(disable : 4996) +#endif -void My_SetDefaultDllDirectories() +#define IF_NON_VISTA_SET_DLL_DIRS_AND_RETURN \ + if ((UInt16)GetVersion() != 6) { \ + const \ + Func_SetDefaultDllDirectories setDllDirs = \ + (Func_SetDefaultDllDirectories) Z7_CAST_FUNC_C GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")), \ + "SetDefaultDllDirectories"); \ + if (setDllDirs) if (setDllDirs(MY_LOAD_LIBRARY_SEARCH_SYSTEM32 | MY_LOAD_LIBRARY_SEARCH_USER_DIRS)) return; } + +void My_SetDefaultDllDirectories(void) { #ifndef UNDER_CE - - OSVERSIONINFO vi; - vi.dwOSVersionInfoSize = sizeof(vi); - if (!GetVersionEx(&vi) || vi.dwMajorVersion != 6 || vi.dwMinorVersion != 0) - { - Func_SetDefaultDllDirectories setDllDirs = (Func_SetDefaultDllDirectories) - MY_CAST_FUNC GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")), "SetDefaultDllDirectories"); - if (setDllDirs) - if (setDllDirs(MY_LOAD_LIBRARY_SEARCH_SYSTEM32 | MY_LOAD_LIBRARY_SEARCH_USER_DIRS)) - return; - } - + IF_NON_VISTA_SET_DLL_DIRS_AND_RETURN #endif } -void LoadSecurityDlls() +void LoadSecurityDlls(void) { #ifndef UNDER_CE - - wchar_t buf[MAX_PATH + 100]; - + // at Vista (ver 6.0) : CoCreateInstance(CLSID_ShellLink, ...) doesn't work after SetDefaultDllDirectories() : Check it ??? + IF_NON_VISTA_SET_DLL_DIRS_AND_RETURN { - // at Vista (ver 6.0) : CoCreateInstance(CLSID_ShellLink, ...) doesn't work after SetDefaultDllDirectories() : Check it ??? - OSVERSIONINFO vi; - vi.dwOSVersionInfoSize = sizeof(vi); - if (!GetVersionEx(&vi) || vi.dwMajorVersion != 6 || vi.dwMinorVersion != 0) - { - Func_SetDefaultDllDirectories setDllDirs = (Func_SetDefaultDllDirectories) - MY_CAST_FUNC GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")), "SetDefaultDllDirectories"); - if (setDllDirs) - if (setDllDirs(MY_LOAD_LIBRARY_SEARCH_SYSTEM32 | MY_LOAD_LIBRARY_SEARCH_USER_DIRS)) - return; - } - } - - { - unsigned len = GetSystemDirectoryW(buf, MAX_PATH + 2); - if (len == 0 || len > MAX_PATH) - return; - } - { + wchar_t buf[MAX_PATH + 100]; const char *dll; - unsigned pos = (unsigned)lstrlenW(buf); - + unsigned pos = GetSystemDirectoryW(buf, MAX_PATH + 2); + if (pos == 0 || pos > MAX_PATH) + return; if (buf[pos - 1] != '\\') buf[pos++] = '\\'; - - for (dll = g_Dlls; dll[0] != 0;) + for (dll = g_Dlls; *dll != 0;) { - unsigned k = 0; + wchar_t *dest = &buf[pos]; for (;;) { - char c = *dll++; - buf[pos + k] = (Byte)c; - k++; + const char c = *dll++; if (c == 0) break; + *dest++ = (Byte)c; } - - lstrcatW(buf, L".dll"); + dest[0] = '.'; + dest[1] = 'd'; + dest[2] = 'l'; + dest[3] = 'l'; + dest[4] = 0; + // lstrcatW(buf, L".dll"); LoadLibraryExW(buf, NULL, LOAD_WITH_ALTERED_SEARCH_PATH); } } - #endif } -#endif +#endif // _WIN32
diff --git a/third_party/lzma_sdk/C/DllSecur.h b/third_party/lzma_sdk/C/DllSecur.h index 64ff26c..9fa4153 100644 --- a/third_party/lzma_sdk/C/DllSecur.h +++ b/third_party/lzma_sdk/C/DllSecur.h
@@ -1,8 +1,8 @@ /* DllSecur.h -- DLL loading for security -2018-02-19 : Igor Pavlov : Public domain */ +2023-03-03 : Igor Pavlov : Public domain */ -#ifndef __DLL_SECUR_H -#define __DLL_SECUR_H +#ifndef ZIP7_INC_DLL_SECUR_H +#define ZIP7_INC_DLL_SECUR_H #include "7zTypes.h"
diff --git a/third_party/lzma_sdk/C/LzFind.c b/third_party/lzma_sdk/C/LzFind.c index 36f73309..5941582e 100644 --- a/third_party/lzma_sdk/C/LzFind.c +++ b/third_party/lzma_sdk/C/LzFind.c
@@ -1,5 +1,5 @@ /* LzFind.c -- Match finder for LZ algorithms -2021-11-29 : Igor Pavlov : Public domain */ +2024-03-01 : Igor Pavlov : Public domain */ #include "Precomp.h" @@ -17,7 +17,7 @@ #define kEmptyHashValue 0 #define kMaxValForNormalize ((UInt32)0) -// #define kMaxValForNormalize ((UInt32)(1 << 20) + 0xFFF) // for debug +// #define kMaxValForNormalize ((UInt32)(1 << 20) + 0xfff) // for debug // #define kNormalizeAlign (1 << 7) // alignment for speculated accesses @@ -67,10 +67,10 @@ static void LzInWindow_Free(CMatchFinder *p, ISzAllocPtr alloc) { - if (!p->directInput) + // if (!p->directInput) { - ISzAlloc_Free(alloc, p->bufferBase); - p->bufferBase = NULL; + ISzAlloc_Free(alloc, p->bufBase); + p->bufBase = NULL; } } @@ -79,7 +79,7 @@ { if (blockSize == 0) return 0; - if (!p->bufferBase || p->blockSize != blockSize) + if (!p->bufBase || p->blockSize != blockSize) { // size_t blockSizeT; LzInWindow_Free(p, alloc); @@ -101,19 +101,25 @@ #endif */ - p->bufferBase = (Byte *)ISzAlloc_Alloc(alloc, blockSize); - // printf("\nbufferBase = %p\n", p->bufferBase); + p->bufBase = (Byte *)ISzAlloc_Alloc(alloc, blockSize); + // printf("\nbufferBase = %p\n", p->bufBase); // return 0; // for debug } - return (p->bufferBase != NULL); + return (p->bufBase != NULL); } -static const Byte *MatchFinder_GetPointerToCurrentPos(CMatchFinder *p) { return p->buffer; } +static const Byte *MatchFinder_GetPointerToCurrentPos(void *p) +{ + return ((CMatchFinder *)p)->buffer; +} -static UInt32 MatchFinder_GetNumAvailableBytes(CMatchFinder *p) { return GET_AVAIL_BYTES(p); } +static UInt32 MatchFinder_GetNumAvailableBytes(void *p) +{ + return GET_AVAIL_BYTES((CMatchFinder *)p); +} -MY_NO_INLINE +Z7_NO_INLINE static void MatchFinder_ReadBlock(CMatchFinder *p) { if (p->streamEndWasReached || p->result != SZ_OK) @@ -127,8 +133,8 @@ UInt32 curSize = 0xFFFFFFFF - GET_AVAIL_BYTES(p); if (curSize > p->directInputRem) curSize = (UInt32)p->directInputRem; - p->directInputRem -= curSize; p->streamPos += curSize; + p->directInputRem -= curSize; if (p->directInputRem == 0) p->streamEndWasReached = 1; return; @@ -136,8 +142,8 @@ for (;;) { - Byte *dest = p->buffer + GET_AVAIL_BYTES(p); - size_t size = (size_t)(p->bufferBase + p->blockSize - dest); + const Byte *dest = p->buffer + GET_AVAIL_BYTES(p); + size_t size = (size_t)(p->bufBase + p->blockSize - dest); if (size == 0) { /* we call ReadBlock() after NeedMove() and MoveBlock(). @@ -153,7 +159,14 @@ // #define kRead 3 // if (size > kRead) size = kRead; // for debug - p->result = ISeqInStream_Read(p->stream, dest, &size); + /* + // we need cast (Byte *)dest. + #ifdef __clang__ + #pragma GCC diagnostic ignored "-Wcast-qual" + #endif + */ + p->result = ISeqInStream_Read(p->stream, + p->bufBase + (dest - p->bufBase), &size); if (p->result != SZ_OK) return; if (size == 0) @@ -173,14 +186,14 @@ -MY_NO_INLINE +Z7_NO_INLINE void MatchFinder_MoveBlock(CMatchFinder *p) { - const size_t offset = (size_t)(p->buffer - p->bufferBase) - p->keepSizeBefore; + const size_t offset = (size_t)(p->buffer - p->bufBase) - p->keepSizeBefore; const size_t keepBefore = (offset & (kBlockMoveAlign - 1)) + p->keepSizeBefore; - p->buffer = p->bufferBase + keepBefore; - memmove(p->bufferBase, - p->bufferBase + (offset & ~((size_t)kBlockMoveAlign - 1)), + p->buffer = p->bufBase + keepBefore; + memmove(p->bufBase, + p->bufBase + (offset & ~((size_t)kBlockMoveAlign - 1)), keepBefore + (size_t)GET_AVAIL_BYTES(p)); } @@ -198,7 +211,7 @@ return 0; if (p->streamEndWasReached || p->result != SZ_OK) return 0; - return ((size_t)(p->bufferBase + p->blockSize - p->buffer) <= p->keepSizeAfter); + return ((size_t)(p->bufBase + p->blockSize - p->buffer) <= p->keepSizeAfter); } void MatchFinder_ReadIfRequired(CMatchFinder *p) @@ -214,6 +227,8 @@ p->cutValue = 32; p->btMode = 1; p->numHashBytes = 4; + p->numHashBytes_Min = 2; + p->numHashOutBits = 0; p->bigHash = 0; } @@ -222,8 +237,10 @@ void MatchFinder_Construct(CMatchFinder *p) { unsigned i; - p->bufferBase = NULL; + p->buffer = NULL; + p->bufBase = NULL; p->directInput = 0; + p->stream = NULL; p->hash = NULL; p->expectedDataSize = (UInt64)(Int64)-1; MatchFinder_SetDefaultSettings(p); @@ -238,6 +255,8 @@ } } +#undef kCrcPoly + static void MatchFinder_FreeThisClassMemory(CMatchFinder *p, ISzAllocPtr alloc) { ISzAlloc_Free(alloc, p->hash); @@ -252,7 +271,7 @@ static CLzRef* AllocRefs(size_t num, ISzAllocPtr alloc) { - size_t sizeInBytes = (size_t)num * sizeof(CLzRef); + const size_t sizeInBytes = (size_t)num * sizeof(CLzRef); if (sizeInBytes / sizeof(CLzRef) != num) return NULL; return (CLzRef *)ISzAlloc_Alloc(alloc, sizeInBytes); @@ -298,6 +317,62 @@ } +// input is historySize +static UInt32 MatchFinder_GetHashMask2(CMatchFinder *p, UInt32 hs) +{ + if (p->numHashBytes == 2) + return (1 << 16) - 1; + if (hs != 0) + hs--; + hs |= (hs >> 1); + hs |= (hs >> 2); + hs |= (hs >> 4); + hs |= (hs >> 8); + // we propagated 16 bits in (hs). Low 16 bits must be set later + if (hs >= (1 << 24)) + { + if (p->numHashBytes == 3) + hs = (1 << 24) - 1; + /* if (bigHash) mode, GetHeads4b() in LzFindMt.c needs (hs >= ((1 << 24) - 1))) */ + } + // (hash_size >= (1 << 16)) : Required for (numHashBytes > 2) + hs |= (1 << 16) - 1; /* don't change it! */ + // bt5: we adjust the size with recommended minimum size + if (p->numHashBytes >= 5) + hs |= (256 << kLzHash_CrcShift_2) - 1; + return hs; +} + +// input is historySize +static UInt32 MatchFinder_GetHashMask(CMatchFinder *p, UInt32 hs) +{ + if (p->numHashBytes == 2) + return (1 << 16) - 1; + if (hs != 0) + hs--; + hs |= (hs >> 1); + hs |= (hs >> 2); + hs |= (hs >> 4); + hs |= (hs >> 8); + // we propagated 16 bits in (hs). Low 16 bits must be set later + hs >>= 1; + if (hs >= (1 << 24)) + { + if (p->numHashBytes == 3) + hs = (1 << 24) - 1; + else + hs >>= 1; + /* if (bigHash) mode, GetHeads4b() in LzFindMt.c needs (hs >= ((1 << 24) - 1))) */ + } + // (hash_size >= (1 << 16)) : Required for (numHashBytes > 2) + hs |= (1 << 16) - 1; /* don't change it! */ + // bt5: we adjust the size with recommended minimum size + if (p->numHashBytes >= 5) + hs |= (256 << kLzHash_CrcShift_2) - 1; + return hs; +} + + int MatchFinder_Create(CMatchFinder *p, UInt32 historySize, UInt32 keepAddBufferBefore, UInt32 matchMaxLen, UInt32 keepAddBufferAfter, ISzAllocPtr alloc) @@ -318,78 +393,91 @@ p->blockSize = 0; if (p->directInput || LzInWindow_Create2(p, GetBlockSize(p, historySize), alloc)) { - const UInt32 newCyclicBufferSize = historySize + 1; // do not change it - UInt32 hs; - p->matchMaxLen = matchMaxLen; + size_t hashSizeSum; { - // UInt32 hs4; - p->fixedHashSize = 0; - hs = (1 << 16) - 1; - if (p->numHashBytes != 2) + UInt32 hs; + UInt32 hsCur; + + if (p->numHashOutBits != 0) { - hs = historySize; - if (hs > p->expectedDataSize) - hs = (UInt32)p->expectedDataSize; - if (hs != 0) - hs--; - hs |= (hs >> 1); - hs |= (hs >> 2); - hs |= (hs >> 4); - hs |= (hs >> 8); - // we propagated 16 bits in (hs). Low 16 bits must be set later - hs >>= 1; - if (hs >= (1 << 24)) - { - if (p->numHashBytes == 3) - hs = (1 << 24) - 1; - else - hs >>= 1; - /* if (bigHash) mode, GetHeads4b() in LzFindMt.c needs (hs >= ((1 << 24) - 1))) */ - } - - // hs = ((UInt32)1 << 25) - 1; // for test - + unsigned numBits = p->numHashOutBits; + const unsigned nbMax = + (p->numHashBytes == 2 ? 16 : + (p->numHashBytes == 3 ? 24 : 32)); + if (numBits > nbMax) + numBits = nbMax; + if (numBits >= 32) + hs = (UInt32)0 - 1; + else + hs = ((UInt32)1 << numBits) - 1; // (hash_size >= (1 << 16)) : Required for (numHashBytes > 2) hs |= (1 << 16) - 1; /* don't change it! */ - - // bt5: we adjust the size with recommended minimum size if (p->numHashBytes >= 5) hs |= (256 << kLzHash_CrcShift_2) - 1; + { + const UInt32 hs2 = MatchFinder_GetHashMask2(p, historySize); + if (hs > hs2) + hs = hs2; + } + hsCur = hs; + if (p->expectedDataSize < historySize) + { + const UInt32 hs2 = MatchFinder_GetHashMask2(p, (UInt32)p->expectedDataSize); + if (hsCur > hs2) + hsCur = hs2; + } } - p->hashMask = hs; - hs++; + else + { + hs = MatchFinder_GetHashMask(p, historySize); + hsCur = hs; + if (p->expectedDataSize < historySize) + { + hsCur = MatchFinder_GetHashMask(p, (UInt32)p->expectedDataSize); + if (hsCur > hs) // is it possible? + hsCur = hs; + } + } - /* - hs4 = (1 << 20); - if (hs4 > hs) - hs4 = hs; - // hs4 = (1 << 16); // for test - p->hash4Mask = hs4 - 1; - */ + p->hashMask = hsCur; - if (p->numHashBytes > 2) p->fixedHashSize += kHash2Size; - if (p->numHashBytes > 3) p->fixedHashSize += kHash3Size; - // if (p->numHashBytes > 4) p->fixedHashSize += hs4; // kHash4Size; - hs += p->fixedHashSize; + hashSizeSum = hs; + hashSizeSum++; + if (hashSizeSum < hs) + return 0; + { + UInt32 fixedHashSize = 0; + if (p->numHashBytes > 2 && p->numHashBytes_Min <= 2) fixedHashSize += kHash2Size; + if (p->numHashBytes > 3 && p->numHashBytes_Min <= 3) fixedHashSize += kHash3Size; + // if (p->numHashBytes > 4) p->fixedHashSize += hs4; // kHash4Size; + hashSizeSum += fixedHashSize; + p->fixedHashSize = fixedHashSize; + } } + p->matchMaxLen = matchMaxLen; + { size_t newSize; size_t numSons; + const UInt32 newCyclicBufferSize = historySize + 1; // do not change it p->historySize = historySize; - p->hashSizeSum = hs; p->cyclicBufferSize = newCyclicBufferSize; // it must be = (historySize + 1) numSons = newCyclicBufferSize; if (p->btMode) numSons <<= 1; - newSize = hs + numSons; + newSize = hashSizeSum + numSons; + + if (numSons < newCyclicBufferSize || newSize < numSons) + return 0; // aligned size is not required here, but it can be better for some loops #define NUM_REFS_ALIGN_MASK 0xF newSize = (newSize + NUM_REFS_ALIGN_MASK) & ~(size_t)NUM_REFS_ALIGN_MASK; - if (p->hash && p->numRefs == newSize) + // 22.02: we don't reallocate buffer, if old size is enough + if (p->hash && p->numRefs >= newSize) return 1; MatchFinder_FreeThisClassMemory(p, alloc); @@ -398,7 +486,7 @@ if (p->hash) { - p->son = p->hash + p->hashSizeSum; + p->son = p->hash + hashSizeSum; return 1; } } @@ -470,7 +558,8 @@ void MatchFinder_Init_4(CMatchFinder *p) { - p->buffer = p->bufferBase; + if (!p->directInput) + p->buffer = p->bufBase; { /* kEmptyHashValue = 0 (Zero) is used in hash tables as NO-VALUE marker. the code in CMatchFinderMt expects (pos = 1) */ @@ -488,8 +577,9 @@ #define CYC_TO_POS_OFFSET 0 // #define CYC_TO_POS_OFFSET 1 // for debug -void MatchFinder_Init(CMatchFinder *p) +void MatchFinder_Init(void *_p) { + CMatchFinder *p = (CMatchFinder *)_p; MatchFinder_Init_HighHash(p); MatchFinder_Init_LowHash(p); MatchFinder_Init_4(p); @@ -507,165 +597,173 @@ #if 0 #ifdef MY_CPU_X86_OR_AMD64 - #if defined(__clang__) && (__clang_major__ >= 8) \ - || defined(__GNUC__) && (__GNUC__ >= 8) \ - || defined(__INTEL_COMPILER) && (__INTEL_COMPILER >= 1900) - #define USE_SATUR_SUB_128 - #define USE_AVX2 - #define ATTRIB_SSE41 __attribute__((__target__("sse4.1"))) - #define ATTRIB_AVX2 __attribute__((__target__("avx2"))) + #if defined(__clang__) && (__clang_major__ >= 4) \ + || defined(Z7_GCC_VERSION) && (Z7_GCC_VERSION >= 40701) + // || defined(__INTEL_COMPILER) && (__INTEL_COMPILER >= 1900) + + #define USE_LZFIND_SATUR_SUB_128 + #define USE_LZFIND_SATUR_SUB_256 + #define LZFIND_ATTRIB_SSE41 __attribute__((__target__("sse4.1"))) + #define LZFIND_ATTRIB_AVX2 __attribute__((__target__("avx2"))) #elif defined(_MSC_VER) #if (_MSC_VER >= 1600) - #define USE_SATUR_SUB_128 - #if (_MSC_VER >= 1900) - #define USE_AVX2 - #include <immintrin.h> // avx - #endif + #define USE_LZFIND_SATUR_SUB_128 + #endif + #if (_MSC_VER >= 1900) + #define USE_LZFIND_SATUR_SUB_256 #endif #endif -// #elif defined(MY_CPU_ARM_OR_ARM64) -#elif defined(MY_CPU_ARM64) +#elif defined(MY_CPU_ARM64) \ + /* || (defined(__ARM_ARCH) && (__ARM_ARCH >= 7)) */ - #if defined(__clang__) && (__clang_major__ >= 8) \ - || defined(__GNUC__) && (__GNUC__ >= 8) - #define USE_SATUR_SUB_128 + #if defined(Z7_CLANG_VERSION) && (Z7_CLANG_VERSION >= 30800) \ + || defined(__GNUC__) && (__GNUC__ >= 6) + #define USE_LZFIND_SATUR_SUB_128 #ifdef MY_CPU_ARM64 - // #define ATTRIB_SSE41 __attribute__((__target__(""))) + // #define LZFIND_ATTRIB_SSE41 __attribute__((__target__(""))) #else - // #define ATTRIB_SSE41 __attribute__((__target__("fpu=crypto-neon-fp-armv8"))) + #define LZFIND_ATTRIB_SSE41 __attribute__((__target__("fpu=neon"))) #endif #elif defined(_MSC_VER) #if (_MSC_VER >= 1910) - #define USE_SATUR_SUB_128 + #define USE_LZFIND_SATUR_SUB_128 #endif #endif - #if defined(_MSC_VER) && defined(MY_CPU_ARM64) + #if defined(Z7_MSC_VER_ORIGINAL) && defined(MY_CPU_ARM64) #include <arm64_neon.h> #else #include <arm_neon.h> #endif #endif -#endif +#endif // #if 0 -/* -#ifndef ATTRIB_SSE41 - #define ATTRIB_SSE41 -#endif -#ifndef ATTRIB_AVX2 - #define ATTRIB_AVX2 -#endif -*/ +#ifdef USE_LZFIND_SATUR_SUB_128 -#ifdef USE_SATUR_SUB_128 +// #define Z7_SHOW_HW_STATUS -// #define _SHOW_HW_STATUS - -#ifdef _SHOW_HW_STATUS +#ifdef Z7_SHOW_HW_STATUS #include <stdio.h> -#define _PRF(x) x -_PRF(;) +#define PRF(x) x +PRF(;) #else -#define _PRF(x) +#define PRF(x) #endif + #ifdef MY_CPU_ARM_OR_ARM64 #ifdef MY_CPU_ARM64 -// #define FORCE_SATUR_SUB_128 +// #define FORCE_LZFIND_SATUR_SUB_128 #endif +typedef uint32x4_t LzFind_v128; +#define SASUB_128_V(v, s) \ + vsubq_u32(vmaxq_u32(v, s), s) -typedef uint32x4_t v128; -#define SASUB_128(i) \ - *(v128 *)(void *)(items + (i) * 4) = \ - vsubq_u32(vmaxq_u32(*(const v128 *)(const void *)(items + (i) * 4), sub2), sub2); - -#else +#else // MY_CPU_ARM_OR_ARM64 #include <smmintrin.h> // sse4.1 -typedef __m128i v128; +typedef __m128i LzFind_v128; +// SSE 4.1 +#define SASUB_128_V(v, s) \ + _mm_sub_epi32(_mm_max_epu32(v, s), s) + +#endif // MY_CPU_ARM_OR_ARM64 + + #define SASUB_128(i) \ - *(v128 *)(void *)(items + (i) * 4) = \ - _mm_sub_epi32(_mm_max_epu32(*(const v128 *)(const void *)(items + (i) * 4), sub2), sub2); // SSE 4.1 - -#endif + *( LzFind_v128 *)( void *)(items + (i) * 4) = SASUB_128_V( \ + *(const LzFind_v128 *)(const void *)(items + (i) * 4), sub2); - -MY_NO_INLINE +Z7_NO_INLINE static -#ifdef ATTRIB_SSE41 -ATTRIB_SSE41 +#ifdef LZFIND_ATTRIB_SSE41 +LZFIND_ATTRIB_SSE41 #endif void -MY_FAST_CALL +Z7_FASTCALL LzFind_SaturSub_128(UInt32 subValue, CLzRef *items, const CLzRef *lim) { - v128 sub2 = + const LzFind_v128 sub2 = #ifdef MY_CPU_ARM_OR_ARM64 vdupq_n_u32(subValue); #else _mm_set_epi32((Int32)subValue, (Int32)subValue, (Int32)subValue, (Int32)subValue); #endif + Z7_PRAGMA_OPT_DISABLE_LOOP_UNROLL_VECTORIZE do { - SASUB_128(0) - SASUB_128(1) - SASUB_128(2) - SASUB_128(3) - items += 4 * 4; + SASUB_128(0) SASUB_128(1) items += 2 * 4; + SASUB_128(0) SASUB_128(1) items += 2 * 4; } while (items != lim); } -#ifdef USE_AVX2 +#ifdef USE_LZFIND_SATUR_SUB_256 #include <immintrin.h> // avx +/* +clang :immintrin.h uses +#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \ + defined(__AVX2__) +#include <avx2intrin.h> +#endif +so we need <avxintrin.h> for clang-cl */ -#define SASUB_256(i) *(__m256i *)(void *)(items + (i) * 8) = _mm256_sub_epi32(_mm256_max_epu32(*(const __m256i *)(const void *)(items + (i) * 8), sub2), sub2); // AVX2 +#if defined(__clang__) +#include <avxintrin.h> +#include <avx2intrin.h> +#endif -MY_NO_INLINE +// AVX2: +#define SASUB_256(i) \ + *( __m256i *)( void *)(items + (i) * 8) = \ + _mm256_sub_epi32(_mm256_max_epu32( \ + *(const __m256i *)(const void *)(items + (i) * 8), sub2), sub2); + +Z7_NO_INLINE static -#ifdef ATTRIB_AVX2 -ATTRIB_AVX2 +#ifdef LZFIND_ATTRIB_AVX2 +LZFIND_ATTRIB_AVX2 #endif void -MY_FAST_CALL +Z7_FASTCALL LzFind_SaturSub_256(UInt32 subValue, CLzRef *items, const CLzRef *lim) { - __m256i sub2 = _mm256_set_epi32( + const __m256i sub2 = _mm256_set_epi32( (Int32)subValue, (Int32)subValue, (Int32)subValue, (Int32)subValue, (Int32)subValue, (Int32)subValue, (Int32)subValue, (Int32)subValue); + Z7_PRAGMA_OPT_DISABLE_LOOP_UNROLL_VECTORIZE do { - SASUB_256(0) - SASUB_256(1) - items += 2 * 8; + SASUB_256(0) SASUB_256(1) items += 2 * 8; + SASUB_256(0) SASUB_256(1) items += 2 * 8; } while (items != lim); } -#endif // USE_AVX2 +#endif // USE_LZFIND_SATUR_SUB_256 -#ifndef FORCE_SATUR_SUB_128 -typedef void (MY_FAST_CALL *LZFIND_SATUR_SUB_CODE_FUNC)( +#ifndef FORCE_LZFIND_SATUR_SUB_128 +typedef void (Z7_FASTCALL *LZFIND_SATUR_SUB_CODE_FUNC)( UInt32 subValue, CLzRef *items, const CLzRef *lim); static LZFIND_SATUR_SUB_CODE_FUNC g_LzFind_SaturSub; -#endif // FORCE_SATUR_SUB_128 +#endif // FORCE_LZFIND_SATUR_SUB_128 -#endif // USE_SATUR_SUB_128 +#endif // USE_LZFIND_SATUR_SUB_128 // kEmptyHashValue must be zero -// #define SASUB_32(i) v = items[i]; m = v - subValue; if (v < subValue) m = kEmptyHashValue; items[i] = m; -#define SASUB_32(i) v = items[i]; if (v < subValue) v = subValue; items[i] = v - subValue; +// #define SASUB_32(i) { UInt32 v = items[i]; UInt32 m = v - subValue; if (v < subValue) m = kEmptyHashValue; items[i] = m; } +#define SASUB_32(i) { UInt32 v = items[i]; if (v < subValue) v = subValue; items[i] = v - subValue; } -#ifdef FORCE_SATUR_SUB_128 +#ifdef FORCE_LZFIND_SATUR_SUB_128 #define DEFAULT_SaturSub LzFind_SaturSub_128 @@ -673,24 +771,19 @@ #define DEFAULT_SaturSub LzFind_SaturSub_32 -MY_NO_INLINE +Z7_NO_INLINE static void -MY_FAST_CALL +Z7_FASTCALL LzFind_SaturSub_32(UInt32 subValue, CLzRef *items, const CLzRef *lim) { + Z7_PRAGMA_OPT_DISABLE_LOOP_UNROLL_VECTORIZE do { - UInt32 v; - SASUB_32(0) - SASUB_32(1) - SASUB_32(2) - SASUB_32(3) - SASUB_32(4) - SASUB_32(5) - SASUB_32(6) - SASUB_32(7) - items += 8; + SASUB_32(0) SASUB_32(1) items += 2; + SASUB_32(0) SASUB_32(1) items += 2; + SASUB_32(0) SASUB_32(1) items += 2; + SASUB_32(0) SASUB_32(1) items += 2; } while (items != lim); } @@ -698,27 +791,23 @@ #endif -MY_NO_INLINE +Z7_NO_INLINE void MatchFinder_Normalize3(UInt32 subValue, CLzRef *items, size_t numItems) { - #define K_NORM_ALIGN_BLOCK_SIZE (1 << 6) - - CLzRef *lim; - - for (; numItems != 0 && ((unsigned)(ptrdiff_t)items & (K_NORM_ALIGN_BLOCK_SIZE - 1)) != 0; numItems--) + #define LZFIND_NORM_ALIGN_BLOCK_SIZE (1 << 7) + Z7_PRAGMA_OPT_DISABLE_LOOP_UNROLL_VECTORIZE + for (; numItems != 0 && ((unsigned)(ptrdiff_t)items & (LZFIND_NORM_ALIGN_BLOCK_SIZE - 1)) != 0; numItems--) { - UInt32 v; - SASUB_32(0); + SASUB_32(0) items++; } - { - #define K_NORM_ALIGN_MASK (K_NORM_ALIGN_BLOCK_SIZE / 4 - 1) - lim = items + (numItems & ~(size_t)K_NORM_ALIGN_MASK); - numItems &= K_NORM_ALIGN_MASK; + const size_t k_Align_Mask = (LZFIND_NORM_ALIGN_BLOCK_SIZE / 4 - 1); + CLzRef *lim = items + (numItems & ~(size_t)k_Align_Mask); + numItems &= k_Align_Mask; if (items != lim) { - #if defined(USE_SATUR_SUB_128) && !defined(FORCE_SATUR_SUB_128) + #if defined(USE_LZFIND_SATUR_SUB_128) && !defined(FORCE_LZFIND_SATUR_SUB_128) if (g_LzFind_SaturSub) g_LzFind_SaturSub(subValue, items, lim); else @@ -727,12 +816,10 @@ } items = lim; } - - + Z7_PRAGMA_OPT_DISABLE_LOOP_UNROLL_VECTORIZE for (; numItems != 0; numItems--) { - UInt32 v; - SASUB_32(0); + SASUB_32(0) items++; } } @@ -741,7 +828,7 @@ // call MatchFinder_CheckLimits() only after (p->pos++) update -MY_NO_INLINE +Z7_NO_INLINE static void MatchFinder_CheckLimits(CMatchFinder *p) { if (// !p->streamEndWasReached && p->result == SZ_OK && @@ -769,11 +856,14 @@ const UInt32 subValue = (p->pos - p->historySize - 1) /* & ~(UInt32)(kNormalizeAlign - 1) */; // const UInt32 subValue = (1 << 15); // for debug // printf("\nMatchFinder_Normalize() subValue == 0x%x\n", subValue); - size_t numSonRefs = p->cyclicBufferSize; - if (p->btMode) - numSonRefs <<= 1; - Inline_MatchFinder_ReduceOffsets(p, subValue); - MatchFinder_Normalize3(subValue, p->hash, (size_t)p->hashSizeSum + numSonRefs); + MatchFinder_REDUCE_OFFSETS(p, subValue) + MatchFinder_Normalize3(subValue, p->hash, (size_t)p->hashMask + 1 + p->fixedHashSize); + { + size_t numSonRefs = p->cyclicBufferSize; + if (p->btMode) + numSonRefs <<= 1; + MatchFinder_Normalize3(subValue, p->son, numSonRefs); + } } if (p->cyclicBufferPos == p->cyclicBufferSize) @@ -786,7 +876,7 @@ /* (lenLimit > maxLen) */ -MY_FORCE_INLINE +Z7_FORCE_INLINE static UInt32 * Hc_GetMatchesSpec(size_t lenLimit, UInt32 curMatch, UInt32 pos, const Byte *cur, CLzRef *son, size_t _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 cutValue, UInt32 *d, unsigned maxLen) @@ -868,7 +958,7 @@ } -MY_FORCE_INLINE +Z7_FORCE_INLINE UInt32 * GetMatchesSpec1(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *cur, CLzRef *son, size_t _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 cutValue, UInt32 *d, UInt32 maxLen) @@ -999,13 +1089,15 @@ #define MOVE_POS \ - ++p->cyclicBufferPos; \ + p->cyclicBufferPos++; \ p->buffer++; \ - { const UInt32 pos1 = p->pos + 1; p->pos = pos1; if (pos1 == p->posLimit) MatchFinder_CheckLimits(p); } + { const UInt32 pos1 = p->pos + 1; \ + p->pos = pos1; \ + if (pos1 == p->posLimit) MatchFinder_CheckLimits(p); } #define MOVE_POS_RET MOVE_POS return distances; -MY_NO_INLINE +Z7_NO_INLINE static void MatchFinder_MovePos(CMatchFinder *p) { /* we go here at the end of stream data, when (avail < num_hash_bytes) @@ -1016,24 +1108,30 @@ if (p->btMode) p->sons[(p->cyclicBufferPos << p->btMode) + 1] = 0; // kEmptyHashValue */ - MOVE_POS; + MOVE_POS } #define GET_MATCHES_HEADER2(minLen, ret_op) \ - unsigned lenLimit; UInt32 hv; Byte *cur; UInt32 curMatch; \ - lenLimit = (unsigned)p->lenLimit; { if (lenLimit < minLen) { MatchFinder_MovePos(p); ret_op; }} \ + UInt32 hv; const Byte *cur; UInt32 curMatch; \ + UInt32 lenLimit = p->lenLimit; \ + if (lenLimit < minLen) { MatchFinder_MovePos(p); ret_op; } \ cur = p->buffer; #define GET_MATCHES_HEADER(minLen) GET_MATCHES_HEADER2(minLen, return distances) -#define SKIP_HEADER(minLen) do { GET_MATCHES_HEADER2(minLen, continue) +#define SKIP_HEADER(minLen) \ + do { GET_MATCHES_HEADER2(minLen, continue) -#define MF_PARAMS(p) lenLimit, curMatch, p->pos, p->buffer, p->son, p->cyclicBufferPos, p->cyclicBufferSize, p->cutValue +#define MF_PARAMS(p) lenLimit, curMatch, p->pos, p->buffer, p->son, \ + p->cyclicBufferPos, p->cyclicBufferSize, p->cutValue -#define SKIP_FOOTER SkipMatchesSpec(MF_PARAMS(p)); MOVE_POS; } while (--num); +#define SKIP_FOOTER \ + SkipMatchesSpec(MF_PARAMS(p)); \ + MOVE_POS \ + } while (--num); #define GET_MATCHES_FOOTER_BASE(_maxLen_, func) \ - distances = func(MF_PARAMS(p), \ - distances, (UInt32)_maxLen_); MOVE_POS_RET; + distances = func(MF_PARAMS(p), distances, (UInt32)_maxLen_); \ + MOVE_POS_RET #define GET_MATCHES_FOOTER_BT(_maxLen_) \ GET_MATCHES_FOOTER_BASE(_maxLen_, GetMatchesSpec1) @@ -1050,10 +1148,11 @@ for (; c != lim; c++) if (*(c + diff) != *c) break; \ maxLen = (unsigned)(c - cur); } -static UInt32* Bt2_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) +static UInt32* Bt2_MatchFinder_GetMatches(void *_p, UInt32 *distances) { + CMatchFinder *p = (CMatchFinder *)_p; GET_MATCHES_HEADER(2) - HASH2_CALC; + HASH2_CALC curMatch = p->hash[hv]; p->hash[hv] = p->pos; GET_MATCHES_FOOTER_BT(1) @@ -1062,7 +1161,7 @@ UInt32* Bt3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) { GET_MATCHES_HEADER(3) - HASH_ZIP_CALC; + HASH_ZIP_CALC curMatch = p->hash[hv]; p->hash[hv] = p->pos; GET_MATCHES_FOOTER_BT(2) @@ -1075,15 +1174,16 @@ mmm = pos; -static UInt32* Bt3_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) +static UInt32* Bt3_MatchFinder_GetMatches(void *_p, UInt32 *distances) { + CMatchFinder *p = (CMatchFinder *)_p; UInt32 mmm; UInt32 h2, d2, pos; unsigned maxLen; UInt32 *hash; GET_MATCHES_HEADER(3) - HASH3_CALC; + HASH3_CALC hash = p->hash; pos = p->pos; @@ -1108,7 +1208,7 @@ if (maxLen == lenLimit) { SkipMatchesSpec(MF_PARAMS(p)); - MOVE_POS_RET; + MOVE_POS_RET } } @@ -1116,15 +1216,16 @@ } -static UInt32* Bt4_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) +static UInt32* Bt4_MatchFinder_GetMatches(void *_p, UInt32 *distances) { + CMatchFinder *p = (CMatchFinder *)_p; UInt32 mmm; UInt32 h2, h3, d2, d3, pos; unsigned maxLen; UInt32 *hash; GET_MATCHES_HEADER(4) - HASH4_CALC; + HASH4_CALC hash = p->hash; pos = p->pos; @@ -1184,14 +1285,16 @@ } -static UInt32* Bt5_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) +static UInt32* Bt5_MatchFinder_GetMatches(void *_p, UInt32 *distances) { + CMatchFinder *p = (CMatchFinder *)_p; UInt32 mmm; - UInt32 h2, h3, d2, d3, maxLen, pos; + UInt32 h2, h3, d2, d3, pos; + unsigned maxLen; UInt32 *hash; GET_MATCHES_HEADER(5) - HASH5_CALC; + HASH5_CALC hash = p->hash; pos = p->pos; @@ -1247,7 +1350,7 @@ if (maxLen == lenLimit) { SkipMatchesSpec(MF_PARAMS(p)); - MOVE_POS_RET; + MOVE_POS_RET } break; } @@ -1256,15 +1359,16 @@ } -static UInt32* Hc4_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) +static UInt32* Hc4_MatchFinder_GetMatches(void *_p, UInt32 *distances) { + CMatchFinder *p = (CMatchFinder *)_p; UInt32 mmm; UInt32 h2, h3, d2, d3, pos; unsigned maxLen; UInt32 *hash; GET_MATCHES_HEADER(4) - HASH4_CALC; + HASH4_CALC hash = p->hash; pos = p->pos; @@ -1315,23 +1419,25 @@ if (maxLen == lenLimit) { p->son[p->cyclicBufferPos] = curMatch; - MOVE_POS_RET; + MOVE_POS_RET } break; } - GET_MATCHES_FOOTER_HC(maxLen); + GET_MATCHES_FOOTER_HC(maxLen) } -static UInt32 * Hc5_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) +static UInt32 * Hc5_MatchFinder_GetMatches(void *_p, UInt32 *distances) { + CMatchFinder *p = (CMatchFinder *)_p; UInt32 mmm; - UInt32 h2, h3, d2, d3, maxLen, pos; + UInt32 h2, h3, d2, d3, pos; + unsigned maxLen; UInt32 *hash; GET_MATCHES_HEADER(5) - HASH5_CALC; + HASH5_CALC hash = p->hash; pos = p->pos; @@ -1383,34 +1489,35 @@ if (*(cur - d2 + 3) != cur[3]) break; UPDATE_maxLen - distances[-2] = maxLen; + distances[-2] = (UInt32)maxLen; if (maxLen == lenLimit) { p->son[p->cyclicBufferPos] = curMatch; - MOVE_POS_RET; + MOVE_POS_RET } break; } - GET_MATCHES_FOOTER_HC(maxLen); + GET_MATCHES_FOOTER_HC(maxLen) } UInt32* Hc3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) { GET_MATCHES_HEADER(3) - HASH_ZIP_CALC; + HASH_ZIP_CALC curMatch = p->hash[hv]; p->hash[hv] = p->pos; GET_MATCHES_FOOTER_HC(2) } -static void Bt2_MatchFinder_Skip(CMatchFinder *p, UInt32 num) +static void Bt2_MatchFinder_Skip(void *_p, UInt32 num) { + CMatchFinder *p = (CMatchFinder *)_p; SKIP_HEADER(2) { - HASH2_CALC; + HASH2_CALC curMatch = p->hash[hv]; p->hash[hv] = p->pos; } @@ -1421,20 +1528,21 @@ { SKIP_HEADER(3) { - HASH_ZIP_CALC; + HASH_ZIP_CALC curMatch = p->hash[hv]; p->hash[hv] = p->pos; } SKIP_FOOTER } -static void Bt3_MatchFinder_Skip(CMatchFinder *p, UInt32 num) +static void Bt3_MatchFinder_Skip(void *_p, UInt32 num) { + CMatchFinder *p = (CMatchFinder *)_p; SKIP_HEADER(3) { UInt32 h2; UInt32 *hash; - HASH3_CALC; + HASH3_CALC hash = p->hash; curMatch = (hash + kFix3HashSize)[hv]; hash[h2] = @@ -1443,13 +1551,14 @@ SKIP_FOOTER } -static void Bt4_MatchFinder_Skip(CMatchFinder *p, UInt32 num) +static void Bt4_MatchFinder_Skip(void *_p, UInt32 num) { + CMatchFinder *p = (CMatchFinder *)_p; SKIP_HEADER(4) { UInt32 h2, h3; UInt32 *hash; - HASH4_CALC; + HASH4_CALC hash = p->hash; curMatch = (hash + kFix4HashSize)[hv]; hash [h2] = @@ -1459,13 +1568,14 @@ SKIP_FOOTER } -static void Bt5_MatchFinder_Skip(CMatchFinder *p, UInt32 num) +static void Bt5_MatchFinder_Skip(void *_p, UInt32 num) { + CMatchFinder *p = (CMatchFinder *)_p; SKIP_HEADER(5) { UInt32 h2, h3; UInt32 *hash; - HASH5_CALC; + HASH5_CALC hash = p->hash; curMatch = (hash + kFix5HashSize)[hv]; hash [h2] = @@ -1479,7 +1589,7 @@ #define HC_SKIP_HEADER(minLen) \ do { if (p->lenLimit < minLen) { MatchFinder_MovePos(p); num--; continue; } { \ - Byte *cur; \ + const Byte *cur; \ UInt32 *hash; \ UInt32 *son; \ UInt32 pos = p->pos; \ @@ -1506,12 +1616,13 @@ }} while(num); \ -static void Hc4_MatchFinder_Skip(CMatchFinder *p, UInt32 num) +static void Hc4_MatchFinder_Skip(void *_p, UInt32 num) { + CMatchFinder *p = (CMatchFinder *)_p; HC_SKIP_HEADER(4) UInt32 h2, h3; - HASH4_CALC; + HASH4_CALC curMatch = (hash + kFix4HashSize)[hv]; hash [h2] = (hash + kFix3HashSize)[h3] = @@ -1521,8 +1632,9 @@ } -static void Hc5_MatchFinder_Skip(CMatchFinder *p, UInt32 num) +static void Hc5_MatchFinder_Skip(void *_p, UInt32 num) { + CMatchFinder *p = (CMatchFinder *)_p; HC_SKIP_HEADER(5) UInt32 h2, h3; @@ -1541,7 +1653,7 @@ { HC_SKIP_HEADER(3) - HASH_ZIP_CALC; + HASH_ZIP_CALC curMatch = hash[hv]; hash[hv] = pos; @@ -1551,57 +1663,57 @@ void MatchFinder_CreateVTable(CMatchFinder *p, IMatchFinder2 *vTable) { - vTable->Init = (Mf_Init_Func)MatchFinder_Init; - vTable->GetNumAvailableBytes = (Mf_GetNumAvailableBytes_Func)MatchFinder_GetNumAvailableBytes; - vTable->GetPointerToCurrentPos = (Mf_GetPointerToCurrentPos_Func)MatchFinder_GetPointerToCurrentPos; + vTable->Init = MatchFinder_Init; + vTable->GetNumAvailableBytes = MatchFinder_GetNumAvailableBytes; + vTable->GetPointerToCurrentPos = MatchFinder_GetPointerToCurrentPos; if (!p->btMode) { if (p->numHashBytes <= 4) { - vTable->GetMatches = (Mf_GetMatches_Func)Hc4_MatchFinder_GetMatches; - vTable->Skip = (Mf_Skip_Func)Hc4_MatchFinder_Skip; + vTable->GetMatches = Hc4_MatchFinder_GetMatches; + vTable->Skip = Hc4_MatchFinder_Skip; } else { - vTable->GetMatches = (Mf_GetMatches_Func)Hc5_MatchFinder_GetMatches; - vTable->Skip = (Mf_Skip_Func)Hc5_MatchFinder_Skip; + vTable->GetMatches = Hc5_MatchFinder_GetMatches; + vTable->Skip = Hc5_MatchFinder_Skip; } } else if (p->numHashBytes == 2) { - vTable->GetMatches = (Mf_GetMatches_Func)Bt2_MatchFinder_GetMatches; - vTable->Skip = (Mf_Skip_Func)Bt2_MatchFinder_Skip; + vTable->GetMatches = Bt2_MatchFinder_GetMatches; + vTable->Skip = Bt2_MatchFinder_Skip; } else if (p->numHashBytes == 3) { - vTable->GetMatches = (Mf_GetMatches_Func)Bt3_MatchFinder_GetMatches; - vTable->Skip = (Mf_Skip_Func)Bt3_MatchFinder_Skip; + vTable->GetMatches = Bt3_MatchFinder_GetMatches; + vTable->Skip = Bt3_MatchFinder_Skip; } else if (p->numHashBytes == 4) { - vTable->GetMatches = (Mf_GetMatches_Func)Bt4_MatchFinder_GetMatches; - vTable->Skip = (Mf_Skip_Func)Bt4_MatchFinder_Skip; + vTable->GetMatches = Bt4_MatchFinder_GetMatches; + vTable->Skip = Bt4_MatchFinder_Skip; } else { - vTable->GetMatches = (Mf_GetMatches_Func)Bt5_MatchFinder_GetMatches; - vTable->Skip = (Mf_Skip_Func)Bt5_MatchFinder_Skip; + vTable->GetMatches = Bt5_MatchFinder_GetMatches; + vTable->Skip = Bt5_MatchFinder_Skip; } } -void LzFindPrepare() +void LzFindPrepare(void) { - #ifndef FORCE_SATUR_SUB_128 - #ifdef USE_SATUR_SUB_128 + #ifndef FORCE_LZFIND_SATUR_SUB_128 + #ifdef USE_LZFIND_SATUR_SUB_128 LZFIND_SATUR_SUB_CODE_FUNC f = NULL; #ifdef MY_CPU_ARM_OR_ARM64 { if (CPU_IsSupported_NEON()) { // #pragma message ("=== LzFind NEON") - _PRF(printf("\n=== LzFind NEON\n")); + PRF(printf("\n=== LzFind NEON\n")); f = LzFind_SaturSub_128; } // f = 0; // for debug @@ -1610,20 +1722,25 @@ if (CPU_IsSupported_SSE41()) { // #pragma message ("=== LzFind SSE41") - _PRF(printf("\n=== LzFind SSE41\n")); + PRF(printf("\n=== LzFind SSE41\n")); f = LzFind_SaturSub_128; - #ifdef USE_AVX2 + #ifdef USE_LZFIND_SATUR_SUB_256 if (CPU_IsSupported_AVX2()) { // #pragma message ("=== LzFind AVX2") - _PRF(printf("\n=== LzFind AVX2\n")); + PRF(printf("\n=== LzFind AVX2\n")); f = LzFind_SaturSub_256; } #endif } #endif // MY_CPU_ARM_OR_ARM64 g_LzFind_SaturSub = f; - #endif // USE_SATUR_SUB_128 - #endif // FORCE_SATUR_SUB_128 + #endif // USE_LZFIND_SATUR_SUB_128 + #endif // FORCE_LZFIND_SATUR_SUB_128 } + + +#undef MOVE_POS +#undef MOVE_POS_RET +#undef PRF
diff --git a/third_party/lzma_sdk/C/LzFind.h b/third_party/lzma_sdk/C/LzFind.h index eea873f..67e8a6e 100644 --- a/third_party/lzma_sdk/C/LzFind.h +++ b/third_party/lzma_sdk/C/LzFind.h
@@ -1,8 +1,8 @@ /* LzFind.h -- Match finder for LZ algorithms -2021-07-13 : Igor Pavlov : Public domain */ +2024-01-22 : Igor Pavlov : Public domain */ -#ifndef __LZ_FIND_H -#define __LZ_FIND_H +#ifndef ZIP7_INC_LZ_FIND_H +#define ZIP7_INC_LZ_FIND_H #include "7zTypes.h" @@ -10,9 +10,9 @@ typedef UInt32 CLzRef; -typedef struct _CMatchFinder +typedef struct { - Byte *buffer; + const Byte *buffer; UInt32 pos; UInt32 posLimit; UInt32 streamPos; /* wrap over Zero is allowed (streamPos < pos). Use (UInt32)(streamPos - pos) */ @@ -32,8 +32,8 @@ UInt32 hashMask; UInt32 cutValue; - Byte *bufferBase; - ISeqInStream *stream; + Byte *bufBase; + ISeqInStreamPtr stream; UInt32 blockSize; UInt32 keepSizeBefore; @@ -43,7 +43,9 @@ size_t directInputRem; UInt32 historySize; UInt32 fixedHashSize; - UInt32 hashSizeSum; + Byte numHashBytes_Min; + Byte numHashOutBits; + Byte _pad2_[2]; SRes result; UInt32 crc[256]; size_t numRefs; @@ -69,24 +71,45 @@ void MatchFinder_Construct(CMatchFinder *p); -/* Conditions: - historySize <= 3 GB - keepAddBufferBefore + matchMaxLen + keepAddBufferAfter < 511MB +/* (directInput = 0) is default value. + It's required to provide correct (directInput) value + before calling MatchFinder_Create(). + You can set (directInput) by any of the following calls: + - MatchFinder_SET_DIRECT_INPUT_BUF() + - MatchFinder_SET_STREAM() + - MatchFinder_SET_STREAM_MODE() */ + +#define MatchFinder_SET_DIRECT_INPUT_BUF(p, _src_, _srcLen_) { \ + (p)->stream = NULL; \ + (p)->directInput = 1; \ + (p)->buffer = (_src_); \ + (p)->directInputRem = (_srcLen_); } + +/* +#define MatchFinder_SET_STREAM_MODE(p) { \ + (p)->directInput = 0; } +*/ + +#define MatchFinder_SET_STREAM(p, _stream_) { \ + (p)->stream = _stream_; \ + (p)->directInput = 0; } + + int MatchFinder_Create(CMatchFinder *p, UInt32 historySize, UInt32 keepAddBufferBefore, UInt32 matchMaxLen, UInt32 keepAddBufferAfter, ISzAllocPtr alloc); void MatchFinder_Free(CMatchFinder *p, ISzAllocPtr alloc); void MatchFinder_Normalize3(UInt32 subValue, CLzRef *items, size_t numItems); -// void MatchFinder_ReduceOffsets(CMatchFinder *p, UInt32 subValue); /* -#define Inline_MatchFinder_InitPos(p, val) \ +#define MatchFinder_INIT_POS(p, val) \ (p)->pos = (val); \ (p)->streamPos = (val); */ -#define Inline_MatchFinder_ReduceOffsets(p, subValue) \ +// void MatchFinder_ReduceOffsets(CMatchFinder *p, UInt32 subValue); +#define MatchFinder_REDUCE_OFFSETS(p, subValue) \ (p)->pos -= (subValue); \ (p)->streamPos -= (subValue); @@ -107,7 +130,7 @@ typedef UInt32 * (*Mf_GetMatches_Func)(void *object, UInt32 *distances); typedef void (*Mf_Skip_Func)(void *object, UInt32); -typedef struct _IMatchFinder +typedef struct { Mf_Init_Func Init; Mf_GetNumAvailableBytes_Func GetNumAvailableBytes; @@ -121,7 +144,8 @@ void MatchFinder_Init_LowHash(CMatchFinder *p); void MatchFinder_Init_HighHash(CMatchFinder *p); void MatchFinder_Init_4(CMatchFinder *p); -void MatchFinder_Init(CMatchFinder *p); +// void MatchFinder_Init(CMatchFinder *p); +void MatchFinder_Init(void *p); UInt32* Bt3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances); UInt32* Hc3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances);
diff --git a/third_party/lzma_sdk/C/LzHash.h b/third_party/lzma_sdk/C/LzHash.h index 77b898c..2b6290b6 100644 --- a/third_party/lzma_sdk/C/LzHash.h +++ b/third_party/lzma_sdk/C/LzHash.h
@@ -1,8 +1,8 @@ -/* LzHash.h -- HASH functions for LZ algorithms -2019-10-30 : Igor Pavlov : Public domain */ +/* LzHash.h -- HASH constants for LZ algorithms +2023-03-05 : Igor Pavlov : Public domain */ -#ifndef __LZ_HASH_H -#define __LZ_HASH_H +#ifndef ZIP7_INC_LZ_HASH_H +#define ZIP7_INC_LZ_HASH_H /* (kHash2Size >= (1 << 8)) : Required
diff --git a/third_party/lzma_sdk/C/Lzma2Dec.c b/third_party/lzma_sdk/C/Lzma2Dec.c index ac970a84..8bf54e4 100644 --- a/third_party/lzma_sdk/C/Lzma2Dec.c +++ b/third_party/lzma_sdk/C/Lzma2Dec.c
@@ -1,5 +1,5 @@ /* Lzma2Dec.c -- LZMA2 Decoder -2021-02-09 : Igor Pavlov : Public domain */ +2024-03-01 : Igor Pavlov : Public domain */ /* #define SHOW_DEBUG_INFO */ @@ -71,14 +71,14 @@ SRes Lzma2Dec_AllocateProbs(CLzma2Dec *p, Byte prop, ISzAllocPtr alloc) { Byte props[LZMA_PROPS_SIZE]; - RINOK(Lzma2Dec_GetOldProps(prop, props)); + RINOK(Lzma2Dec_GetOldProps(prop, props)) return LzmaDec_AllocateProbs(&p->decoder, props, LZMA_PROPS_SIZE, alloc); } SRes Lzma2Dec_Allocate(CLzma2Dec *p, Byte prop, ISzAllocPtr alloc) { Byte props[LZMA_PROPS_SIZE]; - RINOK(Lzma2Dec_GetOldProps(prop, props)); + RINOK(Lzma2Dec_GetOldProps(prop, props)) return LzmaDec_Allocate(&p->decoder, props, LZMA_PROPS_SIZE, alloc); } @@ -157,8 +157,10 @@ p->decoder.prop.lp = (Byte)lp; return LZMA2_STATE_DATA; } + + default: + return LZMA2_STATE_ERROR; } - return LZMA2_STATE_ERROR; } static void LzmaDec_UpdateWithUncompressed(CLzmaDec *p, const Byte *src, SizeT size) @@ -474,8 +476,8 @@ SizeT outSize = *destLen, inSize = *srcLen; *destLen = *srcLen = 0; *status = LZMA_STATUS_NOT_SPECIFIED; - Lzma2Dec_Construct(&p); - RINOK(Lzma2Dec_AllocateProbs(&p, prop, alloc)); + Lzma2Dec_CONSTRUCT(&p) + RINOK(Lzma2Dec_AllocateProbs(&p, prop, alloc)) p.decoder.dic = dest; p.decoder.dicBufSize = outSize; Lzma2Dec_Init(&p); @@ -487,3 +489,5 @@ Lzma2Dec_FreeProbs(&p, alloc); return res; } + +#undef PRF
diff --git a/third_party/lzma_sdk/C/Lzma2Dec.h b/third_party/lzma_sdk/C/Lzma2Dec.h index b8ddeac..1f5233a72 100644 --- a/third_party/lzma_sdk/C/Lzma2Dec.h +++ b/third_party/lzma_sdk/C/Lzma2Dec.h
@@ -1,8 +1,8 @@ /* Lzma2Dec.h -- LZMA2 Decoder -2018-02-19 : Igor Pavlov : Public domain */ +2023-03-03 : Igor Pavlov : Public domain */ -#ifndef __LZMA2_DEC_H -#define __LZMA2_DEC_H +#ifndef ZIP7_INC_LZMA2_DEC_H +#define ZIP7_INC_LZMA2_DEC_H #include "LzmaDec.h" @@ -22,9 +22,10 @@ CLzmaDec decoder; } CLzma2Dec; -#define Lzma2Dec_Construct(p) LzmaDec_Construct(&(p)->decoder) -#define Lzma2Dec_FreeProbs(p, alloc) LzmaDec_FreeProbs(&(p)->decoder, alloc) -#define Lzma2Dec_Free(p, alloc) LzmaDec_Free(&(p)->decoder, alloc) +#define Lzma2Dec_CONSTRUCT(p) LzmaDec_CONSTRUCT(&(p)->decoder) +#define Lzma2Dec_Construct(p) Lzma2Dec_CONSTRUCT(p) +#define Lzma2Dec_FreeProbs(p, alloc) LzmaDec_FreeProbs(&(p)->decoder, alloc) +#define Lzma2Dec_Free(p, alloc) LzmaDec_Free(&(p)->decoder, alloc) SRes Lzma2Dec_AllocateProbs(CLzma2Dec *p, Byte prop, ISzAllocPtr alloc); SRes Lzma2Dec_Allocate(CLzma2Dec *p, Byte prop, ISzAllocPtr alloc); @@ -90,7 +91,7 @@ at current input positon. */ -#define Lzma2Dec_GetUnpackExtra(p) ((p)->isExtraMode ? (p)->unpackSize : 0); +#define Lzma2Dec_GetUnpackExtra(p) ((p)->isExtraMode ? (p)->unpackSize : 0) /* ---------- One Call Interface ---------- */
diff --git a/third_party/lzma_sdk/C/LzmaDec.c b/third_party/lzma_sdk/C/LzmaDec.c index d6742e5a..69bb8bb 100644 --- a/third_party/lzma_sdk/C/LzmaDec.c +++ b/third_party/lzma_sdk/C/LzmaDec.c
@@ -1,5 +1,5 @@ /* LzmaDec.c -- LZMA Decoder -2021-04-01 : Igor Pavlov : Public domain */ +2023-04-07 : Igor Pavlov : Public domain */ #include "Precomp.h" @@ -8,15 +8,15 @@ /* #include "CpuArch.h" */ #include "LzmaDec.h" -#define kNumTopBits 24 -#define kTopValue ((UInt32)1 << kNumTopBits) +// #define kNumTopBits 24 +#define kTopValue ((UInt32)1 << 24) #define kNumBitModelTotalBits 11 #define kBitModelTotal (1 << kNumBitModelTotalBits) #define RC_INIT_SIZE 5 -#ifndef _LZMA_DEC_OPT +#ifndef Z7_LZMA_DEC_OPT #define kNumMoveBits 5 #define NORMALIZE if (range < kTopValue) { range <<= 8; code = (code << 8) | (*buf++); } @@ -25,14 +25,14 @@ #define UPDATE_0(p) range = bound; *(p) = (CLzmaProb)(ttt + ((kBitModelTotal - ttt) >> kNumMoveBits)); #define UPDATE_1(p) range -= bound; code -= bound; *(p) = (CLzmaProb)(ttt - (ttt >> kNumMoveBits)); #define GET_BIT2(p, i, A0, A1) IF_BIT_0(p) \ - { UPDATE_0(p); i = (i + i); A0; } else \ - { UPDATE_1(p); i = (i + i) + 1; A1; } + { UPDATE_0(p) i = (i + i); A0; } else \ + { UPDATE_1(p) i = (i + i) + 1; A1; } #define TREE_GET_BIT(probs, i) { GET_BIT2(probs + i, i, ;, ;); } #define REV_BIT(p, i, A0, A1) IF_BIT_0(p + i) \ - { UPDATE_0(p + i); A0; } else \ - { UPDATE_1(p + i); A1; } + { UPDATE_0(p + i) A0; } else \ + { UPDATE_1(p + i) A1; } #define REV_BIT_VAR( p, i, m) REV_BIT(p, i, i += m; m += m, m += m; i += m; ) #define REV_BIT_CONST(p, i, m) REV_BIT(p, i, i += m; , i += m * 2; ) #define REV_BIT_LAST( p, i, m) REV_BIT(p, i, i -= m , ; ) @@ -40,19 +40,19 @@ #define TREE_DECODE(probs, limit, i) \ { i = 1; do { TREE_GET_BIT(probs, i); } while (i < limit); i -= limit; } -/* #define _LZMA_SIZE_OPT */ +/* #define Z7_LZMA_SIZE_OPT */ -#ifdef _LZMA_SIZE_OPT +#ifdef Z7_LZMA_SIZE_OPT #define TREE_6_DECODE(probs, i) TREE_DECODE(probs, (1 << 6), i) #else #define TREE_6_DECODE(probs, i) \ { i = 1; \ - TREE_GET_BIT(probs, i); \ - TREE_GET_BIT(probs, i); \ - TREE_GET_BIT(probs, i); \ - TREE_GET_BIT(probs, i); \ - TREE_GET_BIT(probs, i); \ - TREE_GET_BIT(probs, i); \ + TREE_GET_BIT(probs, i) \ + TREE_GET_BIT(probs, i) \ + TREE_GET_BIT(probs, i) \ + TREE_GET_BIT(probs, i) \ + TREE_GET_BIT(probs, i) \ + TREE_GET_BIT(probs, i) \ i -= 0x40; } #endif @@ -64,25 +64,25 @@ probLit = prob + (offs + bit + symbol); \ GET_BIT2(probLit, symbol, offs ^= bit; , ;) -#endif // _LZMA_DEC_OPT +#endif // Z7_LZMA_DEC_OPT #define NORMALIZE_CHECK if (range < kTopValue) { if (buf >= bufLimit) return DUMMY_INPUT_EOF; range <<= 8; code = (code << 8) | (*buf++); } -#define IF_BIT_0_CHECK(p) ttt = *(p); NORMALIZE_CHECK; bound = (range >> kNumBitModelTotalBits) * (UInt32)ttt; if (code < bound) +#define IF_BIT_0_CHECK(p) ttt = *(p); NORMALIZE_CHECK bound = (range >> kNumBitModelTotalBits) * (UInt32)ttt; if (code < bound) #define UPDATE_0_CHECK range = bound; #define UPDATE_1_CHECK range -= bound; code -= bound; #define GET_BIT2_CHECK(p, i, A0, A1) IF_BIT_0_CHECK(p) \ - { UPDATE_0_CHECK; i = (i + i); A0; } else \ - { UPDATE_1_CHECK; i = (i + i) + 1; A1; } + { UPDATE_0_CHECK i = (i + i); A0; } else \ + { UPDATE_1_CHECK i = (i + i) + 1; A1; } #define GET_BIT_CHECK(p, i) GET_BIT2_CHECK(p, i, ; , ;) #define TREE_DECODE_CHECK(probs, limit, i) \ { i = 1; do { GET_BIT_CHECK(probs + i, i) } while (i < limit); i -= limit; } #define REV_BIT_CHECK(p, i, m) IF_BIT_0_CHECK(p + i) \ - { UPDATE_0_CHECK; i += m; m += m; } else \ - { UPDATE_1_CHECK; m += m; i += m; } + { UPDATE_0_CHECK i += m; m += m; } else \ + { UPDATE_1_CHECK m += m; i += m; } #define kNumPosBitsMax 4 @@ -224,14 +224,14 @@ */ -#ifdef _LZMA_DEC_OPT +#ifdef Z7_LZMA_DEC_OPT -int MY_FAST_CALL LZMA_DECODE_REAL(CLzmaDec *p, SizeT limit, const Byte *bufLimit); +int Z7_FASTCALL LZMA_DECODE_REAL(CLzmaDec *p, SizeT limit, const Byte *bufLimit); #else static -int MY_FAST_CALL LZMA_DECODE_REAL(CLzmaDec *p, SizeT limit, const Byte *bufLimit) +int Z7_FASTCALL LZMA_DECODE_REAL(CLzmaDec *p, SizeT limit, const Byte *bufLimit) { CLzmaProb *probs = GET_PROBS; unsigned state = (unsigned)p->state; @@ -263,7 +263,7 @@ IF_BIT_0(prob) { unsigned symbol; - UPDATE_0(prob); + UPDATE_0(prob) prob = probs + Literal; if (processedPos != 0 || checkDicSize != 0) prob += (UInt32)3 * ((((processedPos << 8) + dic[(dicPos == 0 ? dicBufSize : dicPos) - 1]) & lpMask) << lc); @@ -273,7 +273,7 @@ { state -= (state < 4) ? state : 3; symbol = 1; - #ifdef _LZMA_SIZE_OPT + #ifdef Z7_LZMA_SIZE_OPT do { NORMAL_LITER_DEC } while (symbol < 0x100); #else NORMAL_LITER_DEC @@ -292,7 +292,7 @@ unsigned offs = 0x100; state -= (state < 10) ? 3 : 6; symbol = 1; - #ifdef _LZMA_SIZE_OPT + #ifdef Z7_LZMA_SIZE_OPT do { unsigned bit; @@ -321,25 +321,25 @@ } { - UPDATE_1(prob); + UPDATE_1(prob) prob = probs + IsRep + state; IF_BIT_0(prob) { - UPDATE_0(prob); + UPDATE_0(prob) state += kNumStates; prob = probs + LenCoder; } else { - UPDATE_1(prob); + UPDATE_1(prob) prob = probs + IsRepG0 + state; IF_BIT_0(prob) { - UPDATE_0(prob); + UPDATE_0(prob) prob = probs + IsRep0Long + COMBINED_PS_STATE; IF_BIT_0(prob) { - UPDATE_0(prob); + UPDATE_0(prob) // that case was checked before with kBadRepCode // if (checkDicSize == 0 && processedPos == 0) { len = kMatchSpecLen_Error_Data + 1; break; } @@ -353,30 +353,30 @@ state = state < kNumLitStates ? 9 : 11; continue; } - UPDATE_1(prob); + UPDATE_1(prob) } else { UInt32 distance; - UPDATE_1(prob); + UPDATE_1(prob) prob = probs + IsRepG1 + state; IF_BIT_0(prob) { - UPDATE_0(prob); + UPDATE_0(prob) distance = rep1; } else { - UPDATE_1(prob); + UPDATE_1(prob) prob = probs + IsRepG2 + state; IF_BIT_0(prob) { - UPDATE_0(prob); + UPDATE_0(prob) distance = rep2; } else { - UPDATE_1(prob); + UPDATE_1(prob) distance = rep3; rep3 = rep2; } @@ -389,37 +389,37 @@ prob = probs + RepLenCoder; } - #ifdef _LZMA_SIZE_OPT + #ifdef Z7_LZMA_SIZE_OPT { unsigned lim, offset; CLzmaProb *probLen = prob + LenChoice; IF_BIT_0(probLen) { - UPDATE_0(probLen); + UPDATE_0(probLen) probLen = prob + LenLow + GET_LEN_STATE; offset = 0; lim = (1 << kLenNumLowBits); } else { - UPDATE_1(probLen); + UPDATE_1(probLen) probLen = prob + LenChoice2; IF_BIT_0(probLen) { - UPDATE_0(probLen); + UPDATE_0(probLen) probLen = prob + LenLow + GET_LEN_STATE + (1 << kLenNumLowBits); offset = kLenNumLowSymbols; lim = (1 << kLenNumLowBits); } else { - UPDATE_1(probLen); + UPDATE_1(probLen) probLen = prob + LenHigh; offset = kLenNumLowSymbols * 2; lim = (1 << kLenNumHighBits); } } - TREE_DECODE(probLen, lim, len); + TREE_DECODE(probLen, lim, len) len += offset; } #else @@ -427,32 +427,32 @@ CLzmaProb *probLen = prob + LenChoice; IF_BIT_0(probLen) { - UPDATE_0(probLen); + UPDATE_0(probLen) probLen = prob + LenLow + GET_LEN_STATE; len = 1; - TREE_GET_BIT(probLen, len); - TREE_GET_BIT(probLen, len); - TREE_GET_BIT(probLen, len); + TREE_GET_BIT(probLen, len) + TREE_GET_BIT(probLen, len) + TREE_GET_BIT(probLen, len) len -= 8; } else { - UPDATE_1(probLen); + UPDATE_1(probLen) probLen = prob + LenChoice2; IF_BIT_0(probLen) { - UPDATE_0(probLen); + UPDATE_0(probLen) probLen = prob + LenLow + GET_LEN_STATE + (1 << kLenNumLowBits); len = 1; - TREE_GET_BIT(probLen, len); - TREE_GET_BIT(probLen, len); - TREE_GET_BIT(probLen, len); + TREE_GET_BIT(probLen, len) + TREE_GET_BIT(probLen, len) + TREE_GET_BIT(probLen, len) } else { - UPDATE_1(probLen); + UPDATE_1(probLen) probLen = prob + LenHigh; - TREE_DECODE(probLen, (1 << kLenNumHighBits), len); + TREE_DECODE(probLen, (1 << kLenNumHighBits), len) len += kLenNumLowSymbols * 2; } } @@ -464,7 +464,7 @@ UInt32 distance; prob = probs + PosSlot + ((len < kNumLenToPosStates ? len : kNumLenToPosStates - 1) << kNumPosSlotBits); - TREE_6_DECODE(prob, distance); + TREE_6_DECODE(prob, distance) if (distance >= kStartPosModelIndex) { unsigned posSlot = (unsigned)distance; @@ -479,7 +479,7 @@ distance++; do { - REV_BIT_VAR(prob, distance, m); + REV_BIT_VAR(prob, distance, m) } while (--numDirectBits); distance -= m; @@ -514,10 +514,10 @@ distance <<= kNumAlignBits; { unsigned i = 1; - REV_BIT_CONST(prob, i, 1); - REV_BIT_CONST(prob, i, 2); - REV_BIT_CONST(prob, i, 4); - REV_BIT_LAST (prob, i, 8); + REV_BIT_CONST(prob, i, 1) + REV_BIT_CONST(prob, i, 2) + REV_BIT_CONST(prob, i, 4) + REV_BIT_LAST (prob, i, 8) distance |= i; } if (distance == (UInt32)0xFFFFFFFF) @@ -592,7 +592,7 @@ } while (dicPos < limit && buf < bufLimit); - NORMALIZE; + NORMALIZE p->buf = buf; p->range = range; @@ -613,7 +613,7 @@ -static void MY_FAST_CALL LzmaDec_WriteRem(CLzmaDec *p, SizeT limit) +static void Z7_FASTCALL LzmaDec_WriteRem(CLzmaDec *p, SizeT limit) { unsigned len = (unsigned)p->remainLen; if (len == 0 /* || len >= kMatchSpecLenStart */) @@ -683,7 +683,7 @@ (p->checkDicSize == p->prop.dicSize) */ -static int MY_FAST_CALL LzmaDec_DecodeReal2(CLzmaDec *p, SizeT limit, const Byte *bufLimit) +static int Z7_FASTCALL LzmaDec_DecodeReal2(CLzmaDec *p, SizeT limit, const Byte *bufLimit) { if (p->checkDicSize == 0) { @@ -767,54 +767,54 @@ else { unsigned len; - UPDATE_1_CHECK; + UPDATE_1_CHECK prob = probs + IsRep + state; IF_BIT_0_CHECK(prob) { - UPDATE_0_CHECK; + UPDATE_0_CHECK state = 0; prob = probs + LenCoder; res = DUMMY_MATCH; } else { - UPDATE_1_CHECK; + UPDATE_1_CHECK res = DUMMY_REP; prob = probs + IsRepG0 + state; IF_BIT_0_CHECK(prob) { - UPDATE_0_CHECK; + UPDATE_0_CHECK prob = probs + IsRep0Long + COMBINED_PS_STATE; IF_BIT_0_CHECK(prob) { - UPDATE_0_CHECK; + UPDATE_0_CHECK break; } else { - UPDATE_1_CHECK; + UPDATE_1_CHECK } } else { - UPDATE_1_CHECK; + UPDATE_1_CHECK prob = probs + IsRepG1 + state; IF_BIT_0_CHECK(prob) { - UPDATE_0_CHECK; + UPDATE_0_CHECK } else { - UPDATE_1_CHECK; + UPDATE_1_CHECK prob = probs + IsRepG2 + state; IF_BIT_0_CHECK(prob) { - UPDATE_0_CHECK; + UPDATE_0_CHECK } else { - UPDATE_1_CHECK; + UPDATE_1_CHECK } } } @@ -826,31 +826,31 @@ const CLzmaProb *probLen = prob + LenChoice; IF_BIT_0_CHECK(probLen) { - UPDATE_0_CHECK; + UPDATE_0_CHECK probLen = prob + LenLow + GET_LEN_STATE; offset = 0; limit = 1 << kLenNumLowBits; } else { - UPDATE_1_CHECK; + UPDATE_1_CHECK probLen = prob + LenChoice2; IF_BIT_0_CHECK(probLen) { - UPDATE_0_CHECK; + UPDATE_0_CHECK probLen = prob + LenLow + GET_LEN_STATE + (1 << kLenNumLowBits); offset = kLenNumLowSymbols; limit = 1 << kLenNumLowBits; } else { - UPDATE_1_CHECK; + UPDATE_1_CHECK probLen = prob + LenHigh; offset = kLenNumLowSymbols * 2; limit = 1 << kLenNumHighBits; } } - TREE_DECODE_CHECK(probLen, limit, len); + TREE_DECODE_CHECK(probLen, limit, len) len += offset; } @@ -860,7 +860,7 @@ prob = probs + PosSlot + ((len < kNumLenToPosStates - 1 ? len : kNumLenToPosStates - 1) << kNumPosSlotBits); - TREE_DECODE_CHECK(prob, 1 << kNumPosSlotBits, posSlot); + TREE_DECODE_CHECK(prob, 1 << kNumPosSlotBits, posSlot) if (posSlot >= kStartPosModelIndex) { unsigned numDirectBits = ((posSlot >> 1) - 1); @@ -888,7 +888,7 @@ unsigned m = 1; do { - REV_BIT_CHECK(prob, i, m); + REV_BIT_CHECK(prob, i, m) } while (--numDirectBits); } @@ -897,7 +897,7 @@ } break; } - NORMALIZE_CHECK; + NORMALIZE_CHECK *bufOut = buf; return res; @@ -943,7 +943,7 @@ */ -#define RETURN__NOT_FINISHED__FOR_FINISH \ +#define RETURN_NOT_FINISHED_FOR_FINISH \ *status = LZMA_STATUS_NOT_FINISHED; \ return SZ_ERROR_DATA; // for strict mode // return SZ_OK; // for relaxed mode @@ -1029,7 +1029,7 @@ } if (p->remainLen != 0) { - RETURN__NOT_FINISHED__FOR_FINISH; + RETURN_NOT_FINISHED_FOR_FINISH } checkEndMarkNow = 1; } @@ -1072,7 +1072,7 @@ for (i = 0; i < (unsigned)dummyProcessed; i++) p->tempBuf[i] = src[i]; // p->remainLen = kMatchSpecLen_Error_Data; - RETURN__NOT_FINISHED__FOR_FINISH; + RETURN_NOT_FINISHED_FOR_FINISH } bufLimit = src; @@ -1150,7 +1150,7 @@ (*srcLen) += (unsigned)dummyProcessed - p->tempBufSize; p->tempBufSize = (unsigned)dummyProcessed; // p->remainLen = kMatchSpecLen_Error_Data; - RETURN__NOT_FINISHED__FOR_FINISH; + RETURN_NOT_FINISHED_FOR_FINISH } } @@ -1299,8 +1299,8 @@ SRes LzmaDec_AllocateProbs(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAllocPtr alloc) { CLzmaProps propNew; - RINOK(LzmaProps_Decode(&propNew, props, propsSize)); - RINOK(LzmaDec_AllocateProbs2(p, &propNew, alloc)); + RINOK(LzmaProps_Decode(&propNew, props, propsSize)) + RINOK(LzmaDec_AllocateProbs2(p, &propNew, alloc)) p->prop = propNew; return SZ_OK; } @@ -1309,14 +1309,14 @@ { CLzmaProps propNew; SizeT dicBufSize; - RINOK(LzmaProps_Decode(&propNew, props, propsSize)); - RINOK(LzmaDec_AllocateProbs2(p, &propNew, alloc)); + RINOK(LzmaProps_Decode(&propNew, props, propsSize)) + RINOK(LzmaDec_AllocateProbs2(p, &propNew, alloc)) { UInt32 dictSize = propNew.dicSize; SizeT mask = ((UInt32)1 << 12) - 1; if (dictSize >= ((UInt32)1 << 30)) mask = ((UInt32)1 << 22) - 1; - else if (dictSize >= ((UInt32)1 << 22)) mask = ((UInt32)1 << 20) - 1;; + else if (dictSize >= ((UInt32)1 << 22)) mask = ((UInt32)1 << 20) - 1; dicBufSize = ((SizeT)dictSize + mask) & ~mask; if (dicBufSize < dictSize) dicBufSize = dictSize; @@ -1348,8 +1348,8 @@ *status = LZMA_STATUS_NOT_SPECIFIED; if (inSize < RC_INIT_SIZE) return SZ_ERROR_INPUT_EOF; - LzmaDec_Construct(&p); - RINOK(LzmaDec_AllocateProbs(&p, propData, propSize, alloc)); + LzmaDec_CONSTRUCT(&p) + RINOK(LzmaDec_AllocateProbs(&p, propData, propSize, alloc)) p.dic = dest; p.dicBufSize = outSize; LzmaDec_Init(&p);
diff --git a/third_party/lzma_sdk/C/LzmaDec.h b/third_party/lzma_sdk/C/LzmaDec.h index 6f12962..b0ce28f 100644 --- a/third_party/lzma_sdk/C/LzmaDec.h +++ b/third_party/lzma_sdk/C/LzmaDec.h
@@ -1,19 +1,19 @@ /* LzmaDec.h -- LZMA Decoder -2020-03-19 : Igor Pavlov : Public domain */ +2023-04-02 : Igor Pavlov : Public domain */ -#ifndef __LZMA_DEC_H -#define __LZMA_DEC_H +#ifndef ZIP7_INC_LZMA_DEC_H +#define ZIP7_INC_LZMA_DEC_H #include "7zTypes.h" EXTERN_C_BEGIN -/* #define _LZMA_PROB32 */ -/* _LZMA_PROB32 can increase the speed on some CPUs, +/* #define Z7_LZMA_PROB32 */ +/* Z7_LZMA_PROB32 can increase the speed on some CPUs, but memory usage for CLzmaDec::probs will be doubled in that case */ typedef -#ifdef _LZMA_PROB32 +#ifdef Z7_LZMA_PROB32 UInt32 #else UInt16 @@ -25,7 +25,7 @@ #define LZMA_PROPS_SIZE 5 -typedef struct _CLzmaProps +typedef struct { Byte lc; Byte lp; @@ -73,7 +73,8 @@ Byte tempBuf[LZMA_REQUIRED_INPUT_MAX]; } CLzmaDec; -#define LzmaDec_Construct(p) { (p)->dic = NULL; (p)->probs = NULL; } +#define LzmaDec_CONSTRUCT(p) { (p)->dic = NULL; (p)->probs = NULL; } +#define LzmaDec_Construct(p) LzmaDec_CONSTRUCT(p) void LzmaDec_Init(CLzmaDec *p);
diff --git a/third_party/lzma_sdk/C/LzmaEnc.c b/third_party/lzma_sdk/C/LzmaEnc.c index c8b31a19..088b78f 100644 --- a/third_party/lzma_sdk/C/LzmaEnc.c +++ b/third_party/lzma_sdk/C/LzmaEnc.c
@@ -1,5 +1,5 @@ /* LzmaEnc.c -- LZMA Encoder -2022-07-15: Igor Pavlov : Public domain */ +Igor Pavlov : Public domain */ #include "Precomp.h" @@ -16,22 +16,22 @@ #include "LzmaEnc.h" #include "LzFind.h" -#ifndef _7ZIP_ST +#ifndef Z7_ST #include "LzFindMt.h" #endif /* the following LzmaEnc_* declarations is internal LZMA interface for LZMA2 encoder */ -SRes LzmaEnc_PrepareForLzma2(CLzmaEncHandle pp, ISeqInStream *inStream, UInt32 keepWindowSize, +SRes LzmaEnc_PrepareForLzma2(CLzmaEncHandle p, ISeqInStreamPtr inStream, UInt32 keepWindowSize, ISzAllocPtr alloc, ISzAllocPtr allocBig); -SRes LzmaEnc_MemPrepare(CLzmaEncHandle pp, const Byte *src, SizeT srcLen, +SRes LzmaEnc_MemPrepare(CLzmaEncHandle p, const Byte *src, SizeT srcLen, UInt32 keepWindowSize, ISzAllocPtr alloc, ISzAllocPtr allocBig); -SRes LzmaEnc_CodeOneMemBlock(CLzmaEncHandle pp, BoolInt reInit, +SRes LzmaEnc_CodeOneMemBlock(CLzmaEncHandle p, BoolInt reInit, Byte *dest, size_t *destLen, UInt32 desiredPackSize, UInt32 *unpackSize); -const Byte *LzmaEnc_GetCurBuf(CLzmaEncHandle pp); -void LzmaEnc_Finish(CLzmaEncHandle pp); -void LzmaEnc_SaveState(CLzmaEncHandle pp); -void LzmaEnc_RestoreState(CLzmaEncHandle pp); +const Byte *LzmaEnc_GetCurBuf(CLzmaEncHandle p); +void LzmaEnc_Finish(CLzmaEncHandle p); +void LzmaEnc_SaveState(CLzmaEncHandle p); +void LzmaEnc_RestoreState(CLzmaEncHandle p); #ifdef SHOW_STAT static unsigned g_STAT_OFFSET = 0; @@ -40,8 +40,8 @@ /* for good normalization speed we still reserve 256 MB before 4 GB range */ #define kLzmaMaxHistorySize ((UInt32)15 << 28) -#define kNumTopBits 24 -#define kTopValue ((UInt32)1 << kNumTopBits) +// #define kNumTopBits 24 +#define kTopValue ((UInt32)1 << 24) #define kNumBitModelTotalBits 11 #define kBitModelTotal (1 << kNumBitModelTotalBits) @@ -60,6 +60,7 @@ p->dictSize = p->mc = 0; p->reduceSize = (UInt64)(Int64)-1; p->lc = p->lp = p->pb = p->algo = p->fb = p->btMode = p->numHashBytes = p->numThreads = -1; + p->numHashOutBits = 0; p->writeEndMark = 0; p->affinity = 0; } @@ -71,11 +72,11 @@ p->level = level; if (p->dictSize == 0) - p->dictSize = - ( level <= 3 ? ((UInt32)1 << (level * 2 + 16)) : - ( level <= 6 ? ((UInt32)1 << (level + 19)) : - ( level <= 7 ? ((UInt32)1 << 25) : ((UInt32)1 << 26) - ))); + p->dictSize = (unsigned)level <= 4 ? + (UInt32)1 << (level * 2 + 16) : + (unsigned)level <= sizeof(size_t) / 2 + 4 ? + (UInt32)1 << (level + 20) : + (UInt32)1 << (sizeof(size_t) / 2 + 24); if (p->dictSize > p->reduceSize) { @@ -91,15 +92,15 @@ if (p->lp < 0) p->lp = 0; if (p->pb < 0) p->pb = 2; - if (p->algo < 0) p->algo = (level < 5 ? 0 : 1); - if (p->fb < 0) p->fb = (level < 7 ? 32 : 64); + if (p->algo < 0) p->algo = (unsigned)level < 5 ? 0 : 1; + if (p->fb < 0) p->fb = (unsigned)level < 7 ? 32 : 64; if (p->btMode < 0) p->btMode = (p->algo == 0 ? 0 : 1); if (p->numHashBytes < 0) p->numHashBytes = (p->btMode ? 4 : 5); if (p->mc == 0) p->mc = (16 + ((unsigned)p->fb >> 1)) >> (p->btMode ? 0 : 1); if (p->numThreads < 0) p->numThreads = - #ifndef _7ZIP_ST + #ifndef Z7_ST ((p->btMode && p->algo) ? 2 : 1); #else 1; @@ -194,11 +195,11 @@ unsigned GetPosSlot1(UInt32 pos) { unsigned res; - BSR2_RET(pos, res); + BSR2_RET(pos, res) return res; } -#define GetPosSlot2(pos, res) { BSR2_RET(pos, res); } -#define GetPosSlot(pos, res) { if (pos < 2) res = pos; else BSR2_RET(pos, res); } +#define GetPosSlot2(pos, res) { BSR2_RET(pos, res) } +#define GetPosSlot(pos, res) { if (pos < 2) res = pos; else BSR2_RET(pos, res) } #else // ! LZMA_LOG_BSR @@ -293,7 +294,7 @@ #define kNumFullDistances (1 << (kEndPosModelIndex >> 1)) typedef -#ifdef _LZMA_PROB32 +#ifdef Z7_LZMA_PROB32 UInt32 #else UInt16 @@ -350,7 +351,7 @@ Byte *buf; Byte *bufLim; Byte *bufBase; - ISeqOutStream *outStream; + ISeqOutStreamPtr outStream; UInt64 processed; SRes res; } CRangeEnc; @@ -383,7 +384,7 @@ typedef UInt32 CProbPrice; -typedef struct +struct CLzmaEnc { void *matchFinderObj; IMatchFinder2 matchFinder; @@ -426,7 +427,7 @@ UInt32 dictSize; SRes result; - #ifndef _7ZIP_ST + #ifndef Z7_ST BoolInt mtMode; // begin of CMatchFinderMt is used in LZ thread CMatchFinderMt matchFinderMt; @@ -439,7 +440,7 @@ // we suppose that we have 8-bytes alignment after CMatchFinder - #ifndef _7ZIP_ST + #ifndef Z7_ST Byte pad[128]; #endif @@ -479,77 +480,59 @@ CSaveState saveState; // BoolInt mf_Failure; - #ifndef _7ZIP_ST + #ifndef Z7_ST Byte pad2[128]; #endif -} CLzmaEnc; +}; #define MFB (p->matchFinderBase) /* -#ifndef _7ZIP_ST +#ifndef Z7_ST #define MFB (p->matchFinderMt.MatchFinder) #endif */ -#define COPY_ARR(dest, src, arr) memcpy(dest->arr, src->arr, sizeof(src->arr)); +// #define GET_CLzmaEnc_p CLzmaEnc *p = (CLzmaEnc*)(void *)p; +// #define GET_const_CLzmaEnc_p const CLzmaEnc *p = (const CLzmaEnc*)(const void *)p; -void LzmaEnc_SaveState(CLzmaEncHandle pp) +#define COPY_ARR(dest, src, arr) memcpy((dest)->arr, (src)->arr, sizeof((src)->arr)); + +#define COPY_LZMA_ENC_STATE(d, s, p) \ + (d)->state = (s)->state; \ + COPY_ARR(d, s, reps) \ + COPY_ARR(d, s, posAlignEncoder) \ + COPY_ARR(d, s, isRep) \ + COPY_ARR(d, s, isRepG0) \ + COPY_ARR(d, s, isRepG1) \ + COPY_ARR(d, s, isRepG2) \ + COPY_ARR(d, s, isMatch) \ + COPY_ARR(d, s, isRep0Long) \ + COPY_ARR(d, s, posSlotEncoder) \ + COPY_ARR(d, s, posEncoders) \ + (d)->lenProbs = (s)->lenProbs; \ + (d)->repLenProbs = (s)->repLenProbs; \ + memcpy((d)->litProbs, (s)->litProbs, ((size_t)0x300 * sizeof(CLzmaProb)) << (p)->lclp); + +void LzmaEnc_SaveState(CLzmaEncHandle p) { - CLzmaEnc *p = (CLzmaEnc *)pp; - CSaveState *dest = &p->saveState; - - dest->state = p->state; - - dest->lenProbs = p->lenProbs; - dest->repLenProbs = p->repLenProbs; + // GET_CLzmaEnc_p + CSaveState *v = &p->saveState; + COPY_LZMA_ENC_STATE(v, p, p) +} - COPY_ARR(dest, p, reps); - - COPY_ARR(dest, p, posAlignEncoder); - COPY_ARR(dest, p, isRep); - COPY_ARR(dest, p, isRepG0); - COPY_ARR(dest, p, isRepG1); - COPY_ARR(dest, p, isRepG2); - COPY_ARR(dest, p, isMatch); - COPY_ARR(dest, p, isRep0Long); - COPY_ARR(dest, p, posSlotEncoder); - COPY_ARR(dest, p, posEncoders); - - memcpy(dest->litProbs, p->litProbs, ((UInt32)0x300 << p->lclp) * sizeof(CLzmaProb)); +void LzmaEnc_RestoreState(CLzmaEncHandle p) +{ + // GET_CLzmaEnc_p + const CSaveState *v = &p->saveState; + COPY_LZMA_ENC_STATE(p, v, p) } -void LzmaEnc_RestoreState(CLzmaEncHandle pp) +Z7_NO_INLINE +SRes LzmaEnc_SetProps(CLzmaEncHandle p, const CLzmaEncProps *props2) { - CLzmaEnc *dest = (CLzmaEnc *)pp; - const CSaveState *p = &dest->saveState; - - dest->state = p->state; - - dest->lenProbs = p->lenProbs; - dest->repLenProbs = p->repLenProbs; - - COPY_ARR(dest, p, reps); - - COPY_ARR(dest, p, posAlignEncoder); - COPY_ARR(dest, p, isRep); - COPY_ARR(dest, p, isRepG0); - COPY_ARR(dest, p, isRepG1); - COPY_ARR(dest, p, isRepG2); - COPY_ARR(dest, p, isMatch); - COPY_ARR(dest, p, isRep0Long); - COPY_ARR(dest, p, posSlotEncoder); - COPY_ARR(dest, p, posEncoders); - - memcpy(dest->litProbs, p->litProbs, ((UInt32)0x300 << dest->lclp) * sizeof(CLzmaProb)); -} - - - -SRes LzmaEnc_SetProps(CLzmaEncHandle pp, const CLzmaEncProps *props2) -{ - CLzmaEnc *p = (CLzmaEnc *)pp; + // GET_CLzmaEnc_p CLzmaEncProps props = *props2; LzmaEncProps_Normalize(&props); @@ -585,6 +568,7 @@ p->fastMode = (props.algo == 0); // p->_maxMode = True; MFB.btMode = (Byte)(props.btMode ? 1 : 0); + // MFB.btMode = (Byte)(props.btMode); { unsigned numHashBytes = 4; if (props.btMode) @@ -595,13 +579,15 @@ if (props.numHashBytes >= 5) numHashBytes = 5; MFB.numHashBytes = numHashBytes; + // MFB.numHashBytes_Min = 2; + MFB.numHashOutBits = (Byte)props.numHashOutBits; } MFB.cutValue = props.mc; p->writeEndMark = (BoolInt)props.writeEndMark; - #ifndef _7ZIP_ST + #ifndef Z7_ST /* if (newMultiThread != _multiThread) { @@ -618,9 +604,9 @@ } -void LzmaEnc_SetDataSize(CLzmaEncHandle pp, UInt64 expectedDataSiize) +void LzmaEnc_SetDataSize(CLzmaEncHandle p, UInt64 expectedDataSiize) { - CLzmaEnc *p = (CLzmaEnc *)pp; + // GET_CLzmaEnc_p MFB.expectedDataSize = expectedDataSiize; } @@ -684,7 +670,7 @@ p->res = SZ_OK; } -MY_NO_INLINE static void RangeEnc_FlushStream(CRangeEnc *p) +Z7_NO_INLINE static void RangeEnc_FlushStream(CRangeEnc *p) { const size_t num = (size_t)(p->buf - p->bufBase); if (p->res == SZ_OK) @@ -696,7 +682,7 @@ p->buf = p->bufBase; } -MY_NO_INLINE static void MY_FAST_CALL RangeEnc_ShiftLow(CRangeEnc *p) +Z7_NO_INLINE static void Z7_FASTCALL RangeEnc_ShiftLow(CRangeEnc *p) { UInt32 low = (UInt32)p->low; unsigned high = (unsigned)(p->low >> 32); @@ -741,9 +727,9 @@ ttt = *(prob); \ newBound = (range >> kNumBitModelTotalBits) * ttt; -// #define _LZMA_ENC_USE_BRANCH +// #define Z7_LZMA_ENC_USE_BRANCH -#ifdef _LZMA_ENC_USE_BRANCH +#ifdef Z7_LZMA_ENC_USE_BRANCH #define RC_BIT(p, prob, bit) { \ RC_BIT_PRE(p, prob) \ @@ -811,7 +797,7 @@ CLzmaProb *prob = probs + (sym >> 8); UInt32 bit = (sym >> 7) & 1; sym <<= 1; - RC_BIT(p, prob, bit); + RC_BIT(p, prob, bit) } while (sym < 0x10000); p->range = range; @@ -833,7 +819,7 @@ bit = (sym >> 7) & 1; sym <<= 1; offs &= ~(matchByte ^ sym); - RC_BIT(p, prob, bit); + RC_BIT(p, prob, bit) } while (sym < 0x10000); p->range = range; @@ -867,10 +853,10 @@ #define GET_PRICE(prob, bit) \ - p->ProbPrices[((prob) ^ (unsigned)(((-(int)(bit))) & (kBitModelTotal - 1))) >> kNumMoveReducingBits]; + p->ProbPrices[((prob) ^ (unsigned)(((-(int)(bit))) & (kBitModelTotal - 1))) >> kNumMoveReducingBits] #define GET_PRICEa(prob, bit) \ - ProbPrices[((prob) ^ (unsigned)((-((int)(bit))) & (kBitModelTotal - 1))) >> kNumMoveReducingBits]; + ProbPrices[((prob) ^ (unsigned)((-((int)(bit))) & (kBitModelTotal - 1))) >> kNumMoveReducingBits] #define GET_PRICE_0(prob) p->ProbPrices[(prob) >> kNumMoveReducingBits] #define GET_PRICE_1(prob) p->ProbPrices[((prob) ^ (kBitModelTotal - 1)) >> kNumMoveReducingBits] @@ -921,7 +907,7 @@ unsigned bit = sym & 1; // RangeEnc_EncodeBit(rc, probs + m, bit); sym >>= 1; - RC_BIT(rc, probs + m, bit); + RC_BIT(rc, probs + m, bit) m = (m << 1) | bit; } while (--numBits); @@ -944,15 +930,15 @@ UInt32 range, ttt, newBound; CLzmaProb *probs = p->low; range = rc->range; - RC_BIT_PRE(rc, probs); + RC_BIT_PRE(rc, probs) if (sym >= kLenNumLowSymbols) { - RC_BIT_1(rc, probs); + RC_BIT_1(rc, probs) probs += kLenNumLowSymbols; - RC_BIT_PRE(rc, probs); + RC_BIT_PRE(rc, probs) if (sym >= kLenNumLowSymbols * 2) { - RC_BIT_1(rc, probs); + RC_BIT_1(rc, probs) rc->range = range; // RcTree_Encode(rc, p->high, kLenNumHighBits, sym - kLenNumLowSymbols * 2); LitEnc_Encode(rc, p->high, sym - kLenNumLowSymbols * 2); @@ -965,11 +951,11 @@ { unsigned m; unsigned bit; - RC_BIT_0(rc, probs); + RC_BIT_0(rc, probs) probs += (posState << (1 + kLenNumLowBits)); - bit = (sym >> 2) ; RC_BIT(rc, probs + 1, bit); m = (1 << 1) + bit; - bit = (sym >> 1) & 1; RC_BIT(rc, probs + m, bit); m = (m << 1) + bit; - bit = sym & 1; RC_BIT(rc, probs + m, bit); + bit = (sym >> 2) ; RC_BIT(rc, probs + 1, bit) m = (1 << 1) + bit; + bit = (sym >> 1) & 1; RC_BIT(rc, probs + m, bit) m = (m << 1) + bit; + bit = sym & 1; RC_BIT(rc, probs + m, bit) rc->range = range; } } @@ -990,7 +976,7 @@ } -MY_NO_INLINE static void MY_FAST_CALL LenPriceEnc_UpdateTables( +Z7_NO_INLINE static void Z7_FASTCALL LenPriceEnc_UpdateTables( CLenPriceEnc *p, unsigned numPosStates, const CLenEnc *enc, @@ -1054,14 +1040,14 @@ UInt32 price = b; do { - unsigned bit = sym & 1; + const unsigned bit = sym & 1; sym >>= 1; price += GET_PRICEa(probs[sym], bit); } while (sym >= 2); { - unsigned prob = probs[(size_t)i + (1 << (kLenNumHighBits - 1))]; + const unsigned prob = probs[(size_t)i + (1 << (kLenNumHighBits - 1))]; prices[(size_t)i * 2 ] = price + GET_PRICEa_0(prob); prices[(size_t)i * 2 + 1] = price + GET_PRICEa_1(prob); } @@ -1070,7 +1056,7 @@ { unsigned posState; - size_t num = (p->tableSize - kLenNumLowSymbols * 2) * sizeof(p->prices[0][0]); + const size_t num = (p->tableSize - kLenNumLowSymbols * 2) * sizeof(p->prices[0][0]); for (posState = 1; posState < numPosStates; posState++) memcpy(p->prices[posState] + kLenNumLowSymbols * 2, p->prices[0] + kLenNumLowSymbols * 2, num); } @@ -1152,7 +1138,7 @@ + GET_PRICE_1(p->isRep[state]) \ + GET_PRICE_0(p->isRepG0[state]) -MY_FORCE_INLINE +Z7_FORCE_INLINE static UInt32 GetPrice_PureRep(const CLzmaEnc *p, unsigned repIndex, size_t state, size_t posState) { UInt32 price; @@ -1331,7 +1317,7 @@ LitEnc_GetPrice(probs, curByte, p->ProbPrices)); } - MakeAs_Lit(&p->opt[1]); + MakeAs_Lit(&p->opt[1]) matchPrice = GET_PRICE_1(p->isMatch[p->state][posState]); repMatchPrice = matchPrice + GET_PRICE_1(p->isRep[p->state]); @@ -1343,7 +1329,7 @@ if (shortRepPrice < p->opt[1].price) { p->opt[1].price = shortRepPrice; - MakeAs_ShortRep(&p->opt[1]); + MakeAs_ShortRep(&p->opt[1]) } if (last < 2) { @@ -1410,7 +1396,7 @@ else { unsigned slot; - GetPosSlot2(dist, slot); + GetPosSlot2(dist, slot) price += p->alignPrices[dist & kAlignMask]; price += p->posSlotPrices[lenToPosState][slot]; } @@ -1486,7 +1472,7 @@ unsigned delta = best - cur; if (delta != 0) { - MOVE_POS(p, delta); + MOVE_POS(p, delta) } } cur = best; @@ -1633,7 +1619,7 @@ { nextOpt->price = litPrice; nextOpt->len = 1; - MakeAs_Lit(nextOpt); + MakeAs_Lit(nextOpt) nextIsLit = True; } } @@ -1667,7 +1653,7 @@ { nextOpt->price = shortRepPrice; nextOpt->len = 1; - MakeAs_ShortRep(nextOpt); + MakeAs_ShortRep(nextOpt) nextIsLit = False; } } @@ -1871,7 +1857,7 @@ dist = MATCHES[(size_t)offs + 1]; // if (dist >= kNumFullDistances) - GetPosSlot2(dist, posSlot); + GetPosSlot2(dist, posSlot) for (len = /*2*/ startLen; ; len++) { @@ -1962,7 +1948,7 @@ break; dist = MATCHES[(size_t)offs + 1]; // if (dist >= kNumFullDistances) - GetPosSlot2(dist, posSlot); + GetPosSlot2(dist, posSlot) } } } @@ -2138,7 +2124,7 @@ { UInt32 ttt, newBound; RC_BIT_PRE(p, probs + m) - RC_BIT_1(&p->rc, probs + m); + RC_BIT_1(&p->rc, probs + m) m = (m << 1) + 1; } while (m < (1 << kNumPosSlotBits)); @@ -2163,7 +2149,7 @@ { UInt32 ttt, newBound; RC_BIT_PRE(p, probs + m) - RC_BIT_1(&p->rc, probs + m); + RC_BIT_1(&p->rc, probs + m) m = (m << 1) + 1; } while (m < kAlignTableSize); @@ -2179,7 +2165,7 @@ if (p->rc.res != SZ_OK) p->result = SZ_ERROR_WRITE; - #ifndef _7ZIP_ST + #ifndef Z7_ST if ( // p->mf_Failure || (p->mtMode && @@ -2187,7 +2173,7 @@ p->matchFinderMt.failure_LZ_BT)) ) { - p->result = MY_HRES_ERROR__INTERNAL_ERROR; + p->result = MY_HRES_ERROR_INTERNAL_ERROR; // printf("\nCheckErrors p->matchFinderMt.failureLZ\n"); } #endif @@ -2201,7 +2187,7 @@ } -MY_NO_INLINE static SRes Flush(CLzmaEnc *p, UInt32 nowPos) +Z7_NO_INLINE static SRes Flush(CLzmaEnc *p, UInt32 nowPos) { /* ReleaseMFStream(); */ p->finished = True; @@ -2213,7 +2199,7 @@ } -MY_NO_INLINE static void FillAlignPrices(CLzmaEnc *p) +Z7_NO_INLINE static void FillAlignPrices(CLzmaEnc *p) { unsigned i; const CProbPrice *ProbPrices = p->ProbPrices; @@ -2237,7 +2223,7 @@ } -MY_NO_INLINE static void FillDistancesPrices(CLzmaEnc *p) +Z7_NO_INLINE static void FillDistancesPrices(CLzmaEnc *p) { // int y; for (y = 0; y < 100; y++) { @@ -2337,7 +2323,7 @@ RangeEnc_Construct(&p->rc); MatchFinder_Construct(&MFB); - #ifndef _7ZIP_ST + #ifndef Z7_ST p->matchFinderMt.MatchFinder = &MFB; MatchFinderMt_Construct(&p->matchFinderMt); #endif @@ -2345,7 +2331,7 @@ { CLzmaEncProps props; LzmaEncProps_Init(&props); - LzmaEnc_SetProps(p, &props); + LzmaEnc_SetProps((CLzmaEncHandle)(void *)p, &props); } #ifndef LZMA_LOG_BSR @@ -2376,7 +2362,7 @@ static void LzmaEnc_Destruct(CLzmaEnc *p, ISzAllocPtr alloc, ISzAllocPtr allocBig) { - #ifndef _7ZIP_ST + #ifndef Z7_ST MatchFinderMt_Destruct(&p->matchFinderMt, allocBig); #endif @@ -2387,21 +2373,22 @@ void LzmaEnc_Destroy(CLzmaEncHandle p, ISzAllocPtr alloc, ISzAllocPtr allocBig) { - LzmaEnc_Destruct((CLzmaEnc *)p, alloc, allocBig); + // GET_CLzmaEnc_p + LzmaEnc_Destruct(p, alloc, allocBig); ISzAlloc_Free(alloc, p); } -MY_NO_INLINE +Z7_NO_INLINE static SRes LzmaEnc_CodeOneBlock(CLzmaEnc *p, UInt32 maxPackSize, UInt32 maxUnpackSize) { UInt32 nowPos32, startPos32; if (p->needInit) { - #ifndef _7ZIP_ST + #ifndef Z7_ST if (p->mtMode) { - RINOK(MatchFinderMt_InitMt(&p->matchFinderMt)); + RINOK(MatchFinderMt_InitMt(&p->matchFinderMt)) } #endif p->matchFinder.Init(p->matchFinderObj); @@ -2410,7 +2397,7 @@ if (p->finished) return p->result; - RINOK(CheckErrors(p)); + RINOK(CheckErrors(p)) nowPos32 = (UInt32)p->nowPos64; startPos32 = nowPos32; @@ -2473,7 +2460,7 @@ const Byte *data; unsigned state; - RC_BIT_0(&p->rc, probs); + RC_BIT_0(&p->rc, probs) p->rc.range = range; data = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - p->additionalOffset; probs = LIT_PROBS(nowPos32, *(data - 1)); @@ -2487,53 +2474,53 @@ } else { - RC_BIT_1(&p->rc, probs); + RC_BIT_1(&p->rc, probs) probs = &p->isRep[p->state]; RC_BIT_PRE(&p->rc, probs) if (dist < LZMA_NUM_REPS) { - RC_BIT_1(&p->rc, probs); + RC_BIT_1(&p->rc, probs) probs = &p->isRepG0[p->state]; RC_BIT_PRE(&p->rc, probs) if (dist == 0) { - RC_BIT_0(&p->rc, probs); + RC_BIT_0(&p->rc, probs) probs = &p->isRep0Long[p->state][posState]; RC_BIT_PRE(&p->rc, probs) if (len != 1) { - RC_BIT_1_BASE(&p->rc, probs); + RC_BIT_1_BASE(&p->rc, probs) } else { - RC_BIT_0_BASE(&p->rc, probs); + RC_BIT_0_BASE(&p->rc, probs) p->state = kShortRepNextStates[p->state]; } } else { - RC_BIT_1(&p->rc, probs); + RC_BIT_1(&p->rc, probs) probs = &p->isRepG1[p->state]; RC_BIT_PRE(&p->rc, probs) if (dist == 1) { - RC_BIT_0_BASE(&p->rc, probs); + RC_BIT_0_BASE(&p->rc, probs) dist = p->reps[1]; } else { - RC_BIT_1(&p->rc, probs); + RC_BIT_1(&p->rc, probs) probs = &p->isRepG2[p->state]; RC_BIT_PRE(&p->rc, probs) if (dist == 2) { - RC_BIT_0_BASE(&p->rc, probs); + RC_BIT_0_BASE(&p->rc, probs) dist = p->reps[2]; } else { - RC_BIT_1_BASE(&p->rc, probs); + RC_BIT_1_BASE(&p->rc, probs) dist = p->reps[3]; p->reps[3] = p->reps[2]; } @@ -2557,7 +2544,7 @@ else { unsigned posSlot; - RC_BIT_0(&p->rc, probs); + RC_BIT_0(&p->rc, probs) p->rc.range = range; p->state = kMatchNextStates[p->state]; @@ -2571,7 +2558,7 @@ p->reps[0] = dist + 1; p->matchPriceCount++; - GetPosSlot(dist, posSlot); + GetPosSlot(dist, posSlot) // RcTree_Encode_PosSlot(&p->rc, p->posSlotEncoder[GetLenToPosState(len)], posSlot); { UInt32 sym = (UInt32)posSlot + (1 << kNumPosSlotBits); @@ -2582,7 +2569,7 @@ CLzmaProb *prob = probs + (sym >> kNumPosSlotBits); UInt32 bit = (sym >> (kNumPosSlotBits - 1)) & 1; sym <<= 1; - RC_BIT(&p->rc, prob, bit); + RC_BIT(&p->rc, prob, bit) } while (sym < (1 << kNumPosSlotBits * 2)); p->rc.range = range; @@ -2626,10 +2613,10 @@ { unsigned m = 1; unsigned bit; - bit = dist & 1; dist >>= 1; RC_BIT(&p->rc, p->posAlignEncoder + m, bit); m = (m << 1) + bit; - bit = dist & 1; dist >>= 1; RC_BIT(&p->rc, p->posAlignEncoder + m, bit); m = (m << 1) + bit; - bit = dist & 1; dist >>= 1; RC_BIT(&p->rc, p->posAlignEncoder + m, bit); m = (m << 1) + bit; - bit = dist & 1; RC_BIT(&p->rc, p->posAlignEncoder + m, bit); + bit = dist & 1; dist >>= 1; RC_BIT(&p->rc, p->posAlignEncoder + m, bit) m = (m << 1) + bit; + bit = dist & 1; dist >>= 1; RC_BIT(&p->rc, p->posAlignEncoder + m, bit) m = (m << 1) + bit; + bit = dist & 1; dist >>= 1; RC_BIT(&p->rc, p->posAlignEncoder + m, bit) m = (m << 1) + bit; + bit = dist & 1; RC_BIT(&p->rc, p->posAlignEncoder + m, bit) p->rc.range = range; // p->alignPriceCount++; } @@ -2704,17 +2691,17 @@ if (!RangeEnc_Alloc(&p->rc, alloc)) return SZ_ERROR_MEM; - #ifndef _7ZIP_ST + #ifndef Z7_ST p->mtMode = (p->multiThread && !p->fastMode && (MFB.btMode != 0)); #endif { - unsigned lclp = p->lc + p->lp; + const unsigned lclp = p->lc + p->lp; if (!p->litProbs || !p->saveState.litProbs || p->lclp != lclp) { LzmaEnc_FreeLits(p, alloc); - p->litProbs = (CLzmaProb *)ISzAlloc_Alloc(alloc, ((UInt32)0x300 << lclp) * sizeof(CLzmaProb)); - p->saveState.litProbs = (CLzmaProb *)ISzAlloc_Alloc(alloc, ((UInt32)0x300 << lclp) * sizeof(CLzmaProb)); + p->litProbs = (CLzmaProb *)ISzAlloc_Alloc(alloc, ((size_t)0x300 * sizeof(CLzmaProb)) << lclp); + p->saveState.litProbs = (CLzmaProb *)ISzAlloc_Alloc(alloc, ((size_t)0x300 * sizeof(CLzmaProb)) << lclp); if (!p->litProbs || !p->saveState.litProbs) { LzmaEnc_FreeLits(p, alloc); @@ -2748,15 +2735,14 @@ (numFastBytes + LZMA_MATCH_LEN_MAX + 1) */ - #ifndef _7ZIP_ST + #ifndef Z7_ST if (p->mtMode) { RINOK(MatchFinderMt_Create(&p->matchFinderMt, dictSize, beforeSize, p->numFastBytes, LZMA_MATCH_LEN_MAX + 1 /* 18.04 */ - , allocBig)); + , allocBig)) p->matchFinderObj = &p->matchFinderMt; - MFB.bigHash = (Byte)( - (p->dictSize > kBigHashDicLimit && MFB.hashMask >= 0xFFFFFF) ? 1 : 0); + MFB.bigHash = (Byte)(MFB.hashMask >= 0xFFFFFF ? 1 : 0); MatchFinderMt_CreateVTable(&p->matchFinderMt, &p->matchFinder); } else @@ -2816,8 +2802,8 @@ } { - UInt32 num = (UInt32)0x300 << (p->lp + p->lc); - UInt32 k; + const size_t num = (size_t)0x300 << (p->lp + p->lc); + size_t k; CLzmaProb *probs = p->litProbs; for (k = 0; k < num; k++) probs[k] = kProbInitValue; @@ -2872,59 +2858,53 @@ p->finished = False; p->result = SZ_OK; - RINOK(LzmaEnc_Alloc(p, keepWindowSize, alloc, allocBig)); + p->nowPos64 = 0; + p->needInit = 1; + RINOK(LzmaEnc_Alloc(p, keepWindowSize, alloc, allocBig)) LzmaEnc_Init(p); LzmaEnc_InitPrices(p); - p->nowPos64 = 0; return SZ_OK; } -static SRes LzmaEnc_Prepare(CLzmaEncHandle pp, ISeqOutStream *outStream, ISeqInStream *inStream, +static SRes LzmaEnc_Prepare(CLzmaEncHandle p, + ISeqOutStreamPtr outStream, + ISeqInStreamPtr inStream, ISzAllocPtr alloc, ISzAllocPtr allocBig) { - CLzmaEnc *p = (CLzmaEnc *)pp; - MFB.stream = inStream; - p->needInit = 1; + // GET_CLzmaEnc_p + MatchFinder_SET_STREAM(&MFB, inStream) p->rc.outStream = outStream; return LzmaEnc_AllocAndInit(p, 0, alloc, allocBig); } -SRes LzmaEnc_PrepareForLzma2(CLzmaEncHandle pp, - ISeqInStream *inStream, UInt32 keepWindowSize, +SRes LzmaEnc_PrepareForLzma2(CLzmaEncHandle p, + ISeqInStreamPtr inStream, UInt32 keepWindowSize, ISzAllocPtr alloc, ISzAllocPtr allocBig) { - CLzmaEnc *p = (CLzmaEnc *)pp; - MFB.stream = inStream; - p->needInit = 1; + // GET_CLzmaEnc_p + MatchFinder_SET_STREAM(&MFB, inStream) return LzmaEnc_AllocAndInit(p, keepWindowSize, alloc, allocBig); } -static void LzmaEnc_SetInputBuf(CLzmaEnc *p, const Byte *src, SizeT srcLen) +SRes LzmaEnc_MemPrepare(CLzmaEncHandle p, + const Byte *src, SizeT srcLen, + UInt32 keepWindowSize, + ISzAllocPtr alloc, ISzAllocPtr allocBig) { - MFB.directInput = 1; - MFB.bufferBase = (Byte *)src; - MFB.directInputRem = srcLen; -} - -SRes LzmaEnc_MemPrepare(CLzmaEncHandle pp, const Byte *src, SizeT srcLen, - UInt32 keepWindowSize, ISzAllocPtr alloc, ISzAllocPtr allocBig) -{ - CLzmaEnc *p = (CLzmaEnc *)pp; - LzmaEnc_SetInputBuf(p, src, srcLen); - p->needInit = 1; - - LzmaEnc_SetDataSize(pp, srcLen); + // GET_CLzmaEnc_p + MatchFinder_SET_DIRECT_INPUT_BUF(&MFB, src, srcLen) + LzmaEnc_SetDataSize(p, srcLen); return LzmaEnc_AllocAndInit(p, keepWindowSize, alloc, allocBig); } -void LzmaEnc_Finish(CLzmaEncHandle pp) +void LzmaEnc_Finish(CLzmaEncHandle p) { - #ifndef _7ZIP_ST - CLzmaEnc *p = (CLzmaEnc *)pp; + #ifndef Z7_ST + // GET_CLzmaEnc_p if (p->mtMode) MatchFinderMt_ReleaseStream(&p->matchFinderMt); #else - UNUSED_VAR(pp); + UNUSED_VAR(p) #endif } @@ -2933,13 +2913,13 @@ { ISeqOutStream vt; Byte *data; - SizeT rem; + size_t rem; BoolInt overflow; } CLzmaEnc_SeqOutStreamBuf; -static size_t SeqOutStreamBuf_Write(const ISeqOutStream *pp, const void *data, size_t size) +static size_t SeqOutStreamBuf_Write(ISeqOutStreamPtr pp, const void *data, size_t size) { - CLzmaEnc_SeqOutStreamBuf *p = CONTAINER_FROM_VTBL(pp, CLzmaEnc_SeqOutStreamBuf, vt); + Z7_CONTAINER_FROM_VTBL_TO_DECL_VAR_pp_vt_p(CLzmaEnc_SeqOutStreamBuf) if (p->rem < size) { size = p->rem; @@ -2956,25 +2936,25 @@ /* -UInt32 LzmaEnc_GetNumAvailableBytes(CLzmaEncHandle pp) +UInt32 LzmaEnc_GetNumAvailableBytes(CLzmaEncHandle p) { - const CLzmaEnc *p = (CLzmaEnc *)pp; + GET_const_CLzmaEnc_p return p->matchFinder.GetNumAvailableBytes(p->matchFinderObj); } */ -const Byte *LzmaEnc_GetCurBuf(CLzmaEncHandle pp) +const Byte *LzmaEnc_GetCurBuf(CLzmaEncHandle p) { - const CLzmaEnc *p = (CLzmaEnc *)pp; + // GET_const_CLzmaEnc_p return p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - p->additionalOffset; } // (desiredPackSize == 0) is not allowed -SRes LzmaEnc_CodeOneMemBlock(CLzmaEncHandle pp, BoolInt reInit, +SRes LzmaEnc_CodeOneMemBlock(CLzmaEncHandle p, BoolInt reInit, Byte *dest, size_t *destLen, UInt32 desiredPackSize, UInt32 *unpackSize) { - CLzmaEnc *p = (CLzmaEnc *)pp; + // GET_CLzmaEnc_p UInt64 nowPos64; SRes res; CLzmaEnc_SeqOutStreamBuf outStream; @@ -3006,12 +2986,12 @@ } -MY_NO_INLINE -static SRes LzmaEnc_Encode2(CLzmaEnc *p, ICompressProgress *progress) +Z7_NO_INLINE +static SRes LzmaEnc_Encode2(CLzmaEnc *p, ICompressProgressPtr progress) { SRes res = SZ_OK; - #ifndef _7ZIP_ST + #ifndef Z7_ST Byte allocaDummy[0x300]; allocaDummy[0] = 0; allocaDummy[1] = allocaDummy[0]; @@ -3033,7 +3013,7 @@ } } - LzmaEnc_Finish(p); + LzmaEnc_Finish((CLzmaEncHandle)(void *)p); /* if (res == SZ_OK && !Inline_MatchFinder_IsFinishedOK(&MFB)) @@ -3045,21 +3025,22 @@ } -SRes LzmaEnc_Encode(CLzmaEncHandle pp, ISeqOutStream *outStream, ISeqInStream *inStream, ICompressProgress *progress, +SRes LzmaEnc_Encode(CLzmaEncHandle p, ISeqOutStreamPtr outStream, ISeqInStreamPtr inStream, ICompressProgressPtr progress, ISzAllocPtr alloc, ISzAllocPtr allocBig) { - RINOK(LzmaEnc_Prepare(pp, outStream, inStream, alloc, allocBig)); - return LzmaEnc_Encode2((CLzmaEnc *)pp, progress); + // GET_CLzmaEnc_p + RINOK(LzmaEnc_Prepare(p, outStream, inStream, alloc, allocBig)) + return LzmaEnc_Encode2(p, progress); } -SRes LzmaEnc_WriteProperties(CLzmaEncHandle pp, Byte *props, SizeT *size) +SRes LzmaEnc_WriteProperties(CLzmaEncHandle p, Byte *props, SizeT *size) { if (*size < LZMA_PROPS_SIZE) return SZ_ERROR_PARAM; *size = LZMA_PROPS_SIZE; { - const CLzmaEnc *p = (const CLzmaEnc *)pp; + // GET_CLzmaEnc_p const UInt32 dictSize = p->dictSize; UInt32 v; props[0] = (Byte)((p->pb * 5 + p->lp) * 9 + p->lc); @@ -3083,23 +3064,24 @@ while (v < dictSize); } - SetUi32(props + 1, v); + SetUi32(props + 1, v) return SZ_OK; } } -unsigned LzmaEnc_IsWriteEndMark(CLzmaEncHandle pp) +unsigned LzmaEnc_IsWriteEndMark(CLzmaEncHandle p) { - return (unsigned)((CLzmaEnc *)pp)->writeEndMark; + // GET_CLzmaEnc_p + return (unsigned)p->writeEndMark; } -SRes LzmaEnc_MemEncode(CLzmaEncHandle pp, Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen, - int writeEndMark, ICompressProgress *progress, ISzAllocPtr alloc, ISzAllocPtr allocBig) +SRes LzmaEnc_MemEncode(CLzmaEncHandle p, Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen, + int writeEndMark, ICompressProgressPtr progress, ISzAllocPtr alloc, ISzAllocPtr allocBig) { SRes res; - CLzmaEnc *p = (CLzmaEnc *)pp; + // GET_CLzmaEnc_p CLzmaEnc_SeqOutStreamBuf outStream; @@ -3111,7 +3093,7 @@ p->writeEndMark = writeEndMark; p->rc.outStream = &outStream.vt; - res = LzmaEnc_MemPrepare(pp, src, srcLen, 0, alloc, allocBig); + res = LzmaEnc_MemPrepare(p, src, srcLen, 0, alloc, allocBig); if (res == SZ_OK) { @@ -3120,7 +3102,7 @@ res = SZ_ERROR_FAIL; } - *destLen -= outStream.rem; + *destLen -= (SizeT)outStream.rem; if (outStream.overflow) return SZ_ERROR_OUTPUT_EOF; return res; @@ -3129,9 +3111,9 @@ SRes LzmaEncode(Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen, const CLzmaEncProps *props, Byte *propsEncoded, SizeT *propsSize, int writeEndMark, - ICompressProgress *progress, ISzAllocPtr alloc, ISzAllocPtr allocBig) + ICompressProgressPtr progress, ISzAllocPtr alloc, ISzAllocPtr allocBig) { - CLzmaEnc *p = (CLzmaEnc *)LzmaEnc_Create(alloc); + CLzmaEncHandle p = LzmaEnc_Create(alloc); SRes res; if (!p) return SZ_ERROR_MEM; @@ -3151,10 +3133,10 @@ /* -#ifndef _7ZIP_ST -void LzmaEnc_GetLzThreads(CLzmaEncHandle pp, HANDLE lz_threads[2]) +#ifndef Z7_ST +void LzmaEnc_GetLzThreads(CLzmaEncHandle p, HANDLE lz_threads[2]) { - const CLzmaEnc *p = (CLzmaEnc *)pp; + GET_const_CLzmaEnc_p lz_threads[0] = p->matchFinderMt.hashSync.thread; lz_threads[1] = p->matchFinderMt.btSync.thread; }
diff --git a/third_party/lzma_sdk/C/LzmaEnc.h b/third_party/lzma_sdk/C/LzmaEnc.h index bc2ed5042..9f8039a 100644 --- a/third_party/lzma_sdk/C/LzmaEnc.h +++ b/third_party/lzma_sdk/C/LzmaEnc.h
@@ -1,8 +1,8 @@ /* LzmaEnc.h -- LZMA Encoder -2019-10-30 : Igor Pavlov : Public domain */ +2023-04-13 : Igor Pavlov : Public domain */ -#ifndef __LZMA_ENC_H -#define __LZMA_ENC_H +#ifndef ZIP7_INC_LZMA_ENC_H +#define ZIP7_INC_LZMA_ENC_H #include "7zTypes.h" @@ -10,7 +10,7 @@ #define LZMA_PROPS_SIZE 5 -typedef struct _CLzmaEncProps +typedef struct { int level; /* 0 <= level <= 9 */ UInt32 dictSize; /* (1 << 12) <= dictSize <= (1 << 27) for 32-bit version @@ -23,10 +23,13 @@ int fb; /* 5 <= fb <= 273, default = 32 */ int btMode; /* 0 - hashChain Mode, 1 - binTree mode - normal, default = 1 */ int numHashBytes; /* 2, 3 or 4, default = 4 */ + unsigned numHashOutBits; /* default = ? */ UInt32 mc; /* 1 <= mc <= (1 << 30), default = 32 */ unsigned writeEndMark; /* 0 - do not write EOPM, 1 - write EOPM, default = 0 */ int numThreads; /* 1 or 2, default = 2 */ + // int _pad; + UInt64 reduceSize; /* estimated size of data that will be compressed. default = (UInt64)(Int64)-1. Encoder uses this value to reduce dictionary size */ @@ -51,7 +54,9 @@ SZ_ERROR_THREAD - error in multithreading functions (only for Mt version) */ -typedef void * CLzmaEncHandle; +typedef struct CLzmaEnc CLzmaEnc; +typedef CLzmaEnc * CLzmaEncHandle; +// Z7_DECLARE_HANDLE(CLzmaEncHandle) CLzmaEncHandle LzmaEnc_Create(ISzAllocPtr alloc); void LzmaEnc_Destroy(CLzmaEncHandle p, ISzAllocPtr alloc, ISzAllocPtr allocBig); @@ -61,17 +66,17 @@ SRes LzmaEnc_WriteProperties(CLzmaEncHandle p, Byte *properties, SizeT *size); unsigned LzmaEnc_IsWriteEndMark(CLzmaEncHandle p); -SRes LzmaEnc_Encode(CLzmaEncHandle p, ISeqOutStream *outStream, ISeqInStream *inStream, - ICompressProgress *progress, ISzAllocPtr alloc, ISzAllocPtr allocBig); +SRes LzmaEnc_Encode(CLzmaEncHandle p, ISeqOutStreamPtr outStream, ISeqInStreamPtr inStream, + ICompressProgressPtr progress, ISzAllocPtr alloc, ISzAllocPtr allocBig); SRes LzmaEnc_MemEncode(CLzmaEncHandle p, Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen, - int writeEndMark, ICompressProgress *progress, ISzAllocPtr alloc, ISzAllocPtr allocBig); + int writeEndMark, ICompressProgressPtr progress, ISzAllocPtr alloc, ISzAllocPtr allocBig); /* ---------- One Call Interface ---------- */ SRes LzmaEncode(Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen, const CLzmaEncProps *props, Byte *propsEncoded, SizeT *propsSize, int writeEndMark, - ICompressProgress *progress, ISzAllocPtr alloc, ISzAllocPtr allocBig); + ICompressProgressPtr progress, ISzAllocPtr alloc, ISzAllocPtr allocBig); EXTERN_C_END
diff --git a/third_party/lzma_sdk/C/LzmaLib.c b/third_party/lzma_sdk/C/LzmaLib.c index 706e9e58..785e884 100644 --- a/third_party/lzma_sdk/C/LzmaLib.c +++ b/third_party/lzma_sdk/C/LzmaLib.c
@@ -1,12 +1,14 @@ /* LzmaLib.c -- LZMA library wrapper -2015-06-13 : Igor Pavlov : Public domain */ +2023-04-02 : Igor Pavlov : Public domain */ + +#include "Precomp.h" #include "Alloc.h" #include "LzmaDec.h" #include "LzmaEnc.h" #include "LzmaLib.h" -MY_STDAPI LzmaCompress(unsigned char *dest, size_t *destLen, const unsigned char *src, size_t srcLen, +Z7_STDAPI LzmaCompress(unsigned char *dest, size_t *destLen, const unsigned char *src, size_t srcLen, unsigned char *outProps, size_t *outPropsSize, int level, /* 0 <= level <= 9, default = 5 */ unsigned dictSize, /* use (1 << N) or (3 << N). 4 KB < dictSize <= 128 MB */ @@ -32,7 +34,7 @@ } -MY_STDAPI LzmaUncompress(unsigned char *dest, size_t *destLen, const unsigned char *src, size_t *srcLen, +Z7_STDAPI LzmaUncompress(unsigned char *dest, size_t *destLen, const unsigned char *src, size_t *srcLen, const unsigned char *props, size_t propsSize) { ELzmaStatus status;
diff --git a/third_party/lzma_sdk/C/LzmaLib.h b/third_party/lzma_sdk/C/LzmaLib.h index c343a85..d7c0724d 100644 --- a/third_party/lzma_sdk/C/LzmaLib.h +++ b/third_party/lzma_sdk/C/LzmaLib.h
@@ -1,14 +1,14 @@ /* LzmaLib.h -- LZMA library interface -2021-04-03 : Igor Pavlov : Public domain */ +2023-04-02 : Igor Pavlov : Public domain */ -#ifndef __LZMA_LIB_H -#define __LZMA_LIB_H +#ifndef ZIP7_INC_LZMA_LIB_H +#define ZIP7_INC_LZMA_LIB_H #include "7zTypes.h" EXTERN_C_BEGIN -#define MY_STDAPI int MY_STD_CALL +#define Z7_STDAPI int Z7_STDCALL #define LZMA_PROPS_SIZE 5 @@ -100,7 +100,7 @@ SZ_ERROR_THREAD - errors in multithreading functions (only for Mt version) */ -MY_STDAPI LzmaCompress(unsigned char *dest, size_t *destLen, const unsigned char *src, size_t srcLen, +Z7_STDAPI LzmaCompress(unsigned char *dest, size_t *destLen, const unsigned char *src, size_t srcLen, unsigned char *outProps, size_t *outPropsSize, /* *outPropsSize must be = 5 */ int level, /* 0 <= level <= 9, default = 5 */ unsigned dictSize, /* default = (1 << 24) */ @@ -130,7 +130,7 @@ SZ_ERROR_INPUT_EOF - it needs more bytes in input buffer (src) */ -MY_STDAPI LzmaUncompress(unsigned char *dest, size_t *destLen, const unsigned char *src, SizeT *srcLen, +Z7_STDAPI LzmaUncompress(unsigned char *dest, size_t *destLen, const unsigned char *src, SizeT *srcLen, const unsigned char *props, size_t propsSize); EXTERN_C_END
diff --git a/third_party/lzma_sdk/C/Precomp.h b/third_party/lzma_sdk/C/Precomp.h index e8ff8b4..7747fdd 100644 --- a/third_party/lzma_sdk/C/Precomp.h +++ b/third_party/lzma_sdk/C/Precomp.h
@@ -1,10 +1,127 @@ -/* Precomp.h -- StdAfx -2013-11-12 : Igor Pavlov : Public domain */ +/* Precomp.h -- precompilation file +2024-01-25 : Igor Pavlov : Public domain */ -#ifndef __7Z_PRECOMP_H -#define __7Z_PRECOMP_H +#ifndef ZIP7_INC_PRECOMP_H +#define ZIP7_INC_PRECOMP_H + +/* + this file must be included before another *.h files and before <windows.h>. + this file is included from the following files: + C\*.c + C\Util\*\Precomp.h <- C\Util\*\*.c + CPP\Common\Common.h <- *\StdAfx.h <- *\*.cpp + + this file can set the following macros: + Z7_LARGE_PAGES 1 + Z7_LONG_PATH 1 + Z7_WIN32_WINNT_MIN 0x0500 (or higher) : we require at least win2000+ for 7-Zip + _WIN32_WINNT 0x0500 (or higher) + WINVER _WIN32_WINNT + UNICODE 1 + _UNICODE 1 +*/ #include "Compiler.h" -/* #include "7zTypes.h" */ + +#ifdef _MSC_VER +// #pragma warning(disable : 4206) // nonstandard extension used : translation unit is empty +#if _MSC_VER >= 1912 +// #pragma warning(disable : 5039) // pointer or reference to potentially throwing function passed to 'extern "C"' function under - EHc.Undefined behavior may occur if this function throws an exception. +#endif +#endif + +/* +// for debug: +#define UNICODE 1 +#define _UNICODE 1 +#define _WIN32_WINNT 0x0500 // win2000 +#ifndef WINVER + #define WINVER _WIN32_WINNT +#endif +*/ + +#ifdef _WIN32 +/* + this "Precomp.h" file must be included before <windows.h>, + if we want to define _WIN32_WINNT before <windows.h>. +*/ + +#ifndef Z7_LARGE_PAGES +#ifndef Z7_NO_LARGE_PAGES +#define Z7_LARGE_PAGES 1 +#endif +#endif + +#ifndef Z7_LONG_PATH +#ifndef Z7_NO_LONG_PATH +#define Z7_LONG_PATH 1 +#endif +#endif + +#ifndef Z7_DEVICE_FILE +#ifndef Z7_NO_DEVICE_FILE +// #define Z7_DEVICE_FILE 1 +#endif +#endif + +// we don't change macros if included after <windows.h> +#ifndef _WINDOWS_ + +#ifndef Z7_WIN32_WINNT_MIN + #if defined(_M_ARM64) || defined(__aarch64__) + // #define Z7_WIN32_WINNT_MIN 0x0a00 // win10 + #define Z7_WIN32_WINNT_MIN 0x0600 // vista + #elif defined(_M_ARM) && defined(_M_ARMT) && defined(_M_ARM_NT) + // #define Z7_WIN32_WINNT_MIN 0x0602 // win8 + #define Z7_WIN32_WINNT_MIN 0x0600 // vista + #elif defined(_M_X64) || defined(_M_AMD64) || defined(__x86_64__) || defined(_M_IA64) + #define Z7_WIN32_WINNT_MIN 0x0503 // win2003 + // #elif defined(_M_IX86) || defined(__i386__) + // #define Z7_WIN32_WINNT_MIN 0x0500 // win2000 + #else // x86 and another(old) systems + #define Z7_WIN32_WINNT_MIN 0x0500 // win2000 + // #define Z7_WIN32_WINNT_MIN 0x0502 // win2003 // for debug + #endif +#endif // Z7_WIN32_WINNT_MIN + + +#ifndef Z7_DO_NOT_DEFINE_WIN32_WINNT +#ifdef _WIN32_WINNT + // #error Stop_Compiling_Bad_WIN32_WINNT +#else + #ifndef Z7_NO_DEFINE_WIN32_WINNT +Z7_DIAGNOSTIC_IGNORE_BEGIN_RESERVED_MACRO_IDENTIFIER + #define _WIN32_WINNT Z7_WIN32_WINNT_MIN +Z7_DIAGNOSTIC_IGNORE_END_RESERVED_MACRO_IDENTIFIER + #endif +#endif // _WIN32_WINNT + +#ifndef WINVER + #define WINVER _WIN32_WINNT +#endif +#endif // Z7_DO_NOT_DEFINE_WIN32_WINNT + + +#ifndef _MBCS +#ifndef Z7_NO_UNICODE +// UNICODE and _UNICODE are used by <windows.h> and by 7-zip code. + +#ifndef UNICODE +#define UNICODE 1 +#endif + +#ifndef _UNICODE +Z7_DIAGNOSTIC_IGNORE_BEGIN_RESERVED_MACRO_IDENTIFIER +#define _UNICODE 1 +Z7_DIAGNOSTIC_IGNORE_END_RESERVED_MACRO_IDENTIFIER +#endif + +#endif // Z7_NO_UNICODE +#endif // _MBCS +#endif // _WINDOWS_ + +// #include "7zWindows.h" + +#endif // _WIN32 #endif
diff --git a/third_party/lzma_sdk/C/RotateDefs.h b/third_party/lzma_sdk/C/RotateDefs.h index 8f01d1a..c16b4f8e 100644 --- a/third_party/lzma_sdk/C/RotateDefs.h +++ b/third_party/lzma_sdk/C/RotateDefs.h
@@ -1,14 +1,14 @@ /* RotateDefs.h -- Rotate functions -2015-03-25 : Igor Pavlov : Public domain */ +2023-06-18 : Igor Pavlov : Public domain */ -#ifndef __ROTATE_DEFS_H -#define __ROTATE_DEFS_H +#ifndef ZIP7_INC_ROTATE_DEFS_H +#define ZIP7_INC_ROTATE_DEFS_H #ifdef _MSC_VER #include <stdlib.h> -/* don't use _rotl with MINGW. It can insert slow call to function. */ +/* don't use _rotl with old MINGW. It can insert slow call to function. */ /* #if (_MSC_VER >= 1200) */ #pragma intrinsic(_rotl) @@ -18,12 +18,32 @@ #define rotlFixed(x, n) _rotl((x), (n)) #define rotrFixed(x, n) _rotr((x), (n)) +#if (_MSC_VER >= 1300) +#define Z7_ROTL64(x, n) _rotl64((x), (n)) +#define Z7_ROTR64(x, n) _rotr64((x), (n)) +#else +#define Z7_ROTL64(x, n) (((x) << (n)) | ((x) >> (64 - (n)))) +#define Z7_ROTR64(x, n) (((x) >> (n)) | ((x) << (64 - (n)))) +#endif + #else /* new compilers can translate these macros to fast commands. */ +#if defined(__clang__) && (__clang_major__ >= 4) \ + || defined(__GNUC__) && (__GNUC__ >= 5) +/* GCC 4.9.0 and clang 3.5 can recognize more correct version: */ +#define rotlFixed(x, n) (((x) << (n)) | ((x) >> (-(n) & 31))) +#define rotrFixed(x, n) (((x) >> (n)) | ((x) << (-(n) & 31))) +#define Z7_ROTL64(x, n) (((x) << (n)) | ((x) >> (-(n) & 63))) +#define Z7_ROTR64(x, n) (((x) >> (n)) | ((x) << (-(n) & 63))) +#else +/* for old GCC / clang: */ #define rotlFixed(x, n) (((x) << (n)) | ((x) >> (32 - (n)))) #define rotrFixed(x, n) (((x) >> (n)) | ((x) << (32 - (n)))) +#define Z7_ROTL64(x, n) (((x) << (n)) | ((x) >> (64 - (n)))) +#define Z7_ROTR64(x, n) (((x) >> (n)) | ((x) << (64 - (n)))) +#endif #endif
diff --git a/third_party/lzma_sdk/C/Sha256.c b/third_party/lzma_sdk/C/Sha256.c index 2199684..ea7ed8e 100644 --- a/third_party/lzma_sdk/C/Sha256.c +++ b/third_party/lzma_sdk/C/Sha256.c
@@ -1,65 +1,60 @@ /* Sha256.c -- SHA-256 Hash -2021-04-01 : Igor Pavlov : Public domain +: Igor Pavlov : Public domain This code is based on public domain code from Wei Dai's Crypto++ library. */ #include "Precomp.h" #include <string.h> -#include "CpuArch.h" -#include "RotateDefs.h" #include "Sha256.h" - -#if defined(_MSC_VER) && (_MSC_VER < 1900) -// #define USE_MY_MM -#endif +#include "RotateDefs.h" +#include "CpuArch.h" #ifdef MY_CPU_X86_OR_AMD64 - #ifdef _MSC_VER - #if _MSC_VER >= 1200 - #define _SHA_SUPPORTED - #endif - #elif defined(__clang__) - #if (__clang_major__ >= 8) // fix that check - #define _SHA_SUPPORTED - #endif - #elif defined(__GNUC__) - #if (__GNUC__ >= 8) // fix that check - #define _SHA_SUPPORTED - #endif - #elif defined(__INTEL_COMPILER) - #if (__INTEL_COMPILER >= 1800) // fix that check - #define _SHA_SUPPORTED - #endif + #if defined(Z7_LLVM_CLANG_VERSION) && (Z7_LLVM_CLANG_VERSION >= 30800) \ + || defined(Z7_APPLE_CLANG_VERSION) && (Z7_APPLE_CLANG_VERSION >= 50100) \ + || defined(Z7_GCC_VERSION) && (Z7_GCC_VERSION >= 40900) \ + || defined(__INTEL_COMPILER) && (__INTEL_COMPILER >= 1600) \ + || defined(_MSC_VER) && (_MSC_VER >= 1200) + #define Z7_COMPILER_SHA256_SUPPORTED #endif -// TODO(crbug.com/1338627): Enable ARM optimizations -#elif 0 // defined(MY_CPU_ARM_OR_ARM64) - #ifdef _MSC_VER - #if _MSC_VER >= 1910 - #define _SHA_SUPPORTED +#elif defined(MY_CPU_ARM_OR_ARM64) && defined(MY_CPU_LE) + + #if defined(__ARM_FEATURE_SHA2) \ + || defined(__ARM_FEATURE_CRYPTO) + #define Z7_COMPILER_SHA256_SUPPORTED + #else + #if defined(MY_CPU_ARM64) \ + || defined(__ARM_ARCH) && (__ARM_ARCH >= 4) \ + || defined(Z7_MSC_VER_ORIGINAL) + #if defined(__ARM_FP) && \ + ( defined(Z7_CLANG_VERSION) && (Z7_CLANG_VERSION >= 30800) \ + || defined(__GNUC__) && (__GNUC__ >= 6) \ + ) \ + || defined(Z7_MSC_VER_ORIGINAL) && (_MSC_VER >= 1910) + #if defined(MY_CPU_ARM64) \ + || !defined(Z7_CLANG_VERSION) \ + || defined(__ARM_NEON) && \ + (Z7_CLANG_VERSION < 170000 || \ + Z7_CLANG_VERSION > 170001) + #define Z7_COMPILER_SHA256_SUPPORTED #endif - #elif defined(__clang__) - #if (__clang_major__ >= 8) // fix that check - #define _SHA_SUPPORTED #endif - #elif defined(__GNUC__) - #if (__GNUC__ >= 6) // fix that check - #define _SHA_SUPPORTED #endif #endif #endif -void MY_FAST_CALL Sha256_UpdateBlocks(UInt32 state[8], const Byte *data, size_t numBlocks); +void Z7_FASTCALL Sha256_UpdateBlocks(UInt32 state[8], const Byte *data, size_t numBlocks); -#ifdef _SHA_SUPPORTED - void MY_FAST_CALL Sha256_UpdateBlocks_HW(UInt32 state[8], const Byte *data, size_t numBlocks); +#ifdef Z7_COMPILER_SHA256_SUPPORTED + void Z7_FASTCALL Sha256_UpdateBlocks_HW(UInt32 state[8], const Byte *data, size_t numBlocks); - static SHA256_FUNC_UPDATE_BLOCKS g_FUNC_UPDATE_BLOCKS = Sha256_UpdateBlocks; - static SHA256_FUNC_UPDATE_BLOCKS g_FUNC_UPDATE_BLOCKS_HW; + static SHA256_FUNC_UPDATE_BLOCKS g_SHA256_FUNC_UPDATE_BLOCKS = Sha256_UpdateBlocks; + static SHA256_FUNC_UPDATE_BLOCKS g_SHA256_FUNC_UPDATE_BLOCKS_HW; - #define UPDATE_BLOCKS(p) p->func_UpdateBlocks + #define SHA256_UPDATE_BLOCKS(p) p->v.vars.func_UpdateBlocks #else - #define UPDATE_BLOCKS(p) Sha256_UpdateBlocks + #define SHA256_UPDATE_BLOCKS(p) Sha256_UpdateBlocks #endif @@ -67,16 +62,16 @@ { SHA256_FUNC_UPDATE_BLOCKS func = Sha256_UpdateBlocks; - #ifdef _SHA_SUPPORTED + #ifdef Z7_COMPILER_SHA256_SUPPORTED if (algo != SHA256_ALGO_SW) { if (algo == SHA256_ALGO_DEFAULT) - func = g_FUNC_UPDATE_BLOCKS; + func = g_SHA256_FUNC_UPDATE_BLOCKS; else { if (algo != SHA256_ALGO_HW) return False; - func = g_FUNC_UPDATE_BLOCKS_HW; + func = g_SHA256_FUNC_UPDATE_BLOCKS_HW; if (!func) return False; } @@ -86,24 +81,25 @@ return False; #endif - p->func_UpdateBlocks = func; + p->v.vars.func_UpdateBlocks = func; return True; } /* define it for speed optimization */ -#ifdef _SFX +#ifdef Z7_SFX #define STEP_PRE 1 #define STEP_MAIN 1 #else #define STEP_PRE 2 #define STEP_MAIN 4 - // #define _SHA256_UNROLL + // #define Z7_SHA256_UNROLL #endif +#undef Z7_SHA256_BIG_W #if STEP_MAIN != 16 - #define _SHA256_BIG_W + #define Z7_SHA256_BIG_W #endif @@ -111,7 +107,7 @@ void Sha256_InitState(CSha256 *p) { - p->count = 0; + p->v.vars.count = 0; p->state[0] = 0x6a09e667; p->state[1] = 0xbb67ae85; p->state[2] = 0x3c6ef372; @@ -122,21 +118,28 @@ p->state[7] = 0x5be0cd19; } + + + + + + + void Sha256_Init(CSha256 *p) { - p->func_UpdateBlocks = - #ifdef _SHA_SUPPORTED - g_FUNC_UPDATE_BLOCKS; + p->v.vars.func_UpdateBlocks = + #ifdef Z7_COMPILER_SHA256_SUPPORTED + g_SHA256_FUNC_UPDATE_BLOCKS; #else NULL; #endif Sha256_InitState(p); } -#define S0(x) (rotrFixed(x, 2) ^ rotrFixed(x,13) ^ rotrFixed(x, 22)) -#define S1(x) (rotrFixed(x, 6) ^ rotrFixed(x,11) ^ rotrFixed(x, 25)) +#define S0(x) (rotrFixed(x, 2) ^ rotrFixed(x,13) ^ rotrFixed(x,22)) +#define S1(x) (rotrFixed(x, 6) ^ rotrFixed(x,11) ^ rotrFixed(x,25)) #define s0(x) (rotrFixed(x, 7) ^ rotrFixed(x,18) ^ (x >> 3)) -#define s1(x) (rotrFixed(x,17) ^ rotrFixed(x,19) ^ (x >> 10)) +#define s1(x) (rotrFixed(x,17) ^ rotrFixed(x,19) ^ (x >>10)) #define Ch(x,y,z) (z^(x&(y^z))) #define Maj(x,y,z) ((x&y)|(z&(x|y))) @@ -146,7 +149,7 @@ #define blk2_main(j, i) s1(w(j, (i)-2)) + w(j, (i)-7) + s0(w(j, (i)-15)) -#ifdef _SHA256_BIG_W +#ifdef Z7_SHA256_BIG_W // we use +i instead of +(i) to change the order to solve CLANG compiler warning for signed/unsigned. #define w(j, i) W[(size_t)(j) + i] #define blk2(j, i) (w(j, i) = w(j, (i)-16) + blk2_main(j, i)) @@ -177,7 +180,7 @@ #define R1_PRE(i) T1( W_PRE, i) #define R1_MAIN(i) T1( W_MAIN, i) -#if (!defined(_SHA256_UNROLL) || STEP_MAIN < 8) && (STEP_MAIN >= 4) +#if (!defined(Z7_SHA256_UNROLL) || STEP_MAIN < 8) && (STEP_MAIN >= 4) #define R2_MAIN(i) \ R1_MAIN(i) \ R1_MAIN(i + 1) \ @@ -186,7 +189,7 @@ -#if defined(_SHA256_UNROLL) && STEP_MAIN >= 8 +#if defined(Z7_SHA256_UNROLL) && STEP_MAIN >= 8 #define T4( a,b,c,d,e,f,g,h, wx, i) \ h += S1(e) + Ch(e,f,g) + K[(i)+(size_t)(j)] + wx(i); \ @@ -224,14 +227,10 @@ #endif -void MY_FAST_CALL Sha256_UpdateBlocks_HW(UInt32 state[8], const Byte *data, size_t numBlocks); -// static -extern MY_ALIGN(64) -const UInt32 SHA256_K_ARRAY[64]; - -MY_ALIGN(64) -const UInt32 SHA256_K_ARRAY[64] = { +extern +MY_ALIGN(64) const UInt32 SHA256_K_ARRAY[64]; +MY_ALIGN(64) const UInt32 SHA256_K_ARRAY[64] = { 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, @@ -250,27 +249,29 @@ 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2 }; + + + + #define K SHA256_K_ARRAY - -MY_NO_INLINE -void MY_FAST_CALL Sha256_UpdateBlocks(UInt32 state[8], const Byte *data, size_t numBlocks) +Z7_NO_INLINE +void Z7_FASTCALL Sha256_UpdateBlocks(UInt32 state[8], const Byte *data, size_t numBlocks) { UInt32 W - #ifdef _SHA256_BIG_W +#ifdef Z7_SHA256_BIG_W [64]; - #else +#else [16]; - #endif - +#endif unsigned j; - UInt32 a,b,c,d,e,f,g,h; - - #if !defined(_SHA256_UNROLL) || (STEP_MAIN <= 4) || (STEP_PRE <= 4) +#if !defined(Z7_SHA256_UNROLL) || (STEP_MAIN <= 4) || (STEP_PRE <= 4) UInt32 tmp; - #endif +#endif + if (numBlocks == 0) return; + a = state[0]; b = state[1]; c = state[2]; @@ -280,7 +281,7 @@ g = state[6]; h = state[7]; - while (numBlocks) + do { for (j = 0; j < 16; j += STEP_PRE) @@ -298,12 +299,12 @@ #else - R1_PRE(0); + R1_PRE(0) #if STEP_PRE >= 2 - R1_PRE(1); + R1_PRE(1) #if STEP_PRE >= 4 - R1_PRE(2); - R1_PRE(3); + R1_PRE(2) + R1_PRE(3) #endif #endif @@ -312,32 +313,32 @@ for (j = 16; j < 64; j += STEP_MAIN) { - #if defined(_SHA256_UNROLL) && STEP_MAIN >= 8 + #if defined(Z7_SHA256_UNROLL) && STEP_MAIN >= 8 #if STEP_MAIN < 8 - R4_MAIN(0); + R4_MAIN(0) #else - R8_MAIN(0); + R8_MAIN(0) #if STEP_MAIN == 16 - R8_MAIN(8); + R8_MAIN(8) #endif #endif #else - R1_MAIN(0); + R1_MAIN(0) #if STEP_MAIN >= 2 - R1_MAIN(1); + R1_MAIN(1) #if STEP_MAIN >= 4 - R2_MAIN(2); + R2_MAIN(2) #if STEP_MAIN >= 8 - R2_MAIN(4); - R2_MAIN(6); + R2_MAIN(4) + R2_MAIN(6) #if STEP_MAIN >= 16 - R2_MAIN(8); - R2_MAIN(10); - R2_MAIN(12); - R2_MAIN(14); + R2_MAIN(8) + R2_MAIN(10) + R2_MAIN(12) + R2_MAIN(14) #endif #endif #endif @@ -354,40 +355,27 @@ g += state[6]; state[6] = g; h += state[7]; state[7] = h; - data += 64; - numBlocks--; + data += SHA256_BLOCK_SIZE; } - - /* Wipe variables */ - /* memset(W, 0, sizeof(W)); */ + while (--numBlocks); } -#undef S0 -#undef S1 -#undef s0 -#undef s1 -#undef K -#define Sha256_UpdateBlock(p) UPDATE_BLOCKS(p)(p->state, p->buffer, 1) +#define Sha256_UpdateBlock(p) SHA256_UPDATE_BLOCKS(p)(p->state, p->buffer, 1) void Sha256_Update(CSha256 *p, const Byte *data, size_t size) { if (size == 0) return; - { - unsigned pos = (unsigned)p->count & 0x3F; - unsigned num; - - p->count += size; - - num = 64 - pos; + const unsigned pos = (unsigned)p->v.vars.count & (SHA256_BLOCK_SIZE - 1); + const unsigned num = SHA256_BLOCK_SIZE - pos; + p->v.vars.count += size; if (num > size) { memcpy(p->buffer + pos, data, size); return; } - if (pos != 0) { size -= num; @@ -397,9 +385,10 @@ } } { - size_t numBlocks = size >> 6; - UPDATE_BLOCKS(p)(p->state, data, numBlocks); - size &= 0x3F; + const size_t numBlocks = size >> 6; + // if (numBlocks) + SHA256_UPDATE_BLOCKS(p)(p->state, data, numBlocks); + size &= SHA256_BLOCK_SIZE - 1; if (size == 0) return; data += (numBlocks << 6); @@ -410,78 +399,94 @@ void Sha256_Final(CSha256 *p, Byte *digest) { - unsigned pos = (unsigned)p->count & 0x3F; - unsigned i; - + unsigned pos = (unsigned)p->v.vars.count & (SHA256_BLOCK_SIZE - 1); p->buffer[pos++] = 0x80; - - if (pos > (64 - 8)) + if (pos > (SHA256_BLOCK_SIZE - 4 * 2)) { - while (pos != 64) { p->buffer[pos++] = 0; } - // memset(&p->buf.buffer[pos], 0, 64 - pos); + while (pos != SHA256_BLOCK_SIZE) { p->buffer[pos++] = 0; } + // memset(&p->buf.buffer[pos], 0, SHA256_BLOCK_SIZE - pos); Sha256_UpdateBlock(p); pos = 0; } - - /* - if (pos & 3) + memset(&p->buffer[pos], 0, (SHA256_BLOCK_SIZE - 4 * 2) - pos); { - p->buffer[pos] = 0; - p->buffer[pos + 1] = 0; - p->buffer[pos + 2] = 0; - pos += 3; - pos &= ~3; + const UInt64 numBits = p->v.vars.count << 3; + SetBe32(p->buffer + SHA256_BLOCK_SIZE - 4 * 2, (UInt32)(numBits >> 32)) + SetBe32(p->buffer + SHA256_BLOCK_SIZE - 4 * 1, (UInt32)(numBits)) } - { - for (; pos < 64 - 8; pos += 4) - *(UInt32 *)(&p->buffer[pos]) = 0; - } - */ - - memset(&p->buffer[pos], 0, (64 - 8) - pos); - - { - UInt64 numBits = (p->count << 3); - SetBe32(p->buffer + 64 - 8, (UInt32)(numBits >> 32)); - SetBe32(p->buffer + 64 - 4, (UInt32)(numBits)); - } - Sha256_UpdateBlock(p); - - for (i = 0; i < 8; i += 2) +#if 1 && defined(MY_CPU_BE) + memcpy(digest, p->state, SHA256_DIGEST_SIZE); +#else { - UInt32 v0 = p->state[i]; - UInt32 v1 = p->state[(size_t)i + 1]; - SetBe32(digest , v0); - SetBe32(digest + 4, v1); - digest += 8; + unsigned i; + for (i = 0; i < 8; i += 2) + { + const UInt32 v0 = p->state[i]; + const UInt32 v1 = p->state[(size_t)i + 1]; + SetBe32(digest , v0) + SetBe32(digest + 4, v1) + digest += 4 * 2; + } } - + + + + +#endif Sha256_InitState(p); } -void Sha256Prepare() +void Sha256Prepare(void) { - #ifdef _SHA_SUPPORTED +#ifdef Z7_COMPILER_SHA256_SUPPORTED SHA256_FUNC_UPDATE_BLOCKS f, f_hw; f = Sha256_UpdateBlocks; f_hw = NULL; - #ifdef MY_CPU_X86_OR_AMD64 - #ifndef USE_MY_MM +#ifdef MY_CPU_X86_OR_AMD64 if (CPU_IsSupported_SHA() && CPU_IsSupported_SSSE3() - // && CPU_IsSupported_SSE41() ) - #endif - #else +#else if (CPU_IsSupported_SHA2()) - #endif +#endif { // printf("\n========== HW SHA256 ======== \n"); f = f_hw = Sha256_UpdateBlocks_HW; } - g_FUNC_UPDATE_BLOCKS = f; - g_FUNC_UPDATE_BLOCKS_HW = f_hw; - #endif + g_SHA256_FUNC_UPDATE_BLOCKS = f; + g_SHA256_FUNC_UPDATE_BLOCKS_HW = f_hw; +#endif } + +#undef U64C +#undef K +#undef S0 +#undef S1 +#undef s0 +#undef s1 +#undef Ch +#undef Maj +#undef W_MAIN +#undef W_PRE +#undef w +#undef blk2_main +#undef blk2 +#undef T1 +#undef T4 +#undef T8 +#undef R1_PRE +#undef R1_MAIN +#undef R2_MAIN +#undef R4 +#undef R4_PRE +#undef R4_MAIN +#undef R8 +#undef R8_PRE +#undef R8_MAIN +#undef STEP_PRE +#undef STEP_MAIN +#undef Z7_SHA256_BIG_W +#undef Z7_SHA256_UNROLL +#undef Z7_COMPILER_SHA256_SUPPORTED
diff --git a/third_party/lzma_sdk/C/Sha256.h b/third_party/lzma_sdk/C/Sha256.h index aa38501..75329cd 100644 --- a/third_party/lzma_sdk/C/Sha256.h +++ b/third_party/lzma_sdk/C/Sha256.h
@@ -1,8 +1,8 @@ /* Sha256.h -- SHA-256 Hash -2021-01-01 : Igor Pavlov : Public domain */ +: Igor Pavlov : Public domain */ -#ifndef __7Z_SHA256_H -#define __7Z_SHA256_H +#ifndef ZIP7_INC_SHA256_H +#define ZIP7_INC_SHA256_H #include "7zTypes.h" @@ -14,7 +14,10 @@ #define SHA256_BLOCK_SIZE (SHA256_NUM_BLOCK_WORDS * 4) #define SHA256_DIGEST_SIZE (SHA256_NUM_DIGEST_WORDS * 4) -typedef void (MY_FAST_CALL *SHA256_FUNC_UPDATE_BLOCKS)(UInt32 state[8], const Byte *data, size_t numBlocks); + + + +typedef void (Z7_FASTCALL *SHA256_FUNC_UPDATE_BLOCKS)(UInt32 state[8], const Byte *data, size_t numBlocks); /* if (the system supports different SHA256 code implementations) @@ -32,9 +35,16 @@ typedef struct { - SHA256_FUNC_UPDATE_BLOCKS func_UpdateBlocks; - UInt64 count; - UInt64 __pad_2[2]; + union + { + struct + { + SHA256_FUNC_UPDATE_BLOCKS func_UpdateBlocks; + UInt64 count; + } vars; + UInt64 _pad_64bit[4]; + void *_pad_align_ptr[2]; + } v; UInt32 state[SHA256_NUM_DIGEST_WORDS]; Byte buffer[SHA256_BLOCK_SIZE]; @@ -62,7 +72,7 @@ -// void MY_FAST_CALL Sha256_UpdateBlocks(UInt32 state[8], const Byte *data, size_t numBlocks); +// void Z7_FASTCALL Sha256_UpdateBlocks(UInt32 state[8], const Byte *data, size_t numBlocks); /* call Sha256Prepare() once at program start.
diff --git a/third_party/lzma_sdk/C/Sha256Opt.c b/third_party/lzma_sdk/C/Sha256Opt.c index decc1382..1c6b50f8 100644 --- a/third_party/lzma_sdk/C/Sha256Opt.c +++ b/third_party/lzma_sdk/C/Sha256Opt.c
@@ -1,71 +1,53 @@ /* Sha256Opt.c -- SHA-256 optimized code for SHA-256 hardware instructions -2021-04-01 : Igor Pavlov : Public domain */ +: Igor Pavlov : Public domain */ #include "Precomp.h" - -#if defined(_MSC_VER) -#if (_MSC_VER < 1900) && (_MSC_VER >= 1200) -// #define USE_MY_MM -#endif -#endif - +#include "Compiler.h" #include "CpuArch.h" +// #define Z7_USE_HW_SHA_STUB // for debug #ifdef MY_CPU_X86_OR_AMD64 - #if defined(__clang__) - #if (__clang_major__ >= 8) // fix that check + #if defined(__INTEL_COMPILER) && (__INTEL_COMPILER >= 1600) // fix that check #define USE_HW_SHA - #ifndef __SHA__ + #elif defined(Z7_LLVM_CLANG_VERSION) && (Z7_LLVM_CLANG_VERSION >= 30800) \ + || defined(Z7_APPLE_CLANG_VERSION) && (Z7_APPLE_CLANG_VERSION >= 50100) \ + || defined(Z7_GCC_VERSION) && (Z7_GCC_VERSION >= 40900) + #define USE_HW_SHA + #if !defined(__INTEL_COMPILER) + // icc defines __GNUC__, but icc doesn't support __attribute__(__target__) + #if !defined(__SHA__) || !defined(__SSSE3__) #define ATTRIB_SHA __attribute__((__target__("sha,ssse3"))) - #if defined(_MSC_VER) - // SSSE3: for clang-cl: - #include <tmmintrin.h> - #define __SHA__ - #endif #endif - - #endif - #elif defined(__GNUC__) - #if (__GNUC__ >= 8) // fix that check - #define USE_HW_SHA - #ifndef __SHA__ - #define ATTRIB_SHA __attribute__((__target__("sha,ssse3"))) - // #pragma GCC target("sha,ssse3") #endif - #endif - #elif defined(__INTEL_COMPILER) - #if (__INTEL_COMPILER >= 1800) // fix that check - #define USE_HW_SHA - #endif #elif defined(_MSC_VER) - #ifdef USE_MY_MM - #define USE_VER_MIN 1300 - #else - #define USE_VER_MIN 1910 - #endif - #if _MSC_VER >= USE_VER_MIN + #if (_MSC_VER >= 1900) #define USE_HW_SHA + #else + #define Z7_USE_HW_SHA_STUB #endif #endif // #endif // MY_CPU_X86_OR_AMD64 +#ifndef USE_HW_SHA + // #define Z7_USE_HW_SHA_STUB // for debug +#endif #ifdef USE_HW_SHA // #pragma message("Sha256 HW") -// #include <wmmintrin.h> -#if !defined(_MSC_VER) || (_MSC_VER >= 1900) + + + +// sse/sse2/ssse3: +#include <tmmintrin.h> +// sha*: #include <immintrin.h> + +#if defined (__clang__) && defined(_MSC_VER) + #if !defined(__SHA__) + #include <shaintrin.h> + #endif #else -#include <emmintrin.h> - -#if defined(_MSC_VER) && (_MSC_VER >= 1600) -// #include <intrin.h> -#endif - -#ifdef USE_MY_MM -#include "My_mm.h" -#endif #endif @@ -94,60 +76,44 @@ extern MY_ALIGN(64) const UInt32 SHA256_K_ARRAY[64]; - #define K SHA256_K_ARRAY -#define ADD_EPI32(dest, src) dest = _mm_add_epi32(dest, src); -#define SHA256_MSG1(dest, src) dest = _mm_sha256msg1_epu32(dest, src); -#define SHA25G_MSG2(dest, src) dest = _mm_sha256msg2_epu32(dest, src); - +#define ADD_EPI32(dest, src) dest = _mm_add_epi32(dest, src); +#define SHA256_MSG1(dest, src) dest = _mm_sha256msg1_epu32(dest, src); +#define SHA256_MSG2(dest, src) dest = _mm_sha256msg2_epu32(dest, src); #define LOAD_SHUFFLE(m, k) \ m = _mm_loadu_si128((const __m128i *)(const void *)(data + (k) * 16)); \ m = _mm_shuffle_epi8(m, mask); \ -#define SM1(g0, g1, g2, g3) \ - SHA256_MSG1(g3, g0); \ +#define NNN(m0, m1, m2, m3) -#define SM2(g0, g1, g2, g3) \ - tmp = _mm_alignr_epi8(g1, g0, 4); \ - ADD_EPI32(g2, tmp); \ - SHA25G_MSG2(g2, g1); \ +#define SM1(m1, m2, m3, m0) \ + SHA256_MSG1(m0, m1); \ -// #define LS0(k, g0, g1, g2, g3) LOAD_SHUFFLE(g0, k) -// #define LS1(k, g0, g1, g2, g3) LOAD_SHUFFLE(g1, k+1) - - -#define NNN(g0, g1, g2, g3) - +#define SM2(m2, m3, m0, m1) \ + ADD_EPI32(m0, _mm_alignr_epi8(m3, m2, 4)) \ + SHA256_MSG2(m0, m3); \ #define RND2(t0, t1) \ t0 = _mm_sha256rnds2_epu32(t0, t1, msg); -#define RND2_0(m, k) \ - msg = _mm_add_epi32(m, *(const __m128i *) (const void *) &K[(k) * 4]); \ + + +#define R4(k, m0, m1, m2, m3, OP0, OP1) \ + msg = _mm_add_epi32(m0, *(const __m128i *) (const void *) &K[(k) * 4]); \ RND2(state0, state1); \ msg = _mm_shuffle_epi32(msg, 0x0E); \ - - -#define RND2_1 \ + OP0(m0, m1, m2, m3) \ RND2(state1, state0); \ - - -// We use scheme with 3 rounds ahead for SHA256_MSG1 / 2 rounds ahead for SHA256_MSG2 - -#define R4(k, g0, g1, g2, g3, OP0, OP1) \ - RND2_0(g0, k); \ - OP0(g0, g1, g2, g3); \ - RND2_1; \ - OP1(g0, g1, g2, g3); \ + OP1(m0, m1, m2, m3) \ #define R16(k, OP0, OP1, OP2, OP3, OP4, OP5, OP6, OP7) \ - R4 ( (k)*4+0, m0, m1, m2, m3, OP0, OP1 ) \ - R4 ( (k)*4+1, m1, m2, m3, m0, OP2, OP3 ) \ - R4 ( (k)*4+2, m2, m3, m0, m1, OP4, OP5 ) \ - R4 ( (k)*4+3, m3, m0, m1, m2, OP6, OP7 ) \ + R4 ( (k)*4+0, m0,m1,m2,m3, OP0, OP1 ) \ + R4 ( (k)*4+1, m1,m2,m3,m0, OP2, OP3 ) \ + R4 ( (k)*4+2, m2,m3,m0,m1, OP4, OP5 ) \ + R4 ( (k)*4+3, m3,m0,m1,m2, OP6, OP7 ) \ #define PREPARE_STATE \ tmp = _mm_shuffle_epi32(state0, 0x1B); /* abcd */ \ @@ -157,15 +123,16 @@ state1 = _mm_unpackhi_epi64(state1, tmp); /* abef */ \ -void MY_FAST_CALL Sha256_UpdateBlocks_HW(UInt32 state[8], const Byte *data, size_t numBlocks); +void Z7_FASTCALL Sha256_UpdateBlocks_HW(UInt32 state[8], const Byte *data, size_t numBlocks); #ifdef ATTRIB_SHA ATTRIB_SHA #endif -void MY_FAST_CALL Sha256_UpdateBlocks_HW(UInt32 state[8], const Byte *data, size_t numBlocks) +void Z7_FASTCALL Sha256_UpdateBlocks_HW(UInt32 state[8], const Byte *data, size_t numBlocks) { const __m128i mask = _mm_set_epi32(0x0c0d0e0f, 0x08090a0b, 0x04050607, 0x00010203); - __m128i tmp; - __m128i state0, state1; + + + __m128i tmp, state0, state1; if (numBlocks == 0) return; @@ -192,13 +159,13 @@ - R16 ( 0, NNN, NNN, SM1, NNN, SM1, SM2, SM1, SM2 ); - R16 ( 1, SM1, SM2, SM1, SM2, SM1, SM2, SM1, SM2 ); - R16 ( 2, SM1, SM2, SM1, SM2, SM1, SM2, SM1, SM2 ); - R16 ( 3, SM1, SM2, NNN, SM2, NNN, NNN, NNN, NNN ); + R16 ( 0, NNN, NNN, SM1, NNN, SM1, SM2, SM1, SM2 ) + R16 ( 1, SM1, SM2, SM1, SM2, SM1, SM2, SM1, SM2 ) + R16 ( 2, SM1, SM2, SM1, SM2, SM1, SM2, SM1, SM2 ) + R16 ( 3, SM1, SM2, NNN, SM2, NNN, NNN, NNN, NNN ) - ADD_EPI32(state0, state0_save); - ADD_EPI32(state1, state1_save); + ADD_EPI32(state0, state0_save) + ADD_EPI32(state1, state1_save) data += 64; } @@ -212,19 +179,28 @@ #endif // USE_HW_SHA -#elif defined(MY_CPU_ARM_OR_ARM64) - - #if defined(__clang__) - #if (__clang_major__ >= 8) // fix that check +#elif defined(MY_CPU_ARM_OR_ARM64) && defined(MY_CPU_LE) + + #if defined(__ARM_FEATURE_SHA2) \ + || defined(__ARM_FEATURE_CRYPTO) + #define USE_HW_SHA + #else + #if defined(MY_CPU_ARM64) \ + || defined(__ARM_ARCH) && (__ARM_ARCH >= 4) \ + || defined(Z7_MSC_VER_ORIGINAL) + #if defined(__ARM_FP) && \ + ( defined(Z7_CLANG_VERSION) && (Z7_CLANG_VERSION >= 30800) \ + || defined(__GNUC__) && (__GNUC__ >= 6) \ + ) \ + || defined(Z7_MSC_VER_ORIGINAL) && (_MSC_VER >= 1910) + #if defined(MY_CPU_ARM64) \ + || !defined(Z7_CLANG_VERSION) \ + || defined(__ARM_NEON) && \ + (Z7_CLANG_VERSION < 170000 || \ + Z7_CLANG_VERSION > 170001) #define USE_HW_SHA #endif - #elif defined(__GNUC__) - #if (__GNUC__ >= 6) // fix that check - #define USE_HW_SHA #endif - #elif defined(_MSC_VER) - #if _MSC_VER >= 1910 - #define USE_HW_SHA #endif #endif @@ -232,63 +208,144 @@ // #pragma message("=== Sha256 HW === ") + #if defined(__clang__) || defined(__GNUC__) +#if !defined(__ARM_FEATURE_SHA2) && \ + !defined(__ARM_FEATURE_CRYPTO) #ifdef MY_CPU_ARM64 +#if defined(__clang__) + #define ATTRIB_SHA __attribute__((__target__("crypto"))) +#else #define ATTRIB_SHA __attribute__((__target__("+crypto"))) +#endif #else +#if defined(__clang__) && (__clang_major__ >= 1) + #define ATTRIB_SHA __attribute__((__target__("armv8-a,sha2"))) +#else #define ATTRIB_SHA __attribute__((__target__("fpu=crypto-neon-fp-armv8"))) +#endif #endif +#endif #else // _MSC_VER // for arm32 #define _ARM_USE_NEW_NEON_INTRINSICS #endif -#if defined(_MSC_VER) && defined(MY_CPU_ARM64) +#if defined(Z7_MSC_VER_ORIGINAL) && defined(MY_CPU_ARM64) #include <arm64_neon.h> #else -#include <arm_neon.h> + +#if defined(__clang__) && __clang_major__ < 16 +#if !defined(__ARM_FEATURE_SHA2) && \ + !defined(__ARM_FEATURE_CRYPTO) +// #pragma message("=== we set __ARM_FEATURE_CRYPTO 1 === ") + Z7_DIAGNOSTIC_IGNORE_BEGIN_RESERVED_MACRO_IDENTIFIER + #define Z7_ARM_FEATURE_CRYPTO_WAS_SET 1 +// #if defined(__clang__) && __clang_major__ < 13 + #define __ARM_FEATURE_CRYPTO 1 +// #else + #define __ARM_FEATURE_SHA2 1 +// #endif + Z7_DIAGNOSTIC_IGNORE_END_RESERVED_MACRO_IDENTIFIER #endif +#endif // clang + +#if defined(__clang__) + +#if defined(__ARM_ARCH) && __ARM_ARCH < 8 + Z7_DIAGNOSTIC_IGNORE_BEGIN_RESERVED_MACRO_IDENTIFIER +// #pragma message("#define __ARM_ARCH 8") + #undef __ARM_ARCH + #define __ARM_ARCH 8 + Z7_DIAGNOSTIC_IGNORE_END_RESERVED_MACRO_IDENTIFIER +#endif + +#endif // clang + +#include <arm_neon.h> + +#if defined(Z7_ARM_FEATURE_CRYPTO_WAS_SET) && \ + defined(__ARM_FEATURE_CRYPTO) && \ + defined(__ARM_FEATURE_SHA2) +Z7_DIAGNOSTIC_IGNORE_BEGIN_RESERVED_MACRO_IDENTIFIER + #undef __ARM_FEATURE_CRYPTO + #undef __ARM_FEATURE_SHA2 + #undef Z7_ARM_FEATURE_CRYPTO_WAS_SET +Z7_DIAGNOSTIC_IGNORE_END_RESERVED_MACRO_IDENTIFIER +// #pragma message("=== we undefine __ARM_FEATURE_CRYPTO === ") +#endif + +#endif // Z7_MSC_VER_ORIGINAL typedef uint32x4_t v128; // typedef __n128 v128; // MSVC #ifdef MY_CPU_BE - #define MY_rev32_for_LE(x) + #define MY_rev32_for_LE(x) x #else - #define MY_rev32_for_LE(x) x = vreinterpretq_u32_u8(vrev32q_u8(vreinterpretq_u8_u32(x))) + #define MY_rev32_for_LE(x) vrev32q_u8(x) #endif -#define LOAD_128(_p) (*(const v128 *)(const void *)(_p)) -#define STORE_128(_p, _v) *(v128 *)(void *)(_p) = (_v) +#if 1 // 0 for debug +// for arm32: it works slower by some reason than direct code +/* +for arm32 it generates: +MSVC-2022, GCC-9: + vld1.32 {d18,d19}, [r10] + vst1.32 {d4,d5}, [r3] + vld1.8 {d20-d21}, [r4] +there is no align hint (like [r10:128]). So instruction allows unaligned access +*/ +#define LOAD_128_32(_p) vld1q_u32(_p) +#define LOAD_128_8(_p) vld1q_u8 (_p) +#define STORE_128_32(_p, _v) vst1q_u32(_p, _v) +#else +/* +for arm32: +MSVC-2022: + vldm r10,{d18,d19} + vstm r3,{d4,d5} + does it require strict alignment? +GCC-9: + vld1.64 {d30-d31}, [r0:64] + vldr d28, [r0, #16] + vldr d29, [r0, #24] + vst1.64 {d30-d31}, [r0:64] + vstr d28, [r0, #16] + vstr d29, [r0, #24] +there is hint [r0:64], so does it requires 64-bit alignment. +*/ +#define LOAD_128_32(_p) (*(const v128 *)(const void *)(_p)) +#define LOAD_128_8(_p) vreinterpretq_u8_u32(*(const v128 *)(const void *)(_p)) +#define STORE_128_32(_p, _v) *(v128 *)(void *)(_p) = (_v) +#endif #define LOAD_SHUFFLE(m, k) \ - m = LOAD_128((data + (k) * 16)); \ - MY_rev32_for_LE(m); \ + m = vreinterpretq_u32_u8( \ + MY_rev32_for_LE( \ + LOAD_128_8(data + (k) * 16))); \ // K array must be aligned for 16-bytes at least. extern MY_ALIGN(64) const UInt32 SHA256_K_ARRAY[64]; - #define K SHA256_K_ARRAY - #define SHA256_SU0(dest, src) dest = vsha256su0q_u32(dest, src); -#define SHA25G_SU1(dest, src2, src3) dest = vsha256su1q_u32(dest, src2, src3); +#define SHA256_SU1(dest, src2, src3) dest = vsha256su1q_u32(dest, src2, src3); -#define SM1(g0, g1, g2, g3) SHA256_SU0(g3, g0) -#define SM2(g0, g1, g2, g3) SHA25G_SU1(g2, g0, g1) -#define NNN(g0, g1, g2, g3) +#define SM1(m0, m1, m2, m3) SHA256_SU0(m3, m0) +#define SM2(m0, m1, m2, m3) SHA256_SU1(m2, m0, m1) +#define NNN(m0, m1, m2, m3) - -#define R4(k, g0, g1, g2, g3, OP0, OP1) \ - msg = vaddq_u32(g0, *(const v128 *) (const void *) &K[(k) * 4]); \ +#define R4(k, m0, m1, m2, m3, OP0, OP1) \ + msg = vaddq_u32(m0, *(const v128 *) (const void *) &K[(k) * 4]); \ tmp = state0; \ state0 = vsha256hq_u32( state0, state1, msg ); \ state1 = vsha256h2q_u32( state1, tmp, msg ); \ - OP0(g0, g1, g2, g3); \ - OP1(g0, g1, g2, g3); \ + OP0(m0, m1, m2, m3); \ + OP1(m0, m1, m2, m3); \ #define R16(k, OP0, OP1, OP2, OP3, OP4, OP5, OP6, OP7) \ @@ -298,19 +355,19 @@ R4 ( (k)*4+3, m3, m0, m1, m2, OP6, OP7 ) \ -void MY_FAST_CALL Sha256_UpdateBlocks_HW(UInt32 state[8], const Byte *data, size_t numBlocks); +void Z7_FASTCALL Sha256_UpdateBlocks_HW(UInt32 state[8], const Byte *data, size_t numBlocks); #ifdef ATTRIB_SHA ATTRIB_SHA #endif -void MY_FAST_CALL Sha256_UpdateBlocks_HW(UInt32 state[8], const Byte *data, size_t numBlocks) +void Z7_FASTCALL Sha256_UpdateBlocks_HW(UInt32 state[8], const Byte *data, size_t numBlocks) { v128 state0, state1; if (numBlocks == 0) return; - state0 = LOAD_128(&state[0]); - state1 = LOAD_128(&state[4]); + state0 = LOAD_128_32(&state[0]); + state1 = LOAD_128_32(&state[4]); do { @@ -326,10 +383,10 @@ LOAD_SHUFFLE (m2, 2) LOAD_SHUFFLE (m3, 3) - R16 ( 0, NNN, NNN, SM1, NNN, SM1, SM2, SM1, SM2 ); - R16 ( 1, SM1, SM2, SM1, SM2, SM1, SM2, SM1, SM2 ); - R16 ( 2, SM1, SM2, SM1, SM2, SM1, SM2, SM1, SM2 ); - R16 ( 3, SM1, SM2, NNN, SM2, NNN, NNN, NNN, NNN ); + R16 ( 0, NNN, NNN, SM1, NNN, SM1, SM2, SM1, SM2 ) + R16 ( 1, SM1, SM2, SM1, SM2, SM1, SM2, SM1, SM2 ) + R16 ( 2, SM1, SM2, SM1, SM2, SM1, SM2, SM1, SM2 ) + R16 ( 3, SM1, SM2, NNN, SM2, NNN, NNN, NNN, NNN ) state0 = vaddq_u32(state0, state0_save); state1 = vaddq_u32(state1, state1_save); @@ -338,8 +395,8 @@ } while (--numBlocks); - STORE_128(&state[0], state0); - STORE_128(&state[4], state1); + STORE_128_32(&state[0], state0); + STORE_128_32(&state[4], state1); } #endif // USE_HW_SHA @@ -347,18 +404,19 @@ #endif // MY_CPU_ARM_OR_ARM64 -#ifndef USE_HW_SHA - +#if !defined(USE_HW_SHA) && defined(Z7_USE_HW_SHA_STUB) // #error Stop_Compiling_UNSUPPORTED_SHA // #include <stdlib.h> - +// We can compile this file with another C compiler, +// or we can compile asm version. +// So we can generate real code instead of this stub function. // #include "Sha256.h" -void MY_FAST_CALL Sha256_UpdateBlocks(UInt32 state[8], const Byte *data, size_t numBlocks); - +// #if defined(_MSC_VER) #pragma message("Sha256 HW-SW stub was used") - -void MY_FAST_CALL Sha256_UpdateBlocks_HW(UInt32 state[8], const Byte *data, size_t numBlocks); -void MY_FAST_CALL Sha256_UpdateBlocks_HW(UInt32 state[8], const Byte *data, size_t numBlocks) +// #endif +void Z7_FASTCALL Sha256_UpdateBlocks (UInt32 state[8], const Byte *data, size_t numBlocks); +void Z7_FASTCALL Sha256_UpdateBlocks_HW(UInt32 state[8], const Byte *data, size_t numBlocks); +void Z7_FASTCALL Sha256_UpdateBlocks_HW(UInt32 state[8], const Byte *data, size_t numBlocks) { Sha256_UpdateBlocks(state, data, numBlocks); /* @@ -369,5 +427,25 @@ return; */ } - #endif + + +#undef K +#undef RND2 +#undef MY_rev32_for_LE + +#undef NNN +#undef LOAD_128 +#undef STORE_128 +#undef LOAD_SHUFFLE +#undef SM1 +#undef SM2 + + +#undef R4 +#undef R16 +#undef PREPARE_STATE +#undef USE_HW_SHA +#undef ATTRIB_SHA +#undef USE_VER_MIN +#undef Z7_USE_HW_SHA_STUB
diff --git a/third_party/lzma_sdk/C/Util/SfxSetup/BUILD.gn b/third_party/lzma_sdk/C/Util/SfxSetup/BUILD.gn index 1331312..24d91bc 100644 --- a/third_party/lzma_sdk/C/Util/SfxSetup/BUILD.gn +++ b/third_party/lzma_sdk/C/Util/SfxSetup/BUILD.gn
@@ -3,12 +3,8 @@ # found in the LICENSE file. source_set("7zS2_source") { - sources = [ - "Precomp.h", - "SfxSetup.c", - ] + sources = [ "SfxSetup.c" ] defines = [ - "_LZMA_PROB32", "_WIN32", ] include_dirs = [
diff --git a/third_party/lzma_sdk/C/Util/SfxSetup/Precomp.h b/third_party/lzma_sdk/C/Util/SfxSetup/Precomp.h deleted file mode 100644 index 177a205..0000000 --- a/third_party/lzma_sdk/C/Util/SfxSetup/Precomp.h +++ /dev/null
@@ -1,10 +0,0 @@ -/* Precomp.h -- StdAfx -2013-06-16 : Igor Pavlov : Public domain */ - -#ifndef __7Z_PRECOMP_H -#define __7Z_PRECOMP_H - -#include "Compiler.h" -#include "7zTypes.h" - -#endif
diff --git a/third_party/lzma_sdk/C/Util/SfxSetup/SfxSetup.c b/third_party/lzma_sdk/C/Util/SfxSetup/SfxSetup.c index 45efac0..c52e838f 100644 --- a/third_party/lzma_sdk/C/Util/SfxSetup/SfxSetup.c +++ b/third_party/lzma_sdk/C/Util/SfxSetup/SfxSetup.c
@@ -1,5 +1,5 @@ /* SfxSetup.c - 7z SFX Setup -2019-02-02 : Igor Pavlov : Public domain */ +2024-01-24 : Igor Pavlov : Public domain */ #include "Precomp.h" @@ -11,6 +11,7 @@ #define _UNICODE #endif +// SHELLEXECUTEINFO #include <windows.h> #include <shellapi.h> @@ -18,17 +19,23 @@ #include <stdio.h> #endif -#include "7z.h" -#include "7zAlloc.h" -#include "7zCrc.h" -#include "7zFile.h" -#include "CpuArch.h" -#include "DllSecur.h" +#include "../../7z.h" +#include "../../7zAlloc.h" +#include "../../7zCrc.h" +#include "../../7zFile.h" +#include "../../CpuArch.h" +#include "../../DllSecur.h" #define k_EXE_ExtIndex 2 #define kInputBufSize ((size_t)1 << 18) + +#define wcscat lstrcatW +#define wcslen (size_t)lstrlenW +#define wcscpy lstrcpyW +// wcsncpy() and lstrcpynW() work differently. We don't use them. + static const char * const kExts[] = { "bat" @@ -67,7 +74,7 @@ return len; } -#define MAKE_CHAR_UPPER(c) ((((c) >= 'a' && (c) <= 'z') ? (c) -= 0x20 : (c))) +#define MAKE_CHAR_UPPER(c) ((((c) >= 'a' && (c) <= 'z') ? (c) - 0x20 : (c))) static unsigned FindItem(const char * const *items, unsigned num, const wchar_t *s, unsigned len) { @@ -75,13 +82,13 @@ for (i = 0; i < num; i++) { const char *item = items[i]; - unsigned itemLen = (unsigned)strlen(item); + const unsigned itemLen = (unsigned)strlen(item); unsigned j; if (len != itemLen) continue; for (j = 0; j < len; j++) { - unsigned c = (Byte)item[j]; + const unsigned c = (Byte)item[j]; if (c != s[j] && MAKE_CHAR_UPPER(c) != s[j]) break; } @@ -99,10 +106,20 @@ } #endif + +#ifdef _CONSOLE +static void PrintStr(const char *s) +{ + fputs(s, stdout); +} +#endif + static void PrintErrorMessage(const char *message) { #ifdef _CONSOLE - printf("\n7-Zip Error: %s\n", message); + PrintStr("\n7-Zip Error: "); + PrintStr(message); + PrintStr("\n"); #else #ifdef UNDER_CE WCHAR messageW[256 + 4]; @@ -182,7 +199,7 @@ WIN32_FIND_DATAW fd; HANDLE handle; WRes res = 0; - size_t len = wcslen(path); + const size_t len = wcslen(path); wcscpy(path + len, L"*"); handle = FindFirstFileW(path, &fd); path[len] = L'\0'; @@ -231,7 +248,7 @@ } #ifdef _CONSOLE -int MY_CDECL main() +int Z7_CDECL main(void) #else int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, #ifdef UNDER_CE @@ -265,10 +282,10 @@ #ifdef _CONSOLE SetConsoleCtrlHandler(HandlerRoutine, TRUE); #else - UNUSED_VAR(hInstance); - UNUSED_VAR(hPrevInstance); - UNUSED_VAR(lpCmdLine); - UNUSED_VAR(nCmdShow); + UNUSED_VAR(hInstance) + UNUSED_VAR(hPrevInstance) + UNUSED_VAR(lpCmdLine) + UNUSED_VAR(nCmdShow) #endif CrcGenerateTable(); @@ -293,7 +310,7 @@ BoolInt quoteMode = False; for (;; cmdLineParams++) { - wchar_t c = *cmdLineParams; + const wchar_t c = *cmdLineParams; if (c == L'\"') quoteMode = !quoteMode; else if (c == 0 || (c == L' ' && !quoteMode)) @@ -327,7 +344,7 @@ unsigned k; for (k = 0; k < 8; k++) { - unsigned t = value & 0xF; + const unsigned t = value & 0xF; value >>= 4; s[7 - k] = (wchar_t)((t < 10) ? ('0' + t) : ('A' + (t - 10))); } @@ -389,7 +406,7 @@ { lookStream.bufSize = kInputBufSize; lookStream.realStream = &archiveStream.vt; - LookToRead2_Init(&lookStream); + LookToRead2_INIT(&lookStream) } } @@ -458,11 +475,11 @@ unsigned extLen; const WCHAR *name = temp + nameStartPos; unsigned len = (unsigned)wcslen(name); - unsigned nameLen = FindExt(temp + nameStartPos, &extLen); - unsigned extPrice = FindItem(kExts, sizeof(kExts) / sizeof(kExts[0]), name + len - extLen, extLen); - unsigned namePrice = FindItem(kNames, sizeof(kNames) / sizeof(kNames[0]), name, nameLen); + const unsigned nameLen = FindExt(temp + nameStartPos, &extLen); + const unsigned extPrice = FindItem(kExts, sizeof(kExts) / sizeof(kExts[0]), name + len - extLen, extLen); + const unsigned namePrice = FindItem(kNames, sizeof(kNames) / sizeof(kNames[0]), name, nameLen); - unsigned price = namePrice + extPrice * 64 + (nameStartPos == 0 ? 0 : (1 << 12)); + const unsigned price = namePrice + extPrice * 64 + (nameStartPos == 0 ? 0 : (1 << 12)); if (minPrice > price) { minPrice = price; @@ -503,12 +520,13 @@ #endif { - SRes res2 = File_Close(&outFile); + const WRes res2 = File_Close(&outFile); if (res != SZ_OK) break; - if (res2 != SZ_OK) + if (res2 != 0) { - res = res2; + errorMessage = "Can't close output file"; + res = SZ_ERROR_FAIL; break; } } @@ -553,7 +571,7 @@ WCHAR oldCurDir[MAX_PATH + 2]; oldCurDir[0] = 0; { - DWORD needLen = GetCurrentDirectory(MAX_PATH + 1, oldCurDir); + const DWORD needLen = GetCurrentDirectory(MAX_PATH + 1, oldCurDir); if (needLen == 0 || needLen > MAX_PATH) oldCurDir[0] = 0; SetCurrentDirectory(workCurDir);
diff --git a/third_party/lzma_sdk/C/Util/SfxSetup/chromium.patch b/third_party/lzma_sdk/C/Util/SfxSetup/chromium.patch deleted file mode 100644 index 2c178d2..0000000 --- a/third_party/lzma_sdk/C/Util/SfxSetup/chromium.patch +++ /dev/null
@@ -1,53 +0,0 @@ -diff --git a/third_party/lzma_sdk/Util/SfxSetup/Precomp.h b/third_party/lzma_sdk/Util/SfxSetup/Precomp.h -index 588a66f7eb8c..177a205f6979 100644 ---- a/third_party/lzma_sdk/Util/SfxSetup/Precomp.h -+++ b/third_party/lzma_sdk/Util/SfxSetup/Precomp.h -@@ -4,7 +4,7 @@ - #ifndef __7Z_PRECOMP_H - #define __7Z_PRECOMP_H - --#include "../../Compiler.h" --#include "../../7zTypes.h" -+#include "Compiler.h" -+#include "7zTypes.h" - - #endif -diff --git a/third_party/lzma_sdk/Util/SfxSetup/SfxSetup.c b/third_party/lzma_sdk/Util/SfxSetup/SfxSetup.c -index ef19aeac5450..45efac060bd6 100644 ---- a/third_party/lzma_sdk/Util/SfxSetup/SfxSetup.c -+++ b/third_party/lzma_sdk/Util/SfxSetup/SfxSetup.c -@@ -11,16 +11,19 @@ - #define _UNICODE - #endif - -+#include <windows.h> -+#include <shellapi.h> -+ - #ifdef _CONSOLE - #include <stdio.h> - #endif - --#include "../../7z.h" --#include "../../7zAlloc.h" --#include "../../7zCrc.h" --#include "../../7zFile.h" --#include "../../CpuArch.h" --#include "../../DllSecur.h" -+#include "7z.h" -+#include "7zAlloc.h" -+#include "7zCrc.h" -+#include "7zFile.h" -+#include "CpuArch.h" -+#include "DllSecur.h" - - #define k_EXE_ExtIndex 2 - -@@ -125,7 +128,7 @@ static WRes MyCreateDir(const WCHAR *name) - #define kBufferSize (1 << 15) - #endif - --#define kSignatureSearchLimit (1 << 22) -+#define kSignatureSearchLimit (1 << 26) - - static BoolInt FindSignature(CSzFile *stream, UInt64 *resPos) - {
diff --git a/third_party/lzma_sdk/C/Xz.c b/third_party/lzma_sdk/C/Xz.c index 7c53b60..d07550d0 100644 --- a/third_party/lzma_sdk/C/Xz.c +++ b/third_party/lzma_sdk/C/Xz.c
@@ -1,5 +1,5 @@ /* Xz.c - Xz -2021-02-09 : Igor Pavlov : Public domain */ +2024-03-01 : Igor Pavlov : Public domain */ #include "Precomp.h" @@ -52,6 +52,7 @@ case XZ_CHECK_CRC32: p->crc = CRC_INIT_VAL; break; case XZ_CHECK_CRC64: p->crc64 = CRC64_INIT_VAL; break; case XZ_CHECK_SHA256: Sha256_Init(&p->sha); break; + default: break; } } @@ -62,6 +63,7 @@ case XZ_CHECK_CRC32: p->crc = CrcUpdate(p->crc, data, size); break; case XZ_CHECK_CRC64: p->crc64 = Crc64Update(p->crc64, data, size); break; case XZ_CHECK_SHA256: Sha256_Update(&p->sha, (const Byte *)data, size); break; + default: break; } } @@ -70,7 +72,7 @@ switch (p->mode) { case XZ_CHECK_CRC32: - SetUi32(digest, CRC_GET_DIGEST(p->crc)); + SetUi32(digest, CRC_GET_DIGEST(p->crc)) break; case XZ_CHECK_CRC64: {
diff --git a/third_party/lzma_sdk/C/Xz.h b/third_party/lzma_sdk/C/Xz.h index 849b944b..42bc685 100644 --- a/third_party/lzma_sdk/C/Xz.h +++ b/third_party/lzma_sdk/C/Xz.h
@@ -1,21 +1,24 @@ /* Xz.h - Xz interface -2021-04-01 : Igor Pavlov : Public domain */ +2024-01-26 : Igor Pavlov : Public domain */ -#ifndef __XZ_H -#define __XZ_H +#ifndef ZIP7_INC_XZ_H +#define ZIP7_INC_XZ_H #include "Sha256.h" +#include "Delta.h" EXTERN_C_BEGIN #define XZ_ID_Subblock 1 #define XZ_ID_Delta 3 -#define XZ_ID_X86 4 -#define XZ_ID_PPC 5 -#define XZ_ID_IA64 6 -#define XZ_ID_ARM 7 -#define XZ_ID_ARMT 8 +#define XZ_ID_X86 4 +#define XZ_ID_PPC 5 +#define XZ_ID_IA64 6 +#define XZ_ID_ARM 7 +#define XZ_ID_ARMT 8 #define XZ_ID_SPARC 9 +#define XZ_ID_ARM64 0xa +#define XZ_ID_RISCV 0xb #define XZ_ID_LZMA2 0x21 unsigned Xz_ReadVarInt(const Byte *p, size_t maxSize, UInt64 *value); @@ -53,7 +56,7 @@ #define XzBlock_HasUnsupportedFlags(p) (((p)->flags & ~(XZ_BF_NUM_FILTERS_MASK | XZ_BF_PACK_SIZE | XZ_BF_UNPACK_SIZE)) != 0) SRes XzBlock_Parse(CXzBlock *p, const Byte *header); -SRes XzBlock_ReadHeader(CXzBlock *p, ISeqInStream *inStream, BoolInt *isIndex, UInt32 *headerSizeRes); +SRes XzBlock_ReadHeader(CXzBlock *p, ISeqInStreamPtr inStream, BoolInt *isIndex, UInt32 *headerSizeRes); /* ---------- xz stream ---------- */ @@ -101,7 +104,7 @@ unsigned XzFlags_GetCheckSize(CXzStreamFlags f); SRes Xz_ParseHeader(CXzStreamFlags *p, const Byte *buf); -SRes Xz_ReadHeader(CXzStreamFlags *p, ISeqInStream *inStream); +SRes Xz_ReadHeader(CXzStreamFlags *p, ISeqInStreamPtr inStream); typedef struct { @@ -112,6 +115,7 @@ typedef struct { CXzStreamFlags flags; + // Byte _pad[6]; size_t numBlocks; CXzBlockSizes *blocks; UInt64 startOffset; @@ -134,7 +138,7 @@ void Xzs_Construct(CXzs *p); void Xzs_Free(CXzs *p, ISzAllocPtr alloc); -SRes Xzs_ReadBackward(CXzs *p, ILookInStream *inStream, Int64 *startOffset, ICompressProgress *progress, ISzAllocPtr alloc); +SRes Xzs_ReadBackward(CXzs *p, ILookInStreamPtr inStream, Int64 *startOffset, ICompressProgressPtr progress, ISzAllocPtr alloc); UInt64 Xzs_GetNumBlocks(const CXzs *p); UInt64 Xzs_GetUnpackSize(const CXzs *p); @@ -160,9 +164,9 @@ } ECoderFinishMode; -typedef struct _IStateCoder +typedef struct { - void *p; + void *p; // state object; void (*Free)(void *p, ISzAllocPtr alloc); SRes (*SetProps)(void *p, const Byte *props, size_t propSize, ISzAllocPtr alloc); void (*Init)(void *p); @@ -174,6 +178,20 @@ } IStateCoder; +typedef struct +{ + UInt32 methodId; + UInt32 delta; + UInt32 ip; + UInt32 X86_State; + Byte delta_State[DELTA_STATE_SIZE]; +} CXzBcFilterStateBase; + +typedef SizeT (*Xz_Func_BcFilterStateBase_Filter)(CXzBcFilterStateBase *p, Byte *data, SizeT size); + +SRes Xz_StateCoder_Bc_SetFromMethod_Func(IStateCoder *p, UInt64 id, + Xz_Func_BcFilterStateBase_Filter func, ISzAllocPtr alloc); + #define MIXCODER_NUM_FILTERS_MAX 4 @@ -216,13 +234,13 @@ typedef struct { EXzState state; - UInt32 pos; + unsigned pos; unsigned alignPos; unsigned indexPreSize; CXzStreamFlags streamFlags; - UInt32 blockHeaderSize; + unsigned blockHeaderSize; UInt64 packSize; UInt64 unpackSize; @@ -422,7 +440,7 @@ size_t outStep_ST; // size of output buffer for Single-Thread decoding BoolInt ignoreErrors; // if set to 1, the decoder can ignore some errors and it skips broken parts of data. - #ifndef _7ZIP_ST + #ifndef Z7_ST unsigned numThreads; // the number of threads for Multi-Thread decoding. if (umThreads == 1) it will use Single-thread decoding size_t inBufSize_MT; // size of small input data buffers for Multi-Thread decoding. Big number of such small buffers can be created size_t memUseMax; // the limit of total memory usage for Multi-Thread decoding. @@ -432,8 +450,9 @@ void XzDecMtProps_Init(CXzDecMtProps *p); - -typedef void * CXzDecMtHandle; +typedef struct CXzDecMt CXzDecMt; +typedef CXzDecMt * CXzDecMtHandle; +// Z7_DECLARE_HANDLE(CXzDecMtHandle) /* alloc : XzDecMt uses CAlignOffsetAlloc internally for addresses allocated by (alloc). @@ -503,14 +522,14 @@ const CXzDecMtProps *props, const UInt64 *outDataSize, // NULL means undefined int finishMode, // 0 - partial unpacking is allowed, 1 - xz stream(s) must be finished - ISeqOutStream *outStream, + ISeqOutStreamPtr outStream, // Byte *outBuf, size_t *outBufSize, - ISeqInStream *inStream, + ISeqInStreamPtr inStream, // const Byte *inData, size_t inDataSize, CXzStatInfo *stat, // out: decoding results and statistics int *isMT, // out: 0 means that ST (Single-Thread) version was used // 1 means that MT (Multi-Thread) version was used - ICompressProgress *progress); + ICompressProgressPtr progress); EXTERN_C_END
diff --git a/third_party/lzma_sdk/C/XzCrc64.c b/third_party/lzma_sdk/C/XzCrc64.c index b6d02cb..94fc1af 100644 --- a/third_party/lzma_sdk/C/XzCrc64.c +++ b/third_party/lzma_sdk/C/XzCrc64.c
@@ -1,5 +1,5 @@ /* XzCrc64.c -- CRC64 calculation -2017-05-23 : Igor Pavlov : Public domain */ +2023-12-08 : Igor Pavlov : Public domain */ #include "Precomp.h" @@ -8,45 +8,76 @@ #define kCrc64Poly UINT64_CONST(0xC96C5795D7870F42) -#ifdef MY_CPU_LE - #define CRC64_NUM_TABLES 4 -#else - #define CRC64_NUM_TABLES 5 - #define CRC_UINT64_SWAP(v) \ - ((v >> 56) \ - | ((v >> 40) & ((UInt64)0xFF << 8)) \ - | ((v >> 24) & ((UInt64)0xFF << 16)) \ - | ((v >> 8) & ((UInt64)0xFF << 24)) \ - | ((v << 8) & ((UInt64)0xFF << 32)) \ - | ((v << 24) & ((UInt64)0xFF << 40)) \ - | ((v << 40) & ((UInt64)0xFF << 48)) \ - | ((v << 56))) - - UInt64 MY_FAST_CALL XzCrc64UpdateT1_BeT4(UInt64 v, const void *data, size_t size, const UInt64 *table); +// for debug only : define Z7_CRC64_DEBUG_BE to test big-endian code in little-endian cpu +// #define Z7_CRC64_DEBUG_BE +#ifdef Z7_CRC64_DEBUG_BE +#undef MY_CPU_LE +#define MY_CPU_BE #endif +#ifdef Z7_CRC64_NUM_TABLES + #define Z7_CRC64_NUM_TABLES_USE Z7_CRC64_NUM_TABLES +#else + #define Z7_CRC64_NUM_TABLES_USE 12 +#endif + +#if Z7_CRC64_NUM_TABLES_USE < 1 + #error Stop_Compiling_Bad_Z7_CRC_NUM_TABLES +#endif + + +#if Z7_CRC64_NUM_TABLES_USE != 1 + #ifndef MY_CPU_BE - UInt64 MY_FAST_CALL XzCrc64UpdateT4(UInt64 v, const void *data, size_t size, const UInt64 *table); + #define FUNC_NAME_LE_2(s) XzCrc64UpdateT ## s + #define FUNC_NAME_LE_1(s) FUNC_NAME_LE_2(s) + #define FUNC_NAME_LE FUNC_NAME_LE_1(Z7_CRC64_NUM_TABLES_USE) + UInt64 Z7_FASTCALL FUNC_NAME_LE (UInt64 v, const void *data, size_t size, const UInt64 *table); +#endif +#ifndef MY_CPU_LE + #define FUNC_NAME_BE_2(s) XzCrc64UpdateBeT ## s + #define FUNC_NAME_BE_1(s) FUNC_NAME_BE_2(s) + #define FUNC_NAME_BE FUNC_NAME_BE_1(Z7_CRC64_NUM_TABLES_USE) + UInt64 Z7_FASTCALL FUNC_NAME_BE (UInt64 v, const void *data, size_t size, const UInt64 *table); #endif -typedef UInt64 (MY_FAST_CALL *CRC64_FUNC)(UInt64 v, const void *data, size_t size, const UInt64 *table); +#if defined(MY_CPU_LE) + #define FUNC_REF FUNC_NAME_LE +#elif defined(MY_CPU_BE) + #define FUNC_REF FUNC_NAME_BE +#else + #define FUNC_REF g_Crc64Update + static UInt64 (Z7_FASTCALL *FUNC_REF)(UInt64 v, const void *data, size_t size, const UInt64 *table); +#endif -static CRC64_FUNC g_Crc64Update; -UInt64 g_Crc64Table[256 * CRC64_NUM_TABLES]; +#endif -UInt64 MY_FAST_CALL Crc64Update(UInt64 v, const void *data, size_t size) + +MY_ALIGN(64) +static UInt64 g_Crc64Table[256 * Z7_CRC64_NUM_TABLES_USE]; + + +UInt64 Z7_FASTCALL Crc64Update(UInt64 v, const void *data, size_t size) { - return g_Crc64Update(v, data, size, g_Crc64Table); +#if Z7_CRC64_NUM_TABLES_USE == 1 + #define CRC64_UPDATE_BYTE_2(crc, b) (table[((crc) ^ (b)) & 0xFF] ^ ((crc) >> 8)) + const UInt64 *table = g_Crc64Table; + const Byte *p = (const Byte *)data; + const Byte *lim = p + size; + for (; p != lim; p++) + v = CRC64_UPDATE_BYTE_2(v, *p); + return v; + #undef CRC64_UPDATE_BYTE_2 +#else + return FUNC_REF (v, data, size, g_Crc64Table); +#endif } -UInt64 MY_FAST_CALL Crc64Calc(const void *data, size_t size) -{ - return g_Crc64Update(CRC64_INIT_VAL, data, size, g_Crc64Table) ^ CRC64_INIT_VAL; -} -void MY_FAST_CALL Crc64GenerateTable() +Z7_NO_INLINE +void Z7_FASTCALL Crc64GenerateTable(void) { - UInt32 i; + unsigned i; for (i = 0; i < 256; i++) { UInt64 r = i; @@ -55,32 +86,55 @@ r = (r >> 1) ^ (kCrc64Poly & ((UInt64)0 - (r & 1))); g_Crc64Table[i] = r; } - for (i = 256; i < 256 * CRC64_NUM_TABLES; i++) + +#if Z7_CRC64_NUM_TABLES_USE != 1 +#if 1 || 1 && defined(MY_CPU_X86) // low register count + for (i = 0; i < 256 * (Z7_CRC64_NUM_TABLES_USE - 1); i++) { - UInt64 r = g_Crc64Table[(size_t)i - 256]; - g_Crc64Table[i] = g_Crc64Table[r & 0xFF] ^ (r >> 8); + const UInt64 r0 = g_Crc64Table[(size_t)i]; + g_Crc64Table[(size_t)i + 256] = g_Crc64Table[(Byte)r0] ^ (r0 >> 8); } - - #ifdef MY_CPU_LE - - g_Crc64Update = XzCrc64UpdateT4; - - #else +#else + for (i = 0; i < 256 * (Z7_CRC64_NUM_TABLES_USE - 1); i += 2) { - #ifndef MY_CPU_BE + UInt64 r0 = g_Crc64Table[(size_t)(i) ]; + UInt64 r1 = g_Crc64Table[(size_t)(i) + 1]; + r0 = g_Crc64Table[(Byte)r0] ^ (r0 >> 8); + r1 = g_Crc64Table[(Byte)r1] ^ (r1 >> 8); + g_Crc64Table[(size_t)i + 256 ] = r0; + g_Crc64Table[(size_t)i + 256 + 1] = r1; + } +#endif + +#ifndef MY_CPU_LE + { +#ifndef MY_CPU_BE UInt32 k = 1; if (*(const Byte *)&k == 1) - g_Crc64Update = XzCrc64UpdateT4; + FUNC_REF = FUNC_NAME_LE; else - #endif +#endif { - for (i = 256 * CRC64_NUM_TABLES - 1; i >= 256; i--) +#ifndef MY_CPU_BE + FUNC_REF = FUNC_NAME_BE; +#endif + for (i = 0; i < 256 * Z7_CRC64_NUM_TABLES_USE; i++) { - UInt64 x = g_Crc64Table[(size_t)i - 256]; - g_Crc64Table[i] = CRC_UINT64_SWAP(x); + const UInt64 x = g_Crc64Table[i]; + g_Crc64Table[i] = Z7_BSWAP64(x); } - g_Crc64Update = XzCrc64UpdateT1_BeT4; } } - #endif +#endif // ndef MY_CPU_LE +#endif // Z7_CRC64_NUM_TABLES_USE != 1 } + +#undef kCrc64Poly +#undef Z7_CRC64_NUM_TABLES_USE +#undef FUNC_REF +#undef FUNC_NAME_LE_2 +#undef FUNC_NAME_LE_1 +#undef FUNC_NAME_LE +#undef FUNC_NAME_BE_2 +#undef FUNC_NAME_BE_1 +#undef FUNC_NAME_BE
diff --git a/third_party/lzma_sdk/C/XzCrc64.h b/third_party/lzma_sdk/C/XzCrc64.h index 08dbc33..04f8153 100644 --- a/third_party/lzma_sdk/C/XzCrc64.h +++ b/third_party/lzma_sdk/C/XzCrc64.h
@@ -1,8 +1,8 @@ /* XzCrc64.h -- CRC64 calculation -2013-01-18 : Igor Pavlov : Public domain */ +2023-12-08 : Igor Pavlov : Public domain */ -#ifndef __XZ_CRC64_H -#define __XZ_CRC64_H +#ifndef ZIP7_INC_XZ_CRC64_H +#define ZIP7_INC_XZ_CRC64_H #include <stddef.h> @@ -10,16 +10,16 @@ EXTERN_C_BEGIN -extern UInt64 g_Crc64Table[]; +// extern UInt64 g_Crc64Table[]; -void MY_FAST_CALL Crc64GenerateTable(void); +void Z7_FASTCALL Crc64GenerateTable(void); #define CRC64_INIT_VAL UINT64_CONST(0xFFFFFFFFFFFFFFFF) #define CRC64_GET_DIGEST(crc) ((crc) ^ CRC64_INIT_VAL) -#define CRC64_UPDATE_BYTE(crc, b) (g_Crc64Table[((crc) ^ (b)) & 0xFF] ^ ((crc) >> 8)) +// #define CRC64_UPDATE_BYTE(crc, b) (g_Crc64Table[((crc) ^ (b)) & 0xFF] ^ ((crc) >> 8)) -UInt64 MY_FAST_CALL Crc64Update(UInt64 crc, const void *data, size_t size); -UInt64 MY_FAST_CALL Crc64Calc(const void *data, size_t size); +UInt64 Z7_FASTCALL Crc64Update(UInt64 crc, const void *data, size_t size); +// UInt64 Z7_FASTCALL Crc64Calc(const void *data, size_t size); EXTERN_C_END
diff --git a/third_party/lzma_sdk/C/XzCrc64Opt.c b/third_party/lzma_sdk/C/XzCrc64Opt.c index 93a9fff..0c1fc2f 100644 --- a/third_party/lzma_sdk/C/XzCrc64Opt.c +++ b/third_party/lzma_sdk/C/XzCrc64Opt.c
@@ -1,71 +1,261 @@ -/* XzCrc64Opt.c -- CRC64 calculation -2021-02-09 : Igor Pavlov : Public domain */ +/* XzCrc64Opt.c -- CRC64 calculation (optimized functions) +2023-12-08 : Igor Pavlov : Public domain */ #include "Precomp.h" #include "CpuArch.h" +#if !defined(Z7_CRC64_NUM_TABLES) || Z7_CRC64_NUM_TABLES > 1 + +// for debug only : define Z7_CRC64_DEBUG_BE to test big-endian code in little-endian cpu +// #define Z7_CRC64_DEBUG_BE +#ifdef Z7_CRC64_DEBUG_BE +#undef MY_CPU_LE +#define MY_CPU_BE +#endif + +#if defined(MY_CPU_64BIT) +#define Z7_CRC64_USE_64BIT +#endif + +// the value Z7_CRC64_NUM_TABLES_USE must be defined to same value as in XzCrc64.c +#ifdef Z7_CRC64_NUM_TABLES +#define Z7_CRC64_NUM_TABLES_USE Z7_CRC64_NUM_TABLES +#else +#define Z7_CRC64_NUM_TABLES_USE 12 +#endif + +#if Z7_CRC64_NUM_TABLES_USE % 4 || \ + Z7_CRC64_NUM_TABLES_USE < 4 || \ + Z7_CRC64_NUM_TABLES_USE > 4 * 4 + #error Stop_Compiling_Bad_CRC64_NUM_TABLES +#endif + + #ifndef MY_CPU_BE -#define CRC64_UPDATE_BYTE_2(crc, b) (table[((crc) ^ (b)) & 0xFF] ^ ((crc) >> 8)) +#define CRC64_UPDATE_BYTE_2(crc, b) (table[((crc) ^ (b)) & 0xFF] ^ ((crc) >> 8)) -UInt64 MY_FAST_CALL XzCrc64UpdateT4(UInt64 v, const void *data, size_t size, const UInt64 *table); -UInt64 MY_FAST_CALL XzCrc64UpdateT4(UInt64 v, const void *data, size_t size, const UInt64 *table) -{ - const Byte *p = (const Byte *)data; - for (; size > 0 && ((unsigned)(ptrdiff_t)p & 3) != 0; size--, p++) - v = CRC64_UPDATE_BYTE_2(v, *p); - for (; size >= 4; size -= 4, p += 4) - { - UInt32 d = (UInt32)v ^ *(const UInt32 *)(const void *)p; - v = (v >> 32) - ^ (table + 0x300)[((d ) & 0xFF)] - ^ (table + 0x200)[((d >> 8) & 0xFF)] - ^ (table + 0x100)[((d >> 16) & 0xFF)] - ^ (table + 0x000)[((d >> 24))]; - } - for (; size > 0; size--, p++) - v = CRC64_UPDATE_BYTE_2(v, *p); - return v; -} +#if defined(Z7_CRC64_USE_64BIT) && (Z7_CRC64_NUM_TABLES_USE % 8 == 0) + +#define Q64LE(n, d) \ + ( (table + ((n) * 8 + 7) * 0x100)[((d) ) & 0xFF] \ + ^ (table + ((n) * 8 + 6) * 0x100)[((d) >> 1 * 8) & 0xFF] \ + ^ (table + ((n) * 8 + 5) * 0x100)[((d) >> 2 * 8) & 0xFF] \ + ^ (table + ((n) * 8 + 4) * 0x100)[((d) >> 3 * 8) & 0xFF] \ + ^ (table + ((n) * 8 + 3) * 0x100)[((d) >> 4 * 8) & 0xFF] \ + ^ (table + ((n) * 8 + 2) * 0x100)[((d) >> 5 * 8) & 0xFF] \ + ^ (table + ((n) * 8 + 1) * 0x100)[((d) >> 6 * 8) & 0xFF] \ + ^ (table + ((n) * 8 + 0) * 0x100)[((d) >> 7 * 8)] ) + +#define R64(a) *((const UInt64 *)(const void *)p + (a)) + +#else + +#define Q32LE(n, d) \ + ( (table + ((n) * 4 + 3) * 0x100)[((d) ) & 0xFF] \ + ^ (table + ((n) * 4 + 2) * 0x100)[((d) >> 1 * 8) & 0xFF] \ + ^ (table + ((n) * 4 + 1) * 0x100)[((d) >> 2 * 8) & 0xFF] \ + ^ (table + ((n) * 4 + 0) * 0x100)[((d) >> 3 * 8)] ) + +#define R32(a) *((const UInt32 *)(const void *)p + (a)) #endif -#ifndef MY_CPU_LE +#define CRC64_FUNC_PRE_LE2(step) \ +UInt64 Z7_FASTCALL XzCrc64UpdateT ## step (UInt64 v, const void *data, size_t size, const UInt64 *table) -#define CRC_UINT64_SWAP(v) \ - ((v >> 56) \ - | ((v >> 40) & ((UInt64)0xFF << 8)) \ - | ((v >> 24) & ((UInt64)0xFF << 16)) \ - | ((v >> 8) & ((UInt64)0xFF << 24)) \ - | ((v << 8) & ((UInt64)0xFF << 32)) \ - | ((v << 24) & ((UInt64)0xFF << 40)) \ - | ((v << 40) & ((UInt64)0xFF << 48)) \ - | ((v << 56))) +#define CRC64_FUNC_PRE_LE(step) \ + CRC64_FUNC_PRE_LE2(step); \ + CRC64_FUNC_PRE_LE2(step) -#define CRC64_UPDATE_BYTE_2_BE(crc, b) (table[(Byte)((crc) >> 56) ^ (b)] ^ ((crc) << 8)) - -UInt64 MY_FAST_CALL XzCrc64UpdateT1_BeT4(UInt64 v, const void *data, size_t size, const UInt64 *table); -UInt64 MY_FAST_CALL XzCrc64UpdateT1_BeT4(UInt64 v, const void *data, size_t size, const UInt64 *table) +CRC64_FUNC_PRE_LE(Z7_CRC64_NUM_TABLES_USE) { const Byte *p = (const Byte *)data; - table += 0x100; - v = CRC_UINT64_SWAP(v); - for (; size > 0 && ((unsigned)(ptrdiff_t)p & 3) != 0; size--, p++) - v = CRC64_UPDATE_BYTE_2_BE(v, *p); - for (; size >= 4; size -= 4, p += 4) + const Byte *lim; + for (; size && ((unsigned)(ptrdiff_t)p & (7 - (Z7_CRC64_NUM_TABLES_USE & 4))) != 0; size--, p++) + v = CRC64_UPDATE_BYTE_2(v, *p); + lim = p + size; + if (size >= Z7_CRC64_NUM_TABLES_USE) { - UInt32 d = (UInt32)(v >> 32) ^ *(const UInt32 *)(const void *)p; - v = (v << 32) - ^ (table + 0x000)[((d ) & 0xFF)] - ^ (table + 0x100)[((d >> 8) & 0xFF)] - ^ (table + 0x200)[((d >> 16) & 0xFF)] - ^ (table + 0x300)[((d >> 24))]; + lim -= Z7_CRC64_NUM_TABLES_USE; + do + { +#if Z7_CRC64_NUM_TABLES_USE == 4 + const UInt32 d = (UInt32)v ^ R32(0); + v = (v >> 32) ^ Q32LE(0, d); +#elif Z7_CRC64_NUM_TABLES_USE == 8 +#ifdef Z7_CRC64_USE_64BIT + v ^= R64(0); + v = Q64LE(0, v); +#else + UInt32 v0, v1; + v0 = (UInt32)v ^ R32(0); + v1 = (UInt32)(v >> 32) ^ R32(1); + v = Q32LE(1, v0) ^ Q32LE(0, v1); +#endif +#elif Z7_CRC64_NUM_TABLES_USE == 12 + UInt32 w; + UInt32 v0, v1; + v0 = (UInt32)v ^ R32(0); + v1 = (UInt32)(v >> 32) ^ R32(1); + w = R32(2); + v = Q32LE(0, w); + v ^= Q32LE(2, v0) ^ Q32LE(1, v1); +#elif Z7_CRC64_NUM_TABLES_USE == 16 +#ifdef Z7_CRC64_USE_64BIT + UInt64 w; + UInt64 x; + w = R64(1); x = Q64LE(0, w); + v ^= R64(0); v = x ^ Q64LE(1, v); +#else + UInt32 v0, v1; + UInt32 r0, r1; + v0 = (UInt32)v ^ R32(0); + v1 = (UInt32)(v >> 32) ^ R32(1); + r0 = R32(2); + r1 = R32(3); + v = Q32LE(1, r0) ^ Q32LE(0, r1); + v ^= Q32LE(3, v0) ^ Q32LE(2, v1); +#endif +#else +#error Stop_Compiling_Bad_CRC64_NUM_TABLES +#endif + p += Z7_CRC64_NUM_TABLES_USE; + } + while (p <= lim); + lim += Z7_CRC64_NUM_TABLES_USE; } - for (; size > 0; size--, p++) - v = CRC64_UPDATE_BYTE_2_BE(v, *p); - return CRC_UINT64_SWAP(v); + for (; p < lim; p++) + v = CRC64_UPDATE_BYTE_2(v, *p); + return v; } +#undef CRC64_UPDATE_BYTE_2 +#undef R32 +#undef R64 +#undef Q32LE +#undef Q64LE +#undef CRC64_FUNC_PRE_LE +#undef CRC64_FUNC_PRE_LE2 + +#endif + + + + +#ifndef MY_CPU_LE + +#define CRC64_UPDATE_BYTE_2_BE(crc, b) (table[((crc) >> 56) ^ (b)] ^ ((crc) << 8)) + +#if defined(Z7_CRC64_USE_64BIT) && (Z7_CRC64_NUM_TABLES_USE % 8 == 0) + +#define Q64BE(n, d) \ + ( (table + ((n) * 8 + 0) * 0x100)[(Byte)(d)] \ + ^ (table + ((n) * 8 + 1) * 0x100)[((d) >> 1 * 8) & 0xFF] \ + ^ (table + ((n) * 8 + 2) * 0x100)[((d) >> 2 * 8) & 0xFF] \ + ^ (table + ((n) * 8 + 3) * 0x100)[((d) >> 3 * 8) & 0xFF] \ + ^ (table + ((n) * 8 + 4) * 0x100)[((d) >> 4 * 8) & 0xFF] \ + ^ (table + ((n) * 8 + 5) * 0x100)[((d) >> 5 * 8) & 0xFF] \ + ^ (table + ((n) * 8 + 6) * 0x100)[((d) >> 6 * 8) & 0xFF] \ + ^ (table + ((n) * 8 + 7) * 0x100)[((d) >> 7 * 8)] ) + +#ifdef Z7_CRC64_DEBUG_BE + #define R64BE(a) GetBe64a((const UInt64 *)(const void *)p + (a)) +#else + #define R64BE(a) *((const UInt64 *)(const void *)p + (a)) +#endif + +#else + +#define Q32BE(n, d) \ + ( (table + ((n) * 4 + 0) * 0x100)[(Byte)(d)] \ + ^ (table + ((n) * 4 + 1) * 0x100)[((d) >> 1 * 8) & 0xFF] \ + ^ (table + ((n) * 4 + 2) * 0x100)[((d) >> 2 * 8) & 0xFF] \ + ^ (table + ((n) * 4 + 3) * 0x100)[((d) >> 3 * 8)] ) + +#ifdef Z7_CRC64_DEBUG_BE + #define R32BE(a) GetBe32a((const UInt32 *)(const void *)p + (a)) +#else + #define R32BE(a) *((const UInt32 *)(const void *)p + (a)) +#endif + +#endif + +#define CRC64_FUNC_PRE_BE2(step) \ +UInt64 Z7_FASTCALL XzCrc64UpdateBeT ## step (UInt64 v, const void *data, size_t size, const UInt64 *table) + +#define CRC64_FUNC_PRE_BE(step) \ + CRC64_FUNC_PRE_BE2(step); \ + CRC64_FUNC_PRE_BE2(step) + +CRC64_FUNC_PRE_BE(Z7_CRC64_NUM_TABLES_USE) +{ + const Byte *p = (const Byte *)data; + const Byte *lim; + v = Z7_BSWAP64(v); + for (; size && ((unsigned)(ptrdiff_t)p & (7 - (Z7_CRC64_NUM_TABLES_USE & 4))) != 0; size--, p++) + v = CRC64_UPDATE_BYTE_2_BE(v, *p); + lim = p + size; + if (size >= Z7_CRC64_NUM_TABLES_USE) + { + lim -= Z7_CRC64_NUM_TABLES_USE; + do + { +#if Z7_CRC64_NUM_TABLES_USE == 4 + const UInt32 d = (UInt32)(v >> 32) ^ R32BE(0); + v = (v << 32) ^ Q32BE(0, d); +#elif Z7_CRC64_NUM_TABLES_USE == 12 + const UInt32 d1 = (UInt32)(v >> 32) ^ R32BE(0); + const UInt32 d0 = (UInt32)(v ) ^ R32BE(1); + const UInt32 w = R32BE(2); + v = Q32BE(0, w); + v ^= Q32BE(2, d1) ^ Q32BE(1, d0); + +#elif Z7_CRC64_NUM_TABLES_USE == 8 + #ifdef Z7_CRC64_USE_64BIT + v ^= R64BE(0); + v = Q64BE(0, v); + #else + const UInt32 d1 = (UInt32)(v >> 32) ^ R32BE(0); + const UInt32 d0 = (UInt32)(v ) ^ R32BE(1); + v = Q32BE(1, d1) ^ Q32BE(0, d0); + #endif +#elif Z7_CRC64_NUM_TABLES_USE == 16 + #ifdef Z7_CRC64_USE_64BIT + const UInt64 w = R64BE(1); + v ^= R64BE(0); + v = Q64BE(0, w) ^ Q64BE(1, v); + #else + const UInt32 d1 = (UInt32)(v >> 32) ^ R32BE(0); + const UInt32 d0 = (UInt32)(v ) ^ R32BE(1); + const UInt32 w1 = R32BE(2); + const UInt32 w0 = R32BE(3); + v = Q32BE(1, w1) ^ Q32BE(0, w0); + v ^= Q32BE(3, d1) ^ Q32BE(2, d0); + #endif +#elif +#error Stop_Compiling_Bad_CRC64_NUM_TABLES +#endif + p += Z7_CRC64_NUM_TABLES_USE; + } + while (p <= lim); + lim += Z7_CRC64_NUM_TABLES_USE; + } + for (; p < lim; p++) + v = CRC64_UPDATE_BYTE_2_BE(v, *p); + return Z7_BSWAP64(v); +} + +#undef CRC64_UPDATE_BYTE_2_BE +#undef R32BE +#undef R64BE +#undef Q32BE +#undef Q64BE +#undef CRC64_FUNC_PRE_BE +#undef CRC64_FUNC_PRE_BE2 + +#endif +#undef Z7_CRC64_NUM_TABLES_USE #endif
diff --git a/third_party/lzma_sdk/C/XzDec.c b/third_party/lzma_sdk/C/XzDec.c index 3f96a37..3d1c98e6 100644 --- a/third_party/lzma_sdk/C/XzDec.c +++ b/third_party/lzma_sdk/C/XzDec.c
@@ -1,5 +1,5 @@ /* XzDec.c -- Xz Decode -2021-09-04 : Igor Pavlov : Public domain */ +2024-03-01 : Igor Pavlov : Public domain */ #include "Precomp.h" @@ -67,7 +67,8 @@ return 0; } -/* ---------- BraState ---------- */ + +/* ---------- XzBcFilterState ---------- */ #define BRA_BUF_SIZE (1 << 14) @@ -76,55 +77,60 @@ size_t bufPos; size_t bufConv; size_t bufTotal; + Byte *buf; // must be aligned for 4 bytes + Xz_Func_BcFilterStateBase_Filter filter_func; + // int encodeMode; + CXzBcFilterStateBase base; + // Byte buf[BRA_BUF_SIZE]; +} CXzBcFilterState; - int encodeMode; - UInt32 methodId; - UInt32 delta; - UInt32 ip; - UInt32 x86State; - Byte deltaState[DELTA_STATE_SIZE]; - - Byte buf[BRA_BUF_SIZE]; -} CBraState; - -static void BraState_Free(void *pp, ISzAllocPtr alloc) +static void XzBcFilterState_Free(void *pp, ISzAllocPtr alloc) { - ISzAlloc_Free(alloc, pp); + if (pp) + { + CXzBcFilterState *p = ((CXzBcFilterState *)pp); + ISzAlloc_Free(alloc, p->buf); + ISzAlloc_Free(alloc, pp); + } } -static SRes BraState_SetProps(void *pp, const Byte *props, size_t propSize, ISzAllocPtr alloc) + +static SRes XzBcFilterState_SetProps(void *pp, const Byte *props, size_t propSize, ISzAllocPtr alloc) { - CBraState *p = ((CBraState *)pp); - UNUSED_VAR(alloc); + CXzBcFilterStateBase *p = &((CXzBcFilterState *)pp)->base; + UNUSED_VAR(alloc) p->ip = 0; if (p->methodId == XZ_ID_Delta) { if (propSize != 1) return SZ_ERROR_UNSUPPORTED; - p->delta = (unsigned)props[0] + 1; + p->delta = (UInt32)props[0] + 1; } else { if (propSize == 4) { - UInt32 v = GetUi32(props); + const UInt32 v = GetUi32(props); switch (p->methodId) { case XZ_ID_PPC: case XZ_ID_ARM: case XZ_ID_SPARC: - if ((v & 3) != 0) + case XZ_ID_ARM64: + if (v & 3) return SZ_ERROR_UNSUPPORTED; break; case XZ_ID_ARMT: - if ((v & 1) != 0) + case XZ_ID_RISCV: + if (v & 1) return SZ_ERROR_UNSUPPORTED; break; case XZ_ID_IA64: - if ((v & 0xF) != 0) + if (v & 0xf) return SZ_ERROR_UNSUPPORTED; break; + default: break; } p->ip = v; } @@ -134,73 +140,91 @@ return SZ_OK; } -static void BraState_Init(void *pp) + +static void XzBcFilterState_Init(void *pp) { - CBraState *p = ((CBraState *)pp); + CXzBcFilterState *p = ((CXzBcFilterState *)pp); p->bufPos = p->bufConv = p->bufTotal = 0; - x86_Convert_Init(p->x86State); - if (p->methodId == XZ_ID_Delta) - Delta_Init(p->deltaState); + p->base.X86_State = Z7_BRANCH_CONV_ST_X86_STATE_INIT_VAL; + if (p->base.methodId == XZ_ID_Delta) + Delta_Init(p->base.delta_State); } -#define CASE_BRA_CONV(isa) case XZ_ID_ ## isa: size = isa ## _Convert(data, size, p->ip, p->encodeMode); break; - -static SizeT BraState_Filter(void *pp, Byte *data, SizeT size) +static const z7_Func_BranchConv g_Funcs_BranchConv_RISC_Dec[] = { - CBraState *p = ((CBraState *)pp); + Z7_BRANCH_CONV_DEC_2 (BranchConv_PPC), + Z7_BRANCH_CONV_DEC_2 (BranchConv_IA64), + Z7_BRANCH_CONV_DEC_2 (BranchConv_ARM), + Z7_BRANCH_CONV_DEC_2 (BranchConv_ARMT), + Z7_BRANCH_CONV_DEC_2 (BranchConv_SPARC), + Z7_BRANCH_CONV_DEC_2 (BranchConv_ARM64), + Z7_BRANCH_CONV_DEC_2 (BranchConv_RISCV) +}; + +static SizeT XzBcFilterStateBase_Filter_Dec(CXzBcFilterStateBase *p, Byte *data, SizeT size) +{ switch (p->methodId) { case XZ_ID_Delta: - if (p->encodeMode) - Delta_Encode(p->deltaState, p->delta, data, size); - else - Delta_Decode(p->deltaState, p->delta, data, size); + Delta_Decode(p->delta_State, p->delta, data, size); break; case XZ_ID_X86: - size = x86_Convert(data, size, p->ip, &p->x86State, p->encodeMode); + size = (SizeT)(z7_BranchConvSt_X86_Dec(data, size, p->ip, &p->X86_State) - data); break; - CASE_BRA_CONV(PPC) - CASE_BRA_CONV(IA64) - CASE_BRA_CONV(ARM) - CASE_BRA_CONV(ARMT) - CASE_BRA_CONV(SPARC) + default: + if (p->methodId >= XZ_ID_PPC) + { + const UInt32 i = p->methodId - XZ_ID_PPC; + if (i < Z7_ARRAY_SIZE(g_Funcs_BranchConv_RISC_Dec)) + size = (SizeT)(g_Funcs_BranchConv_RISC_Dec[i](data, size, p->ip) - data); + } + break; } p->ip += (UInt32)size; return size; } -static SRes BraState_Code2(void *pp, +static SizeT XzBcFilterState_Filter(void *pp, Byte *data, SizeT size) +{ + CXzBcFilterState *p = ((CXzBcFilterState *)pp); + return p->filter_func(&p->base, data, size); +} + + +static SRes XzBcFilterState_Code2(void *pp, Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, int srcWasFinished, ECoderFinishMode finishMode, // int *wasFinished ECoderStatus *status) { - CBraState *p = ((CBraState *)pp); + CXzBcFilterState *p = ((CXzBcFilterState *)pp); SizeT destRem = *destLen; SizeT srcRem = *srcLen; - UNUSED_VAR(finishMode); + UNUSED_VAR(finishMode) *destLen = 0; *srcLen = 0; // *wasFinished = False; *status = CODER_STATUS_NOT_FINISHED; - while (destRem > 0) + while (destRem != 0) { - if (p->bufPos != p->bufConv) { size_t size = p->bufConv - p->bufPos; - if (size > destRem) - size = destRem; - memcpy(dest, p->buf + p->bufPos, size); - p->bufPos += size; - *destLen += size; - dest += size; - destRem -= size; - continue; + if (size) + { + if (size > destRem) + size = destRem; + memcpy(dest, p->buf + p->bufPos, size); + p->bufPos += size; + *destLen += size; + dest += size; + destRem -= size; + continue; + } } p->bufTotal -= p->bufPos; @@ -220,7 +244,7 @@ if (p->bufTotal == 0) break; - p->bufConv = BraState_Filter(pp, p->buf, p->bufTotal); + p->bufConv = p->filter_func(&p->base, p->buf, p->bufTotal); if (p->bufConv == 0) { @@ -240,27 +264,37 @@ } -SRes BraState_SetFromMethod(IStateCoder *p, UInt64 id, int encodeMode, ISzAllocPtr alloc); -SRes BraState_SetFromMethod(IStateCoder *p, UInt64 id, int encodeMode, ISzAllocPtr alloc) +#define XZ_IS_SUPPORTED_FILTER_ID(id) \ + ((id) >= XZ_ID_Delta && (id) <= XZ_ID_RISCV) + +SRes Xz_StateCoder_Bc_SetFromMethod_Func(IStateCoder *p, UInt64 id, + Xz_Func_BcFilterStateBase_Filter func, ISzAllocPtr alloc) { - CBraState *decoder; - if (id < XZ_ID_Delta || id > XZ_ID_SPARC) + CXzBcFilterState *decoder; + if (!XZ_IS_SUPPORTED_FILTER_ID(id)) return SZ_ERROR_UNSUPPORTED; - decoder = (CBraState *)p->p; + decoder = (CXzBcFilterState *)p->p; if (!decoder) { - decoder = (CBraState *)ISzAlloc_Alloc(alloc, sizeof(CBraState)); + decoder = (CXzBcFilterState *)ISzAlloc_Alloc(alloc, sizeof(CXzBcFilterState)); if (!decoder) return SZ_ERROR_MEM; + decoder->buf = ISzAlloc_Alloc(alloc, BRA_BUF_SIZE); + if (!decoder->buf) + { + ISzAlloc_Free(alloc, decoder); + return SZ_ERROR_MEM; + } p->p = decoder; - p->Free = BraState_Free; - p->SetProps = BraState_SetProps; - p->Init = BraState_Init; - p->Code2 = BraState_Code2; - p->Filter = BraState_Filter; + p->Free = XzBcFilterState_Free; + p->SetProps = XzBcFilterState_SetProps; + p->Init = XzBcFilterState_Init; + p->Code2 = XzBcFilterState_Code2; + p->Filter = XzBcFilterState_Filter; + decoder->filter_func = func; } - decoder->methodId = (UInt32)id; - decoder->encodeMode = encodeMode; + decoder->base.methodId = (UInt32)id; + // decoder->encodeMode = encodeMode; return SZ_OK; } @@ -279,9 +313,9 @@ static SRes SbState_SetProps(void *pp, const Byte *props, size_t propSize, ISzAllocPtr alloc) { - UNUSED_VAR(pp); - UNUSED_VAR(props); - UNUSED_VAR(alloc); + UNUSED_VAR(pp) + UNUSED_VAR(props) + UNUSED_VAR(alloc) return (propSize == 0) ? SZ_OK : SZ_ERROR_UNSUPPORTED; } @@ -297,7 +331,7 @@ { CSbDec *p = (CSbDec *)pp; SRes res; - UNUSED_VAR(srcWasFinished); + UNUSED_VAR(srcWasFinished) p->dest = dest; p->destLen = *destLen; p->src = src; @@ -389,7 +423,7 @@ ELzmaStatus status2; /* ELzmaFinishMode fm = (finishMode == LZMA_FINISH_ANY) ? LZMA_FINISH_ANY : LZMA_FINISH_END; */ SRes res; - UNUSED_VAR(srcWasFinished); + UNUSED_VAR(srcWasFinished) if (spec->outBufMode) { SizeT dicPos = spec->decoder.decoder.dicPos; @@ -420,7 +454,7 @@ p->Init = Lzma2State_Init; p->Code2 = Lzma2State_Code2; p->Filter = NULL; - Lzma2Dec_Construct(&spec->decoder); + Lzma2Dec_CONSTRUCT(&spec->decoder) } spec->outBufMode = False; if (outBuf) @@ -510,26 +544,24 @@ { IStateCoder *sc = &p->coders[coderIndex]; p->ids[coderIndex] = methodId; - switch (methodId) - { - case XZ_ID_LZMA2: return Lzma2State_SetFromMethod(sc, outBuf, outBufSize, p->alloc); - #ifdef USE_SUBBLOCK - case XZ_ID_Subblock: return SbState_SetFromMethod(sc, p->alloc); - #endif - } + if (methodId == XZ_ID_LZMA2) + return Lzma2State_SetFromMethod(sc, outBuf, outBufSize, p->alloc); +#ifdef USE_SUBBLOCK + if (methodId == XZ_ID_Subblock) + return SbState_SetFromMethod(sc, p->alloc); +#endif if (coderIndex == 0) return SZ_ERROR_UNSUPPORTED; - return BraState_SetFromMethod(sc, methodId, 0, p->alloc); + return Xz_StateCoder_Bc_SetFromMethod_Func(sc, methodId, + XzBcFilterStateBase_Filter_Dec, p->alloc); } static SRes MixCoder_ResetFromMethod(CMixCoder *p, unsigned coderIndex, UInt64 methodId, Byte *outBuf, size_t outBufSize) { IStateCoder *sc = &p->coders[coderIndex]; - switch (methodId) - { - case XZ_ID_LZMA2: return Lzma2State_ResetOutBuf(sc, outBuf, outBufSize); - } + if (methodId == XZ_ID_LZMA2) + return Lzma2State_ResetOutBuf(sc, outBuf, outBufSize); return SZ_ERROR_UNSUPPORTED; } @@ -568,7 +600,7 @@ SizeT destLen2, srcLen2; int wasFinished; - PRF_STR("------- MixCoder Single ----------"); + PRF_STR("------- MixCoder Single ----------") srcLen2 = srcLenOrig; destLen2 = destLenOrig; @@ -615,14 +647,14 @@ processed = coder->Filter(coder->p, p->outBuf, processed); if (wasFinished || (destFinish && p->outWritten == destLenOrig)) processed = p->outWritten; - PRF_STR_INT("filter", i); + PRF_STR_INT("filter", i) } *destLen = processed; } return res; } - PRF_STR("standard mix"); + PRF_STR("standard mix") if (p->numCoders != 1) { @@ -772,14 +804,14 @@ } #define READ_VARINT_AND_CHECK(buf, pos, size, res) \ - { unsigned s = Xz_ReadVarInt(buf + pos, size - pos, res); \ + { const unsigned s = Xz_ReadVarInt(buf + pos, size - pos, res); \ if (s == 0) return SZ_ERROR_ARCHIVE; \ pos += s; } static BoolInt XzBlock_AreSupportedFilters(const CXzBlock *p) { - unsigned numFilters = XzBlock_GetNumFilters(p) - 1; + const unsigned numFilters = XzBlock_GetNumFilters(p) - 1; unsigned i; { const CXzFilter *f = &p->filters[numFilters]; @@ -795,8 +827,7 @@ if (f->propsSize != 1) return False; } - else if (f->id < XZ_ID_Delta - || f->id > XZ_ID_SPARC + else if (!XZ_IS_SUPPORTED_FILTER_ID(f->id) || (f->propsSize != 0 && f->propsSize != 4)) return False; } @@ -821,22 +852,24 @@ p->packSize = (UInt64)(Int64)-1; if (XzBlock_HasPackSize(p)) { - READ_VARINT_AND_CHECK(header, pos, headerSize, &p->packSize); + READ_VARINT_AND_CHECK(header, pos, headerSize, &p->packSize) if (p->packSize == 0 || p->packSize + headerSize >= (UInt64)1 << 63) return SZ_ERROR_ARCHIVE; } p->unpackSize = (UInt64)(Int64)-1; if (XzBlock_HasUnpackSize(p)) - READ_VARINT_AND_CHECK(header, pos, headerSize, &p->unpackSize); + { + READ_VARINT_AND_CHECK(header, pos, headerSize, &p->unpackSize) + } numFilters = XzBlock_GetNumFilters(p); for (i = 0; i < numFilters; i++) { CXzFilter *filter = p->filters + i; UInt64 size; - READ_VARINT_AND_CHECK(header, pos, headerSize, &filter->id); - READ_VARINT_AND_CHECK(header, pos, headerSize, &size); + READ_VARINT_AND_CHECK(header, pos, headerSize, &filter->id) + READ_VARINT_AND_CHECK(header, pos, headerSize, &size) if (size > headerSize - pos || size > XZ_FILTER_PROPS_SIZE_MAX) return SZ_ERROR_ARCHIVE; filter->propsSize = (UInt32)size; @@ -894,20 +927,20 @@ MixCoder_Free(p); for (i = 0; i < numFilters; i++) { - RINOK(MixCoder_SetFromMethod(p, i, block->filters[numFilters - 1 - i].id, outBuf, outBufSize)); + RINOK(MixCoder_SetFromMethod(p, i, block->filters[numFilters - 1 - i].id, outBuf, outBufSize)) } p->numCoders = numFilters; } else { - RINOK(MixCoder_ResetFromMethod(p, 0, block->filters[numFilters - 1].id, outBuf, outBufSize)); + RINOK(MixCoder_ResetFromMethod(p, 0, block->filters[numFilters - 1].id, outBuf, outBufSize)) } for (i = 0; i < numFilters; i++) { const CXzFilter *f = &block->filters[numFilters - 1 - i]; IStateCoder *sc = &p->coders[i]; - RINOK(sc->SetProps(sc->p, f->props, f->propsSize, p->alloc)); + RINOK(sc->SetProps(sc->p, f->props, f->propsSize, p->alloc)) } MixCoder_Init(p); @@ -1001,7 +1034,7 @@ SRes res; ECoderFinishMode finishMode2 = finishMode; - BoolInt srcFinished2 = srcFinished; + BoolInt srcFinished2 = (BoolInt)srcFinished; BoolInt destFinish = False; if (p->block.packSize != (UInt64)(Int64)-1) @@ -1054,14 +1087,14 @@ (*destLen) += destLen2; p->unpackSize += destLen2; - RINOK(res); + RINOK(res) if (*status != CODER_STATUS_FINISHED_WITH_MARK) { if (p->block.packSize == p->packSize && *status == CODER_STATUS_NEEDS_MORE_INPUT) { - PRF_STR("CODER_STATUS_NEEDS_MORE_INPUT"); + PRF_STR("CODER_STATUS_NEEDS_MORE_INPUT") *status = CODER_STATUS_NOT_SPECIFIED; return SZ_ERROR_DATA; } @@ -1078,7 +1111,7 @@ if ((p->block.packSize != (UInt64)(Int64)-1 && p->block.packSize != p->packSize) || (p->block.unpackSize != (UInt64)(Int64)-1 && p->block.unpackSize != p->unpackSize)) { - PRF_STR("ERROR: block.size mismatch"); + PRF_STR("ERROR: block.size mismatch") return SZ_ERROR_DATA; } } @@ -1094,7 +1127,7 @@ return SZ_OK; } - switch (p->state) + switch ((int)p->state) { case XZ_STATE_STREAM_HEADER: { @@ -1109,7 +1142,7 @@ } else { - RINOK(Xz_ParseHeader(&p->streamFlags, p->buf)); + RINOK(Xz_ParseHeader(&p->streamFlags, p->buf)) p->numStartedStreams++; p->indexSize = 0; p->numBlocks = 0; @@ -1139,15 +1172,15 @@ p->state = XZ_STATE_STREAM_INDEX; break; } - p->blockHeaderSize = ((UInt32)p->buf[0] << 2) + 4; + p->blockHeaderSize = ((unsigned)p->buf[0] << 2) + 4; break; } if (p->pos != p->blockHeaderSize) { - UInt32 cur = p->blockHeaderSize - p->pos; + unsigned cur = p->blockHeaderSize - p->pos; if (cur > srcRem) - cur = (UInt32)srcRem; + cur = (unsigned)srcRem; memcpy(p->buf + p->pos, src, cur); p->pos += cur; (*srcLen) += cur; @@ -1155,7 +1188,7 @@ } else { - RINOK(XzBlock_Parse(&p->block, p->buf)); + RINOK(XzBlock_Parse(&p->block, p->buf)) if (!XzBlock_AreSupportedFilters(&p->block)) return SZ_ERROR_UNSUPPORTED; p->numTotalBlocks++; @@ -1168,7 +1201,7 @@ p->headerParsedOk = True; return SZ_OK; } - RINOK(XzDecMix_Init(&p->decoder, &p->block, p->outBuf, p->outBufSize)); + RINOK(XzDecMix_Init(&p->decoder, &p->block, p->outBuf, p->outBufSize)) } break; } @@ -1189,8 +1222,8 @@ } else { - UInt32 checkSize = XzFlags_GetCheckSize(p->streamFlags); - UInt32 cur = checkSize - p->pos; + const unsigned checkSize = XzFlags_GetCheckSize(p->streamFlags); + unsigned cur = checkSize - p->pos; if (cur != 0) { if (srcRem == 0) @@ -1199,7 +1232,7 @@ return SZ_OK; } if (cur > srcRem) - cur = (UInt32)srcRem; + cur = (unsigned)srcRem; memcpy(p->buf + p->pos, src, cur); p->pos += cur; (*srcLen) += cur; @@ -1288,9 +1321,9 @@ case XZ_STATE_STREAM_FOOTER: { - UInt32 cur = XZ_STREAM_FOOTER_SIZE - p->pos; + unsigned cur = XZ_STREAM_FOOTER_SIZE - p->pos; if (cur > srcRem) - cur = (UInt32)srcRem; + cur = (unsigned)srcRem; memcpy(p->buf + p->pos, src, cur); p->pos += cur; (*srcLen) += cur; @@ -1325,6 +1358,8 @@ } case XZ_STATE_BLOCK: break; /* to disable GCC warning */ + + default: return SZ_ERROR_FAIL; } } /* @@ -1389,7 +1424,7 @@ -#ifndef _7ZIP_ST +#ifndef Z7_ST #include "MtDec.h" #endif @@ -1400,7 +1435,7 @@ p->outStep_ST = 1 << 20; p->ignoreErrors = False; - #ifndef _7ZIP_ST + #ifndef Z7_ST p->numThreads = 1; p->inBufSize_MT = 1 << 18; p->memUseMax = sizeof(size_t) << 28; @@ -1409,7 +1444,7 @@ -#ifndef _7ZIP_ST +#ifndef Z7_ST /* ---------- CXzDecMtThread ---------- */ @@ -1448,7 +1483,7 @@ /* ---------- CXzDecMt ---------- */ -typedef struct +struct CXzDecMt { CAlignOffsetAlloc alignOffsetAlloc; ISzAllocPtr allocMid; @@ -1456,9 +1491,9 @@ CXzDecMtProps props; size_t unpackBlockMaxSize; - ISeqInStream *inStream; - ISeqOutStream *outStream; - ICompressProgress *progress; + ISeqInStreamPtr inStream; + ISeqOutStreamPtr outStream; + ICompressProgressPtr progress; BoolInt finishMode; BoolInt outSize_Defined; @@ -1481,7 +1516,7 @@ ECoderStatus status; SRes codeRes; - #ifndef _7ZIP_ST + #ifndef Z7_ST BoolInt mainDecoderWasCalled; // int statErrorDefined; int finishedDecoderIndex; @@ -1504,10 +1539,9 @@ BoolInt mtc_WasConstructed; CMtDec mtc; - CXzDecMtThread coders[MTDEC__THREADS_MAX]; + CXzDecMtThread coders[MTDEC_THREADS_MAX]; #endif - -} CXzDecMt; +}; @@ -1535,11 +1569,11 @@ XzDecMtProps_Init(&p->props); - #ifndef _7ZIP_ST + #ifndef Z7_ST p->mtc_WasConstructed = False; { unsigned i; - for (i = 0; i < MTDEC__THREADS_MAX; i++) + for (i = 0; i < MTDEC_THREADS_MAX; i++) { CXzDecMtThread *coder = &p->coders[i]; coder->dec_created = False; @@ -1549,16 +1583,16 @@ } #endif - return p; + return (CXzDecMtHandle)p; } -#ifndef _7ZIP_ST +#ifndef Z7_ST static void XzDecMt_FreeOutBufs(CXzDecMt *p) { unsigned i; - for (i = 0; i < MTDEC__THREADS_MAX; i++) + for (i = 0; i < MTDEC_THREADS_MAX; i++) { CXzDecMtThread *coder = &p->coders[i]; if (coder->outBuf) @@ -1595,13 +1629,15 @@ } -void XzDecMt_Destroy(CXzDecMtHandle pp) +// #define GET_CXzDecMt_p CXzDecMt *p = pp; + +void XzDecMt_Destroy(CXzDecMtHandle p) { - CXzDecMt *p = (CXzDecMt *)pp; + // GET_CXzDecMt_p XzDecMt_FreeSt(p); - #ifndef _7ZIP_ST + #ifndef Z7_ST if (p->mtc_WasConstructed) { @@ -1610,7 +1646,7 @@ } { unsigned i; - for (i = 0; i < MTDEC__THREADS_MAX; i++) + for (i = 0; i < MTDEC_THREADS_MAX; i++) { CXzDecMtThread *t = &p->coders[i]; if (t->dec_created) @@ -1625,12 +1661,12 @@ #endif - ISzAlloc_Free(p->alignOffsetAlloc.baseAlloc, pp); + ISzAlloc_Free(p->alignOffsetAlloc.baseAlloc, p); } -#ifndef _7ZIP_ST +#ifndef Z7_ST static void XzDecMt_Callback_Parse(void *obj, unsigned coderIndex, CMtDecCallbackInfo *cc) { @@ -1696,7 +1732,7 @@ coder->dec.parseMode = True; coder->dec.headerParsedOk = False; - PRF_STR_INT("Parse", srcSize2); + PRF_STR_INT("Parse", srcSize2) res = XzUnpacker_Code(&coder->dec, NULL, &destSize, @@ -1739,10 +1775,10 @@ } } { - UInt64 packSize = block->packSize; - UInt64 packSizeAligned = packSize + ((0 - (unsigned)packSize) & 3); - UInt32 checkSize = XzFlags_GetCheckSize(coder->dec.streamFlags); - UInt64 blockPackSum = coder->inPreSize + packSizeAligned + checkSize; + const UInt64 packSize = block->packSize; + const UInt64 packSizeAligned = packSize + ((0 - (unsigned)packSize) & 3); + const unsigned checkSize = XzFlags_GetCheckSize(coder->dec.streamFlags); + const UInt64 blockPackSum = coder->inPreSize + packSizeAligned + checkSize; // if (blockPackSum <= me->props.inBlockMax) // unpackBlockMaxSize { @@ -2071,7 +2107,7 @@ } data += cur; size -= cur; - // PRF_STR_INT("Written size =", size); + // PRF_STR_INT("Written size =", size) if (size == 0) break; res = MtProgress_ProgressAdd(&me->mtc.mtProgress, 0, 0); @@ -2087,7 +2123,7 @@ return res; } - RINOK(res); + RINOK(res) if (coder->inPreSize != coder->inCodeSize || coder->blockPackTotal != coder->inCodeSize) @@ -2106,13 +2142,13 @@ // (coder->state == MTDEC_PARSE_END) means that there are no other working threads // so we can use mtc variables without lock - PRF_STR_INT("Write MTDEC_PARSE_END", me->mtc.inProcessed); + PRF_STR_INT("Write MTDEC_PARSE_END", me->mtc.inProcessed) me->mtc.mtProgress.totalInSize = me->mtc.inProcessed; { CXzUnpacker *dec = &me->dec; - PRF_STR_INT("PostSingle", srcSize); + PRF_STR_INT("PostSingle", srcSize) { size_t srcProcessed = srcSize; @@ -2186,7 +2222,7 @@ me->mtc.crossEnd = srcSize; } - PRF_STR_INT("XZ_STATE_STREAM_HEADER crossEnd = ", (unsigned)me->mtc.crossEnd); + PRF_STR_INT("XZ_STATE_STREAM_HEADER crossEnd = ", (unsigned)me->mtc.crossEnd) return SZ_OK; } @@ -2277,7 +2313,7 @@ UInt64 inDelta = me->mtc.inProcessed - inProgressPrev; if (inDelta >= (1 << 22)) { - RINOK(MtProgress_Progress_ST(&me->mtc.mtProgress)); + RINOK(MtProgress_Progress_ST(&me->mtc.mtProgress)) inProgressPrev = me->mtc.inProcessed; } } @@ -2331,7 +2367,7 @@ */ static SRes XzDecMt_Decode_ST(CXzDecMt *p - #ifndef _7ZIP_ST + #ifndef Z7_ST , BoolInt tMode #endif , CXzStatInfo *stat) @@ -2343,11 +2379,11 @@ CXzUnpacker *dec; - #ifndef _7ZIP_ST + #ifndef Z7_ST if (tMode) { XzDecMt_FreeOutBufs(p); - tMode = MtDec_PrepareRead(&p->mtc); + tMode = (BoolInt)MtDec_PrepareRead(&p->mtc); } #endif @@ -2400,7 +2436,7 @@ if (inPos == inLim) { - #ifndef _7ZIP_ST + #ifndef Z7_ST if (tMode) { inData = MtDec_Read(&p->mtc, &inLim); @@ -2577,19 +2613,19 @@ -SRes XzDecMt_Decode(CXzDecMtHandle pp, +SRes XzDecMt_Decode(CXzDecMtHandle p, const CXzDecMtProps *props, const UInt64 *outDataSize, int finishMode, - ISeqOutStream *outStream, + ISeqOutStreamPtr outStream, // Byte *outBuf, size_t *outBufSize, - ISeqInStream *inStream, + ISeqInStreamPtr inStream, // const Byte *inData, size_t inDataSize, CXzStatInfo *stat, int *isMT, - ICompressProgress *progress) + ICompressProgressPtr progress) { - CXzDecMt *p = (CXzDecMt *)pp; - #ifndef _7ZIP_ST + // GET_CXzDecMt_p + #ifndef Z7_ST BoolInt tMode; #endif @@ -2610,7 +2646,7 @@ p->outSize = *outDataSize; } - p->finishMode = finishMode; + p->finishMode = (BoolInt)finishMode; // p->outSize = 457; p->outSize_Defined = True; p->finishMode = False; // for test @@ -2640,7 +2676,7 @@ */ - #ifndef _7ZIP_ST + #ifndef Z7_ST p->isBlockHeaderState_Parse = False; p->isBlockHeaderState_Write = False; @@ -2782,7 +2818,7 @@ return res; } - PRF_STR("----- decoding ST -----"); + PRF_STR("----- decoding ST -----") } #endif @@ -2792,13 +2828,13 @@ { SRes res = XzDecMt_Decode_ST(p - #ifndef _7ZIP_ST + #ifndef Z7_ST , tMode #endif , stat ); - #ifndef _7ZIP_ST + #ifndef Z7_ST // we must set error code from MT decoding at first if (p->mainErrorCode != SZ_OK) stat->DecodeRes = p->mainErrorCode; @@ -2835,3 +2871,7 @@ return res; } } + +#undef PRF +#undef PRF_STR +#undef PRF_STR_INT_2
diff --git a/third_party/lzma_sdk/C/XzIn.c b/third_party/lzma_sdk/C/XzIn.c index 84f868e..b68af96 100644 --- a/third_party/lzma_sdk/C/XzIn.c +++ b/third_party/lzma_sdk/C/XzIn.c
@@ -1,5 +1,5 @@ /* XzIn.c - Xz input -2021-09-04 : Igor Pavlov : Public domain */ +2023-09-07 : Igor Pavlov : Public domain */ #include "Precomp.h" @@ -15,27 +15,29 @@ #define XZ_FOOTER_SIG_CHECK(p) ((p)[0] == XZ_FOOTER_SIG_0 && (p)[1] == XZ_FOOTER_SIG_1) -SRes Xz_ReadHeader(CXzStreamFlags *p, ISeqInStream *inStream) +SRes Xz_ReadHeader(CXzStreamFlags *p, ISeqInStreamPtr inStream) { Byte sig[XZ_STREAM_HEADER_SIZE]; - RINOK(SeqInStream_Read2(inStream, sig, XZ_STREAM_HEADER_SIZE, SZ_ERROR_NO_ARCHIVE)); - if (memcmp(sig, XZ_SIG, XZ_SIG_SIZE) != 0) + size_t processedSize = XZ_STREAM_HEADER_SIZE; + RINOK(SeqInStream_ReadMax(inStream, sig, &processedSize)) + if (processedSize != XZ_STREAM_HEADER_SIZE + || memcmp(sig, XZ_SIG, XZ_SIG_SIZE) != 0) return SZ_ERROR_NO_ARCHIVE; return Xz_ParseHeader(p, sig); } #define READ_VARINT_AND_CHECK(buf, pos, size, res) \ - { unsigned s = Xz_ReadVarInt(buf + pos, size - pos, res); \ + { const unsigned s = Xz_ReadVarInt(buf + pos, size - pos, res); \ if (s == 0) return SZ_ERROR_ARCHIVE; \ pos += s; } -SRes XzBlock_ReadHeader(CXzBlock *p, ISeqInStream *inStream, BoolInt *isIndex, UInt32 *headerSizeRes) +SRes XzBlock_ReadHeader(CXzBlock *p, ISeqInStreamPtr inStream, BoolInt *isIndex, UInt32 *headerSizeRes) { Byte header[XZ_BLOCK_HEADER_SIZE_MAX]; unsigned headerSize; *headerSizeRes = 0; - RINOK(SeqInStream_ReadByte(inStream, &header[0])); - headerSize = (unsigned)header[0]; + RINOK(SeqInStream_ReadByte(inStream, &header[0])) + headerSize = header[0]; if (headerSize == 0) { *headerSizeRes = 1; @@ -45,20 +47,27 @@ *isIndex = False; headerSize = (headerSize << 2) + 4; - *headerSizeRes = headerSize; - RINOK(SeqInStream_Read(inStream, header + 1, headerSize - 1)); + *headerSizeRes = (UInt32)headerSize; + { + size_t processedSize = headerSize - 1; + RINOK(SeqInStream_ReadMax(inStream, header + 1, &processedSize)) + if (processedSize != headerSize - 1) + return SZ_ERROR_INPUT_EOF; + } return XzBlock_Parse(p, header); } #define ADD_SIZE_CHECK(size, val) \ - { UInt64 newSize = size + (val); if (newSize < size) return XZ_SIZE_OVERFLOW; size = newSize; } + { const UInt64 newSize = size + (val); if (newSize < size) return XZ_SIZE_OVERFLOW; size = newSize; } UInt64 Xz_GetUnpackSize(const CXzStream *p) { UInt64 size = 0; size_t i; for (i = 0; i < p->numBlocks; i++) - ADD_SIZE_CHECK(size, p->blocks[i].unpackSize); + { + ADD_SIZE_CHECK(size, p->blocks[i].unpackSize) + } return size; } @@ -67,12 +76,14 @@ UInt64 size = 0; size_t i; for (i = 0; i < p->numBlocks; i++) - ADD_SIZE_CHECK(size, (p->blocks[i].totalSize + 3) & ~(UInt64)3); + { + ADD_SIZE_CHECK(size, (p->blocks[i].totalSize + 3) & ~(UInt64)3) + } return size; } /* -SRes XzBlock_ReadFooter(CXzBlock *p, CXzStreamFlags f, ISeqInStream *inStream) +SRes XzBlock_ReadFooter(CXzBlock *p, CXzStreamFlags f, ISeqInStreamPtr inStream) { return SeqInStream_Read(inStream, p->check, XzFlags_GetCheckSize(f)); } @@ -93,7 +104,7 @@ { UInt64 numBlocks64; - READ_VARINT_AND_CHECK(buf, pos, size, &numBlocks64); + READ_VARINT_AND_CHECK(buf, pos, size, &numBlocks64) numBlocks = (size_t)numBlocks64; if (numBlocks != numBlocks64 || numBlocks * 2 > size) return SZ_ERROR_ARCHIVE; @@ -110,8 +121,8 @@ for (i = 0; i < numBlocks; i++) { CXzBlockSizes *block = &p->blocks[i]; - READ_VARINT_AND_CHECK(buf, pos, size, &block->totalSize); - READ_VARINT_AND_CHECK(buf, pos, size, &block->unpackSize); + READ_VARINT_AND_CHECK(buf, pos, size, &block->totalSize) + READ_VARINT_AND_CHECK(buf, pos, size, &block->unpackSize) if (block->totalSize == 0) return SZ_ERROR_ARCHIVE; } @@ -122,7 +133,7 @@ return (pos == size) ? SZ_OK : SZ_ERROR_ARCHIVE; } -static SRes Xz_ReadIndex(CXzStream *p, ILookInStream *stream, UInt64 indexSize, ISzAllocPtr alloc) +static SRes Xz_ReadIndex(CXzStream *p, ILookInStreamPtr stream, UInt64 indexSize, ISzAllocPtr alloc) { SRes res; size_t size; @@ -142,14 +153,14 @@ return res; } -static SRes LookInStream_SeekRead_ForArc(ILookInStream *stream, UInt64 offset, void *buf, size_t size) +static SRes LookInStream_SeekRead_ForArc(ILookInStreamPtr stream, UInt64 offset, void *buf, size_t size) { - RINOK(LookInStream_SeekTo(stream, offset)); + RINOK(LookInStream_SeekTo(stream, offset)) return LookInStream_Read(stream, buf, size); /* return LookInStream_Read2(stream, buf, size, SZ_ERROR_NO_ARCHIVE); */ } -static SRes Xz_ReadBackward(CXzStream *p, ILookInStream *stream, Int64 *startOffset, ISzAllocPtr alloc) +static SRes Xz_ReadBackward(CXzStream *p, ILookInStreamPtr stream, Int64 *startOffset, ISzAllocPtr alloc) { UInt64 indexSize; Byte buf[XZ_STREAM_FOOTER_SIZE]; @@ -159,7 +170,7 @@ return SZ_ERROR_NO_ARCHIVE; pos -= XZ_STREAM_FOOTER_SIZE; - RINOK(LookInStream_SeekRead_ForArc(stream, pos, buf, XZ_STREAM_FOOTER_SIZE)); + RINOK(LookInStream_SeekRead_ForArc(stream, pos, buf, XZ_STREAM_FOOTER_SIZE)) if (!XZ_FOOTER_SIG_CHECK(buf + 10)) { @@ -174,7 +185,7 @@ i = (pos > TEMP_BUF_SIZE) ? TEMP_BUF_SIZE : (size_t)pos; pos -= i; - RINOK(LookInStream_SeekRead_ForArc(stream, pos, temp, i)); + RINOK(LookInStream_SeekRead_ForArc(stream, pos, temp, i)) total += (UInt32)i; for (; i != 0; i--) if (temp[i - 1] != 0) @@ -193,7 +204,7 @@ if (pos < XZ_STREAM_FOOTER_SIZE) return SZ_ERROR_NO_ARCHIVE; pos -= XZ_STREAM_FOOTER_SIZE; - RINOK(LookInStream_SeekRead_ForArc(stream, pos, buf, XZ_STREAM_FOOTER_SIZE)); + RINOK(LookInStream_SeekRead_ForArc(stream, pos, buf, XZ_STREAM_FOOTER_SIZE)) if (!XZ_FOOTER_SIG_CHECK(buf + 10)) return SZ_ERROR_NO_ARCHIVE; } @@ -217,8 +228,8 @@ return SZ_ERROR_ARCHIVE; pos -= indexSize; - RINOK(LookInStream_SeekTo(stream, pos)); - RINOK(Xz_ReadIndex(p, stream, indexSize, alloc)); + RINOK(LookInStream_SeekTo(stream, pos)) + RINOK(Xz_ReadIndex(p, stream, indexSize, alloc)) { UInt64 totalSize = Xz_GetPackSize(p); @@ -227,7 +238,7 @@ || pos < totalSize + XZ_STREAM_HEADER_SIZE) return SZ_ERROR_ARCHIVE; pos -= (totalSize + XZ_STREAM_HEADER_SIZE); - RINOK(LookInStream_SeekTo(stream, pos)); + RINOK(LookInStream_SeekTo(stream, pos)) *startOffset = (Int64)pos; } { @@ -236,7 +247,7 @@ SecToRead_CreateVTable(&secToRead); secToRead.realStream = stream; - RINOK(Xz_ReadHeader(&headerFlags, &secToRead.vt)); + RINOK(Xz_ReadHeader(&headerFlags, &secToRead.vt)) return (p->flags == headerFlags) ? SZ_OK : SZ_ERROR_ARCHIVE; } } @@ -274,7 +285,9 @@ UInt64 size = 0; size_t i; for (i = 0; i < p->num; i++) - ADD_SIZE_CHECK(size, Xz_GetUnpackSize(&p->streams[i])); + { + ADD_SIZE_CHECK(size, Xz_GetUnpackSize(&p->streams[i])) + } return size; } @@ -284,15 +297,17 @@ UInt64 size = 0; size_t i; for (i = 0; i < p->num; i++) - ADD_SIZE_CHECK(size, Xz_GetTotalSize(&p->streams[i])); + { + ADD_SIZE_CHECK(size, Xz_GetTotalSize(&p->streams[i])) + } return size; } */ -SRes Xzs_ReadBackward(CXzs *p, ILookInStream *stream, Int64 *startOffset, ICompressProgress *progress, ISzAllocPtr alloc) +SRes Xzs_ReadBackward(CXzs *p, ILookInStreamPtr stream, Int64 *startOffset, ICompressProgressPtr progress, ISzAllocPtr alloc) { Int64 endOffset = 0; - RINOK(ILookInStream_Seek(stream, &endOffset, SZ_SEEK_END)); + RINOK(ILookInStream_Seek(stream, &endOffset, SZ_SEEK_END)) *startOffset = endOffset; for (;;) { @@ -301,7 +316,7 @@ Xz_Construct(&st); res = Xz_ReadBackward(&st, stream, startOffset, alloc); st.startOffset = (UInt64)*startOffset; - RINOK(res); + RINOK(res) if (p->num == p->numAllocated) { const size_t newNum = p->num + p->num / 4 + 1; @@ -317,7 +332,7 @@ p->streams[p->num++] = st; if (*startOffset == 0) break; - RINOK(LookInStream_SeekTo(stream, (UInt64)*startOffset)); + RINOK(LookInStream_SeekTo(stream, (UInt64)*startOffset)) if (progress && ICompressProgress_Progress(progress, (UInt64)(endOffset - *startOffset), (UInt64)(Int64)-1) != SZ_OK) return SZ_ERROR_PROGRESS; }
diff --git a/third_party/lzma_sdk/DEPS b/third_party/lzma_sdk/DEPS index 5de7365..8a72064 100644 --- a/third_party/lzma_sdk/DEPS +++ b/third_party/lzma_sdk/DEPS
@@ -4,5 +4,6 @@ include_rules = [ "+base", + "+build", "+testing", ]
diff --git a/third_party/lzma_sdk/README.chromium b/third_party/lzma_sdk/README.chromium index 884b9578..a078242 100644 --- a/third_party/lzma_sdk/README.chromium +++ b/third_party/lzma_sdk/README.chromium
@@ -1,25 +1,19 @@ Name: LZMA SDK Short Name: lzma URL: http://www.7-zip.org/sdk.html -Version: 22.01 -Date: 2022-07-15 +Version: 24.09 +Date: 2024-12-13 License: LZMA-SDK-9.22 License File: LICENSE Security Critical: yes Shipped: yes -CPEPrefix: cpe:2.3:a:7-zip:7-zip:22.01:*:*:*:*:*:*:* +CPEPrefix: cpe:2.3:a:7-zip:7-zip:24.09:*:*:*:*:*:*:* Description: -This contains a part of LZMA SDK 22.01. +This contains a part of LZMA SDK 24.09. Local Modifications: -The original code can be found at https://7-zip.org/a/lzma2201.7z. Only parts -of this archive are copied here. More specifically: - -1/ C code required to open 7z archive files and uncompress LZMA -2/ 7za, 7zr, and 7zz executables, if Windows is specified as a target OS. -3/ source code for SfxSetup, a utility for creating self extracting archives -4/ C code required for xz decompression (split into its own static library) +The original code can be found at https://7-zip.org/a/lzma2409.7z. The 7z binaries are installed via a 3pp CIPD package into bin/ if Windows is specified as a target OS in the .gclient file. There are two subdirectories in @@ -39,23 +33,12 @@ extract files. 7zr is "lightweight" and only handles 7zip extensions. 7za can handle a few more. -The patch in chromium.patch was applied to 7zCrc.c, CpuArch.c, LZFind.c and -Sha256.c to disable some ARM code that was failing to build in Android and -Fuschia as well as some of the AVX2 and SSE4 code for Windows. In Fuschia, -`#include <asm/hwcap.h>` is not available. In Android builds, `armv8-a+crc` is -not a known target architecture, even when the -march cflag is passed, -specifying the CPU type to use. In Windows, Chromium still supports SSE3, -so it is not be ready to transition to utilizing AVX2 and SSE4, yet. Added -.note.gnu.property section to arm64/7zAsm.s to suppress compiler error requiring -bti. Shortened segment names in Asm/x86/*.asm files to make the builds -deterministic. Resolved include paths as well. - -The patch in chromium_ubsan.patch fixes some undefined behavior, flagged by -UBSan, caused by invalid pointer casts in LZMA SDK. - -The patch in Util/SfxSetup/chromium.patch was applied so that: - -1/ Fix for includes file names, since the original code causes an include - file violation during git cl presubmit. -2/ Extended search range for 7z archive signature to accomodate - increased sfx binary size in debug builds. +The purposes of the patch in chromium.patch are: +1. Extend the search range for 7z archive signature to accomodate increased sfx + binary size in debug builds. +2. Fix undefined behavior in CpuArch.h flagged by UBSan caused by invalid + pointer casts. +3. Shorten segment names in Asm/x86/LzmaDecOpt.asm to make the build + deterministic. +4. Remove files irrelevant to Chromium use. +5. Remove AVX and SSE41 code in LzFind.
diff --git a/third_party/lzma_sdk/chromium.patch b/third_party/lzma_sdk/chromium.patch index 85b8089..168ca26 100644 --- a/third_party/lzma_sdk/chromium.patch +++ b/third_party/lzma_sdk/chromium.patch
@@ -1,138 +1,46 @@ -diff --git "a/lzma2107\\C/7zCrc.c" "b/third_party\\lzma_sdk/7zCrc.c" -index f186324ddc609..c0cc9bc7812e0 100644 ---- "a/lzma2107\\C/7zCrc.c" -+++ "b/third_party\\lzma_sdk/7zCrc.c" -@@ -78,20 +78,20 @@ UInt32 MY_FAST_CALL CrcUpdateT1(UInt32 v, const void *data, size_t size, const U - #if defined(_MSC_VER) - #if defined(MY_CPU_ARM64) - #if (_MSC_VER >= 1910) -- #define USE_ARM64_CRC -+ // #define USE_ARM64_CRC - #endif - #endif - #elif (defined(__clang__) && (__clang_major__ >= 3)) \ - || (defined(__GNUC__) && (__GNUC__ > 4)) - #if !defined(__ARM_FEATURE_CRC32) -- #define __ARM_FEATURE_CRC32 1 -+ // #define __ARM_FEATURE_CRC32 1 - #if (!defined(__clang__) || (__clang_major__ > 3)) // fix these numbers -- #define ATTRIB_CRC __attribute__((__target__("arch=armv8-a+crc"))) -+ // #define ATTRIB_CRC __attribute__((__target__("arch=armv8-a+crc"))) - #endif - #endif - #if defined(__ARM_FEATURE_CRC32) -- #define USE_ARM64_CRC -- #include <arm_acle.h> -+ // #define USE_ARM64_CRC -+ // #include <arm_acle.h> - #endif - #endif - -diff --git "a/lzma2107\\C/CpuArch.c" "b/third_party\\lzma_sdk/CpuArch.c" -index fa9afe3970b3f..30451fba9b97b 100644 ---- "a/lzma2107\\C/CpuArch.c" -+++ "b/third_party\\lzma_sdk/CpuArch.c" -@@ -417,7 +417,9 @@ BoolInt CPU_IsSupported_AES (void) { return APPLE_CRYPTO_SUPPORT_VAL; } - - #include <sys/auxv.h> - -+#if !defined(ARMV8_OS_FUCHSIA) - #define USE_HWCAP -+#endif // !defined(ARMV8_OS_FUCHSIA) - - #ifdef USE_HWCAP - -diff --git "a/lzma2107\\C/LzFind.c" "b/third_party\\lzma_sdk/LzFind.c" -index 1b73c28484ccf..36f7330911435 100644 ---- "a/lzma2107\\C/LzFind.c" -+++ "b/third_party\\lzma_sdk/LzFind.c" -@@ -505,7 +505,7 @@ void MatchFinder_Init(CMatchFinder *p) - } - - -- -+#if 0 - #ifdef MY_CPU_X86_OR_AMD64 - #if defined(__clang__) && (__clang_major__ >= 8) \ - || defined(__GNUC__) && (__GNUC__ >= 8) \ -@@ -549,6 +549,7 @@ void MatchFinder_Init(CMatchFinder *p) - #endif - - #endif -+#endif - - /* - #ifndef ATTRIB_SSE41 -diff --git "a/lzma2107\\C/Sha256.c" "b/third_party\\lzma_sdk/Sha256.c" -index 8b3983ea7323d..21996848c9156 100644 ---- "a/lzma2107\\C/Sha256.c" -+++ "b/third_party\\lzma_sdk/Sha256.c" -@@ -32,7 +32,8 @@ This code is based on public domain code from Wei Dai's Crypto++ library. */ - #define _SHA_SUPPORTED - #endif - #endif --#elif defined(MY_CPU_ARM_OR_ARM64) -+// TODO(crbug.com/1338627): Enable ARM optimizations -+#elif 0 // defined(MY_CPU_ARM_OR_ARM64) - #ifdef _MSC_VER - #if _MSC_VER >= 1910 - #define _SHA_SUPPORTED +diff -r /Users/waffles/Downloads/lzma2409/Asm/x86/LzmaDecOpt.asm ./Asm/x86/LzmaDecOpt.asm +42c42,44 +< _TEXT$LZMADECOPT SEGMENT ALIGN(64) 'CODE' +--- +> ; Make this deterministic +> ; _TEXT$LZMADECOPT SEGMENT ALIGN(64) 'CODE' +> LZMADEC SEGMENT ALIGN(64) 'CODE' +1336c1338 +< _TEXT$LZMADECOPT ENDS +--- +> LZMADEC ENDS +diff -r /Users/waffles/Downloads/lzma2409/C/CpuArch.h ./C/CpuArch.h +413c413,417 +< +--- +> // Disable MY_CPU_LE_UNALIGN. Although the underlying ISA may be able to load +> // unaligned words, doing so via pointer casts is undefined behavior in C and +> // C++, under both strict aliasing and because it is invalid to construct +> // unaligned pointers. Instead, load the bytes generically and leave optimizing +> // this to the compiler. +419,420c423,424 +< #define MY_CPU_LE_UNALIGN +< #define MY_CPU_LE_UNALIGN_64 +--- +> // #define MY_CPU_LE_UNALIGN +> // #define MY_CPU_LE_UNALIGN_64 +diff -r /Users/waffles/Downloads/lzma2409/C/LzFind.c ./C/LzFind.c +598c598 +< +--- +> #if 0 +642c642 +< +--- +> #endif // #if 0 +diff -r /Users/waffles/Downloads/lzma2409/C/Util/SfxSetup/SfxSetup.c ./C/Util/SfxSetup/SfxSetup.c +13a14,17 +> // SHELLEXECUTEINFO +> #include <windows.h> +> #include <shellapi.h> +> +144c148 +< #define kSignatureSearchLimit (1 << 22) +--- +> #define kSignatureSearchLimit (1 << 26) -diff --git a/lzma2107/Asm/arm64/7zAsm.S b/third_party/lzma_sdk/Asm/arm64/7zAsm.S -index 67d650d9a7c22..aa30a9ef8bf34 100644 ---- a/lzma2107/Asm/arm64/7zAsm.S -+++ b/third_party/lzma_sdk/Asm/arm64/7zAsm.S -@@ -37,6 +37,19 @@ - #define REG_ABI_PARAM_1 r1 - #define REG_ABI_PARAM_2 r2 - -+// The .note.gnu.property section is required because Chromium Android builds -+// utilize the linker flag force-bti. -+.pushsection .note.gnu.property, "a" -+.balign 8 -+.long 4 -+.long 0x10 -+.long 0x5 -+.asciz "GNU" -+.long 0xc0000000 -+.long 4 -+.long ((1 << 0 ) | (1 << 1)) -+.long 0 -+.popsection - - .macro p2_add reg:req, param:req - add \reg, \reg, \param -diff --git a/lzma2107/Asm/x86/7zAsm.asm b/third_party/lzma_sdk/Asm/x86/7zAsm.asm -index 9ca25bccd28cf..df2d4cf5820da 100644 ---- a/lzma2107/Asm/x86/7zAsm.asm -+++ b/third_party/lzma_sdk/Asm/x86/7zAsm.asm -@@ -47,7 +47,7 @@ MY_ASM_START macro - else - .386 - .model flat -- _TEXT$00 SEGMENT PARA PUBLIC 'CODE' -+ SEVENZ SEGMENT PARA PUBLIC 'CODE' - endif - endm - -diff --git a/lzma2107/Asm/x86/LzmaDecOpt.asm b/third_party/lzma_sdk/Asm/x86/LzmaDecOpt.asm -index 7e08acc639743..ddbd88ffc2e95 100644 ---- a/lzma2107/Asm/x86/LzmaDecOpt.asm -+++ b/third_party/lzma_sdk/Asm/x86/LzmaDecOpt.asm -@@ -17,7 +17,7 @@ include 7zAsm.asm - - MY_ASM_START - --_TEXT$LZMADECOPT SEGMENT ALIGN(64) 'CODE' -+LZMADEC SEGMENT ALIGN(64) 'CODE' - - MY_ALIGN macro num:req - align num -@@ -1298,6 +1298,6 @@ fin: - MY_POP_PRESERVED_ABI_REGS - MY_ENDP - --_TEXT$LZMADECOPT ENDS -+LZMADEC ENDS - - end
diff --git a/third_party/lzma_sdk/chromium_ubsan.patch b/third_party/lzma_sdk/chromium_ubsan.patch deleted file mode 100644 index 42bb013f..0000000 --- a/third_party/lzma_sdk/chromium_ubsan.patch +++ /dev/null
@@ -1,25 +0,0 @@ -diff --git a/third_party/lzma_sdk/C/CpuArch.h b/third_party/lzma_sdk/C/CpuArch.h -index 4856fbb12a256..8cd55bea48dc6 100644 ---- a/third_party/lzma_sdk/C/CpuArch.h -+++ b/third_party/lzma_sdk/C/CpuArch.h -@@ -253,6 +253,12 @@ MY_CPU_64BIT means that processor can work with 64-bit registers. - - - -+// Disable MY_CPU_LE_UNALIGN. Although the underlying ISA may be able to load -+// unaligned words, doing so via pointer casts is undefined behavior in C and -+// C++, under both strict aliasing and because it is invalid to construct -+// unaligned pointers. Instead, load the bytes generically and leave optimizing -+// this to the compiler. -+#if 0 - #ifdef MY_CPU_LE - #if defined(MY_CPU_X86_OR_AMD64) \ - || defined(MY_CPU_ARM64) -@@ -264,6 +270,7 @@ MY_CPU_64BIT means that processor can work with 64-bit registers. - #define MY_CPU_LE_UNALIGN - #endif - #endif -+#endif - - - #ifdef MY_CPU_LE_UNALIGN
diff --git a/third_party/lzma_sdk/google/seven_zip_reader.cc b/third_party/lzma_sdk/google/seven_zip_reader.cc index c246ae4..8b217df 100644 --- a/third_party/lzma_sdk/google/seven_zip_reader.cc +++ b/third_party/lzma_sdk/google/seven_zip_reader.cc
@@ -209,7 +209,7 @@ look_stream_buffer_.reset(look_stream_.buf); look_stream_.bufSize = kStreamBufferSize; - LookToRead2_Init(&look_stream_); + LookToRead2_INIT(&look_stream_); // The destructor assumes that `stream_` is valid whenever `db_` is // initialized.
diff --git a/third_party/lzma_sdk/google/seven_zip_reader_unittest.cc b/third_party/lzma_sdk/google/seven_zip_reader_unittest.cc index ed96d57a..3f4cbf40 100644 --- a/third_party/lzma_sdk/google/seven_zip_reader_unittest.cc +++ b/third_party/lzma_sdk/google/seven_zip_reader_unittest.cc
@@ -47,6 +47,7 @@ #include "base/files/file_util.h" #include "base/logging.h" #include "base/path_service.h" +#include "build/build_config.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" @@ -356,8 +357,15 @@ std::array<uint32_t, 2048> crc_table_; }; +// TODO(crbug.com/388538957): Make this work on ARM64, which uses a different +// number of tables and the crc32b instruction. +#if defined(ARCH_CPU_ARM64) +#define MAYBE_EmptyCrcWithFakeTable DISABLED_EmptyCrcWithFakeTable +#else +#define MAYBE_EmptyCrcWithFakeTable EmptyCrcWithFakeTable +#endif // This is useful functionality for the fuzzer, so we test it here. -TEST_F(SevenZipReaderFakeCrcTableTest, EmptyCrcWithFakeTable) { +TEST_F(SevenZipReaderFakeCrcTableTest, MAYBE_EmptyCrcWithFakeTable) { base::File file = OpenTestFile(FILE_PATH_LITERAL("fake_crc_table.7z")); ASSERT_TRUE(file.IsValid());
diff --git a/third_party/perfetto b/third_party/perfetto index a49395d..0893e2a 160000 --- a/third_party/perfetto +++ b/third_party/perfetto
@@ -1 +1 @@ -Subproject commit a49395d104cee4a11408de2a0b8cde127ba67b5f +Subproject commit 0893e2af69caf8592f6e38f34ccdd4ad6615de9d
diff --git a/third_party/rust/chromium_crates_io/Cargo.lock b/third_party/rust/chromium_crates_io/Cargo.lock index bb44bca..2782411 100644 --- a/third_party/rust/chromium_crates_io/Cargo.lock +++ b/third_party/rust/chromium_crates_io/Cargo.lock
@@ -615,7 +615,7 @@ [[package]] name = "skrifa" -version = "0.26.3" +version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytemuck",
diff --git a/third_party/rust/chromium_crates_io/supply-chain/audits.toml b/third_party/rust/chromium_crates_io/supply-chain/audits.toml index b393d5f..f5af23c584 100644 --- a/third_party/rust/chromium_crates_io/supply-chain/audits.toml +++ b/third_party/rust/chromium_crates_io/supply-chain/audits.toml
@@ -2654,6 +2654,12 @@ delta = "0.24.1 -> 0.26.3" notes = "Support for fonts that rely on hinting (like FreeType's \"tricky\" font detection). Overflow fixes, cycle detection in autohinting. cff overflow fixes." +[[audits.skrifa]] +who = "Dominik Röttsches <drott@chromium.org>" +criteria = ["safe-to-deploy", "does-not-implement-crypto", "ub-risk-0"] +delta = "0.26.3 -> 0.26.4" +notes = "Improvements for computing advances for hinted variable fonts, when hvar is missing." + [[audits.small_ctor]] who = "danakj@chromium.org" criteria = ["safe-to-run", "does-not-implement-crypto"]
diff --git a/third_party/rust/chromium_crates_io/supply-chain/config.toml b/third_party/rust/chromium_crates_io/supply-chain/config.toml index 6066856..0e86140 100644 --- a/third_party/rust/chromium_crates_io/supply-chain/config.toml +++ b/third_party/rust/chromium_crates_io/supply-chain/config.toml
@@ -266,7 +266,7 @@ [policy."simd-adler32:0.3.7"] criteria = ["crypto-safe", "safe-to-deploy", "ub-risk-2"] -[policy."skrifa:0.26.3"] +[policy."skrifa:0.26.4"] criteria = ["crypto-safe", "safe-to-deploy", "ub-risk-2"] [policy."small_ctor:0.1.2"]
diff --git a/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/.cargo_vcs_info.json b/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/.cargo_vcs_info.json deleted file mode 100644 index 1e152a4..0000000 --- a/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/.cargo_vcs_info.json +++ /dev/null
@@ -1,6 +0,0 @@ -{ - "git": { - "sha1": "4746916dcbef5b8772082b7275bb9480b2ed4d35" - }, - "path_in_vcs": "skrifa" -} \ No newline at end of file
diff --git a/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/.cargo-checksum.json b/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/.cargo-checksum.json similarity index 100% rename from third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/.cargo-checksum.json rename to third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/.cargo-checksum.json
diff --git a/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/.cargo_vcs_info.json b/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/.cargo_vcs_info.json new file mode 100644 index 0000000..26b636e --- /dev/null +++ b/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/.cargo_vcs_info.json
@@ -0,0 +1,6 @@ +{ + "git": { + "sha1": "39cf22e27f859b72c536610529ef67ba002c1e3f" + }, + "path_in_vcs": "skrifa" +} \ No newline at end of file
diff --git a/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/Cargo.lock b/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/Cargo.lock new file mode 100644 index 0000000..1fa9c76 --- /dev/null +++ b/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/Cargo.lock
@@ -0,0 +1,237 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "arrayvec" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" + +[[package]] +name = "bytemuck" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d6d68c57235a3a081186990eca2867354726650f42f7516ca50c28d6281fd15" +dependencies = [ + "bytemuck_derive", +] + +[[package]] +name = "bytemuck_derive" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4da9a32f3fed317401fa3c862968128267c3106685286e15d5aaa3d7389c2f60" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "core_maths" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3b02505ccb8c50b0aa21ace0fc08c3e53adebd4e58caa18a36152803c7709a3" +dependencies = [ + "libm", +] + +[[package]] +name = "diff" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8" + +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + +[[package]] +name = "font-types" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11c3a23a5a151afb1f74ea797f8c300dee41eff9ee3cb1bf94ed316d860c46b3" +dependencies = [ + "bytemuck", + "serde", +] + +[[package]] +name = "hashbrown" +version = "0.14.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" + +[[package]] +name = "indexmap" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68b900aa2f7301e21c36462b170ee99994de34dff39a4a6a528e80e7376d07e5" +dependencies = [ + "equivalent", + "hashbrown", +] + +[[package]] +name = "itoa" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" + +[[package]] +name = "kurbo" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e5aa9f0f96a938266bdb12928a67169e8d22c6a786fda8ed984b85e6ba93c3c" +dependencies = [ + "arrayvec", + "smallvec", +] + +[[package]] +name = "libm" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" + +[[package]] +name = "log" +version = "0.4.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" + +[[package]] +name = "pretty_assertions" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af7cee1a6c8a5b9208b3cb1061f10c0cb689087b3d8ce85fb9d2dd7a29b6ba66" +dependencies = [ + "diff", + "yansi", +] + +[[package]] +name = "proc-macro2" +version = "1.0.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e835ff2298f5721608eb1a980ecaee1aef2c132bf95ecc026a11b7bf3c01c02e" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "read-fonts" +version = "0.25.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f9e8a4f503e5c8750e4cd3b32a4e090035c46374b305a15c70bad833dca05f" +dependencies = [ + "bytemuck", + "core_maths", + "font-types", + "serde", +] + +[[package]] +name = "ryu" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" + +[[package]] +name = "serde" +version = "1.0.197" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fb1c873e1b9b056a4dc4c0c198b24c3ffa059243875552b2bd0933b1aee4ce2" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.197" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.114" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5f09b1bd632ef549eaa9f60a1f8de742bdbc698e6cee2095fc84dde5f549ae0" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "skrifa" +version = "0.26.4" +dependencies = [ + "bytemuck", + "core_maths", + "kurbo", + "pretty_assertions", + "read-fonts", + "serde", + "serde_json", + "write-fonts", +] + +[[package]] +name = "smallvec" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7" + +[[package]] +name = "syn" +version = "2.0.52" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b699d15b36d1f02c3e7c69f8ffef53de37aefae075d8488d4ba1a7788d574a07" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "unicode-ident" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" + +[[package]] +name = "write-fonts" +version = "0.33.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e4569c5d3e6a8ca11632efeb1f13105663e3643a77de21d3dbc1a7c2ed80a10" +dependencies = [ + "font-types", + "indexmap", + "kurbo", + "log", + "read-fonts", +] + +[[package]] +name = "yansi" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec"
diff --git a/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/Cargo.toml b/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/Cargo.toml similarity index 96% rename from third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/Cargo.toml rename to third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/Cargo.toml index 4b6c3a5..52d77251 100644 --- a/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/Cargo.toml +++ b/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/Cargo.toml
@@ -12,8 +12,9 @@ [package] edition = "2021" name = "skrifa" -version = "0.26.3" +version = "0.26.4" build = false +autolib = false autobins = false autoexamples = false autotests = false @@ -67,7 +68,7 @@ version = "1.0" [dev-dependencies.write-fonts] -version = "0.33.0" +version = "0.33.1" [features] autohint_shaping = []
diff --git a/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/Cargo.toml.orig b/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/Cargo.toml.orig similarity index 98% rename from third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/Cargo.toml.orig rename to third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/Cargo.toml.orig index 49bdacce..da0b2e4 100644 --- a/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/Cargo.toml.orig +++ b/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/Cargo.toml.orig
@@ -1,6 +1,6 @@ [package] name = "skrifa" -version = "0.26.3" +version = "0.26.4" description = "Metadata reader and glyph scaler for OpenType fonts." readme = "README.md" categories = ["text-processing", "parsing", "graphics"]
diff --git a/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/LICENSE-APACHE b/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/LICENSE-APACHE similarity index 100% rename from third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/LICENSE-APACHE rename to third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/LICENSE-APACHE
diff --git a/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/LICENSE-MIT b/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/LICENSE-MIT similarity index 100% rename from third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/LICENSE-MIT rename to third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/LICENSE-MIT
diff --git a/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/README.md b/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/README.md similarity index 100% rename from third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/README.md rename to third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/README.md
diff --git a/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/generated/generated_autohint_styles.rs b/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/generated/generated_autohint_styles.rs similarity index 100% rename from third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/generated/generated_autohint_styles.rs rename to third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/generated/generated_autohint_styles.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/scripts/gen_autohint_styles.py b/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/scripts/gen_autohint_styles.py similarity index 100% rename from third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/scripts/gen_autohint_styles.py rename to third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/scripts/gen_autohint_styles.py
diff --git a/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/attribute.rs b/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/attribute.rs similarity index 100% rename from third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/attribute.rs rename to third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/attribute.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/charmap.rs b/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/charmap.rs similarity index 100% rename from third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/charmap.rs rename to third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/charmap.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/collections.rs b/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/collections.rs similarity index 100% rename from third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/collections.rs rename to third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/collections.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/color/instance.rs b/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/color/instance.rs similarity index 100% rename from third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/color/instance.rs rename to third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/color/instance.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/color/mod.rs b/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/color/mod.rs similarity index 100% rename from third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/color/mod.rs rename to third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/color/mod.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/color/transform.rs b/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/color/transform.rs similarity index 100% rename from third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/color/transform.rs rename to third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/color/transform.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/color/traversal.rs b/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/color/traversal.rs similarity index 100% rename from third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/color/traversal.rs rename to third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/color/traversal.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/color/traversal_tests/mod.rs b/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/color/traversal_tests/mod.rs similarity index 100% rename from third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/color/traversal_tests/mod.rs rename to third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/color/traversal_tests/mod.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/color/traversal_tests/test_glyph_defs.rs b/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/color/traversal_tests/test_glyph_defs.rs similarity index 100% rename from third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/color/traversal_tests/test_glyph_defs.rs rename to third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/color/traversal_tests/test_glyph_defs.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/font.rs b/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/font.rs similarity index 100% rename from third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/font.rs rename to third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/font.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/instance.rs b/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/instance.rs similarity index 100% rename from third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/instance.rs rename to third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/instance.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/lib.rs b/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/lib.rs similarity index 100% rename from third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/lib.rs rename to third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/lib.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/metrics.rs b/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/metrics.rs similarity index 100% rename from third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/metrics.rs rename to third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/metrics.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/autohint/hint/edges.rs b/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/autohint/hint/edges.rs similarity index 100% rename from third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/autohint/hint/edges.rs rename to third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/autohint/hint/edges.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/autohint/hint/mod.rs b/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/autohint/hint/mod.rs similarity index 100% rename from third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/autohint/hint/mod.rs rename to third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/autohint/hint/mod.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/autohint/hint/outline.rs b/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/autohint/hint/outline.rs similarity index 100% rename from third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/autohint/hint/outline.rs rename to third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/autohint/hint/outline.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/autohint/instance.rs b/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/autohint/instance.rs similarity index 100% rename from third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/autohint/instance.rs rename to third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/autohint/instance.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/autohint/metrics/blues.rs b/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/autohint/metrics/blues.rs similarity index 100% rename from third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/autohint/metrics/blues.rs rename to third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/autohint/metrics/blues.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/autohint/metrics/mod.rs b/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/autohint/metrics/mod.rs similarity index 100% rename from third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/autohint/metrics/mod.rs rename to third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/autohint/metrics/mod.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/autohint/metrics/scale.rs b/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/autohint/metrics/scale.rs similarity index 100% rename from third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/autohint/metrics/scale.rs rename to third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/autohint/metrics/scale.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/autohint/metrics/widths.rs b/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/autohint/metrics/widths.rs similarity index 100% rename from third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/autohint/metrics/widths.rs rename to third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/autohint/metrics/widths.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/autohint/mod.rs b/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/autohint/mod.rs similarity index 100% rename from third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/autohint/mod.rs rename to third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/autohint/mod.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/autohint/outline.rs b/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/autohint/outline.rs similarity index 100% rename from third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/autohint/outline.rs rename to third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/autohint/outline.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/autohint/shape.rs b/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/autohint/shape.rs similarity index 100% rename from third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/autohint/shape.rs rename to third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/autohint/shape.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/autohint/style.rs b/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/autohint/style.rs similarity index 100% rename from third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/autohint/style.rs rename to third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/autohint/style.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/autohint/topo/edges.rs b/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/autohint/topo/edges.rs similarity index 100% rename from third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/autohint/topo/edges.rs rename to third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/autohint/topo/edges.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/autohint/topo/mod.rs b/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/autohint/topo/mod.rs similarity index 100% rename from third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/autohint/topo/mod.rs rename to third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/autohint/topo/mod.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/autohint/topo/segments.rs b/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/autohint/topo/segments.rs similarity index 100% rename from third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/autohint/topo/segments.rs rename to third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/autohint/topo/segments.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/cff/hint.rs b/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/cff/hint.rs similarity index 100% rename from third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/cff/hint.rs rename to third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/cff/hint.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/cff/mod.rs b/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/cff/mod.rs similarity index 100% rename from third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/cff/mod.rs rename to third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/cff/mod.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/error.rs b/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/error.rs similarity index 100% rename from third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/error.rs rename to third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/error.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/glyf/deltas.rs b/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/glyf/deltas.rs similarity index 93% rename from third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/glyf/deltas.rs rename to third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/glyf/deltas.rs index 237716c..a4d6bd04 100644 --- a/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/glyf/deltas.rs +++ b/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/glyf/deltas.rs
@@ -11,11 +11,21 @@ use super::PHANTOM_POINT_COUNT; +#[derive(Copy, Clone, Debug)] +pub(super) enum AvailableVarMetrics { + /// Full variable metrics with advances and side-bearings. + All, + /// Variable advances but not side-bearings. + Advances, + /// No variable metrics table. + None, +} + /// Compute a set of deltas for the component offsets of a composite glyph. /// /// Interpolation is meaningless for component offsets so this is a /// specialized function that skips the expensive bits. -pub fn composite_glyph<D: PointCoord>( +pub(super) fn composite_glyph<D: PointCoord>( gvar: &Gvar, glyph_id: GlyphId, coords: &[F2Dot14], @@ -33,7 +43,7 @@ Ok(()) } -pub struct SimpleGlyph<'a, C: PointCoord> { +pub(super) struct SimpleGlyph<'a, C: PointCoord> { pub points: &'a [Point<C>], pub flags: &'a mut [PointFlags], pub contours: &'a [u16], @@ -44,11 +54,11 @@ /// This function will use interpolation to infer missing deltas for tuples /// that contain sparse sets. The `iup_buffer` buffer is temporary storage /// used for this and the length must be >= glyph.points.len(). -pub fn simple_glyph<C, D>( +pub(super) fn simple_glyph<C, D>( gvar: &Gvar, glyph_id: GlyphId, coords: &[F2Dot14], - has_var_lsb: bool, + var_metrics: AvailableVarMetrics, glyph: SimpleGlyph<C>, iup_buffer: &mut [Point<D>], deltas: &mut [Point<D>], @@ -73,13 +83,15 @@ flags, contours, } = glyph; - // Include the first phantom point if the font is missing variable metrics - // for left side bearings. The adjustment made here may affect the final - // shift of the outline. - let actual_len = if has_var_lsb { - points.len() - 4 - } else { - points.len() - 3 + // Determine which phantom points to modify based on the presence and + // content of the HVAR table. + let actual_len = match var_metrics { + // Modify LSB and advance + AvailableVarMetrics::None => points.len() - 2, + // Modify only LSB + AvailableVarMetrics::Advances => points.len() - 3, + // Modify nothing + AvailableVarMetrics::All => points.len() - PHANTOM_POINT_COUNT, }; let deltas = &mut deltas[..actual_len]; compute_deltas_for_glyph(gvar, glyph_id, coords, deltas, |scalar, tuple, deltas| {
diff --git a/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/glyf/hint/call_stack.rs b/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/glyf/hint/call_stack.rs similarity index 100% rename from third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/glyf/hint/call_stack.rs rename to third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/glyf/hint/call_stack.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/glyf/hint/cow_slice.rs b/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/glyf/hint/cow_slice.rs similarity index 100% rename from third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/glyf/hint/cow_slice.rs rename to third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/glyf/hint/cow_slice.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/glyf/hint/cvt.rs b/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/glyf/hint/cvt.rs similarity index 100% rename from third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/glyf/hint/cvt.rs rename to third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/glyf/hint/cvt.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/glyf/hint/definition.rs b/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/glyf/hint/definition.rs similarity index 100% rename from third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/glyf/hint/definition.rs rename to third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/glyf/hint/definition.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/glyf/hint/engine/arith.rs b/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/glyf/hint/engine/arith.rs similarity index 100% rename from third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/glyf/hint/engine/arith.rs rename to third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/glyf/hint/engine/arith.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/glyf/hint/engine/control_flow.rs b/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/glyf/hint/engine/control_flow.rs similarity index 100% rename from third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/glyf/hint/engine/control_flow.rs rename to third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/glyf/hint/engine/control_flow.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/glyf/hint/engine/cvt.rs b/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/glyf/hint/engine/cvt.rs similarity index 100% rename from third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/glyf/hint/engine/cvt.rs rename to third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/glyf/hint/engine/cvt.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/glyf/hint/engine/data.rs b/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/glyf/hint/engine/data.rs similarity index 100% rename from third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/glyf/hint/engine/data.rs rename to third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/glyf/hint/engine/data.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/glyf/hint/engine/definition.rs b/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/glyf/hint/engine/definition.rs similarity index 100% rename from third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/glyf/hint/engine/definition.rs rename to third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/glyf/hint/engine/definition.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/glyf/hint/engine/delta.rs b/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/glyf/hint/engine/delta.rs similarity index 100% rename from third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/glyf/hint/engine/delta.rs rename to third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/glyf/hint/engine/delta.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/glyf/hint/engine/dispatch.rs b/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/glyf/hint/engine/dispatch.rs similarity index 100% rename from third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/glyf/hint/engine/dispatch.rs rename to third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/glyf/hint/engine/dispatch.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/glyf/hint/engine/graphics.rs b/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/glyf/hint/engine/graphics.rs similarity index 100% rename from third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/glyf/hint/engine/graphics.rs rename to third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/glyf/hint/engine/graphics.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/glyf/hint/engine/logical.rs b/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/glyf/hint/engine/logical.rs similarity index 100% rename from third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/glyf/hint/engine/logical.rs rename to third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/glyf/hint/engine/logical.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/glyf/hint/engine/misc.rs b/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/glyf/hint/engine/misc.rs similarity index 100% rename from third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/glyf/hint/engine/misc.rs rename to third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/glyf/hint/engine/misc.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/glyf/hint/engine/mod.rs b/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/glyf/hint/engine/mod.rs similarity index 100% rename from third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/glyf/hint/engine/mod.rs rename to third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/glyf/hint/engine/mod.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/glyf/hint/engine/outline.rs b/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/glyf/hint/engine/outline.rs similarity index 100% rename from third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/glyf/hint/engine/outline.rs rename to third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/glyf/hint/engine/outline.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/glyf/hint/engine/round.rs b/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/glyf/hint/engine/round.rs similarity index 100% rename from third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/glyf/hint/engine/round.rs rename to third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/glyf/hint/engine/round.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/glyf/hint/engine/stack.rs b/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/glyf/hint/engine/stack.rs similarity index 100% rename from third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/glyf/hint/engine/stack.rs rename to third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/glyf/hint/engine/stack.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/glyf/hint/engine/storage.rs b/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/glyf/hint/engine/storage.rs similarity index 100% rename from third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/glyf/hint/engine/storage.rs rename to third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/glyf/hint/engine/storage.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/glyf/hint/error.rs b/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/glyf/hint/error.rs similarity index 100% rename from third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/glyf/hint/error.rs rename to third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/glyf/hint/error.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/glyf/hint/graphics.rs b/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/glyf/hint/graphics.rs similarity index 100% rename from third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/glyf/hint/graphics.rs rename to third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/glyf/hint/graphics.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/glyf/hint/instance.rs b/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/glyf/hint/instance.rs similarity index 100% rename from third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/glyf/hint/instance.rs rename to third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/glyf/hint/instance.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/glyf/hint/math.rs b/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/glyf/hint/math.rs similarity index 100% rename from third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/glyf/hint/math.rs rename to third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/glyf/hint/math.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/glyf/hint/mod.rs b/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/glyf/hint/mod.rs similarity index 100% rename from third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/glyf/hint/mod.rs rename to third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/glyf/hint/mod.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/glyf/hint/program.rs b/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/glyf/hint/program.rs similarity index 100% rename from third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/glyf/hint/program.rs rename to third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/glyf/hint/program.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/glyf/hint/projection.rs b/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/glyf/hint/projection.rs similarity index 100% rename from third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/glyf/hint/projection.rs rename to third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/glyf/hint/projection.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/glyf/hint/round.rs b/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/glyf/hint/round.rs similarity index 100% rename from third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/glyf/hint/round.rs rename to third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/glyf/hint/round.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/glyf/hint/storage.rs b/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/glyf/hint/storage.rs similarity index 100% rename from third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/glyf/hint/storage.rs rename to third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/glyf/hint/storage.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/glyf/hint/value_stack.rs b/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/glyf/hint/value_stack.rs similarity index 100% rename from third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/glyf/hint/value_stack.rs rename to third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/glyf/hint/value_stack.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/glyf/hint/zone.rs b/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/glyf/hint/zone.rs similarity index 100% rename from third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/glyf/hint/zone.rs rename to third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/glyf/hint/zone.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/glyf/memory.rs b/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/glyf/memory.rs similarity index 100% rename from third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/glyf/memory.rs rename to third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/glyf/memory.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/glyf/mod.rs b/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/glyf/mod.rs similarity index 93% rename from third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/glyf/mod.rs rename to third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/glyf/mod.rs index 31c228f..b3e6acaf 100644 --- a/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/glyf/mod.rs +++ b/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/glyf/mod.rs
@@ -9,6 +9,7 @@ #[allow(unused_imports)] use core_maths::CoreFloat; +use deltas::AvailableVarMetrics; pub use hint::{HintError, HintInstance, HintOutline}; pub use outline::{Outline, ScaledOutline}; use raw::FontRef; @@ -53,7 +54,7 @@ glyph_count: u16, units_per_em: u16, os2_vmetrics: [i16; 2], - has_var_lsb: bool, + var_metrics: AvailableVarMetrics, prefer_interpreter: bool, } @@ -62,11 +63,16 @@ let loca = font.loca(None).ok()?; let glyf = font.glyf().ok()?; let glyph_metrics = GlyphHMetrics::new(font)?; - let has_var_lsb = glyph_metrics - .hvar - .as_ref() - .map(|hvar| hvar.lsb_mapping().is_some()) - .unwrap_or_default(); + let var_metrics = match glyph_metrics.hvar.as_ref() { + Some(hvar) => { + if hvar.lsb_mapping().is_some() { + AvailableVarMetrics::All + } else { + AvailableVarMetrics::Advances + } + } + None => AvailableVarMetrics::None, + }; let ( glyph_count, max_function_defs, @@ -131,7 +137,7 @@ glyph_count, units_per_em: font.head().ok()?.units_per_em(), os2_vmetrics, - has_var_lsb, + var_metrics, prefer_interpreter, }) } @@ -597,7 +603,7 @@ gvar, glyph_id, self.coords, - self.outlines.has_var_lsb, + self.outlines.var_metrics, glyph, iup_buffer, deltas, @@ -742,11 +748,14 @@ .get_mut(delta_base..delta_base + count) .ok_or(InsufficientMemory)?; if deltas::composite_glyph(gvar, glyph_id, self.coords, &mut deltas[..]).is_ok() { - // If the font is missing variation data for LSBs in HVAR then we - // apply the delta to the first phantom point. - if !self.outlines.has_var_lsb { - self.phantom[0].x += F26Dot6::from_bits(deltas[count - 4].x.to_i32()); - } + // Apply selective deltas to phantom points. + self.outlines.var_metrics.phantom_deltas( + &mut self.phantom, + deltas, + |phantom, delta| { + phantom.x += F26Dot6::from_bits(delta.x.to_i32()); + }, + ); have_deltas = true; } self.component_delta_count += count; @@ -1107,7 +1116,7 @@ gvar, glyph_id, self.coords, - self.outlines.has_var_lsb, + self.outlines.var_metrics, glyph, iup_buffer, deltas, @@ -1159,11 +1168,14 @@ .get_mut(delta_base..delta_base + count) .ok_or(InsufficientMemory)?; if deltas::composite_glyph(gvar, glyph_id, self.coords, &mut deltas[..]).is_ok() { - // If the font is missing variation data for LSBs in HVAR then we - // apply the delta to the first phantom point. - if !self.outlines.has_var_lsb { - self.phantom[0].x += deltas[count - 4].x; - } + // Apply selective deltas to phantom points. + self.outlines.var_metrics.phantom_deltas( + &mut self.phantom, + deltas, + |phantom, delta| { + phantom.x += delta.x; + }, + ); have_deltas = true; } self.component_delta_count += count; @@ -1277,6 +1289,28 @@ } } +impl AvailableVarMetrics { + /// Calls `f` for each combination of phantom point and its associated + /// delta based on the available metrics present in `self`. + fn phantom_deltas<P, D>( + self, + phantom: &mut [Point<P>; 4], + deltas: &[Point<D>], + f: impl Fn(&mut Point<P>, &Point<D>), + ) { + match self { + Self::None => { + f(&mut phantom[0], &deltas[deltas.len() - 4]); + f(&mut phantom[1], &deltas[deltas.len() - 3]); + } + Self::Advances => { + f(&mut phantom[0], &deltas[deltas.len() - 4]); + } + Self::All => {} + } + } +} + #[cfg(test)] mod tests { use super::*; @@ -1328,8 +1362,9 @@ FreeTypeScaler::unhinted(&outlines, &outline, &mut buf, ppem, &coords).unwrap(); let scaled = scaler.scale(&outline.glyph, gid).unwrap(); let advance_hvar = scaled.adjusted_advance_width(); - // Set HVAR table to None to force loading metrics from gvar + // Set HVAR to None and mark var metrics as missing so we pull deltas from gvar outlines.glyph_metrics.hvar = None; + outlines.var_metrics = AvailableVarMetrics::None; let scaler = FreeTypeScaler::unhinted(&outlines, &outline, &mut buf, ppem, &coords).unwrap(); let scaled = scaler.scale(&outline.glyph, gid).unwrap(); @@ -1348,4 +1383,31 @@ assert!(outline.glyph.is_none()); assert_eq!(outline.points, PHANTOM_POINT_COUNT); } + + // Pull metric deltas from gvar when hvar is not present + // <https://github.com/googlefonts/fontations/issues/1311> + #[test] + fn missing_hvar_advance() { + let font = FontRef::new(font_test_data::HVAR_WITH_TRUNCATED_ADVANCE_INDEX_MAP).unwrap(); + let mut outlines = Outlines::new(&font).unwrap(); + let coords = [F2Dot14::from_f32(0.5)]; + let ppem = Some(24.0); + let gid = font.charmap().map('A').unwrap(); + let outline = outlines.outline(gid).unwrap(); + let mut buf = [0u8; 1024]; + let scaler = + FreeTypeScaler::unhinted(&outlines, &outline, &mut buf, ppem, &coords).unwrap(); + let scaled = scaler.scale(&outline.glyph, gid).unwrap(); + let advance_hvar = scaled.adjusted_advance_width(); + // Set HVAR to None and mark var metrics as missing so we pull deltas from gvar + outlines.glyph_metrics.hvar = None; + outlines.var_metrics = AvailableVarMetrics::None; + let scaler = + FreeTypeScaler::unhinted(&outlines, &outline, &mut buf, ppem, &coords).unwrap(); + let scaled = scaler.scale(&outline.glyph, gid).unwrap(); + let advance_gvar = scaled.adjusted_advance_width(); + // Make sure we have an advance and that the two are the same + assert!(advance_hvar != F26Dot6::ZERO); + assert_eq!(advance_hvar, advance_gvar); + } }
diff --git a/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/glyf/outline.rs b/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/glyf/outline.rs similarity index 100% rename from third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/glyf/outline.rs rename to third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/glyf/outline.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/hint.rs b/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/hint.rs similarity index 100% rename from third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/hint.rs rename to third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/hint.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/hint_reliant.rs b/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/hint_reliant.rs similarity index 100% rename from third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/hint_reliant.rs rename to third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/hint_reliant.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/metrics.rs b/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/metrics.rs similarity index 100% rename from third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/metrics.rs rename to third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/metrics.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/mod.rs b/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/mod.rs similarity index 100% rename from third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/mod.rs rename to third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/mod.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/path.rs b/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/path.rs similarity index 100% rename from third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/path.rs rename to third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/path.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/pen.rs b/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/pen.rs similarity index 100% rename from third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/pen.rs rename to third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/pen.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/testing.rs b/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/testing.rs similarity index 100% rename from third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/testing.rs rename to third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/testing.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/unscaled.rs b/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/unscaled.rs similarity index 100% rename from third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/unscaled.rs rename to third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/unscaled.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/provider.rs b/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/provider.rs similarity index 100% rename from third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/provider.rs rename to third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/provider.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/setting.rs b/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/setting.rs similarity index 100% rename from third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/setting.rs rename to third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/setting.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/string.rs b/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/string.rs similarity index 100% rename from third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/string.rs rename to third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/string.rs
diff --git a/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/variation.rs b/third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/variation.rs similarity index 100% rename from third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/variation.rs rename to third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/variation.rs
diff --git a/third_party/rust/skrifa/v0_26/BUILD.gn b/third_party/rust/skrifa/v0_26/BUILD.gn index ef4f8f7..3d7d925 100644 --- a/third_party/rust/skrifa/v0_26/BUILD.gn +++ b/third_party/rust/skrifa/v0_26/BUILD.gn
@@ -13,91 +13,91 @@ epoch = "0.26" crate_type = "rlib" crate_root = - "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/lib.rs" + "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/lib.rs" sources = [ - "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/attribute.rs", - "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/charmap.rs", - "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/collections.rs", - "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/color/instance.rs", - "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/color/mod.rs", - "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/color/transform.rs", - "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/color/traversal.rs", - "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/color/traversal_tests/mod.rs", - "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/color/traversal_tests/test_glyph_defs.rs", - "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/font.rs", - "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/instance.rs", - "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/lib.rs", - "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/metrics.rs", - "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/autohint/hint/edges.rs", - "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/autohint/hint/mod.rs", - "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/autohint/hint/outline.rs", - "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/autohint/instance.rs", - "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/autohint/metrics/blues.rs", - "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/autohint/metrics/mod.rs", - "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/autohint/metrics/scale.rs", - "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/autohint/metrics/widths.rs", - "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/autohint/mod.rs", - "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/autohint/outline.rs", - "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/autohint/shape.rs", - "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/autohint/style.rs", - "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/autohint/topo/edges.rs", - "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/autohint/topo/mod.rs", - "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/autohint/topo/segments.rs", - "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/cff/hint.rs", - "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/cff/mod.rs", - "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/error.rs", - "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/glyf/deltas.rs", - "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/glyf/hint/call_stack.rs", - "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/glyf/hint/cow_slice.rs", - "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/glyf/hint/cvt.rs", - "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/glyf/hint/definition.rs", - "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/glyf/hint/engine/arith.rs", - "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/glyf/hint/engine/control_flow.rs", - "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/glyf/hint/engine/cvt.rs", - "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/glyf/hint/engine/data.rs", - "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/glyf/hint/engine/definition.rs", - "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/glyf/hint/engine/delta.rs", - "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/glyf/hint/engine/dispatch.rs", - "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/glyf/hint/engine/graphics.rs", - "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/glyf/hint/engine/logical.rs", - "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/glyf/hint/engine/misc.rs", - "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/glyf/hint/engine/mod.rs", - "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/glyf/hint/engine/outline.rs", - "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/glyf/hint/engine/round.rs", - "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/glyf/hint/engine/stack.rs", - "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/glyf/hint/engine/storage.rs", - "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/glyf/hint/error.rs", - "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/glyf/hint/graphics.rs", - "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/glyf/hint/instance.rs", - "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/glyf/hint/math.rs", - "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/glyf/hint/mod.rs", - "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/glyf/hint/program.rs", - "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/glyf/hint/projection.rs", - "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/glyf/hint/round.rs", - "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/glyf/hint/storage.rs", - "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/glyf/hint/value_stack.rs", - "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/glyf/hint/zone.rs", - "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/glyf/memory.rs", - "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/glyf/mod.rs", - "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/glyf/outline.rs", - "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/hint.rs", - "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/hint_reliant.rs", - "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/metrics.rs", - "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/mod.rs", - "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/path.rs", - "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/pen.rs", - "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/testing.rs", - "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/outline/unscaled.rs", - "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/provider.rs", - "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/setting.rs", - "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/string.rs", - "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/variation.rs", + "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/attribute.rs", + "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/charmap.rs", + "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/collections.rs", + "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/color/instance.rs", + "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/color/mod.rs", + "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/color/transform.rs", + "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/color/traversal.rs", + "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/color/traversal_tests/mod.rs", + "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/color/traversal_tests/test_glyph_defs.rs", + "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/font.rs", + "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/instance.rs", + "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/lib.rs", + "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/metrics.rs", + "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/autohint/hint/edges.rs", + "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/autohint/hint/mod.rs", + "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/autohint/hint/outline.rs", + "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/autohint/instance.rs", + "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/autohint/metrics/blues.rs", + "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/autohint/metrics/mod.rs", + "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/autohint/metrics/scale.rs", + "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/autohint/metrics/widths.rs", + "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/autohint/mod.rs", + "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/autohint/outline.rs", + "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/autohint/shape.rs", + "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/autohint/style.rs", + "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/autohint/topo/edges.rs", + "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/autohint/topo/mod.rs", + "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/autohint/topo/segments.rs", + "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/cff/hint.rs", + "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/cff/mod.rs", + "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/error.rs", + "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/glyf/deltas.rs", + "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/glyf/hint/call_stack.rs", + "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/glyf/hint/cow_slice.rs", + "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/glyf/hint/cvt.rs", + "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/glyf/hint/definition.rs", + "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/glyf/hint/engine/arith.rs", + "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/glyf/hint/engine/control_flow.rs", + "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/glyf/hint/engine/cvt.rs", + "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/glyf/hint/engine/data.rs", + "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/glyf/hint/engine/definition.rs", + "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/glyf/hint/engine/delta.rs", + "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/glyf/hint/engine/dispatch.rs", + "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/glyf/hint/engine/graphics.rs", + "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/glyf/hint/engine/logical.rs", + "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/glyf/hint/engine/misc.rs", + "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/glyf/hint/engine/mod.rs", + "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/glyf/hint/engine/outline.rs", + "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/glyf/hint/engine/round.rs", + "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/glyf/hint/engine/stack.rs", + "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/glyf/hint/engine/storage.rs", + "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/glyf/hint/error.rs", + "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/glyf/hint/graphics.rs", + "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/glyf/hint/instance.rs", + "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/glyf/hint/math.rs", + "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/glyf/hint/mod.rs", + "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/glyf/hint/program.rs", + "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/glyf/hint/projection.rs", + "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/glyf/hint/round.rs", + "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/glyf/hint/storage.rs", + "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/glyf/hint/value_stack.rs", + "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/glyf/hint/zone.rs", + "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/glyf/memory.rs", + "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/glyf/mod.rs", + "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/glyf/outline.rs", + "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/hint.rs", + "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/hint_reliant.rs", + "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/metrics.rs", + "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/mod.rs", + "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/path.rs", + "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/pen.rs", + "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/testing.rs", + "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/outline/unscaled.rs", + "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/provider.rs", + "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/setting.rs", + "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/string.rs", + "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/variation.rs", ] - inputs = [ "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/src/../generated/generated_autohint_styles.rs" ] + inputs = [ "//third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/src/../generated/generated_autohint_styles.rs" ] build_native_rust_unit_tests = false edition = "2021" - cargo_pkg_version = "0.26.3" + cargo_pkg_version = "0.26.4" cargo_pkg_name = "skrifa" cargo_pkg_description = "Metadata reader and glyph scaler for OpenType fonts." library_configs -= [ "//build/config/compiler:chromium_code" ]
diff --git a/third_party/rust/skrifa/v0_26/README.chromium b/third_party/rust/skrifa/v0_26/README.chromium index 1a37e1bc..6ae68d5a4 100644 --- a/third_party/rust/skrifa/v0_26/README.chromium +++ b/third_party/rust/skrifa/v0_26/README.chromium
@@ -1,9 +1,9 @@ Name: skrifa URL: https://crates.io/crates/skrifa -Version: 0.26.3 -Revision: 4746916dcbef5b8772082b7275bb9480b2ed4d35 +Version: 0.26.4 +Revision: 39cf22e27f859b72c536610529ef67ba002c1e3f License: Apache-2.0 -License File: //third_party/rust/chromium_crates_io/vendor/skrifa-0.26.3/LICENSE-APACHE +License File: //third_party/rust/chromium_crates_io/vendor/skrifa-0.26.4/LICENSE-APACHE Shipped: yes Security Critical: yes
diff --git a/third_party/skia b/third_party/skia index 5f2e30e..dba7f46 160000 --- a/third_party/skia +++ b/third_party/skia
@@ -1 +1 @@ -Subproject commit 5f2e30e0c8bd00b2ff314a6c751ceac95fedb913 +Subproject commit dba7f46122ba3b1cdb8890eec92aa7b3534781b6
diff --git a/third_party/sqlite/BUILD.gn b/third_party/sqlite/BUILD.gn index ab826f4..881d9ea 100644 --- a/third_party/sqlite/BUILD.gn +++ b/third_party/sqlite/BUILD.gn
@@ -84,13 +84,15 @@ # This is to fuzz SQLite's resilience to database corruption. "SQLITE_ENABLE_DESERIALIZE", ] - - # The progress callback is used in fuzzing to cancel long-running queries - # so we don't spend too much time on them. - defines -= [ "SQLITE_OMIT_PROGRESS_CALLBACK" ] } } + if (use_fuzzing_engine) { + # The progress callback is used in fuzzing to cancel long-running queries + # so we don't spend too much time on them. + defines -= [ "SQLITE_OMIT_PROGRESS_CALLBACK" ] + } + if (is_debug || dcheck_always_on) { if (use_fuzzing_engine && use_sanitizer_coverage) { # Enable SQLite's assert() macros.
diff --git a/third_party/webgpu-cts/src b/third_party/webgpu-cts/src index 467b5f7..1874295 160000 --- a/third_party/webgpu-cts/src +++ b/third_party/webgpu-cts/src
@@ -1 +1 @@ -Subproject commit 467b5f74035710a7e94553d060ec73dbb4b50f13 +Subproject commit 18742954f642e134d9080840bdb2a884aad09776
diff --git a/third_party/webrtc b/third_party/webrtc index cdd2922..2c96934 160000 --- a/third_party/webrtc +++ b/third_party/webrtc
@@ -1 +1 @@ -Subproject commit cdd2922312848149a9954e3e7f7c327a9010afda +Subproject commit 2c96934699b1f75572f1dd6f508e85ab0c96a356
diff --git a/tools/clang/plugins/UnsafeBuffersPlugin.cpp b/tools/clang/plugins/UnsafeBuffersPlugin.cpp index c99d79e..b9d4a25 100644 --- a/tools/clang/plugins/UnsafeBuffersPlugin.cpp +++ b/tools/clang/plugins/UnsafeBuffersPlugin.cpp
@@ -15,10 +15,16 @@ namespace chrome_checker { -// Stores `true` if the filename (key) should be checked for errors, and `false` -// if it should not be. If the filename is not present, the choice is up to the -// plugin to determine from the path prefixes control file. -llvm::StringMap<bool> g_checked_files_cache; +enum Disposition { + kSkip = 0, // Do not check for any unsafe operations. + kSkipLibc, // Check for unsafe buffers but not unsafe libc calls. + kCheck, // Check for both unsafe buffers and unsafe libc calls. +}; + +// Stores whether the filename (key) should be checked for errors. +// If the filename is not present, the choice is up to the plugin to +// determine from the path prefixes control file. +llvm::StringMap<Disposition> g_checked_files_cache; struct CheckFilePrefixes { // `buffer` owns the memory for the strings in `prefix_map`. @@ -105,10 +111,13 @@ return; } - if (!(diag_id == clang::diag::warn_unsafe_buffer_libc_call || + const bool is_libc_diagnostic = + diag_id == clang::diag::warn_unsafe_buffer_libc_call || + diag_id == clang::diag::note_unsafe_buffer_printf_call; + + if (!(is_libc_diagnostic || diag_id == clang::diag::warn_unsafe_buffer_variable || diag_id == clang::diag::warn_unsafe_buffer_operation || - diag_id == clang::diag::note_unsafe_buffer_printf_call || diag_id == clang::diag::note_unsafe_buffer_operation || diag_id == clang::diag::note_unsafe_buffer_variable_fixit_group || diag_id == clang::diag::note_unsafe_buffer_variable_fixit_together || @@ -119,10 +128,9 @@ // Note that we promote from Remark directly to Error, rather than to // Warning, as -Werror will not get applied to whatever we choose here. const auto elevated_level = - (diag_id == clang::diag::warn_unsafe_buffer_libc_call || + (is_libc_diagnostic || diag_id == clang::diag::warn_unsafe_buffer_variable || - diag_id == clang::diag::warn_unsafe_buffer_operation || - diag_id == clang::diag::note_unsafe_buffer_printf_call) + diag_id == clang::diag::warn_unsafe_buffer_operation) ? (engine_->getWarningsAsErrors() ? clang::DiagnosticsEngine::Level::Error : clang::DiagnosticsEngine::Level::Warning) @@ -133,26 +141,29 @@ // -Wunsage-buffer-usage errors are omitted conditionally based on what file // they are coming from. - if (FileHasSafeBuffersWarnings(sm, loc)) { - // Elevate the Remark to a Warning, and pass along its Notes without - // changing them. Otherwise, do nothing, and the Remark (and its notes) - // will not be displayed. - // - // We don't count warnings/errors in this DiagnosticConsumer, so we don't - // call up to the base class here. Instead, whenever we pass through to - // the `next_` DiagnosticConsumer, we record its counts. - // - // Construct the StoredDiagnostic before Clear() or we get bad data from - // `diag`. - auto stored = clang::StoredDiagnostic(elevated_level, diag); - inside_handle_diagnostic_ = true; - engine_->Report(stored); - if (elevated_level != clang::DiagnosticsEngine::Level::Note) { - // For each warning, we inject our own Note as well, pointing to docs. - engine_->Report(loc, diag_note_link_); - } - inside_handle_diagnostic_ = false; + auto disposition = FileHasSafeBuffersWarnings(sm, loc); + if (disposition == kSkip || + (is_libc_diagnostic && disposition == kSkipLibc)) { + return; } + // Elevate the Remark to a Warning, and pass along its Notes without + // changing them. Otherwise, do nothing, and the Remark (and its notes) + // will not be displayed. + // + // We don't count warnings/errors in this DiagnosticConsumer, so we don't + // call up to the base class here. Instead, whenever we pass through to + // the `next_` DiagnosticConsumer, we record its counts. + // + // Construct the StoredDiagnostic before Clear() or we get bad data from + // `diag`. + auto stored = clang::StoredDiagnostic(elevated_level, diag); + inside_handle_diagnostic_ = true; + engine_->Report(stored); + if (elevated_level != clang::DiagnosticsEngine::Level::Note) { + // For each warning, we inject our own Note as well, pointing to docs. + engine_->Report(loc, diag_note_link_); + } + inside_handle_diagnostic_ = false; } private: @@ -167,8 +178,8 @@ // Depending on where the diagnostic is coming from, we may ignore it or // cause it to generate a warning. - bool FileHasSafeBuffersWarnings(const clang::SourceManager& sm, - clang::SourceLocation loc) { + Disposition FileHasSafeBuffersWarnings(const clang::SourceManager& sm, + clang::SourceLocation loc) { // ClassifySourceLocation() does not report kMacro as the location unless it // happens to be inside a scratch buffer, which not all macro use does. For // the unsafe-buffers warning, we want the SourceLocation where the macro is @@ -188,17 +199,13 @@ ClassifySourceLocation(instance_->getHeaderSearchOpts(), sm, loc); switch (loc_class) { case LocationClassification::kSystem: - return false; + return kSkip; case LocationClassification::kGenerated: - return false; + return kSkip; case LocationClassification::kThirdParty: - break; case LocationClassification::kChromiumThirdParty: - break; case LocationClassification::kFirstParty: - break; case LocationClassification::kBlink: - break; case LocationClassification::kMacro: break; } @@ -235,11 +242,11 @@ cmp_filename.consume_front("../")) continue; - bool should_check = true; + Disposition should_check = kCheck; while (!cmp_filename.empty()) { auto it = check_file_prefixes_.prefix_map.find(cmp_filename); if (it != check_file_prefixes_.prefix_map.end()) { - should_check = (it->second == '+'); + should_check = it->second == '+' ? kCheck : kSkip; break; } cmp_filename = llvm::sys::path::parent_path(cmp_filename); @@ -447,7 +454,26 @@ GetFilename(preprocessor.getSourceManager(), introducer.Loc, FilenameLocationType::kExpansionLoc); // The pragma opts the file out of checks. - g_checked_files_cache.insert({filename, false}); + g_checked_files_cache.insert({filename, kSkip}); + } +}; + +class AllowUnsafeLibcPragmaHandler : public clang::PragmaHandler { + public: + static constexpr char kName[] = "allow_unsafe_libc_calls"; + + AllowUnsafeLibcPragmaHandler() : clang::PragmaHandler(kName) {} + + void HandlePragma(clang::Preprocessor& preprocessor, + clang::PragmaIntroducer introducer, + clang::Token& token) override { + // TODO(danakj): It would be an optimization to find a way to avoid creating + // a std::string here. + std::string filename = + GetFilename(preprocessor.getSourceManager(), introducer.Loc, + FilenameLocationType::kExpansionLoc); + // The pragma opts the file into checks. + g_checked_files_cache.insert({filename, kSkipLibc}); } }; @@ -459,4 +485,8 @@ AllowUnsafeBuffersPragmaHandler::kName, "Avoid reporting unsafe-buffer-usage warnings in the file"); +static clang::PragmaHandlerRegistry::Add<AllowUnsafeLibcPragmaHandler> X3( + AllowUnsafeLibcPragmaHandler::kName, + "Avoid reporting unsafe-libc-call warnings in the file"); + } // namespace chrome_checker
diff --git a/tools/clang/plugins/tests/system/system_string.h b/tools/clang/plugins/tests/system/system_string.h new file mode 100644 index 0000000..152ef83 --- /dev/null +++ b/tools/clang/plugins/tests/system/system_string.h
@@ -0,0 +1,13 @@ +// 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 TOOLS_CLANG_PLUGINS_TESTS_SYSTEM_SYSTEM_STRING_H_ +#define TOOLS_CLANG_PLUGINS_TESTS_SYSTEM_SYSTEM_STRING_H_ + +// Mock string.h for plugin tests since some bots can't find the +// actual one. Avoids use of size_t since there's no reason to +// believe the bots could find stddef.h, either. +void* memcpy(void* dst, const void* src, __SIZE_TYPE__ size); + +#endif // TOOLS_CLANG_PLUGINS_TESTS_SYSTEM_SYSTEM_STRING_H_
diff --git a/tools/clang/plugins/tests/unsafe_buffers.cpp b/tools/clang/plugins/tests/unsafe_buffers.cpp index dcc11a6..1d494dd4 100644 --- a/tools/clang/plugins/tests/unsafe_buffers.cpp +++ b/tools/clang/plugins/tests/unsafe_buffers.cpp
@@ -21,6 +21,9 @@ #include "unsafe_buffers_not_clean_dir/not_checked_header.h" #include "unsafe_buffers_not_clean_dir/not_clean_header.h" #include "unsafe_buffers_opt_out.h" +#include "unsafe_libc_calls_clean.h" +#include "unsafe_libc_calls_not_clean.h" +#include "unsafe_libc_calls_opt_out.h" int main() { call_unsafe_stuff();
diff --git a/tools/clang/plugins/tests/unsafe_buffers.flags b/tools/clang/plugins/tests/unsafe_buffers.flags index 7305492..fded9f1 100644 --- a/tools/clang/plugins/tests/unsafe_buffers.flags +++ b/tools/clang/plugins/tests/unsafe_buffers.flags
@@ -1 +1 @@ --Xclang -plugin-arg-unsafe-buffers -Xclang unsafe_buffers_paths.txt +-Xclang -plugin-arg-unsafe-buffers -Xclang check-libc-calls -Xclang -plugin-arg-unsafe-buffers -Xclang unsafe_buffers_paths.txt
diff --git a/tools/clang/plugins/tests/unsafe_buffers.txt b/tools/clang/plugins/tests/unsafe_buffers.txt index eb8ebd56..7f63456 100644 --- a/tools/clang/plugins/tests/unsafe_buffers.txt +++ b/tools/clang/plugins/tests/unsafe_buffers.txt
@@ -50,4 +50,19 @@ <scratch space>:20:1: note: expanded from here ptrs_ ^ -9 warnings generated. +In file included from unsafe_buffers.cpp:24: +./unsafe_libc_calls_clean.h:11:10: warning: function 'memcpy' is unsafe [-Wunsafe-buffer-usage-in-libc-call] + return memcpy(i, &s, sizeof(s)); // Should generate a warning. + ^~~~~~~~~~~~~~~~~~~~~~~~ +./unsafe_libc_calls_clean.h:11:10: note: See //docs/unsafe_buffers.md for help. +In file included from unsafe_buffers.cpp:25: +./unsafe_libc_calls_not_clean.h:11:10: warning: function 'memcpy' is unsafe [-Wunsafe-buffer-usage-in-libc-call] + return memcpy(i, &s, sizeof(s)); // Should generate a warning. + ^~~~~~~~~~~~~~~~~~~~~~~~ +./unsafe_libc_calls_not_clean.h:11:10: note: See //docs/unsafe_buffers.md for help. +In file included from unsafe_buffers.cpp:26: +./unsafe_libc_calls_opt_out.h:18:10: warning: unsafe buffer access [-Wunsafe-buffer-usage] + return i[s]; // Gives warning, allow_unafe_libc_calls does not imply allow_unsafe_buffers. + ^ +./unsafe_libc_calls_opt_out.h:18:10: note: See //docs/unsafe_buffers.md for help. +12 warnings generated.
diff --git a/tools/clang/plugins/tests/unsafe_buffers_opt_out.h b/tools/clang/plugins/tests/unsafe_buffers_opt_out.h index 83fd0a4..9c382a6 100644 --- a/tools/clang/plugins/tests/unsafe_buffers_opt_out.h +++ b/tools/clang/plugins/tests/unsafe_buffers_opt_out.h
@@ -5,10 +5,17 @@ #ifndef TOOLS_CLANG_PLUGINS_TESTS_UNSAFE_BUFFERS_OPT_OUT_H_ #define TOOLS_CLANG_PLUGINS_TESTS_UNSAFE_BUFFERS_OPT_OUT_H_ +// This header would be checked, but the pragma changes it. #pragma allow_unsafe_buffers +#include <system_string.h> + inline int opt_out_bad_stuff(int* i, unsigned s) { - return i[s]; // This header would be checked but the pragma disables it. + return i[s]; // No warning, allow_unsafe_buffers disables it. +} + +inline void* opt_out_bad_stuff2(int* i, unsigned s) { + return memcpy(i, &s, sizeof(s)); // No warning, allow_unsafe_buffers implies allow_unsafe_libc_calls. } #endif // TOOLS_CLANG_PLUGINS_TESTS_UNSAFE_BUFFERS_OPT_OUT_H_
diff --git a/tools/clang/plugins/tests/unsafe_buffers_unchecked.flags b/tools/clang/plugins/tests/unsafe_buffers_unchecked.flags index 7305492..fded9f1 100644 --- a/tools/clang/plugins/tests/unsafe_buffers_unchecked.flags +++ b/tools/clang/plugins/tests/unsafe_buffers_unchecked.flags
@@ -1 +1 @@ --Xclang -plugin-arg-unsafe-buffers -Xclang unsafe_buffers_paths.txt +-Xclang -plugin-arg-unsafe-buffers -Xclang check-libc-calls -Xclang -plugin-arg-unsafe-buffers -Xclang unsafe_buffers_paths.txt
diff --git a/tools/clang/plugins/tests/unsafe_libc_calls_clean.h b/tools/clang/plugins/tests/unsafe_libc_calls_clean.h new file mode 100644 index 0000000..69e052b0 --- /dev/null +++ b/tools/clang/plugins/tests/unsafe_libc_calls_clean.h
@@ -0,0 +1,18 @@ +// 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 TOOLS_CLANG_PLUGINS_TESTS_UNSAFE_LIBC_CALLS_CLEAN_H_ +#define TOOLS_CLANG_PLUGINS_TESTS_UNSAFE_LIBC_CALLS_CLEAN_H_ + +#include <system_string.h> + +void* clean_bad_memcpy(int* i, unsigned s) { + return memcpy(i, &s, sizeof(s)); // Should generate a warning. +} + +void* clean_guarded_bad_memcpy(int* i, unsigned s) { + return UNSAFE_BUFFERS(memcpy(i, &s, sizeof(s))); // Guarded so no warning. +} + +#endif // TOOLS_CLANG_PLUGINS_TESTS_UNSAFE_LIBC_CALLS_CLEAN_H_
diff --git a/tools/clang/plugins/tests/unsafe_libc_calls_not_clean.h b/tools/clang/plugins/tests/unsafe_libc_calls_not_clean.h new file mode 100644 index 0000000..02728e2 --- /dev/null +++ b/tools/clang/plugins/tests/unsafe_libc_calls_not_clean.h
@@ -0,0 +1,14 @@ +// 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 TOOLS_CLANG_PLUGINS_TESTS_UNSAFE_LIBC_CALLS_NOT_CLEAN_H_ +#define TOOLS_CLANG_PLUGINS_TESTS_UNSAFE_LIBC_CALLS_NOT_CLEAN_H_ + +#include <system_string.h> + +inline void* disallowed_bad_memcpy(int* i, unsigned s) { + return memcpy(i, &s, sizeof(s)); // Should generate a warning. +} + +#endif // TOOLS_CLANG_PLUGINS_TESTS_UNSAFE_LIBC_CALLS_NOT_CLEAN_H_
diff --git a/tools/clang/plugins/tests/unsafe_libc_calls_opt_out.h b/tools/clang/plugins/tests/unsafe_libc_calls_opt_out.h new file mode 100644 index 0000000..9c50d189 --- /dev/null +++ b/tools/clang/plugins/tests/unsafe_libc_calls_opt_out.h
@@ -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. + +#ifndef TOOLS_CLANG_PLUGINS_TESTS_UNSAFE_LIBC_CALLS_OPT_OUT_H_ +#define TOOLS_CLANG_PLUGINS_TESTS_UNSAFE_LIBC_CALLS_OPT_OUT_H_ + +// This header would be checked, but the pragma changes it. +#pragma allow_unsafe_libc_calls + +#include <system_string.h> + +inline void* opt_out_bad_memcpy(int* i, unsigned s) { + return memcpy(i, &s, sizeof(s)); // No warning, allow_unsafe_libc_calls disables it. +} + +inline int opt_out_bad_buffers(int* i, unsigned s) { + return i[s]; // Gives warning, allow_unafe_libc_calls does not imply allow_unsafe_buffers. +} + +#endif // TOOLS_CLANG_PLUGINS_TESTS_UNSAFE_LIBC_CALLS_OPT_OUT_H_
diff --git a/tools/metrics/actions/actions.xml b/tools/metrics/actions/actions.xml index 3133ba6..46998cc 100644 --- a/tools/metrics/actions/actions.xml +++ b/tools/metrics/actions/actions.xml
@@ -47336,6 +47336,8 @@ label="For Default browser promo with messages on omnibox paste."/> <suffix name="IPH_DefaultBrowserPromoSettingCard" label="For Default browser promo in Chrome settings."/> + <suffix name="IPH_iOSDefaultBrowserBannerPromoFeature" + label="For iOS Default browser banner promo."/> <suffix name="KeyboardAccessoryAddressFilling" label="For KeyboardAccessoryAddressFilling feature."/> <suffix name="KeyboardAccessoryBarSwiping"
diff --git a/tools/metrics/dwa/builders_template.py b/tools/metrics/dwa/builders_template.py index 1027409e..f53aa41 100644 --- a/tools/metrics/dwa/builders_template.py +++ b/tools/metrics/dwa/builders_template.py
@@ -89,7 +89,7 @@ {event.name}::~{event.name}() = default; {event.name}& {event.name}::SetContent(std::string_view content) {{ - SetContentInternal(base::HashMetricName(content)); + SetContentInternal(base::HashMetricName(SanitizeContent(content))); return *this; }}
diff --git a/tools/metrics/dwa/gen_builders_test.py b/tools/metrics/dwa/gen_builders_test.py index 70960550..4b7ee7b 100755 --- a/tools/metrics/dwa/gen_builders_test.py +++ b/tools/metrics/dwa/gen_builders_test.py
@@ -94,7 +94,7 @@ self.assertIn( """ {name}& {name}::SetContent(std::string_view content) {{ - SetContentInternal(base::HashMetricName(content)); + SetContentInternal(base::HashMetricName(SanitizeContent(content))); return *this; }} """.format(name=self.event_info.name, rawName=self.event_info.raw_name), @@ -252,7 +252,7 @@ DwaTestMetric::~DwaTestMetric() = default; DwaTestMetric& DwaTestMetric::SetContent(std::string_view content) { - SetContentInternal(base::HashMetricName(content)); + SetContentInternal(base::HashMetricName(SanitizeContent(content))); return *this; }
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml index 0c33f8f..49d11cc 100644 --- a/tools/metrics/histograms/enums.xml +++ b/tools/metrics/histograms/enums.xml
@@ -10235,7 +10235,7 @@ <int value="4580" label="FedCmRpContext"/> <int value="4581" label="EventTimingArtificialPointerupOrClick"/> <int value="4582" label="AbortSignalAny"/> - <int value="4583" label="FedCmIdpSigninStatusApi"/> + <int value="4583" label="OBSOLETE_FedCmIdpSigninStatusApi"/> <int value="4584" label="FedCmIdpSigninStatusJsApi"/> <int value="4585" label="ExecCommand"/> <int value="4586" label="WebGPUQueueSubmit"/>
diff --git a/tools/metrics/histograms/metadata/android/enums.xml b/tools/metrics/histograms/metadata/android/enums.xml index df12a6e..e6040b0 100644 --- a/tools/metrics/histograms/metadata/android/enums.xml +++ b/tools/metrics/histograms/metadata/android/enums.xml
@@ -615,6 +615,7 @@ <int value="116" label="WebViewCompat.prerenderUrlWithParams"/> <int value="117" label="WebStorageCompat.deleteBrowsingData"/> <int value="118" label="WebStorageCompat.deleteBrowsingDataForSite"/> + <int value="119" label="Profile.setSpeculativeLoadingConfig"/> <!-- LINT.ThenChange(/android_webview/support_library/java/src/org/chromium/support_lib_glue/SupportLibWebViewChromiumFactory.java:ApiCall) --> </enum>
diff --git a/tools/metrics/histograms/metadata/bookmarks/histograms.xml b/tools/metrics/histograms/metadata/bookmarks/histograms.xml index 7c4d728..c48f4ce 100644 --- a/tools/metrics/histograms/metadata/bookmarks/histograms.xml +++ b/tools/metrics/histograms/metadata/bookmarks/histograms.xml
@@ -492,6 +492,17 @@ </summary> </histogram> +<histogram name="Bookmarks.RemoveAccountPermanentFoldersDuration" units="ms" + expires_after="2025-07-09"> + <owner>mastiz@chromium.org</owner> + <owner>rushans@google.com</owner> + <summary> + Records the time taken to remove all account bookmarks from the bookmark + model. This usually happens when a user signs out or disables bookmarks sync + specifically in settings. + </summary> +</histogram> + <histogram name="Bookmarks.RemovedLocation" enum="BookmarkLaunchLocation" expires_after="2025-03-09"> <owner>dfried@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/enterprise/enums.xml b/tools/metrics/histograms/metadata/enterprise/enums.xml index 7648b00..a41a0e8 100644 --- a/tools/metrics/histograms/metadata/enterprise/enums.xml +++ b/tools/metrics/histograms/metadata/enterprise/enums.xml
@@ -2198,6 +2198,7 @@ <int value="1324" label="WebRtcIPHandlingUrl"/> <int value="1325" label="GenAIPhotoEditingSettings"/> <int value="1326" label="PartitionedBlobUrlUsage"/> + <int value="1327" label="GlicEnabled"/> </enum> <enum name="EnterprisePoliciesSources">
diff --git a/tools/metrics/histograms/metadata/feature_engagement/histograms.xml b/tools/metrics/histograms/metadata/feature_engagement/histograms.xml index 8291e05..4a38a070 100644 --- a/tools/metrics/histograms/metadata/feature_engagement/histograms.xml +++ b/tools/metrics/histograms/metadata/feature_engagement/histograms.xml
@@ -256,6 +256,8 @@ summary="contextual panel sample model IPH impression tracking"/> <variant name="IPH_iOSDefaultBrowserBadgeEligibility" summary="default browser badge promo eligibility tracking"/> + <variant name="IPH_iOSDefaultBrowserBannerPromoFeature" + summary="iOS Default browser banner promo"/> <variant name="IPH_iOSDefaultBrowserOverflowMenuBadge" summary="default browser badge promo on the overflow menu"/> <variant name="IPH_iOSDefaultBrowserSettingsBadge"
diff --git a/tools/metrics/histograms/metadata/ios/histograms.xml b/tools/metrics/histograms/metadata/ios/histograms.xml index e95ec9f..9f662bb 100644 --- a/tools/metrics/histograms/metadata/ios/histograms.xml +++ b/tools/metrics/histograms/metadata/ios/histograms.xml
@@ -960,18 +960,18 @@ </histogram> <histogram name="IOS.DefaultBrowserFullscreenPromo" - enum="IOSDefaultBrowserFullscreenPromoAction" expires_after="2025-02-05"> + enum="IOSDefaultBrowserFullscreenPromoAction" expires_after="2025-08-05"> <owner>sebsg@chromium.org</owner> - <owner>bling-get-set-up@google.com</owner> + <owner>bling-mony-pod@google.com</owner> <summary> The action taken by the user in response to the default browser promo. </summary> </histogram> <histogram name="IOS.DefaultBrowserFullscreenTailoredPromoAllTabs" - enum="IOSDefaultBrowserFullscreenPromoAction" expires_after="2025-06-08"> + enum="IOSDefaultBrowserFullscreenPromoAction" expires_after="2025-08-05"> <owner>sebsg@chromium.org</owner> - <owner>bling-get-set-up@google.com</owner> + <owner>bling-mony-pod@google.com</owner> <summary> The action taken by the user in response to the "All tabs" default browser tailored promo. @@ -979,9 +979,9 @@ </histogram> <histogram name="IOS.DefaultBrowserFullscreenTailoredPromoMadeForIOS" - enum="IOSDefaultBrowserFullscreenPromoAction" expires_after="2025-06-08"> + enum="IOSDefaultBrowserFullscreenPromoAction" expires_after="2025-08-05"> <owner>sebsg@chromium.org</owner> - <owner>bling-get-set-up@google.com</owner> + <owner>bling-mony-pod@google.com</owner> <summary> The action taken by the user in response to the "Made for iOS" default browser tailored promo. @@ -989,9 +989,9 @@ </histogram> <histogram name="IOS.DefaultBrowserFullscreenTailoredPromoStaySafe" - enum="IOSDefaultBrowserFullscreenPromoAction" expires_after="2025-06-08"> + enum="IOSDefaultBrowserFullscreenPromoAction" expires_after="2025-08-05"> <owner>sebsg@chromium.org</owner> - <owner>bling-get-set-up@google.com</owner> + <owner>bling-mony-pod@google.com</owner> <summary> The action taken by the user in response to the "Stay Safe" default browser tailored promo. @@ -999,9 +999,9 @@ </histogram> <histogram name="IOS.DefaultBrowserPromo.DaysSinceLastPromoInteraction" - units="count" expires_after="2025-06-08"> + units="count" expires_after="2025-08-05"> <owner>gayane@google.com</owner> - <owner>bling-get-set-up@google.com</owner> + <owner>bling-mony-pod@google.com</owner> <summary> Represents number of days since last default browser promo was displayed. This includes full screen and non-modal promo and default browser promo in @@ -1020,9 +1020,9 @@ </histogram> <histogram name="IOS.DefaultBrowserPromo.GenericPromoDisplayCount" - units="count" expires_after="2025-06-08"> + units="count" expires_after="2025-08-05"> <owner>gayane@google.com</owner> - <owner>bling-get-set-up@google.com</owner> + <owner>bling-mony-pod@google.com</owner> <summary> Represents number of generic default browser promos displayed to the user. This includes all video promo options. Recorded before every full screen @@ -1040,10 +1040,9 @@ </histogram> <histogram name="IOS.DefaultBrowserPromo.NonModal.{Impression}" - enum="IOSDefaultBrowserPromoNonModalAction" expires_after="2025-06-08"> + enum="IOSDefaultBrowserPromoNonModalAction" expires_after="2025-08-05"> <owner>sebsg@chromium.org</owner> - <owner>nicolasmacbeth@google.com</owner> - <owner>bling-get-set-up@google.com</owner> + <owner>bling-mony-pod@google.com</owner> <summary> Logged when an action happens on the {Impression} impression of a non modal promo. Records the action of the promo. iOS only. @@ -1063,9 +1062,9 @@ </histogram> <histogram name="IOS.DefaultBrowserPromo.NonModal.{PromoType}" - enum="IOSDefaultBrowserPromoNonModalAction" expires_after="2025-06-08"> + enum="IOSDefaultBrowserPromoNonModalAction" expires_after="2025-08-05"> <owner>sebsg@chromium.org</owner> - <owner>bling-get-set-up@google.com</owner> + <owner>bling-mony-pod@google.com</owner> <summary> Logged when an action happens on a non modal promo triggered by {PromoType}. Records the action of the promo. iOS only. @@ -1078,10 +1077,11 @@ </histogram> <histogram name="IOS.DefaultBrowserPromo.SetUpList.Action" - enum="IOSDefaultBrowserFullscreenPromoAction" expires_after="2025-06-22"> + enum="IOSDefaultBrowserFullscreenPromoAction" expires_after="2025-08-05"> <owner>sebsg@chromium.org</owner> <owner>scottyoder@google.com</owner> <owner>bling-get-set-up@google.com</owner> + <owner>bling-mony-pod@google.com</owner> <summary> The action taken by the user in response to the Set Up List default browser promo. @@ -1089,16 +1089,16 @@ </histogram> <histogram name="IOS.DefaultBrowserPromo.Shown" - enum="IOSDefaultBrowserPromoType" expires_after="2025-06-08"> + enum="IOSDefaultBrowserPromoType" expires_after="2025-08-05"> <owner>gayane@chromium.org</owner> - <owner>bling-get-set-up@google.com</owner> + <owner>bling-mony-pod@google.com</owner> <summary>The default browser promo type shown to the user.</summary> </histogram> <histogram name="IOS.DefaultBrowserPromo.TailoredPromoDisplayCount" - units="count" expires_after="2025-06-08"> + units="count" expires_after="2025-08-05"> <owner>gayane@google.com</owner> - <owner>bling-get-set-up@google.com</owner> + <owner>bling-mony-pod@google.com</owner> <summary> Represents number of tailored default browser promos displayed to the user. Recorded before every full screen promo displayed. @@ -1106,9 +1106,9 @@ </histogram> <histogram name="IOS.DefaultBrowserPromo.{PromoAction}.{PromoStat}" - units="count" expires_after="2025-05-18"> + units="count" expires_after="2025-08-05"> <owner>gayane@google.com</owner> - <owner>bling-get-set-up@google.com</owner> + <owner>bling-mony-pod@google.com</owner> <summary> Logs all {PromoStat} metrics when the {PromoAction} action happens in a default browser promo. @@ -1153,8 +1153,7 @@ </histogram> <histogram name="IOS.DefaultBrowserSettingsPageUsage{Source}" - enum="IOSDefaultBrowserSettingsPageUsage" expires_after="2025-06-22"> - <owner>nicolasmacbeth@google.com</owner> + enum="IOSDefaultBrowserSettingsPageUsage" expires_after="2025-08-05"> <owner>gayane@google.com</owner> <owner>bling-mony-pod@google.com</owner> <summary> @@ -1178,10 +1177,10 @@ </histogram> <histogram name="IOS.DefaultBrowserVideoPromo.Fullscreen" - enum="IOSDefaultBrowserVideoPromoAction" expires_after="2025-06-08"> + enum="IOSDefaultBrowserVideoPromoAction" expires_after="2025-08-05"> <owner>cheickcisse@google.com</owner> <owner>sebsg@chromium.org</owner> - <owner>bling-get-set-up@google.com</owner> + <owner>bling-mony-pod@google.com</owner> <summary> The action taken by the user in response to the full screen default browser video promo. @@ -1189,8 +1188,7 @@ </histogram> <histogram name="IOS.Desktop.{PromoType}.Shown" - enum="DesktopIOSPromoImpression" expires_after="2025-06-22"> - <owner>aliaaborhamy@google.com</owner> + enum="DesktopIOSPromoImpression" expires_after="2025-08-05"> <owner>nicolasmacbeth@google.com</owner> <owner>bling-mony-pod@google.com</owner> <summary> @@ -1207,8 +1205,7 @@ </histogram> <histogram name="IOS.Desktop.{PromoType}.{Impression}.Action" - enum="DesktopIOSPromoAction" expires_after="2025-06-22"> - <owner>aliaaborhamy@google.com</owner> + enum="DesktopIOSPromoAction" expires_after="2025-08-05"> <owner>nicolasmacbeth@google.com</owner> <owner>bling-mony-pod@google.com</owner> <summary> @@ -1231,9 +1228,9 @@ the generic promo launch. --> <histogram name="IOS.DesktopPasswordPromo.Shown" - enum="DesktopIOSPasswordPromoImpression" expires_after="2025-06-22"> + enum="DesktopIOSPasswordPromoImpression" expires_after="2025-08-05"> <owner>nicolasmacbeth@google.com</owner> - <owner>bling-get-set-up@google.com</owner> + <owner>bling-mony-pod@google.com</owner> <summary> The impression of the iOS Password Promo shown to the user on Desktop. Desktop only. This is only recorded for contextual promo appearances, not @@ -1245,9 +1242,9 @@ the generic promo launch. --> <histogram name="IOS.DesktopPasswordPromo.{Impression}.Action" - enum="DesktopIOSPasswordPromoAction" expires_after="2025-04-15"> + enum="DesktopIOSPasswordPromoAction" expires_after="2025-08-05"> <owner>nicolasmacbeth@google.com</owner> - <owner>bling-get-set-up@google.com</owner> + <owner>bling-mony-pod@google.com</owner> <summary> The action taken by the user when shown the iOS Password Promo on Desktop for the {Impression} impression. Desktop only.
diff --git a/tools/metrics/histograms/metadata/mobile/histograms.xml b/tools/metrics/histograms/metadata/mobile/histograms.xml index 6ca34b4..b515453 100644 --- a/tools/metrics/histograms/metadata/mobile/histograms.xml +++ b/tools/metrics/histograms/metadata/mobile/histograms.xml
@@ -516,7 +516,7 @@ <variant name="RecentTabsEntry" summary="Recent Tabs entry"/> <variant name="ShareChrome" summary="link to Chrome in the app store"/> <variant name="SharedHighlight" summary="highlighted fragment"/> - <variant name="ShareInContextMenu" summary="share in context menu"/> + <variant name="ShareInWebContextMenu" summary="share in context menu"/> <variant name="TabGridItem" summary="tab grid item"/> <variant name="TabGridSelectionMode" summary="tab grid selection mode"/> <variant name="TabShareButton" summary="current tab"/>
diff --git a/tools/metrics/histograms/metadata/others/histograms.xml b/tools/metrics/histograms/metadata/others/histograms.xml index 6f2d071c..144dce0 100644 --- a/tools/metrics/histograms/metadata/others/histograms.xml +++ b/tools/metrics/histograms/metadata/others/histograms.xml
@@ -1450,6 +1450,28 @@ </summary> </histogram> +<histogram name="Ads.InterestGroup.Auction.{Type}InterestGroupPreviouslyBid" + enum="Boolean" expires_after="2025-05-04"> + <owner>abigailkatcoff@chromium.org</owner> + <owner>privacy-sandbox-dev@chromium.org</owner> + <summary> + True if an interest group previously bid. Only recorded for interest groups + that are {Type}. Recorded after an interest group's new priority is + calculated after its bidding signals are received. + + See https://github.com/WICG/turtledove/blob/main/FLEDGE.md for the latest + version of the FLEDGE explainer. + </summary> + <token key="Type"> + <variant name="Filtered" + summary="filtered (i.e. its priorityVector's sparse dot product with + the browser generated prioritySignals was negative)"/> + <variant name="Unfiltered" + summary="unfiltered (i.e. its priorityVector's sparse dot product + with the browser generated prioritySignals was non-negative)"/> + </token> +</histogram> + <histogram name="Ads.InterestGroup.Auction.{WorkletType}.RequestWorkletServiceOutcome" enum="RequestWorkletServiceOutcome" expires_after="2025-05-18"> @@ -8004,7 +8026,7 @@ </histogram> <histogram name="ReduceAcceptLanguage.AcceptLanguageNegotiationRestart" - enum="AcceptLanguageNegotiationRestart" expires_after="2025-05-18"> + enum="AcceptLanguageNegotiationRestart" expires_after="M145"> <owner>victortan@chromium.org</owner> <owner>awillia@chromium.org</owner> <owner>miketaylr@chromium.org</owner> @@ -8015,7 +8037,7 @@ </histogram> <histogram name="ReduceAcceptLanguage.AcceptLanguagePrefValueIsEmpty" - enum="BooleanAvailable" expires_after="2025-05-18"> + enum="BooleanAvailable" expires_after="M145"> <owner>victortan@chromium.org</owner> <owner>awillia@chromium.org</owner> <owner>miketaylr@chromium.org</owner> @@ -8026,7 +8048,7 @@ </histogram> <histogram name="ReduceAcceptLanguage.ClearLatency" units="ms" - expires_after="M135"> + expires_after="M145"> <owner>victortan@chromium.org</owner> <owner>awillia@chromium.org</owner> <owner>miketaylr@chromium.org</owner> @@ -8038,7 +8060,7 @@ </histogram> <histogram name="ReduceAcceptLanguage.FetchLatencyUs" units="microseconds" - expires_after="2025-05-18"> + expires_after="M145"> <owner>victortan@chromium.org</owner> <owner>awillia@chromium.org</owner> <owner>miketaylr@chromium.org</owner> @@ -8056,7 +8078,7 @@ </histogram> <histogram name="ReduceAcceptLanguage.StoreLatency" units="ms" - expires_after="M135"> + expires_after="M145"> <owner>victortan@chromium.org</owner> <owner>awillia@chromium.org</owner> <owner>miketaylr@chromium.org</owner> @@ -8068,7 +8090,7 @@ </histogram> <histogram name="ReduceAcceptLanguage.UpdateSize" units="count" - expires_after="M135"> + expires_after="M145"> <owner>victortan@chromium.org</owner> <owner>awillia@chromium.org</owner> <owner>miketaylr@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/password/histograms.xml b/tools/metrics/histograms/metadata/password/histograms.xml index e337d964..91f73ddb 100644 --- a/tools/metrics/histograms/metadata/password/histograms.xml +++ b/tools/metrics/histograms/metadata/password/histograms.xml
@@ -1185,7 +1185,7 @@ </histogram> <histogram name="PasswordManager.CctRedirectToActivityStopTime" units="ms" - expires_after="2025-02-01"> + expires_after="2025-07-06"> <owner>ioanap@chromium.org</owner> <owner>vasilii@chromium.org</owner> <summary>
diff --git a/tools/metrics/histograms/metadata/profile/enums.xml b/tools/metrics/histograms/metadata/profile/enums.xml index b9ce2057..cd7e3a5 100644 --- a/tools/metrics/histograms/metadata/profile/enums.xml +++ b/tools/metrics/histograms/metadata/profile/enums.xml
@@ -393,6 +393,7 @@ <int value="38" label="kRemoteDebugging"/> <int value="39" label="kHeadlessCommand"/> <int value="40" label="kGlicView"/> + <int value="41" label="kWaitingForGlicView"/> </enum> <!-- LINT.IfChange(ProfileMenuActionableItem) --> @@ -430,6 +431,8 @@ <int value="1" label="Deleted a profile"/> </enum> +<!-- LINT.IfChange(ProfilePickerAction) --> + <enum name="ProfilePickerAction"> <int value="0" label="Launch existing profile"/> <int value="1" label="Launch existing profile on customize settings page"/> @@ -438,6 +441,8 @@ <int value="4" label="Delete profile"/> </enum> +<!-- LINT.ThenChange(//chrome/browser/ui/webui/signin/profile_picker_handler.h:ProfilePickerAction) --> + <enum name="ProfilePickerEntryPoint"> <int value="0" label="On startup"/> <int value="1" label="Manage profile button in the profile menu"/>
diff --git a/tools/metrics/histograms/metadata/signin/histograms.xml b/tools/metrics/histograms/metadata/signin/histograms.xml index f539674..1e26984 100644 --- a/tools/metrics/histograms/metadata/signin/histograms.xml +++ b/tools/metrics/histograms/metadata/signin/histograms.xml
@@ -563,18 +563,18 @@ </histogram> <histogram name="Signin.AndroidGetAccountIdsTime" units="ms" - expires_after="2025-01-26"> - <owner>alexilin@chromium.org</owner> + expires_after="2026-01-10"> <owner>bsazonov@chromium.org</owner> + <owner>chrome-signin-team@google.com</owner> <summary> The time it takes to retrieve Gaia ids for all accounts from GoogleAuthUtil. </summary> </histogram> <histogram base="true" name="Signin.AndroidGetAccountsTime" units="ms" - expires_after="2025-06-15"> - <owner>alexilin@chromium.org</owner> + expires_after="2026-01-10"> <owner>bsazonov@chromium.org</owner> + <owner>chrome-signin-team@google.com</owner> <summary> The time it takes to retrieve the list of accounts from the system. </summary>
diff --git a/tools/metrics/histograms/metadata/sync/enums.xml b/tools/metrics/histograms/metadata/sync/enums.xml index cf802d0..46da77e 100644 --- a/tools/metrics/histograms/metadata/sync/enums.xml +++ b/tools/metrics/histograms/metadata/sync/enums.xml
@@ -692,6 +692,16 @@ <int value="100314" label="AccessibilityFaceGazePrecisionClickSpeedFactor"/> <int value="100315" label="OfficeFilesAlwaysMoveToDriveSyncable"/> <int value="100316" label="OfficeFilesAlwaysMoveToOneDriveSyncable"/> + <int value="100317" label="OfficeMoveConfirmationShownForDriveSyncable"/> + <int value="100318" label="OfficeMoveConfirmationShownForOneDriveSyncable"/> + <int value="100319" + label="OfficeMoveConfirmationShownForLocalToDriveSyncable"/> + <int value="100320" + label="OfficeMoveConfirmationShownForLocalToOneDriveSyncable"/> + <int value="100321" + label="OfficeMoveConfirmationShownForCloudToDriveSyncable"/> + <int value="100322" + label="OfficeMoveConfirmationShownForCloudToOneDriveSyncable"/> <!-- LINT.ThenChange(/chrome/browser/sync/prefs/chrome_syncable_prefs_database.cc:ChromeSyncablePref)--> <!-- LINT.IfChange(IosSyncablePref) -->
diff --git a/tools/metrics/histograms/metadata/windows/histograms.xml b/tools/metrics/histograms/metadata/windows/histograms.xml index 8d50e8d..bf1e2715 100644 --- a/tools/metrics/histograms/metadata/windows/histograms.xml +++ b/tools/metrics/histograms/metadata/windows/histograms.xml
@@ -288,6 +288,23 @@ </summary> </histogram> +<histogram name="Windows.Win11HardwareRequirements.{Type}Check" + enum="BooleanEnabled" expires_after="2025-06-01"> + <owner>estalin@chromium.org</owner> + <owner>davidbienvenu@chromium.org</owner> + <summary> + Records only on Win10 if the current hardware {Type} passes requirements for + Win11. This is recorded once per browser session, on startup. + </summary> + <token key="Type"> + <variant name="CPU" summary="Checks supported processor type"/> + <variant name="Disk" summary="Checks total installed disk space"/> + <variant name="Firmware" summary="Checks if secure boot capable"/> + <variant name="Memory" summary="Checks total installed memory"/> + <variant name="TPM" summary="Checks if TPM version is 2 or higher"/> + </token> +</histogram> + <histogram name="Windows.Win11UpgradeEligible" enum="BooleanEnabled" expires_after="2025-06-01"> <owner>estalin@chromium.org</owner>
diff --git a/tools/perf/core/perfetto_binary_roller/binary_deps.json b/tools/perf/core/perfetto_binary_roller/binary_deps.json index b50da4c..7b81669 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/v49.0/linux-arm64/trace_processor_shell" }, "win": { - "hash": "1944107685fc03782a7b1f9b6b9064d103ef8795", - "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/win/a49395d104cee4a11408de2a0b8cde127ba67b5f/trace_processor_shell.exe" + "hash": "be278d644c8dc049d2c540e3a550d55e5152e702", + "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/win/1799f295a91ed394890e40071f3f0badfa47622e/trace_processor_shell.exe" }, "linux_arm": { "hash": "a15d8362d80cfd7cd8d785cf6afc22586de688cd", @@ -21,8 +21,8 @@ "full_remote_path": "perfetto-luci-artifacts/v49.0/mac-arm64/trace_processor_shell" }, "linux": { - "hash": "03de46bc41d1443a10ef4043cf4918ba26698f38", - "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux/a49395d104cee4a11408de2a0b8cde127ba67b5f/trace_processor_shell" + "hash": "d99ae0124dbfa94f91dd685422c7cb0ffd4052e0", + "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux/1799f295a91ed394890e40071f3f0badfa47622e/trace_processor_shell" } }, "power_profile.sql": {
diff --git a/tools/typescript/validate_tsconfig.py b/tools/typescript/validate_tsconfig.py index e2089ea..772ae2e 100644 --- a/tools/typescript/validate_tsconfig.py +++ b/tools/typescript/validate_tsconfig.py
@@ -120,7 +120,6 @@ 'ash/webui/camera_app_ui/', 'ash/webui/color_internals/', 'ash/webui/common/resources/', - 'ash/webui/diagnostics_ui/', 'ash/webui/file_manager/resources/labs/', # TODO(b/314827247): Migrate media_app_ui to TypeScript and remove # exception. @@ -128,9 +127,6 @@ # TODO(b/313562946): Migrate help_app_ui mojo pipeline to TypeScript and # remove. 'ash/webui/help_app_ui/', - # TODO(b/315002705): Migrate shimless_rma to TypeScript and remove - # exception. - 'ash/webui/shimless_rma/', # TODO(b/267329383): Migrate A11y to TypeScript. 'chrome/browser/resources/chromeos/accessibility', 'chrome/browser/resources/chromeos/gaia_action_buttons', @@ -157,18 +153,11 @@ 'chrome/test/data/webui/bluetooth_internals', 'chrome/test/data/webui/chromeos', 'chrome/test/data/webui/chromeos/ash_common', - # TODO(b/245336251): Migrate diagnostics app tests to Typescript and - # remove exception. - 'chrome/test/data/webui/chromeos/diagnostics', 'chrome/test/data/webui/chromeos/nearby_share', - # TODO(b/315002705): Migrate shimless rma app tests to Typescript and - # remove exception. - 'chrome/test/data/webui/chromeos/shimless_rma', 'chrome/test/data/webui/cr_components/chromeos', # TODO(crbug.com/373951324): Migrate offline dino game to TypeScript. 'components/neterror/resources', 'components/net_log/resources', - 'components/policy/resources/webui', 'components/safe_browsing/content/browser/web_ui/resources', 'components/translate/translate_internals', 'content/browser/webrtc/resources', @@ -178,9 +167,6 @@ # TODO(crbug.com/40280699) : Migrate to TypeScript. 'chrome/test/data/webui/media_internals', 'content/browser/resources/media', - - # TODO(b/274059668): Migrate OOBE to TypeScript. - 'chrome/browser/resources/chromeos/login', ] for directory in migrating_directories: if (source_dir.endswith(directory)
diff --git a/tools/win/update_idl.py b/tools/win/update_idl.py index e587739..1593207a 100644 --- a/tools/win/update_idl.py +++ b/tools/win/update_idl.py
@@ -73,7 +73,7 @@ print('Check if update is needed by building the target...') # Use -j 1 since otherwise the exact build output is not deterministic. proc = subprocess.run([ - 'autoninja.bat', '-remote_jobs', '1', '-C', self.output_dir, + 'autoninja.bat', '-j', '1', '-C', self.output_dir, self.idl_gn_target ], capture_output=True, @@ -92,9 +92,9 @@ # Exclude blank lines. lines = list(filter(None, stdout.splitlines())) - if (len(lines) < 3 or 'build failed' not in lines[-4] - or 'copy /y' not in lines[-5] - or 'To rebaseline:' not in lines[-6]): + if (len(lines) < 3 or 'build stopped' not in lines[-1] + or 'copy /y' not in lines[-2] + or 'To rebaseline:' not in lines[-3]): print('-' * 80) print('STDOUT:') print(stdout) @@ -103,15 +103,15 @@ print(stderr) print('-' * 80) print('LINE:') - print(lines[-4]) - print(lines[-5]) - print(lines[-6]) + print(lines[-1]) + print(lines[-2]) + print(lines[-3]) raise IDLUpdateError( 'Unexpected autoninja error (see output above). Update this ' 'tool if the output format has changed.') - return lines[-5].strip().replace('..\\..\\', '') + return lines[-2].strip().replace('..\\..\\', '') def check_running_environment() -> None: @@ -145,6 +145,7 @@ for target_cpu in ['arm64', 'x64', 'x86']: for idl_target in [ 'chrome/windows_services/service_program:test_service_idl', + 'components/tracing:tracing_service_idl', 'elevation_service_idl', 'gaia_credential_provider_idl', 'iaccessible2',
diff --git a/ui/accessibility/platform/ax_platform_node_base.cc b/ui/accessibility/platform/ax_platform_node_base.cc index 80157e4..84717c4 100644 --- a/ui/accessibility/platform/ax_platform_node_base.cc +++ b/ui/accessibility/platform/ax_platform_node_base.cc
@@ -2026,7 +2026,8 @@ AXPlatformNodeBase::AXPosition AXPlatformNodeBase::HypertextOffsetToEndpoint( int hypertext_offset) const { DCHECK_GE(hypertext_offset, 0); - DCHECK_LT(hypertext_offset, static_cast<int>(GetHypertext().size())); + // The offset can be equal to the length when it is past the end. + DCHECK_LE(hypertext_offset, static_cast<int>(GetHypertext().size())); if (IsLeaf()) { if (IsText()) { @@ -2045,7 +2046,7 @@ child_text_len = base::checked_cast<int>(child_iter->GetHypertext().size()); - if (current_hypertext_offset < child_text_len) { + if (current_hypertext_offset <= child_text_len) { int endpoint_offset = current_hypertext_offset; if (child_iter->IsText()) return child_iter->GetDelegate()->CreateTextPositionAt(endpoint_offset);
diff --git a/ui/accessibility/platform/ax_platform_node_win.cc b/ui/accessibility/platform/ax_platform_node_win.cc index 6558552..c3bfd6d 100644 --- a/ui/accessibility/platform/ax_platform_node_win.cc +++ b/ui/accessibility/platform/ax_platform_node_win.cc
@@ -4755,8 +4755,9 @@ AXPosition end_position = end_node->HypertextOffsetToEndpoint(selections->endOffset) ->AsDomSelectionPosition(); - if (start_position->IsNullPosition() || end_position->IsNullPosition()) + if (start_position->IsNullPosition() || end_position->IsNullPosition()) { return E_INVALIDARG; + } AXActionData action_data; action_data.action = ax::mojom::Action::kSetSelection;
diff --git a/ui/base/clipboard/clipboard.cc b/ui/base/clipboard/clipboard.cc index 49331e5..f632b37 100644 --- a/ui/base/clipboard/clipboard.cc +++ b/ui/base/clipboard/clipboard.cc
@@ -267,13 +267,6 @@ WriteText(data.data); }, [&](const WebkitData& data) { WriteWebSmartPaste(); }, - [&](const RawData& data) { - if (data.data.empty()) { - return; - } - - WriteData(data.format, base::as_byte_span(data.data)); - }, [&](const SvgData& data) { if (data.markup.empty()) { return; @@ -300,6 +293,14 @@ params.data); } +void Clipboard::DispatchPortableRepresentation(const RawData& data) { + if (data.data.empty()) { + return; + } + + WriteData(data.format, base::as_byte_span(data.data)); +} + Clipboard::ObjectMapParams::ObjectMapParams() = default; Clipboard::ObjectMapParams::ObjectMapParams(Data data)
diff --git a/ui/base/clipboard/clipboard.h b/ui/base/clipboard/clipboard.h index 2f542c4..8d632e3d 100644 --- a/ui/base/clipboard/clipboard.h +++ b/ui/base/clipboard/clipboard.h
@@ -385,7 +385,6 @@ BookmarkData, TextData, WebkitData, - RawData, SvgData, FilenamesData, WebCustomFormatMapData @@ -433,6 +432,7 @@ virtual void WritePortableAndPlatformRepresentations( ClipboardBuffer buffer, const ObjectMap& objects, + const std::vector<RawData>& raw_objects, std::vector<Clipboard::PlatformRepresentation> platform_representations, std::unique_ptr<DataTransferEndpoint> data_src, uint32_t privacy_types) = 0; @@ -464,6 +464,7 @@ virtual void WriteConfidentialDataForPassword() = 0; void DispatchPortableRepresentation(const ObjectMapParams& params); + void DispatchPortableRepresentation(const RawData& data); // Write directly to the system clipboard. void DispatchPlatformRepresentations(
diff --git a/ui/base/clipboard/clipboard_android.cc b/ui/base/clipboard/clipboard_android.cc index 14dc1c4f..8ab9dd0 100644 --- a/ui/base/clipboard/clipboard_android.cc +++ b/ui/base/clipboard/clipboard_android.cc
@@ -721,6 +721,7 @@ void ClipboardAndroid::WritePortableAndPlatformRepresentations( ClipboardBuffer buffer, const ObjectMap& objects, + const std::vector<RawData>& raw_objects, std::vector<Clipboard::PlatformRepresentation> platform_representations, std::unique_ptr<DataTransferEndpoint> data_src, uint32_t privacy_types) { @@ -729,8 +730,12 @@ g_map.Get().Clear(); DispatchPlatformRepresentations(std::move(platform_representations)); - for (const auto& object : objects) + for (const auto& object : objects) { DispatchPortableRepresentation(object.second); + } + for (const auto& raw_object : raw_objects) { + DispatchPortableRepresentation(raw_object); + } if (privacy_types & Clipboard::PrivacyTypes::kNoDisplay) { WriteConfidentialDataForPassword();
diff --git a/ui/base/clipboard/clipboard_android.h b/ui/base/clipboard/clipboard_android.h index 320bd39..65ae0ef 100644 --- a/ui/base/clipboard/clipboard_android.h +++ b/ui/base/clipboard/clipboard_android.h
@@ -116,6 +116,7 @@ void WritePortableAndPlatformRepresentations( ClipboardBuffer buffer, const ObjectMap& objects, + const std::vector<RawData>& raw_objects, std::vector<Clipboard::PlatformRepresentation> platform_representations, std::unique_ptr<DataTransferEndpoint> data_src, uint32_t privacy_types) override;
diff --git a/ui/base/clipboard/clipboard_ios.h b/ui/base/clipboard/clipboard_ios.h index 648979a..c447c27 100644 --- a/ui/base/clipboard/clipboard_ios.h +++ b/ui/base/clipboard/clipboard_ios.h
@@ -81,6 +81,7 @@ void WritePortableAndPlatformRepresentations( ClipboardBuffer buffer, const ObjectMap& objects, + const std::vector<RawData>& raw_objects, std::vector<Clipboard::PlatformRepresentation> platform_representations, std::unique_ptr<DataTransferEndpoint> data_src, uint32_t privacy_types) override;
diff --git a/ui/base/clipboard/clipboard_ios.mm b/ui/base/clipboard/clipboard_ios.mm index fe91b91..ccc1935 100644 --- a/ui/base/clipboard/clipboard_ios.mm +++ b/ui/base/clipboard/clipboard_ios.mm
@@ -359,6 +359,7 @@ void ClipboardIOS::WritePortableAndPlatformRepresentations( ClipboardBuffer buffer, const ObjectMap& objects, + const std::vector<RawData>& raw_objects, std::vector<Clipboard::PlatformRepresentation> platform_representations, std::unique_ptr<DataTransferEndpoint> data_src, uint32_t privacy_types) { @@ -371,6 +372,9 @@ for (const auto& object : objects) { DispatchPortableRepresentation(object.second); } + for (const auto& raw_object : raw_objects) { + DispatchPortableRepresentation(raw_object); + } } void ClipboardIOS::WriteText(std::string_view text) {
diff --git a/ui/base/clipboard/clipboard_mac.h b/ui/base/clipboard/clipboard_mac.h index d001398..ca53a60 100644 --- a/ui/base/clipboard/clipboard_mac.h +++ b/ui/base/clipboard/clipboard_mac.h
@@ -89,6 +89,7 @@ void WritePortableAndPlatformRepresentations( ClipboardBuffer buffer, const ObjectMap& objects, + const std::vector<RawData>& raw_objects, std::vector<Clipboard::PlatformRepresentation> platform_representations, std::unique_ptr<DataTransferEndpoint> data_src, uint32_t privacy_types) override; @@ -118,6 +119,7 @@ void WritePortableAndPlatformRepresentationsInternal( ClipboardBuffer buffer, const ObjectMap& objects, + const std::vector<RawData>& raw_objects, std::vector<Clipboard::PlatformRepresentation> platform_representations, std::unique_ptr<DataTransferEndpoint> data_src, NSPasteboard* pasteboard,
diff --git a/ui/base/clipboard/clipboard_mac.mm b/ui/base/clipboard/clipboard_mac.mm index c13b03c..ab44f95 100644 --- a/ui/base/clipboard/clipboard_mac.mm +++ b/ui/base/clipboard/clipboard_mac.mm
@@ -433,17 +433,20 @@ void ClipboardMac::WritePortableAndPlatformRepresentations( ClipboardBuffer buffer, const ObjectMap& objects, + const std::vector<RawData>& raw_objects, std::vector<Clipboard::PlatformRepresentation> platform_representations, std::unique_ptr<DataTransferEndpoint> data_src, uint32_t privacy_types) { WritePortableAndPlatformRepresentationsInternal( - buffer, objects, std::move(platform_representations), std::move(data_src), - GetPasteboard(), privacy_types); + buffer, objects, std::move(raw_objects), + std::move(platform_representations), std::move(data_src), GetPasteboard(), + privacy_types); } void ClipboardMac::WritePortableAndPlatformRepresentationsInternal( ClipboardBuffer buffer, const ObjectMap& objects, + const std::vector<RawData>& raw_objects, std::vector<Clipboard::PlatformRepresentation> platform_representations, std::unique_ptr<DataTransferEndpoint> data_src, NSPasteboard* pasteboard, @@ -458,8 +461,12 @@ [pasteboard declareTypes:@[] owner:nil]; DispatchPlatformRepresentations(std::move(platform_representations)); - for (const auto& object : objects) + for (const auto& object : objects) { DispatchPortableRepresentation(object.second); + } + for (const auto& raw_object : raw_objects) { + DispatchPortableRepresentation(raw_object); + } if (data_src && data_src->IsUrlType()) { [pasteboard setString:base::SysUTF8ToNSString(data_src->GetURL()->spec())
diff --git a/ui/base/clipboard/clipboard_mac_unittest.mm b/ui/base/clipboard/clipboard_mac_unittest.mm index 6db71c0..9fba3c4c 100644 --- a/ui/base/clipboard/clipboard_mac_unittest.mm +++ b/ui/base/clipboard/clipboard_mac_unittest.mm
@@ -120,7 +120,7 @@ std::unique_ptr<DataTransferEndpoint> data_src, NSPasteboard* pasteboard) { clipboard_mac->WritePortableAndPlatformRepresentationsInternal( - ClipboardBuffer::kCopyPaste, /*objects=*/{}, + ClipboardBuffer::kCopyPaste, /*objects=*/{}, /*raw_objects=*/{}, /*platform_representations=*/{}, std::move(data_src), pasteboard, /*privacy_types=*/0); }
diff --git a/ui/base/clipboard/clipboard_non_backed.cc b/ui/base/clipboard/clipboard_non_backed.cc index 8562a47..85acc98 100644 --- a/ui/base/clipboard/clipboard_non_backed.cc +++ b/ui/base/clipboard/clipboard_non_backed.cc
@@ -900,6 +900,7 @@ void ClipboardNonBacked::WritePortableAndPlatformRepresentations( ClipboardBuffer buffer, const ObjectMap& objects, + const std::vector<RawData>& raw_objects, std::vector<Clipboard::PlatformRepresentation> platform_representations, std::unique_ptr<DataTransferEndpoint> data_src, uint32_t privacy_types) { @@ -909,8 +910,12 @@ ClipboardInternal& clipboard_internal = GetInternalClipboard(buffer); DispatchPlatformRepresentations(std::move(platform_representations)); - for (const auto& object : objects) + for (const auto& object : objects) { DispatchPortableRepresentation(object.second); + } + for (const auto& raw_object : raw_objects) { + DispatchPortableRepresentation(raw_object); + } ClipboardDataBuilder::CommitToClipboard( clipboard_internal, base::OptionalFromPtr(data_src.get()));
diff --git a/ui/base/clipboard/clipboard_non_backed.h b/ui/base/clipboard/clipboard_non_backed.h index d7dfe85..1ff1cd8 100644 --- a/ui/base/clipboard/clipboard_non_backed.h +++ b/ui/base/clipboard/clipboard_non_backed.h
@@ -130,6 +130,7 @@ void WritePortableAndPlatformRepresentations( ClipboardBuffer buffer, const ObjectMap& objects, + const std::vector<RawData>& raw_objects, std::vector<Clipboard::PlatformRepresentation> platform_representations, std::unique_ptr<DataTransferEndpoint> data_src, uint32_t privacy_types) override;
diff --git a/ui/base/clipboard/clipboard_ozone.cc b/ui/base/clipboard/clipboard_ozone.cc index cfa3344..9717736 100644 --- a/ui/base/clipboard/clipboard_ozone.cc +++ b/ui/base/clipboard/clipboard_ozone.cc
@@ -657,6 +657,7 @@ void ClipboardOzone::WritePortableAndPlatformRepresentations( ClipboardBuffer buffer, const ObjectMap& objects, + const std::vector<RawData>& raw_objects, std::vector<Clipboard::PlatformRepresentation> platform_representations, std::unique_ptr<DataTransferEndpoint> data_src, uint32_t privacy_types) { @@ -667,8 +668,12 @@ AddSourceToClipboard(buffer, std::move(data_src)); - for (const auto& object : objects) + for (const auto& object : objects) { DispatchPortableRepresentation(object.second); + } + for (const auto& raw_object : raw_objects) { + DispatchPortableRepresentation(raw_object); + } async_clipboard_ozone_->OfferData(buffer); WritePortableTextRepresentation(buffer, objects);
diff --git a/ui/base/clipboard/clipboard_ozone.h b/ui/base/clipboard/clipboard_ozone.h index a62afde..b9dca595 100644 --- a/ui/base/clipboard/clipboard_ozone.h +++ b/ui/base/clipboard/clipboard_ozone.h
@@ -84,6 +84,7 @@ void WritePortableAndPlatformRepresentations( ClipboardBuffer buffer, const ObjectMap& objects, + const std::vector<RawData>& raw_objects, std::vector<Clipboard::PlatformRepresentation> platform_representations, std::unique_ptr<DataTransferEndpoint> data_src, uint32_t privacy_types) override;
diff --git a/ui/base/clipboard/clipboard_test_template.h b/ui/base/clipboard/clipboard_test_template.h index 0c785ca..9b152b8 100644 --- a/ui/base/clipboard/clipboard_test_template.h +++ b/ui/base/clipboard/clipboard_test_template.h
@@ -741,43 +741,20 @@ { ScopedClipboardWriter clipboard_writer(ClipboardBuffer::kCopyPaste); clipboard_writer.WritePickledData(write_pickle1, kFormat1); - // overwrite the previous pickle for fun clipboard_writer.WritePickledData(write_pickle2, kFormat2); } - ASSERT_FALSE(this->clipboard().IsFormatAvailable( - kFormat1, ClipboardBuffer::kCopyPaste, /* data_dst = */ nullptr)); - ASSERT_TRUE(this->clipboard().IsFormatAvailable( - kFormat2, ClipboardBuffer::kCopyPaste, /* data_dst = */ nullptr)); - - // Check string 2. - std::string output2; - this->clipboard().ReadData(kFormat2, /* data_dst = */ nullptr, &output2); - ASSERT_FALSE(output2.empty()); - - base::Pickle read_pickle2 = - base::Pickle::WithData(base::as_byte_span(output2)); - base::PickleIterator iter2(read_pickle2); - std::string unpickled_string2; - ASSERT_TRUE(iter2.ReadString(&unpickled_string2)); - EXPECT_EQ(payload2, unpickled_string2); - - { - ScopedClipboardWriter clipboard_writer(ClipboardBuffer::kCopyPaste); - clipboard_writer.WritePickledData(write_pickle2, kFormat2); - // overwrite the previous pickle for fun - clipboard_writer.WritePickledData(write_pickle1, kFormat1); - } - ASSERT_TRUE(this->clipboard().IsFormatAvailable( kFormat1, ClipboardBuffer::kCopyPaste, /* data_dst = */ nullptr)); - ASSERT_FALSE(this->clipboard().IsFormatAvailable( + ASSERT_TRUE(this->clipboard().IsFormatAvailable( kFormat2, ClipboardBuffer::kCopyPaste, /* data_dst = */ nullptr)); - // Check string 1. std::string output1; this->clipboard().ReadData(kFormat1, /* data_dst = */ nullptr, &output1); ASSERT_FALSE(output1.empty()); + std::string output2; + this->clipboard().ReadData(kFormat2, /* data_dst = */ nullptr, &output2); + ASSERT_FALSE(output2.empty()); base::Pickle read_pickle1 = base::Pickle::WithData(base::as_byte_span(output1)); @@ -785,6 +762,13 @@ std::string unpickled_string1; ASSERT_TRUE(iter1.ReadString(&unpickled_string1)); EXPECT_EQ(payload1, unpickled_string1); + + base::Pickle read_pickle2 = + base::Pickle::WithData(base::as_byte_span(output2)); + base::PickleIterator iter2(read_pickle2); + std::string unpickled_string2; + ASSERT_TRUE(iter2.ReadString(&unpickled_string2)); + EXPECT_EQ(payload2, unpickled_string2); } #if !(BUILDFLAG(IS_IOS) && BUILDFLAG(USE_BLINK))
diff --git a/ui/base/clipboard/clipboard_win.cc b/ui/base/clipboard/clipboard_win.cc index 21a03c0..8e14d2d 100644 --- a/ui/base/clipboard/clipboard_win.cc +++ b/ui/base/clipboard/clipboard_win.cc
@@ -690,6 +690,7 @@ void ClipboardWin::WritePortableAndPlatformRepresentations( ClipboardBuffer buffer, const ObjectMap& objects, + const std::vector<RawData>& raw_objects, std::vector<Clipboard::PlatformRepresentation> platform_representations, std::unique_ptr<DataTransferEndpoint> data_src, uint32_t privacy_types) { @@ -704,6 +705,9 @@ for (const auto& object : objects) { DispatchPortableRepresentation(object.second); } + for (const auto& raw_object : raw_objects) { + DispatchPortableRepresentation(raw_object); + } if (data_src && data_src->IsUrlType()) { HGLOBAL glob = CreateGlobalData(data_src->GetURL()->spec());
diff --git a/ui/base/clipboard/clipboard_win.h b/ui/base/clipboard/clipboard_win.h index f396bb29..02b6ed1 100644 --- a/ui/base/clipboard/clipboard_win.h +++ b/ui/base/clipboard/clipboard_win.h
@@ -89,6 +89,7 @@ void WritePortableAndPlatformRepresentations( ClipboardBuffer buffer, const ObjectMap& objects, + const std::vector<RawData>& raw_objects, std::vector<Clipboard::PlatformRepresentation> platform_representations, std::unique_ptr<DataTransferEndpoint> data_src, uint32_t privacy_types) override;
diff --git a/ui/base/clipboard/scoped_clipboard_writer.cc b/ui/base/clipboard/scoped_clipboard_writer.cc index bbdd359..b24593a 100644 --- a/ui/base/clipboard/scoped_clipboard_writer.cc +++ b/ui/base/clipboard/scoped_clipboard_writer.cc
@@ -62,10 +62,12 @@ } } - if (!objects_.empty() || !platform_representations_.empty()) { + if (!objects_.empty() || !raw_objects_.empty() || + !platform_representations_.empty()) { Clipboard::GetForCurrentThread()->WritePortableAndPlatformRepresentations( - buffer_, objects_, std::move(platform_representations_), - std::move(data_src_), privacy_types_); + buffer_, objects_, std::move(raw_objects_), + std::move(platform_representations_), std::move(data_src_), + privacy_types_); } } @@ -194,9 +196,7 @@ raw_data.data = std::vector<uint8_t>( reinterpret_cast<const uint8_t*>(pickle.data()), reinterpret_cast<const uint8_t*>(pickle.data()) + pickle.size()); - Clipboard::Data data = std::move(raw_data); - const size_t index = data.index(); - objects_[index] = Clipboard::ObjectMapParams(std::move(data)); + raw_objects_.emplace_back(std::move(raw_data)); } void ScopedClipboardWriter::WriteData(const std::u16string& format,
diff --git a/ui/base/clipboard/scoped_clipboard_writer.h b/ui/base/clipboard/scoped_clipboard_writer.h index af932ad..e63c08b 100644 --- a/ui/base/clipboard/scoped_clipboard_writer.h +++ b/ui/base/clipboard/scoped_clipboard_writer.h
@@ -105,6 +105,10 @@ // object destruction. Clipboard::ObjectMap objects_; + // Same as `objects_`, but holds every type passed to `WritePickledData` to + // allow writing more than one to the clipboard at once. + std::vector<Clipboard::RawData> raw_objects_; + std::vector<Clipboard::PlatformRepresentation> platform_representations_; // Keeps track of the unique custom formats registered in the clipboard. base::flat_map<std::string, std::string> registered_formats_;
diff --git a/ui/base/clipboard/test/test_clipboard.cc b/ui/base/clipboard/test/test_clipboard.cc index e242cdd..f96af86e 100644 --- a/ui/base/clipboard/test/test_clipboard.cc +++ b/ui/base/clipboard/test/test_clipboard.cc
@@ -312,6 +312,7 @@ void TestClipboard::WritePortableAndPlatformRepresentations( ClipboardBuffer buffer, const ObjectMap& objects, + const std::vector<RawData>& raw_objects, std::vector<Clipboard::PlatformRepresentation> platform_representations, std::unique_ptr<DataTransferEndpoint> data_src, uint32_t privacy_types) { @@ -321,8 +322,12 @@ GetStore(buffer).SetDataSource(base::OptionalFromPtr(data_src.get())); DispatchPlatformRepresentations(std::move(platform_representations)); - for (const auto& kv : objects) + for (const auto& kv : objects) { DispatchPortableRepresentation(kv.second); + } + for (const auto& raw_object : raw_objects) { + DispatchPortableRepresentation(raw_object); + } default_store_buffer_ = ClipboardBuffer::kCopyPaste; }
diff --git a/ui/base/clipboard/test/test_clipboard.h b/ui/base/clipboard/test/test_clipboard.h index 80d6ca45..bf669b7 100644 --- a/ui/base/clipboard/test/test_clipboard.h +++ b/ui/base/clipboard/test/test_clipboard.h
@@ -97,6 +97,7 @@ void WritePortableAndPlatformRepresentations( ClipboardBuffer buffer, const ObjectMap& objects, + const std::vector<RawData>& raw_objects, std::vector<Clipboard::PlatformRepresentation> platform_representations, std::unique_ptr<DataTransferEndpoint> data_src, uint32_t privacy_types) override;
diff --git a/ui/display/display_features.cc b/ui/display/display_features.cc index f2b3062..e5ea3eb 100644 --- a/ui/display/display_features.cc +++ b/ui/display/display_features.cc
@@ -18,16 +18,6 @@ #endif // BUILDFLAG(IS_WIN) #if BUILDFLAG(IS_CHROMEOS) - -// Enables the rounded corners for the internal display. -BASE_FEATURE(kRoundedDisplay, - "RoundedDisplay", - base::FEATURE_ENABLED_BY_DEFAULT); - -bool IsRoundedDisplayEnabled() { - return base::FeatureList::IsEnabled(kRoundedDisplay); -} - // Enables using HDR transfer function if the monitor says it supports it. BASE_FEATURE(kUseHDRTransferFunction, "UseHDRTransferFunction",
diff --git a/ui/display/display_features.h b/ui/display/display_features.h index e458f56c..086c3c4 100644 --- a/ui/display/display_features.h +++ b/ui/display/display_features.h
@@ -17,10 +17,6 @@ #endif // BUILDFLAG(IS_WIN) #if BUILDFLAG(IS_CHROMEOS) -COMPONENT_EXPORT(DISPLAY_FEATURES) BASE_DECLARE_FEATURE(kRoundedDisplay); - -COMPONENT_EXPORT(DISPLAY_FEATURES) bool IsRoundedDisplayEnabled(); - COMPONENT_EXPORT(DISPLAY_FEATURES) BASE_DECLARE_FEATURE(kUseHDRTransferFunction);
diff --git a/ui/display/manager/display_change_observer.cc b/ui/display/manager/display_change_observer.cc index 33ab9f7..8d7f11d 100644 --- a/ui/display/manager/display_change_observer.cc +++ b/ui/display/manager/display_change_observer.cc
@@ -442,8 +442,7 @@ gfx::RoundedCornersF panel_radii; - if (display::features::IsRoundedDisplayEnabled() && - snapshot->type() == display::DISPLAY_CONNECTION_TYPE_INTERNAL) { + if (snapshot->type() == display::DISPLAY_CONNECTION_TYPE_INTERNAL) { panel_radii = internal_panel_radii_.value_or(gfx::RoundedCornersF()); }
diff --git a/ui/display/manager/display_change_observer_unittest.cc b/ui/display/manager/display_change_observer_unittest.cc index 1214e32..bcfc49f 100644 --- a/ui/display/manager/display_change_observer_unittest.cc +++ b/ui/display/manager/display_change_observer_unittest.cc
@@ -126,7 +126,6 @@ void SetUp() override { display_manager_ = std::make_unique<DisplayManager>(/*screen=*/nullptr); default_display_mode_ = MakeDisplayMode(1920, 1080, true, 60); - scoped_feature_list_.InitAndEnableFeature(features::kRoundedDisplay); ui::DeviceDataManager::CreateInstance(); DisplayChangeObserverTestBase::SetUp();
diff --git a/ui/surface/transport_dib.cc b/ui/surface/transport_dib.cc index 9e7d227..bd4d3c4 100644 --- a/ui/surface/transport_dib.cc +++ b/ui/surface/transport_dib.cc
@@ -72,7 +72,7 @@ return nullptr; return skia::CreatePlatformCanvasWithPixels(w, h, opaque, static_cast<uint8_t*>(memory()), - skia::RETURN_NULL_ON_FAILURE); + 0, skia::RETURN_NULL_ON_FAILURE); #endif }
diff --git a/ui/views/accessibility/view_accessibility.cc b/ui/views/accessibility/view_accessibility.cc index dda1f71..545851d 100644 --- a/ui/views/accessibility/view_accessibility.cc +++ b/ui/views/accessibility/view_accessibility.cc
@@ -450,18 +450,6 @@ if (name.empty()) { data_.RemoveStringAttribute(ax::mojom::StringAttribute::kName); } else { - // |AXNodeData::SetName| expects a valid role. Some Views call |SetRole| - // prior to setting the name. For those that don't, see if we can get the - // default role from the View. - // TODO(crbug.com/325137417): This is a temporary workaround to avoid a - // DCHECK, once we have migrated all Views to use the new setters and we - // always set a role in the constructors for views, we can remove this. - if (data_.role == ax::mojom::Role::kUnknown) { - ui::AXNodeData data; - view_->GetAccessibleNodeData(&data); - data_.role = data.role; - } - data_.SetNameChecked(name); }
diff --git a/ui/views/test/mock_native_widget.h b/ui/views/test/mock_native_widget.h index 9ea740c..dd9beb8 100644 --- a/ui/views/test/mock_native_widget.h +++ b/ui/views/test/mock_native_widget.h
@@ -10,6 +10,7 @@ #include "base/memory/raw_ptr.h" #include "base/memory/weak_ptr.h" +#include "build/build_config.h" #include "testing/gmock/include/gmock/gmock.h" #include "ui/base/mojom/ui_base_types.mojom-shared.h" #include "ui/base/mojom/window_show_state.mojom-forward.h" @@ -108,6 +109,9 @@ MOCK_METHOD(bool, IsActive, (), (const override)); MOCK_METHOD(void, SetZOrderLevel, (ui::ZOrderLevel order), (override)); MOCK_METHOD(ui::ZOrderLevel, GetZOrderLevel, (), (const override)); +#if BUILDFLAG(IS_MAC) + MOCK_METHOD(void, SetActivationIndependence, (bool independence), (override)); +#endif MOCK_METHOD(void, SetVisibleOnAllWorkspaces, (bool always_visible),
diff --git a/ui/views/widget/native_widget_mac.h b/ui/views/widget/native_widget_mac.h index c9565cf6..23cb31d 100644 --- a/ui/views/widget/native_widget_mac.h +++ b/ui/views/widget/native_widget_mac.h
@@ -172,6 +172,7 @@ bool IsActive() const override; void SetZOrderLevel(ui::ZOrderLevel order) override; ui::ZOrderLevel GetZOrderLevel() const override; + void SetActivationIndependence(bool independence) override; void SetVisibleOnAllWorkspaces(bool always_visible) override; bool IsVisibleOnAllWorkspaces() const override; void Maximize() override;
diff --git a/ui/views/widget/native_widget_mac.mm b/ui/views/widget/native_widget_mac.mm index 822d5bb..242a2c8 100644 --- a/ui/views/widget/native_widget_mac.mm +++ b/ui/views/widget/native_widget_mac.mm
@@ -756,6 +756,13 @@ return z_order_level_; } +void NativeWidgetMac::SetActivationIndependence(bool independence) { + if (!GetNSWindowMojo()) { + return; + } + GetNSWindowMojo()->SetActivationIndependence(independence); +} + void NativeWidgetMac::SetVisibleOnAllWorkspaces(bool always_visible) { if (!GetNSWindowMojo()) { return;
diff --git a/ui/views/widget/native_widget_private.h b/ui/views/widget/native_widget_private.h index 4759605..6f412161 100644 --- a/ui/views/widget/native_widget_private.h +++ b/ui/views/widget/native_widget_private.h
@@ -8,6 +8,7 @@ #include <memory> #include <string> +#include "build/build_config.h" #include "ui/base/dragdrop/mojom/drag_drop_types.mojom-forward.h" #include "ui/base/mojom/ui_base_types.mojom-shared.h" #include "ui/base/mojom/window_show_state.mojom-forward.h" @@ -201,6 +202,9 @@ virtual void PaintAsActiveChanged(); virtual void SetZOrderLevel(ui::ZOrderLevel order) = 0; virtual ui::ZOrderLevel GetZOrderLevel() const = 0; +#if BUILDFLAG(IS_MAC) + virtual void SetActivationIndependence(bool independence) = 0; +#endif virtual void SetVisibleOnAllWorkspaces(bool always_visible) = 0; virtual bool IsVisibleOnAllWorkspaces() const = 0; virtual void Maximize() = 0;
diff --git a/ui/views/widget/widget.cc b/ui/views/widget/widget.cc index 8d40188..3136f99 100644 --- a/ui/views/widget/widget.cc +++ b/ui/views/widget/widget.cc
@@ -32,6 +32,7 @@ #include "ui/base/mojom/ui_base_types.mojom-shared.h" #include "ui/base/mojom/window_show_state.mojom.h" #include "ui/base/resource/resource_bundle.h" +#include "ui/base/ui_base_types.h" #include "ui/color/color_provider_manager.h" #include "ui/compositor/compositor.h" #include "ui/compositor/layer.h" @@ -1059,6 +1060,17 @@ return sublevel_manager_->GetSublevel(); } +#if BUILDFLAG(IS_MAC) +void Widget::SetActivationIndependence(bool independence) { + CHECK( + (independence && GetZOrderLevel() == ui::ZOrderLevel::kFloatingWindow) || + (!independence && GetZOrderLevel() == ui::ZOrderLevel::kNormal)); + if (native_widget_) { + native_widget_->SetActivationIndependence(independence); + } +} +#endif + void Widget::SetVisibleOnAllWorkspaces(bool always_visible) { if (native_widget_) { native_widget_->SetVisibleOnAllWorkspaces(always_visible);
diff --git a/ui/views/widget/widget.h b/ui/views/widget/widget.h index e45f88d..dfaa766 100644 --- a/ui/views/widget/widget.h +++ b/ui/views/widget/widget.h
@@ -868,6 +868,24 @@ // and non top-level widgets. int GetZOrderSublevel() const; +#if BUILDFLAG(IS_MAC) + // Sets the widget as being "activation independent". This sets two + // properties: + // + // - If Chromium is hidden (from the Dock menu or programmatically), the + // widget is not forced to be hidden as well. + // - The widget can be interacted with without causing Chromium to be + // activated. + // + // To accomplish this, the activation independence state of all ancestor + // widgets is set as well. + // + // The notion of "activation independence" only makes sense if the widget + // floats above all other apps, so this property must only be set on a widget + // that has a z-order of ui::ZOrderLevel::kFloatingWindow. This is enforced. + void SetActivationIndependence(bool independence); +#endif + // Sets the widget to be visible on all work spaces. void SetVisibleOnAllWorkspaces(bool always_visible);
diff --git a/ui/webui/resources/cr_components/searchbox/searchbox.ts b/ui/webui/resources/cr_components/searchbox/searchbox.ts index 3ef5719..9871b755 100644 --- a/ui/webui/resources/cr_components/searchbox/searchbox.ts +++ b/ui/webui/resources/cr_components/searchbox/searchbox.ts
@@ -855,11 +855,6 @@ this.isDeletingInput_ || this.pastedInInput_ || caretNotAtEnd; this.pageHandler_.queryAutocomplete( mojoString16(input), preventInlineAutocomplete); - - this.dispatchEvent(new CustomEvent('query-autocomplete', { - bubbles: true, - composed: true, - })); } /**
diff --git a/v8 b/v8 index ce9a1aa9..083f3ab 160000 --- a/v8 +++ b/v8
@@ -1 +1 @@ -Subproject commit ce9a1aa9762102a7b70395e9e5e5cdbbb46b1c3f +Subproject commit 083f3ab01f8de699e3300350e6c45be0d0488484